Mam program z algorytmem, który ma wczytywać dane z pliku. W czasie kompilacji nie ma błędów ani ostrzeżeń, jednak w trakcie pojawia się błąd "naruszenia ochrony pamięci".
#include <cstdio>
#include <cstring>
#include <queue>
#include <stdlib.h>
#include <fstream>
#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
// Mężczyźni i kobiety są reprezentowani przez liczby całkowite 1 ... N
// PrefM to lista preferencji wszystkich mężczyzn do wszystkich kobiet.
// PrefM[m][i] = k jeśli k jest na i-tej pozycji na liście preferencji m
// PrefK to lista preferencji wszystkich kobiet do wszystkich mężczyzn.
// PrefK[k][i] = m jeśli m jest na i-tej pozycji na liście preferencji k
// Ranking podaje ranking każdego mężczyzny na liście preferencji każdej kobiety
// Ranking[k][m] = i jeśli PrefK [k] [i] = m
// Partner daje bieżący "związek" każdej kobiety
// Partner[k] = m jeśli k jest obecnie związana z m
// Next podaje indeks następnej kobiety, której ma się oświadczyć wg listy preferencji każdego mężczyzny
// Next[m] = i jeśli m oświadczył się wszystkim k oraz PrefM[m][j] = k dla j = 1 ... i-1, ale nie PrefM[m][i]
int Ranking[505][505], PrefM[505][505], PrefK[505][505], Next[505], Partner[505];
int T, N, i, j, m, k;
queue <int> WolniM; //Wolni mężczyźni
void wczytaj() {
string filename = "plik.txt";
ifstream file;
file.open(filename.c_str());
string s;
getline(file, s);
stringstream ss(s);
ss.str(s);
ss.clear();
ss >> N;
for (i = 1; i <= N; i++) {
//k=i; //scanf("%d", &k);
//printf("Preferencje kobiety nr %d:\n", i);
for (j = 1; j <= N; j++)
//scanf("%d", &PrefK[i][j]);
getline(file, s);
ss.str(s);
ss.clear();
ss >> PrefK[i][j] >> PrefM[i][j];
}
file.close();
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
Ranking[i][PrefK[i][j]] = j;
memset(Partner, 0, N * sizeof(int));
for (i = 1; i <= N; i++) {
WolniM.push(i);
Next[i] = 1;
}
}
void algorytm0 () {
while (!WolniM.empty()) {
m = WolniM.front();
//printf("\nm=%d Next[m]=%d\n", m, Next[m]);
k = PrefM[m][Next[m]++];
//printf("k=%d Next[m]=%d\n", k, Next[m]);
if (Partner[k] == 0) {
Partner[k] = m;
WolniM.pop();
} else if (Ranking[k][m] < Ranking[k][Partner[k]]) {
WolniM.pop();
WolniM.push(Partner[k]);
Partner[k] = m;
}
}
}
void wypisz() {
printf("\nDobrane pary (m, k):\n");
for (k = 1; k <= N; k++)
printf("%d, %d\n", Partner[k], k);
}
int main() {
printf("Liczba testow: ");
scanf("%d", &T);
while (T--) {
wczytaj();
algorytm0();
wypisz();
}
system("pause");
return 0;
}
Pewnie jest coś nie tak z tym fragmentem funkcji wczytaj():
string filename = "plik.txt";
ifstream file;
file.open(filename.c_str());
string s;
getline(file, s);
stringstream ss(s);
ss.str(s);
ss.clear();
ss >> N;
for (i = 1; i <= N; i++) {
//k=i; //scanf("%d", &k);
//printf("Preferencje kobiety nr %d:\n", i);
for (j = 1; j <= N; j++)
//scanf("%d", &PrefK[i][j]);
getline(file, s);
ss.str(s);
ss.clear();
ss >> PrefK[i][j] >> PrefM[i][j];
}
file.close();
Zauważyłem, że błąd pojawia się gdzieś mniej więcej po tym fragmencie i wczytywane dane nie są zgodne z plikiem.
plik.txt wygląda tak:
10
2 1
1 2
4 3
3 4
6 5
5 6
8 7
7 8
10 9
9 10
Bardzo proszę o pomoc :)