|
Простые вопросы по IAR |
|
|
|
 |
Ответов
(1 - 68)
|
Aug 30 2007, 15:33
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Aug 30 2007, 18:00)  Как обозначить глобальную переменную, что бы она была видна в других подлинковачных файлах. Абсолютно так же как в любимом, как я слышал, Вами всей душой Keil и вообще в любом компиляторе 'C'. P.S. Место этого вопроса не в теме по АРМ. Перенес. P.P.S. В 'C' все глобальные переменные видны снаружи по умолчанию, если специально не ограничивать область видимости, но мне что-то подсказывает, что вопрос был не об этом.....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 30 2007, 16:52
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Aug 30 2007, 19:37)  Где в настройках IAR включить Повторяю - нигде. Они таковые по умолчанию и "галочками" естественно не отключаются. Тут уже было высказано предположение о том, что надо почитать про extern. Читать в любой книжке по "C". Повторяю по "C" а не по Keil, IAR, GNU, Rowley, ибо это фича языка а не особенность компилятора. Что касается допонительного вопроса по размещению чего-то по конкрктному адресу, то лучше этого не делать никогда. А если уж сильно надо, то пользоватся надязыковыми средствами типа линкера. И только в наикрайнейшем случае следует пользоватся уникальными наворотами конкретного компилятора, прочитав документацию на конкретный компилятор. Что каксается IAR, то это зависит от версии. В 5.10, например, похерили (ну и наверное правильно) инициализацию  что на самом деле ознает, что похерили все, ибо просто обращение по конкретному адресу не требует искуственных наворотов к языку. Правда линкер у них пока сырой (или я не врубился совсем), что связывает руки.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 30 2007, 17:49
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Про EXTERN знаю. Я писал много под AVR. Гарвардская архитектура. Там три сегмента FLASH, ROM, DATA использовал, и всё было в шоколаде (CodeVisionAVR C Compiler). Глобальные переменные были видны во всех файлах, и не было проблем с дополнительными манипуляциями. Сейчас под ARM пишу, Фон Неймовская архитектура, и много вопросов появляется, наверняка являющиеся раздражительными и недостойными для местных гуру. А по конкретному адресу надо потому, что программа из внешней ROM работает, а переменная должна во внешней flash сохранятся.
Кстати хотел Вам zltigo ответить, хотя Вы всячески пытаетесь меня уязвить в неграмотности, но ладно, Вы мне отвечаете на вопросы, на поиск ответов на которые сейчас просто НЕТ ВРЕМЕНИ! Горит проект. И за это Вам спасибо. Так вот что такое listing, как не удивительно, я тоже знаю. Я говорил за удобство. В других оболочках (Keil, Cvision) мне было удобно работать так, а не просматривать listing. А в IAR я такой возможности, не обнаружил, поэтому и спросил.
Сообщение отредактировал Beginning - Aug 30 2007, 17:52
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Aug 30 2007, 18:14
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Aug 30 2007, 20:32)  Про EXTERN знаю. Я писал много под AVR. Гарвардская архитектура. Там три сегмента FLASH, ROM, DATA использовал, и всё было в шоколаде (CodeVisionAVR C Compiler). Глобальные переменные были видны во всех файлах Цитата Вы хоть поняли, что написали? Незнаю, что Вы там писали, но сие абсолютно платформенно независимая вещь.
наверняка являющиеся раздражительными и недостойными для местных гуру Эти вопросы достаточно обычны, а вот что мне несколько не понравилось, так это Ваше совершенно ничем не спровоцированное выступление за один из компиляторов с нелестными эпитетами по поводу другого. Из которого вроде-бы следовало, что Автор всех собак съел на этом, хотя и не приступал к этой закуске  . Так что, простите, я на все через эту призму смотрю. Цитата А по конкретному адресу надо потому, что программа из внешней ROM работает, а переменная должна во внешней flash сохранятся. О господи! Про указатели прочитайте, да?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 30 2007, 19:53
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Aug 30 2007, 21:25)  ..мне по-барабану какой компилятор. Да, это заметно  . Ладно, все - больше не буду. Цитата(rezident @ Aug 30 2007, 21:46)  В последних версиях IAR выкинула такую конструкцию... Выкинули инициализацию. Осталось некоторая видимость ввиде указания адреса, что уже совершенно ненужный прибамбас, ибо штатными 'C' средствами решается. Цитата , чтобы более точно соответствовать стандарту ну стандарт этого не определяет и не запрещает. Формат объектника на ELF поменяли а это (как и исчезновение выкидывания неиспользуемых функций при линковке объектников) просто последствия. Зато теперь чужими линкерами и библиотеками можно пользоватся, что крайне неплохо. Цитата квалификатор const не обязывает к тому, что переменная с этим квалификатором обязана во Flash находиться. const указывает лишь на то, что это переменная не модифицируется. Ну перебор  , естественно не для случая, когда явно указан адрес расположения переменной.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 1 2007, 05:32
|

