Fehler beim ausführen..Speicherstelle?

T

TwoFaze

Hallo Leute!
Lerne jetzt seiner einer Weile C/C++ und mache dementsprechend viele Übungen! Heute bin ich auf ein Problem gestoßen, bei welchem ich mir selbst mit meinen Kenntnissen nicht mehr helfen kann..darum bitte ich euch, was ist hier falsch? Beim ausführen erhalte ich die Fehlermeldung, dass ich auf den Speicher 0x000000.. zugreifen möchte und read nicht möglich ist! Ich kann mir schon vorstellen was das bedeutet, jedoch nicht wo ich den Fehler gemacht habe..ich hoffe auf Hilfe,
gruß TwoFaze!
Code:
#include <iostream.h>


extern "C" int atoi(const char*);
extern "C" int rand();


int randint(int u){
	int r = rand();
	if (r < 0) r = -r;
	return 1+r%u;
}


void error(const char *s){
	cerr << "set: " << s << '\n';
	//exit(1);
}


class intset{
	int cursize, maxsize;
	int *x;
public:
	intset(int m, int n);
	~intset();

	int member(int t) const;
	void insert(int t);

	void start(int* i) const	{ i = 0; }
	int ok(int& i) const		{ return i<cursize; }
	int next(int& i) const		{ return x[i++]; }
};


void print_in_order(intset* set);


int main(int argc, char *argv[]){
	if(argc!=3) error("two arguments expected");
	int m = atoi(argv[1]);
	int n = atoi(argv[2]);
	intset s(m,n);

	int count = 0;
	while(count < m){
		int t = randint(n);
		if (s.member(t) == 0) {
			s.insert(t);
			count++;
		}
	}

	print_in_order(&s);

	return 0;
}


intset::intset(int m, int n){
	if(m<1 || n<m) error("illegal intset size");
	cursize = 0;
	maxsize = m;
	x = new int[maxsize];
}


intset::~intset(){
	delete x;
}


void intset::insert(int t){
	if(++cursize > maxsize) error("too may elements");
	int i = cursize-1;
	x[i] = t;

	while(i>0 && x[i-1]>x[i]){
		int t = x[i];
		x[i] = x[i-1];
		x[i-1] = t;
		i--;
	}
}


int intset::member(int t) const{
	int l = 0;
	int u = cursize-1;

	while(l<=u){
		int m = (1+u)/2;
		if(t<x[m])
			u = m-1;
		else if(t>x[m])
			l = m+1;
		else
			return 1;
	}
	return 0;
}



void print_in_order(intset* set){
	int var;
	set->start(&var);
	while(set->ok(var))
		cout << set->next(var) << '\n';
}
 
Moin Moin,
Lerne jetzt seiner einer Weile C/C++ und mache dementsprechend viele Übungen!
Hier die nächste Übung für dich: Lernen sie den Umgang mit einem Debugger :-)
Nicht bös gemeint aber du kommst auf die Lösung wenn du dir das ganze mal im Debugger anschaust und dein Programm nachvoll ziehst. Ist wirklich nicht schwer.

Gruss Michael
 
Hab ich mir gedacht, dass so eine Antwort kommt, aber ist ja auch in Ordnung..
Komm leider nicht wirklich zurecht, aber dann werd ich mich wohl dahinterklemmen..
danke
 
Mal ehrlich hast du den Debugger schon genutzt? Ein Breakpoint in der ersten Zeile wird Wunder wirken...

Kleine Anmerkung noch zu deinem rand():
1) Blick in die MSDN zeigt, das rand() einen Wert zwischen 0 und RAND_MAX zurück gibt- negativ wird das ding also nicht.
2) Initialisierst du irgendwo mit srand(...)? 2er Blick in die MSDN zeigt wofür die gut ist.


P.S.: Es ist manchmal ganz nützlich zu erfahren, welchen Compiler,System... man benutzt
 
Sorry wegen der rand() Sache, hab ich nicht mitbekommen, aber tut das was zur Sache? Benutze VC++ 6 und habe auch die MSDN..nur bin es noch nicht gewohnt dort alles Nachzuschlagen sondern benutze dazu ein Buch. Gut, Debugger war bisher kein großes Thema, und irgendwann muß auch ich mit klarkommen, trotzdem komm ich momentan mit der Fehlermeldung die ich per Debugger angezeigt bekomme nicht klar! Wenn du mir noch einmal einen Tipp geben könntest wäre ich dir dankbar! Auch danke für deine Hilfe,
Gruß, TwoFaze
 
Schau dir mal die erste Zeile deiner Main() an.
Da wird toll abgefragt ob alle parameter übergeben worden sind und dann? Außer Spesen nix gewesen?
Spätestens jetzt sollte der Debugger an den Start... Wenn man ordentlich Debuggt lernt man erstens aus seinen Fehlern und sich alles Vorbeten lassen ist nicht wirklich lehrreich. Man muss schon etwas Eigeninitiative zeigen... Solltest vielleicht die Bücher nicht als Lehrbuch was deinen Lehrplan vorgibt verstehen, sondern als Nachschlagewerk, das die bei Problemen weiterhilft.

Gruss Michael
 
Code:
int main(int argc, char* argv[]){
	if(argc!=3) error("two arguments expected");
		int m = atoi(argv[1]);
		int n = atoi(argv[2]);
Du meinst weil dort das Programm trotzdem weiterläuft? Das ist irrelevant, da ich auch bei korrektem Programmaufruf MIT Argumenten diesen Fehler bekomme. Und Ziel ist es, das Programm mit den Argumenten zum laufen zu bringen, was ja mein Problem ist! Naja, genauso benutz ich die Bücher zum nachschlagen, und nehm mir immer kleine Dinge zum umsetzen vor, den wie ich lerne ist letztendlich mein Bier..aufjedenfall bekomm ich einen Fehler, ob mit oder ohnen Argumenten und ich weiß mir nicht zu Helfen..werde es weiterhin probieren..gruß!!
 
Ob es irrelevant ist oder nicht - Ordentlich ist das so nicht.

Unter idealen Bedingungen dein Anfang.
Ok
Dann schau dir mal die start Funktion an.
entweder da auch start(int &i)
oder in der Funktion (*i) = 0;

wieso weshalb warum... Das kann dir jetzt wirklich der Debugger verraten.

Gruss Michael
 
Okay, es hing wirklich mit dem Startaufruf zusammen..wie komm ich auf i? ..Schwachsinn
Ich danke dir für deine Hilfe, als dankeschön werd ich mich mal an den Debugger gewöhnen, wenn du dazu vielleicht Links hast oder mir etwas empfehlen kannst, dann lass es mich wissen ;) gruß twofaze
 
Da hilft nur lerning bei doing.

Tips:
-Breakpoints setzen mit F9
-Debuggen mit F5
-Starten ohne Debuggen mit UMSCHALT+F5
-nächste Zeile mit F10
-in Funktion mit F11

Das sollten eigentlich die wichtigsten sachen sein.

Gruss Michael
 
Zurück