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 vorhineinGruß
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 vorhineinJa 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 gemeintint 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