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

Sep 30, 2005 6 Replies

Здравствуйте, Уважаемый 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}; // а здесь проходит нормально


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

Hello Olga.

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

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

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

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

Dimmy.

Всем привет!

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;)

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

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.

Здравствуйте, Уважаемый 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. Все стало нормально компилироваться. Да, забыла сказать, что вьезжаю не в С, а в С++. И сейчас вижу, что правильнее было бы работать с классами, а не со структурами. Осмысляю.

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required