реклама на сайте
подробности

 
 
7 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Новичок на С, Помогите разобраться со структурой проекта
dxp
сообщение Mar 1 2006, 14:04
Сообщение #31


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 и так константнее некуда. smile.gif Я обычно использовал вид

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

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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 1 2006, 18:26
Сообщение #32


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(dxp @ Mar 1 2006, 16:04) *
Во-первых, const не нужен - __flash и так константнее некуда. smile.gif Я обычно использовал вид


А почему в таком случае нельзя просто const использовать, все-таки const это из стандарта ansi-c, а __flesh всего-лишь приблуда от IAR.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 1 2006, 18:33
Сообщение #33


Шаман
******

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



Цитата(defunct @ Mar 1 2006, 20:26) *
Цитата(dxp @ Mar 1 2006, 16:04) *

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


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

В этом случае компилятор\линкер могут потребовать внешней ROM, где и будут храниться Ваши константы.
Что касается стандартов, то они хороши для PC, а для embedded приложений с невероятным количеством особенностей целевых архитектур "приблуды" зачастую необходимы.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 2 2006, 18:13
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(dxp @ Mar 1 2006, 18:04) *
Во-первых, const не нужен - __flash и так константнее некуда. smile.gif Я обычно использовал вид

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

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

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


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

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. И ещё ряд вопросов у меня к нему smile.gif
Где скачать?
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 2 2006, 18:19
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



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

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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Balaganov
сообщение Mar 2 2006, 20:48
Сообщение #36


Участник
*

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 3 2006, 05:30
Сообщение #37


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 и так константнее некуда. smile.gif Я обычно использовал вид


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

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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 3 2006, 05:43
Сообщение #38


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* - это Вы обманули компилятор (и себя тоже smile.gif ). Этим самым Вы отключили контроль типов со стороны компилятора и взяли всю ответственность за правильность работы на себя. Компилятор тут "умыл руки". Не советую так делать. Вообще, найдется очень немного случаев, когда без void* действительно сложно обойтись и он оправдан. Но рассматриваемый случай совсем не этот.

Я не очень понимаю, что Вы хотите иметь в конечном итоге, но учитывая, что эти массивы как-то используются в каких-то функциях, и принимая во внимание тот факт, что раз массивы разные, то и функции с ними работают разные, - реализовать работу с ними через массив указателей на функции.

Цитата(SasaVitebsk @ Mar 3 2006, 00:13) *
И ещё отдельный вопрос. При запуске мой компилятор указывает мне на отсутствие одного из файлов DLL. И ещё ряд вопросов у меня к нему smile.gif
Где скачать?

На какую DLL? Никогда ничего подобного не встречал.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 3 2006, 09:53
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



отсутствует ...\avr\bin\nwtdavr.dll smile.gif
при этом проект компилится раза три-четыре. После чего указ. что-то о лицензии smile.gif
Ну я выхожу/вхожу и по новый. smile.gif сам компилятор мне с таблеткой пришёл, но я и новую пробовал. Похоже в нём чего-то не хватает.
Остановиться не могу, - к середине мая проект должен быть завершён. Пробую перейти на GCC. Но потом хочу вернуться и перекомпилить на IAR. А пока попробую найти где-нибудь ну и условную компиляцию чтоб на обоих, - не помешает. smile.gif Потом сверю скорость и объём.

По поводу ссылок. Несколько процедур будут однотипно обрабатывать эти массивы. Перед обработкой я явно указываю (определяю по размерности) тип массива и обрабатываю их. Если я сделаю так, то потом могу менять/добавлять новые массивы. (это массивы шрифтов).
Go to the top of the page
 
+Quote Post
dxp
сообщение Mar 3 2006, 10:57
Сообщение #40


Adept
******

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



Цитата(SasaVitebsk @ Mar 3 2006, 15:53) *
отсутствует ...\avr\bin\nwtdavr.dll smile.gif

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
appsoft
сообщение Mar 3 2006, 11:10
Сообщение #41


Участник
*

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



Сообщение об отсутствии nwtdavr.dll наблюдал в результате "лечения" IAR версии 3.20 под XP. Появляется при каждый раз при старте компилятора. По моим наблюдениям на работоспособность не влияет.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 5 2006, 16:22
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 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". Даже если он этот топик и не увидит. smile.gif

Вот теперь не то чтобы понятно, но чуть-чуть приблизился к пониманию. А ведь знающие люди месяц назад писали. Вот баран самоуверенный. Теперь более 500 строк текста перелопачиваю! smile.gif

Ещё вопрос. Хочу в подпрограмму передать ссылку. Это массив расположенный в структуре. На неё имеется указатель. Т.е. к самому массиву я обращаюсь 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
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2006, 17:28
Сообщение #43


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



KomG->Pict это уже сам по себе указатель т.е. значение KomG инкрементированнае на смещение Pict в структуре.
Чтобы доступиться к элементу Pict[N] указатель смещается еще на N байт.
А вы даете как аргумент адрес указателя.

Сообщение отредактировал beer_warrior - Mar 5 2006, 17:30


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 5 2006, 21:23
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



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

Где в моих рассуждениях ошибка?
Заранее благодарю.
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 5 2006, 21:49
Сообщение #45


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Так и нужно. Можно без скобок.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

7 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016