Variable spielt bei einfacher Funktion verrückt - Falsches Verständnis?



  • Hallo, ich bi dabei ein kleines Programm zu schreiben, welches mit dem Luhn-Algorithmus eine Eingabe überprüfen soll. Dabei soll jenachdem welchen Wert die Variable "valid" hat, gültig ausgegeben werden (valid = 1) oder eben ungültig (valid=0).
    Komischerweise ist der Wert immer 8. Kann mir jemand erklären wie dieser Wert zustande kommt?

    Ich benutze folgenden Code:
    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "mylib.h"
    
    int main(int argc, char** argv) {
        int i, q = 0;
        int valid;
        printf("valid = %i",valid); // Wert bevor benutzt
        char kkn[21]; //Für Eingabe von 20 Stellen + \0
        printf("Bitte Kreditkartennumer eingeben:\n");
        fgets(kkn,20,stdin);
        int luhn(kkn);
        printf("valid hat den Wert: %i -->",valid); //Wert nachdem benutzt
        if (valid == 1){
            printf("gueltig");
        } else{
            printf("ungueltig");
        }
    
        return (EXIT_SUCCESS);
    }
    

    mylib.h

    #ifndef MYLIB_H
    #define	MYLIB_H
    
    int luhn (char*);
    
    #endif	/* MYLIB_H */
    

    mylib.c

    #include "mylib.h"
    
    int luhn(char *kkn) {
        int q, valid;
        char kkn_norm[] = "000000000000000000000"; // mit 20 Nullen gefülltes Array
        kkn_norm[21 - strlen(kkn)] = '\0'; //Normierung auf 20 Stellen
        strcat(kkn_norm, kkn); //verknüpft die abgeschnittenen Nullen mit der Eingabe
    
        for (int i = 20; i >= 0; i--) {
            if (0 == i % 2) { //gerade Stelle?
                kkn_norm[i] = kkn_norm[i];
            } else {
                kkn_norm[i] = (kkn_norm[i]) *2; //ungerade stelle werden verdoppelt
                if (kkn_norm[i] > 9) //ist sie dann größer 9 ?
                {
                    kkn_norm[i] = kkn_norm[i] - 9; //wenn ja Quersumme
                }
            }
            q = q + kkn_norm[i]; //ergebnis der Schleife
        }
        if (0 == q % 10) {
            return valid = 1;
        } else {
            return valid = 0;
        }
    
    }
    

    Ich hoffe ihr versteht mein Problem und könnt mir sagen wo mein Fehler liegt.
    Vielen Dank schon mal im vorhinein

    Gruß
    Torben



  • Check mal Zeile 12 in main.c



  • Ich hoffe ihr versteht mein Problem und könnt mir sagen wo mein Fehler liegt.
    Vielen Dank schon mal im vorhinein

    Ja es ist eindeutig - du kannst kein C

    schalt mal deinen Warnung an - dann siehst du mehr

    komische ist:

    valid wir nicht richtig gesetzt

    was ist das

    int luhn(kkn);
    

    was soll das

    return valid = 1;
    

    oder

    return valid = 0;
    

    sieht alles sehr wirr aus - du solltest erst mal ein wenig code schreiben und dich mit Parametern und Rückgaben von Funktionen vertraut zu machen - nur weil es kompiliert ist es noch lange nicht richtig



  • Nur ein gleicher Name macht Variablen nicht zur derselben Variable.



  • Zeile 12 habe ich in

    int luhn(char *kkn);
    

    geändert...

    Gast3 schrieb:

    ...

    Ja es ist eindeutig - du kannst kein C
    Das stimmt. Sonst würde ich ja solche Fehler nicht machen. Aber ich möchte es ja Lernen. Mit meinem Buch und über den NetbeansDebugger konnte ich den Fehler nicht lösen. Darum habe ich ja hier Nachgefragt.

    schalt mal deinen Warnung an - dann siehst du mehr
    Warungen habe ich an. Er gibt mir jetzt noch aus, dass valid in zeile 8 und 13 uninizialisiert benutzt wird...
    in zeile 8 ist es nach meinem Verständnis auch logisch. Die Funktion die valid ihren Weert zuweist wird ja auch erst in zeile 12 aufgerufen. Ich dachte dann aber, dass in Zeile 13 valid inizialisiert wurde?

    komische ist:

    valid wir nicht richtig gesetzt

    was ist das

    int luhn(kkn);
    

    *Das soll die Funktion aufrufen und ihr die Eingabe übergeben. Wie oben beschrieben habe ich diese Zeile nun in int luhn(char kkn); geändert.

    was soll das
    Hier möchte ich der Variable valid entweder eine 1 oder eine 0 zuweisen, damit ich damit später weiterarbeiten kann.

    return valid = 1;
    

    oder

    return valid = 0;
    

    **Wäre folgendes besser geschrieben?

    if (0 == q % 10) {
            valid = 1;
            return valid;
        }
    

    **

    sieht alles sehr wirr aus - du solltest erst mal ein wenig code schreiben und dich mit Parametern und Rückgaben von Funktionen vertraut zu machen - nur weil es kompiliert ist es noch lange nicht richtig

    wie kann ich denn die Variable valid global bekannt machen?
    irgendwie soll das ja mit dem Vorsatz extern gehen. Wenn ich in die header-datei aber folgendes schreibe:

    extern int valid;
    

    ändert sich leider auch nichts



  • Nein, nein, nein ... Global machen sollst du die Variable gar nicht ... brauchst du auch nicht!

    Deine Funktion int luhn(...) liefert dir ja den Wert 1 oder 0 deiner Funktionsinternen Variablen valid zurück.
    Du musst jetzt nur beim Aufruf deiner Funktion diesen Rückgabewert in die "Main Variable" valid schreiben.

    int main(..)
    {
      // ...
      valid = luhn(kkn);
      // ...
    }
    


  • Im übrigen brauchst du die funktionsinterne Variable "valid" überhaupt nicht!!

    Du kannst ja einfach den entsprechenden Wert an der entsprechenden Stelle direkt returnen.

    // ... int luhn(...) etc
    
      if (0 == q % 10) {
        return 1;
      } else {
        return 0;
      }
    }
    


  • @eSmurf
    Das habe ich nicht gemeint

    int luhn(char *kkn);
    

    ergibt noch weniger Sinn.
    Das ist ein Funktionsprototyp die Funktion rufst du so auf:

    luhn(kkn);
    

    Dir mangelt es an grundlegendem Verständnis, du weißt z.B. nicht was ein Rückgabewert ist.
    Lies ein Tutorial, dann sollten sich all deine Probleme erübrigen.



  • erstmal werde ich versuchen das programm komplett in der Mainfunktion aufzubauen. Also ohne das auslagern in andere Funktionen.
    Denn auch mein Luhnalgorithmus ist falsch.
    Den habe ich jetzt ersteinmal neu auf. Trotzdem danke für eure Hilfe


Log in to reply