Zugriffsverletzung bei Adresse....



  • hallo
    ih bräuchte wieder mal rat wegen den funktionen. also hatte die übungsaufgabe eine funktion zu schreiben, die alle möglichen zahlenkombination ausgibt, für die a*a+b*b=c*c gilt. (pythargoräisches zahlentripel. habe das folgendermassen versucht. hier die cpp-datei:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit19.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    void __fastcall TForm19::Zahlentripel ()
    {
    
    	for (int a=1 ; a <= 50; a++) {
    		for (int b=1; b <= 50; b++) {
    		int c=b+1;
    		int d=c*c;
    		   if (d==a*a+b*b) {
    				Form19->Memo1->Lines->Add(IntToStr(d));
    		   }
    		}
    
    	}
    }
    TForm19 *Form19;
    //---------------------------------------------------------------------------
    __fastcall TForm19::TForm19(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm19::Button1Click(TObject *Sender)
    {
    Zahlentripel ();
    }
    //---------------------------------------------------------------------------
    

    und die header-datei dazu:

    //---------------------------------------------------------------------------
    
    #ifndef Unit19H
    #define Unit19H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm19 : public TForm
    {
    __published:	// IDE-managed Components
    	TButton *Button1;
    	TMemo *Memo1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// User declarations
    void __fastcall TForm19::Zahlentripel ();
    public:		// User declarations
    	__fastcall TForm19(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm19 *Form19;
    //---------------------------------------------------------------------------
    #endif
    

    leider erhalte ich folgende fehlermeldung: Zugriffsverletzung bei Adresse 00401BB0 in Modul 'Project15.exe'.
    Lesen von Adresse D6918270.

    Kann mir jemand vlt. helfen, das zu beseitigen. hab nämlich absolut keinen plan was ich falsch mache. und was hat es mit diesen adressen auf sich? habe testweise in die if-anweisung mal if c*c=a*a+b*b geschrieben, da gabs dann ne zugriffsverletzung in ner anderen adresse...
    danke schonmal für eure bemühungen



  • //---------------------------------------------------------------------------
    
    #ifndef Unit19H
    #define Unit19H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm19 : public TForm
    {
    __published:	// IDE-managed Components
    	TButton *Button1;
    	TMemo *Memo1;
    	void __fastcall Button1Click(TObject *Sender);
    private:	// User declarations
       //void __fastcall TForm19::Zahlentripel ();  // falsch
       void __fastcall Zahlentripel ();  // richtiger
    public:		// User declarations
    	__fastcall TForm19(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm19 *Form19;
    //---------------------------------------------------------------------------
    #endif
    


  • danke dir für deine schnelle antwort. habs so abgeändert, aber bekomm immer noch die selbe fehlermeldung...



  • Dann gehe bitte mit dem Debugger durch und schau nach wo die Fehlermeldung auftritt.



  • das komische ist ja! der debugger meckert nicht. das programm wird geladen aber wenn ich auf den t-button klick kommt diese fehlermeldung in so ner windows-box...



  • Hallo

    Bitte schau dir hier an, was wirklich als Debugger bezeichnet wird, und Fehler zur Laufzeit finden hilft (du meinst den Compiler, der findet aber nur Fehler zur Compiletime).

    bis bald
    akari



  • suwofis schrieb:

    das komische ist ja! der debugger meckert nicht. das programm wird geladen aber wenn ich auf den t-button klick kommt diese fehlermeldung in so ner windows-box...

    Er meint nicht den Compiler, der dir das Programm übersetzt und dir dabei eventuelle Syntax-Fehler meldet, sondern den Debugger, der dir dabei hilft, während der Laufzeit Fehler aufzuspüren. Ich kenne mich mit dem Builder nicht aus, aber du wirst irgendwo zwischen einem Release-Build und einem Debug-Build wählen können. Du erzeugst momentan wohl eine Release-Version. Wenn du dein Programm aber als Debug-Version mit dem Debugger ausführst, dann kriegst du detailliertere Infos und springst in die Zeile, in der es kracht (das muss dann nicht unbedingt die fehlerhafte Zeile sein, aber es bringt dich weiter).



  • ok konnte über diese adresse nicht viel rausfinden, da das eine war, die scheinbar nicht mit code belegt war. ausserdem hat sich der debugger in schöner regelmässigkeit aufgehängt, was die arbeit nicht grad erleichtert. naja aber ich hab dann spasseshalber die funktion mal an ne andere stelle in cpp datei geschrieben und dann gings. verstehe das wer will...



  • suwofis schrieb:

    ok konnte über diese adresse nicht viel rausfinden, da das eine war, die scheinbar nicht mit code belegt war.

    Ich vermute, dass du immer noch den Release-Build ausführst. Setz doch einfach mal einen Breakpoint in der Funktion. Hält der Debugger die Ausführung an der Stelle an?



  • Ich vermute mal es liegt daran daß erst in Zeile 25 des gezeigten Quellcodes der Formularname steht aber schon in Zeile 19 darauf zugegriffen wird, dort tritt nämlich auch der Fehler auf
    Wenn man das "Form19->" in Zeile 19 wegläßt funktionierts auch. Ist dort eh für die Katz...



  • Form19 ist aber auch im Header deklariert (extern). Daran liegt es wohl eher nicht.
    Wobei du natürlich recht hast, dass man das Form19-> weglassen kann. Schön wäre es auch Variablennamen zu verwenden, welche etwas mehr aussagen als Form19. 🙂



  • Wenn auch alle anderen 18 Forms so heißen, ist das doch einheitlich -)



  • also wenn ich in der .cpp datei die funktion deklariere muss ich immer vor dem funktionsnamen das TFormxy:: angeben, sonst bekomm ich die meldung: nicht auflösbares void __fastcall oder so ähnlich. im header jedoch muss ichs ohne dieses TForm angeben.
    ps: die variablen haben halt recht nichtssagende namen, weil sichs nur um übungsprogramme handelt...



  • Bei den Definitionen der Memberfunktionen in der cpp musst du natürlich den Klassenscope mit angeben, sonst weiß der Linker nicht, dass diese Funktionen zu deiner Klasse gehören.
    Was hat das aber jetzt mit dem Fehler und den bisherigen Antworten zu tun?


Anmelden zum Antworten