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í
paměť ram
Re: paměť ram
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í.
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í.
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á 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ů.
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);
}
Re: paměť ram
Díky za vysvětlení, to jsem nečekal.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti