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 mit variabler Parameterliste: Parameterliste weiterreichen?
04.03.2015, 23:05
Beitrag #17
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
sorry musste grad koffer packen, bin 2 tage weg.

so langsam tastet man sich vor.
edit - halt stopp - jetzt macht er schon nach
cnt = vsscanf ( str, fmtstr, args );
dass könnte darauf hindeuten, dass das vsscanf schiefläuft, und er später nur noch ein stück weiter gekommen ist weil die zufälligen werte die im speicher lagen nicht gleich gecrasht haben.

in setup sind z.B.
int16_t ival, n, m;
double fval, x, y;

"%s %d %d %f %f"
%d erwartet ja jetzt evtl. einen int32_t dann sitzen hinter den zeigern von n und m evtl. zuwenig bytes.
dann würde er zu weit schreiben beim einlesen. auch der double ist ja eigentlich nicht richtig, weil %f ja einen kleineren float erwartet.

vielleicht die variablen-typen mal angleichen und auch versuchen erst mal nur eine variable einzulesen, evtl. den string.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.03.2015, 13:01
Beitrag #18
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
hallo,
habe komplett überall sämtliche ints/int32 alle auf int16_t umgestellt,
trotzdem leider immer noch dieselben Fehler, absolut keine Verbesserung.
Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.03.2015, 18:19
Beitrag #19
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
hallo,
habe inzwischen den überblick verloren wie der code aussieht.
ich vermute aber an der variablen parameterliste hängt es nicht.
ich würde jetzt mal versuchen in das sscanf die variablen direkt einzugeben, ohne die variable parameterliste.
die variable parameterliste verstellt erstmal, dass man ein ergebnis sieht.
erstmal einzeln und dann in kombination, und durch ausgabe prüfen ob das was gelesen wurde auch richtig rauskommt.
an den variablen-typen die sscanf aus dem formatstring erwartet entscheidet sich ja wieviel bytes er hinter den parametern erwartet. wenn zuwenig bytes zur verfügung stehen schreibt er beim scanf trotzdem gnadenlos den speicher voll.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2015, 17:16 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2015 17:56 von HaWe.)
Beitrag #20
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
hahaaa - Problem gelöst!