Помогу, чем смогу
     
Группа: Админы
Сообщений: 2 786
Регистрация: 28-05-04
Из: Москва
Пользователь №: 25

|
Уважаемый Beginning, пожалуйста не горячитесь. Почему Вы думаете, что только у Вас нет времени искать? Хорошо, что Вы иногда хоть благодарите за ответы, иначе получилось бы, что Вы работаете, а все остальные ждут Ваших вопросов, занимаются фигней и не удосуживаются дать конкретный ответ.
Удачи Вам в текущем срочном проекте! Мы Вас все прекрасно понимаем, так как многие из нас были, а кто-то и сейчас, находятся в цейтноте.
--------------------
|
|
|
|
|
Sep 1 2007, 08:59
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Да ладно, ни на кого зла не держу. Всё понимаю. Вот, например zltigo вывело то, что я нелестно о IAR отозвался (хотя он меня неправильно понял), а меня немного вывело то, что меня все вдруг начали считать неучем и нежелающим искать ответы. Я всегда ищу ответы САМ. Просто сейчас особый случай, ни сегодня, завтра проект сдавать. Вот и использую все возможные варианты. И в форум вопрос кину и параллельно сам ищу. Просто возникает множество мелких элементарных вопросов, которые просто требуют ответа типа ”да/нет”, и движешься дальше, решая уже сложные алгоритмические задачи. Ан нет, надо каждый раз спотыкаться, прекращать основную работу и искать, искать… Вообщем ещё раз скажу всем спасибо, кто помог, и тем кто возможно ещё поможет.
Сообщение отредактировал Beginning - Sep 1 2007, 09:45
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 1 2007, 09:14
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 1 2007, 11:59)  zltigo вывело то, что я нелестно о IAR отозвался Повторяю. Отнюдь не это, а то, что Вы своими оценками превосходства одного из компиляторов, с походя опусканием другого, неверно спозиционировали свой уровень знаний и навыков. Что и привело к диссонансу между вопросами и ответами. IAR мне не брат и не кум - никакого особого пиетета я не испытываю, просто пользуюсь, как впрочем и еще тремя компиляторами, в повседневной жизни. А документация у IAR вполне хороша, систематизирована и поиск по PDF работает много быстрее, нежели вопрос-ответ в форуме.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 1 2007, 09:14
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Sep 1 2007, 11:59)  И в форум вопрос кину и параллельно сам ищу. Help->C/C++ compiler reference->Search->"irq" Search->"interrupt". Это сложно? Это занимает полдня? Тогда не удивительно, что <<завтра проект сдавать, а у меня “конь не валялся”>> и я в шоке, насколько нетривиальные вопросы нас еще ожидают. P.S. Там есть еще папка examples в директории компилятора.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 1 2007, 22:00
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
В IAR нет itoa. Использую во это: Цитата uint8* itoa(int val, int base) { static uint8 buf[32] = {0}; int i = 30; for(; val && i ; --i, val /= base) buf[i] = "0123456789abcdef"[val % base]; return &buf[i+1]; }; Вопрос. Как мне обозначить подключаемый asm файл с startup чтобы IAR его использовал, а не брал свой. А то возникает ошибка, мол два куска кода ссылаются на одни и те же адреса.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 2 2007, 08:58
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 2 2007, 01:00)  В IAR нет itoa. Использую во это: Это не itoa(), ни по формату, ни по отсутствию обработки отрицательных значений. Посему обозвать другим словом. При отрицательных значениях - глюки. Возвращаемое значение указатель на char а не на unsigned char, поскольку речь идет о строке. Последний оператор ; - лишний. --i вместо i--, естественно аболютно не принципиально, но заставляет читающео думать о каких-то наихитрейших хитростях. Вынесение присвоения i из for, тоже ничем не обосновано и сбивает процесс чтения. Значения 0 обычно как '0' печатают а не 'ничего'. Проверка i - лишняя, ибо буфер под строчку достаточной длинны. Код char *ulongtoa( unsigned long val, int base ) { static char buf[32+1] = {0}; int i = 32-1-1; do { buf[i--] = "0123456789abcdef"[val % base]; val /= base; } while( val ); return( &buf[i] ); } Цитата Как мне обозначить подключаемый asm файл с startup чтобы IAR его использовал, а не брал свой. "Cвой" он естественно не берет, если явно не указано линковать, например, объектник - разбирайтесь с 'галочками'. Цитата А то возникает ошибка, мол два куска кода ссылаются на одни и те же адреса. ????
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 2 2007, 15:28
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Народ может, кто алгоритм подкинет, если есть, а то уже голова пухнет и не хочет работать. В общем, есть dallas таймер. Он вазвращает 32bit число – количество секунд. Так вот его надо раздраконить в минуты(char), часы(char), дни(char), месяц(char), год(short). Спасибо  . Знал, что есть такая (раньше как-то видел), но забыл. На 8bit машине редко используется.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 2 2007, 16:39
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 2 2007, 19:11)  изучаю библиотеку time.h Главное слово time какое незнакомое  ну ни в жисть не догадаться поискать  Цитата Правда в help IAR по этим функциям оставляет желать лучшего Ну как-бы с одной сторны это не дело компилятора справочник по стандартному 'С' содержать, а так действительно поганенький  . Возьмите книжку, просто книжку. У меня к моей IDE подключены пяток "C" хелпов  на выбор и никакких проблем. Из бесплатно-доступных приличный чисто языковый у OpenWatcom.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 3 2007, 21:15
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Sep 3 2007, 22:04)  Так вот. Код компилируется, но когда зашивается в проц, то проц виснет. Может какие специальные настройки надо. Она вроде кучу использует. n_sec=1234; tm_p = localtime(&n_sec); И в симулятор, по шагам. Этот код не работает с периферией, поэтому отсимулироваться должен на "хорошо" и "отлично".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 4 2007, 09:50
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Sep 4 2007, 12:01)  В симуляторе в функцию входит и выходит (как там винипух говорил). Но при зашитии в проц он фиснит. Т.е. код выолняется нормально, но когда доходит до localtime() зависает. Ну, возможно ваша версия использует heap. Вы еще где-то используете malloc, new и т.д.? Если нет, сколько памяти вы выделили под сегмент HEAP? Возможно зависание происходит из-за невозможности выделить достаточно памяти. Хотя тогда должно и в симуляторе виснуть. Я все же склонен считать, что чудес не бывает и "зависание" происходит по причине нехватки памяти, например - стека. Цитата(Beginning @ Sep 4 2007, 12:01)  Определяю структуру в main.c как глобальную: А ведь говорили - внимательно прочитайте учебник про extern. Когда вы компилируете другой файл, компилятор понятия не имеет ни о main.c, ни о том, какие поля есть у описанной там структуры. Цитата(Beginning @ Sep 4 2007, 12:01)  Возникает предупреждение: Warning[Pe1000]: a storage class may not be specified here E – на вот это ”extern strucr data; ” strucr вместо struct. Цитата(Beginning @ Sep 4 2007, 12:01)  И далее ошибки:
Error[Pe020]: identifier "data" is undefined
В чём засада? Пробывал обычный int x; в другом файле extern int x; Всё прокатывает. Потому что int, char, float, указатели - это встроенные типы. А структуры - это типы, определяемые пользователем. Попробуйте так: "в другом файле": extern struct { uint8 a[6]; uint8 b[5]; uint8 c[4]; uint8 d[3]; uint8 e[3]; uint8 f[6]; } data; Потом когда захотите внести изменение в эту структуру и полезете по всем файлам искать и править ее объявление - прочитайте в букваре по С про заголовочные файлы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 4 2007, 11:41
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Цитата strucr вместо struct. Очепятка. В исходниках верно написано.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 5 2007, 08:25
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 5 2007, 10:09)  Попробывал использовать Гринвичское время gmtime(), всё заработало наура. Ну если лето/зима/временная_она не нужны, что маловероятно, то пользуйтесь. В противном случае разбирайтесь с IARовской _Tzoff(void), которая отвечает за все вышеперечисленное и теми параметрами которыми она пользуется. Я лично с начала 90x, когда передомною возникла такая проблема для встоенной системы ушел на "свою" сделаннаю по мотивам борландовской библиотечной, но со статическим tm и 'универсальным' 16bit идентификатором летнего времени [StartMonth] [EndMonth] [Style] [ChangeHour] задаваемым в конфигурации. Кстати, совет - системные часы должны идти по Гринвичу, а не по локальному времени, как это в свое время сделали недоумки( это не ругательство это констатация факта) из MS.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 5 2007, 12:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 5 2007, 14:50)  А что вы имели под "лето/зима/временная_она"? В смысле летнее/зимнее время. Мне оно не нужно. На час вперёд и назад можно руками перевести. Ну не нужно, так не нужно (хотя не красиво ) тогда часы идут по локальному времени а находитесь Вы все равно где, пусть и в Гринвиче  . Цитата Или здесь где-то засада зарыта? Если Вы живете по Гринвичу/UTC называя это своим локальным временем, то никаких проблем нет. Проблемы с зонами и переходами лето/зима. В случае часов по гринвичу они НИКОГДА не переставляются и вычисляется только поправка. В случае системных часов по локальному времени ВАМ ПРИДЕТСЯ ПЕРЕСТАВЛЯТЬ ЧАСЫ, что само по себе может быть неудобным и в придачу возникают неопределенности, например, Вы включили устройство в 2:30 минут (по системныи часам) в день перехода веремени - который час? Ответ не возможен без дополнительного знания о том какое время лето/зима сейчас часы показывают.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 6 2007, 13:11
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
const uint8 x[4][4]= { (1,2,3,4), (1,2,3,4), (1,2,3,4), (1,2,3,4) }; Почему на это выражение ругается. Выдаёт: Error[Pe057]: this operator is not allowed in a constant expression float x=56; Вообще то логично.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 6 2007, 13:11
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Код const uint8 x[4][4]= { (1,2,3,4), (1,2,3,4), (1,2,3,4), (1,2,3,4) }; Чем дальше в лес, тем больше дров  . Может стоит хоть книжку по С прочитать? Компилятору не по барабану круглые или фигурные скобки.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 6 2007, 13:46
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Вырезка из книги Керинан и Ричи: STATIC INT DAY_TAB[2][13] = { (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31), (0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) }; Я использовал эту конструкцию в CodeVision, и не было никаких ошибок. И кому здесь по барабану?
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 6 2007, 14:04
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 6 2007, 16:46)  И кому здесь по барабану?  Правильному компилятору не по барабану мусорные круглые скобки. Либо уберите их совсем и неявно инициализируйте многомерный массив одномерным, Код const uint8 x[4][4]= { 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4 }; либо инициализируйте многомерные массивы, как положено - фигурными скобками. Код const uint8 x[4][4]= { {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4} }; Цитата Вырезка из книги Керинан и Ричи: Компиляторы с опцией компилировать в стиле K&R уже почти вымерли и слава богу, ибо есть С99.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 6 2007, 14:12
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Какой же это правильный компилятор, если не по ANSI C делает. А вы, прежде чем в книги отсылать, лучше бы попробовали сами. На конструкцию предложенною вами у компилятора вообще аллергия: const uint8 dd[4][]{ {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4} }; Error[Pe098]: an array may not have elements of this type Error[Pe065]: expected a ";"
Я к стати эту конструкцию пробывал, ещё до обсуждения.
Сообщение отредактировал Beginning - Sep 6 2007, 14:19
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 6 2007, 14:35
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 6 2007, 17:12)  лучше бы попробовали сами. Не буду я пробовать - оно работает и без моих проб  Цитата На конструкцию предложенною вами у компилятора вообще аллергия: const uint8 dd[4][]{ {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4} }; Обратите свой ясный взор на мой пост и на то, что Вы здесь нагородили и найдите два отличия 1. Нет явного указания для размерности многомерного массива; 2. Компилятору не по барабану отсутствие оператора присвоения. Цитата Я к стати эту конструкцию пробывал, ещё до обсуждения. Ага  , два раза. Цитата Какой же это правильный компилятор, если не по ANSI C делает. K&R это не ANSI С и не C99
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 6 2007, 14:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Sep 6 2007, 17:12)  Какой же это правильный компилятор, если не по ANSI C делает.
Я к стати эту конструкцию пробывал, ещё до обсуждения. А что, ANSI C позволяет круглые скобки в этом месте вместо угловых? Попробуйте добавить в начале файла #include <stdint.h>, заменить uint8 на uint8_t и добавить "равно" На всякий случай - "стилем K&R" называется изложенный в первом издании их книги стиль. Если у вас первое издание - скачайте второе, оно уже про ANSI C.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 6 2007, 19:51
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Создаю массив ссылок на строки: const uint8 *men0[]= { "Пункт 1", "Пункт 2”, “Пункт 3” }; Затем вызываю функцию: menu_(x,men0); Функция типа: void menu_(uint8 x, const uint8 **t) В ней вызываю функцию печати: lcd_puts(t[x]); Компилится без ошибок. Но почему то, в lcd_puts не передаётся ссылка на строки, и печатается всякая хрень  . В CodeVision это работало нормально.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 7 2007, 06:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 6 2007, 22:51)  Но почему то, в lcd_puts не передаётся ссылка на строки передаются, передаются - не надо диагнозы из пальца высасывать и рефреном повторять глупости: Цитата В CodeVision это работало нормально. Когда даже в элементарной набивке текста опечатка на опечатке (можете поискать три неправильных кавычки в своем примере). Цитата , и печатается всякая хрень  . Да ну? А Вы полагали, что русские литеры в Win кодировке на LCD должны смотреться как-то иначе? P.S. И не обзывайте все подряд uint8 - строки есть строки и char это не всегда uint8. P.P.S. И const используйте в "естественном" для 'C' порядке с права на лево и не накладывайте дополнительных ненужных восьмибитовых ограничений на переменные - компилятору не придется городить ненужный код. void menu_( int x, char const * const *t )
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 7 2007, 07:02
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Ну вы прям меня вообще за идиота считаете. Цитата Да ну? А Вы полагали, что руссие литеры в Win кодировке на LCD должны смотреться как-то иначе? Как вы считаете как это будет выглядеть на LCD "1.\x42\x70\x65\xBC\xC7.", //1.Время. И с чего вы решили, что я напрямую на LCD кидаю. Цитата передаются, передаются - не надо диагнозы из пальца высасывать и рефреном повторять Ничего я не высасывал из пальца, я выводил данные на терминал и портмонитором смотрел, что на него реально приходит. Цитата Когда даже в элементарной набивке текста опечатка на опечатке (можете поискать три неправильных кавычки в своем примере). Я это для примера привёл, если вы страждете получить полный исходник то получите: Цитата const uint8 *men0[]= { "1.Пункт 1", "2.Пункт 2 "3.Пункт 3" };
uint8 menu_(uint8 y, uint8 x, const uint8 **t) { uint8 z=0,w,s; lcd_clr(); lcd_putsf(0,t[x]); //----------------------- while(1) { if(key_press()) z=read_data_key(); if(z=='2') { x++; if(x>y) x=0; lcd_clr(); lcd_putsf(0,t[x]); for(w=0;w<20;w++) { //if(!(t[x][w])) break; s=t[x][w]; u1_putchar(s); } u1_putchar(10); u1_putchar(13); z=0; } if(z=='8') { x--; if(x==0xff) x=y; lcd_clr(); lcd_putsf(0,t[x]); z=0; } if(z=='6') break; if(z=='4') {x=255; break;} } return x; }
void main_menu(void) { uint8 x=0; while(1) { x=menu_(2,x,men0); if(x==255) break; //------------------------------ switch(x) { case 0: adj_time(); break; case 1: adj_time(); break; case 2: adj_time(); break; }; //------------------------------ } }
void adj_time(void) { lcd_clr(); lcd_puts(1,"Подменю."); delay_us(us(1000000)); } Цитата И не обзывайте все подряд uint8 - строки есть строки и char это не всегда uint8. Uint8 это макрос unsigned char.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 7 2007, 08:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Beginning @ Sep 7 2007, 10:02)  Ничего я не высасывал из пальца, я выводил данные на терминал и... Не знаю куда смотрели, что видели и как увиденное поняли, но для начала просто написать несколько строк без грубых ошибок просто не можете  Цитата ...если вы страждете получить полный исходник то получите: Упаси бог! Зачем он мне? Прочитал первые срочки "полного исходника": Код const uint8 *men0[]= { "1.Пункт 1", "2.Пункт 2 "3.Пункт 3" }; Лучше не стало. Опять ошибка на ошибке - запятые, кавычки, это все типа мелочи. Дальше просто читать не стал. Какой смысл рассуждать о чем-то если компилируют одно, постят другое а думают третье.... Кроме того, повторяю, в приведенном ранее тексте формально все в полном порядке (если не обращать внимания на уже обычные ляпы) Цитата Uint8 это макрос unsigned char. Макрос??? Ну хоть typedef сделайте.... Догадался, только какого лешего его применять для сокрытия естественного типа. P.S. В общем я, пожалуй, завязываю.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 7 2007, 08:32
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
"2.Пункт 2 Коментарии удалял и удалил лишку. Если вы такой умный моглибы и необращать внимание. А то, что по ссылки валится не те данные которые в строке записанны-это факт. Повторяю ещё раз. Никого не заставляю мне отвечать. Не хотите не надо. Цитата Не знаю куда смотрели, что видели и как увиденное поняли, но для начала просто написать несколько строк без грубых ошибок просто не можете Выводил в COM PORT на terminal. А так, как терминал отображает символы в определённой кодировке, то параллельно перехватывал работу с портом PORTMONITOR утилитой, и просматривал все значения в hex. Цитата Догадался, только какого лешего его применять для сокрытия естественного типа. А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить) не вижу принципиальной разницы между: typedef unsigned char uint8; и #define uint8 unsigned char
Сообщение отредактировал Beginning - Sep 7 2007, 08:15
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 7 2007, 10:59
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Sep 7 2007, 11:32)  Если вы такой умный моглибы и необращать внимание. А вы могли бы перед тем как вставить исходный текст в форум откомпилировать его, убедиться что именно этот текст дает именно те ошибки, на которые жалуетесь и уже после этого скопировать прямо из исходника. Мы ведь тоже можем ответить кое-как и совсем про другое - если вы не дурак сами бы поняли. Цитата(Beginning @ Sep 7 2007, 11:32)  А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить) А почему вы решили, что буква - это unsigned char? До вас все считали, что буква это как раз char, даже специально так тип назвали (загляните в словарь). Цитата(Beginning @ Sep 7 2007, 11:32)  не вижу принципиальной разницы между: typedef unsigned char uint8; и #define uint8 unsigned char Поэтому надо больше читать тематической литературы. Разница есть. P.S. Ну а я пока тоже завязываю - с таким апломбом вы и сами разберетесь.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 7 2007, 12:35
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Ладно, на прощание  . Цитата(Beginning @ Sep 7 2007, 11:32)  А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить) Вот что-бы глюки "не ловить" и не переопределяйте тип естественный для символьных строк и кучи библиотечных функций с ними работающих. Цитата не вижу принципиальной разницы между: typedef unsigned char uint8; и #define uint8 unsigned char Насколько я мог заметить Вам вообще многое, что без разницы  , но это не есть объестивная реальность. #define и typedef по разному обрабатываются - один препроцессором, а второй компилятором. Компилятор (или дополнительные утилиты типа lint) могут дополнительно заниматься котролем типов, а препроцессор - нет. Кроме того попробуйте ответить на вопрос есть-ли разница между, например, типами переменных bt и bd: Код str_t at, bt; str_d ad, bd; если: Код typedef char *str_t; // Правильный подход к делу #define str_d char * // Дурной стиль без всякой на то надобности да и еще с побочными эффектами Даже, если Вы "не увидите принципиальной разницы", то смею Вас заверить, что разница есть и фатальная. Никогда не делайте чего-либо через заднепроходное отверстие, если есть прямые пути.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 7 2007, 14:13
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
За...ца - универсальный интерфейс, через него можно делать всё, что угодно. ©  *ad – ссылка, bd – char. Угадал?
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 7 2007, 21:46
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Вообщем попотел, но с траблом разобрался. Короче проделал следующие эксперементы:
uint8 *x=10; - глобальная
void funkc(void) { uint8 z; z=x; ….
Смотрю, что в отладчике. Оказывается что что по адресу x лежит адрес не указывающий на адрес расположения 10 (указывал на первый байт после основного кода). A вот так всё OK.
const uint8 *x=10; - глобальная
Та же трабла была и в следующем примере:
const unsigned char *men0[] = { "1111", "2222", "3333", "4444" };
и в этом:
unsigned char const *men0[] = { "1111", "2222", "3333", "4444" };
и в этом:
unsigned char *men0[] = { "1111", "2222", "3333", "4444" }; Т.е. строки в памяти имелись, но массив ссылок на них не ссылался. А вот с такой конструкцией всё заработало:
unsigned char *const men0[] = { "1111", "2222", "3333", "4444" };
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 8 2007, 07:50
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Sep 8 2007, 00:46)  Короче проделал следующие эксперементы:
unsigned char *const men0[] = Короче вместо того, чтобы потратить 10 минут на чтение двух глав - про const и про указатели вы потратили кучу времени на метод Монте-Карло, но так ничего и не поняли. А ведь вам подсказывали: Цитата(zltigo @ Sep 7 2007, 09:43)  void menu_( int x, char const * const *t )
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 8 2007, 10:26
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Вас затмило ваше сияние и это вы нечего не поняли  . Как раз то, способ передать параметр в функцию ничего не решает. Я использую вот такой: и с ним всё работает: uint8 menu_(unsigned char *const*t); Решающим оказывается определение массива ссылок. Насколько я понял ситуацию, в тех случаях когда код не работал, компилятор создавал не статические ссылки а динамические. Причём, даже динамические ссылки можно инициализировать, и по идеи компилятор должен был это сделать, ан нет, он этого не сделал. Мало того, он даже не выдал ни одного предупреждения о том, что он этого не сделал, и сложилось ложное впечатление о работоспособности кода, хотя на самом деле это было не так.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Sep 8 2007, 11:14
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Beginning @ Sep 8 2007, 13:26)  Решающим оказывается определение массива ссылок. Не увидел ни одной ссылки (для справки - в С нет ссылок, они есть в С++). Решающим оказалось, что у вас получились инициализированные неконстантные указатели на константные объекты. Они инициализируются перед запуском функции main(). Если бы вы обдумали упомянутый намек, вы бы сделали массив константных указателей на константные объекты. И они бы были проинициализированны на этапе компиляции. Цитата(Beginning @ Sep 8 2007, 13:26)  и по идеи компилятор должен был это сделать, ан нет, он этого не сделал Не знаю кого затмевает, но у меня подобные конструкции работают как ожидается, и компилятор делает все, что от него хочу  Может он сделал именно то, что вы попросили, только вы этого не заметили?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 8 2007, 12:01
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Хорошо указатели. Так в том то и дело, что я хотел этого добится Цитата И они бы были проинициализированны на этапе компиляции. , и добился без посторонней помощи. Привожу пример. uint8 *const men0[] = { "1.Настройка времени "2222", "3333", "4444" }; Где то в функции ставлю следующую конструкцию. x=*men0[0]; Смотрю дебагер. x=*men0[0]; 00001A08 E59F0068 LDR R0, [PC, #+104] ;[0x1А78] =men0 (0x2978) 00001A0С E5000000 LDR R0, [R0, #+0] По адресу 0x1A78: 00001A78 00002978 По адресу 00002978 лежит строка. Так что, адрес 0x1A78 лежит совсем не в изменяемой области памяти, и является ни чем другим, как константой.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|