Задачка для С-гуру

Здравствуйте, Уважаемый All!

Столкнулась в С с непреодолимой задачей инициализации переменых. Речь идет о создании списка из узлов диалога. Список известен заранее, его не надо формировать динамически, а требуется просто поиметь как список из констант, например во флэш. Раньше на макроассемблере эта задачка решалась в пять секунд.

RSEG FLASH_SEGMENT

Node1: dw Node2 ; это элемент Next db <......> ; тело узла #1 диалога

Node2: dw Node3 ; это элемент Next db <......> ; тело узла #2 диалога

;---и так далее

Макроассемблер двупроходный и поэтому ссылки из Node1 на Node2, который определяется ниже, нормально разрешаются. А теперь пытаемся изобразить то-же самое на С. Определяем структуры TNode и вводим как CONST ряд таких переменных с именами Node1 и Node2. При попытке произвести инициализацию полей этих структур, компилятор посылает нафиг, якобы Node2, на которую поставлена ссылка при инициализации Node1, не декларирована! Понимаю, что речь идет о идентификаторе, который появляется ниже по тексту. Пытаюсь намекнуть компилятору, что это EXTERN- он посылает, т.к. для CONST не бывает EXTERN. Все, цикл замкнулся. Hеужели мне придется отказаться от CONST и начальной инициализации списка? Hеужели придется обьявить все переменными и программно заполнять поля громадного списка? Прошу дать дельные рекомендации. А то мой энтузиазм в отношении Си начинает угасать. Ниже привожу фрагмент, который никак не удается реализовать, как список из констант.

Всего Вам Хорошего Ольга

struct TNode { const struct TNode * Up; const struct TNode * Down; const struct TNode * Left; const struct TNode * Right; };

const struct TNode Node1= (Node2,NULL,NULL,NULL}; //ошибка выдается здесь

const struct TNode Node2= {Node1,NULL,NULL,NULL}; // а здесь проходит нормально

Reply to
Olga Nonova
Loading thread data ...

Hello, Olga! You wrote to All on Fri, 30 Sep 2005 14:00:55 +0000 (UTC):

[skip]

ON> Все, цикл замкнулся. Hеужели мне придется отказаться от CONST и ON> начальной инициализации списка? Hеужели придется обьявить все ON> переменными и программно заполнять поля громадного списка? Прошу ON> дать дельные рекомендации. А то мой энтузиазм в отношении Си ON> начинает угасать. Ниже привожу фрагмент, который никак не удается ON> реализовать, как список из констант.

КГ/АМ.

WBR, AVB

Reply to
Alexey V Bugrov

Hello Olga.

Fri Sep 30 2005 18:00, Olga Nonova wrote to All:

ON> Макроассемблер двупроходный и поэтому ссылки из Node1 на Node2, который ON> определяется ниже, нормально разрешаются. А теперь пытаемся изобразить ON> то-же самое на С.

Хм, я всегда думал, что C тоже двупроходный... да, любопытно, как это сделать без извратов.

Hаверное, надо просто создавать таблицу не ссылок, а индексов. Она и места меньше займёт: байты вместо слов.

Dimmy.

Reply to
Dimmy Timchenko

Всем привет!

Olga Nonova писал к All Fri, 30 Sep 2005 14:00:55 +0000 (UTC):

ON> декларирована! Понимаю, что речь идет о идентификаторе, который ON> появляется ниже по тексту. Пытаюсь намекнуть компилятору, что это ON> EXTERN- он посылает, т.к. для CONST не бывает EXTERN. Все, цикл

Пользуйся нормальными компиляторами. Нет никаких противоречий между const и extern. И на IAR C твой пример прекрасно компилируется (после исправления ошибок с неправильными скобками и отсутствующими амперсандами и добавления extern const struct TNode Node2;)

Reply to
Askold Volkov

ON> Макроассемблер двупроходный и поэтому ссылки из Node1 на Node2, который ON> определяется ниже, нормально разрешаются. А теперь пытаемся изобразить ON> то-же

Такое разрешается и однопроходным ассемблером... Только C всегда требует предварительной декларации. Соответственно, что мешает это сделать?

ON> идентификаторе, который появляется ниже по тексту. Пытаюсь намекнуть ON> компилятору, что это EXTERN- он посылает, т.к. для CONST не бывает EXTERN.

Попытайтесь прочитать, для начала, следующее:

  1. Б. Керриган, Д. Ритчи, "Язык программирования C" 2. Б. Керниган, Р. Пайк, "Практика программирования" 3. Б. Керниган, Р. Пайк, "Программное окружение Unix"

Далее документацию к используемуему компилятору и обзаведитесь стандартом современного языка C.

Пример кода:

static struct node { struct node *next; int x; } node1, node2, node3;

static struct node node3 = {.next=&node1, .x=3}; static struct node node2 = {.next=&node3, .x=2}; static struct node node1 = {.next=&node2, .x=1};

Даёт такой результат:

.data .align 4 .type node3, @object .size node3, 8 node3: .long node1 .long 3 .align 4 .type node2, @object .size node2, 8 node2: .long node3 .long 2 .align 4 .type node1, @object .size node1, 8 node1: .long node2 .long 1

Reply to
Kirill Frolov

Hello Kirill.

Sat Oct 01 2005 13:29, Kirill Frolov wrote to Olga Nonova:

KF> Пример кода:

KF> static struct node { KF> struct node *next; KF> int x; KF> } node1, node2, node3;

KF> static struct node node3 = {.next=&node1, .x=3}; KF> static struct node node2 = {.next=&node3, .x=2}; KF> static struct node node1 = {.next=&node2, .x=1};

А разве первый оператор будет объявлением, а не определением?

Dimmy.

Reply to
Dimmy Timchenko

Здравствуйте, Уважаемый Askold!

Sat Oct 01 2005 07:52, Askold Volkov wrote to Olga Nonova:

AV> Пользуйся нормальными компиляторами. Hет никаких противоречий между const AV> и extern.

Да, тут я запуталась с непривычки.

AV> И на IAR C твой пример прекрасно компилируется (после AV> исправления ошибок с неправильными скобками и отсутствующими амперсандами AV> и добавления extern const struct TNode Node2;)

Спасибо за ценный совет. Я так и сделала, перед декларацией с инициализацией перечислила прототипы будущих структур с указанием extern. Все стало нормально компилироваться. Да, забыла сказать, что вьезжаю не в С, а в С++. И сейчас вижу, что правильнее было бы работать с классами, а не со структурами. Осмысляю.

Всего Вам Хорошего Ольга

Reply to
Olga Nonova

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.