Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Простые вопросы по IAR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
zltigo
Цитата(Beginning @ Sep 6 2007, 17:12) *
лучше бы попробовали сами.

Не буду я пробовать - оно работает и без моих проб smile.gif
Цитата
На конструкцию предложенною вами у компилятора вообще аллергия:
const uint8 dd[4][]{ {1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4} };

Обратите свой ясный взор на мой пост и на то, что Вы здесь нагородили и найдите два отличия
1. Нет явного указания для размерности многомерного массива;
2. Компилятору не по барабану отсутствие оператора присвоения.
Цитата
Я к стати эту конструкцию пробывал, ещё до обсуждения.

Ага smile.gif, два раза.
Цитата
Какой же это правильный компилятор, если не по ANSI C делает.

K&R это не ANSI С и не C99
Сергей Борщ
Цитата(Beginning @ Sep 6 2007, 17:12) *
Какой же это правильный компилятор, если не по ANSI C делает.

Я к стати эту конструкцию пробывал, ещё до обсуждения.
А что, ANSI C позволяет круглые скобки в этом месте вместо угловых?

Попробуйте добавить в начале файла #include <stdint.h>, заменить uint8 на uint8_t и добавить "равно"

На всякий случай - "стилем K&R" называется изложенный в первом издании их книги стиль. Если у вас первое издание - скачайте второе, оно уже про ANSI C.
Beginning
Присвоение недоглядел, разумеется в программе равно стояло. А число не ставил, т.к. при инициализации массива считал, что оно определяется автоматически.
jorikdima
терпиливые у нас гуру smile.gif
Beginning
На то они и гуру. a14.gif
Beginning
Создаю массив ссылок на строки:
const uint8 *men0[]=
{
"Пункт 1",
"Пункт 2”,
“Пункт 3”
};

Затем вызываю функцию:

menu_(x,men0);

Функция типа:

void menu_(uint8 x, const uint8 **t)

В ней вызываю функцию печати:

lcd_puts(t[x]);

Компилится без ошибок. Но почему то, в lcd_puts не передаётся ссылка на строки, и печатается всякая хрень wacko.gif . В CodeVision это работало нормально.
zltigo
Цитата(Beginning @ Sep 6 2007, 22:51) *
Но почему то, в lcd_puts не передаётся ссылка на строки

передаются, передаются - не надо диагнозы из пальца высасывать и рефреном повторять
глупости:
Цитата
В CodeVision это работало нормально.

Когда даже в элементарной набивке текста опечатка на опечатке (можете поискать три неправильных кавычки в своем примере).
Цитата
, и печатается всякая хрень wacko.gif .

Да ну? А Вы полагали, что русские литеры в Win кодировке на LCD должны смотреться как-то иначе?

P.S.
И не обзывайте все подряд uint8 - строки есть строки и char это не всегда uint8.
P.P.S.
И const используйте в "естественном" для 'C' порядке с права на лево
и не накладывайте дополнительных ненужных восьмибитовых ограничений на переменные - компилятору не придется городить ненужный код.
void menu_( int x, char const * const *t )
Beginning
Ну вы прям меня вообще за идиота считаете.
Цитата
Да ну? А Вы полагали, что руссие литеры в 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.
zltigo
Цитата(Beginning @ Sep 7 2007, 10:02) *
Ничего я не высасывал из пальца, я выводил данные на терминал и...

Не знаю куда смотрели, что видели и как увиденное поняли, но для начала просто написать несколько строк без грубых ошибок просто не можете sad.gif
Цитата
...если вы страждете получить полный исходник то получите:

Упаси бог! Зачем он мне? Прочитал первые срочки "полного исходника":
Код
const uint8 *men0[]=
{
"1.Пункт 1",
"2.Пункт 2
"3.Пункт 3"
};

Лучше не стало. Опять ошибка на ошибке - запятые, кавычки, это все типа мелочи. Дальше просто читать не стал. Какой смысл рассуждать о чем-то если компилируют одно, постят другое а думают третье....
Кроме того, повторяю, в приведенном ранее тексте формально все в полном порядке (если не обращать внимания на уже обычные ляпы)
Цитата
Uint8 это макрос unsigned char.

Макрос??? Ну хоть typedef сделайте....
Догадался, только какого лешего его применять для сокрытия естественного типа.

P.S.
В общем я, пожалуй, завязываю.
Beginning
"2.Пункт 2

Коментарии удалял и удалил лишку. Если вы такой умный моглибы и необращать внимание. А то, что по ссылки валится не те данные которые в строке записанны-это факт.
Повторяю ещё раз. Никого не заставляю мне отвечать. Не хотите не надо.

Цитата
Не знаю куда смотрели, что видели и как увиденное поняли, но для начала просто написать несколько строк без грубых ошибок просто не можете


Выводил в COM PORT на terminal. А так, как терминал отображает символы в определённой кодировке, то параллельно перехватывал работу с портом PORTMONITOR утилитой, и просматривал все значения в hex.

Цитата
Догадался, только какого лешего его применять для сокрытия естественного типа.


А что бы не писать каждый раз UNSIGNED CHAR. (и не говорите что по умалчанию, лучше явно указать, чем при переносе кода в другие места глюки ловить)

не вижу принципиальной разницы между:

typedef unsigned char uint8;

и

#define uint8 unsigned char
Сергей Борщ
Цитата(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. Ну а я пока тоже завязываю - с таким апломбом вы и сами разберетесь.
zltigo
Ладно, на прощание 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 *  // Дурной стиль без всякой на то надобности да и еще с побочными эффектами

Даже, если Вы "не увидите принципиальной разницы", то смею Вас заверить, что разница есть и фатальная. Никогда не делайте чего-либо через заднепроходное отверстие, если есть прямые пути.
Beginning
За...ца - универсальный интерфейс, через него можно делать всё, что угодно. © biggrin.gif

*ad – ссылка,
bd – char.
Угадал?
Beginning
Вообщем попотел, но с траблом разобрался. Короче проделал следующие эксперементы:

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"
};
Сергей Борщ
Цитата(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 )
Beginning
Вас затмило ваше сияние и это вы нечего не поняли biggrin.gif . Как раз то, способ передать параметр в функцию ничего не решает. Я использую вот такой: и с ним всё работает:

uint8 menu_(unsigned char *const*t);

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

Насколько я понял ситуацию, в тех случаях когда код не работал, компилятор создавал не статические ссылки а динамические. Причём, даже динамические ссылки можно инициализировать, и по идеи компилятор должен был это сделать, ан нет, он этого не сделал. Мало того, он даже не выдал ни одного предупреждения о том, что он этого не сделал, и сложилось ложное впечатление о работоспособности кода, хотя на самом деле это было не так.
zltigo
Цитата(Beginning @ Sep 8 2007, 13:26) *
Вас затмило ваше сияние и это вы нечего не поняли...

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

, и добился без посторонней помощи. Привожу пример.

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 лежит совсем не в изменяемой области памяти, и является ни чем другим, как константой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.