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, 19:58
Beitrag #9
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
(04.03.2015 19:49)HaWe schrieb:  danke - aber schade, leider noch keine Änderung Sad

gib mal nach dem va_end und vor dem return noch irgendetwas aus.
also so prinln ("blabla") oder so
nur um zu sehen ob er über das va_end hinwegkommt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2015, 20:09
Beitrag #10
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
leider auch nicht : Sad


Code:
int fscanf_ ( File * stream, const char fmtstr[], ... ) {
   const char 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() ) {    
      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 );  

   // #debug
   Serial.print("fscancnt:"); Serial.println(cnt);
   va_end(args);
  
   Serial.println("Nach va_end(args)...");
   Serial.print("fscancnt:"); Serial.println(cnt);
   return cnt;
}

Code:
#: reading test.txt
fscanstr:Testvalues: 1 2 3.141593 4.567890    
fscancnt:5
Nach va_end(args)...
fscancnt:5
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2015, 20:23
Beitrag #11
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
va_end ist ein macro keine funktion, andere precompiler motzen da wenn blanks drinstehen.

was mir noch auffällt ist,

int fscanf_ erwartet ein int zurück
aber
cnt ist als int32_t deklariert.

int32_t i=0, cnt=0;

das würde ich mal angleichen
keine ahnung wieviel bytes ein int auf diesem compiler hat.

ansonsten mal versuchen return (int)cnt;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2015, 20:28 (Dieser Beitrag wurde zuletzt bearbeitet: 04.03.2015 20:37 von HaWe.)
Beitrag #12
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
habe alles durchprobiert:
- keine Leerzeichen bei va_end(args);
- alle cnt als int16_t : keine Änderung
- fscanf_ als void: auch keine Änderung Sad

ps,
ich habe den Due, da ist int automatisch int32, aber jetzt ist alles komplett zurück auf int16 (reicht ja auch für Teilstrings)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2015, 20:52
Beitrag #13
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
dann würde ich als nächstes in der setup funktion

cnt = fscanf_(&myFile, "%s %d %d %f %f", sdata, &m, &n, &x, &y);
mal versuchsweise durch

fscanf_(&myFile, "%s %d %d %f %f", sdata, &m, &n, &x, &y); sodass die zuweisung wegfällt.
achtung danach wird gleich cnt ausgegeben, das ist dann aber nicht initialisiert.

der cnt in setup ist ja int_16
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2015, 21:01 (Dieser Beitrag wurde zuletzt bearbeitet: 04.03.2015 21:04 von HaWe.)
Beitrag #14
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
hatte ich doch geschrieben:
alles probiert, keine Änderung:

- alle cnt als int16_t : keine Änderung
- fscanf_ als void: auch keine Änderung

ich fürchte eher es könnte an den Variablen-Referenzen liegen...
nee, eigentlich auch unwahrscheinlich
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2015, 21:18
Beitrag #15
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
an der stelle:
int fscanf_ ( File * stream, const char fmtstr[], ... ) {
const char 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() ) {
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 );

// #debug
Serial.print("fscancnt:"); Serial.println(cnt);
va_end ( args );

return cnt;
}
wird gar nicht die eingelesenen variblen ausgeben.
wenn cnt = 5 ist kann das auch sein wenn er das gelesene sonst wo hingeschrieben hat.
insbesondere das globale sdata könnte nicht nullterminiert sein
vielleicht crashct es nahc dem verlassen von fscanf
z.b.
Serial.println(sdata);
mal sehn ob er nach der rückkehr aus fscanf noch ein blaba ausgeben ,
das sdata könnte man auch mal mit memset komplett mit nullen vorbesetzten.
oder das
Serial.println(sdata);
mal auskommentieren
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.03.2015, 21:23 (Dieser Beitrag wurde zuletzt bearbeitet: 04.03.2015 21:49 von HaWe.)
Beitrag #16
RE: Funktion mit variabler Parameterliste: Parameterliste weiterreichen?
ich verstehe jetzt nicht ganz, was ich machen soll-
nach
Code:
//---------------------------------------------------------------------------------
    cnt = fscanf_(&myFile, "%s %d %d %f %f", sdata, &m, &n, &x, &y);
    //---------------------------------------------------------------------------------
    Serial.println("blabla");

wird nichts ausgegeben.
Das ist allerdings nicht überraschend, denn sonst hätte er ja auch cnt ausgegeben, egal mit welchem wert (initialisiert oder als Returnwert) :

er kehrt nicht aus der Funktion zurück - genau das ist das Problem... Sad

aber warum?

auch wenn ich sdata komplett rausschmaiße, ändert sich nichts

edit - halt stopp - jetzt macht er schon nach
cnt = vsscanf ( str, fmtstr, args );
nichts mehr...


Code:
/*
SD card: fprintf_() und fgets_()
ver 1.01
*/

#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];



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


int16_t  fscanf_ ( File * stream, const char fmtstr[], ... ) {
   const char 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() ) {    
      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 );  

   // #debug
   Serial.print("fscancnt:"); Serial.println(cnt);
   va_end(args);
  
   Serial.println("Nach va_end(args)...");
   Serial.print("fscancnt:"); Serial.println(cnt);
   return cnt;
}


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

int fprintf_ ( File * stream, const char fmtstr[], ... ) {
   char      str[1024];
   va_list   args;
   int16_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()
{
  int16_t  p, i, cnt;
  char     sval[20];
  int16_t  ival, n, m;
  double   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("blabla");
       // Testausgabe:
       Serial.println(cnt);   //  <<<<<<<<<<<<<<<<<<<<  keine Ausgabe mehr !!! <<<<<<<<<<<
       Serial.println();
       //Serial.println(sdata);
       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
fscanstr:1 2 3.141593 4.567890

kein Bild, kein Ton mehr nach vsscanf !
Angry
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.020 30.12.2015 08:42
Letzter Beitrag: amithlon
  Funktion/Methode mit mehr als einem Ausgangswert Marduino_UNO 18 1.258 20.10.2015 10:30
Letzter Beitrag: Marduino_UNO
  PulseIn-Funktion unklar alpenpower 6 1.285 24.07.2015 10:05
Letzter Beitrag: Scherheinz
  auslagern von Funktion aus der void loop? MaHaI976 19 2.885 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