请求非类类型为''

时间:2018-11-26 19:15:40

标签: c++ arrays pointers structure

我正在努力克服此错误。我的功能应该是将文件中的数据读取到结构数组中。

数据文件示例:

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;
    }
}

我不知道如何使用指针算法来遍历该函数,这是我得到的错误:

  

[错误]请求“ * ptr”中的成员“ id”,这是非类类型   'student_array {aka学生[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 :(得分:2)

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
        }
    }
}

在此版本中,该函数使用指向第一个元素的指针(并使用++来遍历数组),而不是指向整个数组的指针。

答案 1 :(得分:-2)

student_array是一个数组。

您需要读入该数组的给定元素

像这样

{
    "id": "d054dae5-173d-478b-bb0e-7516e6a24476",
    "ProductName": "Data 100",
    "ProviderLiabilities": []
}

您可能想要循环并将循环索引用作数组索引