Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация const char** без дополнительных массивов. / 22 сообщений из 22, страница 1 из 1
11.09.2007, 14:02:42
    #34791212
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
Здравствуйте!

Стало, интересно, как можно инициализировать, например, вот это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct A{
        char** names;
        void *data;
};
 
const char* tmp[]= {
        "A", "ASDF", "QWERT",  0 
};

const A vars[] = {
        {tmp,  0 },
        { 0 ,  0 }
}

без объявления дополнительного массива для tmp?

Т.е. нечто вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct A{
        char** names;
        void *data;
};
 
const A vars[] = {
//"error: braces around scalar initializer for type 'const char**'"
        {{"ASDF", "QWERT",  0 },  0 },
        { 0 ,  0 }
}

Если это возможно, подскажите, пожалуйста, синтаксис.

Спасибо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.09.2007, 14:20:18
    #34791294
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
хотите сказать такой вариант у вас скомпилился?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct A{
        char** names;
        void *data;
};
 
const char* tmp[]= {
        "A", "ASDF", "QWERT",  0 
};

const A vars[] = {
        {tmp,  0 },
        { 0 ,  0 }
}[color=red];[/color]
...
Рейтинг: 0 / 0
11.09.2007, 14:33:59
    #34791350
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
Tubrik wrote:

> хотите сказать такой вариант у вас скомпилился?
Точку с запятой пропустил? Да, пропустил, и забыл переправить. С ней
компилится, но вопрос был, как убрать необходимость объявления tmp.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.09.2007, 14:40:17
    #34791378
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
еще в
Код: plaintext
1.
2.
const char* tmp[]= {
        "A", "ASDF", "QWERT",  0 
};

const убрать тогда компилит..

Код: plaintext
1.
char *tmp[] = {"A", "ASDF", "QWERT",  0 };

объявить как:

Код: plaintext
1.
char **tmp = {"A", "ASDF", "QWERT",  0 };

тоже не получается, кстати, а это тоже самое, что и:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct A{
        char** names;
        void *data;
};
 
const A vars[] = {
//"error: braces around scalar initializer for type 'const char**'"
        {{"ASDF", "QWERT",  0 },  0 },
        { 0 ,  0 }
}
...
Рейтинг: 0 / 0
11.09.2007, 14:59:36
    #34791481
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
если упростить до такой попытки:
Код: plaintext
1.
2.
3.
4.
char tmp[] =  {'A', '\0'}; // собирается

char *tmp = {'A', '\0'};  // не собирается


то у меня создается впечатление, что инициализация массивом при объявлении типа {} работает только если объявлен массив как [], а не как указатель *, а объявить вашу структуру:
Код: plaintext
1.
2.
3.
4.
struct A{
        char** names;
        void *data;
};

как
Код: plaintext
1.
2.
3.
4.
struct A{
        char* names[];
        void *data;
};

не дозволено.

Я исчерпал свои варинты и мне кажется, что так нельзя:)
...
Рейтинг: 0 / 0
11.09.2007, 15:57:38
    #34791729
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
Tubrik wrote:

> как
> struct A{
> char* names[];
> void *data;
> };
>
>
> не дозволено.
Дозволено.
Но, судя по всему, в этом случае компилятор считает names массивом с
нулевым размером. Потому что вот так можно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct A{
        char* names[];
        void *data;
};
 
const A vars[] = {
        {{}, 0 },
        {{}, 0 }
};

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.09.2007, 16:39:58
    #34791960
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
Можно???

у меня не выходит..
...
Рейтинг: 0 / 0
11.09.2007, 17:29:26
    #34792155
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
что, ещё косяк? Попробуй так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct A{
        char** names;
        void *data;
};
 
const A vars[] = {
        { &{"ASDF", "QWERT",  0 },  0 }, //хыхы
        { 0 ,  0 }
}
...
Рейтинг: 0 / 0
11.09.2007, 17:49:59
    #34792248
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
maXmoчто, ещё косяк? Попробуй так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct A{
        char** names;
        void *data;
};
 
const A vars[] = {
        { &{"ASDF", "QWERT",  0 },  0 }, //хыхы
        { 0 ,  0 }
}


Это шутка?
...
Рейтинг: 0 / 0
11.09.2007, 18:19:55
    #34792372
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
maXmo wrote:

> что, ещё косяк? Попробуй так:
> struct A{
> char** names;
> void *data;
> };
>
> const A vars[] = {
> { &{"ASDF", "QWERT", 0}, 0}, //хыхы
> {0, 0}
> }
>
пробовал. Выглядит логично, но

error: expected primary-expression before '{' token


Tubrik wrote:
>Можно???

