Zeigerproblem?
-
Hallo,
ich habe folgendes Problem. Ich habe neben meiner main.c eine Datei die heisst einlesen.c . Dort lese ich zeilenweise werte aus einer Datei und gebe dann am Ende die Anzahl der Zeilen aus. Die Variable ist bei mir i. i hat den Wert bei einlesen.c i=11.
Wenn ich die Variable aber wieder in der mainfunktion aufrufe, dann krieg ich immer so werte wie 134514896, die aber immer verschieden sind!
Als rückgabewert der funktion einlesen habe ich dieses i als int. muss ich das vllt. als zeiger zurückgeben? Wenn ja wie kann ich es dann wieder als Zahl 11 ausgeben?einlesen.c:
void einlesen (double speed[120], double steig[120], int i) { int s; FILE *datin; datin = fopen ("werte.dat", "r"); i=0; if(datin != NULL) { do { fscanf (datin, "%lf %ls\n", &speed[i], steig[i]); i++; } while (i<11); fclose(datin); printf("Gefahrene Minuten: %i", i); printf("\n"); } else printf("Fehler!"); return; }
Die gefahrenen Minuten sind hier meine Variable i mit dem Wert 11.
Wenn ich das aber im Hauptprogramm gleich nach meiner Funktion aufrufe mitprintf("%i", i)
Steht da nicht 11 sondern halt irgendeine Zahl.
Und ich denke das hat was mit Zeigern zu tun oder? Das der mir dann die Speicheradresse einfach ausgibt und nicht den Wert, wie kann ich das am besten realisieren?MfG Tomi
-
Das ist also deine Funktion einlesen(...) die du von einer anderen Stelle aufrufst? Und dein i willst du an dieser anderen stelle Auswerten?
Dann übergibst du zum Beispiel eine Referenz auf i!void einlesen (double speed[120], double steig[120], int &i) { //dein code }
Aufrufen tust die Funktion dann ganz normal so wie du es jetzt auch machst. Auch in deiner einlesen Funktion brauchst du nichts weiter ändern.
-
xcase schrieb:
einlesen.c:
[cpp]int einlesen (double speed[120], double steig[120])
{
int s**, i** ;...
return i;
} [/cpp]und in main.c
int main() { int i; ... i = einlesen (3.0, 5.0); //3.0 und 5.0 sind willkürlich gewählte Werte ... ... }
-
oneill5000 schrieb:
Dann übergibst du zum Beispiel eine Referenz auf i!
Aber nicht in C.
-
Dein i wird auf dem Stack im Gültigkeitsbereich der Funktion erzeugt, außerhalb gibt es kein i, die Zahl ist undefiniertes Verhalten.
Du musst entweder i zurückgeben (als Kopie einfach return i) oder du übergibst einen Zeiger auf i (int *iZeiger) in der Funktion. Oder du machst i global, darfst dann in der Funktion aber kein neues i deklarieren.
-
ja ich will halt nur das i wieder auf andere Funktionen übergeben....nicht das ich irgendwie die function aufrufen mus über einlesen (wert1, wert2) .
wenn ich das per zeiger mache....wie muss ich das dann realisieren?
Und wie geb ich das dann in der Hauptfunktion aus?
-
also ich hab jetzt i als globale variable deklariert in main.c . Einfach vor dem main() int i; eingegeben.
Jetzt hab ich in der funktion i=0 zu stehen und die 11 wird mir zwar wieder ausgegeben aber wenn ich das dann in der main.c versuche dann steht da jetzt immer 0. warummain.c
int i; int einlesen (double speed[120], double steig[120], int i) main() . . . einlesen (speed, steig, i); printf("%i", i); . .
da beim printf müsste jetzt 11 rauskommen, dem ist aber nicht so! Hier kommt 0 raus.
einlesen.c
[cpp]
int einlesen (double speed[120], double steig[120], int i)
{i=0;
.
.
.
printf("%i", i);return i;
}
Hier kommt aber 11 raus. warum
-
weil du i jetzt 2 mal deklariert hast. wenn du i global deklarierst darfst du i natürlich nicht nochmal im im funktionskopf erstellen.
alsoint i; int einlesen (double speed[120], double steig[120]) main() . . . einlesen (speed, steig); printf("%i", i); . .
und
void einlesen (double speed[120], double steig[120]) { //hier i einfach mit deinem code benutzen }
-
Du solltest das Ergebnis einfach via return zurückgeben. Globale Variablen sind hier mit Sicherheit der falsche Ansatz.
-
LordJaxom schrieb:
Du solltest das Ergebnis einfach via return zurückgeben. Globale Variablen sind hier mit Sicherheit der falsche Ansatz.
Jo, so wie ich es oben schon vorgemacht habe ...
-
jo danke super geklappt mit globalen variablen
Jetzt noch anderes. Wie kann ich am besten die do-while schleife ändern, sodass sie so lange durchlaufen wird, bis i<120 oder das ende der datei erreicht wurde. ICh weiss zwar das man das irgendwie mit EOF macht aber ich hab keine ahnung wie.
und am besten man macht daraus nur eine while schleife weil die ja ne eintrittsbedingung hat.Danke im vorraus!
-
Ich werfe mal ein feof(FILE*) in den Raum
Gut Schuß
VuuRWerK