endlose Scleife!!



  • Hallo Zusammen ich schreibe an einem Programm das Opertionen der Algebra berechnen soll!
    Bei einer kleinen Methode ( int is_parallelto (line *L){ )
    die überprüft ob 2 Geraden parallel sind kommt es immer zu einer endlosen Schleife, ich finde nirgendwo ein logischer Fehler
    :

    #include <iostream>
    #include "math.h"
    
    using namespace std;
    
    class point{
       double x_hide, y_hide;
    
      public: void init (double x, double y){
        x_hide=x;
        y_hide=y;}
    
      int equal_to (point *p){
        if(p) return ((fabs(x_hide-p->x_hide)+fabs(y_hide-p->y_hide))<0.0001);
        else return -1;
      }
      double distance_to(point *p){
        if(p) return sqrt((x_hide-p->x_hide)*(x_hide-p->x_hide)+
                          (y_hide-p->y_hide)*(y_hide-p->y_hide));
            else return -1;
      }
      double x(){
        return this->x_hide;
        }
      double y(){
        return this->y_hide;
          }
    
    };
    
    class line{
      private:
      double A,B,C;
      public:
      point * top;
      point * bottom;
      line (point *M, point *N){
        top = M;
        bottom = N;
        A=(N->y()-M->y())/(N->x()-M->x());
        B=N->y()-(A*N->x());
      }
      line (double AA, double BB){
    
        A=AA;
        B=BB;
      }
      int is_parallelto (line *L){
        double m1=0, m2=0;
        m1=((this->top->y()) - (this->bottom->y()))/((this->top->x()) - (this->bottom->x()));
        m2=(L.top->y() - L.bottom->y())/(L.top->x() - L.bottom->x());
        if(fabs(fabs(m1)-fabs(m2))<0.0001)
          return 1;
          else return 0;
    }
    
      double A_out (){
        return this->A;
        }
      double B_out (){
        return this->B;
          }
    
    };
    
    class circle{
      public:
      double r;
      double x, y;
      point *middle, *Pa, *Pb;
      line *Int;
    
       circle (point *M, double radius){
        middle = M;
        x= M->x();
        y= M->y();
        r = radius;
        }
    
      circle (double x1, double y1, double radius){
      middle->init(x,y);
      x=x1;
      y=y1;
      r = radius;
        }
        ~circle(void){
        delete middle;
       }
      void print_circle (){
       cout<<'('<<middle->my_x()<<',';
       cout<<middle->my_y()<<')'<<'\n';
       cout<<this->r<<'\n';
       return;
      }
      int compute_intersection(circle *C){
    
      double A, B;
      A=-(this->x - C->x)/(this->y - C->y);            // intersection line has the equation y=Ax+B
      B=((this->r*this->r)-(C->r*C->r)+(this->x*this->x)-(C->x*C->x)+(this->y*this->y)-(C->y*C->y))/(this->y - C->y);
      //cout<<"Intersection Line y:= "<<A<<"*x + "<<B<<'\n';
      Int=new line(A,B);
      double a, b, c, delta, X1, X2, Y1, Y2;                    // ax^2+bx+c
      a=1-(2*A*y);
      b=-2*x-2*A*y+2*A*B;
      c=(x*x)-(y*y)+(B*B)-(r*r)+(2*B*y);
      delta=(b*b)-(4*a*c);
      if(delta > 0){
      X1=-(b+sqrt(delta))/(2*a);
      X2=-(b-sqrt(delta))/(2*a);
      Y1=(A*X1)+B;                              //(X1, Y1) (X2, Y2) intersection points
      Y2=(A*X2)+B;
      cout<<"Intersection points = ("<<X1<<", "<<Y1<<") and ("<<X2<<", "<<Y2<<")"<<'\n';
      Pa= new point;
      Pb= new point;
      Pa->init(X1,Y1);
      Pb->init(X2,Y2);
      Int->top= C->Pa;
      Int->bottom= C->Pb;
      return 1;
      }
      else
     return 0;
        }
    };
    
     int main (void)
    {
     point *A, *B, *C;
     A=new point;
     B=new point;
     C=new point;
    
       double x, y;
       cout<<"X und Y eingeben für A!:";
       cin >> x >> y;
       A->init(x,y);
    
       cout<<"X und Y eingeben für B!:";
       cin >> x >> y;
       B->init(x,y);
    
       cout<<"X und Y eingeben für C!:";
       cin >> x >> y;
       C->init(x,y);
    
       cout<< (A->equal_to(B)? "A und B sind gleich"   : "A und B sind nicht gleich")<<'\n';
       cout<< (B->equal_to(C)? "B und C sind gleich"   : "B und C sind nicht gleich")<<'\n';
       cout<< (A->equal_to(C)? "A und c sind gleich"   : "A und C sind nicht gleich")<<'\n';
       if (A->equal_to(B)|| B->equal_to(C) || A->equal_to(C))
         cout<<"Die Punkte dürfen nicht identisch sein";
       else
        cout<<A->distance_to(B)<<'\n';
        cout<<C->distance_to(B)<<'\n';
        cout<<A->distance_to(C)<<'\n';
    
       circle *C1, *C2, *C3;
       double r1, r2, r3;
       r1= 0.9*A->distance_to(B);
       r2= 0.9*B->distance_to(C);
       r3= 0.9*C->distance_to(A);
    
       cout<< ((r1+r2)>A->distance_to(B)? "radius OK"   : "prüfe radius es gibt keinen solchen kreis")<<'\n';
       cout<< ((r3+r2)>B->distance_to(C)? "radius OK"   : "prüfe radius es gibt keinen solchen kreis")<<'\n';
       cout<< ((r1+r3)>A->distance_to(C)? "radius Ok"   : "prüfe radius es gibt keinen solchen kreis")<<'\n';
    
       C1= new circle(A, r1);
       C2= new circle(B, r2);
       C3= new circle(C, r3);
    
       C1->print_circle();
       C2->print_circle();
       C3->print_circle();
    
       C1->compute_intersection(C2);
       C2->compute_intersection(C3);
       C3->compute_intersection(C1);
    
      C1->Int->is_parallelto(C2->Int);  //bei diesem Aufruf kommt es zu E.schleife
    }
    

    sieht hier irgendjemand einen Fehler?
    was könnte ich hier anders machen?
    Sorry bin kein alter Hase in der OOP 😞



  • Also du scheinst wohl diese Funktion zu meinen in der du eine Endlosschleife vermutest:

    int is_parallelto (line *L){
        double m1=0, m2=0;
        m1=((this->top->y()) - (this->bottom->y()))/((this->top->x()) - (this->bottom->x()));
        m2=(L.top->y() - L.bottom->y())/(L.top->x() - L.bottom->x());
        if(fabs(fabs(m1)-fabs(m2))<0.0001)
          return 1;
          else return 0;
    }
    

    Das kann schonmal nicht sein da ich hier keine einzige Schleifenanweisung sehe und auch im Rest des Quellcodes kann ich keine Schleife finden. Was passiert denn mit dem Programm? Bekommst du eine Fehlermeldung?

    Aber wenn ich das richtig sehe, gibst du deinen Speicher nicht mehr mit delete frei, den du in main zu Anfang für A-C reservierst. Ebenso den Speicher den du für C1-C3 reservierst.



  • endlosrekursion wuerd ich vermuten. geh doch mal mit nem debugger rein.



  • Habe im Code auch keine Rekursion gefunden. Allerdings finde ich den Quellcode schlecht formatiert.

    Ich habe das aber mal eben übersetzt mit g++ (gcc version 3.4.4) und den Optionen -ansi -pedantic -Wall und -Werror, dabei kam heraus das du in "int is_parallelto (line *L)" beim Zugriff mit L nicht dereferenzierst.

    m2=(L.top->y() - L.bottom->y())/(L.top->x() - L.bottom->x());
    

    muss also zu

    m2=(L->top->y() - L->bottom->y())/(L->top->x() - L->bottom->x());
    

    geändert werden.

    Desweiteren kam die Meldung das in der Funktion void print_circle () beim Zugriff auf x und y auf nicht vorhandene Funktionen zugegriffen wird:

    cout<<'('<<middle->my_x()<<',';
    cout<<middle->my_y()<<')'<<'\n';
    

    muss geändert werden zu:

    cout<<'('<<middle->x()<<',';
    cout<<middle->y()<<')'<<'\n';
    

    Ansonsten kann ich noch sagen (nach den Änderungen) das er beim Aufruf von is_parallelto nicht in eine endlosschleife oder endlosrekursion kommt, sondern mit einem "Segmentation fault (core dumped)" abbricht. Den Fehler da jetzt rauszufinden ist deine Aufgabe, ich denke ich habe da genug getan jetzt. Vor allem wenn man die Uhrzeit bedenkt. 😃



  • wenn contebral einen ordentlichen compiler benutzen wuerde, haette sich Vellas die arbeit sparen koennen...

    genereller tipp an den OP: benutz nen debugger. keine diskussionen, mach das!



  • ich bedanke mich bei allen fürdie hilfreichen Hinweise.
    Ich wüsste schon vom Anfang an wo der Fehler auftritt und zwar beim Aufruf von int is_parallelto (line *L){
    nur noch eine Frage was bedeutet Segmentation fault (core dumped)" und wie kann das vermieden werden?
    Danke im voraus!



  • Segementation fault ist eine Speicherschutzverletzung, guckst du hier:
    http://de.wikipedia.org/wiki/Segmentation_Fault
    Für mehr Infos, benutz google.



  • Du solltest vermeiden, mit uninitialisierten Pointern zu arbeiten (z.B. verlässt sich Line::is_parallelto() blind darauf, daß vorher top und bottom auf sinnvolle Werte gesetzt wurden). Außerdem sehe ich zwar einige new-Anweisungen in deinem Code, aber nur ein delete (im Circle-Destruktor).


Anmelden zum Antworten