konverze datových typů / komunikace s displayem pomocí SPI

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Maxim
Příspěvky: 128
Registrován: 22 led 2019, 20:32
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od Maxim » 05 úno 2020, 10:46

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ě.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od ondraN » 05 úno 2020, 18:37

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.

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od kiRRow » 05 úno 2020, 18:59

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 ...

Maxim
Příspěvky: 128
Registrován: 22 led 2019, 20:32
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od Maxim » 20 úno 2020, 10:03

--> 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.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od ondraN » 20 úno 2020, 11:43

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.

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od gilhad » 20 úno 2020, 12:37

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 ...

Odpovědět

Kdo je online

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