2016-12-08 17 views
0

C++構造体に問題があります。下記の私のプログラムでは、ファイルから質問の数、試験への回答、試験への回答者のファイルを読み込もうとしています。それはすべて動作しますが、学生の情報を構造体の配列に入れようとすると、何らかの理由で変数idが機能しません。 Microsoft Visual Studio 2017 RCのコンパイラでは、「students-> id [i]」に「式にオブジェクト型へのポインタが必要です」というエラーがあり、その理由がわかりません。私は問題がどこにあるのかをマークし、コードの残りの部分を取り除きました。私が持っているのは、calculateGrade関数が使われています。私はこれをしばらくは続けてきましたが、これを修正することなくどこにでも行くことはできません。どんな助けもありがとう!C++構造体オブジェクト型エラーへのポインタ

#include<iostream> 
#include<fstream> 
#include<string> 
using namespace std; 
struct studentInfo { 
    int id; 
    string firstName; 
    string lastName; 
    string exam; 
}; 
double calculateGrade(struct studentInfo); 
int main() { 
    const int SIZE = 12; 
    studentInfo students[SIZE]; 
    string fileName, key, studentFile; 
    ifstream file, fileForStudents; 
    int numOfQuestions, i = 0, id; 

    cout << "Please enter a file name: "; 
    cin >> fileName; 

    file.open(fileName); 
    if (!file.is_open()) { 
     cout << "Could not open file"; 
    } 

    file >> numOfQuestions >> key >> studentFile; 

    fileForStudents.open(studentFile); 
    if (!fileForStudents.is_open()) { 
     cout << "Could not open file"; 
    } 

    while (!fileForStudents.eof()) { 

     fileForStudents >> id >> students->firstName[i] >> students->lastName[i] >> students->exam[i]; 

     students->id[i] = id; //issue is here 

     i++; 
    } 

    calculateGrade(students[SIZE]); 


    return 0; 
} 
+0

大文字のC++で定数を持つことは、アンチパターンです。 – Slava

+2

['while(!file.eof())'が間違っている](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Barmar

答えて

2

あなただけのインデックス間違った場所に置く - studentsが配列であるとして、それは、そうでstudents[i].firstNameの代わりに、students->firstName[i]とする必要があります。

calculateGrade(students[SIZE]); 

それはコンパイルできますが、境界のアクセスのうちのためのUBを持っているでしょう:

はまた、この行が正しくありません。配列全体を渡す必要がある場合は、最初の要素とサイズへのポインタを渡しますが、std::vectorまたはstd::arrayをよく使用し、参照渡ししてください。なぜそのようなコードのような付加的な問題のためにそう

students->firstName[i] 

コンパイル、最初studentsは暗黙の最初の要素へのポインタに減衰することができるCスタイルの配列であるので、students->firstNamestudents[0].firstNameに等しく、次いでstudents->firstName[i]students[0].firstName[i]に等しいと、文字列からi番目のシンボルにアクセスします。

std::vectorを使用する別の理由があります。式students->firstName[i]は、そのようなコードが正しくないという偽の表現を提供しないか、コンパイルしません。

+0

'students [i] 'はポインタではなく、構造体です。 – Barmar

+0

@Barmar thx、固定、あまりにも多くの問題があり、すぐにすべてをキャッチする – Slava

+0

あなたの助けてくれてありがとう、私はコードを書き換えていたときにインデックスを置くことを忘れていたに違いない、私は別の方法でそれをテストした私はテキストを変数に入れてから配列に入れましたが、後で配列をすぐに移動して間違った場所にインデックスを置くようにしました。配列のid部分だけが私にエラーを出す唯一のものだと知っていますか? – FreckledTerror97

2

students->idは単なるintであり、配列ではないため、students->id[i]は使用できません。

アレイはstudentsなので、students[i].idである必要があります。 studentsは構造体の配列であり、ポインタの配列ではないため、->は使用しません。

+0

あなたの答えをありがとう、それはまた私を助けました。 – FreckledTerror97

関連する問題