и какой же талант писателя в тебе сохнет...., эх....
Нескольно простых вопросов о программировании AVR на Си.
Re: Нескольно простых вопросов о программировании AVR на Си.
c2n, спасибо
и какой же талант писателя в тебе сохнет...., эх....
и какой же талант писателя в тебе сохнет...., эх....
Tell Me The Truth
- Реклама
Re: Нескольно простых вопросов о программировании AVR на Си.
как известно размер массива при инициализации можна не указывать
компилятор сам его вычислит
а почему такой фокус не проходит с двумерными массивами ?
тоесть почему не допускается запись
а вот запись такого вида компилятор с радостью принимает
Код: Выделить всё
char arr[] = {0,5,56,7,78,7};а почему такой фокус не проходит с двумерными массивами ?
тоесть почему не допускается запись
Код: Выделить всё
char file_name[] [] = {
"kapitan.wav",
"markiza.wav",
"razb.wav",
"casablan.wav"
};Код: Выделить всё
char file_name[][15] = {
"kapitan.wav",
"markiza.wav",
"razb.wav",
"casablan.wav"
};Tell Me The Truth
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Если не ошибся, то вот так
Код: Выделить всё
char file_name[] [] = {
{"kapitan.wav"},
{"markiza.wav"},
{"razb.wav"},
{"casablan.wav"},
};Re: Нескольно простых вопросов о программировании AVR на Си.
компилятор выдает
array type has incomplete element type
Tell Me The Truth
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
А это массив 2x2 или 1x4? Или 4x1? Или ещё любой другой размерности, но просто ещё неполный?FreshMan писал(а):тоесть почему не допускается записьКод: Выделить всё
char file_name[] [] = { "kapitan.wav", "markiza.wav", "razb.wav", "casablan.wav" };
- Реклама
Re: Нескольно простых вопросов о программировании AVR на Си.
это массив где хранятся имена wav файлов
и все
и все
Tell Me The Truth
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Но Вы его объявляете двумерным, а размерность не указываете. Как компилятор догадается, сколько под каждого измерение выделять? Те же "casablan.wav" и "razb.wav" требуют разного числа байтов для хранения.
Re: Нескольно простых вопросов о программировании AVR на Си.
в том ведь и вопрос
почему в одномерном массиве размерность можна не указывать а в двумерном уже так не сойдет ?
почему в одномерном массиве размерность можна не указывать а в двумерном уже так не сойдет ?
Tell Me The Truth
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Потому что в одномерном одно измерение. И char x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} - это однозначно вектор из 12 элементов
А вот char x[][] может быть и 1x12, и 2x6, и 3x4, и 4x3, и 6x2, и 12x1. Как компилятору понять, что Вы от него хотите? Остаться неопределённым может только одно (первое) измерение, оно может быть вычислено компилятором по общему количеству элементов + размерностям других измерений.
Скажем, char x[][3] = {1, 2, ....N} - тут компилятор однозначно понимает, что это массив из нескольких групп по 3 char-а. Вычислить, сколько групп понадобится, несложно. А просто char[][] - непонятно, сколько групп по сколько элементов имеются в виду.
P.S. Если так уж приспичило в данном конкретном случае (со строками), то объявляйте это не как массив массивом char, а как массив строк:
Это вполне себе одномерный массив строк (точнее - одномерный массив указателей на char). Его ещё и const можно сделать при необходимости.
А вот char x[][] может быть и 1x12, и 2x6, и 3x4, и 4x3, и 6x2, и 12x1. Как компилятору понять, что Вы от него хотите? Остаться неопределённым может только одно (первое) измерение, оно может быть вычислено компилятором по общему количеству элементов + размерностям других измерений.
Скажем, char x[][3] = {1, 2, ....N} - тут компилятор однозначно понимает, что это массив из нескольких групп по 3 char-а. Вычислить, сколько групп понадобится, несложно. А просто char[][] - непонятно, сколько групп по сколько элементов имеются в виду.
P.S. Если так уж приспичило в данном конкретном случае (со строками), то объявляйте это не как массив массивом char, а как массив строк:
Код: Выделить всё
char *file_name[] = {
"kapitan.wav",
"markiza.wav",
"razb.wav",
"casablan.wav"
};Re: Нескольно простых вопросов о программировании AVR на Си.
Код: Выделить всё
struct sText
{
char *text;
};
struct sText ArrayText[] =
{
{ .text = "12345"},
{ .text = "123"},
{ .text = "1465445"}
};
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
И чем Ваш пример отличается от обычного одномерного массива указателей ? Для чего этот гемор со структурами ?
Добавлено after 1 minute 33 seconds: 
Добавлено after 1 minute 33 seconds:
Код: Выделить всё
char* ArrayText[] =
{
"12345",
"123",
"1465445"
};
- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Свежий!
Вот эта "превед" воспринимается как 'п' 'р' 'е' 'в' 'е' 'д' '\n' где \n = 0
Так что твои массивы строк это уже как бы двумерные массивы.
В голом си нет понятия строка.
Я выходил из положения - определял через typedefы строки, и этот свой тип загонял в массив. Изврат конечно, но начальнику понравилось, а компилятору - не очень. 8 килограм прошивки и 512 байт еепрона скушалось моментально.
Оптимизировал потом под конечную длинну строки, и жЫть стало легче. И вывод на ИКран стал более равномерным, без переодических залипаний.
Лучше разбери механизм переменная-указатель. Даст бонус к быстродействию кода.
Керниган-Ритчи в помощь)))
Оффтопом: мелкие кристаллы и гиганские задачи на них - руки правят на ура))))
Вот эта "превед" воспринимается как 'п' 'р' 'е' 'в' 'е' 'д' '\n' где \n = 0
Так что твои массивы строк это уже как бы двумерные массивы.
В голом си нет понятия строка.
Я выходил из положения - определял через typedefы строки, и этот свой тип загонял в массив. Изврат конечно, но начальнику понравилось, а компилятору - не очень. 8 килограм прошивки и 512 байт еепрона скушалось моментально.
Оптимизировал потом под конечную длинну строки, и жЫть стало легче. И вывод на ИКран стал более равномерным, без переодических залипаний.
Лучше разбери механизм переменная-указатель. Даст бонус к быстродействию кода.
Керниган-Ритчи в помощь)))
Оффтопом: мелкие кристаллы и гиганские задачи на них - руки правят на ура))))
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Вы немножко путаете. '\n' и 0 - это совсем разные вещи. Ну а "превед" - это массив из 'п' 'р' 'е' 'в' 'е' 'д' '\0', а уже '\0' и просто 0 - одно и то же.c2n писал(а):Вот эта "превед" воспринимается как 'п' 'р' 'е' 'в' 'е' 'д' '\n' где \n = 0
- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
А. Да. Напутал)))) строка завершается не '\n', а '\0'
Надеюсь и с этой оплошностью всеравно идея ясна.
По сути строка "превед" в массиве хранится как указатель на некоторый адрес в прошивке, и не более того. Да и вообще - использование безразмерных массивов - тупо жрет память, т.к. компилятор начинает нарезать все свободное пространство под такие безобразия. Некоторые компиляторы умеют ограничивать сами себя, а некоторые - жрут все подряд.
Надеюсь и с этой оплошностью всеравно идея ясна.
По сути строка "превед" в массиве хранится как указатель на некоторый адрес в прошивке, и не более того. Да и вообще - использование безразмерных массивов - тупо жрет память, т.к. компилятор начинает нарезать все свободное пространство под такие безобразия. Некоторые компиляторы умеют ограничивать сами себя, а некоторые - жрут все подряд.
Re: Нескольно простых вопросов о программировании AVR на Си.
А что вы имеете ввиду под безразмерными С массивами? Пример можно?c2n писал(а):[...] - использование безразмерных массивов - тупо жрет память, т.к. компилятор начинает нарезать все свободное пространство под такие безобразия.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Re: Нескольно простых вопросов о программировании AVR на Си.
поиск не помог а именно:
на каком ресурсе можно почитать о языке C для AVR но полную версию языка со всеми возможными вариантами . Наподобие ресурса arduino.cc php.org и др. где указанны примеры, полный перечень аргументов, пояснения и тп. Потому что например открываю , официальный ресурс C (наверно разновидность ATMEL) на котором хочу детально прочитать про sleep его режимы, как пользоваться и тд и что я вижу
http://www.atmel.com/webdoc/avrlibcrefe ... sleep.html
какие такие моде ? это что секретная информация ? почему не указанны все варианты модов с примерами и т.д. короче какойто непонятный ресурс.
Вот есть вприроде ресурс про C для AVR c полным описанием ?
на каком ресурсе можно почитать о языке C для AVR но полную версию языка со всеми возможными вариантами . Наподобие ресурса arduino.cc php.org и др. где указанны примеры, полный перечень аргументов, пояснения и тп. Потому что например открываю , официальный ресурс C (наверно разновидность ATMEL) на котором хочу детально прочитать про sleep его режимы, как пользоваться и тд и что я вижу
http://www.atmel.com/webdoc/avrlibcrefe ... sleep.html
Код: Выделить всё
set_sleep_mode(<mode>);Вот есть вприроде ресурс про C для AVR c полным описанием ?
Последний раз редактировалось alex68md Вт мар 14, 2017 15:10:03, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
ну вот как бы я старался: http://www.simple-devices.ru/index.php? ... &Itemid=10alex68md писал(а):Вот есть вприроде ресурс про C для AVR c полным описанием ?
на английском почти то же самое: http://nongnu.org/avr-libc/user-manual/
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Нескольно простых вопросов о программировании AVR на Си.
забыл линк на атмел (наверно единственно официальный ресурс?) кинуть. обновил предыдущее сообщение. как видим сайт очень и очень неполный несмотря на то что с притензией на оф. ресурс по языку для их процессоров.
ARV можно и английский. спасибо. сейчас посматрю ваши линки
Добавлено after 2 hours 37 minutes 42 seconds:
получается у каждого компилятора свой язык...
ARV, а если я в ардуиновский компилятор подсуну код с _BV(x), он его поймет?
ARV можно и английский. спасибо. сейчас посматрю ваши линки
Добавлено after 2 hours 37 minutes 42 seconds:
получается у каждого компилятора свой язык...
ARV, а если я в ардуиновский компилятор подсуну код с _BV(x), он его поймет?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
должен по идее, ведь ардуино компилирует тем же самым AVR-GCC, о котором я все и писал... а если не поймет, просто добавьте в самом начале своего файла #define _BV(x) (1<<(x)) и после этого уже проблем не будетalex68md писал(а):если я в ардуиновский компилятор подсуну код с _BV(x), он его поймет?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: Нескольно простых вопросов о программировании AVR на Си.
К вопросу о двумерных массивах. Вспомнилась лекция по С из ютюба, где лектор рассказывает о том, что в итоговом коде не существует массивов размерностью больше 1. Любой многомерный массив переводится в строку и хранится в таком виде в памяти. А если нашаманить с указателями то можно получить интересные эффекты
.
К вопросу о среде. Я агитирую за IAR. Изначально привык к среде и переход на стмки был не так ужасен. Кроме того, в один прекрасный момент, Вы захотите попробовать С++, а в avr-gcc его поддержка не полная. Кроме того, в другой прекрасный момент, Вы захотите запустить пошаговое исполнение кода в Proteus. И опа! А ваша 7я студия с ее gcc не может нормально сгенерировать elf файл, надо откатиться на 6ю. Потом Вы решите, а ну его, этот Proteus. Есть же JTAG! Покупать фирменный 3-й айс за 200 у.е. для хобби как-то не ок. Нагуглите 1-й айс, самодельный, ну или купите за 10 у.е. И тут снова засада - 7я студия не поддерживает такое, только 4я.
Но купив за 20 у.е. стмовскую дискавери Вы получаете отладочную плату, программатор, джитаг-отладчик. Вот Вам и Атмел.
P.S. Когда писал одну прожку под stm, мне ядро исключение кидало, когда я по невнимательности, через указатель, выходил за пределы своего массива. Это к вопросу о надежности кода. А чего стоят точки останова исполнения по изменению ячейки памяти
. Тебе исключение с жалобой на ячейку памяти, а ты туда брекпоинт и сидишь, ждешь - кто же попытается ее изменить.
Добавлено after 16 minutes 44 seconds:
Читайте, смотрите лекции по С. Тогда Вы поймете какие "костыли" применяются для адаптации С к авр, откуда берутся названия регистров в компиляторе и т.п.
Можно и по другому выразиться - создавая новый проект в среде, Вы не получаете чистый лист. Вы получаете заготовку. С хидерами. В которых что-то уже определено, при помощи того же С.
К вопросу о среде. Я агитирую за IAR. Изначально привык к среде и переход на стмки был не так ужасен. Кроме того, в один прекрасный момент, Вы захотите попробовать С++, а в avr-gcc его поддержка не полная. Кроме того, в другой прекрасный момент, Вы захотите запустить пошаговое исполнение кода в Proteus. И опа! А ваша 7я студия с ее gcc не может нормально сгенерировать elf файл, надо откатиться на 6ю. Потом Вы решите, а ну его, этот Proteus. Есть же JTAG! Покупать фирменный 3-й айс за 200 у.е. для хобби как-то не ок. Нагуглите 1-й айс, самодельный, ну или купите за 10 у.е. И тут снова засада - 7я студия не поддерживает такое, только 4я.
Но купив за 20 у.е. стмовскую дискавери Вы получаете отладочную плату, программатор, джитаг-отладчик. Вот Вам и Атмел.
P.S. Когда писал одну прожку под stm, мне ядро исключение кидало, когда я по невнимательности, через указатель, выходил за пределы своего массива. Это к вопросу о надежности кода. А чего стоят точки останова исполнения по изменению ячейки памяти
Добавлено after 16 minutes 44 seconds:
Это Вам по молодости так кажется. Вы просто еще не разбираетесь в хидерах, макросах и директивах компилятора. Язык у всех один С или С++. А вот надстройки над этим языком в виде макросов и директив уже индивидуальны. Макросы можно легко переносить в собственный хидер. А директивы, как правило, имеют полные аналогии - будь то иаровкое __interrupt_vector или студиевское ISR(...).alex68md писал(а):получается у каждого компилятора свой язык...
Читайте, смотрите лекции по С. Тогда Вы поймете какие "костыли" применяются для адаптации С к авр, откуда берутся названия регистров в компиляторе и т.п.
Можно и по другому выразиться - создавая новый проект в среде, Вы не получаете чистый лист. Вы получаете заготовку. С хидерами. В которых что-то уже определено, при помощи того же С.



