INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Funktion ähnlich variabel definieren wie sprintf
23.02.2015, 23:38
Beitrag #17
RE: Funktion ähnlich variabel definieren wie sprintf
also diese Zeile bringt er:

Serial.begin(9600);
Serial.println("#: Serial() started");

aber dann nichts mehr.
meinst du so:

Serial.begin(9600);
Serial.println("#: Serial() started");
Serial.flush();

?

oder später in der Unterfunktion? Hinter
// #debug
Serial.println(fmtstr);
Serial.println(num);
for ( int i = 0; i < num; ++i ) {
Serial.println( vtype[i] );
}


?


was soll dadurch passieren?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 09:45
Beitrag #18
RE: Funktion ähnlich variabel definieren wie sprintf
Hi,
ich dachte, es kommt gar keine Ausgabe raus. Deshalb wollte ich das mal mit einem expliziten flush() probieren.
Ich glaube, dass das Problem ist, dass Du die Variable num nicht initialisierst. Dadurch steht am Anfang irgendwas drin und Du schreibst nachher irgendwo in den Speicher. Setze mal explizit "num = 0" am Anfang.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 10:35
Beitrag #19
RE: Funktion ähnlich variabel definieren wie sprintf
Da musst Du Dich jetzt mal mit debug-Ausgaben rantasten...

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 11:02 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 11:09 von HaWe.)
Beitrag #20
RE: Funktion ähnlich variabel definieren wie sprintf
Fehler eingegrenzt:

die "eigene" ftoa-Funktion arbeitet falsch, was die max. Genauigkeit angeht,
außerdem muss man float durch double ersetzen:


Jetzt ist der Fehler behoben!


Hat Sketch eine eigene ftoa() Funktion? ich hatte nichts gefunden... :?:
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 11:03
Beitrag #21
RE: Funktion ähnlich variabel definieren wie sprintf
Hast Du nicht Deine libc gepatcht so dass sprintf funktioniert?

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2015, 11:12 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2015 11:39 von HaWe.)
Beitrag #22
RE: Funktion ähnlich variabel definieren wie sprintf
ja, das ginge, wäre aber sehr mit Kanonen auf Spatzen geschossen, außerdem soll es auch auf nicht-gepatchten Systemen funktionieren ("C is C is C is C..." Wink )


Aber es geht jetzt, sieheda, wenn man die Genauigkeit auf 8 begrenzt und float durch double ersetzt! Idea
Code:
strconcatf(sbuf, "%s %d %f", "Teststring", 2, PI );

ergibt:
Code:
Teststring 2 3.14159265

funktioniert! Smile


Hier der Code!

Code:
/*
program: demo multi var args
multivargs 0006d
Sketch: 1.6.0
This example code is in the public domain.
*/

#include <stdarg.h>
#include <stdio.h>


char *ftoa(char *a, double f, int precision)
{
  long p[] = {0,10,100,1000,10000,100000,1000000,10000000,100000000};

  char *ret = a;
  long heiltal = (long)f;
  itoa(heiltal, a, 10);
  while (*a != '\0') a++;
  *a++ = '.';
  long desimal = abs((long)((f - heiltal) * p[precision]));
  itoa(desimal, a, 10);
  return ret;
}




char * strconcatf (char * str,  char fmtstr[], ... )
{
    va_list arguments;                    
    int  vtype[10], num=0;
  
    int len = strlen(fmtstr);
    for(int i=1; i<len; ++i) {
      if(fmtstr[i-1]=='%') {
         vtype[num++] = fmtstr[i];
      }
    }
    
    
    // #debug
    char bugstr[20];
    Serial.print("fmtstring=");Serial.print(fmtstr);Serial.println("<");
    sprintf(bugstr,"num= %d", num);
    Serial.println(bugstr);
    for ( int i = 0; i < num; ++i ) {
       sprintf(bugstr,"vtype %d= %c", i, vtype[i] );
       Serial.println(bugstr);
    }

    // Initializing arguments to store all values after num
    va_start ( arguments, num );          
  
    // concat all the strings as  many as there are
    strcpy(str,"");
    char    sval[20];
    int16_t ival;
    double  fval;
    
    for ( int i = 0; i < num; ++i )  {
        if(vtype[i]=='s') {  
          strcat(str, va_arg(arguments, char * ) );
          Serial.print("strcat1:"); Serial.println(str);
        }
        else
        if(vtype[i]=='d') {  
          ival = va_arg(arguments, int );
          itoa(ival, sval, DEC);
          strcat(str, sval);
          Serial.print("strcat2:"); Serial.println(str);
        }
        else
        if(vtype[i]=='f') {
          fval= va_arg(arguments, double );
          ftoa(sval,fval, 8);
          strcat(str, sval);
          Serial.print("strcat3:"); Serial.println(str);
        }
      
        strcat(str," ");
      
    }
    va_end ( arguments );                  // Cleans up the list

    return str;                    
}





void setup()
{
  char * sptr;
  char sbuf[512], sbuf1[20],sbuf2[20],sbuf3[20];
  char s[]=".";

  int day=22, month=02, year=2015;

  Serial.begin(9600);
  Serial.println("#: Serial() started");


  sptr=strconcatf(sbuf, "%s %d %f", "Teststring", 2, PI );
  
  Serial.print( "sbuf=");Serial.println( sbuf);
  Serial.print( "sptr=");Serial.println( sptr );


}

void loop()
{
  // nothing happens after setup
}

und hier endlich der komplette richtige De-Bug-Output:
Code:
#: Serial() started
fmtstring=%s %d %f<
num= 3
vtype 0= s
vtype 1= d
vtype 2= f
strcat1:Teststring
strcat2:Teststring 2
strcat3:Teststring 2 3.14159265
sbuf=Teststring 2 3.14159265
sptr=Teststring 2 3.14159265

Heureka!
Danke für deine Unterstützung!
Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Funktion mit Parameterübergabe - u8g torsten_156 8 395 22.06.2016 18:53
Letzter Beitrag: Pit
  Probleme mit sprintf() und dtostrf() GMBU 11 794 22.06.2016 10:52
Letzter Beitrag: GMBU
  Funktion in Loop einmalig ausführen Haustechno 4 643 09.03.2016 22:43
Letzter Beitrag: Haustechno
Star Infrarot variabel nutzen ??? Mourti 7 405 18.02.2016 18:13
Letzter Beitrag: Mourti
  HC-05 Modul auf Funktion prüfen. arduinofan 2 360 03.02.2016 19:18
Letzter Beitrag: arduinofan
  Eine Funktion vorher definieren ? arduinofan 23 1.997 30.12.2015 08:42
Letzter Beitrag: amithlon
  Funktion/Methode mit mehr als einem Ausgangswert Marduino_UNO 18 1.247 20.10.2015 10:30
Letzter Beitrag: Marduino_UNO
  Array während Laufzeit neu definieren BennIY 2 642 26.08.2015 19:22
Letzter Beitrag: BennIY
  PulseIn-Funktion unklar alpenpower 6 1.281 24.07.2015 10:05
Letzter Beitrag: Scherheinz
  auslagern von Funktion aus der void loop? MaHaI976 19 2.859 22.06.2015 20:38
Letzter Beitrag: MaHaI976

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste