Forum: PC-Programmierung Zeiger an Funktion übergeben. Zeiger zeigt auf nichts nach Funktionsende


von Michael (Gast)


Lesenswert?

Hallo zusammen

Ich steh irgendwie auf dem Schlauch.
Dem Pointer in test wird keine Adresse zugewiesen.
Beim debuggen zeigt zwar telex_in vor dem beenden der Funktion 
receivetelex auf die richtige Adresse, aber sobald ich wieder in der 
Funktion test bin sehe ich einen uninitalisierten Pointer.
1
void test(void)
2
{
3
unsigned char *P_telex;  
4
5
 status = receivetelex(P_telex); 
6
}
1
int receivetelex(unsigned char *telex_in)
2
{
3
telex_in = hole_daten();//hole pointer auf Daten.
4
5
return(INCOMING_TELEGRAMM);//Telegramm erhalten
6
}

Hat jemand von euch eine Idee?

Gruss und Dank

Michael

von Daniel -. (root)


Lesenswert?

int glob;

void getit(void){
   int * pi;
   func(&pi);
   assert(*pi == glob);
}

void func(int ** ppi) {
   *ppi = &glob;
}

that's all

von Tom M. (tomm) Benutzerseite


Lesenswert?

Michael schrieb:
> telex_in = hole_daten();//hole pointer auf Daten.

vermutlich
*telex_in = hole_daten();

Wie sieht der Prototyp von hole_daten() aus?

von Michael (Gast)


Lesenswert?

Hallo Tom

So
1
unsigned char* hole_daten(void);

Aber vor den Return bevor die Funktion beendet wird zeigt mir der 
debugger die richtige Adresse an also telexin zeigt auf die richtige 
Adresse.

Gruss Michael

von Stefan E. (sternst)


Lesenswert?

In receivetelex ist telex_in ein lokale Kopie von P_telex. Wenn du 
dort telex_in veränderst, dann veränderst du auch wirklich nur das 
(und nicht auch P_telex).
Was du anscheinend eigentlich haben willst:
1
void test(void)
2
{
3
  unsigned char *P_telex;  
4
5
  status = receivetelex(&P_telex); 
6
}
7
8
9
int receivetelex(unsigned char **telex_in)
10
{
11
  *telex_in = hole_daten();//hole pointer auf Daten.
12
13
  return(INCOMING_TELEGRAMM);//Telegramm erhalten
14
}

von Klaus W. (mfgkw)


Lesenswert?

du übergibst in test() eine Kopie von P_telex an die zweite
Funktion, die überschreibt ihre Kopie und beim Funktionsende
wird diese geänderte Kopie weggeworfen.
An P_telex ändert sich dadurch nix.

Siehe C-Grundlagen...

von Klaus W. (mfgkw)


Lesenswert?

... oder so wie Stefan es formuliert hat; damit gehe ich
konform.

Das mit den C-Grundlagen bleibt...

von Tom M. (tomm) Benutzerseite


Lesenswert?

Michael schrieb:
> Aber vor den Return bevor die Funktion beendet wird zeigt mir der
> debugger die richtige Adresse an also telexin zeigt auf die richtige
> Adresse.

telexin soll aber immer auf P_telex zeigen; du willst P_telex ändern, 
oder versteh ich was falsch?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und was genau geschieht beim Aufruf von receive_telex? Dem übergibst 
Du einen Pointer. Und diesen Pointer überschreibst Du mit dem Ergebnis 
von hole_daten.

Pointer werden als Kopie ihrer selbst an Funktionen übergeben, so, wie 
es bei anderen Datentypen (int etc.) auch geschieht.
Während der Laufzeit der Funktion befindet sich diese Kopie auf dem 
Stack, eine Änderung bewirkt nach Beendigung der Funktion nichts.

Um das zu erzielen, was Du eigentlich vorhast, musst Du receive_telex 
einen Pointer auf einen Pointer übergeben, und das Ergebnis von 
hole_daten dem dereferenzierten Pointer übergeben:
1
void test(void)
2
{
3
unsigned char *P_telex;  
4
5
 status = receivetelex(&P_telex); 
6
}
7
8
int receivetelex(unsigned char **telex_in)
9
{
10
*telex_in = hole_daten();//hole pointer auf Daten.
11
12
return(INCOMING_TELEGRAMM);//Telegramm erhalten
13
}

Zu klären wäre noch, wie in hole_daten der Rückgabewert bestimmt wird; 
das darf nicht die Adresse eines lokalen (auf dem Stack angelegten) 
Arrays sein.

von Simon K. (simon) Benutzerseite


Lesenswert?

Auf englisch heißt das "telegram" und nicht "Telegramm"

von Klaus W. (mfgkw)


Lesenswert?

... vielleicht ist es ja ein deutsches Telegramm, was da übermittelt 
wird.
Ansonsten ist ein Telegramm nicht Telex :-)

von Rolf Magnus (Gast)


Lesenswert?

> ... vielleicht ist es ja ein deutsches Telegramm, was da übermittelt
> wird.

Ein incommingendes Telegramm? Kommt das auf Englisch rein und wird dann 
nach Deutsch übersetzt? ;-)

von Klaus W. (mfgkw)


Lesenswert?

es kommt doch originär von hole_daten.
Es kommt also aus dem mehr oder weniger
deutschsprachigen Raum.
Wer haddsch erfuhndn? Die Schweidschah....

von Michael (Gast)


Lesenswert?

Vielen Dank

Ja das war das Problem.

Mein Überlegungsfehler war das die übergebenen Werte nur Kopien sind.

@Klaus, Jo es isch nid liecht mit söfu verschidne Schproche do chunsch 
scho mou äs glir im Gring. ;-)

Gruss und Dank

Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.