• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed c++ wyjątek przerwanie

Object Storage Arubacloud
0 głosów
554 wizyt
pytanie zadane 18 kwietnia 2020 w C i C++ przez Bartosz Paterek Początkujący (410 p.)
zamknięte 18 kwietnia 2020 przez Bartosz Paterek

Witam, pisze chińczyka, jestem na etapie wczytywania mapy do tablicy dwuwymiarowej z pliku txt i napotkałem pewien problem. Mianowicie vs wypluwa mi błąd "Element chinese_game.exe wyzwolił punkt przerwania.: wystąpił wyjątek"
niżej ss:

oraz kod:

void Start_game::read_map()
{
	FILE* file;
	file = fopen("map.txt", "r");

	char index_map;

	int i = 0;

	do
	{
		index_map = fgetc(file);
		map[0][i] = index_map;
		cout << index_map;
		i++;
	} while (index_map != EOF);

	map[0][i + 1] = '\0';

	fclose(file);
}

 

komentarz zamknięcia: Rozwiązano błąd wczytywania pliku i ładowania zawartości do tablicy
1
komentarz 18 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
  • Jak tworzysz tą tablice map?
  • Dlaczego w C++ używasz strumieni z C?
  •  map[0][i + 1] = '\0'; <--- to + 1 jest zbędne.
komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)
Posiłkowałem się jakimś materiałem o tablicach wielowymiarowych, że jest to konieczne, po usunięciu nic się nie zmienia.
komentarz 18 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
Odpowiedz na resztę pytań.
komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)
char map[11][11];

A co do strumieni z c, to nie wiem gdzie użyłem, możliwe jestem nowy 

komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)

@j23, Natomiast jeśli wrzucę plik map.txt do folderu Debug z plikiem exe, i włączę go to wczytuje poprawnie ale
Po usnięciu enterów, ten błąd znika natomiast nadal wystepuję ten sam w vs co wczesniej

komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)

Włączyłem z Debug plik exe, błędu nie ma więc spróbowałem wypisać dane z tablicy taką metodą wiedząc ze mapa ma w sumie 121 znaków, niestety nic nie wyświetla.

1
komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
Wrzuć cały kod. Pomogę Ci
komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)
Kod ma być napisany w C czy C++ bo w kodzie mieszasz te dwa języki.
komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)

c++, wydaje mi się, że w vs nie czyt ami pliku map.txt
 

main

#include <iostream>
#include <string>
#include"Start_game.h"

using namespace std;

int main()
{
	Start_game game;
	game.get_players();
	game.entry();
	game.show_players();
	game.read_map();
	game.show_map();
}

plik klasy

#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>

using namespace std;

class Start_game
{
private:
	int players;
	string names_players[4];
	string n0;
	int n;
	char map[11][11];
public:
	void get_players();
	void entry();
	void show_players();
	void read_map();
	void show_map();
};

plik z metodami

#include "Start_game.h"
#include <iostream>
#include <string>
#include <stdio.h>
#pragma warning(disable:4996)


using namespace std;

int conv(string a) {
	int v = 0;
	for (int b = 0; b < a.length(); b++) v = v * 10 + a[b] - 48;

	return v;
}
bool isnum(string t) {
	for (int a = 0; a < t.length(); a++) {
		if (t[a] > '0' + 9 || t[a] < '0') return false;

	}
	return true;
}

void Start_game::get_players()
{
	cout << "MIN 2 | MAX 4"<<endl;
	cout << "Wprowadz ilosc graczy: ";
	getline(cin, n0);
	if (isnum(n0)) {
		n = conv(n0);
		if (n < 2 || n > 4)
		{
			system("CLS");
			cout << "Bledna ilosc graczy!" << endl;
			get_players();
		}
	}
	else
	{
		system("CLS");
		cout << "To nie liczba" << endl;
		get_players();
	}
	
}

void Start_game::entry()
{
	players = n;
	names_players[n];
	for (int i = 0; i <= n-1; i++)
	{
		cout << "Wprowadz nazwe gracza nr " << i+1 << endl;
		cin >> names_players[i];
	}
}

