Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Индексиранена масиви от указатели към стрингове във функция
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=2967
Страница 1 от 1

Автор:  asp [ Чет Сеп 28, 2006 2:09 pm ]
Заглавие:  Индексиранена масиви от указатели към стрингове във функция

Здравейте, имам С проблем.
Значи имам масиви от указатели към стрингове.

code volatile char *Mstart[4]=
{
" ааа ",
" ббб ",
" ццц ",
"SW ver. test c2005 "
};
code volatile char *Mselect[8]=
{
" ааа ",
" ббб ",
" ццц ",
" ддд ",
" ABOUT ",
" FREE ",
" FREE ",
" FREE "
};

Искам да индексирам масива във функция и така да подавам указателя на драйвера за дисплея. С това което ползвам не става защото индексирам char.
for( i=0;i<4;i++) //display strings
{
GotoYX( (i+1),(minfo->cursor+1) ); // дисплеят е 4 редов
p =((minfo->p) +( (minfo->Displ<<2) + i )) ;
ZobrazString( p );
}

minfo->p сочи първият символ от масива т.е. за Mstart[4] сочи указателят записан в Mstart[0].
minfo->p е char указател
i +( (minfo->Displ<<2) индексират но индексират байт по байт а аз искам да ида на следващия указател за да изобразя следващият ред.

В момента на 4 те реда на дисплея се изобразява само 1 стринг като всеки следващ ред започва с 1 символ по малко / по навътре /.

Пример:
ааа
аа
а

Ако някои успее да схване / не знам добре ли го обяснявам/ кво ме тормози да се изкаже.

Автор:  the_real_maniac [ Чет Сеп 28, 2006 2:30 pm ]
Заглавие: 

Ммм защо не дадеш и дефинирането на самият масив ?

А иначе на бързо само може да си изпуснал/забравил/не знаеш, че когато индексираш масив посредством указател, т.е

char array[10][3];
char *p;

p = array;

Индексирането чрез p става чрез умножаване N-ти елемент , дължина/големина на елемент ...

Но в твоят случей виждам , че имаш различни дължини , а не ползваш МАХ винаги , та ще трябва може би и едно strlen преди това или константи , ако знаеш какви точно са ти стринговете и прочие :-) за дължината.

едит: еййй - да, никола е прав.
Така е опита си е опит и като не ползваш нещо го забравяш ( леко ) :-)

Автор:  Nikola Kirov [ Чет Сеп 28, 2006 2:31 pm ]
Заглавие: 

Прави се с указател към указател

char ** pp = &Mstart[0];

след което
*pp ти е указател към първия елемент на Mstart

след p++ *pp ще е указател към втория елемент на Mstart


Надявам се да ти станало ясно как става


а за твоята реализация няма как да извадиш следващия стринг от minfo->p след като ти е укзаател към char.

Автор:  Реконструктор [ Чет Сеп 28, 2006 3:43 pm ]
Заглавие: 

code volatile char Mstart[4][20]=
{
" ааа ",
" ббб ",
" ццц ",
"SW ver. test c2005 "
};

от тук нататък Mstart[n] сочи конкретния стринг

Автор:  asp [ Чет Сеп 28, 2006 5:16 pm ]
Заглавие: 

Никола бравус ти си моя човек насочи ме с метода и след половин час копане хавата стана така:

char **p; e дефинирано в minfo;

char *p във функцията;

for( i=0;i<4;i++) //display strings
{
GotoYX((i+1),(minfo->cursor+1));
p =*((minfo->p) + ((minfo->Displ<<2)+i) ) ; // или казано по общо p=*pp
ZobrazString( p );
};

Всичко е чудесно. Имаш голямо мерси от мен. Нямаше да се сетя за този двоен указател щото се занимавам с 100 работи и съм не100%ов във всичките.

Колкото до подхода на Рек точно него променям с този с указателите струва ми се пое елегантен а и нямам умножение по броя на символите които трябва да знам колко са и т.н. Иначе си бачкаше така но сега го ъпдейтвам.

Благодаря на всички за съветите.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/