WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Пока_без_кота писал(а):Все что позже, поставляеться каким-то набором файлов, и я незнаю, как его установить.
ну если вы работаете в студии, то проблемы, конечно, могут быть. я пользуюсь Eclipse и особо не горюю...

можете попробовать, предварительно заархивировав папку с уже установленной версией avr-gcc, скачать более свежую версию и тупо перезалить содержимое папок - их названия одинаковы, файлы предыдущей версии будут затерты новыми... если не понравится - вытрете все вобще и из архива восстановите прежнюю версию. вся инсталляция заключается только в распаковке архива и правильном прописывании путей в PATH...

Добавлено after 1 minute 43 seconds:
Пока_без_кота писал(а):conflicting types for 'SendStr_P'
это скорее всего из-за того, что прототип и реализация у вас не одинаковые. небось, в прототипе-то забыли const дописать...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

ARV писал(а):... небось, в прототипе-то забыли const дописать...
Бинго! Вы наверное и по фотографии много чего умеете :)))
Насчет подмены фалов, после работы попробую.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Пока_без_кота писал(а):Бинго!
ну дык легко указывать на те ошибки других, которые сам совершал не один раз...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Эта музыка будет вечной ... Теперь такая ситуация:
Все строки во флеше обьявлены вот так:

Код: Выделить всё

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);
Имею warning: passing argument 1 of 'Parsing' discards 'const' qualifier from pointer target type [enabled by default]
Вроде все понятно, как и в предыдущий раз добавляю 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;
Как побороть этот порочный круг ? :oops:
П.С. Как всегда, написал, и только тогда понял как. Надо переменную обявить как

Код: Выделить всё

const char *volatile	parsing_pointer;
Верно ? Просто для меня это как-то нелогично, к переменной приписывать атрибут const :dont_know:
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Логично.
все указатели, которые "смотрят" во 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];	
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Пока_без_кота писал(а): а вот так уже нет

Код: Выделить всё

#define			buffer_max	20;							// Размерность буффера
unsigned char	buffer[buffer_max];	
Можно. Но у Вас ошибка в дефайне. Сделайте сами замену текста и поймёте в чём ошибка :)

Добавлено after 9 minutes 15 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3209859#p3209859"]Си - странный язык... чтобы понять некоторые записи, надо смотреть на них справа налево, хотя почти все читается слева направо...[/uquote]
Ничего странного, всё предельно просто. То, что слева от звёздочки - относится к типу на указываемый объект, всё что справа от неё - к самому указателю.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):Ничего странного, всё предельно просто.
привыкнуть можно, конечно, но вот что прямо-таки предельно просто, не соглашусь. если левее идентификатора переменной находится две звездочки, и между ними квалификатор[ы], то уже понять, что относится к левой, а что к правой звездочке уже не так элементарно... ну да ладно, это я уже брюзжу...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Пока_без_кота писал(а):Прошу прощения, но я буквально скопировал buffer_max из дефайна в размерность буффера, и все равно ошибка "имеет место быть". Я не понимаю :dont_know:
Вы меня не поняли. Заменять нужно не buffer_max, а то, на что это меняется в программе.
Вы, по всей видимости, с трудом представляете, что такое define. На самом деле, всё очень просто. define - это обычная подмена одного текста, на другой. Не более того.
Посмотрите, что и на что заменяется :

Код: Выделить всё

Заменяется    Вот это      На это   
            |          |            |
            |          |            |
#define      buffer_max      20;    // Размерность буффера
и сами вручную замените у себя в программе. И сразу увидите ошибку.
Мне не хочется Вам сразу на неё указывать. Хотелось бы, чтобы Вы её сами обнаружили, дабы в дальнейшем в неё меньше вляпываться.
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Я действительно не понимаю чего я не понимаю.
Я понимаю, что дефайн, это просто змена текста.
Но я не понимаю, почему, если я его определил, эта замена не хочет осуществляться. :oops:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

А зачем там в дефайне лишняя точка с запятой? Это приведёт к ошибке 100%.
Спойлер

Код: Выделить всё

unsigned char   buffer[20;];   // ошибка
Контактная информация:
Грызет канифоль
Сообщения: 290
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[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] А откуда вы взяли этот код? В том, что я выложил несколькими постами выше, нет этой точки с запятой...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Уберите ту, которая есть...
«И всё-таки она вертится!»
Грызет канифоль
Сообщения: 290
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3209991#p3209991"]Спасибо, понял.
Почему вот так массив можно описать

Код: Выделить всё

unsigned char	buffer[20];
а вот так уже нет

Код: Выделить всё

#define			buffer_max	20;							// Размерность буффера
unsigned char	buffer[buffer_max];	
[/uquote]

хм... Это не Ваш пост?
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Всем спасибо за ваше терпение!!! До меня дошло.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3210578#p3210578"]А зачем там в дефайне лишняя точка с запятой? Это приведёт к ошибке 100%.
Спойлер

Код: Выделить всё

unsigned char   buffer[20;];   // ошибка
[/uquote]
Вот знал я, что кто-нибудь не выдержит и скажет :)
Совсем не дают людям подумать ... :(

Я же не зря человеку написал - замените текст вручную. Причём подробно расписал, что и на чего меняется.
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Не сердитесь)) Я думаю, мне еще представиться случай подумать :))) В свое опрадание только скажу, что я воспринимал эту точку с запятой не как обязательную конструкцию языка Си, а как символ начала коментария (сказываеться опыт программирования на 3 ассемблерах, без единого ЯВУ).
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

точка с запятой в макросе - это еще фигня на постном масле... а вот древние версии avr-gcc подтягивали туда и комментарии в стиле // - вот где был кошмар на улицу Вязов! можете даже поискать в гугле - полно советов в строке макросов не делать комментариев или делать их в /* таком виде */... даже я такие советы давал лет несколько тому назад :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Спасибо за "предупредительный выстрел" :write:
Ответить

Вернуться в «AVR»