Отговори на тема  [ 5 мнения ] 
Индексиранена масиви от указатели към стрингове във функция 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 22, 2006 6:27 pm
Мнения: 376
Местоположение: plovdiv
Мнение Индексиранена масиви от указатели към стрингове във функция
Здравейте, имам С проблем.
Значи имам масиви от указатели към стрингове.

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 символ по малко / по навътре /.

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

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


Чет Сеп 28, 2006 2:09 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Ммм защо не дадеш и дефинирането на самият масив ?

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

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

p = array;

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

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

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

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Последна промяна the_real_maniac на Чет Сеп 28, 2006 2:38 pm, променена общо 1 път



Чет Сеп 28, 2006 2:30 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Прави се с указател към указател

char ** pp = &Mstart[0];

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

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


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


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


Чет Сеп 28, 2006 2:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
code volatile char Mstart[4][20]=
{
" ааа ",
" ббб ",
" ццц ",
"SW ver. test c2005 "
};

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


Чет Сеп 28, 2006 3:43 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 22, 2006 6:27 pm
Мнения: 376
Местоположение: plovdiv
Мнение 
Никола бравус ти си моя човек насочи ме с метода и след половин час копане хавата стана така:

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%ов във всичките.

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

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


Чет Сеп 28, 2006 5:16 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни