[C++] Anfängerproblem mit Zeigern

d4ex

Grünschnabel
Hallo zusammen!

Um mich endlich mal mit C++ zu beschäftigen habe ich damit angefangen einige Algorithmen die wir auf der Uni in java geschrieben haben in C++ zu schreiben...
Da ich mich nicht wirklich gut mit Zeigern auskenne und mich gerade erst angefangen habe damit zu beschäfftigen haben wir hier schon das erste Problem!

Hier erstmal der Code :)
Code:
//CMaximumSort.hpp
#ifndef CMAXIMUMSORT_HPP
#define CMAXIMUMSORT_HPP

class CMaximumSort
{
public:
	CMaximumSort();

	char test();
	//Sort (Maximum_sort)
	void sort( int* arr, int n );
private:	
	//returns maximum index
	int search_max_index( int* arr, int n );
};

#endif CMAXIMUMSORT_HPP
Code:
//MaximumSort.cpp
#include "CMaximumSort.hpp"

CMaximumSort::CMaximumSort()
{

}//end of Constructor

//n=Array length
int CMaximumSort::search_max_index( int* arr, int n )
{
	int max_index = 0;
	int i = 0;

	while( i < n )
	{
		if( arr[i] > arr[max_index] )
			max_index = i;
		i++;
	}

	return max_index;
} // end of max search

//n=Array length 
void CMaximumSort::sort( int* arr, int n )
{
	//Temp int for swap Operation
	int tmp = 0;
	//maximum index
	int i = 0;

	while( n > i )
	{
		i = search_max_index( arr, n );
		tmp = arr[i];
		arr[i] = arr[n];
		arr[n] = tmp;
		n--;
	}

} // end of sort
Code:
//Main
#include <iostream>
#include "CMaximumsort.hpp"

using namespace std;

int main()
{
	int arr[]  = {5, 4, 2, 4, 2, 7, 3, 1, 33, 22, 11};
	//Pointer
	int *zarr = arr;

	//output
	for( int i=0; i<11; i++ )
	{
		cout << arr[i] << " ";
	}

	cout << endl;
	
	//Sort
	CMaximumSort* CMaxSort = NULL;
	CMaxSort = new CMaximumSort();
	CMaxSort->sort( arr, 11 );

	//output after Sort
	for( int i=0; i<11; i++ )
	{
		cout << arr[i] << " ";
	}


	//delete
	CMaxSort = NULL;
	zarr = NULL;
	delete CMaxSort;
	delete zarr;
}

So das ist ein Simpler Algorithmus der Sucht den Index des Größten Elements und tauscht das Element mit dem letzten. Die länge des Arrays verrringert sich dann immer weiter.
Problem:
Array vor sort:
5 4 2 4 2 7 3 1 33 22 11
Nach sort:
5 4 2 4 2 7 3 1 -858993460 11 22

Diese große Negative Zahl kann doch nur bedeuten das da was mit den Adressen schiefgelaufen ist :P wenn jemand weiß wo das Problem ist wäre super. Ich tippe auf ein Pointer Problem nur wo das ist...?

Danke für die Hilfe

Matthias
 
Zuletzt bearbeitet:
Hallo,

es könnte hirran liegen:

C++:
while( i <= n )
{
	if( arr[i] > arr[max_index] )
		max_index = i;
	i++;
}

du sollte nur stehen i < n nicht i <= n da i sonst auch den Wert n haben kann.
Und der Index des letzten Elements im Array ist (Anzahl Elemenete - 1).

Gruß
Anfänger
 
Zuletzt bearbeitet von einem Moderator:
Du hattest recht das war ein Fehler... bin es halt gewohnt das ich ne IndexOutofBounds-Exception bekomme :)
Aber das hat das Problem nicht behoben...
Hab nun aber nach bissel rumgefummel eine Fehlermeldung bekommen:
Code:
Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted.

*edit*
Ich bin gerade dran mit dem Debugger die Variablen auszulesen, blicke aber noch nicht ganz durch... mal schauen was sich ergibt.
Falls wer noch ne Idee hat bitte melden!

Komisch ist ja auch das die 33 als größte Zahl irgendwie "kaputt" ist und dann die letzten beiden Zahlen vertauscht sind (Siehe Ausgabe)...
 
Zuletzt bearbeitet:
Hi.
Code:
	//delete
	CMaxSort = NULL;
	zarr = NULL;
	delete CMaxSort;
	delete zarr;
}
In dieser Reihenfolge sind die Anweisungen relativ sinnfrei. Wenn du die Zeiger auf NULL setzt (in C++ nimmt man statt NULL lieber 0), dann kannst du danach den Speicher nicht mehr freigeben - du hast ja gar nicht mehr die Information welcher Speicherblock (welche Adresse) freigegeben werden soll.

Dann versuchst du den Zeiger zarr freizugeben. Dieser zeigt allerdings auf ein Objekt welches du gar nicht mit new/new[] angelegt hast. zarr zeigt auf das Array arr welches auf dem Stack angelegt wurde. In diesem Fall hast du Glück das du den Zeiger vorher auf NULL gesetzt hast, dann passiert da auch nichts weiter.

Außerdem ist es nicht notwendig alle Objekte dynamisch mit new auf dem Heap anzulegen. Das ist sicherlich eine Angewohnheit von Java, die in C++ den Nachteil hat das man sich selbst um das Aufräumen kümmern muss.

Der Fehler liegt immer noch daran, das du über die Arraygrenze hinweg zugreifst, da du array[n] nutzt welches es nicht gibt (für n = 11). Dann müßtest du das ganze Array sortieren und nicht nur bis zufällig ein Maximum auf der richtigen Position ist.

Gruß
 
Zuletzt bearbeitet:
Danke für die Hilfe!
Du hattest recht ich habe ja die 11 an die Methode übergeben und a[11] gibts ja nicht :P Das Object CMaxSort habe ich nur testweise auf dem Heap erzeugt das es auch ohne "new" geht war mir bekannt, hab halt nur ein wenig rumgespielt :)
Mit dem "delete" das werd ich mir merken man kann ja schlecht nen Zeiger löschen der auf Null zeigt!
Mal wieder was gelernt!
Danke Danke!
 
Zurück