2013-12-09 2 views
4

시작하기 전에 먼저이 오류에 대한 가능한 해결책을 살펴 보았습니다. 불행히도, 그들은 모두 내 프로젝트의 요구 사항 인 배열을 사용하지 않는 것과 관련이 있습니다. 또한, 저는 현재 CS에 소개를하고있어서 내 경험은 아무도 없습니다.오류 : Non-POD 요소 유형 'string'의 가변 길이 배열

배열의 용도는 파일에서 이름을 수집하는 것입니다. 배열을 초기화하기 위해 이름의 수를 세어 크기로 사용합니다. 문제는 제목에 명시된 오류입니다. 그러나 1D 배열을 사용하면서 그 주위에 방법이 표시되지 않습니다.

MAIN.CPP

#include <iostream> 
    #include <cstdlib> 
    #include <fstream> 
    #include <string> 
    #include <iostream> 
    #include "HomeworkGradeAnalysis.h" 

    using namespace std; 

    int main() 
    { 
     ifstream infile; 
     ofstream outfile; 
     infile.open("./InputFile_1.txt"); 
     outfile.open("./OutputfileTest.txt"); 

     if (!infile) 
     { 
      cout << "Error: could not open file" << endl; 
      return 0; 
     } 

     string str; 
     int numLines = 0; 

     while (infile) 
     { 
      getline(infile, str); 
      numLines = numLines + 1; 
     } 
     infile.close(); 
     int numStudents = numLines - 1; 
     int studentGrades[numStudents][maxgrades]; 
     string studentID[numStudents]; 

     infile.open("./InputFile_1.txt"); 

     BuildArray(infile, studentGrades, numStudents, studentID); 

     infile.close(); 
     outfile.close(); 
     return 0; 
    } 

HomeworkGradeAnalysis.cpp

using namespace std; 

    void BuildArray(ifstream& infile, int studentGrades[][maxgrades], 
      int& numStudents, string studentID[]) 
    { 
     string lastName, firstName; 
     for (int i = 0; i < numStudents; i++) 
     { 
      infile >> lastName >> firstName; 
      studentID[i] = lastName + " " + firstName; 
      for (int j = 0; j < maxgrades; j++) 
       infile >> studentGrades[i][j]; 
      cout << studentID[i] << endl; 
     } 
     return; 
    } 

HomeworkGradeAnalysis.h

#ifndef HOMEWORKGRADEANALYSIS_H 
    #define HOMEWORKGRADEANALYSIS_H 

    const int maxgrades = 10; 

    #include <fstream> 

    using namespace std; 

    void BuildArray(ifstream&, int studentGrades[][maxgrades], int&, string studentID[]); 
    void AnalyzeGrade(); 
    void WriteOutput(); 

    #endif 

파일을 간단한 형식으로되어있는 텍스트 :

Boole, George 98 105 0 0 0 100 94 95 97 100 

각 줄은 학생 수에 따라 다릅니다.

여전히 배열을 사용하면서 학생 이름을 스트리밍 할 수있는 또 다른 방법은 무엇입니까?

+2

'벡터'사용을 고려 했습니까? – nhgrif

+0

다른 솔루션 중 하나에서 벡터를 보았지만 아직 배웠습니다. 나는 그것을 사용하려고 시도했으나 그것을 이해하지 못했기 때문에 그것을 작동시킬 수 없었다. 죄송합니다. 원래 코드를 수정했습니다. 학생 ID [numStudents] 였지만 오류가 있습니다. – hanipman

+1

벡터를 벡터로 만들거나 벡터에 관한 질문을 게시하는 것이 좋습니다 ... – nhgrif

답변

25

배열은 상수 값으로 선언해야하며 변수를 사용할 수 없습니다. 변수를 사용하여 선언하려면 동적으로 할당 된 배열을 사용해야합니다.

string studentID[numStudents]; //wrong 

string *studentID = new string[numStudents]; //right 

편집 : 그것으로

delete [] studentID 
1

가변 lengthed 배열을 완성 번 배열을 해제해야하는 언어의 표준 기능이 아닙니다. 힙에 할당하거나 벡터를 만들거나 대신 상수를 사용해야합니다.

게다가. 나는 clang으로부터이 에러 메시지를 받았지만, g ++ - 4.9는 그것을 나에게주지 않았고 컴파일은 괜찮습니다. 그래서 컴파일러에 의존합니다.