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, 16:31 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2015 16:31 von Thorsten Pferdekämper.)
Beitrag #9
RE: Funktion ähnlich variabel definieren wie sprintf
Hi,
das funktioniert zufällig, aber bestimmt nicht sicher. Du gibst einen Pointer auf einen Speicherbereich auf dem Stack zurück. Das kann jederzeit überschrieben werden. Hast Du Dich noch nie gewundert, warum die Standard-Funktionen das nicht so machen?
Wegen sowas sucht man sich dumm und dämlich, wenn es dann später "unerklärbare" Fehler gibt.
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
23.02.2015, 16:59
Beitrag #10
RE: Funktion ähnlich variabel definieren wie sprintf
die Materie ist für mich noch neu - sag mir, wie's besser geht! Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2015, 17:05
Beitrag #11
RE: Funktion ähnlich variabel definieren wie sprintf
Na so, wie es das Standard-sprintf macht. Du gibst den zu benutzenden Speicherbereich von außen mit. Sicherheitshalber vielleicht noch eine maximale Länge. "Eleganter" geht es eigentlich nur, wenn man Klassen verwendet. Zum Beispiel strings aneinanderhängen:
Code:
String helloWorld = String("hello") + " " + "world" + "!";
Das geht zwar ein bisschen verschwenderisch mit dem Speicher um, sieht aber relativ elegant aus.
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
23.02.2015, 17:33 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2015 18:04 von HaWe.)
Beitrag #12
RE: Funktion ähnlich variabel definieren wie sprintf
edit -
hoppla. hatte mich vertan, du hast Recht!
werde dran arbeiten!

so, Variante 5a:

so müsste es passen!

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

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




char * strconcatsep (char * str,  int num, char * separator, ... )
{
    va_list arguments;                    

    /* Initializing arguments to store all values after num */
    va_start ( arguments, num );          
    
    // concat all the strings as  many as there are
    strcpy(str,"");
    for ( int i = 0; i < num; ++i )  {
        strcat(str, va_arg ( arguments, char * ) );
        if(i<num-1) strcat(str, separator);
    }
    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);
  
  sptr=strconcatsep(sbuf, 3, s, "22", "02", "2015" );
  Serial.println( sptr );

  Serial.println ( strconcatsep(sbuf, 3, ".", itoa(day,sbuf1,DEC), itoa(month,sbuf2,DEC), itoa(year,sbuf3,DEC) ) );
  
  
}

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

und hier die einfache strconcat-Variante 3a

(Ist ja alles noch zum Herumprobieren, um mit diesen variabel langen Übergabelisten [...] etwas Erfahrung zu sammeln...
finde aber, es ist ziemlich spannend! Cool

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

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

// concatening a various number of single strings to 1 single large one:
char * strconcat (char * str, int num, ... )
{
    va_list arguments;                    

    /* Initializing arguments to store all values after num */
    va_start ( arguments, num );          
    
    // concat all the strings as  many as there are
    strcpy(str,"");
    for ( int i = 0; i < num; ++i )  {
        strcat(str, va_arg ( arguments, char * ) );
    }
    va_end ( arguments );                  // Cleans up the list

    return str;                      
}




void setup()
{
  char sbuf[512];
  char * sptr;
  
  Serial.begin(9600);
    
  sptr = strconcat(sbuf, 4, "hello"," ","world","!" );
  Serial.println( strconcat(sbuf, 4, "hello"," ","world","!" ) );
  Serial.println( strconcat(sbuf, 2, "heute ist der ", "22.2.2015") );
  
  
}

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


share and enjoy! Smile


(ab jetzt sollen dann verschiedene Variablentypen in der variablen Listenlänge kommen, mal gucken.... Undecided )
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2015, 19:34 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2015 19:38 von HaWe.)
Beitrag #13
RE: Funktion ähnlich variabel definieren wie sprintf
so, jetzt stecke ich fest!

Ich habe versucht, verschiedene Variablentypen zu übergeben und den Typ im Formatstring zu definieren, aber da bekomme ich leider nur - mir völlig unklare - Fehlermeldungen:

