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

Стало, интересно, как можно инициализировать, например, вот это
Код: 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
инициализация const char** без дополнительных массивов.
    #34791294
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотите сказать такой вариант у вас скомпилился?

Код: 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
инициализация const char** без дополнительных массивов.
    #34791350
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik wrote:

> хотите сказать такой вариант у вас скомпилился?
Точку с запятой пропустил? Да, пропустил, и забыл переправить. С ней
компилится, но вопрос был, как убрать необходимость объявления tmp.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация const char** без дополнительных массивов.
    #34791378
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще в
Код: 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
инициализация const char** без дополнительных массивов.
    #34791481
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если упростить до такой попытки:
Код: 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
инициализация const char** без дополнительных массивов.
    #34791729
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
инициализация const char** без дополнительных массивов.
    #34791960
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно???

у меня не выходит..
...
Рейтинг: 0 / 0
инициализация const char** без дополнительных массивов.
    #34792155
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
инициализация const char** без дополнительных массивов.
    #34792248
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
инициализация const char** без дополнительных массивов.
    #34792372
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
инициализация const char** без дополнительных массивов.
    #34792429
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
одним словом так делать нельзя?
...
Рейтинг: 0 / 0
инициализация const char** без дополнительных массивов.
    #34792468
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему нельзя.
Элемент структуры names должен быть самостоятельным указателем. А при вкладывании массива в структуру получается что массив встраивается в структуру напрямую без создания промежуточного указателя.
...
Рейтинг: 0 / 0
инициализация const char** без дополнительных массивов.
    #34792676
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, так нельзя. Вариант с получением адреса действительно выглядит логично, но, по грамматике, за ним должно следовать выражение, а инициализатор с фигурными скобками частью выражением не является.

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

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

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

> Ну и в чем проблема? Заводить дополнительную константу по моему вполне
> нормально.
Просто обычно такую структур я использую под написание чего-то вроде
шелла - есть имя команды, какие-то технические, и обработчик (т.е.
внешний файл не пойдет, если все процедуры будут встроенные). И если
для команды надо, например, создать alias, т.е. альтернативное имя, то
логичнее всего было бы для этого использовать то же char**, опять же
null-terminated. Просто без объявления доп переменных это бы все как бы
логичнее было бы что ли. :) (это личные предпочтения, всего лишь).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация const char** без дополнительных массивов.
    #34792827
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
инициализация const char** без дополнительных массивов.
    #34792958
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
инициализация const char** без дополнительных массивов.
    #34793379
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ErV> компилируется при помощи gcc, но не компилируется при помощи g++.
Вы знаете, но оно у меня без проблем компилится. Oops, забыл сказать, что это было в gcc 3.4 (mingw). В Linux было лень перегружаться, чтобы проверить на gcc 4.
...
Рейтинг: 0 / 0
инициализация const char** без дополнительных массивов.
    #34793999
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в VC все равно не влезает..
...
Рейтинг: 0 / 0
инициализация const char** без дополнительных массивов.
    #34794163
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik wrote:

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


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