Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Микроконтроллеры
Перезагрузить страницу Как правильно спрограммировать массив
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
vka vka вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.11.2005
По умолчанию Как правильно спрограммировать массив - 07.09.2009, 12:54

программа для AVR
есть массив, есть указатель на массив, при сылки укозателя на массив компилятор выдает недествительное выражение.
возможно в си для микроконтроллеров такая структура неправельно

Код:
unsigned char *adres2;
flash char lcb1[] = {"reshim"};  //массивов будет много (строчные)
adres2 = &lcb1[];   //здесь ошибка

void indi (void) {  //выводим на ЖК

lcd_gotoxy(0,0);                                            //верхняя строка
sprintf (lcd_biffer,"razrad %i %i",*adres1,*adre2);
lcd_puts (lcd_biffer);

lcd_gotoxy(0,1);                                            //нижняя строка
sprintf (lcd_biffer,"razrad %i %i",*adres1,*adres2);
lcd_puts (lcd_biffer);
}
может кто подскажет как создать и обратится к строчному массиву из нескольких слов а главное как сформировать обращение к каждому слову и вывести это слово на ЖК, причем несколько слов из массива в зависимости от структуры программы (тоесть каждое слово вычисляется специальным алгоритмом) вследствии чего получается опредиленное выражение на экране
Ответить с цитированием
  (#2 (permalink)) Старый
night-stels night-stels вне форума
Member
 
Сообщений: 440
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.08.2008
По умолчанию 07.09.2009, 17:20

Массив это и есть указатель. и у него соответственно есть адрес, указывающий на первый (нулевой) элемент.
Так что можно сделать так:

Код:
unsigned char *adres2;
flash char lcb1[] = {"reshim"};  //массивов будет много (строчные)
adres2 = lcb1;
Или так: (явно присвоить указателю значение адреса первого(нулевого) элемента массива )

Код:
unsigned char *adres2;
flash char lcb1[] = {"reshim"};  //массивов будет много (строчные)
adres2 = &lcb1[0];
Ответить с цитированием
  (#3 (permalink)) Старый
vka vka вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.11.2005
По умолчанию 09.09.2009, 10:59

Цитата:
Массив это и есть указатель. и у него соответственно есть адрес, указывающий на первый (нулевой) элемент.
Так что можно сделать так:

Код:
unsigned char *adres2;
flash char lcb1[] = {"reshim"};  //массивов будет много (строчные)
adres2 = &lcb1[0];

втом то и дело
компилятор выдает ошибку так как указатель присваивается к массиву во flash памяти,
почитав документацию - нужно организовать копирование из flash в SRAM но тут опять оказалась засада после кипирования

char flash *adres3;

while(*adres3) {*adres2++=*adres3++;} //копирование из flash в SRAM
*adres2=*adres3; //копируем нулевой символ '/0'

на ЖК выводится не массив а какаето дребедень
Ответить с цитированием
  (#4 (permalink)) Старый
deckard deckard вне форума
Member
 
Сообщений: 77
Сказал(а) спасибо: 0
Поблагодарили 5 раз(а) в 5 сообщениях
Регистрация: 04.03.2008
По умолчанию 10.09.2009, 09:44

1. Смотреть стандартную функцию sprintf Возражения типа "не влезает в ПЗУ" не принимаются.
2. Не использовать предложенный "метод упаковки". Выводить текст как есть. Надо реально
попробовать вычислить - сколько таким образом байт "экономится". - 100-200 ? Тогда как
"программа-распаковщик" может занять килобайты (не верите ? А мы предупредили).
3. Не надо использовать выражения типа *указатель++= и т д Присвоение отдельно,
а инкремент - отдельно. Мало того, что таки выражения люди могут понять неверно.
Их еще и компилятор может понять либо неверно, либо скомпилировать более длинный код
(обязательно проверьте ассемблерный листинг).
Ответить с цитированием
  (#5 (permalink)) Старый
vka vka вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.11.2005
По умолчанию 14.09.2009, 18:09

int znak=2;
int znak1=77;

char *adres2;
char *adres3;

//void regim_ustavka (void);
//void inicializacia(void);

flash char lcd1[] = {"osn"}; //тоже рамещение во флеш
flash char lcd2[] = {" menu"};
flash char lcd3[] = {" rabota"};
//flash char lcd4[] = {"nastoika"};
//массив будет очень большой

void indi (void) { //выводим инфомацию на экран LCD

lcd_gotoxy(0,0); //верхняя строка
sprintf(lcd_biffer,"r=%-s %-s",*adres2,*adres3);
lcd_puts (lcd_biffer);

lcd_gotoxy(0,1); //нижняя строка
sprintf(lcd_biffer,"j=%s %i %i",*adres2,znak,znak1); //%s-слово sram, %i-число,
lcd_puts (lcd_biffer); //n-перенос строки
}


void main (void) {
inicializacia();

strcpyf(adres2,lcd2); //функция копирует сроку из flash в sdram
strcpyf(adres3,lcd3); //в библиотеке "string.h"

while(1){
indi ();
}
}

После нескольких мытарств исползовал стандартную функцию копирования и вроде как все нормально без ошибок компилируется
но в симуляторе на ЖК какаето каша выходит
то вобще теряет слова,
весь смысл этой затеи в очень большом массиве и разместить его в SDRAM неполучится, flash вполне подходит но при копировании что то не так
симулятор использую ПРОТЭУС 7.4 SP3
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
deckard deckard вне форума
Member
 
Сообщений: 77
Сказал(а) спасибо: 0
Поблагодарили 5 раз(а) в 5 сообщениях
Регистрация: 04.03.2008
По умолчанию 16.09.2009, 20:39

Цитата:
char *adres2;
char *adres3;

// ....
flash char lcd1[] = {"osn"}; //тоже рамещение во флеш
flash char lcd2[] = {" menu"};
flash char lcd3[] = {" rabota"};

// ...
strcpyf(adres2,lcd2); //функция копирует сроку из flash в sdram ???
strcpyf(adres3,lcd3); //в библиотеке "string.h" ???
В таком виде это никуда не копируется, или копируется на адрес 0
(Null pointer assignment)
Где присвоение указателей adres2, adres3 ?
Или это будут буферы ? Какой длины ?
Например так можно:

ююю тип памяти ююю char adres2[17];

То же касается буфера дисплея lcd_biffer - он где объявлен и какой длины (и вообще обычно пишут buffer)?

Вообще какой именно компилятор AVR ? (Но в любом случае см документацию по указателям)








Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись координат в массив в реал тайм, Как записать координаты в массив Dark19 С/С++ 2 21.06.2011 23:03
Запись координат в массив в реал тайм, Как записать координаты в массив Dark19 Программирование графики 0 21.06.2011 14:46
Одномерный массив как правильно с ним работать Саломон Pascal 0 15.06.2011 15:24
Как спрограммировать процедуру заполнения телефонного номера volkodaw Pascal 1 01.06.2011 17:33
Как правильно подключить 3х HDD обьеденив их в RAID массив? kest Любые вопросы от новичков 1 29.03.2011 09:41
Требуется отсортировать двумерный массив. Как это правильно сделать? Djo Weimar Любые вопросы от новичков 0 23.03.2010 15:30
Как правильно создать и заполнить двумерный строковый массив blaze C++ Builder 11 28.06.2007 10:36
Как правильно сжать массив xander-007 Pascal 9 09.01.2006 17:22
Как правильно записать массив в .txt в VFP Nikolay Вопросы начинающих программистов 0 16.11.2004 20:17
Как спрограммировать GINA в С++ Vladimir the Red Sunny Visual C++ 2 06.10.2004 01:37
Вектор-массив как правильно его объявлять tumanovalex С/С++ 1 21.05.2004 20:26



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов