Array probléma

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Norgi
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2014. június 26. csütörtök, 15:07

Array probléma

Hozzászólás Szerző: Norgi »

Sziasztok!

A következőt szerettem volna megvalósítani, de félúton elakadtam. Adott egy USER.txt az SD kártyán, ahol minden sor egy felhasználó adatát tartalmazza sima vesszővel elválasztva. Jelen esetben a token azonosítószámát, illetve a nevét. Ezt soronként beolvasom, a veszőnél kettészedem, és letárolom egy char* tipusú tömbben. A gondom az, hogy a setup() részben lefut minden látszólag hiba nélkül, mégsem tudom elérni utána a változó értékét. Példának okáért felhasznalok[3] az én értelmezésemben - és a setup() részben vissza is adja - a tömb 4. elemét kellene, hogy adja. De nem adja, valahol talál valamit a memóriában, de értelmezhetetlen. Hol tolhattam el, és mit szerintetek?

Kód: Egész kijelölése

#include <SD.h>

//--------------------------- SD kártya változói --------------------------- //
File myFile; // a file neve
char c; // beolvasott byteok
//--------------------------- SD Kártya változói --------------------------- //


//--------------------------- SD Split változói --------------------------- //
String  adat; // itt tároljuk az egyes sorokat amiket beolvasunk
int     vesszoPozi;  // a vessző helye a szövegben
//--------------------------- SD Split változói --------------------------- //

//--------------------------- Adatok változói --------------------------- //
char* felhasznalok[18]; //25 elemből áll maximum a tömb
char* felhasznalok_neve[18]; //25 elemből áll maximum a tömb
int i=0;
String stringOne;
String stringTwo;
//--------------------------- Adatok változói --------------------------- //

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.print("SD kartya inicializalasa...");

  if (!SD.begin(4)) {
    Serial.println("SD kartya hiba!");
    return;
  }
  Serial.println("SD kartya rendben!");

  // re-open the file for reading:
  myFile = SD.open("user.txt");
  if (myFile) {
    Serial.println("USER.txt megnyitva!");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      c = myFile.read();
      if (c != '\n'){
        Serial.print(c);
        adat += c;
      }
      else {
        Serial.print(c);
        //Serial.println("Sorvege"); 

        do
        {
          vesszoPozi = adat.indexOf(',');
          Serial.println(i);
          if(vesszoPozi != -1)
          {
            Serial.println( adat.substring(0,vesszoPozi));
            stringOne = adat.substring(0,vesszoPozi);
            char charBuf[stringOne.length()+1];
            stringOne.toCharArray(charBuf, stringOne.length()+1); 
            felhasznalok[i] = charBuf;
            Serial.print("Charbuf: ");
            Serial.println(charBuf);
            Serial.print("Felhasznalo adatbazis: ");
            Serial.println(felhasznalok[i]);
            adat = adat.substring(vesszoPozi+1, adat.length());

          }
          else
          {  // ha van még valami az utolsó vessző után
            if(adat.length() > 0){

              stringTwo = adat;
              if (stringTwo == "Kugler Janos") {
                Serial.println("--------------Nyert!----------");
              }

              char charBuf2[stringTwo.length()+1];
              stringTwo.toCharArray(charBuf2, stringTwo.length()+1); 
              felhasznalok_neve[i] = charBuf2;

              Serial.println(adat);  
              Serial.print("Charbuf2: ");
              Serial.println(charBuf2);
              Serial.print("Felhasznalo_neve adatbazis: ");
              Serial.println(felhasznalok_neve[i]);
            }
          }

        }
        while(vesszoPozi >=0);
        adat = "";
        i++;

      }
    }

    myFile.close(); // bezárjuk a filet
    
  } 
  
  else {
    // if the file didn't open, print an error:
    Serial.println("Nem tudom megynitni a  USER.txt fajlt!");
  }
}

void loop()
{
  Serial.println(felhasznalok[3]);
  delay(2000);
}

Előre is köszönöm a segítséget!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Array probléma

Hozzászólás Szerző: Robert »

A char* típus az nem karaktereket jelent? Azaz 18 db karaktert és nem 18 db karakterláncot (stringet)?
Pl

Kód: Egész kijelölése

#define ARRAYSIZE 10
String results[ARRAYSIZE] = { "uno", "duo", "tri" };
Norgi
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2014. június 26. csütörtök, 15:07

Re: Array probléma

Hozzászólás Szerző: Norgi »

Robert írta:A char* típus az nem karaktereket jelent? Azaz 18 db karaktert és nem 18 db karakterláncot (stringet)?
Pl

