C++ Run-Time Check Failure #2

Xetoxyc

Lieutenant
Registriert
Nov. 2010
Beiträge
872
Sers Leute hab mal ne Frage was an meinem code "Falsch" ist
zunächst sollte mal gesagt werden das er funktioniert und sobald ich im vs2010 nen breakpoint reinsetze tritt der fehler auch nichtmehr auf
nur wenn ich eben ohne breakpoint starte.

Debug-Modus-Fehlermeldung:
Code:
Run-Time Check Failure #2 - Stack around the variable 'arrValueFind' was corrupted.

Release-Modus-Fehlermeldung:
Code:
Unbehandelte Ausnahme bei 0x009e15e0 in test1.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000009.


Auf die main und so verzicht ich hier mal da diese wunderbar funktioniert und nicht relevant ist.
Code:
const int nArrShownFive_Length = 5;
const int nArrValues_Length = 100;
int arrValues[nArrValues_Length];   // Komplett mit randomzahlen gefüllt

void Show_TimesShown_Added()
{
	int arrTimesFind[5];
	int arrValueFind[5];
	for (int a = 0 ; a < nArrShownFive_Length; a += 1)
	{
		arrTimesFind[a] = -1;
		arrValueFind[a] = -1;
	}
	
	for (int a = 0; a < nArrValues_Length; a += 1)
	{
		[U][B]int nTmpValue = arrValues[a];[/B][/U]  // Hier der StopPoint beim Release Modus
		int nTmpTimesShown = 0;		
		
		for (int b = 0; b < nArrValues_Length; b += 1)
		{
			if(nTmpValue == arrValues[b])
			{
				nTmpTimesShown += 1;
			}
		}
		
		bool boolAlreadyGotActValue = false;
		for (int b = 0; b < nArrShownFive_Length; b += 1)
		{			
			if(nTmpValue == arrValueFind[b])
			{
				boolAlreadyGotActValue = true;
			}			
		}
		
		if (!boolAlreadyGotActValue)
		{
			bool boolHaveFreePlace = false;
			for (int b = 0; b < nArrShownFive_Length; b += 1)
			{
				if(arrValueFind[b] == -1)
				{
					boolHaveFreePlace = true;
					arrTimesFind[b] = nTmpTimesShown;
					arrValueFind[b] = nTmpValue;
					b = nArrShownFive_Length;		
				}
			}
			
			if(!boolHaveFreePlace)
			{
				bool boolGotHigherTimesShownValue = false;
				
				for (int b = 0; b < nArrShownFive_Length; b += 1)
				{
					if(nTmpTimesShown > arrTimesFind[b])
					{
						boolGotHigherTimesShownValue = true;
					}
				}
				
				if(boolGotHigherTimesShownValue)
				{
					int nLowestElementNumber = -1;
					int nTmpLowestTimesShown = arrTimesFind[0];
					
					for (int b = 0; b < nArrShownFive_Length; b += 1)
					{
						if(arrTimesFind[b] < nTmpLowestTimesShown)
						{
							nTmpLowestTimesShown = arrTimesFind[b];
							nLowestElementNumber = b;
						}
					}
					
					arrTimesFind[nLowestElementNumber] = nTmpTimesShown ;
					arrValueFind[nLowestElementNumber] = nTmpValue;
				}
			}
		}
	}

	for (int a = 0; a < nArrShownFive_Length; a += 1)
	{
		int nTmpTimes;
		int nTmpValue;
		for(int b = 1; b < nArrShownFive_Length; b +=1)
		{
			if (arrTimesFind[b] > arrTimesFind[b-1])
			{
				nTmpTimes = arrTimesFind[b];
				arrTimesFind[b]=arrTimesFind[b-1];
				arrTimesFind[b-1] = nTmpTimes;

				nTmpValue = arrValueFind[b];
				arrValueFind[b]=arrValueFind[b-1];
				arrValueFind[b-1] = nTmpValue;
			}
		}
	}	

	for (int a = 0; a < nArrShownFive_Length; a += 1)
	{
		cout << "Die " << a+1 << ". haefigste Zahl ist " << arrValueFind[a] << " sie kommt " << arrTimesFind[a] << " mal vor!" << endl;
	}
}


so und hier nochmal den kompletten code für diejenigen dies ausprobieren wollen
einfach leeres c++ Projekt erstellen und eine cpp anlegen
Code:
#include <iostream>
#include <time.h>
using namespace std;

const int nArrValues_Length = 100;
const int nArrShownFive_Length = 5;
int arrValues[nArrValues_Length];

void Show_Values();
void Show_Minimum();
void Show_Maximum();
void Do_Show_Middle(); 
void Show_TimesShown();
void Do_BubbleSort();
void Show_TimesShown_Added();

int main()
{	
	srand((unsigned) time(NULL)); 
	
	for( int a = 0; a < nArrValues_Length; a += 1)
	{
		arrValues[a] = rand() % 10+1;
	}

	int nChoose = -1;
	while (nChoose != 0)
	{
		cout << "MENU" << endl;
		cout << "0 --> ENDE" << endl;
		cout << "1 --> Messwerte anzeigen" << endl;
		cout << "2 --> Minimum" << endl;
		cout << "3 --> Maximum" << endl;
		cout << "4 --> Mittelwert" << endl;
		cout << "5 --> Haeufigste Zahl" << endl;
		cout << "6 --> Haeufigste Zahl Extreme" << endl;
		cout << "7 --> Sortieren" << endl;
		cout << "Auswahl: "; cin >> nChoose;
		
		while (nChoose > 7 || nChoose < 0)
		{
			cout << "Ungültige Auswahl!";
			cout << "Wert erneut eingeben: "; cin >> nChoose;
		}

		cout << endl << endl;

		switch (nChoose)
		{
			case (0):
			{
				return 0;
				break;
			}

			case (1):
			{
				Show_Values();
				break;
			}

			case (2):
			{
				Show_Minimum();
				break;
			}

			case (3):
			{
				Show_Maximum();
				break;
			}

			case (4):
			{
				Do_Show_Middle();
				break;
			}

			case (5):
			{
				Show_TimesShown();
				break;
			}

			case (6):
			{
				Show_TimesShown_Added();
				break;
			}
			
			case (7):
			{
				Do_BubbleSort();
				break;
			}
		}
		cout << endl << endl;
	}
}

void Show_Values()
{	
	for(int a = 0 ; a < nArrValues_Length; a += 1)
	{
		if (a > 0 && a % 20 == 0)
		{
			cout << endl;
		}
		
		cout << " ";
		if (arrValues[a] < 10)
		{
			cout << "  " << arrValues[a];
		}
		else if (arrValues[a] < 100)
		{
			cout << " " << arrValues[a];
		}
		else if (arrValues[a] < 1000)
		{
			cout << "" << arrValues[a];
		}
		else
		{
			cout << arrValues[a];
		}
	}
}

void Show_Minimum()
{	
	int nMin = arrValues[0];
	for (int a = 0; a < nArrValues_Length; a += 1)
	{
		if(arrValues[a] < nMin)
		{
			nMin = arrValues[a];
		}
	}	
	cout << "Minimum: " << nMin;
}

void Show_Maximum()
{	
	int nMax = arrValues[0];
	for (int a = 0; a < nArrValues_Length; a += 1)
	{
		if(arrValues[a] > nMax)
		{
			nMax = arrValues[a];
		}
	}
	cout << "Maximum: " << nMax;
}

void Do_Show_Middle()
{
	int nSum = 0;
	for (int a = 0; a < nArrValues_Length; a += 1)
	{
		nSum += arrValues[a];
	}
	cout << "Mittelwert: " << nSum/nArrValues_Length;
}

void Show_TimesShown()
{
	int nMostValue = -1;
	int nTimesShown = -1;
	for (int a = 0; a < nArrValues_Length; a += 1)
	{
		int tmpNMostValue = arrValues[a];
		int tmpNTimesShown = 0;

		for (int b = 0; b < nArrValues_Length; b += 1)
		{
			if (arrValues[a] == arrValues[b])
			{
				tmpNTimesShown += 1;
			}
		}

		if (tmpNTimesShown > nTimesShown)
		{
			nTimesShown = tmpNTimesShown;
			nMostValue = tmpNMostValue;
		}
	} 
	cout << "Haufigste Zahl: " << nMostValue; cout << endl;
	cout << "Anzahl der Haufigkeit: " <<nTimesShown ; cout << endl;
}

void Do_BubbleSort()
{
	for (int a = 0; a < nArrValues_Length; a += 1)
	{
		int nTmp;
		for(int b = 1; b < nArrValues_Length; b +=1)
		{
			if (arrValues[b] < arrValues[b-1])
			{
				nTmp = arrValues[b];
				arrValues[b]=arrValues[b-1];
				arrValues[b-1] = nTmp;
			}
		}
	}	
}

void Show_TimesShown_Added()
{
	int arrTimesFind[5];
	int arrValueFind[5];
	for (int a = 0 ; a < nArrShownFive_Length; a += 1)
	{
		arrTimesFind[a] = -1;
		arrValueFind[a] = -1;
	}
	
	for (int a = 0; a < nArrValues_Length; a += 1)
	{
		int nTmpValue = arrValues[a];
		int nTmpTimesShown = 0;		
		
		for (int b = 0; b < nArrValues_Length; b += 1)
		{
			if(nTmpValue == arrValues[b])
			{
				nTmpTimesShown += 1;
			}
		}
		
		bool boolAlreadyGotActValue = false;
		for (int b = 0; b < nArrShownFive_Length; b += 1)
		{			
			if(nTmpValue == arrValueFind[b])
			{
				boolAlreadyGotActValue = true;
			}			
		}
		
		if (!boolAlreadyGotActValue)
		{
			bool boolHaveFreePlace = false;
			for (int b = 0; b < nArrShownFive_Length; b += 1)
			{
				if(arrValueFind[b] == -1)
				{
					boolHaveFreePlace = true;
					arrTimesFind[b] = nTmpTimesShown;
					arrValueFind[b] = nTmpValue;
					b = nArrShownFive_Length;		
				}
			}
			
			if(!boolHaveFreePlace)
			{
				bool boolGotHigherTimesShownValue = false;
				
				for (int b = 0; b < nArrShownFive_Length; b += 1)
				{
					if(nTmpTimesShown > arrTimesFind[b])
					{
						boolGotHigherTimesShownValue = true;
					}
				}
				
				if(boolGotHigherTimesShownValue)
				{
					int nLowestElementNumber = -1;
					int nTmpLowestTimesShown = arrTimesFind[0];
					
					for (int b = 0; b < nArrShownFive_Length; b += 1)
					{
						if(arrTimesFind[b] < nTmpLowestTimesShown)
						{
							nTmpLowestTimesShown = arrTimesFind[b];
							nLowestElementNumber = b;
						}
					}
					
					arrTimesFind[nLowestElementNumber] = nTmpTimesShown ;
					arrValueFind[nLowestElementNumber] = nTmpValue;
				}
			}
		}
	}

	for (int a = 0; a < nArrShownFive_Length; a += 1)
	{
		int nTmpTimes;
		int nTmpValue;
		for(int b = 1; b < nArrShownFive_Length; b +=1)
		{
			if (arrTimesFind[b] > arrTimesFind[b-1])
			{
				nTmpTimes = arrTimesFind[b];
				arrTimesFind[b]=arrTimesFind[b-1];
				arrTimesFind[b-1] = nTmpTimes;

				nTmpValue = arrValueFind[b];
				arrValueFind[b]=arrValueFind[b-1];
				arrValueFind[b-1] = nTmpValue;
			}
		}
	}	

	for (int a = 0; a < nArrShownFive_Length; a += 1)
	{
		cout << "Die " << a+1 << ". haefigste Zahl ist " << arrValueFind[a] << " sie kommt " << arrTimesFind[a] << " mal vor!" << endl;
	}
}
 
