mikrocontroller.net

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


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
void test(void)
{
unsigned char *P_telex;  

 status = receivetelex(P_telex); 
}
int receivetelex(unsigned char *telex_in)
{
telex_in = hole_daten();//hole pointer auf Daten.

return(INCOMING_TELEGRAMM);//Telegramm erhalten
}

Hat jemand von euch eine Idee?

Gruss und Dank

Michael

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int glob;

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

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

that's all

Autor: Tom M. (tomm) Benutzerseite
Datum:

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

vermutlich
*telex_in = hole_daten();

Wie sieht der Prototyp von hole_daten() aus?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tom

So
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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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:
void test(void)
{
  unsigned char *P_telex;  

  status = receivetelex(&P_telex); 
}


int receivetelex(unsigned char **telex_in)
{
  *telex_in = hole_daten();//hole pointer auf Daten.

  return(INCOMING_TELEGRAMM);//Telegramm erhalten
}

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder so wie Stefan es formuliert hat; damit gehe ich
konform.

Das mit den C-Grundlagen bleibt...

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
void test(void)
{
unsigned char *P_telex;  

 status = receivetelex(&P_telex); 
}

int receivetelex(unsigned char **telex_in)
{
*telex_in = hole_daten();//hole pointer auf Daten.

return(INCOMING_TELEGRAMM);//Telegramm erhalten
}

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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf englisch heißt das "telegram" und nicht "Telegramm"

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ;-)

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.