Kód: Egész kijelölése

#define ARRAYSIZE 10
String results[ARRAYSIZE] = { "uno", "duo", "tri" };

Hmmm. Nekem eddig így ment:

Kód: Egész kijelölése

char* gepek_kat[]={
  "3", "0", "0", "3", "0", "0", "0", "3", "3", "3",
  "0", "0", "4", "4", "4", "0", "0", "0", "0", "0", 
  "0", "0", "0", "4", "4", "0", "0", "1", "6", "4",
  "0", "1", "5", "3", "3", "3"  };

Gondoltam létrehozok egy üreset, és akkor fel tudom tölteni SD kártyáról. Ami érdekes, hogy amikor a Setupban visszaolvasom a felhasznalok értékét szépen ki is írja, de után a loop-ban már csak egy nullát küld vissza...
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Array probléma

Hozzászólás Szerző: csabeszq »

Hát, egyetemi évek alatt nálunk ilyen hibáért a dolgozat azonnal elégtelen lett.
A matektanárunk, amikor (a+b)^2 = a^2 + b^2 esetén azonnal egyest írt. Valaki három esetben tette ezt egy nagydolgozatban, három egyessel gazdagodott, a nagydolgozata kettes lett. Vannak esetek, amiért nincs irgalom, ez amit csináltál pontosan ugyanez.

Kód: Egész kijelölése

char * szoveg;

void setup()
{
  char buffer[5];
  buffer[0] = 'N';
  buffer[1] = 'e';
  buffer[2] = 'e';
  buffer[3] = '!';
  buffer[4] = 0;
  szoveg= buffer;
}

void loop()
{
  // na vajon most mi van a szoveg valtozoban?
  Serial.println(szoveg);
}
A vermen lefoglalsz 5 bájtot, amit eltárolsz a szoveg nevű mutatóba. Értelemszerűen a függvényből való kilépésnél a C gondosan kitakarítja a vermet, vele együtt a szöveget is. Amikor a loop meghívódik, a szoveg a legritkább esetben lesz "Nee!" helyette valami baromságot fogsz visszakapni.
Norgi
Újonc
Újonc
Hozzászólások: 13
Csatlakozott: 2014. június 26. csütörtök, 15:07

Re: Array probléma

Hozzászólás Szerző: Norgi »

csabeszq írta:Hát, egyetemi évek alatt nálunk ilyen hibáért a dolgozat azonnal elégtelen lett.
A matektanárunk, amikor (a+b)^2 = a^2 + b^2 esetén azonnal egyest írt. Valaki három esetben tette ezt egy nagydolgozatban, három egyessel gazdagodott, a nagydolgozata kettes lett. Vannak esetek, amiért nincs irgalom, ez amit csináltál pontosan ugyanez.

Kód: Egész kijelölése

char * szoveg;

void setup()
{
  char buffer[5];
  buffer[0] = 'N';
  buffer[1] = 'e';
  buffer[2] = 'e';
  buffer[3] = '!';
  buffer[4] = 0;
  szoveg= buffer;
}

void loop()
{
  // na vajon most mi van a szoveg valtozoban?
  Serial.println(szoveg);
}
A vermen lefoglalsz 5 bájtot, amit eltárolsz a szoveg nevű mutatóba. Értelemszerűen a függvényből való kilépésnél a C gondosan kitakarítja a vermet, vele együtt a szöveget is. Amikor a loop meghívódik, a szoveg a legritkább esetben lesz "Nee!" helyette valami baromságot fogsz visszakapni.

Csabesz!


Teljesen igazad van, igazából már mindent tettem mindenhová, de ez nem mentség, Mértékegység nélkül sem ért semmit a végeredmény a dolgozatban. Annyi gondom azonban még mindig lenne, hogy áttetem az egész kódot a loop függvény alá, de így sem ad vissza semmilyen értelmes adatot.
Amikor fut a ciklus tökéletesen kiírja az indexnek megfelelő értéket, de ahogyan véget ér, már nem elérhetőek az adatok, pedig a setup() előtt dekraláltam a változókat.


Szerintetek mit nem sikerült felgonom, így hajnalban?


Norgi
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Array probléma

Hozzászólás Szerző: csabeszq »

Kód: Egész kijelölése

char szoveg[5];

void setup()
{
  szoveg[0] = 'N';
  szoveg[1] = 'e';
  szoveg[2] = 'e';
  szoveg[3] = '!';
  szoveg[4] = 0;
}

void loop()
{
  Serial.println(szoveg);
}
Válasz küldése