Почему моя функция мутатора класса для строкового массива вызывает процесс, возвращенный -1073741819 (0xc0000005) - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю над программой для задания класса, которая читает входной файл, в котором подробно описываются ходы шахмат и их статистика. Позже программа должна сравнить ходы открытия из файла "Открытие.txt" с ходами в примере игры "game1.txt", чтобы увидеть, может ли она обнаружить ходы открытия. Ну, я не прошел мимо попыток чтения во входном файле "opens.txt". Проблема, которую я имею, является setMoves (), заставляет мою программу возвращать процесс, возвращенный -1073741819 (0xc0000005). Я не могу понять, что не так между моим открытием. H, открытием. cpp и вызовом setMoves () в функции ReadOpenings в main. cpp. Инструкции присваивания говорят, что я должен объявить строковые ходы [6] как закрытый член в классе. Тогда мне нужно иметь функции доступа и мутатора. Мой текущий код - единственный способ, которым я не получаю ошибки компилятора, но он все еще не работает.

#include <iostream>
#include <fstream>
#include "Opening.h"
#include "Game.h"
#include <stdlib.h>
#include <iomanip>

using namespace std;

int GetNumOpenings();
void CompareOpenings(Opening openings[], int numOpenings);
string DetectOpening(Game *game, Opening opening);
string GetString();
void Menu();
void ReadOpenings(Opening arr[], int size);
void PrintOpenings(Opening arr[], int size);

int main()
{
    Menu();
    return 0;
}

void Menu(){

    int numOpenings = 0;
    numOpenings = GetNumOpenings();
    Opening openings[numOpenings];
    ReadOpenings(openings, numOpenings);

    while(true){
        int action;
        cout<<"Print Stored Openings (1)"<<endl;
        cout<<"Load  Game   File     (2)"<<endl;
        cout<<"Exit                  (0)"<<endl<<endl;

        cout<<"Enter action:";
        cin>>action;
        cin.ignore();
        cout<<endl;
        switch(action){
        case 0:
            cout<<"Exit Selected"<<endl;
            break;
        case 1:
            PrintOpenings(openings, numOpenings);
            break;
        case 2:
            CompareOpenings(openings, numOpenings);
            break;
        default:
            cout<<"Invalid Action"<<endl;

        }
        if(action == 0)
            break;
    }
}

string GetString(){
    string filename;
    cout<<"Please enter game filename:";
    cin>>filename;
    cin.ignore();
    return filename;
}

int GetNumOpenings(){
    ifstream infile;
    infile.open("openings.txt");
    int numOpenings;
    infile>>numOpenings;
    infile.close();
    return numOpenings;
}

void CompareOpenings(Opening openings[], int numOpenings){

    //FILL IN
}

string DetectOpening(Game *game, Opening opening){

   //FILL IN
   //remove this return statement
    return " ";
}

void PrintOpenings(Opening arr[], int size){

    //FILL IN
string nameT;
string movesT[6];
string opening_countT;
double wwpT;
double dpT;
double bwpT;

cout<< left << setw(40)<<"NAME"
    << left << setw(30)<<"MOVES"
    << left << setw(30)<<"WIN PERCENTAGES"
    << left << setw(15)<<"TIMES PLAYED" << endl<<endl;
    for(int i=0; i<7; i++){
nameT = arr[i].getName();
cout <<left << setw(40)<< nameT;
cout << left <<setw(30)<< arr[i].getMoves();
wwpT = arr[i].getWWP();
cout << wwpT<<",";
dpT = arr[i].getDP();
cout <<dpT<<",";
bwpT = arr[i].getBWP();
cout <<left<< setw(30)<< bwpT;
opening_countT = arr[i].getOpening_Count();
cout<<left << setw(15)<< opening_countT<<endl;
    }
}

void ReadOpenings(Opening arr[], int size){

    //FILL IN
string nameT;
int counter;
string movesT[6] = {"","","","","",""};
string opening_countT;
double wwpT;
double dpT;
double bwpT;

 ifstream infile;
 infile.open("openings.txt");
 infile.ignore(100, '\n');
 for(int i=0; i < 7; i++){
 getline(infile, nameT);

 infile>> counter;
    for(int j=0;j<counter;j++){
    infile>>movesT[j];
        }
 infile>>opening_countT>>wwpT>>dpT>>bwpT;

 arr[i].setName(nameT);
 arr[i].setMoves(movesT);
 arr[i].setOpening_Count(opening_countT);
 arr[i].setWWP(wwpT);
 arr[i].setDP(dpT);
 arr[i].setBWP(bwpT);
 infile.ignore(100, '\n');


    }

infile.close();
}

Opening.h

#ifndef OPENING_H
#define OPENING_H
#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <array>

using namespace std;

class Opening{

    public:
    Opening(); ///constructor



    ///accessor functions
    string getName(){return name;}
    string getMoves(){return moves[6];}
    string getOpening_Count(){return opening_count;}
    double getWWP(){return white_win_percent;}
    double getDP(){return draw_percent;}
    double getBWP(){return black_win_percent;}

    ///mutator functions
    void setName(string nameT){ name = nameT;}
    void setMoves(string movesT[6]){ moves[6] = movesT[6]; }
    void setOpening_Count(string opening_countT){opening_count = opening_countT;}
    void setWWP(double wwpT){white_win_percent = wwpT;}
    void setDP( double dpT){draw_percent = dpT;}
    void setBWP(double bwpT){black_win_percent = bwpT;}


    private:
    string name;
    string moves[6];
    string opening_count;
    double white_win_percent;
    double draw_percent;
    double black_win_percent;



};




#endif // OPENING_H

Открытие. cpp

#include "Opening.h"
#include <iostream>
Opening::Opening(){

 name="";
string moves[6];
opening_count="1";
 white_win_percent = 0;
 draw_percent = 0;
 black_win_percent = 0;

}

Openings.txt

7
King's Gambit
    3
    e4 e5 f4 
    4055
    31 32 37
Italian Game
    3
    e4 e5 Bc4
    6712
    36 40 24
Bishop's Opening
    4
    e4 e5 Bc4 Nc6
    955
    39 36 26
Ruy Lopez
    5
    e4 e5 Nf3 Nc6 Bb5
    108725
    31 50 20
English Opening Anglo-Dutch Defense
    3
    c4 f5 Kc3
    1021
    37 37 26
Canard Opening
    6
    d4 Nf6 f4 d5 Nf3 Kd7
    1
    0 0 100
Zukertort Opening Sicilian Invitation
    3
    Nf3 c5 c4
    16039
    31 45 23

1 Ответ

0 голосов
/ 05 апреля 2020

Это явная ошибка

void setMoves(string movesT[6]){ moves[6] = movesT[6]; }

movesmovesT) - массивы размера 6, поэтому moves[6] - доступ к массиву вне границ, в результате чего cra sh вашей программы. Допустимые индексы для moves - от 0 до 5 включительно.

Очевидно, что вы пытаетесь скопировать весь массив, но вы должны написать al oop, чтобы сделать это (или вы можете использовать std::copy function)

void setMoves(string movesT[6]) {
    for (int i = 0 i < 6; ++i)
        moves[i] = movesT[i];
}

Кстати, у вас есть та же самая ошибка здесь

string getMoves(){return moves[6];}

, которая является неправильной по той же самой причине.

Вы должны использовать векторы вместо массивов. Они проще и мощнее, чем массивы. Массивы довольно сильно разбиты в C ++.

...