void Start_game::show_players()
{
	cout << "-------------------------" << endl;
	for (int i = 0; i <= n-1; i++)
	{
		cout << "Gracz nr " << i+1 << ": " << names_players[i] << endl;
	}
	cout << "-------------------------" << endl;
}

void Start_game::read_map()
{
	FILE* file;
	file = fopen("map.txt", "r");

	int index_map;

	int i = 0;

	do
	{
		index_map = fgetc(file);
		map[0][i] = index_map;
		i++;
	} while (index_map != EOF);

	fclose(file);
	string awd;
	cin >> awd; //wait for reaction
}

void Start_game::show_map()
{
	for (int i = 0; i < 121; i++)
	{
		cout << map[0][i];
	}
}

 

2 odpowiedzi

+1 głos
odpowiedź 18 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
edycja 18 kwietnia 2020 przez j23

Problem jest taki, że nie sprawdzasz, czy ilość danych nie przekracza wielkości tablicy (już nie mówiąc o sprawdzaniu tego, czy plik się otworzył).

Tak możesz zrobić:

void Start_game::read_map()
{
    char index_map;
    int i = 0, j = 0;

    std::ifstream ifs("map.txt");
    if (!ifs.is_open()) {
        return;
    }

    while (i < 11) {
        while (j < 11 && ifs.get(index_map)) {
            map[i][j++] = index_map;
        }
        ++i;
        ifs >> std::ws;
    }
}

 

1
komentarz 18 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)

A dużo lepiej według mnie będzie jak zrobisz to tak:

for(int i=0;i<11;i++)
    {
        for(int j=0;j<11;j++)
        {
            cout<<map[i][j];   
        }   
        cout<<endl;
    }

 

komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)

Okej, bardzo dziękuję, ale nadal mam cos takeigo, nie wiem czy to tablica jest zle zapisana czy w wyswietlaniu jej cos jest nie tak.

 

dla przypomnienia kod map.txt wygląda następująco:

1100222001111002720011000027200000000272000022222722222277775777722222272222200002720000000027200001100272001111002220011

 

komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)

Nie rozumiem dlaczego własnie w taki sposób jest to zapisywane

komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)

okej był tkai kod

map[i++][j++] = index_map;

co sktukowało własnie taką ukośną danych, zmieniłem to na takie coś

while (i < 11) {
		while (j < 11 && ifs.get(index_map)) {
			map[i][j++] = index_map;
		}
		ifs >> std::ws;
		i++;
	}

co skutkuje prwaidowym zapsiem danych w wieszu 0 i jedenastu następnych kolumnach natomiast nie przechodzi do następnych wierszy

komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)

Uczyniłem z kodem coś takiego:

I działa

 

Wszystkim dziękuję za pomoc

0 głosów
odpowiedź 18 kwietnia 2020 przez XxPPDKxX Obywatel (1,400 p.)
Spróbuj zmienić typ char na int (fgetc zwraca wartość EOF, która możliwe ,że nie mieści się w char). A następnie zamień sobie znowu na typ char (konwersja z int na char do mapy).
komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)
Nic nie dało.

Może jakimś innym sposobem mogę wsadzić to do tablicy map?

Nawet jeśli miałbym zrezygnować z wczytywania z pliku.
komentarz 18 kwietnia 2020 przez Bartosz Paterek Początkujący (410 p.)
Nieobsłużony wyjątek w lokalizacji 0x0FABF2F6 (ucrtbased.dll) w chinese_game.exe: Przekazano nieprawidłowy parametr do funkcji, która traktuje nieprawidłowe parametry jako błąd krytyczny.: wystąpił wyjątek

Taki błąd wyskakuję tak czy siak.

Podobne pytania

+1 głos
1 odpowiedź 195 wizyt
0 głosów
2 odpowiedzi 229 wizyt
pytanie zadane 15 października 2019 w C i C++ przez Karpik Użytkownik (680 p.)
0 głosów
0 odpowiedzi 103 wizyt
pytanie zadane 5 maja 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...