Globale Variable verschwindet einfach
-
Hallo C-PlusPlusser!
Ich habe ein Problem mit globalen Variablen, was mich verzweifeln lässt:
Ich deklariere zu Beginn meines Programmes globale Variablen. In einer Funktion "collect_data" wird über einen Scanner eine Zeichenfolge eingelesen, diese dann in meiner ersten globalen Variablen "zNr" gespeichert. Danach wird die zweite Funktion "lookup" aufgerufen, wobei "zNr" als Argument übergeben wird. "lookup" sucht mir in einer Datei einen zu "zNr" passenden Datensatz. Bei Erfolg werden weitere Daten in die anderen globalen Variablen geschrieben, z.B. "oldStd", "einbau", usw. Dann erfolgt der Rücksprung zur ersten Funktion. Dort werden die ermittelten Daten ausgegeben. Am Ende der Funktion werden alle Daten in einer Datei gespeichert, wobei auch das Problem auftritt: Alle Werte sind da, außer der von "zNr", mit dem ich überhaupt nichts mehr gemacht habe. Der in der Datei vorgesehene Platz bleibt einfach leer.
Am Ende von "lookup" hat "zNr" noch den richtigen Wert, sofort nach dem Rücksprung ist sie aber leer... Was passiert da?? Wieso ist meine globale Variable auf einmal weg??Wäre super, wenn mir wieder jemand helfen kann, ich stehe echt auf dem Schlauch im Moment...
Vielen Dank und viele Grüße,
ChrisAnbei der Code von den zwei Funktionen:
******************************************************************************* * void collect_data(void) NEU * * * * Funktion: Die collect_data Funktion bekommt eine Nummer von der Tastatur * * oder dem Scanner und ruft dann die lookup Funktion auf. Wird die Nummer * * gefunden, so werden zus„tzliche Informationen gezeigt. * * Wird die Nummer nicht gefunden, kann der Benutzer die Nummer anlegen * * * *******************************************************************************/ void collect_data(void) { int ks, rc; /* ks=Keystroke, rc=ReturnCharacter */ int collect_flag = 1; char file_buffer[95]; /* Puffer fr die Daten aus der Datei */ if((inv_file = fopen(INVFILE, "r+")) == NULL) /* L„sst sich die Datei ”ffnen ?? */ { /* Error... */ clrscr(); gotoxy(2,1); printf("Dateifehler"); delay(1000); /* Nachricht fr 2 Sekunden zeigen */ } while(collect_flag) { memset(zNr,0,sizeof(zNr)); /* Variablen werden mit Nullwerten gefllt */ memset(oldStd,0,sizeof(oldStd)); memset(newStd,0,sizeof(newStd)); memset(ueber,0,sizeof(ueber)); memset(anzSt,0,sizeof(anzSt)); memset(einbau,0,sizeof(einbau)); inv_menu(); /* Inventurmen zeigen */ rc = get_scan_input(zNr,10,7,1,0); /* Nummer einlesen */ if(rc == -1) /* ESC wurde gedrckt */ { collect_flag = 0; break; } /* Ende von if (rc) */ trim_spaces(zNr); if(*zNr) /* Suchen und Finden... */ { if(lookup(zNr)) /* Nummer in der Datei suchen Variablen setzen */ { /* Z„hlernummer gefunden, Daten ausgeben: */ gotoxy(1,1); printf("%s", zNr); gotoxy(14,2); printf("%s",oldStd); gotoxy(10,4); printf("%s", anzSt); if(strcmp(ueber,"1") == 0) { gotoxy(13,4); printf("šberlauf"); } gotoxy(1,6); printf("%s",einbau); gotoxy(14,3); shift_lock(1); if(strcmp(newStd, "000000") != 0) /* Neuer ZS wurde schon eingegeben */ { printf("%s", newStd); gotoxy(14,3); /*Editieren des neuen Standes */ ks = dgetch(NOECHO); if(ks == ESC || ks == BS) { /* Abbruch durch ESC oder BkSp */ } else { /* Neuen ZS annehmen */ memset(newStd,0,sizeof(newStd)); gotoxy(14,3); printf(" "); get_kybrd_input(newStd,7,14,3,NUMLOCK); /* Speichern in Datei */ sprintf(file_buffer,"%-10s%-7s%-7s%-2s%-2s%-61s", zNr, oldStd, newStd, ueber, anzSt, einbau); fseek(inv_file, 0, SEEK_END); fwrite(file_buffer,88,1,inv_file); fputs("\n",inv_file); } } else /* Neuer ZS liegt noch nicht vor */ { /*Eingabe des neuen Standes */ get_kybrd_input(newStd,7,14,3,NUMLOCK); /* Speichern in Datei */ sprintf(file_buffer,"%-10s%-7s%-7s%-2s%-2s%-61s", zNr, oldStd, newStd, ueber, anzSt, einbau); fseek(inv_file, 0, SEEK_END); fwrite(file_buffer,88,1,inv_file); fputs("\n",inv_file); } } else /* Z„hlernummer nicht in Datei vorhanden */ { clrscr(); gotoxy(3,3); printf("nicht gefunden..."); delay(1500); } } } /* end of while(collect_flag) */ fclose(inv_file); /* close the inventory file */ } /* end of collect_data() */ /********************************************************************************* * int lookup(char *item) NEU * * * * Function: Sucht die richtige Z„hlernummer in der Z„hlerdatei. Wird die * * richtige Nummer gefunden, werden die Daten ausgegeben. * * * * Return Values: 0 = Item not found * * 1 = Item was found * * * *********************************************************************************/ int lookup(char *zNr) { int rc = 0; char file_buffer[90]; /* hier wird eine einzelne Zeile gespeichert */ char data_buffer[90]; /* hier wird die Z„hlernummer zum Suchen zwischengespeichert */ char temp_buffer[90]; /* nicht ben”tigt ??? */ char newStd_buffer[6]; _fmemset(file_buffer, 0, sizeof(file_buffer)); /* Alle Zeichen auf 0 setzen */ _fmemset(data_buffer, 0, sizeof(data_buffer)); /* Alle Zeichen auf 0 setzen */ _fmemset(temp_buffer, 0, sizeof(temp_buffer)); /* Alle Zeichen auf 0 setzen */ fseek(inv_file, 0, SEEK_SET); /* Zeiger auf Dateianfang setzen */ while((fgets(file_buffer, sizeof(file_buffer), inv_file) != NULL)) /* eine Zeile aus inv_file lesen, so lang wie der file_buffer ist */ /* dann in file_buffer speichern */ /* != NULL --> so lange kein Fehler auftritt (z.B. EOF...) */ { strncpy(data_buffer, file_buffer, 9); /* 9 Zeichen nach data_buffer kopieren */ trim_spaces(data_buffer); /* Leerzeichen entfernen */ if(strcmp(zNr, data_buffer) == 0) /* Vergleich. Bei == 0 sind die Strings gleich */ { /* Daten kopieren und Nullzeichen anfgen */ strncpy(newStd_buffer, file_buffer + 17, 6); if (strcmp(newStd_buffer, "000000") != 0) { /*Anscheinend wurde schon ein Wert eingegeben */ strncpy(newStd, file_buffer +17, 6); newStd[sizeof(newStd)] = '\0'; trim_spaces(newStd); } strncpy(ueber, file_buffer + 24, 2); ueber[2] = '\0'; trim_spaces(ueber); strncpy(einbau, file_buffer + 28, sizeof(einbau) - 1); einbau[sizeof(einbau)] = '\0'; trim_spaces(einbau); strncpy(anzSt, file_buffer + 26, 1); anzSt[2] = '\0'; strncpy(oldStd, file_buffer + 10, sizeof(oldStd) - 1); oldStd[sizeof(oldStd)] = '\0'; trim_spaces(oldStd); /* Workaround: Z-Nr geht sonst verloren */ zNr = data_buffer; rc = FOUND; break; } else { rc = NOT_FOUND; } } /* end of while */ return rc; } /* end of function */
-
Ich sehe keine globalen Variablen.
-
Der Parameter zNr der Funktion lookup verdeckt die gleichnamige globale Variable. Tu dir einen Gefallen, und verzichte nach Möglichkeit auf globale Variablen.
-
@ringding: Ich habe nur einen Teil des Programms hier rein kopiert. Die Deklaration sieht so aus:
char zNr[10]; char oldStd[7]; char newStd[7]; char ueber[3]; char anzSt[3]; char einbau[61];
@ MFK: Ich hab da auch noch aus der Zeit meines Informatik-Leistungskurses so ein Echo im Ohr: "Globale Variablen machen nur Proooobleeemeee!!!", nur das Problem hier ist: Ich habe das Programm sozusagen mit den Geräten auf denen es laufen soll als Entwicklungsgrundlage mitbekommen. Ziel ist nun durch Anpassung auf meine konekreten Anforderungen möglichst schnell ein lauffähiges System zu bekommen. Da der "Erfinder" in seinem Originalprogramm auch mit globalen Variablen gearbeitet hat, komme ich leider nicht drumrum dies zu übernehmen. Ich habe einfach noch nicht genug Hintergrundwissen, um meine komplett eigene Lösung zu erstellen.
Wie kann ich denn jetzt in meinem Fall (mit den globalen Variablen) das Problem lösen? Das mit der Verdeckung der Variablen klingt ja schon ganz gut. Aber wie kann ich das Problem jetzt beheben? Einfach den Parameter anders nennen???
-
einfach den parameter weglassen. die variable ist doch eh global
-
Alles klar!
Parameter auf void, dann am Ende von lookup noch einmal zNr setzen und schon gehts! Vielen Dank an alle!