Problem mit Pointer und Funktion



  • Hallo,

    ich habe ein (vermutlich triviales) Problem:

    Ich möchte aus einer Funktion 2 Rückgabewerte erhalten. Dies geht ja nicht so einfach, deswegen wollte ich das mit Pointern lösen. Mein Ansatz funktioniert aber noch nicht ganz.

    In der Main Funktion rufe ich eine Funktion mit 3 Parametern auf.
    0x0115 ist ein beliebiger 16 bit Wert der in der Funktion in 2 8 bit Werte aufgeteilt wird. Die beiden Ergebnise möchte ich in die Variablen wert_1 und wert_2 schreiben.

    unsigned short *ptr_high_16to8;
    unsigned short *ptr_low_16to8;
    
    void main (void)
    {
      convert_16to8 (0x0115,wert_1,wert_2);
    }
    
    unsigned short convert_16to8 (unsigned short value_16bit, unsigned short highbyte, unsigned short lowbyte)
    {
      lowbyte = value_16bit & 0xFF;	/* Umwandlung von 16bit in 8bit */
      highbyte = (value_16bit >> 8) & 0xFF;	/* Umwandlung von 16bit in 8bit*/
      ptr_low_16to8 = &lowbyte;
      ptr_high_16to8 = &highbyte;
      return 0;
    }
    

    Die Funktion an sich funktioniert, nur wird mein Ergebnis nicht in die beiden Variablen zurück gegeben. Ich habe also ein Problem mit den Pointern.



  • Du verzeigerst die beiden Pointer auf lokale Variablen - und die werden direkt nach dem "return 0;" wieder freigegeben, womit deine Pointer auf Datenmüll zeigen. Wenn du Daten aus der Funktion an die Parameter übergeben willst, mußt du dort Pointer als Parameter deklarieren (und in der Funktion dereferenzieren):

    void convert(unsigned short val16,unsigned char* hi8,unsigned char* low8)
    //char sind 8-Bit-Integer's
    {
      *hi8 = val16 & 0xFF;
      *low8 = (val16>>8) & 0xFF;
    }
    
    int main(void)
    {
      unsigned char hi,lo;
      convert(4711,&hi,&lo);
      printf("4711 = %d %d\n",hi,lo);
    }
    


  • Danke für die schnelle Hilfe! Es hat funktioniert.
    Trotzdem noch eine Frage zum Verständnis...
    Lokale Variablen sind doch gar nicht vorhanden?!?



  • pic schrieb:

    Trotzdem noch eine Frage zum Verständnis...
    Lokale Variablen sind doch gar nicht vorhanden?!?

    Doch - auch die Parameter zählen als lokal bezüglich der Funktion.



  • lowbyte und highbyte sind lokale Variablen der Funktion convert_16to8. Das sind Kopien von wert_1 und wert_2, die nach Ende der Funktion zerstört werden.



  • Ok, ich hatte das anders gedacht. Ich hatte lowbyte und highbyte als global deklariert. (hatte ich nicht mit dazu gesagt)

    unsigned char highbyte, lowbyte = 0 ;
    

    Aber war da nicht was, dass globale lokale Variablen überschreiben...?



  • Nein umgekehrt, lokale Variablen überschreiben globale...

    unsigned short convert_16to8 (unsigned short value_16bit, unsigned short highbyte, unsigned short lowbyte)
    

    Diese beiden highbyte und lowbyte sind lokale Variablen in convert_16to8.


Anmelden zum Antworten