Строковые / символьные массивы внутри структуры - PullRequest
3 голосов
/ 10 мая 2011

Я пытаюсь создать структуру, в которой есть несколько строковых массивов. В своих целях я хотел использовать массивы std :: string, но массивы char * также сработали бы, если бы они могли выполнить свою работу. В любом случае я не могу понять, как инициализировать вещи. Вот что у меня есть:

initialize.h

#include <string>

struct myStruct
{
    std::string x[22];
    std::string y[8];
};

extern myStruct data[22];

myform.cpp

#include <initialize.h>
#include <string>

myStruct data[22];

data[0].x = {"a", "b", "c", "d", ...};

Я получаю ошибки, которые выглядят так:

Ошибка 1, ошибка C2059: синтаксическая ошибка: '{' Ошибка 2, ошибка C2143: синтаксическая ошибка: отсутствует ';' до '{' Ошибка 3, ошибка C2143: синтаксическая ошибка: отсутствует ';' до '}'

Я пробовал различные перестановки с массивами char * или std :: string *, но безрезультатно, я застрял. Я забыл что-то фундаментальное?

Заранее спасибо.

Ответы [ 6 ]

0 голосов
/ 10 мая 2011

Другие комментарии верны, но я верю, что есть еще одна вещь, которую вы можете сделать. Вы можете инициализировать структуру, когда объявите ее в своем заголовке:

struct myStr
{
  string x[22];
  string y[8];
} data[22] = { {...}, {...}, ... };

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

0 голосов
/ 10 мая 2011

Если вы сделаете эти char * вместо строк, вы можете избежать статического инициализатора.Это будет долго и безобразно.

struct myStruct
{
    char * x[22];
    char * y[8];
};

extern myStruct data[22];

myStruct data[22] = {
    { // data[0]
        { "a", "b", "c", ... "v" }, // data[0].x
        { "0", "1", ... "7" } // data[0].y
    },
    { // data[1]
    ...
};
0 голосов
/ 10 мая 2011

Невозможно инициализировать нестатические элементы массива в C ++. К сожалению.

0 голосов
/ 10 мая 2011

Вы не можете использовать синтаксис инициализации {} для присвоения значений массивам. Его можно использовать только при инициализации массива сразу после определения:

int a[3] = { 3, 4, 5 };

но не

int a[3];
a = { 3, 4, 5 }; //error

вы не обойдете цикл или ручную инициализацию каждого члена. Но я думаю, что новый стандарт C ++ 0x улучшает это и делает это возможным (и даже больше синтаксиса инициализатора) возможным.

0 голосов
/ 10 мая 2011

  {"a", "b", "c", "d", ...};
Синтаксис

разрешен только при определении переменной, поэтому вы можете сделать

  std::string data[4] = {"a", "b", "c", "d"};  // syntax allowed for definition

но линия

  data[0].x = {"a", "b", "c", "d", ...}; // not definition

не является определением (data [0] .x не является новой переменной). Более того, поскольку это не определение, вы не можете разместить этот код вне функции.

Где-то в коде вам придется вручную присваивать каждую переменную (как подсказывает ответ @ Mahesh)

0 голосов
/ 10 мая 2011
myStruct data[22];

С помощью приведенного выше оператора вы уже создали 22 * ​​1003 * объекты типа myStruct и каждый объект имеет свои x,y массивы строк, размер которых 22,8 * 1007.* соответственно.

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

data[0].x[0] = "a";
data[0].x[1] = "b";

// ....

Что вы делаете, ошибка похожа на -

int a[5] ;
a = { 1,2,3,4,5 } ; // Error.

int a[] = { 1,2,3,4,5 } ; // Correct.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...