>у меня не выходит..
У меня g++ 4.1.2:
[quote]
bash-3.1$ g++ --version
g++ (GCC) 4.1.2
Copyright (C) 2006 Free Software Foundation, Inc.
[/quote]
Компилер у тебя мыслит точно так же но эту возможность заюзать не дает,
см ошибки.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.09.2007, 18:33:18
    #34792429
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
одним словом так делать нельзя?
...
Рейтинг: 0 / 0
11.09.2007, 18:42:07
    #34792468
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
По моему нельзя.
Элемент структуры names должен быть самостоятельным указателем. А при вкладывании массива в структуру получается что массив встраивается в структуру напрямую без создания промежуточного указателя.
...
Рейтинг: 0 / 0
11.09.2007, 19:45:06
    #34792676
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
Нет, так нельзя. Вариант с получением адреса действительно выглядит логично, но, по грамматике, за ним должно следовать выражение, а инициализатор с фигурными скобками частью выражением не является.

initializer ::= assignment_expression | { initializer (, initializer))* }
...
Рейтинг: 0 / 0
11.09.2007, 20:09:25
    #34792703
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
Tubrik wrote:

> одним словом так делать нельзя?
с твоим компилером - нет. С моим можно, но смысла нету. :)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.09.2007, 20:13:40
    #34792707
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
teras wrote:
>Нет, так нельзя.
White Owl wrote:
> По моему нельзя.
> Элемент структуры names должен быть самостоятельным указателем. А при
> вкладывании массива в структуру получается что массив встраивается в
> структуру напрямую без создания промежуточного указателя.
Т.е. скорее всего болт? Обидно. Мне эта фишка пригодилась бы. (просто
есть привычка использовать null-terminated массивы константных
значений)

Всем спасибо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.09.2007, 20:24:21
    #34792721
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
ErVпросто есть привычка использовать null-terminated массивы константных значенийНу и в чем проблема? Заводить дополнительную константу по моему вполне нормально. Я так и делаю обычно. Даю им имена типа vars_names_0, vars_names_1 и так далее, вполне читаемо получается.
А с другой стороны, для дальнейшего упрощения разработки, если таких массивов много надо - вытаскиваю весь массив имен в какой-нибудь внешний файл (последние годы предпочитаю в xml) и пишу маленький препроцессор который на основе этого xml файла сделает мне с или cpp файл с константами.
...
Рейтинг: 0 / 0
11.09.2007, 20:52:22
    #34792746
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
White Owl wrote:

> Ну и в чем проблема? Заводить дополнительную константу по моему вполне
> нормально.
Просто обычно такую структур я использую под написание чего-то вроде
шелла - есть имя команды, какие-то технические, и обработчик (т.е.
внешний файл не пойдет, если все процедуры будут встроенные). И если
для команды надо, например, создать alias, т.е. альтернативное имя, то
логичнее всего было бы для этого использовать то же char**, опять же
null-terminated. Просто без объявления доп переменных это бы все как бы
логичнее было бы что ли. :) (это личные предпочтения, всего лишь).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.09.2007, 22:12:06
    #34792827
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
ErVс твоим компилером - нет. С моим можно, но смысла нету. :)
Мда. Описано в C99, поддерживается в GCC http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Compound-Literals.html
Самое смешное, что в драфте C++ от 2005-10-19 не встречается. Еще интереснее, что, в соответствии с этим, выражение вида
Код: plaintext
int *p = (int []){ 2 ,  4 };
компилируется при помощи gcc, но не компилируется при помощи g++.
...
Рейтинг: 0 / 0
12.09.2007, 04:51:08
    #34792958
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
teras wrote:

> int *p = (int []){2, 4};
!!!!!!!!!!!

> компилируется при помощи gcc, но не компилируется при помощи g++.
Вы знаете, но оно у меня без проблем компилится.
помнил ведь, что видел где-то такое, но синтаксис забыл


Соответственно, рабочий вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct A{
        const char** names;
        void *data;
};
 
const A vars[] = {
        {(const char* []){"ASDF", "QWERT",  0 },  0 },
        { 0 ,  0 }
};

2 teras
Преогромное спасибо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
12.09.2007, 10:39:07
    #34793379
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
ErV> компилируется при помощи gcc, но не компилируется при помощи g++.
Вы знаете, но оно у меня без проблем компилится. Oops, забыл сказать, что это было в gcc 3.4 (mingw). В Linux было лень перегружаться, чтобы проверить на gcc 4.
...
Рейтинг: 0 / 0
12.09.2007, 12:43:07
    #34793999
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
в VC все равно не влезает..
...
Рейтинг: 0 / 0
12.09.2007, 13:13:39
    #34794163
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация const char** без дополнительных массивов.
Tubrik wrote:

> в VC все равно не влезает..
это уже к VC++ вопрос :)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация const char** без дополнительных массивов. / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]