Неожиданные ошибки относительно структур и массивов - PullRequest
0 голосов
/ 22 марта 2020

Таким образом, я следую определенной серии учебников и пытаюсь использовать эти знания для того, чтобы сделать что-то свое, похожее, но и отличающееся от самого ряда. В одном разделе, чтобы устранить определенные неудобства, которые не важны для масштаба моей проблемы, возможное решение состояло в том, чтобы сохранить определенный кусок данных в членах структуры и затем вызвать эту структуру в функции, которая позже выводит данные точно так, как мы хотели - в виде массива.

Все было хорошо, пока функция по какой-то причине не отказалась принимать значения массива, утверждая, что в аргументах массива была перегрузка (я укажу ошибки позже), и то, что объект, который я возвращаю, не соответствует типу возврата функции.

Вот мой код:


struct TriCoord
{
    float Position[3];
    int Label[2];
};

std::array<TriCoord, 3> Implement(float x, float y, float z, int j) //2
{
    float size = 1.0f;

    TriCoord f0;
    f0.Position = { x, y, z }; //1
    f0.Label = { j, 1 }; //1

    TriCoord f1;
    f1.Position = { x + 0.5, y + 0.5, z };
    f1.Label = { j, 2 };

    TriCoord f2;
    f2.Position = { x + 0.5, y, z };
    f2.Label = { j, 3 };

    return { f0, f1, f2 }; //2
};

int main()
{
    int X;
    float A[3] = Implement(3, 4, 5, 1); //3
    std::cout << A[0] << ", " << A[1] << ", " << A[2] << std::endl;
    std::cout << "Press Enter key to return" << std::endl;
    std::cin >> X;
    return 0;
}

Я поместил комментарии, определяющие, где именно ошибки .

1) Компилятор говорит, что f0 "не является изменяемым значением lvalue". Я не вижу причин, почему это не должно быть. В аргументе массива конкретно во втором элементе массива (в данном случае у) компилятор говорит, что я добавляю «слишком много значений инициализатора». Опять бессмысленно. Я указал, что массив Position должен иметь 3 элемента, и подключаю 3 элемента соответствующего типа (float).

Эти две ошибки распространяются на f0.Label, а также на другие TriCoords.

2 ) Компилятор говорит, что функция «возвращает неполный тип« std :: array »». Кроме того, в обратной строке «инициализация списка для типа объекта« std :: array »недопустима, поскольку тип является неполным».

Технически, что я возвращаю, это массив std, элементами которого являются TriCoords и суммы 3, так что я не вижу проблемы еще раз. Я обошел эту проблему, изменив тип возвращаемого значения функции на float, но вместо него строка возврата генерирует ту же ошибку для второго элемента (в данном случае f1), что и в задаче 1.

3) " Для агрегатного объекта ожидается инициализация '{...}' "Я понятия не имею, что это значит. Я получаю эту ошибку независимо от того, какой тип возврата я указываю для своей функции.

Я должен подчеркнуть, что и я, и сериал, за которым я следую, используют Visual Stud ios, и в видео таких ошибок не появлялось Я был следующим. Я даже копировал и вставлял весь код видео построчно, но ошибки по-прежнему сохранялись, и я пришел к выводу, что в настройке Visual Stud ios что-то не так, возможно, из-за различий в версиях ( видео было загружено в этом году, поэтому оно не работает на слишком старой версии). Все мои зависимости также правильны и присутствуют в соответствующих каталогах, основанных на проектах, я дважды проверил их.

Наконец, код, который я использовал выше, был отдельным тестовым кодом, который я переделал для нового проекта в попытаться изолировать ошибку. Излишне говорить, что в обоих случаях я получал одинаковую ошибку, указывающую на то, что в пользовательских заголовках и библиотеках моего исходного проекта нет ничего неправильного.

1 Ответ

1 голос
/ 22 марта 2020

1) Вы не можете присваивать таким массивам, как только они инициализированы.

int arr[3] = {1, 2, 3};    //valid

int arr2[3];
arr2 = {1, 2, 3};    //invalid

В вашем случае вы можете вместо: -

TriCoord f0;
f0.Position = { x, y, z }; 
f0.Label = { j, 1 }; 

написать: -

float tempFloat[3] = { x, y, z }; 
int tempInt[2] = { j, 1 };
TriCoord f0;
for (int i = 0; i < 3; ++i)
    f0.Position[i] = tempFloat[i];
for (int i = 0; i < 2; ++i)
    f0.Label[i] = tempInt[i];

2) Решить 1, чтобы решить 2 ...

3) Вы пытаетесь присвоить std::array<TriCoord, 3> массиву с плавающей точкой, что, безусловно, невозможно ...

На этом этапе я настоятельно рекомендую вам использовать std::array везде.

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