|
|
  |
Новичок на С, Помогите разобраться со структурой проекта |
|
|
|
Mar 1 2006, 14:04
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(SasaVitebsk @ Mar 1 2006, 17:07)  Теперь новый вопрос. Если Вы не возражаете. Я хочу во флеш разместить несколько массивов. И масив указателей на эти массивы. Вот такое объявление будет правильным? Если нет, то как?
const byte __flash fnt0_6x8[224] = { .... }; const byte __flash fnt1_8x8[224] = { .... }; const word __flash fnt3_10x10[224] = { .... }; const word __flash fnt3_11x13[224] = { .... };
const void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13}; Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид __flash byte Array[] = { .... }; Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей. Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 1 2006, 18:33
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(defunct @ Mar 1 2006, 20:26)  Цитата(dxp @ Mar 1 2006, 16:04)  Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR. В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы. Что касается стандартов, то они хороши для PC, а для embedded приложений с невероятным количеством особенностей целевых архитектур "приблуды" зачастую необходимы.
|
|
|
|
|
Mar 2 2006, 18:13
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(dxp @ Mar 1 2006, 18:04)  Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид __flash byte Array[] = { .... }; Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей. Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает. Спецы как всегда зрят в корень!  Их не обманешь. Уточню картину.  С учётом Ваших поправок. byte __flash fnt0_6x8[224][8] = { .... }; byte __flash fnt1_8x8[224][8] = { .... }; word __flash fnt3_10x10[224][10] = { .... }; word __flash fnt3_11x13[224][13] = { .... }; void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13}; Я действительно хотел сделать массив ссылок, потому как масивы во первых два байтовых и два словных, а во вторых имеют разные размеры. Я не знаю как их объединить в один массив обычный. Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки И ещё отдельный вопрос. При запуске мой компилятор указывает мне на отсутствие одного из файлов DLL. И ещё ряд вопросов у меня к нему  Где скачать?
|
|
|
|
|
Mar 2 2006, 18:19
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки Уже писал про это на прошлой странице.
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Mar 2 2006, 20:48
|
Участник

Группа: Свой
Сообщений: 41
Регистрация: 16-02-05
Пользователь №: 2 688

|
Цитата(SasaVitebsk @ Mar 2 2006, 20:13)  void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13}; в левой части надобы ставиить 4, т.к. кол-во элементов массива = 4.
|
|
|
|
|
Mar 3 2006, 05:30
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(IgorKossak @ Mar 2 2006, 00:33)  Цитата(defunct @ Mar 1 2006, 20:26)  Цитата(dxp @ Mar 1 2006, 16:04)  Во-первых, const не нужен - __flash и так константнее некуда.  Я обычно использовал вид А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR. В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы. Добавлю: либо разместит объекты, объявленные как const, в ОЗУ. А его мало и жалко его тратить под неизменяемые данные.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 3 2006, 05:43
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(SasaVitebsk @ Mar 3 2006, 00:13)  byte __flash fnt0_6x8[224][8] = { .... }; byte __flash fnt1_8x8[224][8] = { .... }; word __flash fnt3_10x10[224][10] = { .... }; word __flash fnt3_11x13[224][13] = { .... };
void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13};
Я действительно хотел сделать массив ссылок, потому как масивы во первых два байтовых и два словных, а во вторых имеют разные размеры. Я не знаю как их объединить в один массив обычный. Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки Если массивы имеют разные размеры, то сделать их элементами массива не получится. Массив - это агрегатный тип, состоящий из элементов одинкового типа. Такие массивы можно сложить в структуру, т.к. структура - это агрегатный тип, который может содержать элементы разных типов. Правда, структура не имеет полезного свойства массивов - возможности обращения по индексу. Сделать массив указателей на разные типы тоже нельзя, указатели на разные типы - сами по себе являются разными типами и не могут быть элементами массива. То, что Вы сделали - завели массив указателй void* - это Вы обманули компилятор (и себя тоже  ). Этим самым Вы отключили контроль типов со стороны компилятора и взяли всю ответственность за правильность работы на себя. Компилятор тут "умыл руки". Не советую так делать. Вообще, найдется очень немного случаев, когда без void* действительно сложно обойтись и он оправдан. Но рассматриваемый случай совсем не этот. Я не очень понимаю, что Вы хотите иметь в конечном итоге, но учитывая, что эти массивы как-то используются в каких-то функциях, и принимая во внимание тот факт, что раз массивы разные, то и функции с ними работают разные, - реализовать работу с ними через массив указателей на функции. Цитата(SasaVitebsk @ Mar 3 2006, 00:13)  И ещё отдельный вопрос. При запуске мой компилятор указывает мне на отсутствие одного из файлов DLL. И ещё ряд вопросов у меня к нему  Где скачать? На какую DLL? Никогда ничего подобного не встречал.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 3 2006, 11:10
|
Участник

Группа: Свой
Сообщений: 22
Регистрация: 9-12-04
Пользователь №: 1 425

|
Сообщение об отсутствии nwtdavr.dll наблюдал в результате "лечения" IAR версии 3.20 под XP. Появляется при каждый раз при старте компилятора. По моим наблюдениям на работоспособность не влияет.
|
|
|
|
|
Mar 5 2006, 16:22
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(SasaVitebsk @ Feb 14 2006, 23:40)  Цитата(vet @ Feb 14 2006, 10:28)  2) Это пишется так: tip1->TimeLife--;
Это как раз понятно. А объявление я правильно сделал или правильнее как в коментарии? Компилятор при таком объявлении займёт память или нет и как это посмотреть? Передаю привет "vet". Даже если он этот топик и не увидит. Вот теперь не то чтобы понятно, но чуть-чуть приблизился к пониманию. А ведь знающие люди месяц назад писали. Вот баран самоуверенный. Теперь более 500 строк текста перелопачиваю!  Ещё вопрос. Хочу в подпрограмму передать ссылку. Это массив расположенный в структуре. На неё имеется указатель. Т.е. к самому массиву я обращаюсь KomG->Pict, а адрес пытаюсь передать типа &(KomG->Pict). Объявление следующее: struct AddrKomG { byte Name; // Èìÿ êîìàíäû word TimeStart; // Âðåìÿ íà÷àëà èñïîëíåíèÿ êîìàíäû byte TimeMashtabTek, // Òåêóùåå çíà÷åíèå ìàñøòàáà äëÿ âðåìåíè èñïîëíåíèÿ TimeMashtab; // Ìàñøòàá äëÿ âðåìåíè èñïîëíåíèÿ word TimeLife; // Âðåìÿ èñïîëíåíèÿ êîìàíäû ñ ó÷¸òîì ìàñøòàáà int BegX,BegY; // Íà÷àëî îáúåêòà (X,Y) signed char VecX,VecY; // âåêòîð ïåðåìåùåíèÿ îáúåêòà (X,Y) word SizeX,SizeY; // Ðàçìåð êàðòèíêè (X,Y) byte Pict[10]; // Êàðòèíêà } *KomG; а объявление функции следующее void OutPict(int X,int Y,int sx,int sy,byte *Pict) Компилятор ругается типа Error[Pe167]: argument of type "byte (*)[10]" is incompatible with parameter of type "byte *" E:\work\AVR IAR C\Panno\office.c 232
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|