реклама на сайте
подробности

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> Простые вопросы по IAR
Сергей Борщ
сообщение Sep 7 2007, 10:59
Сообщение #61


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 7 2007, 12:35
Сообщение #62


Гуру
******

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



Ладно, на прощание smile.gif.
Цитата(Beginning @ Sep 7 2007, 11:32) *
А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить)

Вот что-бы глюки "не ловить" и не переопределяйте тип естественный для символьных строк и кучи библиотечных функций с ними работающих.
Цитата
не вижу принципиальной разницы между:
typedef unsigned char uint8;
и
#define uint8 unsigned char

Насколько я мог заметить Вам вообще многое, что без разницы sad.gif, но это не есть объестивная реальность. #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
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 7 2007, 14:13
Сообщение #63


Знающий
****

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



За...ца - универсальный интерфейс, через него можно делать всё, что угодно. © biggrin.gif

*ad – ссылка,
bd – char.
Угадал?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 7 2007, 21:46
Сообщение #64


Знающий
****

Группа: Свой
Сообщений: 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"
};


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 8 2007, 07:50
Сообщение #65


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 8 2007, 10:26
Сообщение #66


Знающий
****

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



Вас затмило ваше сияние и это вы нечего не поняли biggrin.gif . Как раз то, способ передать параметр в функцию ничего не решает. Я использую вот такой: и с ним всё работает:

uint8 menu_(unsigned char *const*t);

Решающим оказывается определение массива ссылок.

Насколько я понял ситуацию, в тех случаях когда код не работал, компилятор создавал не статические ссылки а динамические. Причём, даже динамические ссылки можно инициализировать, и по идеи компилятор должен был это сделать, ан нет, он этого не сделал. Мало того, он даже не выдал ни одного предупреждения о том, что он этого не сделал, и сложилось ложное впечатление о работоспособности кода, хотя на самом деле это было не так.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 8 2007, 10:44
Сообщение #67


Гуру
******

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



Цитата(Beginning @ Sep 8 2007, 13:26) *
Вас затмило ваше сияние и это вы нечего не поняли...

smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 8 2007, 11:14
Сообщение #68


Гуру
******

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



Цитата(Beginning @ Sep 8 2007, 13:26) *
Решающим оказывается определение массива ссылок.
Не увидел ни одной ссылки (для справки - в С нет ссылок, они есть в С++). Решающим оказалось, что у вас получились инициализированные неконстантные указатели на константные объекты. Они инициализируются перед запуском функции main(). Если бы вы обдумали упомянутый намек, вы бы сделали массив константных указателей на константные объекты. И они бы были проинициализированны на этапе компиляции.
Цитата(Beginning @ Sep 8 2007, 13:26) *
и по идеи компилятор должен был это сделать, ан нет, он этого не сделал
Не знаю кого затмевает, но у меня подобные конструкции работают как ожидается, и компилятор делает все, что от него хочу 08.gif Может он сделал именно то, что вы попросили, только вы этого не заметили?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Beginning
сообщение Sep 8 2007, 12:01
Сообщение #69


Знающий
****

Группа: Свой
Сообщений: 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 лежит совсем не в изменяемой области памяти, и является ни чем другим, как константой.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post

5 страниц V  « < 3 4 5
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01457 секунд с 7
ELECTRONIX ©2004-2016