Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Konfifaili lugemine (Arduino / C++) märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
warwas
HV Guru
warwas

liitunud: 06.07.2003



Autoriseeritud ID-kaardiga

sõnum 07.03.2012 01:55:42 Konfifaili lugemine (Arduino / C++) vasta tsitaadiga

Üritan siin tekitada sellist lahendust, kus Arduinos olev rakendus oskaks oma tööks vajaikud parameetrid SD kaardil olevast failist sisse lugeda.
Oleks vaja funktsiooni, mis oskab konfifailist vajaliku rea üles leida. Rea enda parimise lahendus on mul juba olemas ja toimib.

Konf ise oleks stiilis:
parameeter1=123
parameeter2=456
parameeter3=789


Hetkeseisuga olen kokku klopsinud sellise asja:
c++:
  1. char *readini(char* str) {
  2.     if (!configFile.open(&root, "CONFIG.INI", O_RDONLY)) {
  3.         error("Conf open failed");
  4.     }
  5.     char *result = NULL;
  6.     char param[50];
  7.     char delims[] = "=";
  8.     int i = 0;
  9.     int16_t c;
  10.  
  11.     while ((c = configFile.read()) > 0) {
  12.         param[i] += (char)c;
  13.         i++;
  14.         if((char)c == '\n') {
  15.             result = strtok(param, delims);
  16.             if( strcmp (result,str) == 0) {
  17.                 configFile.close();
  18.                 return (strtok(NULL, delims));
  19.             }
  20.             clearStr(param);
  21.             i = 0;
  22.         }
  23.     }
  24. }
  25.  
  26.  
  27. void clearStr (char* str) {
  28.     for (int c = 0; c < strlen(str); c++) {
  29.         str[c] = NULL;
  30.     }
  31. }

Fail avatakse ja nämmutatakse kenasti rida haaval läbi, aga seda soovitud stringi üles ei leita icon_neutral.gif
Kommentaarid: 247 loe/lisa Kasutajad arvavad:  :: 0 :: 3 :: 224
tagasi üles
vaata kasutaja infot saada privaatsõnum
Smith
HV veteran
Smith

liitunud: 25.08.2002



Autoriseeritud ID-kaardiga

sõnum 07.03.2012 10:07:21 vasta tsitaadiga

Kas faili esimese rea pealt ka ei leia?
_________________
Only the Central Computer knows the truth
Kommentaarid: 158 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 145
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
warwas
HV Guru
warwas

liitunud: 06.07.2003



Autoriseeritud ID-kaardiga

sõnum 07.03.2012 10:24:53 vasta tsitaadiga

Smith kirjutas:
Kas faili esimese rea pealt ka ei leia?

Hea küsimus - ma proovisin pidevalt alumiste ridadega.
Vidin on kahjuks kodus, niiet alles õhtul saan proovida.
Kommentaarid: 247 loe/lisa Kasutajad arvavad:  :: 0 :: 3 :: 224
tagasi üles
vaata kasutaja infot saada privaatsõnum
andreie
HV vaatleja
andreie

liitunud: 09.09.2006




sõnum 07.03.2012 19:32:46 vasta tsitaadiga

Muutuja "param" asub pinus ja seega pärast funktsioonist "readini" tagasi pöördumist asub taaskasutusse minevas mälualas. Seega, keegi ei garanteeri, kui ruttu või kui hilja see mälu muude andmetega üle kirjutatakse - võib-olla isegi kohe.

Kuna Sa nagunii C++'i kasutad, oleks lihtne lahendus kasutada C++'i standardteegi klassi std::string (päisefail: #include <string>); muutes selle jaoks funktsiooni "readini" tagastava väärtuse tüübi std::string'iks.

Tulevikule mõeldes pakun välja kaaluda mitte iseehitamist, vaid teekide kasutuselevõttu - näiteks libPropList, JSON või midagi muud samas stiilis. Seda muidugi juhul, kui on ette näha, et neid keerulisemaid võimalusi ka vaja läheb.

_________________
Unix survives only because everyone else has done so badly.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
warwas
HV Guru
warwas

liitunud: 06.07.2003



Autoriseeritud ID-kaardiga

sõnum 08.03.2012 01:01:11 vasta tsitaadiga

Tänud vihjete eest! thumbs_up.gif
Tundub, et andreie oli täiesti õigel teel. Kui kivisse ainult selle lugemise ja parsimise osa kirjutasin, siis kõik töötas. Kui aga ülejäänud koodi ka juurde panin, siis ilmselgelt mälukasutus kasvas ja tekkisidki anomaaliad.

Tegin selle esialgu String klassi abil ringi ja esialgu tundub toimivat:
c++:
  1. String readini(char* str) {
  2.     if (!configFile.open(&root, "CONFIG.INI", O_RDONLY)) {
  3.         error("Conf open failed");
  4.     }
  5.  
  6.     String param;
  7.     int i = 0;
  8.     int16_t c;
  9.  
  10.     while ((c = configFile.read()) > 0) {
  11.         param += (char)c;
  12.         i++;
  13.         if((char)c == '\n') {
  14.             if(param.indexOf(str) == 0) {
  15.                 configFile.close();
  16.                 int delimPos = param.indexOf('=');
  17.                 param = param.substring(delimPos+1, param.length());
  18.              
  19.                 return param;
  20.             }
  21.             param = 0;
  22.             i = 0;
  23.         }
  24.     }
  25. }

Pean nüüd ainult veel oma parameetreid endid (IP->byte[], jms.) parsivad funktsioonid ringi tegema, et need ka stringe sööma hakkaks.

Kuna kõik see teema on minu jaoks veel suhtkoht uus ja võõras, siis esialgu veel C/C++ tumedatesse sügavustesse kaevuma ei hakkaks.
Kommentaarid: 247 loe/lisa Kasutajad arvavad:  :: 0 :: 3 :: 224
tagasi üles
vaata kasutaja infot saada privaatsõnum
andreie
HV vaatleja
andreie

liitunud: 09.09.2006




sõnum 08.03.2012 23:22:14 vasta tsitaadiga

Teine variant on panna funktsioonile "readini" argumendina kaasa puhver "param". Siis Sa ei pea oma teisi funktsioone ringi tegema.

Mulle endale meeldib see variant vähem, sest teeb funktsiooni "readini" kasutamise keerulisemaks ja lisaks tuleb viitadega toimetamisel alati teha lisatööd kindlustamaks mälu vabastamist pärast kasutamise lõppu (mõnikord saab seda küll pinu kasutamisega lihtsustada).

_________________
Unix survives only because everyone else has done so badly.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
warwas
HV Guru
warwas

liitunud: 06.07.2003



Autoriseeritud ID-kaardiga

sõnum 09.03.2012 10:23:31 vasta tsitaadiga

Tänud! thumbs_up.gif
Kui aega saan, siis kaalun neid teisi variante kah.
Kommentaarid: 247 loe/lisa Kasutajad arvavad:  :: 0 :: 3 :: 224
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Konfifaili lugemine (Arduino / C++)
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.