запрос на член '' в '', который не имеет тип класса '' - PullRequest
0 голосов
/ 26 ноября 2018

Я изо всех сил пытаюсь преодолеть эту ошибку.Моя функция должна считывать данные из файла в массив структур.

Пример файла данных:

1234    52  70  75
2134    90  76  90
3124    90  95  98

Определение структуры (среднее вычисляется позже):

struct Student
{
     int id, testOne, testTwo, testThree;
    float average;
};
typedef Student student_array[SIZE];

Функция:

    void SetArrays (student_array * s)
{
    student_array *ptr = s;

    fstream fin ("lab5_data.txt");

    if (fin.is_open())
    {
        fin >> ptr->id;
    }
}

Я не могу понять, как использовать арифметику указателя для итерации по функции, это ошибка, которую я получаю:

[Ошибка]запрос на член 'id' в '* ptr', который относится к типу, не относящемуся к классу 'student_array {aka Student [20]}'

РЕШЕНИЕ:

Мне удалосьПроработайте проблему с советом, данным здесь, а также с Reddit.Вот мое решение, спасибо всем.

void SetArrays (Student * ptr)
{
    //TODO: Function Spec:
    fstream fin("lab5_data.txt");

    cout << "Data read in:" << endl;
    if (fin.is_open())
    {
        for (int i = 0 ; i < SIZE ; ptr++, i++)
        {
            fin >> ptr->id;
            fin >> ptr->testOne;
            fin >> ptr->testTwo;
            fin>> ptr->testThree;

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

ptr - указатель на массив.

*ptr разыменовывает указатель, поэтому результатом является массив.

(*ptr)[i] - это элемент этого массива, которыйявляется Student структурой.

(*ptr)[i].id является членом этой структуры.

Ваш код неверен, потому что он пытается разыменовать ptr с -> (пока хорошо,ptr является указателем, поэтому разыменование является допустимой операцией), но затем пытается сразу получить элемент id, но он все еще просматривает весь массив.Сообщение компилятора примерно означает, что «вы сказали мне получить поле id массива, что не имеет смысла, поскольку массивы имеют только индексы, а не именованные поля».

Если вы хотите использовать арифметику указателей, этопроще избавиться от этого typedef и указателя на массив:

void SetArrays (Student *ptr)
{
    fstream fin ("lab5_data.txt");

    if (fin.is_open())
    {
        while (fin >> ptr->id)
        {
            ptr++;  // advance to the next array element
        }
    }
}

В этой версии функция берет указатель на первый элемент (и использует ++ для перехода по массиву), а не указатель на весь массив.

0 голосов
/ 26 ноября 2018

student_array - это массив.

Вам нужно прочитать в данный элемент этого массива

вот так

fin >> ptr[0]->id;

вам, вероятно, нужен цикл и использоватьиндекс цикла как индекс массива

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