Struct init: скобки вокруг скалярного инициализатора для типа char ** - PullRequest
0 голосов
/ 13 сентября 2018

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

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"}
};

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

строка 3: ошибка: скобки вокруг скалярного инициализатора для типа 'char **'

Я пробовал:

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

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

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Проблема не имеет отношения к структурам как таковым.

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 ™.

0 голосов
/ 13 сентября 2018

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

Вот так?

#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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...