falsche size-Deklaration (musste int sein, nicht char,
als Variablen keine int16, sondern immer int32,
und es durften keine double dazwischen sein, alles float!

es klappt ! Smile


Code:
//********************************************************************************​​​***********  
int32_t  fscanf_ ( File * stream, const char fmtstr[], ... ) {
   const  int32_t   MAXSTRSIZE = 1024;
   char   str[MAXSTRSIZE];
   va_list   args;  
   int16_t   i=0, cnt=0;
   int16_t   chr;
  
   va_start(args, fmtstr);
  
   strcpy(str, "");
   while ( (stream->available()) && (i < MAXSTRSIZE-1) ) {    
      chr = stream->read() ;
      if (chr>=0 && chr!='\n') {
           str[i]=(char)chr;      
           ++i;
      }
      else break;      
   }  
  
   str[++i] = '\0';
   // #debug
   // Serial.print("fscanstr:"); Serial.println(str);
                                                        
   cnt = vsscanf ( str, fmtstr, args );  
   va_end(args);

   return cnt;
}
//********************************************************************************​​​***********


Beispielaufrufe mit SD card Funktionen:
Code:
/*
SD card: fprintf_() und fscanf_()
ver 0.04
*/

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


// SD Card
#define SD_CSpin 4
File myFile;
char fname[64];

char sdata[128];
char sbuf[128];



//********************************************************************************​​***********  
int32_t  fscanf_ ( File * stream, const char fmtstr[], ... ) {
   const  int32_t   MAXSTRSIZE = 1024;
   char   str[MAXSTRSIZE];
   va_list   args;  
   int16_t   i=0, cnt=0;
   int16_t   chr;
  
   va_start(args, fmtstr);
  
   strcpy(str, "");
   while ( (stream->available()) && (i < MAXSTRSIZE-1) ) {    
      chr = stream->read() ;
      if (chr>=0 && chr!='\n') {
           str[i]=(char)chr;      
           ++i;
      }
      else break;      
   }  
  
   str[++i] = '\0';
   // #debug
   // Serial.print("fscanstr:"); Serial.println(str);
                                                        
   cnt = vsscanf ( str, fmtstr, args );  
   va_end(args);

   return cnt;
}


//********************************************************************************​​***********  

int fprintf_ ( File * stream, const char fmtstr[], ... ) {
   char      str[1024];
   va_list   args;
   int32_t   num;
    
   va_start( args, fmtstr );
   num = vsnprintf(str, sizeof(str), fmtstr, args);
   stream->print(str);
   // #debug
  
   va_end( args );
   Serial.print("fprintf_:"); Serial.println(str);
   return num;
}

//********************************************************************************​​***********  


void setup()
{
  int32_t  p, i, cnt;
  char     sval[20];
  int32_t  ival, n, m;
  float   fval, x, y;
  // alternativ, ohne jeden Effekt: float   fval, x, y;

  pinMode(SD_CSpin, OUTPUT);  
  Serial.begin(9600);
  
  sprintf(sbuf,"#: SD Initializing... ");
  Serial.println(sbuf);  

  while(!SD.begin(SD_CSpin) ) {
    sprintf(sbuf,"#: ...SD init failed ");
    Serial.println(sbuf);
    delay(1000);
  }
  
  sprintf(sbuf,"#: ...SD OK !      ");
  Serial.println(sbuf);  
  strcpy(fname,"test.txt");
  
  if (SD.exists(fname) ) {
    sprintf(sbuf,"#: %s exists     ",fname);
    Serial.println(sbuf);  
    
    sprintf(sbuf,"#: Removing %s      ",fname);  
    Serial.println(sbuf);
    
    SD.remove("test.txt");
    // removed: success ?
    if (SD.exists(fname) ) {
       sprintf(sbuf,"#: %s  exists     ",fname);  
       Serial.println(sbuf);  
    }
    else {
       sprintf(sbuf,"#: %s  N/A     ",fname);  
       Serial.println(sbuf);  
     }
  }
    


  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.  
  myFile = SD.open(fname, FILE_WRITE);
  
  if (myFile) {
    // if the file opened okay, write to it, then close file:
    sprintf(sbuf,"#: Writing strings to %s ",fname);
    Serial.println(sbuf);
    
    //---------------------------------------------------------------------------------
    // write data to file
    fprintf_(&myFile, "%d %d %f %f\n",  1, 2, PI, 4.567890);    
    //---------------------------------------------------------------------------------
  
    // close the file:
    myFile.close();
    sprintf(sbuf,"#: %s closed.   ",fname);
    Serial.println(sbuf);  
  }  
  else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);      
  }
  
  
  
  
  
  // re-open the file for reading:
  Serial.println();
  
  myFile = SD.open(fname);
  if (myFile) {
    sprintf(sbuf,"#: reading %s ",fname);
    Serial.println(sbuf);  
    
    // read from the file until there's nothing else in it:
    i=0;
    cnt=0;  
    strcpy(sdata, "");
    
    //---------------------------------------------------------------------------------
    cnt = fscanf_(&myFile, "%d %d %f %f", &m, &n, &x, &y);
    //---------------------------------------------------------------------------------
                            
    Serial.println("# nach Aufruf cnt=fscanf_ im Hauptprogramm");    
       // Testausgabe:
       Serial.print("returned cnt="); Serial.println(cnt);  
       Serial.println();
       Serial.println("returned reformatted variables m,n,x,y:");
       Serial.println(m);
       Serial.println(n);
       Serial.println(x);
       Serial.println(y);

    
    // close the file:
    myFile.close();        
    sprintf(sbuf,"#: %s closed. ",fname);
    Serial.println(sbuf);      
  } else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);      
    Serial.println(sbuf);

  }
}

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


Code:
#: SD Initializing...
#: ...SD OK !      
#: test.txt exists    
#: Removing test.txt      
#: test.txt  N/A    
#: Writing strings to test.txt
fprintf_:1 2 3.141593 4.567890

#: test.txt closed.  

#: reading test.txt
# nach Aufruf cnt=fscanf_ im Hauptprogramm
returned cnt=4

returned reformatted variables m,n,x,y:
1
2
3.14
4.57
#: test.txt closed.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2015, 19:56 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2015 17:31 von HaWe.)
Beitrag #21
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
und weiter gehts...

