WinAvr в вопросах и ответах
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Ха... Я думал точно так, как Вы сказали, но если я так делал, мне вместо варнинга выдавался уже error: conflicting types for 'SendStr_P'. Посчитав, что варнинг лучше чем еррор, я оставил как было...
- Реклама
ну если вы работаете в студии, то проблемы, конечно, могут быть. я пользуюсь Eclipse и особо не горюю...Пока_без_кота писал(а):Все что позже, поставляеться каким-то набором файлов, и я незнаю, как его установить.
можете попробовать, предварительно заархивировав папку с уже установленной версией avr-gcc, скачать более свежую версию и тупо перезалить содержимое папок - их названия одинаковы, файлы предыдущей версии будут затерты новыми... если не понравится - вытрете все вобще и из архива восстановите прежнюю версию. вся инсталляция заключается только в распаковке архива и правильном прописывании путей в PATH...
Добавлено after 1 minute 43 seconds:
это скорее всего из-за того, что прототип и реализация у вас не одинаковые. небось, в прототипе-то забыли const дописать...Пока_без_кота писал(а):conflicting types for 'SendStr_P'
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Бинго! Вы наверное и по фотографии много чего умеетеARV писал(а):... небось, в прототипе-то забыли const дописать...
Насчет подмены фалов, после работы попробую.
ну дык легко указывать на те ошибки других, которые сам совершал не один раз...Пока_без_кота писал(а):Бинго!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Эта музыка будет вечной ... Теперь такая ситуация:
Все строки во флеше обьявлены вот так:
Есть функция парсинга строки:
Прототип обявлен соответственно:
Имею warning: passing argument 1 of 'Parsing' discards 'const' qualifier from pointer target type [enabled by default]
Вроде все понятно, как и в предыдущий раз добавляю const в прототип, получая
и в саму функцию (код не привожу, понятно что меняеться только в "шапке").
И получаю уже другой warning: assignment discards 'const' qualifier from pointer target type [enabled by default] на строчке функции парсинга
Как побороть этот порочный круг ? 
П.С. Как всегда, написал, и только тогда понял как. Надо переменную обявить как
Верно ? Просто для меня это как-то нелогично, к переменной приписывать атрибут const 
Все строки во флеше обьявлены вот так:
Код: Выделить всё
const char AT[] PROGMEM = "AT\r\n";
const char OK[] PROGMEM = "OK\r\n";
const char ATE0[] PROGMEM = "ATE0\r\n";
const char ATV0[] PROGMEM = "ATV0\r\n";
Спойлер
Код: Выделить всё
// Парсинг строки ==================
char Parsing(char *string, unsigned int parsing_delay)// На входе указатель на 1 символ строки, и время парсинга строки
{
unsigned char temp;
parsing_result = 0; // Начинаем парсинг с обнуления успешного парсинга/устранения ошибки парсинга
parsing_pointer = string; // Копируем указатель на 1 сивол строки, которую будем парсить в глобальную переменную
temp = UDR; // Читаем приемник, чтобы сбросить флаг прерывания от всякого мусора, который там был до этого
UCSRB |= 1<<RXCIE; // Разрешаем прерывание по приходу байта - парсинг начался
while(parsing_result != 1) // Ждем успешного окончания, либо ошибки парсинга
{
_delay_ms(1);
parsing_delay--;
if (parsing_delay == 0) // Если время парсинга вышло
{
UCSRB &= ~(1<<RXCIE); // Запрещаем прерывание по приходу байта, чтобы не отвлекаться на всякую дрянь
return 2; // И вываливаемся из цикла с ошибкой парсинга
}
}
return 1;
}
Код: Выделить всё
char Parsing(char *string, unsigned int parsing_delay);
Вроде все понятно, как и в предыдущий раз добавляю const в прототип, получая
Код: Выделить всё
char Parsing(const char *string, unsigned int parsing_delay);
И получаю уже другой warning: assignment discards 'const' qualifier from pointer target type [enabled by default] на строчке функции парсинга
Код: Выделить всё
parsing_pointer = string;
П.С. Как всегда, написал, и только тогда понял как. Надо переменную обявить как
Код: Выделить всё
const char *volatile parsing_pointer;
- Реклама
Логично.
все указатели, которые "смотрят" во flash, должны быть указателями на константу.
const char * var; надо читать задом наперед: [переменная] var - это указатель на символ-константу.
то есть не переменная константа, а указатель на константу. сам указатель вполне себе не константный.
если вам приспичит иметь константный указатель, то он должен быть записан иначе, вам уже объясняли: char * const var; - читаем задом наперед: var - это неизменяемый (т.е. константный) указатель на char
Си - странный язык... чтобы понять некоторые записи, надо смотреть на них справа налево, хотя почти все читается слева направо...
все указатели, которые "смотрят" во flash, должны быть указателями на константу.
const char * var; надо читать задом наперед: [переменная] var - это указатель на символ-константу.
то есть не переменная константа, а указатель на константу. сам указатель вполне себе не константный.
если вам приспичит иметь константный указатель, то он должен быть записан иначе, вам уже объясняли: char * const var; - читаем задом наперед: var - это неизменяемый (т.е. константный) указатель на char
Си - странный язык... чтобы понять некоторые записи, надо смотреть на них справа налево, хотя почти все читается слева направо...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Спасибо, понял.
Почему вот так массив можно описать
а вот так уже нет
Почему вот так массив можно описать
Код: Выделить всё
unsigned char buffer[20];
Код: Выделить всё
#define buffer_max 20; // Размерность буффера
unsigned char buffer[buffer_max];
Можно. Но у Вас ошибка в дефайне. Сделайте сами замену текста и поймёте в чём ошибкаПока_без_кота писал(а): а вот так уже нетКод: Выделить всё
#define buffer_max 20; // Размерность буффера unsigned char buffer[buffer_max];
Добавлено after 9 minutes 15 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3209859#p3209859"]Си - странный язык... чтобы понять некоторые записи, надо смотреть на них справа налево, хотя почти все читается слева направо...[/uquote]
Ничего странного, всё предельно просто. То, что слева от звёздочки - относится к типу на указываемый объект, всё что справа от неё - к самому указателю.
привыкнуть можно, конечно, но вот что прямо-таки предельно просто, не соглашусь. если левее идентификатора переменной находится две звездочки, и между ними квалификатор[ы], то уже понять, что относится к левой, а что к правой звездочке уже не так элементарно... ну да ладно, это я уже брюзжу...Аlex писал(а):Ничего странного, всё предельно просто.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Вы меня не поняли. Заменять нужно не buffer_max, а то, на что это меняется в программе.Пока_без_кота писал(а):Прошу прощения, но я буквально скопировал buffer_max из дефайна в размерность буффера, и все равно ошибка "имеет место быть". Я не понимаю
Вы, по всей видимости, с трудом представляете, что такое define. На самом деле, всё очень просто. define - это обычная подмена одного текста, на другой. Не более того.
Посмотрите, что и на что заменяется :
Код: Выделить всё
Заменяется Вот это На это
| | |
| | |
#define buffer_max 20; // Размерность буффера
Мне не хочется Вам сразу на неё указывать. Хотелось бы, чтобы Вы её сами обнаружили, дабы в дальнейшем в неё меньше вляпываться.
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Я действительно не понимаю чего я не понимаю.
Я понимаю, что дефайн, это просто змена текста.
Но я не понимаю, почему, если я его определил, эта замена не хочет осуществляться.
Я понимаю, что дефайн, это просто змена текста.
Но я не понимаю, почему, если я его определил, эта замена не хочет осуществляться.
А зачем там в дефайне лишняя точка с запятой? Это приведёт к ошибке 100%.
Спойлер
Код: Выделить всё
unsigned char buffer[20;]; // ошибка- Сообщения: 291
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="WiseLord",url="/forum/viewtopic.php?p=3210578#p3210578"]А зачем там в дефайне лишняя точка с запятой? Это приведёт к ошибке 100%.[/uquote]
Ошибка которую находит компилятор - это не ошибка вовсе
Так, опечатка, исправил - и нет ее 
Ошибка которую находит компилятор - это не ошибка вовсе
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
[uquote="WiseLord",url="/forum/viewtopic.php?p=3210578#p3210578"]А зачем там в дефайне лишняя точка с запятой? Это приведёт к ошибке 100%.[/uquote] А откуда вы взяли этот код? В том, что я выложил несколькими постами выше, нет этой точки с запятой...
- Сообщения: 291
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3209991#p3209991"]Спасибо, понял.
Почему вот так массив можно описать
а вот так уже нет
[/uquote]
хм... Это не Ваш пост?
Почему вот так массив можно описать
Код: Выделить всё
unsigned char buffer[20];
Код: Выделить всё
#define buffer_max 20; // Размерность буффера
unsigned char buffer[buffer_max];
хм... Это не Ваш пост?
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
[uquote="WiseLord",url="/forum/viewtopic.php?p=3210578#p3210578"]А зачем там в дефайне лишняя точка с запятой? Это приведёт к ошибке 100%.
[/uquote]
Вот знал я, что кто-нибудь не выдержит и скажет
Совсем не дают людям подумать ...
Я же не зря человеку написал - замените текст вручную. Причём подробно расписал, что и на чего меняется.
Спойлер
Код: Выделить всё
unsigned char buffer[20;]; // ошибкаВот знал я, что кто-нибудь не выдержит и скажет
Совсем не дают людям подумать ...
Я же не зря человеку написал - замените текст вручную. Причём подробно расписал, что и на чего меняется.
- Сообщения: 359
- Зарегистрирован: Чт авг 08, 2013 01:06:54
Не сердитесь)) Я думаю, мне еще представиться случай подумать
В свое опрадание только скажу, что я воспринимал эту точку с запятой не как обязательную конструкцию языка Си, а как символ начала коментария (сказываеться опыт программирования на 3 ассемблерах, без единого ЯВУ).
точка с запятой в макросе - это еще фигня на постном масле... а вот древние версии avr-gcc подтягивали туда и комментарии в стиле // - вот где был кошмар на улицу Вязов! можете даже поискать в гугле - полно советов в строке макросов не делать комментариев или делать их в /* таком виде */... даже я такие советы давал лет несколько тому назад 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


