Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno C++ - Heap corruption detected

Ahoj! Tak jsem zase tady - posunul jsem se k práci s dynamickým polem a zkusil jsem to zkombinovat se sčítáním binárních čísel (btw je to i úkol do školy, ale základní verzi se statickými poli už jsem odevzdal :D ) - načtu řetězec, obě čísla načtu do polí, převedu pole na stejnou velikost, neinicializované buňky vyplním nulami a sčítám - program čísla sečte, jen mi vždy vyhodí hlášku "Heap corruption detected". Ať dělám, co dělám, nemůžu přijít na to, kde "hrabu" do paměti - poradíte?
Moc díky za odpovědi, Katsu ;-)

#include<iostream>
#include<string>
using namespace std;

int main(){
	string vstup;
	int a = 0;
	int max = 0; //pocet prvku ve vice inicializovanem poli 
	

	cout << "Zadejte dve binarni cisla:" << endl;
	getline(cin, vstup);
	int delka = vstup.length();

	//zjisteni delky retezcu
	int prep2 = 0;
	int delka1 = 0;
	int delka2 = 0;

	for(int i = delka - 1; i >= 0; --i){
		if(vstup[i] == ' '){
			++prep2;
			continue;
		}
		if(prep2 == 0){
			++delka1;
		}else if(prep2 == 1){
			++delka2;
		}
	}
	
	int delka3;
	if(delka1 < delka2){
		delka3 = delka2;
	}else{
		delka3 = delka1;
	}

	int *cislo1 = new int[delka3];
	int *cislo2 = new int[delka3];

	int j = 0;
	int k = 0;
	int mezera = 0;
	for(int i = delka - 1; i >= 0; --i){
		if(vstup[i] == ' '){
			++mezera;
			++a;
			continue;
		}
		if(vstup[i] == '1' || vstup[i] == '0'){
			if(a == 0){
				cislo1[j] = vstup[i]-48;
				++j;
			}else{
				cislo2[k] = vstup[i]-48;
				++k;
			}
		}else{
			cout << "Nespravny vstup." << endl;
			return 0;
		}
		if(j > max){
			max = j;
		}else if(k > max){
			max = k;
		}
	}

	int *soucet = new int[max+1];

	
	if(mezera != 1){
		cout << "Nespravny vstup." << endl;
		return 0;
	}

	//vyplneni zbytku poli 0-mi
	for(int i = j; i <= delka3; ++i){
		cislo1[i] = 0;
	}
	for(int i = k; i <= delka3; ++i){
		cislo2[i] = 0;
	}

	int bon = 0; //"bonus" pri scitani, prechazejici na dalsi pozici
	int b = 0;
	for(int i = 0; i <= max; ++i){
		if(cislo1[i] + cislo2[i] + bon == 0){
			soucet[b] = 0;
			bon = 0;
		}else if(cislo1[i] + cislo2[i] + bon == 1){
			soucet[b] = 1;
			bon = 0;
		}else if(cislo1[i] + cislo2[i] + bon == 2){
			soucet[b] = 0;
			bon = 1;
		}else if(cislo1[i] + cislo2[i] + bon == 3){
			soucet[b] = 1;
			bon = 1;
		}
		++b;
	}

	int zkouska = 0;
	cout << "Soucet: ";
	for(int i = max; i >= 0; --i){
		if(soucet[i] == 1){ //kontrola 1 mezery
		zkouska = 1;
		}
		if(zkouska == 1){
			cout << soucet[i];
		}
		if(i == 0 && zkouska == 0){
			cout << 0;
		}
	}
	cout << endl;

	delete [] cislo1;
	delete [] cislo2;
	delete [] soucet;

	return 0;
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Nemam cas to cele kontrolovat ale za prve kazde vyvojove prostredie umoznuje debugovat krok za kroko…
MM.. 16.11.2012 11:40
MM..
Jakej koncept? Chudaka jsi ho zkritizoval, pritom "do pole vyssi index jak je velikost pole" nezname…
AZOR 17.11.2012 12:47
AZOR
tym netvrdim ze mne sa to nikdy nestalo (uz sa nepamatam :D) ale ak, tak to bol pre mna alarm signal… poslední
MM.. 17.11.2012 13:13
MM..
Vies co zober ten povodny program a toto int *cislo1 = new int[delka3]; int *cislo2 = new int[delk…
MM.. 16.11.2012 21:44
MM..
Super, tebe musím někdy pozvat na pivo :D Moc díky ;-) A vyskytl se ještě jeden (a snad už poslední…
Katsushiro 16.11.2012 22:54
Katsushiro
neviem co myslis tym skolni system, ale skusal si to uz aj opravene? Pretoze ten povodny program ak…
MM.. 17.11.2012 12:44
MM..
Nakonec jsem si všiml, že u ošetření nesprávných vstupů jsem zapomněl mazat alokovanou paměť + jsem… nový
Katsushiro 17.11.2012 13:04
Katsushiro

Nemam cas to cele kontrolovat ale za prve kazde vyvojove prostredie umoznuje debugovat krok za krokom a v pripade takeho problemu by to malo zastat na tom probleme a vies si pozret premenne. Nauc sa pouzivat debugger, inac budes pri komplikovanejsich veciach uplne strateny.

Za druhe proste niekde zapisujes do pola na vyssi index jak je velkost pola. Ked sa take nieco stava tak to znamena ze mas uplne nahovno vymysleny cely koncept resp. mas v nom sam chaos (ze co je v ktorej premennej a preco, napr. mas viac premennych ktore urcuju defakto to iste a je medzi nimi nekonzistencia apod). Skus si premyslet cely koncept ze ako to urobit tak aby sa ti nestavalo ze niekam zapisujes nezmysly.

Jakej koncept? Chudaka jsi ho zkritizoval, pritom "do pole vyssi index jak je velikost pole" neznamena vsechno na prd, naopak typicky to znamena spatnou/neinicializovanou proměnnou či překlep.

Vies co zober ten povodny program a toto

	int *cislo1 = new int[delka3];
	int *cislo2 = new int[delka3];

zmen na

	int *cislo1 = new int[delka3+1];
	int *cislo2 = new int[delka3+1];

pretoze ked pises ze ti po tom zmeneni <=delka3 na <delka3 blbne najvyssia cifra tak evidentne pouzivas z tych poli asi aj ten dalsi znak ktory si tam nemal. Funguje to potom?

neviem co myslis tym skolni system, ale skusal si to uz aj opravene? Pretoze ten povodny program ak prepisal nieco mimo pola tak mohol prepisat udaje o tom poli a potom program nevie co ma vlastne uvolnit. prepisovanie mimo pola je ten najvacsi bubak ktory by ta mal strasit pri kazdom riadku :D preto na to treba mysliet a cykly robit tak aby indexy uplne nabeton nemohli prekrocit velkost pola do ktoreho zapisujem :) Alebo si urobit triedu "dyn_pole" a pristupy umoznit len cez metodu a v nej kontrolovat index.
Ak to pinda aj u opraveneho programu tak daj vediet co presne to hlasi.

Zpět do poradny Odpovědět na původní otázku Nahoru