Variable nach Übergabe in Funktion undefiniert



  • Hallo!

    Ich stehe etwas ratlos vor folgender Situation:

    Ich übergebe eine int-Variable an eine Funktion und dort ist der Wert wundersamerweise anders...

    in main:
    Code:

    printf("AnzNumPartError    %8i\n",AnzNumPartError   );
        printf("AnzSearchDistError %8i\n",AnzSearchDistError);
    
         CreateInfoPanel(
         myFunTab,
    
         AnzNumPartError,
         NumPartError,
    
         AnzSearchDistError,
         SearchDistError,
    
         1);
    

    die Funktion:

    extern int CreateInfoPanel(
      const_mddcFunctionTable_ptr myFunTab,
    
      int AnzNumPartError,
      Type_NumPartError NumPartError,
    
      int AnzSearchDistError,
      Type_SearchDistError SearchDistError,
    
      int Debug
    
      ){
    
      int Row=0;
      int i;
      static const mString_const strCol0    = "check";
      static const mString_const strCol1    = "no. of errors";
      static const mString_const strCol2    = "o.k.";
      static const mString_const strCol3    = "list";
      char Descript[LABEL_LENGTH]    = "";
      char Number[LABEL_LENGTH]      = "";
      char Passed[LABEL_LENGTH]      = "";
      int rc;
      int RetVal=0;
    
        printf("AnzNumPartError    %8i\n",AnzNumPartError   );
        printf("AnzSearchDistError %8i\n",AnzSearchDistError);
      return( RetVal );
    
    }
    

    und was beim Probelauf rauskommt:

    AnzNumPartError 14
    AnzSearchDistError 0

    AnzNumPartError 14
    AnzSearchDistError 263497632

    Die Variablentypen passen und der compiler meckert auch sonst nicht rum...

    Was läuft da verkehrt?



  • Was ist mString_const?
    Hat das ausreichend Platz für den Text?

    Warum extern ?
    Braucht man bei Funktionen nicht.

    Hast du den Warnlevel vom Compiler auf Maximum?

    Welchen Wert hat Row?

    Was sagt der Debugger?



  • DirkB schrieb:

    Was ist mString_const?
    Hat das ausreichend Platz für den Text?

    Warum extern ?
    Braucht man bei Funktionen nicht.

    Hast du den Warnlevel vom Compiler auf Maximum?

    Welchen Wert hat Row?

    Was sagt der Debugger?

    mString und extern sind in den Funktionsbeispielen für die API an der die Funktion hängt immer drin. Daher habe ich das erstmal so übernommen.
    Bislang war das noch nie eine Fehlerquelle.

    Warnlevel (gcc) ist Wall

    Row ist 0

    Und weil das "anflanschen" der GUI an den debugger in meiner Umgebung unheimlich unkomfortabel ist, habe ich das bislang gescheut...



  • Du verschweigst entscheidende Teile zw. Zeile 24+26.



  • Wutz schrieb:

    Du verschweigst entscheidende Teile zw. Zeile 24+26.

    😕
    Ich habe ab Zeile 27 einen Ausgabeblock für die GUI auskommentiert, sonst nichts...

    Der Fehler wird ja schon mit den printf Anweisungen in Zeile 26 und 27 offenkundig, bevor ich irgendetwas anderes mache.
    Soweit habe ich den Fehler ja schon eingekreist: irgendwas läuft bei der Übergabe der Werte falsch, aber da gcc mit -Wall keinen Hinweis bringt, bin ich recht ratlos...


  • Mod

    OkkaPapa schrieb:

    Der Fehler wird ja schon mit den printf Anweisungen in Zeile 26 und 27 offenkundig, bevor ich irgendetwas anderes mache.

    Hast du denn mal geprüft, ob der Code, wie du ihn hier zeigst(!), den Fehler produziert? Ich vermute, die Antwort wird Nein sein (sowohl darauf, ob du den gezeigten Code überprüft hast, als auch, ob der gezeigte Code den Fehler produziert).



  • SeppJ schrieb:

    OkkaPapa schrieb:

    Der Fehler wird ja schon mit den printf Anweisungen in Zeile 26 und 27 offenkundig, bevor ich irgendetwas anderes mache.

    Hast du denn mal geprüft, ob der Code, wie du ihn hier zeigst(!), den Fehler produziert? Ich vermute, die Antwort wird Nein sein (sowohl darauf, ob du den gezeigten Code überprüft hast, als auch, ob der gezeigte Code den Fehler produziert).

    Sorry, beides negativ!

    Der Code zeigt so wie der dort steht den Fehler!

    ich habe auch schon alles außer AnzNumPartError und AnzSearchDistError auskommentiert. Das Ergebnis bleibt gleich... Da muß was in meinem Speicher Amok laufen 😡



  • Dann gib mal alle deine Parameter vor dem Funktionsaufruf und sofort in der Funktion danach (Zeile 13) aus.

    Als Format %p für Pointer und %x für den Rest.

    Für die 14 müsste dann irgendwo 0000000E (evtl auch nur Fragmente davon 000E)

    Stimmen die anderen Parameter überein?



  • OkkaPapa schrieb:

    Der Code zeigt so wie der dort steht den Fehler!

    Quatsch. So wie der Code da steht, kompiliert er nicht. Also fehlen Teile. Also ist das kein vollständiges Minimalbeispiel. Also bringt es überhaupt nichts, mit dir darüber rumzuraten, wo der Fehler sitzt. Schmeiß alles raus, bis der Fehler nicht mehr auftritt. Dann gehst du einen Schritt zurück. Dann ist der vollständige Code wahrscheinlich noch 30 Zeilen lang und du hast einen blöden Fehler gemacht (das ist keine Beleidigung, blöde Fehler macht jeder).

    Mach den Code so, dass man ihn einfach per copy-paste kompilieren (!) kann. Alles andere ist einfach nur unhöflich bis dreist.

    EDIT: so sieht das dann aus. 22 Zeilen. Natürlich tritt der Fehler hier nicht auf (Überraschung).
    Also liegt der Fehler woanders.

    #include <stdio.h>
    
    void some_function(int a, int b)
    {
        puts("in some_function():");
        printf("AnzNumPartError %8i\n", a); 
        printf("AnzSearchDistError %8i\n", b); 
    }
    
    int main()
    {
        int a = 14;
        int b = 0;
    
        puts("in main():");
        printf("AnzNumPartError %8i\n", a); 
        printf("AnzSearchDistError %8i\n", b); 
    
        some_function(a, b);
    
        return 0;
    }
    


  • Ich habs mittlerweile von 0 an neu (und anders) geschrieben und bislang keine Fehler.

    Weiß der Fuchs wo es dran gelegen hat...

    Danke an alle, die sich konstruktiv damit befasst haben!



  • OkkaPapa schrieb:

    Weiß der Fuchs wo es dran gelegen hat...

    Jetzt wird es wohl auch niemand mehr herausfinden. Es wäre besser gewesen, der Sache auf den Grund zu gehen. Viel Spaß dabei, wenn du denselben Fehler nochmal machst.


Log in to reply