Struct init: фигурные скобки вокруг скалярного инициализатора для типа char **

У меня есть эта структура:

struct NetDescriptor {
    unsigned int inputNeuronCount = 1;
    char **inputNeuronType = nullptr;
    unsigned int hiddenNeuronCount = 0;
    unsigned int *hiddenNeurons = nullptr;
    unsigned int outputNeuronCount = 1;
    char **outputNeuronType = nullptr;
};

И хотите запустить его в методе другого класса с помощью этого кода:

NetDescriptor nnDescriptor = {
    3,
    {"EAT\n","FOODL\n","FOODR\n"},
    3,
    {4,4,3},
    3,
    {"EAT\n","MOVEL\n","MOVER\n"}
};

Но это дает мне только эту ошибку:

line 3: error: braces around scalar initializer for type 'char**'

Я пытался:

{{"EAT\n"},{"FOODL\n"},{"FOODR\n"}},

Но это ничего не меняет, я также пробовал с тем же результатом std :: string.

В большинстве случаев, если вам нужен char **, вы должны использовать вместо него std::vector<std::string>.

NathanOliver 13.09.2018 21:47

Ну да. Вы объявили inputNeuronType как указатель. Указатель - это одно значение; вы не можете инициализировать его списком выражений.

melpomene 13.09.2018 21:48

@melpomene Так что вы порекомендуете? Я хочу определить эту структуру как статическую в коде, а не что-то вроде vec.push_back ("EAT");

skilled-solutions 13.09.2018 21:56

Что должен делать inputNeuronType? Действительно ли это должен быть указатель (на другой указатель)?

melpomene 13.09.2018 22:01

@melpomene Нет, мне просто нужна структура, содержащая массив строк std :: string или char *, и я хочу инициировать ее с помощью STRUCT = {{"1", "2", "3"}}; или что-то в этом роде.

skilled-solutions 13.09.2018 22:03

@ skill-solutions std::vector<std::string> отлично подходит для этого: coliru.stacked-crooked.com/a/83149a163218a0cf

melpomene 13.09.2018 22:07

Удалось ли вам инициализировать char** как этот вне структуры?

juanchopanza 13.09.2018 22:08

Да, этот вопрос не имеет ничего общего со структурами как таковыми, поэтому я удалил тег struct.

melpomene 13.09.2018 22:09
0
8
1 122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

i just want a Structure which contains a array of strings either std::string or char* and i want to init it with STRUCT = { {"1","2","3"}}; or something like this.

Нравится?

#include <iostream>
#include <string>
#include <vector>

struct NetDescriptor
{
    char const *inputNeuronType[3];
};

struct NetDescriptorStr
{
    std::string inputNeuronType[3];
};

struct NetDescriptorDynamic
{
    std::vector<std::string> inputNeuronType;
};

int main()
{
    NetDescriptor nnDescriptor = { { "EAT\n","FOODL\n","FOODR\n" } };
    std::cout << nnDescriptor.inputNeuronType[1] << std::endl;

    NetDescriptorStr nnDescriptorStr = { { "EAT\n","FOODL\n","FOODR\n" } };
    std::cout << nnDescriptorStr.inputNeuronType[1] << std::endl;

    NetDescriptorDynamic nnDescriptorDynamic = { { "EAT\n","FOODL\n","FOODR\n","EAT\n","FOODL\n","FOODR\n" } };
    std::cout << nnDescriptorDynamic.inputNeuronType[4] << std::endl;

    NetDescriptorDynamic nnDescriptorDynamic2;
    nnDescriptorDynamic2.inputNeuronType.assign({ "EAT\n","FOODL\n","FOODR\n","EAT\n","FOODL\n","FOODR\n" });
    std::cout << nnDescriptorDynamic2.inputNeuronType[4] << std::endl;

}

Это в основном то, что я имею в виду, но я хочу, чтобы он был динамичным, чтобы мне нужно было только добавить «XYZ \ n» в struct init, а не устанавливать что-либо от 3 до 4. Итак, я подумал, что указатели будут решением?

skilled-solutions 13.09.2018 22:14

Ооо, спасибо большое, я не знал, что это возможно! Задача решена.

skilled-solutions 13.09.2018 22:22

Проблема не имеет ничего общего со структурами как таковыми.

char **inputNeuronType = {"foo", "bar", "baz"};

такая же проблема.

Указатель - это одно значение. Вы не можете использовать список выражений для его инициализации; вы можете указать его только на какой-то уже существующий массив.

Однако, если все, что вам действительно нужно, это синтаксис инициализации, то std::vector<std::string> будет работать нормально:

#include <string>
#include <vector>

struct NetDescriptor {
    unsigned int inputNeuronCount = 1;
    std::vector<std::string> inputNeuronType;
    unsigned int hiddenNeuronCount = 0;
    std::vector<unsigned int> hiddenNeurons;
    unsigned int outputNeuronCount = 1;
    std::vector<std::string> outputNeuronType;
};

NetDescriptor nnDescriptor = {
    3,
    {"EAT\n","FOODL\n","FOODR\n"},
    3,
    {4,4,3},
    3,
    {"EAT\n","MOVEL\n","MOVER\n"}
};

Этот код Just Works ™.

Для вас тоже: Большое спасибо! Именно то, что я имею в виду, векторы мыслей могут использовать только push_back для этого ...

skilled-solutions 13.09.2018 22:23

@ квалифицированные решения, вы можете использовать assign для поддержки формата, см. мое редактирование

Killzone Kid 13.09.2018 22:29

Другие вопросы по теме