- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: zwei Rückgabewerte einer Funktion?!

  1. #1
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48

    zwei Rückgabewerte einer Funktion?!

    Anzeige

    Praxistest und DIY Projekte
    Hallo Freunde,

    "Leider" warnt mich der Compiler, dass er kein "return" Statement findet. Jedoch klappt das jetzt auch so, wie es im Code steht.
    Wie löst man solch ein Problem? Wie gebe ich zwei verschiedene "Rückgabewerte" zurück?

    vielen dank schonmal


    Code:
    uint16_t read_Drucksensor(uint8_t Druck_Temperatur)                    
    {
        uint16_t Druck_Byte_High = 0;
        uint8_t Druck_Byte_Low = 0;
        uint16_t Temperatur_Byte_High = 0;
        uint8_t Temperatur_Byte_Low = 0;
        int16_t Druck = 0;
        int16_t Temperatur = 0;
        long Druck_Byte_High_Low = 0;
        long Temperatur_Byte_High_Low = 0;
        
        sei();
        i2c_rep_start(0x50+I2C_READ);
        Druck_Byte_High =        i2c_readAck();
        Druck_Byte_Low  =        i2c_readAck();
        Temperatur_Byte_High =    i2c_readAck();
        Temperatur_Byte_Low =    i2c_readNak();
        i2c_stop();
    
        if (Druck_Temperatur == 0)
        {
            Druck_Byte_High = Druck_Byte_High & 0b00111111;
            Druck_Byte_High = Druck_Byte_High << 8;
            Druck_Byte_High_Low = Druck_Byte_Low | Druck_Byte_High;
            Druck = ((Druck_Byte_High_Low - 1638) * 100 / (14745 - 1638) ) ;
            return (Druck);
        }
        
    
    
        if (Druck_Temperatur == 1)
        {
            Temperatur_Byte_Low = Temperatur_Byte_Low >> 5;
            Temperatur_Byte_High_Low = Temperatur_Byte_High << 3 | Temperatur_Byte_Low;
            Temperatur = (((Temperatur_Byte_High_Low * 2000) / 2047) - 562 );
            return (Temperatur);
        }
        
    
        
    }
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Der Compiler meckert, weil er nicht für alle möglichen Fälle ein return-Statement findet.
    Für Druck_Temperatur == 0 und Druck_Temperatur == 1 ist ein return-Wert definiert.
    Aber was soll die Funktion zurückgeben, wenn Druck_Temperatur == 2 ist?
    Auch wenn dieser Fall bei Dir nicht vorkommen wird - der Compiler weiß das nicht und sieht einen Fehler.

    Beheben kannst Du das so
    Code:
    if (Druck_Temperatur == 0)
    {
    
    ...
    return Druck;
    } else if (Druck_Temperatur == 1) {
    ... return Temperatur;
    } else {
    return 0;
    }
    Gruß,
    askazo

  3. #3
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    Okay, dass scheint zu klappen. Danke !

    Was mache ich denn falsch, wenn ich mein Array nicht zurück kann ?
    Ich möchte gerne "Uhrzeit" an die Funktion zurück geben...

    Code:
    uint16_t TimeToString(uint8_t Stunden, uint8_t Minuten, uint8_t Sekunden)
    {
        char Uhrzeit[9];
    
        Uhrzeit[0] = (Sekunden >> 4)  + 0x30;
        Uhrzeit[1] = (Sekunden & 0x0f) + 0x30;
        Uhrzeit[2] = ':';
        Uhrzeit[3] = (Minuten >> 4)  + 0x30;
        Uhrzeit[4] = (Minuten & 0x0f) + 0x30;
        Uhrzeit[5] = ':';        
        Uhrzeit[6] = (Stunden >> 4)  + 0x30;
        Uhrzeit[7] = (Stunden & 0x0f) + 0x30;
        Uhrzeit[8] = '\0';
    
        return(Uhrzeit);
    
    }// Ende TimeToString
    Geändert von Janiiix3 (20.09.2014 um 16:59 Uhr)
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Du kannst in C ein Array nicht direkt als Rückgabewert einer Funktion verwenden.
    Die gängige Lösung ist eigentlich, einen Zeiger auf das Array zurückzugeben.
    Dafür solltest Du Dich aber mit Zeigern auskennen.

    Allerdings stellt Dir die C-Bibliothek schon eine Funktion zur Verfügung, die genau das kann, was Du mit dieser Funktion machen möchtest...

    Code:
    #include <stdio.h>
    
    uint8_t Stunden;
    uint8_t Minuten;
    uint8_t Sekunden;
    
    char Uhrzeit[9];
    
    // Hier kommt die Berechnung der Uhrzeit hin
    ...
    
    printf(Uhrzeit,"%02u:%02u:%02u",Stunden,Minuten,Sekunden);
    Siehe auch http://www.mikrocontroller.net/artic...ntf_und_printf
    und http://home.htw-berlin.de/~junghans/cref/FUNCTIONS/format.html

    Gruß,
    askazo

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von Janiiix3 Beitrag anzeigen
    Was mache ich denn falsch, wenn ich mein Array nicht zurück kann ?
    Ich möchte gerne "Uhrzeit" an die Funktion zurück geben...

    Wie schon gesagt, musst du einen Zeger zurück geben.

    Aber du hast noch zwei ganz grobe Fehler!

    Zitat Zitat von Janiiix3 Beitrag anzeigen
    Code:
    uint16_t TimeToString(uint8_t Stunden, uint8_t Minuten, uint8_t Sekunden)
    {
        char Uhrzeit[9];
    
        Uhrzeit[0] = (Sekunden >> 4)  + 0x30;
        Uhrzeit[1] = (Sekunden & 0x0f) + 0x30;
        Uhrzeit[2] = ':';
        Uhrzeit[3] = (Minuten >> 4)  + 0x30;
        Uhrzeit[4] = (Minuten & 0x0f) + 0x30;
        Uhrzeit[5] = ':';        
        Uhrzeit[6] = (Stunden >> 4)  + 0x30;
        Uhrzeit[7] = (Stunden & 0x0f) + 0x30;
        Uhrzeit[8] = '\0';
    
        return(Uhrzeit);
    
    }// Ende TimeToString
    1.
    char Uhrzeit[9];
    Ist eine lokale Auto-Variable!

    Beim Aufruf von TimeToString() wird diese auf dem Stack angelegt und nach verlassen von TimeToString() wird der Speicher wieder freigeben!
    Wenn du nun eine andere Funktion aufrufst oder eine Interruptroutine ausgeführt wird, werden die Werte überschrieben und due hast nur noch Datensalat.
    Also übe mal, wie man eine gute Salatsauce macht

    Wenn du
    static char Uhrzeit[9];
    verwendest, umgehst du dieses Problem, dann wird Uhrzeit im allgemeinen Speicher angelegt.
    Allerdings ändert jeder Aufruf von TimeToString() den Inhalt von Uhrzeit.


    2. der Rückgabewert von TimeToString() ist nicht mehr
    uint16_t
    sondern
    char *TimeToString(uint8_t Stunden, uint8_t Minuten, uint8_t Sekunden)

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    Du kannst das auch in ein struct packen und dann dieses strukt zurück geben.

    Code:
    struct Uhrzeit {
     char sec;
     char min;
     char hour;
     char day;
     char month;
     char year;
    };
    
    ...
    
    Uhrzeit MyFunction()
    {
     Uhrzeit ret;
     ret.min = ...;
     ret.sec = ...;
    
     ...
     return ret;
    }
    Gruß
    Georg

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo Georg,

    Du hast jetzt aber immer noch den Fehler mit der auto Variablem.
    Nach return wird der Speicher freigegeben!!

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    Nein, denn es wird by value übergeben und nicht by reference.

    EDIT:
    Link
    http://courses.washington.edu/css342...32/passby.html
    http://de.wikipedia.org/wiki/Wertparameter

    - - - Aktualisiert - - -

    Ja, der Speicher wird freigegeben, aber es wird eine tiefe Kopie gemacht für den Aufrufer. Wenn ich

    return &ret;

    mache, dann habe ich ein Problem mit diesem Speicher.

Ähnliche Themen

  1. ein Int-Array einer Funktion
    Von oderlachs im Forum Arduino -Plattform
    Antworten: 13
    Letzter Beitrag: 17.02.2014, 23:50
  2. Zwei Potentiometer auf einer Achse
    Von AgesKing im Forum Mechanik
    Antworten: 7
    Letzter Beitrag: 20.12.2012, 16:33
  3. Variablen in einer Funktion bekannt machen
    Von hosti im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 05.10.2010, 22:18
  4. Antworten: 20
    Letzter Beitrag: 18.04.2010, 18:37
  5. Funktion als Rückgabewert einer Funktion?
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 08.09.2008, 11:25

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test