- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 12

Thema: Pointer als Parameter und Rückgabewert

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716

    Pointer als Parameter und Rückgabewert

    Hallo,

    ich möchte eine kleine Funktion schreiben die mir in einem Char-Array ein Zeichen sucht. Die Funktion soll mit einem Pointer auf das erste Zeichen, bei dem die Suche begonnen werden soll aufgerufen werden. Dieser Pointer als Parameter soll auch als Rückgabewert dienen. Hierbei happert es noch ein bisschen. Hier mal meine Funktion:

    Code:
    bool MoveBuffer2Char (volatile char **Buffer, char Char, U8 MaxChars)
    {
     volatile char *CheckBuffer = *Buffer;
     
     while ((*CheckBuffer++ != Char) & (--MaxChars > 0));
     
     if (MaxChars > 0)
     {
      Buffer = &CheckBuffer;
      return (TRUE);
     }
     else
      return (FALSE);
    }
    Mein Aufruf sieht so aus:

    Code:
    volatile char RS232Buffer[0x50];
    volatile char *Buffer = &RS232Buffer[0];
    
    // ...
    
    if (MoveBuffer2Char (&Buffer, ',', 6))
    {
    // ...
    }
    Leider steht die Variable Buffer nach dem Aufruf der Funktion wieder auf dem Startwert. Was mache ich falsch, bzw. wie mache ich es richtig?

    Viele Grüße
    Andreas

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    39
    Beiträge
    647
    Bin mir nicht ganz sicher aber ich glaub wenn du sie als "static" machst müsste sich das erledigt haben.
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Nein, ich habe es mittlerweile durch rumprobieren herausgefunden. So funktioniert es:

    Code:
     if (MaxChars > 0)
     {
      *Buffer = CheckBuffer;
      return (TRUE);
    Viele Grüße
    Andreas

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Wieso so kompliziert?
    Geht doch auch etwas einfacher:
    Code:
    char *func(char *buffer, char ch, size_t size) {
        int i = 0;
        for(i = 0; i < size; i++) {
            if(*buffer == ch) {
                return buffer;
                break;
            }
            buffer++;
        }
    
    
        return NULL;
    }
    Code:
    char buf[] = "Hallo";
    char *c = 0;
    
    
    c = func(buf, 'a', sizeof(buf));
    
    
    if(c == 0) printf("Fehler");
    else printf("%c", *c);
    mfg

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    716
    Stimmt, so gehts auch (nicht getestet, aber es fehlt zumindest ein & im Funktionsaufruf). Bei dieser Lösung ist die Fuktion zwar kürzer, aber dafür die Auswertung um eine Zeile länger. Quasi Geschmackssache.
    Ich habe die Funktion so implementiert, damit die Auswertung übersichtlicher ist und bleibe somit bei meiner Lösung.

    Viele Grüße
    Andreas

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Bumbum Beitrag anzeigen
    Stimmt, so gehts auch (nicht getestet, aber es fehlt zumindest ein & im Funktionsaufruf).
    Nein, das & fehlt nicht, das gehört da nicht hin.

    Es geht aber noch einfacher:

    Code:
    #include <string.h>
    char buf[] = "Hallo";
    char *c = 0;
    
    c = strchr(buf, 'a');
    
    if(!c)
        printf("Fehler");
    else
        printf("%c", *c);
    Diese Version hat den Vorteil, daß sie nicht durch "rumprobieren" entstanden ist, sondern der Programmierer wußte, was er tat. Zusätzlich ist sie millionenfach getestet worden und hat eine sehr schöne Doku, die man leicht in einem C-Buch oder im Internet nachlesen kann. Und wenn man schon etwas eigenes schreibt, daß eine Funktion der libc nachbildet, sollte man Übergabeparameter und Returnwerte wie die Libraryfunktion verwenden. Das macht anderen und einem selbst nach einigen Monaten das Leben und das Verstehen leichter.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. ATTiny25 _delay_ms mit Variable als Parameter
    Von Bumbum im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 19.07.2012, 23:37
  2. Variable als Parameter oder Return-Value
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 31.01.2011, 14:33
  3. Port oder Alias an Funktion als Parameter?
    Von luvat im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 30.12.2009, 19:15
  4. Array Als Rückgabewert aus Funktion
    Von Lync im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 18.11.2009, 19:33
  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
  •  

Solar Speicher und Akkus Tests