2013-06-27 1 views
0

Я пытаюсь сравнить элементы массива, но когда я его компилирую, массив элементов класса не отображает значения, которые я скопировал в массив из моего исходного массива в основном «ключевом», , , но массив из основного «ответа» сохраняет значения, которые я вводил, и я написал тестовый цикл после запуска программы, просто чтобы увидеть, что внутри массива членов класса «откаты», и это фактические переменные, которые я скопировал в массив из основного «ключа». Я пытаюсь сравнить два массива («откаты» и «ответ») в функции класса «класс», но я не знаю, что я делаю неправильно. Каждый раз я сравниваю их с циклом for, с if, он не работает, появляются случайные символы. Я написал тестовый цикл в самом конце массива, чтобы показать содержимое массива членов класса «canswers», у него есть все правильные значения, которые я скопировал из основного, но он не отображается или не работает, когда я сравниваю два. Я старался держать код как можно более чистым, чтобы вы, ребята, могли его легко прочитать.Сравнение элементов массива элементов элемента и основных элементов

#include<iostream> 
#include<string> 

using namespace std; 

class TestGrade 
{ 
    public: 
     void setKey(char []); 
     void grade(char []); 
     char canswers[]; 
     void display(); 
}; 


void TestGrade::setKey(char answers[]) //setting values from "key" array in main 
{ 
    for(int index = 0; index < 19; index++) 
    { 
     canswers[index] = answers[index]; 
    } 
} 

void TestGrade::grade(char answer[]) //comparing elements in array, here's where the 
{          //trouble begins 
    for(int index = 0; index < 19; index++) 
    { 
     cout << canswers[index] << " " << answer[index] << endl; 
     if(canswers[index] == answer[index]) 
      { cout << "The values are equal" << endl;} 
    } 
} 

void TestGrade::display()  //testing the values after the loop i had trouble with 
{ 
    for(int index = 0; index < 19;index++) 
    { 
     cout << canswers[index] << endl; 
    } 
} 


int main() 
{ 
    const char SIZE = 20; 
    char answer[SIZE]; 
    char key[20] = {'B', 'D', 'A', 'A', 
        'C', 'A', 'B', 'A', 
        'C', 'D', 'B', 'C', 
        'D', 'A', 'D', 'C', 
        'C', 'B', 'D', 'A'}; 

    TestGrade test1,test2; 

    test1.setKey(key); 

    cout << "Welcome to the written portion of the DMV exam. \n"; 
    cout << "You may only enter capital A, B, C, or D for your answers.\n\n" << endl; 

    for (int index = 0; index < SIZE; index++) 
    { 
     cout << "Enter your answer for question " << index+1 << endl; 
     cin >> answer[index]; 

     while (answer[index] != 'A' 
      && answer[index] != 'B' 
      && answer[index] != 'C' 
      && answer[index] != 'D') 
     { 
      cout << "ERROR: you must input capital A,B,C, or D" << endl; 
      cin >> answer[index]; 
     } 
    } 

    test2.grade(answer); // comparing the values of canswer[] and answer[] 

    test1.display(); //test loop testing contents of canswers[] class member array 

    system("pause"); 
    return 0; 
} 

ответ

1

Ваш canswers участник не является действительной декларацией. Вероятно, с помощью расширения, предоставленного вашим компилятором, поддерживается элемент гибкого массива C . Это будет действовать как массив 0, и ваш доступ к переменной canswers, таким образом, считывает и записывает за пределы объекта, что приводит к неопределенному поведению.

Вы должны либо объявить canswers с правильным размером массива, либо разрешить его вместо vector<char> или array<char, 20>. Для vector<char>:

class TestGrade 
{ 
public: 
    void setKey(char []); 
    void grade(char []); 
    std::vector<char> canswers; 
    void display(); 
}; 

Если вы используете vector<char>, вам нужно будет изменить, как вы реализуете setKey().

void TestGrade::setKey(char answers[]) //setting values from "key" array in main 
{ 
    canswers.clear(); 
    canswers.insert(canswers.begin(), answers, answers+20); 
} 

В вашем main() коде, вы используете test2 без ее инициализации canswers с вызовом setKey() на нем.

test2.setKey(key); 
test2.grade(answer); // comparing the values of canswer[] and answer[] 
+0

почему он отображает правильные значения после испытательного цикла? – bigdog225

+0

он все еще делает это, когда я исправляю его до 20, спасибо за помощь, хотя – bigdog225

+1

@ bigdog225 Это называется неопределенным поведением, и это означает, что все может случиться. Объявите 'test1' и' test2' в самом начале main, и это, вероятно, будет segfault. –

1

Вы никогда не устанавливаете ключ для test2. Это означает, что массив canswers в test2 не инициализирован, вы сделали это только в test1. Когда переменная в C++ не инициализируется в C++, она содержит случайные значения, как вы обнаружили. Вы хотите изменить test2.grade(answer) на test1.grade(answer), и он должен работать нормально.

Если вы хотите, чтобы кнопка ответа быть одинаковыми во всех тестах, а затем сделать canswers статичным, как так:

static char canswers[] 
+0

OMG, наконец, работает. Спасибо! Я застрял на этом буквально три часа. Спасибо всем. Ну теперь я знаю, что не делать, идя вперед – bigdog225