paměť ram

Odpovědět
caga1
Příspěvky: 5
Registrován: 07 kvě 2023, 22:12
Reputation: 0

paměť ram

Příspěvek od caga1 » 07 kvě 2023, 22:20

Ahoj, mám asi hloupý dotaz, ale nějak si to neumí vysvětlit.

Když překládám nějaký kód, tak dole vyskakuje hláška třeba:
Globální proměnné zabírají 150 bytů (5%) dynamické paměti, 2410 bytů zůstává pro lokální proměnné. Maximum je 2560 bytů.

Ale jak je možné, že když kód doplním o deklaraci další proměnné, že se informace o použité velikosti a o volné velikosti nezmění ?

Jak to, že mi IDE dovolí deklarovat pole byte pole[9999]; když procesor tolik ram prostě nemá ?

díky za vysvětlení

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: paměť ram

Příspěvek od AstroMiK » 07 kvě 2023, 23:19

Jde o to, jestli opravdu to pole v programu využiješ.
Kompilátor provádí optimalizaci, a když zjistí, že k činnosti není pole potřebné, tak deklaraci vůbec neprovede.

Níže je jednoduchý příklad.
Do pole se ukládají nějaká "jakoby náhodná" čísla.
Když bude jedinou funkcí programu vypsat zpátky z pole tu uloženou hodnotu, tak kompilátor pole nepoužije a program bude fungovat podle očekávání.
Projekt zabírá 1844 bytů (6%) úložného místa pro program. Maximum je 30720 bytů.
Globální proměnné zabírají 190 bytů (9%) dynamické paměti, 1858 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
Když se ale odkomentuje řádka "Serial.println(pole[50]);" , tak už se kompilace neprovede z důvodu nedostatku paměti, protože se pole[] používá opravdu jako paměť.
Projekt zabírá 1946 bytů (6%) úložného místa pro program. Maximum je 30720 bytů.

data section exceeds available space in board
Globální proměnné zabírají 10189 bytů (497%) dynamické paměti, -8141 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
Not enough memory; see https://support.arduino.cc/hc/en-us/art ... 0013825179 for tips on reducing your footprint.
Nastala chyba při kompilaci u desky Arduino Nano.

Kód: Vybrat vše

byte pole [9999];

int index;

void setup(void)
  {
    Serial.begin(9600);
  }


void loop(void)
  {
    index ++;
    if (index > 9999)  index = 0;

    pole[index] = millis() % 256;          // zaplneni pole nejakymi "nahodnymi" cisly



    Serial.println(pole[index]);           // pokud bude jedinou činností programu výpis aktuální hodnoty, kompilátor si to optimalizuje tak, že vlastně ani žádné pole nepotřebuje

//    Serial.println(pole[50]);            // pokud by se ale mělo to pole používat opravdu jako paměť kde bude bude potřeba přistupovat i ke starým záznamům, kompilátor zahlásí chybu "nedostatek paměti"


    
    delay(100);
  }

caga1
Příspěvky: 5
Registrován: 07 kvě 2023, 22:12
Reputation: 0

Re: paměť ram

Příspěvek od caga1 » 08 kvě 2023, 09:46

Díky za vysvětlení, to jsem nečekal.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů