Tömb létrehozása futás közben

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Tömb létrehozása futás közben

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

Sziasztok!

Van egy probléma, amire nem találok megoldást.
Tegyük fel, hogy van egy olyan része a programomnak, ami csak bizonyos feltétel esetén fut. Ha mondjuk a 2-es üzemmód van kiválasztva. Ekkor van egy tömböm, aminek mondjuk van 60 eleme. Másodpercenként eltárolok egy értéket, de mindig az első helyre. Előtte az előző értékeket egy hellyel tovább csúsztatom. Ezután az elemeket szépen kiíratom a soros portra vagy kijelzőre vagy bárhova - ez már lényegtelen. Amíg az üzemmód == 2, addig ebbe a ciklusba mindig belép, mindig van egy új értékem, a többit csúsztatom, az újat pedig letárolom.

Amint az üzemmódom nem 2, már nincs szükségem a tömbre.
Ha cikluson belül hozom létre, akkor minden egyes belépéskor újra létrehozza a program a tömböt, így nem lesznek előző értékek. Ha pedig globális változóként deklarálom, akkor olyankor is foglalja a memóriát, ha semmi szükségem rá, mert épp nem a 2-es módban vagyok.

Hogyan lehet azt megoldani, hogy akkor jöjjön létre a tömböm, amikor a mód==2 feltétel teljesül? Viszont csak egyszer hozza létre és egészen addig tárolja benne az adatokat, amíg a mód == 2. Létezik erre megoldás? Javaban azt hiszem, ezt meg lehetne írni. Na de C(++)-ben?
vargham
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2014. január 8. szerda, 8:32

Re: Tömb létrehozása futás közben

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

Nem javasolt new/delete illetve malloc/free használata mikrokontrolleren. Kevés a memória, könnyen fragmentálódik, aztán elfogy. Tehát hiába lenne elég szabad memória, ha az nem egybefüggő, akkor nem lehet lefoglalni. MMU pedig nincs egy ilyen kis eszközben. Érdemes ELŐRE lefoglalni a LEGNAGYOBB szükséges memóriát.
Az Arduino C++, valahogy így csinálnám, ha nagyon kellene:

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

int *intArray = NULL;

void setup()
{

}

void loop()
{

}

void startMode2()
{
    intArray = new int[60];
}

void finishMode2()
{
    delete[] intArray;
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Tömb létrehozása futás közben

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

Elvileg az alprogramban/szubrutinban is létrehozhatod - ha nem kell külső területen.
De ha a program legelején lefoglalod és ha kell használod, ha nem, akkor lefoglalva marad?

Ki van centizve a memóriafoglalás? (SRAM?)
http://www.tavir.hu - a gazda :)
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: Tömb létrehozása futás közben

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

Ez egy 2 dimenziós tömb lenne igazából, byte típus, 64x80 elem, ami kb. 5KB. Még a Megának is igen sok. Valahol egyébként láttam olyan programot, ami megszünteti a memória fragmentációt. Azért kell ennyi, mert 80 különböző értéket mérek egyszerre és másodpercenként újra, újra... aztán jó lenne ha minimum egy percig meglennének az adatok. Ki kell rajzolni a képernyőre is egy vízesésdiagramot, emiatt kellenek az előzmények. De ha épp nem a diagramot nézi a user és nem realtime mérés fut, akkor nincs szükségem a tömbre.

Gondoltam még a goto-ra is vagy pedig, van a C++-nak objektum orientált része is. De ez a delete elég jónak tűnik. Viszont akkor figyelnem kell a szabad memóriát és tesztelni sokat, hogy mi lesz, mert pontosan emiatt, a memória fragmentáció hatására már jöttek érdekes hibák (lefagyás, újraindulás..) Szerintem megpróbálok áttérni Arduino Due-ra, mert a Megának kicsit karcsú a procija is ekkora adathalmazhoz.
vargham
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2014. január 8. szerda, 8:32

Re: Tömb létrehozása futás közben

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

Vagy optimalizálsz (simán kiderülhet, hogy ügyes becsléssel a mérések háromnegyede megspórolható) vagy váltasz nagyobb hardverre.
Válasz küldése