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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Указатель на строку в структуре, или даже указатель на указатель
011119xx
сообщение Aug 3 2011, 11:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Нужна помощь опытных специалистов.

Код такой:
Код
typedef struct
{
     int               x_numicons;                
     int               y_numicons;                
     int               iconnumber[10];            
} imenu_icons_t;

typedef struct
{
     imenu_icons_t      *menu_idle;                
     imenu_icons_t      *menu_active;          
     imenu_icons_t      *menu_icon;              
     char               *menu_text[10];            
} imenu_t;

imenu_icons_t main_icon = {1, 1, {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};

imenu_icons_t main_idle = {10, 1, {12, 13, 14, 15, 16, 17, 18, 19, 20, 21}};

imenu_icons_t main_active = {10, 1, {22, 23, 24, 25, 26, 27, 28, 29, 30, 31}};

const char *main_text[10] = {"STR1", "STR2", "STR3", "STR4", "STR5", "STR6", "STR7", "STR8", "STR9", "STR10"};

imenu_t mainmenu = {&main_idle, &main_active, &main_icon, &main_text};

int icon_menu(imenu_t *pmenu)
{
     unsigned char current = 0, i;
     char *ptr;

//     В функции показано не все, поэтому пусть не смущает ее бессмысленность

     for(i = 0; i < entries; i++)
     {
           ptr = (char *)pmenu->menu_text[i];
     }

     return current;
}

unsigned char ic;

void main(void)
{
     ic = icon_menu(&mainmenu);
}

беспокоит строка: ptr = (char *)pmenu->menu_text[i];
так как сейчас она указывает не туда куда хотелось бы. Вопрос в том как это правильно сделать, т.е. чтобы указатель указывал на строку?

Сообщение отредактировал 011119xx - Aug 3 2011, 11:20
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 3 2011, 11:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(011119xx @ Aug 3 2011, 15:18) *
как это правильно сделать, т.е. чтобы указатель указывал на строку?
Скорее всего, так:
Код
imenu_t mainmenu = {&main_idle, &main_active, &main_icon, {main_text[0], main_text[2], main_text[3], main_text[4], main_text[5], main_text[6], main_text[7], main_text[8], main_text[9] } };

Go to the top of the page
 
+Quote Post
ISK2010
сообщение Aug 3 2011, 11:40
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Лучше работать с указателем на массив указателей на строки.


CODE
typedef struct {

u8 QtyString;

u8 **pStr;

} MENU_PageText;





const u8 *MENU_TEXT_RU[] =

{

"выаопвылаопвыо",

"ывалдоплвыоапло",

"ывавыавыоапио"

};

..........

..........

const MENU_PageText PagesText[] =

{

{0x3,MENU_TEXT_EN},

{0x3, MENU_TEXT_DE},

{0x3,MENU_TEXT_IT},

{0x3, MENU_TEXT_RU}

};





Сообщение отредактировал ISK2010 - Aug 3 2011, 11:46
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 3 2011, 13:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(ISK2010 @ Aug 3 2011, 14:40) *
Лучше работать с указателем на массив указателей на строки.

Не факт, но инициализировать меню удобрее с помощью макросов, типа:

Код
STATE ( Abort                , "Aborted !"                , "Entnahme abgebrochen!"        ,"Остановлено!"                , CLR+STN+OLD+SSS+SLB    )
STATE ( Finish                , "Finished:"                , "Beendet:"                    ,"Закончено:"                , CLR+STN+OLD+SSS+SLB    )


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
011119xx
сообщение Aug 4 2011, 10:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Проблема решается так:
Код
typedef struct
{
     int               x_numicons;                
     int               y_numicons;                
     int               iconnumber[10];            
} imenu_icons_t;

typedef struct
{
     imenu_icons_t      *menu_idle;                
     imenu_icons_t      *menu_active;          
     imenu_icons_t      *menu_icon;              
     char               *menu_text[10];            
} imenu_t;

imenu_icons_t main_icon = {1, 1, {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};

imenu_icons_t main_idle = {10, 1, {12, 13, 14, 15, 16, 17, 18, 19, 20, 21}};

imenu_icons_t main_active = {10, 1, {22, 23, 24, 25, 26, 27, 28, 29, 30, 31}};

const char *main_text[10] = {"STR1", "STR2", "STR3", "STR4", "STR5", "STR6", "STR7", "STR8", "STR9", "STR10"};

imenu_t mainmenu = {&main_idle, &main_active, &main_icon, &main_text};

void print(char *text)
{
    char c;

    while(c = *(text++))    
      {
           // Печать символа                        
      }
}

int icon_menu(imenu_t *pmenu)
{
     unsigned char current = 0, i;
     char **ptr = (char *)pmenu->menu_text[0];

     for(i = 0; i < entries; i++)
     {
    print(*(ptr + i));
     }

     return current;
}

unsigned char ic;

void main(void)
{
     ic = icon_menu(&mainmenu);
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 4 2011, 11:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(011119xx @ Aug 4 2011, 14:27) *
Проблема решается так

"Кривое" решение. Корректнее это сделать так:
Код
...
typedef struct
{
   imenu_icons_t    *menu_idle;                
   imenu_icons_t    *menu_active;          
   imenu_icons_t    *menu_icon;              
   char                     **menu_text;            
} imenu_t;
.....
const char *main_text[10] = {"STR1", "STR2", "STR3", "STR4", "STR5", "STR6", "STR7", "STR8", "STR9", "STR10"};

imenu_t mainmenu = {&main_idle, &main_active, &main_icon, &main_text};

.....
int icon_menu(imenu_t *pmenu)
{
     unsigned char current = 0, i;
     char **ptr = pmenu->menu_text;

....
}
....
Go to the top of the page
 
+Quote Post
011119xx
сообщение Aug 5 2011, 02:45
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Keil ваш вариант не устраивает. А вот такой устраивает:
Код
...
typedef struct
{
   imenu_icons_t    *menu_idle;                
   imenu_icons_t    *menu_active;          
   imenu_icons_t    *menu_icon;              
   const char          **menu_text;            
} imenu_t;
.....
const char *main_text[10] = {"STR1", "STR2", "STR3", "STR4", "STR5", "STR6", "STR7", "STR8", "STR9", "STR10"};

imenu_t mainmenu = {&main_idle, &main_active, &main_icon, main_text};

.....
int icon_menu(imenu_t *pmenu)
{
     unsigned char current = 0, i;
     const char **ptr = pmenu->menu_text;

     for(i = 0; i < entries; i++)
     {
         print((char *)(ptr + i));
     }
....
}
....


Сообщение отредактировал 011119xx - Aug 5 2011, 02:46
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Aug 5 2011, 16:23
Сообщение #8


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(011119xx @ Aug 4 2011, 06:27) *
Проблема решается так:

Подтверждаю, кривое, если не сказать кривейшее. Массив на 10 элементов, используется и инициализируется только один. Используется причем неправильно.

Код
char **ptr = (char *)pmenu->menu_text[0];

В этой строке вам ничего глаз не режет?
Go to the top of the page
 
+Quote Post
011119xx
сообщение Aug 8 2011, 02:44
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Окончательный вариант принятый к использованию:

Код
...
typedef struct
{
   imenu_icons_t    *menu_idle;                
   imenu_icons_t    *menu_active;          
   imenu_icons_t    *menu_icon;              
   const char          **menu_text;            
} imenu_t;
.....
const char *main_text[10] = {"STR1", "STR2", "STR3", "STR4", "STR5", "STR6", "STR7", "STR8", "STR9", "STR10"};

imenu_t mainmenu = {&main_idle, &main_active, &main_icon, main_text};

.....
int icon_menu(imenu_t *pmenu)
{
     unsigned char i, entries;

....
     for(i = 0; i < entries; i++)
     {
          print((char *)pmenu->menu_text[current]);
     }
....
}
....


Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 8 2011, 07:46
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Вот тут print((char *)pmenu->menu_text[current]); приведение типа лишнее. Можно просто написать print(pmenu->menu_text[current]);
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 8 2011, 07:50
Сообщение #11


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(011119xx @ Aug 8 2011, 06:44) *
Окончательный вариант принятый к использованию:
Код
....
     for(i = 0; i < entries; i++)
     {
          print((char *)pmenu->menu_text[current]);
     }
....
}


Просто глаз радуется, глядя на цикл, в котором индекс никак не используется в теле.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Aug 8 2011, 08:33
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(sergeeff @ Aug 8 2011, 13:50) *
Просто глаз радуется, глядя на цикл, в котором индекс никак не используется в теле.

Так нормально?
Код
....
     for(i = 0; i < entries; i++)
     {
          print((char *)pmenu->menu_text[i]);
     }
....


Цитата(XVR @ Aug 8 2011, 13:46) *
Можно просто написать print(pmenu->menu_text[current]);

Keil на такое ругается так как print объявлена:
void print(char *str);
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 8 2011, 08:47
Сообщение #13


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(011119xx @ Aug 8 2011, 12:33) *
Так нормально?
Код
....
     for(i = 0; i < entries; i++)
     {
          print((char *)pmenu->menu_text[i]);
     }
....



Keil на такое ругается так как print объявлена:
void print(char *str);



Вам лучше знать, нормально это или нет. Вы же автор кода.


Объявите функцию print:

Код
void print(const char *str);


Тогда она будет без проблем вызываться с const и не const фактическими переменными.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 8 2011, 08:52
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(011119xx @ Aug 8 2011, 12:33) *
Keil на такое ругается
Сообщение транслятора об ошибке приведите
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 8 2011, 10:14
Сообщение #15


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Как пить дать человек компилирует С++`ом. Тогда print(const char *a) и print(char *a) - суть разные функции. А вот указатель на const char * из char * С++ компилятор приводит автоматом. Посему и рекомендовал объявить print(const char *a) и не парится в будущем с ручным приведением.
Go to the top of the page
 
+Quote Post

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

 


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


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