Возврат массива из многомерного массива

Я нахожусь в процессе изучения cpp. Сегодня я написал программу в моем обычном режиме компиляции через g ++ в командной строке Mac. Я также дважды проверил свою работу в XCode и нашел строку кода, которая приводит к тому, что код не компилируется в IDE

линия это:

string result[2] = subject[rand() % nsubject];

где subject — это многомерный массив строк, в котором каждый его член является массивом из двух строк, а nsubject — это int, содержащий длину массива. Xcode говорит, что: Инициализатор массива должен быть списком инициализатора, но, как указано выше, g ++ компилируется без каких-либо жалоб. Итак, будучи новичком в языке, я предполагаю, что это утверждение, вероятно, является плохой формой. Должен быть какой-то способ, который XCode сочтет приемлемым, да?

Вот фрагмент, который может продемонстрировать проблему, удаленный из контекста не имеет особого смысла, но следующее прекрасно работает на моем терминале, но не встраивается в xcode:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;

int main(){
string subject[][2] = {
{"a", "b"},
{"c", "d"},
{"e", "f"},
{"g", "h"},
{"i", "j"}
};

int nsubject = sizeof subject / sizeof subject[0];
srand(static_cast<unsigned>(time(0)));
string result[2] = subject[rand() % nsubject];
cout << result[0] << endl; //should return 'a','c','e','g' or 'i'
return EXIT_SUCCESS;
}

1

Решение

О хорошо Итак, проблема в том, что вы пытаетесь объявить другой массив из двух строк в этой строке и назначить в него другой массив:

string result[2] = subject[rand() % nsubject];

Это не совсем законно для простых массивов. Это должен быть указатель с указанным размером или без него. Например:

string *result = subject[rand() % nsubject];

… или же:

string (&result)[2] = subject[rand() % nsubject];

Не уверен, почему GCC компилирует это все же. Надеюсь, поможет!

0

Другие решения

Похоже, вы пытаетесь назначить один из под-массивов в subject в новый массив. Xcode, вероятно, не нравится это, потому что вы обычно не назначаете целые массивы другим массивам. g ++ отлично справляется, потому что понимает, что обе переменные имеют тип string*, Если вы явно сообщаете Xcode, что назначаете указатель на переменную-указатель, все будет в порядке. Следующее должно компилироваться где угодно.

string* result = subject[rand() % nsubject];

Просто знайте, что result не содержит копию содержимого вложенного массива в subject, это только ссылка на массив.

0

По вопросам рекламы [email protected]