Code:
/*
program: demo multi var args
multivargs 0006
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, j;
  
    int len = strlen(fmtstr);
    for(int i=1; i<len; ++i) {
      if(fmtstr[i-1]=='%') {
         num++;
         vtype[j++] = fmtstr[i];
      }
    }

    /* 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];
    int ival;
    float fval;
  
    for ( int i = 0; i < num; ++i )  {
        if(vtype[i]=='s') {  
          strcat(str, va_arg(arguments, char * ) );
        }
        else
        if(vtype[i]=='d') {  
          ival = va_arg(arguments, int );
          itoa(sval, ival, DEC);
          strcat(str, sval);
        }
        else
        if(vtype[i]=='f') {
          fval= va_arg(arguments, float );
          ftoa(sval, fval, 7);
          strcat(str, sval);
        }
      
        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);


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


}

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


Zitat:sketch_feb23a.ino: In function 'char* strconcatf(char*, char*, ...)':
sketch_feb23a.ino:58:31: error: invalid conversion from 'char*' to 'int' [-fpermissive]
In file included from C:\Programme\Arduino\hardware\arduino\sam\cores\arduino/Arduino.h:35:0,
from sketch_feb23a.ino:13:
C:\Programme\Arduino\hardware\arduino\sam\cores\arduino/itoa.h:32:14: error: initializing argument 1 of 'char* itoa(int, char*, int)' [-fpermissive]
extern char* itoa( int value, char *string, int radix ) ;
^
sketch_feb23a.ino:58:31: error: invalid conversion from 'int' to 'char*' [-fpermissive]
In file included from C:\Programme\Arduino\hardware\arduino\sam\cores\arduino/Arduino.h:35:0,
from sketch_feb23a.ino:13:
C:\Programme\Arduino\hardware\arduino\sam\cores\arduino/itoa.h:32:14: error: initializing argument 2 of 'char* itoa(int, char*, int)' [-fpermissive]
extern char* itoa( int value, char *string, int radix ) ;

Fehler beim Übersetzen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2015, 19:45
Beitrag #14
RE: Funktion ähnlich variabel definieren wie sprintf
Hi,
ich denke, Du rufst itoa falsch auf. Zuerst der int, dann der char*...
Warum willst Du eigentlich sprintf nachbauen?
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
23.02.2015, 20:33 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2015 20:46 von HaWe.)
Beitrag #15
RE: Funktion ähnlich variabel definieren wie sprintf
nicht direkt sprintf will ich nachmachen, aber das Muster der Variablenübergabe.

ich habe ja zum Einen bei Sketch kein fprintf und kein scanf für files,
das macht das File-Handling sehr umständlich.
Z.B. kann ich mit myFile.println nur einzelne Werte schreiben, wenn ich sie hinterher auch wieder Wert für Wert lesen will (seit heute immerhin schon mal mit fgets() für einzelne Werte und nicht mehr nur byteweise ), aber z.B. kann ich keine Gruppen von Variablen schreiben und lesen.

- Außerdem habe ich auch kein printf für TFT Screens um hintereinandergeschriebene Werte und Zeilenvorschub durch die üblichen Formatstrings zu nutzen. Meine Ideen dazu sind entweder ein Rücksprung von der letzten auf die erste Zeile mit oder ohne ClrScr oder aber schreiben in einen langen Array, den man dann sogar scrollen könnte. Da muss ich mal sehen, was geht und Sinn macht.

Mit dem itoa muss ich jetzt mal gucken, bin gespannt... Smile

so... - jetzt compiliert er zwar, aber er hängt irgendwo. Keine Ausgabe, auch nicht von Debug-Strings

Code:
/*
program: demo multi var args
multivargs 0006a
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;
  
    int len = strlen(fmtstr);
    for(int i=1; i<len; ++i) {
      if(fmtstr[i-1]=='%') {
         vtype[num++] = fmtstr[i];
      }
    }
    num--;
    
    // #debug
    Serial.println(fmtstr);
    Serial.println(num);
    for ( int i = 0; i < num; ++i ) {
       Serial.println( vtype[i] );
    }

    /* 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];
    int ival;
    float fval;
    
    for ( int i = 0; i < num; ++i )  {
        if(vtype[i]=='s') {  
          strcat(str, va_arg(arguments, char * ) );
        }
        else
        if(vtype[i]=='d') {  
          ival = va_arg(arguments, int );
          itoa(ival, sval, DEC);
          strcat(str, sval);
        }
        else
        if(vtype[i]=='f') {
          fval= va_arg(arguments, float );
          ftoa(sval, fval, 7);
          strcat(str, sval);
        }
      
        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.println( sptr );


}

void loop()
{
  // nothing happens after setup
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2015, 21:47
Beitrag #16
RE: Funktion ähnlich variabel definieren wie sprintf
Hi,
gar keine Debug-Ausgabe? Mach mal nach dem ersten Serial.println ein Serial.flush
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
Antwort schreiben 


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

Gehe zu:


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