(Borland C++...) Problem



  • Hi.

    Hier erstmal mein Code:
    main.cpp:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "TBruch.h"
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
      TBruch Bruch1,Bruch2(2),Bruch3(3,4);
      return 0;
    }
    //---------------------------------------------------------------------------
    

    TBruch.h:

    //---------------------------------------------------------------------------
    
    #ifndef TBruchH
    #define TBruchH
    
    class TBruch
    {
    public:
      TBruch(int nenn = 1, int zaehl = 1);
    
    private:
      void __fastcall Setnenner(int value);
      int __fastcall Getnenner();
      void __fastcall Setzaehler(int value);
      int __fastcall Getzaehler();
      __property int nenner  = { read=Getnenner, write=Setnenner };
      __property int zaehler  = { read=Getzaehler, write=Setzaehler };
    };
    
    //---------------------------------------------------------------------------
    #endif
    

    TBruch.cpp:

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include "TBruch.h"
    
    //---------------------------------------------------------------------------
    
    #pragma package(smart_init)
    
    void __fastcall TBruch::Setnenner(int value)
    {
      nenner = (value == 0) ? 1 : value;
    }
    int __fastcall TBruch::Getnenner()
    {
      return nenner;
    }
    
    void __fastcall TBruch::Setzaehler(int value)
    {
      zaehler = (value == 0) ? 1 : value;
    }
    int __fastcall TBruch::Getzaehler()
    {
      return zaehler;
    }
    
    TBruch::TBruch(int nenn, int zaehl)
    {
      Setnenner(nenn);
      Setzaehler(zaehl);
    }
    

    Wenn ich kompeliere funzt das alles, aber wenn ich das PRG starte kommt eine Fehlermeldung:
    Project Bruch.exe raised exception class EStackOverflow with message 'Stack overflow'. Process stopped. Use Step or Run to continue.

    Was hat das zu bedeuten??? ICh versteh nur das ich ein Stack überlauf habe..

    Wenn ich das PRG weiter laufen lasse(continue) dann kommt diese Meldung:
    Project (Pfad zu exe) faulted with message: 'access violation at 0x004013ae: write of address 0x00030ffc'. Proccess Stopped. USe Step or Run to continue.

    Wenn ich dann immer sage continue, dann kommt die MEldung immer (immer die gleiche).

    Wie kann ich das ändern das es nicht so ist??

    thx im voraus.

    [ Dieser Beitrag wurde am 19.12.2002 um 23:20 Uhr von DJ BlackEagle editiert. ]



  • hm, vielleicht wärs besser deine objekte nicht auf den Stack, sondern auf den Heap zu legen!
    also TBruch Bruch1 = new TBruch(...);

    wo sind die Variabeln nenner und zaehler, die in TBruch.cpp verwendet werden, definiert?



  • Original erstellt von flosko:
    **hm, vielleicht wärs besser deine objekte nicht auf den Stack, sondern auf den Heap zu legen!
    also TBruch Bruch1 = new TBruch(...);

    wo sind die Variabeln nenner und zaehler, die in TBruch.cpp verwendet werden, definiert?**

    Die nimmt er sich eigentlich aus der Klasse (siehe TBruch.h).



  • Sieht mir eigentlich mehr nach VCL aus, aber naja kann sich ja auch als Allgemeines Problem herausstellen.

    Ein Stack Overflow ist einmal ganz einfach zu erklären. Der Stack ist sehr begrenzt und kann in zwei Fällen ganz leicht zu klein werden:

    1. Zu große Variablen definiert (also nicht am Heap definiert) - bei dir sicher nicht der Fall.
    2. Eine rekursive Funktion ohne Abbruchbedingung - vielleicht...

    Schau einmal ob du irgendwo so etwas in die Richtung findest; kann leicht ungewollt passieren:

    class xxx
    {
        public:
    
        xxx ( int y );
        xxx ( const xxx & rCopy );
        xxx sety ( int y );
    
        private:
    
        int itsy;
    };
    
    xxx::xxx ( int y )
    {
        sety ( y );
    }
    
    xxx::xxx ( const xxx & rCopy )
    {
    
        sety ( rCopy.y ); // Zwar dämlich, aber wenn man es einheitlich haben will...
    
    }
    
    xxx xxx::sety ( int y )
    {
        xxx oldy = *this;    // Oh, oh...da wird ja der Copy-Konstruktor aufgerufen -> der ruft hingegen wieder sety() auf, usw.
        itsy = y;
        return ( oldy );
    }
    

    Ist also ziemlich leicht ungewollt passiert so ein Stack-Overflow. Such nach solchen Elementen in deinem Code. Wenn das oben schon alles ist - hat dein Bruch keinen Copy-Konstruktor?

    BTW: Was bedeutet __property?

    MfG SideWinder

    [ Dieser Beitrag wurde am 20.12.2002 um 19:37 Uhr von SideWinder editiert. ]



  • Der Code da oben ist nur der Code, mehr gibt´s nicht.

    was __pro.. ist, KA. Ehrlich gesagt. Ich habe es mit dem Borland gemacht und den Klassen Editor genommen und der hat das hingestezt....

    Copy-Konstuktor???? Was ist das?



  • Hmm, so kann ich leider auch nichts finden. Ich verschiebe dich mal ins VCL-Forum, vielleicht hast du mit dem Klassen Editor irgendetwas falsch gemacht...

    MfG SideWinder


Anmelden zum Antworten