ich möchte nun die folgende lib standardmäßig als lib installieren, damit ich sie per
#include <ardustdio.h> -
einbinden kann.

was muss ich machen?
nur als ardustdio.h file in den libraries-Ordner kopieren reicht nicht, in einen gleichnamigen Unter-Ordner kopieren auch nicht... Huh

Code:
#IFNDEF  ARDUSTDIO_H
#DEFINE ARDUSTDIO_H

//********************************************************************************​?***********
int fprintf_ ( File * stream, const char fmtstr[], ... ) {
   char      str[1024];
   va_list   arguments;
   int16_t   num;

   va_start( arguments, fmtstr);
   num = vsprintf(str, fmtstr, arguments);
   stream->print(str);
   va_end( arguments );

   return num;
}
//********************************************************************************​?***********


//********************************************************************************​***********
char * fgets_ ( char * str, int32_t num, File * stream ) {
  int32_t i = 0;

  strcpy(str, "");
  while (i < (num - 1)) { // got room for newline and terminating null?
    int16_t ch = stream->read();
    if (ch < 0) // end of file
      break;
    str[i++] = ch;
    if ('\n' == ch) // end of line
      break;
  }

  if (i) { // room in buffer for terminating null
    str[i] = 0;
    return str;
  }
  else
  return NULL; // buffer too small or immediate end of file
  // { strcpy(str, ""); return str; } // alternative
}
//********************************************************************************​***********





//********************************************************************************​?***********
int32_t  fscanf_ ( File * stream, const char fmtstr[], ... ) {
   const  int32_t   MAXSTRSIZE = 1024;
   char   str[MAXSTRSIZE];
   va_list   args;
   int32_t   i=0, cnt=0;
   int16_t   chr;

   va_start(args, fmtstr);

   strcpy(str, "");
   while ( (stream->available()) && (i < MAXSTRSIZE-1) ) {
      chr = stream->read() ;
      if (chr>=0 && chr!='\n') {
           str[i]=(char)chr;
           ++i;
      }
      else break;
   }

   str[++i] = '\0';

   cnt = vsscanf ( str, fmtstr, args );
   va_end(args);

   return cnt;
}
//********************************************************************************​?***********

#ENDIF
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.03.2015, 11:35
Beitrag #22
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
hallo,
wie der arduino-compiler die libs regelt weiss ich nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.03.2015, 15:38
Beitrag #23
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
das weiß doch hoffentlich aber jemand anderes hier...?


Anm.:
übrigens scheint vsscanf nur für den Due compiliert zu werden:
für Due Plattform compiliert es + läuft,
für den Mega aber nicht, hier kommt
Zitat:Build options changed, rebuilding all
SDfprintf_fscanf101.ino: In function 'int32_t fscanf_(File*, const char*, ...)':
SDfprintf_fscanf101.ino:46:38: error: 'vsscanf' was not declared in this scope
Fehler beim Übersetzen
Da muss Arduino IMO aber noch einiges an seinen libs arbeiten...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.03.2015, 11:03
Beitrag #24
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
Hi,
ich denke, dass Du im libraries-Folder einen Subfolder mit dem Namen der Lib, also "ardustdio" brauchst. Dort muss dann das .h-File und das .cpp-File rein. Ich weiß nicht, ob ein .cpp-File unbedingt sein muss. Möglicherweise probier es mal mit einer leeren Datei.
Ansonsten versuch mal #include "ardustdio.h".
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 399 22.06.2016 18:53
Letzter Beitrag: Pit
  Funktion in Loop einmalig ausführen Haustechno 4 646 09.03.2016 22:43
Letzter Beitrag: Haustechno
  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.259 20.10.2015 10:30
Letzter Beitrag: Marduino_UNO
  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
  Funktion aus Wertepunkten erstellen- wie ? HaWe 6 1.517 05.06.2015 07:53
Letzter Beitrag: HaWe
  C-Code für eine substring-Funktion: richtig ? HaWe 1 670 27.05.2015 14:01
Letzter Beitrag: HaWe
  gesucht: C-Funktion zum Einfügen eines Teilstrings in einen größeren HaWe 1 863 25.05.2015 10:30
Letzter Beitrag: HaWe

Gehe zu:


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