Stránka 6 z 6
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 05 úno 2020, 10:46
od Maxim
Ještě se zeptám, existují nějaké metody jak zjistit co se v té paměti děje? u mě se chyby projeví tak, že na tom displeji při 70% zaplnění paměti (píše IDE) zobrazují hodnoty, které by měly být vypsány jinde.. po minutě se to třeba sekne úplně.
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 05 úno 2020, 18:37
od ondraN
Padá ti to kvůli chybám, ne kvůli paměti (to možná taky).
Kód: Vybrat vše
long zobrazeniCasuAZnakuCasu(char *pomocnePole , size_t velikostPole , long pocetCyklu) {
long hodnotaCasuUpravena = pocetCyklu;
hodnotaCasuUpravena = pocetCyklu * 2;
if (hodnotaCasuUpravena < 99) {
hodnotaCasuUpravena = snprintf(pomocnePole, velikostPole - 1, "%i" , (long)hodnotaCasuUpravena); //převede int "hodnotaCasu" na řetězec "velikostPole" a uloží do velikostPole délku proměnné velikostPole, kterou vrací funkce snprinf
pomocnePole[hodnotaCasuUpravena] = 's'; //na konec řetězce připíše s
}
if ((hodnotaCasuUpravena > 99) and (hodnotaCasuUpravena < 5939)) {
hodnotaCasuUpravena = hodnotaCasuUpravena / 60;
hodnotaCasuUpravena = snprintf(pomocnePole, velikostPole - 1, "%i" , (long)hodnotaCasuUpravena); //převede int "hodnotaCasu" na řetězec "velikostPole" a uloží do velikostPole délku proměnné velikostPole, kterou vrací funkce snprinf
pomocnePole[hodnotaCasuUpravena] = 'm'; //na konec řetězce připíše m
}
if (hodnotaCasuUpravena > 5939) {
hodnotaCasuUpravena = hodnotaCasuUpravena / 3600;
hodnotaCasuUpravena = snprintf(pomocnePole, velikostPole - 1, "%i" , (long)hodnotaCasuUpravena); //převede int "hodnotaCasu" na řetězec "velikostPole" a uloží do velikostPole délku proměnné velikostPole, kterou vrací funkce snprinf
pomocnePole[hodnotaCasuUpravena] = 'h'; //na konec řetězce připíše h
}
Podívej se, jaký index používáš tady
Kód: Vybrat vše
pomocnePole[hodnotaCasuUpravena] = 'm'; //na konec řetězce připíše m
Kam se ti to zapíše, když je hodnotaCasuUpravena větší než 9, což je poslední člen pole???
Prostě si po nějakém čase začneš přepisovat paměť kde je uloženo něco úplně jiného a to končí zásekem.
Dál jsem ten kód nezkoumal, protože bez pořádných komentářů netuším, co se tam má vlasně dět.
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 05 úno 2020, 18:59
od kiRRow
Hodně ramky ušetříš - Serial.println(F("Tento text bude jen v FLASH pameti a nebude plnit SRAM"));
Abys přesně věděl co se děje v paměti, musel bys ten program po zkompilování prozkoumat na simulátoru toho procesoru ... a někdy to znamená i jít krok po kroku ...
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 20 úno 2020, 10:03
od Maxim
--> ondraN
Díky za upozornění, tuto chybu jsem opravil.
Zatím jsem nezkoušel vrátit počet ukládaných hodnot, jestli by to mělo vliv na sekání.
Ale rád bych pochopil, jak je možné, že se uložené hodnoty zobrazovali správně, když se řetězec nemohl do vyhrazeného pole vejít.
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 20 úno 2020, 11:43
od ondraN
Musíš si uvědomit, co snprintf vrací za hodnotu. Jednak vrací počet znaků výsledné konverze bez ohledu na na nastavenou max. hodnotu, jednak při chybě vrací zápornou hodnotu. Takže to fungovalo do první chyby nebo první konverze delší než pole.
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 20 úno 2020, 12:37
od gilhad
Maxim píše: ↑20 úno 2020, 10:03
Ale rád bych pochopil, jak je možné, že se uložené hodnoty zobrazovali správně, když se řetězec nemohl do vyhrazeného pole vejít.
I kdyz se retezec do alokovaneho pole "nevejde", tak se da zapsat v plne delce (pokud si nekontrolujeme delku pole) a taky v plne delce zpracovat. Teda prepisou se tim asi nejpis nejake jine promenne za koncem retezce, nebo nealokovana pamet, a muze to mit spoustu necekanych vedlejsich efektu, ale taky treba zrovna nahodou nemusi, nebo nejsou na prvni pohled videt - holt pamet jako pamet ...