Перейти к содержанию
    

Теперь новый вопрос. Если Вы не возражаете.

Я хочу во флеш разместить несколько массивов. И масив указателей на эти массивы. Вот такое объявление будет правильным? Если нет, то как?

 

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[] = { .... };

 

Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей.

 

Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, const не нужен - __flash и так константнее некуда. :) Я обычно использовал вид

 

А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, const не нужен - __flash и так константнее некуда. :) Я обычно использовал вид

 

А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR.

В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы.

Что касается стандартов, то они хороши для PC, а для embedded приложений с невероятным количеством особенностей целевых архитектур "приблуды" зачастую необходимы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, const не нужен - __flash и так константнее некуда. :) Я обычно использовал вид

 

__flash byte Array[] = { .... };

 

Оператор разименовывания ('*') при объявлении массива писать не надо, если только не хотите объявить массив указателей.

 

Вообще, я понял, что Вам надо типа двумерного массива - ну так и объявите явно массив массивов, зачем эти финты с адресами? И памяти меньше скушает.

 

Спецы как всегда зрят в корень! :biggrin: Их не обманешь. Уточню картину. :) С учётом Ваших поправок.

 

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. И ещё ряд вопросов у меня к нему :)

Где скачать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во вторых если я хотел сделать массив указателей правильно ли я объявил их ( &...) . Компилятор не выдал мне ошибки

Уже писал про это на прошлой странице.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void __flash *symbol[3] = {&fnt0_6x8,&fnt1_8x8,&fnt2_10x10,&fnt3_11x13};

 

 

в левой части надобы ставиить 4, т.к. кол-во элементов массива = 4.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, const не нужен - __flash и так константнее некуда. :) Я обычно использовал вид

 

А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR.

В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы.

Добавлю: либо разместит объекты, объявленные как const, в ОЗУ. А его мало и жалко его тратить под неизменяемые данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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? Никогда ничего подобного не встречал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

отсутствует ...\avr\bin\nwtdavr.dll :)

при этом проект компилится раза три-четыре. После чего указ. что-то о лицензии :)

Ну я выхожу/вхожу и по новый. :) сам компилятор мне с таблеткой пришёл, но я и новую пробовал. Похоже в нём чего-то не хватает.

Остановиться не могу, - к середине мая проект должен быть завершён. Пробую перейти на GCC. Но потом хочу вернуться и перекомпилить на IAR. А пока попробую найти где-нибудь ну и условную компиляцию чтоб на обоих, - не помешает. :) Потом сверю скорость и объём.

 

По поводу ссылок. Несколько процедур будут однотипно обрабатывать эти массивы. Перед обработкой я явно указываю (определяю по размерности) тип массива и обрабатываю их. Если я сделаю так, то потом могу менять/добавлять новые массивы. (это массивы шрифтов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

отсутствует ...\avr\bin\nwtdavr.dll :)

Нету у меня такой дллки. Версия 4.12. И все без проблем работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сообщение об отсутствии nwtdavr.dll наблюдал в результате "лечения" IAR версии 3.20 под XP. Появляется при каждый раз при старте компилятора. По моим наблюдениям на работоспособность не влияет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

KomG->Pict это уже сам по себе указатель т.е. значение KomG инкрементированнае на смещение Pict в структуре.

Чтобы доступиться к элементу Pict[N] указатель смещается еще на N байт.

А вы даете как аргумент адрес указателя.

Изменено пользователем beer_warrior

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пользуюсь книгой Шилдт"Полный справочник по С" 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).

 

Где в моих рассуждениях ошибка?

Заранее благодарю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...