Tömbök

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
szuperp
Bitmanipulátor
Hozzászólások: 116
Csatlakozott: 2012. november 17. szombat, 7:00

Tömbök

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

Sziasztok!

Érdeklődnék, hogy van-e lehetőség a következőre Arduino alatt:
még a Setup előtt létre kell hozni a globális változókat, így a globális tömböket is.
viszont a tömbök méretét szeretném dinamikussá tenni, amit az EEPROM-ból olvasna ki például, vagy SD-ről...
szóval valami ilyesmit szeretnék:

int pieces = EEPROM.read(10);
float TempsByEepromIndex[pieces];
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Tömbök

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

Nem. A változók foglalása fix.
Foglald le a lehető legnagyobbat, max nem használod ki..
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Tömbök

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

Elvileg lehet dinamikusan méretezni a memória lefoglalását. A kérdés, hogy szükséged van-e rá, kb. 1.2k -val növeli meg a programod méretét, ha dinamikusan méretezel.

Az egész úgy megy, hogy a globálisan lefoglalt változók utáni és a verem előtti területet tudod dinamikusan kiosztani. Emellett a problémáid számát megtízszerezni. pl. ha elfelejted felszabadítani, betelik a memória, véletlenszerű fagyások ha kétszer szabadítod fel,...

A kérdés, hogy miért jó neked a dinamikus helyfoglalás. Van 2k memóriád, a veremnek hagysz 300 byte-ot, a kettő közötti résznél a lehető legnagyobb területet lefoglalod. A mikrovezérlőnek ez nem fáj, szemben az asztali PC-vel, ahol ha előre lefoglalnál 8 giga ramot fölöslegesen, a felhasználók felkoncolnának.

Az esetek 99%-ában AVR alatt nincs szükséged dinamikus helyfoglalásra.

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

void setup()
{
  uint16_t * mem = (uint16_t *)malloc(sizeof(uint16_t) * 100); // lefoglal
  mem = realloc(mem, sizeof(uint16_t) * 120);  // nagyobbra cserél
  free(mem);  // amikor nem kell, elengeded
}

void loop()
{
}
A hozzászólást 1 alkalommal szerkesztették, utoljára csabeszq 2014. december 2. kedd, 0:21-kor.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Tömbök

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

Amikor egy pufferben AVR alatt 64 byte-ot kell tárolnom, azt legtöbbször a vermen teszem meg:

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

void fuggveny()
{
  uint8_t puffer[64]; // a 64 helyére változót is rakhatsz!
  uint8_t i;

  // itt mindenféle nyalánkságot csinálhatsz a 64 byte memóriáddal
  for(i=0; i < 64; i++)
    puffer[i] = 0;
  // amikor kilép a függvény automatikusan törlődik a puffer nevű tömb a tartalmával együtt
}
Válasz küldése