Calloc bricht unerwartet ab...



  • Servus,

    also ich habe eine Routine geschrieben, die eigentlich stabil ist, aber unter bestimmten Konfigurationen, bricht mir das Calloc unerwartet ab. Nichtmal einen Nullpointer erhalte ich, sondern direkt Totalausstieg ?!

    class MyClass
    	{
    		double *Qube;
    
    		void Run();
    		void TmpQube(int x, int y, int z);
    	}
    
    void MyClass:Run()
    	{
    		Qube=(double *)calloc(1,sizeof(double));
    		Qube[0]=1.;
    
    		for(i=0;i<Ende;i++)
    			{
    				/*
    				tut etwas
    				*/
    
    				TmpQube(x,y,z);
    			}
    	}
    
    void MyClass::TmpQube(int x, int y, int z)
    	{
    		int Elements=0;
    
    		free(Qube);
    		// oder Qube=NULL;
    		Elements=x*y*z;
    
    		Qube=(double *)calloc(Elements,sizeof(double)); 
    // Hier bricht er nach dem zweiten for Schleifen Durchlauf ab 
    // Aber nur unter bestimmten Bedingungen, die aus meiner Sicht sauber sind
    
    		/*
    		tut etwas mit Qube
    		*/
    	}
    

    Nun jetzt denkt jeder, höö, Ansi C in C++, naja... ich nutze die Kapselung aus C++ sonst reinen Ansi C. Vielleicht nicht sauber... vielleicht auch der Grund.

    Jemand eine Idee woran der Calloc abbricht ?

    Winn



  • Hi,

    da bin ich mal neugierig, was denn für eine for-schleife? Ich glaub fast, Dein Prob liegt woanders.

    Nur Mal so aus Neugier. Ansi-C in Klassen verpackt? das macht kein Sinn, spätestens wenn Du aufm Heap mit malloc eine Instanz Deiner Klasse anlegen willst gibts Ärger. Ausserdem wär ein std::vector<double> für Dein Qube doch gut geeignet.

    grüße Con@n



  • @conan
    Schau dir mal MyClass:Run() an ;), da findest du deine for :D.

    @winn
    Ich beantworte dein Problem mit einer Frage:

    Was steht in x, y und z beim Aufruf in Run()??



  • Hmm, das kommt davon, wenn man am Blindfischsyndrom leidet 😃

    grüße Con@n



  • «Totalausstieg» == Absturz?

    Die Heapfunktionen verweigern ganz gern mal den Dienst, wenn man ihnen ins Handwerk pfuscht, d.h. z.B. über Arraygrenzen hinausschreibt. Klopf dein Programm mal darauf ab. BTW: Was hat das im C-Forum zu suchen?



  • BTW: Was hat das im C-Forum zu suchen?

    Hmm, weil es halt ein Mix ist... hauptsächlich ist es C-Syntax, daß in einem C++ Kleid arbeitet... es gibt keine Vererbung oder sonstiges. Ich benutze das Klassenkonzept nur aus Gründen der Kapselung. Wenn's dennoch falsch ist, dann verschieb es bitte... vermute auch das es eher etwas an der Kapselung zu tun... dazu jetzt.

    Was steht in x, y und z beim Aufruf in Run()??

    x,y,z sind reine Integergrößen und bewegen sich in einem Rahmen von 0 bis 4, nie mehr !!

    Fehler eingegrenzt
    Also inzwischen liegt der Abbruch nicht mehr im Calloc, weil ich die Routinen entsprechend umgeschrieben habe. Dennoch tritt der Abbruch nur bei bestimmten Konfigurationen auf. Außerdem habe ich meinen Quellcode inzwischen mit g++, MV6++ (Stufe 4) und Metroworks kompiliert und alle Syntaxfehler die irgendwie noch anstanden eliminiert. Einmal auf dem PC und einmal unterm Mac. Der Fehler tritt nur in dieser einen Konfiguration ein. Mit all den Veränderungen die ich bisher vorgenommen habe, immer noch der gleiche Abbruch.

    Fehlerbeschreibung
    Also noch all den Änderungen, tritt der Fehler genau an einer Stelle auf und immer nur in dieser einen Konfiguration. MyClass wird von einer anderen Klasse (sagen wir MasterClass) instanziiert und mittels Run() ausgeführt. Beim Rücksprung von MyClass in die MasterClass erhalte ich eine Speicherschutzverletzung. D.h. ich vermute das ich irgendeinen generellen Syntaktischen Fehler innerhalb der C++ Kapselung begangen habe, denn drei Compiler und immer noch der gleiche Fehler spricht dafür, daß ich hier die Fehler begehe 😞

    Was mach ich falsch ? 😕

    Winn

    @Bashar: Denke im C++ Forum ist's jetzt besser aufgehoben, konnt ich vorher aber nicht abschätzen...

    Nochmal zum Aufbau:Jede Klasse hat eine eigene Headerdatei und cpp Datei.

    class Master
    	{
    		public:
    			Master();
    			~Master();
    
    			void Delegate();
    	}
    
    void Master::Run()
    	{
    		MyClass DoIT
    
    		DoIT.Delegate();
    		// Beim Rücksprung bricht er mir hier ab und springt in die Alloc.h ...
    	}
    

    Und dann

    class MyClass
    	{
    		public:
    			MyClass();
    			~MyClass();
    
    			void Delegate();
    			void GiveTheWorkToSomebody();
    	}
    
    void MyClass::Delegate()
    	{
    		// Tu dies
    		// Tu das
    		GiveTheWorkToSomebody();
    	}
    
    void MyClass::GiveTheWorkToSomebody()
    	{
    		// Jetzt wird gerackert
    	}
    


  • Muss man Methoden der eigenen Klasse in der selbigen Klasse nicht mit this. aufrufen? Oder war das nur bei Java so?

    Ich glaube nicht, dass es an deinem Klassenaufbau hängt, sondern eher, dass du in deiner Methode GiveTheWorkToSomebody() Speicher überschreibst, der nicht von deinen Variablen reserviert ist. Zeig mal was die Methode macht.



  • Nun das ist ein wenig kompliziert es kurz zu sagen, in der Methode "GiveTheWorkToSomebody" habe ich eine for schleife in denen achte schleifen sind, in welchen wieder jeweils eine hängt. Abgedeckt wird damit ein Würfel der durch die acht Unter For Schleifen in 8 gleichgroße Würfel zerlegt wird. Jede Unterkomponente des Unterwürfels bildet durch die darunterliegende For Schleife wieder einen kleinen Teilwürfel ab, der in Bezug zum Gesamtwürfel steht. Source der For Schleife enthält schon 300 Zeilen die ohne die anderen 3000 nicht lauffähig sind.

    Ich überprüfe nochmal alles nach dem Speicherüberlauf, hört sich auch ganz danach an... hab den Source inzwischen noch von einem vierten Compiler getestet und es kann kein syntaktischer Fehler mehr sein, wird wohl eher... naja... grumpf... das wird Arbeit das For Schleifen Monster nach Überläufen abzuklopfen.

    Winn

    1.st EDIT:Es ist ein Speicherüberlauf... naja, jetzt weiß ich ja was ich zu tun hab... Besten Dank nochmal.

    2.nd EDIT: Also den Speicherüberlauf habe ich eliminiert und habe meine Arrays noch durch eine Modulo Operation vor Überlauf geschützt. Dennoch bricht mir jetzt wieder mein Calloc an der gleichen Stelle wie am Anfang ab ?! Hat jemand eine Idee ?? 😕


Anmelden zum Antworten