kann es sein, dass bei "int nTmpValue = arrValues[a];" arrValues[a] einfach keinen Wert hat?

Die Variable ist ja nur angelegt und noch nicht mit nem Wert belegt worden, oder? o.O
 
schau dir mal den unteren code an ganz oben in der main wird arrValues mit randomwerten befüllt somit sollte eigentlich in allen etwas drinstehn^^
wenn ich nen breakpoint setzt steht auch in allen was drinnen also daran kann es nicht liegen =/

das der speicher nicht belegt ist sollte die fehlermeldung eigentlich heißen jedoch läuft a ja nur bis 99 und da für das element 99 wurde ja speicher reserviert und initialisiert mit einer random zahl
 
Code:
int nLowestElementNumber = [COLOR="Red"]-1[/COLOR];
int nTmpLowestTimesShown = arrTimesFind[0];
				
for (int b = 0; b < nArrShownFive_Length; b += 1)
{
	if(arrTimesFind[b] < nTmpLowestTimesShown)
	{
		nTmpLowestTimesShown = arrTimesFind[b];
		nLowestElementNumber = b;
	}
}
					
arrTimesFind[nLowestElementNumber] = nTmpTimesShown ;
arrValueFind[nLowestElementNumber] = nTmpValue;
 
DANKE
omfg
dummer fehler xD
hab den nTmpLowestTmesShown falsch gesetzt da wenn er ja der gleiche wie arrTimesShown ist ändert sich element 0 nichtmehr xD

wurde nun gefixt und jetzt läuft es einwandfrei

Code:
int nLowestElementNumber = -1;
int nTmpLowestTimesShown = nArrValues_Length+1;

for (int b = 0; b < nArrShownFive_Length; b += 1)
{
	if(arrTimesFind[b] < nTmpLowestTimesShown)
	{
		nTmpLowestTimesShown = arrTimesFind[b];
		nLowestElementNumber = b;
	}
}
		
arrTimesFind[nLowestElementNumber] = nTmpTimesShown ;
arrValueFind[nLowestElementNumber] = nTmpValue;
 
Zuletzt bearbeitet:
Ich kann dir nicht garantieren, dass das wirklich das Problem ist, aber es sieht sehr gefährlich aus. Wenn du "nTmpLowestTimesShown" schon mit "arrTimesFind[0];" initialisierst, so sollte auch "nLowestElementNumber" mit 0 und nicht mit -1 initialisiert werden.

EDIT: Deine aktuelle Lösung wird auch nur funktionieren, wenn keine Zahlen größer "nArrValues_Length" in "arrTimesFind" stehen können.
 
Zuletzt bearbeitet:
Übrigens ...

Code:
// Jedes Element wird mit 0 initialisiert.
int myArray[ 200 ] = {};

Oh, und deine for-Schleifen sehen ungwöhnlich aus. b += 1 ist zwahr nicht falsch, aber warum nicht einfach ++b? :)


Und noch was ...

Code:
int arrValues[nArrValues_Length];   // Komplett mit randomzahlen gefüllt

Sicher?? Ich meine, bei globalen Arrays wird jedes Element mit 0 initialisiert.
 
@antred
des mit dem b++ is schon richitg ich schrieb nur lieber b += 1

und es ist nicht mit 0 initialisiert sondern ich befüll es ja ganz am anfang der main() mit random zahlen

@Simpson
kann ja keine größere zahl vorkommen da ja eine zahl nicht öfters gefunden werden kann als das array groß is ;P
 
Zurück
Oben