- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Arduino Sketch: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?

  1. #1
    HaWe
    Gast

    Arduino Sketch: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?

    Anzeige

    Powerstation Test
    hi,
    wie kann ich eine Funktion mit einer variablen Parameterliste entwerfen, so dass diese intern eine weitere Funktion mit genau derselben (variablen) Parameterliste als Hilfsfunktion aufruft?

    also z.B
    :
    Code:
    #include <stdio.h>
    #include <stdarg.h>
    
    int fprintfln ( FILE * stream,  char format[], ... ) { // gefaketes und modifiziertes fprintf
      char sbuf[100];
      va_list arguments;
    
       // irgendwie pointer * oder & auf arguments...?
      sprintf(sbuf, format, & arguments ); // ???
      //
      //
      stream->println(sbuf);
      //
    }

    [/code]
    Geändert von HaWe (11.03.2015 um 19:42 Uhr)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Mit stdarg kannst du doch eh deine ganzen Parameter fertig formatiert in einen string schreiben und denn einfach ausgeben. Dazu brauchts kein sprintf mehr.

    mfg

  3. #3
    HaWe
    Gast
    wie genau meinst du das? Ganz soweit fortgeschritten mit stdarg.h bin ich noch nicht...

    meinen Aufruf hatte ich geplant z.B. (als vereinfachtes Beispiel, wie bei fprintf)

    Code:
    #include <SPI.h>
    #include <SD.h>
    
    File myFile;
    
    int fprintfln ( FILE * stream,  char format[], ... )  // Implementierung
    {
      //
      //
      //
    }
    
    void loop()
    {
      //
      fprintfln( &myFile, "%s %d %f", "Teststring", 2, PI );  // Aufruf z.B. im Hauptprogramm
      //
    }
    wie soll das jetzt allein per stdarg gehen?
    Geändert von HaWe (01.03.2015 um 18:18 Uhr)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    So:
    Code:
    int fprintfln ( FILE * stream, const char format[], ... ) {
    	char sbuf[100];
    	va_list vl;
    	va_start(vl, format);
    
    
    	vsprintf(sbuf, format, vl);
    
    
    	stream->println(sbuf);
    
    
    	va_end(vl);
    }
    mfg

  5. #5
    HaWe
    Gast
    hallo,
    noch eine Anschlussfrage:
    gibt es eine Möglichkeit herauszubekommen, welche Anzahl an Argumenten das C-Programm ermittelt hat (Zuweisung an eine Int-Variable)?

    nicht nur bei Übergabegabe einer festen Anzahl
    va_start( arguments, num);
    sondern auch bei Übergabe eines fmt-Strings
    va_start( arguments, fmtstr);
    weiß ja C, mit welcher Anzahl man es zu tun hat.

    Bei va_start( arguments, num); ist es offensichtlich - aber wenn ich intern nur fmtstr kenne, wie kann ich C das Geheimnis der Anzahl aus der Nase ziehen?

    so nach dem Motto
    num=arg_cnt(fmtstr) oder num=arg_cnt(arguments) o. ä.?

    Ansonsten müsste man umständlich erst die Anzahl der '%' zählen und die Zahl der "%%" doppelt wieder abziehen... :-/
    Geändert von HaWe (04.03.2015 um 16:25 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von HaWe Beitrag anzeigen
    ...weiß ja C, mit welcher Anzahl man es zu tun hat.
    Nicht zwingend. Es wird wohl eher mit while(...){...} realisiert sein.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Hast du das schon probiert?:
    Code:
    int fscanf_ ( File * stream, const char fmtstr[], ... ) {
       ...
       // #debug
       Serial.print("fscancnt:"); Serial.println(cnt);
       va_end ( args );
       Serial.println("Nach va_end(args)...");
       return cnt;
    }

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    1. Nicht so wichtig: cnt hast du mal als int16_t, int32_t und als int in der Rückgabe von fscanf.
    2. Was passiert wenn du die Funktion fscanf zu einer void-Funktion machst? Ich habe die Vermutung, das da beim Rücksprung im Stack irgendwas schiefläuft. Aber warum?

  9. #9
    HaWe
    Gast
    habe alles durchprobiert:
    - komplett alle int-Typen als int16_t : keine Änderung
    - fscanf_ als void: auch keine Änderung
    Geändert von HaWe (05.03.2015 um 11:07 Uhr)

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Probiers mal mit kürzeren Bufferlängen. Falls du einen Arduino Uno benutzt bist du mit 2*1024 Bytes schon bei genau 2kB, was der SRAM-Größe entspricht. Da aber der Stack auch Platz braucht, ist das schon ein Problem.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] 29:1 Getriebe mit variabler Übersetzung?
    Von oberallgeier im Forum Motoren
    Antworten: 17
    Letzter Beitrag: 13.03.2017, 15:59
  2. Antworten: 13
    Letzter Beitrag: 02.12.2014, 09:13
  3. Arduino Sketch serielles Terminal: erkennen von CR
    Von Ford Prefect im Forum Arduino -Plattform
    Antworten: 3
    Letzter Beitrag: 18.06.2014, 14:58
  4. frage zu sketch arduino und webserver
    Von der_tom im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 11.03.2012, 18:07
  5. Hebel mit variabler Übersetzung
    Von Manf im Forum Mechanik
    Antworten: 11
    Letzter Beitrag: 31.10.2005, 18:11

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress