Berechnung fehl geschlagen im String grid



  • kann mir einer Sagen wo der fehler ist bekomme nur 0 raus aus enfehrnungsberechnung

    int i=1;
    double L1,L2,B1,B2,e,r,w;
    
    for(int j=0;j<list->Count;j++)
    {
            if (list->Strings[j] == "$GPGGA")
                    {
                    //if (list->Strings[j+14] == "*") // Überprüfen ob Prüfsumme da ist
                            {
                            if (list->Strings[j+6]== "1" )//or "2" or "6")// Überprüfung der Messungsignales
                                    {
                                    SG1->RowCount= i;
                                    SG1->Cells[0][i]= list->Strings[j]; // Satzart
                                    SG1->Cells[1][i]= list->Strings[j+1];// Zeit
                                    SG1->Cells[2][i]= FloatToStr(StrToFloat(StringReplace(list->Strings[j+2],".","",TReplaceFlags() << rfReplaceAll))/1000000);//Breitengrad
                                    SG1->Cells[3][i]= FloatToStr(StrToFloat(StringReplace(list->Strings[j+4],".","",TReplaceFlags() << rfReplaceAll))/1000000);//Längengrad
                                    SG1->Cells[4][i]= list->Strings[j+6];// Qualität
                                    SG1->Cells[5][i]= list->Strings[j+7];// Sateliten
                                    SG1->Cells[6][i]= list->Strings[j+8];// HDOP
                                    SG1->Cells[7][i]= list->Strings[j+9];// NN
                                    SG1->Cells[8][i]= list->Strings[j+11];// Höhe Geo
                                    SG1->Cells[9][i]= list->Strings[j+14];// Prüfsumme
                                    if (i>1)
                                    {
                                    B1 = (StrToFloat(SG1->Cells[2][i])/1000000)  *(M_PI/180);
                                    L1 = (StrToFloat(SG1->Cells[3][i])/1000000)  *(M_PI/180);
                                    B2 = (StrToFloat(SG1->Cells[2][i-1])/1000000)*(M_PI/180);
                                    L2 = (StrToFloat(SG1->Cells[3][i-1])/1000000)*(M_PI/180);
                                             w = (acos( sin(B1) * sin(B2) + cos(B1) * cos(B2) * cos(L1 - L2) ));
                                             r=6378,3;
                                             e = r*w;
                                            SG1->Cells[10][i] =FloatToStr(e);
                                   }
                            i++;
    
                            } // Überprüfung der Messungsignales
                    }  // Überprüfen ob Prüfsumme da ist
    

    Danke für die Hilfe



  • kannste denn nicht die berechnung in ne extra-funktion auslagern und deinen code so formatieren, dass er lesbar wird? kriegt man ja augenkrebs von...

    ich kann beim besten willen nicht erkennen, wo du ne entfernungsberechnung machst und vorallem von was?



  • Mach mal aus 1000000 1000000.0 und aus 180 180.0. Es könnte sein, dass dein Kompiler hier Integer-Operationen verwendet (obwohl er das nicht sollte).
    Dann noch aus 6378,3 6378.3.



  • Hier mach ich die
    [cpp]
    [cpp]if (i>1)
    {
    B1 = (StrToFloat(SG1->Cells[2][i])/1000000) (M_PI/180);
    L1 = (StrToFloat(SG1->Cells[3][i])/1000000) (M_PI/180);
    B2 = (StrToFloat(SG1->Cells[2][i-1])/1000000)
    (M_PI/180);
    L2 = (StrToFloat(SG1->Cells[3][i-1])/1000000)
    (M_PI/180);
    w = (acos( sin(B1) * sin(B2) + cos(B1) * cos(B2) * cos(L1 - L2) ));
    r=6378,3;
    e = r*w;

    SG1->Cells[10][i] =FloatToStr(e);[/cpp]

    Cells[2] = Längengrade
    Cells[3] = Breitengrade
    der Rechner sollte mir dann immer aus einen Text die daten ziehen und dann bearbeiten



  • siehe oben
    bei r=6378,3; hat r den Wert 3. Kann sein, dass das der Fehler ist.



  • r=6378,3;
    nö das ist schon so richtig 6378,3 nach komma 3 kommt



  • mit den Punkten hat nicht geklappt

    B1 = (StrToFloat(SG1->Cells[2][i])/1000000.0)  *(M_PI/180);
                                    L1 = (StrToFloat(SG1->Cells[3][i])/1000000.0)  *(M_PI/180);
                                    B2 = (StrToFloat(SG1->Cells[2][i-1])/1000000.0)*(M_PI/180);
                                    L2 = (StrToFloat(SG1->Cells[3][i-1])/1000000.0)*(M_PI/180);
                                             w = (acos( sin(B1) * sin(B2) + cos(B1) * cos(B2) * cos(L1 - L2) ));
                                             r=6378.3;
                                             e = r*w;
                                            SG1->Cells[10][i] =FloatToStr(e);
    

    😞



  • Hier mit r=6378,3; weist du der Variablen r den Wert 3 zu und nicht, wie du vielleicht glaubst 6378.3.
    Ansonsten erzeuge erst mal double Variablen aus deinen StringGrid-Feldern und mach (wie Sunday es schon vorgeschlagen hat) eine Funktion aus deiner Berechnung. Dann geh mit dem Debugger durch.



  • aber ie denn dann ???

    6378.3 hab ich schon versucht



  • Lies noch mal. Ich habe editiert. Am wichtigsten ist das mit dem Debugger.



  • das hab ich jetzt mal ausprobiert

    B1 = StrToFloat(SG1->Cells[2][i]);
                                    L1 = StrToFloat(SG1->Cells[3][i]);
                                    B2 = StrToFloat(SG1->Cells[2][i-1]);
                                    L2 = StrToFloat(SG1->Cells[3][i-1]);
                                    B1 = (B1 /1000000.0)  *(M_PI/180.0);
                                    L1 = (L1/1000000.0)  *(M_PI/180.0);
                                    B2 = (B2/1000000.0)*(M_PI/180.0);
                                    L2 = (L2/1000000.0)*(M_PI/180.0);
                                    w = (acos( sin(B1) * sin(B2) + cos(B1) * cos(B2) * cos(L1 - L2) ));
                                     r=6378.3;
                                         e = r*w;
                                            SG1->Cells[10][i] =FloatToStr(e);
    


  • ahso klappt aber nicht ie mach ich den daraus ne funktion ?

    kann mich nicht mehr drann erinnern was wir in der schule gemacht haben peinlich peinlich 🙄



  • und?



  • ne klappt leider nicht 😕



  • vielleicht das nächste mal mitschreiben? ganz hilfreich wäre ja auch mal die formel bzw. die daten zu sehen, die deiner berechnung zu grunde liegen.

    double CalculateDistance(/* Parameterliste */)
    {
      // Berechnung durchfuehren und zurueckgeben
    }
    


  • Kann ich dir leider nicht geben wil die unsortiert in einem Txt bzw sortiert dann in einem Stringrid sind ich kann aber mal ein Bsp machen

    1 Breitengrad : 51,898422..
    1 Längengrad : 7,5682254...
    das ist L1 und B1 , B2 und L2 sehen genau so aus



  • Kann es sein, dass in den Zellen deines StringGrids auch Kommas drin sind? Ersetze die mal durch Punkte. Was soll eigentlich diese Division durch 1000000?



  • Das Problem ist ich bekomme die koordinaten mit

    Breitengrad :5189.5842
    dann suche ich den Punkt und ersetze in

    51895842 /100000 = 51,81 das ist dan rein rechnerisch so richtig

    die 51895.. sind bis dahin auch double



  • warum ersetzt du den punkt?



  • weil der so aus meinem GPS gerät kommt und das nicht ganz richtig ist vom rechnen her.

    es sind nämilch hier 51°, 5847...... deswegen muß der Punkt weg



  • 😉 Danke noch mal für die Hilfe


Anmelden zum Antworten