Daten verschwinden, es ist zum Verzweifeln!



  • Meine struktur:

    struct gcode_datensatz
    {
    char teilkreis_unten[80];
    char teilkreis_oben[80];
    char anfahrbogen[40];
    char wegfahrbogen[40];
    char startpunkt[40];
    float x;
    float y;
    float z;
    float i;
    float j;
    int position;
    };

    bearbeite ich mit:

    /* Dabei ist runden eine Nachkomma-Rundungsroutine. Nämlich:

    float runden(float x, int anzahl_nachkommastellen)
    {
    float tempWert = pow(10.0, anzahl_nachkommastellen);
    x *= tempWert;
    x += 0.5;
    x = floor(x);
    x /= tempWert;
    return x;
    }

    Die dürfte wohl nichts damit zu tun haben. */

    void startpunkt_nachziehen(int anzahl_fraesbahnen)
    {
    int imax=2anzahl_fraesbahnen;
    char buffer[80];
    int i;
    float startx;
    char startxs[8],startis[9]; for (i=0;i<imax;i++);
    {
    startx = gcode[i].x;
    if (startx<=0) {
    startx=startx
    (-1);
    }
    strcpy(buffer, "G1 X");
    sprintf(startxs,"%8.3f",runden(startx,3) );
    strcat(buffer,startxs);
    strcat(buffer," i");
    sprintf(startis,"%9.4f", runden((startx/2),3) );
    strcat(buffer, startis);
    strcat(buffer, " Y0 j0");
    strcpy(gcode[i].startpunkt,buffer);
    }
    printf("gcode startpunkt ist %s\n",gcode[i].startpunkt);
    system("Pause");

    }

    Und sehe, bei dem Debugging-Pause, daß der die richtigen Daten hat, abgelegt in gcode[i].startpunkt. Der buffer hat die richtigen Daten, und gcode[i].startpunkt hat auch die richtigen daten.

    Rufe ich im Anschluß daran gcode[i] aber aus dem main nochmal auf mit dieser Funktion:

    void zeige_gcode(int anzahl_datensaetze)
    {
    for (int i=0;i<anzahl_datensaetze;i++)
    {

    printf("KB unten=%s\n",gcode[i].teilkreis_unten);
    printf("KB oben=%s\n",gcode[i].teilkreis_oben);
    printf("Anfahr =%s\n",gcode[i].anfahrbogen);
    printf("Wegfahr=%s\n",gcode[i].wegfahrbogen);
    printf("Startpunkt=%s\n",gcode[i].startpunkt);

    }

    }

    Sind alle Felder belegt, nur .startpunkt hat überhaupt keine Daten mehr. Leeres Feld.

    Werd ich verrückt dabei, eben noch Daten drin, danach leeres Feld.

    Was mach ich falsch?

    Also in Pascal wäre sowas unvorstellbar, aber c++ ist eben andere Spielwiese.

    Wäre jedem sehr verbunden, der mir da irgendwie einen Hinweis geben könnte.

    Das Problem vom Datenverlust habe ich nämlich schon an anderer Stelle beobachtet, aber will das hier nicht durcheinanderwürfeln.

    Echt zum heulen!



  • pascal2009 schrieb:

    Also in Pascal wäre sowas unvorstellbar, aber c++ ist eben andere Spielwiese.

    Das ist aber kein C++ sondern C. Vielleicht mal im ANSI C Forum fragen. Und cpp-Tags benutzen.



  • also ich mach mir mal kurz die mühe das ganze lesbar zu gestallten:

    struct gcode_datensatz
    {
        char teilkreis_unten[80];
        char teilkreis_oben[80];
        char anfahrbogen[40];
        char wegfahrbogen[40];
        char startpunkt[40];
        float x;
        float y;
        float z;
        float i;
        float j;
        int position;
    };
    
    float runden(float x, int anzahl_nachkommastellen)
    {
        float tempWert = pow(10.0, anzahl_nachkommastellen);
        x *= tempWert;
        x += 0.5;
        x = floor(x);
        x /= tempWert;
        return x;
    }
    
    void startpunkt_nachziehen(int anzahl_fraesbahnen)
    {
        int imax = 2 * anzahl_fraesbahnen;
        char buffer[80];
        float startx;
        char startxs[8], startis[9];
        for (int i = 0; i < imax; ++i) // <- HIER DARF KEIN SEMIKOLON
        {
            startx = gcode[i].x;
            startx = startx < 0 ? -startx : startx; // kürzer und <= macht kein sinn, null ist schon positiv
            // alternativ:
            // startx = abs(gcode[i].x);
            strcpy(buffer, "G1 X");
            sprintf(startxs, "%8.3f", runden(startx, 3) );
            strcat(buffer, startxs);
            strcat(buffer, " i");
            sprintf(startis, "%9.4f", runden((startx / 2), 3) );
            strcat(buffer, startis);
            strcat(buffer, " Y0 j0");
            strcpy(gcode[i].startpunkt, buffer);
        }
        printf("gcode startpunkt ist %s\n",gcode[i].startpunkt);
        system("Pause"); // <- böse, sollte man nur zu testzwecken verwenden wenn überhaupt
    
    }
    
    void zeige_gcode(int anzahl_datensaetze)
    {
        for (int i = 0; i < anzahl_datensaetze; ++i)
        {
            printf("KB unten=%s\n", gcode[i].teilkreis_unten);
            printf("KB oben=%s\n", gcode[i].teilkreis_oben);
            printf("Anfahr =%s\n", gcode[i].anfahrbogen);
            printf("Wegfahr=%s\n", gcode[i].wegfahrbogen);
            printf("Startpunkt=%s\n", gcode[i].startpunkt);
        }
    }
    

    vllt liegts am semikolon.
    allerdings bräuchten wir dann noch die daklaration von gcode.
    ich vermute mal das teil ist global definiert.

    auch möglich ist, dass anzahl_datensaetze sich von 2 * anzahl_fraesbahnen unterscheidet



  • pascal2009 schrieb:

    Also in Pascal wäre sowas unvorstellbar, aber c++ ist eben andere Spielwiese.

    wenn du schon einer sprache die schuld für deine selbstgemachten fehler gibst, beschuldige wenigstens die richtige sprache. 🙄



  • blame the tool schrieb:

    pascal2009 schrieb:

    Also in Pascal wäre sowas unvorstellbar, aber c++ ist eben andere Spielwiese.

    wenn du schon einer sprache die schuld für deine selbstgemachten fehler gibst, beschuldige wenigstens die richtige sprache. 🙄

    Wahrscheinlich hat er seinen Code mit einem C++-Compiler kompiliert und rechtfertigt so seine Ansicht... 😃



  • helferlein schrieb:

    also ich mach mir mal kurz die mühe das ganze lesbar zu gestallten:

    vllt liegts am semikolon.
    allerdings bräuchten wir dann noch die daklaration von gcode.
    ich vermute mal das teil ist global definiert.

    auch möglich ist, dass anzahl_datensaetze sich von 2 * anzahl_fraesbahnen unterscheidet

    Danke, liebes helferlein

    ES LÄUFT JETZT !!!!!!!!!!!!!!

    Womöglich lag es wirklich nur am Semikolon.

    Gruß Pascal2009


Anmelden zum Antworten