dxp 65 1 марта, 2006 Опубликовано 1 марта, 2006 · Жалоба Теперь новый вопрос. Если Вы не возражаете. Я хочу во флеш разместить несколько массивов. И масив указателей на эти массивы. Вот такое объявление будет правильным? Если нет, то как? 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[] = { .... }; Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей. Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 1 марта, 2006 Опубликовано 1 марта, 2006 · Жалоба Во-первых, const не нужен - __flash и так константнее некуда. :) Я обычно использовал вид А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 1 марта, 2006 Опубликовано 1 марта, 2006 · Жалоба Во-первых, const не нужен - __flash и так константнее некуда. :) Я обычно использовал вид А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR. В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы. Что касается стандартов, то они хороши для PC, а для embedded приложений с невероятным количеством особенностей целевых архитектур "приблуды" зачастую необходимы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 2 марта, 2006 Опубликовано 2 марта, 2006 · Жалоба Во-первых, 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. И ещё ряд вопросов у меня к нему :) Где скачать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 2 марта, 2006 Опубликовано 2 марта, 2006 · Жалоба Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки Уже писал про это на прошлой странице. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Balaganov 0 2 марта, 2006 Опубликовано 2 марта, 2006 · Жалоба void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13}; в левой части надобы ставиить 4, т.к. кол-во элементов массива = 4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 3 марта, 2006 Опубликовано 3 марта, 2006 · Жалоба Во-первых, const не нужен - __flash и так константнее некуда. :) Я обычно использовал вид А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR. В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы. Добавлю: либо разместит объекты, объявленные как const, в ОЗУ. А его мало и жалко его тратить под неизменяемые данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 3 марта, 2006 Опубликовано 3 марта, 2006 · Жалоба 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* действительно сложно обойтись и он оправдан. Но рассматриваемый случай совсем не этот. Я не очень понимаю, что Вы хотите иметь в конечном итоге, но учитывая, что эти массивы как-то используются в каких-то функциях, и принимая во внимание тот факт, что раз массивы разные, то и функции с ними работают разные, - реализовать работу с ними через массив указателей на функции. И ещё отдельный вопрос. При запуске мой компилятор указывает мне на отсутствие одного из файлов DLL. И ещё ряд вопросов у меня к нему :) Где скачать? На какую DLL? Никогда ничего подобного не встречал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 3 марта, 2006 Опубликовано 3 марта, 2006 · Жалоба отсутствует ...\avr\bin\nwtdavr.dll :) при этом проект компилится раза три-четыре. После чего указ. что-то о лицензии :) Ну я выхожу/вхожу и по новый. :) сам компилятор мне с таблеткой пришёл, но я и новую пробовал. Похоже в нём чего-то не хватает. Остановиться не могу, - к середине мая проект должен быть завершён. Пробую перейти на GCC. Но потом хочу вернуться и перекомпилить на IAR. А пока попробую найти где-нибудь ну и условную компиляцию чтоб на обоих, - не помешает. :) Потом сверю скорость и объём. По поводу ссылок. Несколько процедур будут однотипно обрабатывать эти массивы. Перед обработкой я явно указываю (определяю по размерности) тип массива и обрабатываю их. Если я сделаю так, то потом могу менять/добавлять новые массивы. (это массивы шрифтов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 3 марта, 2006 Опубликовано 3 марта, 2006 · Жалоба отсутствует ...\avr\bin\nwtdavr.dll :) Нету у меня такой дллки. Версия 4.12. И все без проблем работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
appsoft 0 3 марта, 2006 Опубликовано 3 марта, 2006 · Жалоба Сообщение об отсутствии nwtdavr.dll наблюдал в результате "лечения" IAR версии 3.20 под XP. Появляется при каждый раз при старте компилятора. По моим наблюдениям на работоспособность не влияет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 5 марта, 2006 Опубликовано 5 марта, 2006 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 5 марта, 2006 Опубликовано 5 марта, 2006 (изменено) · Жалоба KomG->Pict это уже сам по себе указатель т.е. значение KomG инкрементированнае на смещение Pict в структуре. Чтобы доступиться к элементу Pict[N] указатель смещается еще на N байт. А вы даете как аргумент адрес указателя. Изменено 5 марта, 2006 пользователем beer_warrior Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 5 марта, 2006 Опубликовано 5 марта, 2006 · Жалоба Пользуюсь книгой Шилдт"Полный справочник по С" 4-е изд. Задаю вопрос когда уже совсем .... Там указано: Чтобы с помощью указателя на структуру получить доступ к её членам, необходимо использовать оператор стрелка ->. После этого приводится пример. Где описана процедура void update(struct my_time *t) { // в принципе как у меня t->seconds++; // в данном случае инкрементируется значение а не адрес if (t->seconnds==60) { t->seconnds=0; // опять таки значение. Вероятнее всего я чего-то не понимаю. Давайте сначала. Итак объявлен указатель t на структуру my_time (предположем что сама структура тоже есть): struct my_time { int hours; int minutes; int seconds; } *t; То по книге чтобы инкрементировать значение секунд мне необходимо выполнить оператор t->seconds++; Т.е. чтобы передать секунды в подпрограмму "по значению" мне также необходимо передать "t->seconds" в списке параметров. А если я хочу передать адрес секунд т.е передать "по ссылке"? Я пытаюсь сделать это так &(t->seconds). Где в моих рассуждениях ошибка? Заранее благодарю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 5 марта, 2006 Опубликовано 5 марта, 2006 · Жалоба Так и нужно. Можно без скобок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться