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

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


Местный
***

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



Цитата(sergeeff @ Aug 8 2011, 16:14) *
Как пить дать человек компилирует С++`ом. Тогда print(const char *a) и print(char *a) - суть разные функции. А вот указатель на const char * из char * С++ компилятор приводит автоматом. Посему и рекомендовал объявить print(const char *a) и не парится в будущем с ручным приведением.

Нет не С++ компилятор.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Aug 8 2011, 11:55
Сообщение #17


self made
****

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



Цитата(sergeeff @ Aug 8 2011, 06:14) *
Как пить дать человек компилирует С++`ом. Тогда print(const char *a) и print(char *a) - суть разные функции.


Дело не в этом, а в том, что в char * нельзя передавать const char * качестве аргумента.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 8 2011, 12:17
Сообщение #18


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

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



Цитата(ar__systems @ Aug 8 2011, 15:55) *
Дело не в этом, а в том, что в char * нельзя передавать const char * качестве аргумента.


Это в Канаде, наверное нельзя (может религия не позволяет), а в С можно. Себе тестик в Visual Studio или чем-то другом напишите - увидите.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Aug 8 2011, 13:07
Сообщение #19


self made
****

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



Цитата(sergeeff @ Aug 8 2011, 08:17) *
Это в Канаде, наверное нельзя (может религия не позволяет), а в С можно. Себе тестик в Visual Studio или чем-то другом напишите - увидите.

Да, действительно. А нафига тогда вообще в С слово const?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 8 2011, 13:18
Сообщение #20


Гуру
******

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



Цитата(ar__systems @ Aug 8 2011, 17:07) *
А нафига тогда вообще в С слово const?
Указать транслятору на неизменяемые переменные, массивы, структуры... Некоторые трансляторы изымают их из ОЗУ.
Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 8 2011, 16:37
Сообщение #21


Гуру
******

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



Цитата(sergeeff @ Aug 8 2011, 16:17) *
Это в Канаде, наверное нельзя (может религия не позволяет), а в С можно. Себе тестик в Visual Studio или чем-то другом напишите - увидите.

Написал:
Код
char* func(char* p)
{
return p;
}

const char *gl;

char* func2()
{
return func(gl);
}

Цитата
C:\!t>gcc-4.exe -c t.c
t.c: In function 'func2':
t.c:10: warning: passing argument 1 of 'func' discards qualifiers from pointer target type

Так что и в С не очень можно (но если очень хочется, то можно - это все же warning, а не error)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 8 2011, 20:10
Сообщение #22


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

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



Скажем спасибо людям, написавшим gcc, что оповещают warning'ом! Кстати хороший пример в тему С/С++, что зачем и почему.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Aug 9 2011, 02:52
Сообщение #23


Местный
***

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



Цитата(sergeeff @ Aug 8 2011, 18:17) *
Это в Канаде, наверное нельзя (может религия не позволяет), а в С можно. Себе тестик в Visual Studio или чем-то другом напишите - увидите.

Вы Keil к Visual Studio подключили? Если так, то научите и меня пожалуйста. А по сути религии могу сказать так: на один и тот же весьма простой исходный текст Keil выдает разные сообщения об ошибках и предупреждениях, если компилировать под С51 и ARM. Скажем, если под С51 его все устраивает, то под ARM уже находит ошибки.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 9 2011, 05:06
Сообщение #24


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Код
typedef struct
{
     int               x_numicons;                
     int               y_numicons;                
     int               iconnumber[10];            
} imenu_icons_t;

typedef const char *imenu_text_t[10];

typedef struct
{
     imenu_icons_t      *menu_idle;                
     imenu_icons_t      *menu_active;          
     imenu_icons_t      *menu_icon;              
     imenu_text_t        *menu_text;            
} 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 xmain(void)
{
     ic = icon_menu(&mainmenu);
}
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 9 2011, 13:14
Сообщение #25


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

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



Цитата(011119xx @ Aug 9 2011, 06:52) *
Вы Keil к Visual Studio подключили? Если так, то научите и меня пожалуйста. А по сути религии могу сказать так: на один и тот же весьма простой исходный текст Keil выдает разные сообщения об ошибках и предупреждениях, если компилировать под С51 и ARM. Скажем, если под С51 его все устраивает, то под ARM уже находит ошибки.


1. Когда я упоминал Visual studio, соответственно речь шла о семействе компиляторов Microsoft.
2. Никто не запрещает вам открыть новый проект в Visual studio, основанный на make, и вообще делать все что хочешь (в смысле вызывать любые компиляторы, линкеры и т.п.). Вот с синхронизацией ошибок в output-окне и editor'e будут проблемы, это да.
3. Если хочется, то можно загрузить бесплатно пакет Visual Studio 2008/2010 SDK и наваять оболочку под себя.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jun 8 2012, 06:34
Сообщение #26


Местный
***

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



Снова возвращаюсь к данной теме, так как потребовалось усложнить интерфейс введением поддержки 2-х языков. Соответственно, код используемый ранее требует доработки:
Код
...
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));
     }
....
}
....

В первую очередь это:
Код
const char *main_text[10] = {"STR1", "STR2", "STR3", "STR4", "STR5", "STR6", "STR7", "STR8", "STR9", "STR10"};

меняю на это:
Код
const char *main_text[2][10] = {{"STR1_EN", "STR2_EN", "STR3_EN", "STR4_EN", "STR5_EN", "STR6_EN", "STR7_EN", "STR8_EN", "STR9_EN", "STR10_EN"},
{"STR1_RU", "STR2_RU", "STR3_RU", "STR4_RU", "STR5_RU", "STR6_RU", "STR7_RU", "STR8_RU", "STR9_RU", "STR10_RU"}};

А далее в общем-то запутался. По идее вот это:
Код
typedef struct
{
   imenu_icons_t    *menu_idle;                
   imenu_icons_t    *menu_active;          
   imenu_icons_t    *menu_icon;              
   const char          **menu_text;            
} imenu_t;

надо тоже менять, правда не пойму как. Функцию, использующую строки меняю на:
Код
int icon_menu(imenu_t *pmenu)
{
     unsigned char current = 0, i, language;
     const char **ptr = pmenu->menu_text;     //нужно править и как-то использовать language

     for(i = 0; i < entries; i++)
     {
         print((char *)(ptr + i));     //нужно править и как-то использовать language
     }
....
}

Прошу подсказки специалистов как правильно сделать.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 8 2012, 06:53
Сообщение #27


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(sergeeff @ Aug 9 2011, 17:14) *
2. Никто не запрещает вам открыть новый проект в Visual studio, основанный на make, и вообще делать все что хочешь (в смысле вызывать любые компиляторы, линкеры и т.п.). Вот с синхронизацией ошибок в output-окне и editor'e будут проблемы, это да.

Проблемы с форматом вывода решаемы
Однако, поработав в этой вашей студии, сакрального смысла не нашел.
Это так, в порядке оффтопа.


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

Цитата(011119xx @ Jun 8 2012, 10:34) *
Прошу подсказки специалистов как правильно сделать.

Сделать два отдельных массива адресов сообщений, а в функцию передавать адрес нужного (в зависимости от языка) и номер сообщения.

Если я правильно понял задачу.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jun 8 2012, 09:32
Сообщение #28


Местный
***

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



Цитата(MrYuran @ Jun 8 2012, 11:53) *
Сделать два отдельных массива адресов сообщений, а в функцию передавать адрес нужного (в зависимости от языка) и номер сообщения.

Такой вариант имеет право на жизнь, но мне не подходит. Адрес нужного (в зависимости от языка) и номер сообщения нужно определять в функции
Код
int icon_menu(imenu_t *pmenu)
.
И я знаю, что сделать это можно, но пока не могу сообразить.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jun 8 2012, 10:49
Сообщение #29


Местный
***

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



Работает вот так:
Код
int icon_menu(imenu_t *pmenu)
{
     unsigned char current = 0, i, language = 1;
     const char **ptr = pmenu->menu_text;    

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

но хотелось бы избавиться от локального указателя const char **ptr

Немного криво, но работает так:
Код
int icon_menu(imenu_t *pmenu)
{
     unsigned char current = 0, i, language = 1;

     for(i = 0; i < entries; i++)
     {
         print((char *)(*(&pmenu->menu_text[i + language * entries])));    
     }
....
}
Go to the top of the page
 
+Quote Post
XVR
сообщение Jun 9 2012, 11:33
Сообщение #30


Гуру
******

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



Код
typedef struct
{
   imenu_icons_t    *menu_idle;                
   imenu_icons_t    *menu_active;          
   imenu_icons_t    *menu_icon;              
   const char          *(*menu_text)[10];            
} imenu_t;

const char *main_text[2][10] = {{"STR1_EN", "STR2_EN", "STR3_EN", "STR4_EN", "STR5_EN", "STR6_EN", "STR7_EN", "STR8_EN", "STR9_EN", "STR10_EN"},
{"STR1_RU", "STR2_RU", "STR3_RU", "STR4_RU", "STR5_RU", "STR6_RU", "STR7_RU", "STR8_RU", "STR9_RU", "STR10_RU"}};

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

void print(const char*);

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

     for(i = 0; i < entries; i++)
     {
         print(ptr[i]);
     }
....
}



Или сразу -
Код
print(pmenu->menu_text[language][i]);

Go to the top of the page
 
+Quote Post

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

 


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


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