konverze datových typů / komunikace s displayem pomocí SPI
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Re: konverze datových typů / komunikace s displayem pomocí SPI
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
Padá ti to kvůli chybám, ne kvůli paměti (to možná taky).
Podívej se, jaký index používáš tady
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.
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
}
Kód: Vybrat vše
pomocnePole[hodnotaCasuUpravena] = 'm'; //na konec řetězce připíše m
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
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 ...
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
--> 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.
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
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
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 ...
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 57 hostů