|
|
  |
Простые вопросы по IAR |
|
|
|
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
|
|
|