Я нахожусь в процессе изучения 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;
}
О хорошо Итак, проблема в том, что вы пытаетесь объявить другой массив из двух строк в этой строке и назначить в него другой массив:
string result[2] = subject[rand() % nsubject];
Это не совсем законно для простых массивов. Это должен быть указатель с указанным размером или без него. Например:
string *result = subject[rand() % nsubject];
… или же:
string (&result)[2] = subject[rand() % nsubject];
Не уверен, почему GCC компилирует это все же. Надеюсь, поможет!
Похоже, вы пытаетесь назначить один из под-массивов в subject
в новый массив. Xcode, вероятно, не нравится это, потому что вы обычно не назначаете целые массивы другим массивам. g ++ отлично справляется, потому что понимает, что обе переменные имеют тип string*
, Если вы явно сообщаете Xcode, что назначаете указатель на переменную-указатель, все будет в порядке. Следующее должно компилироваться где угодно.
string* result = subject[rand() % nsubject];
Просто знайте, что result
не содержит копию содержимого вложенного массива в subject
, это только ссылка на массив.