Sida 4 av 4
Re: Arduino: Slå i sönder String
Postat: 21 augusti 2014, 13:47:57
av jah
Mr Andersson skrev:Kod: Markera allt
char* result[] = {" \0",
" \0",
" \0",
" \0",
" \0",
" \0" };
...
result[ypos][xpos] = indat;
Det är inte giltig C att modifiera string literals. Vad tror du händer om kompilatorn optimerar alla 6 strängar till att ha samma minnesadress, eller lägger strängarna i en read-only sektion?
Jo, det är tillåtet, men bara om det är en array (of char), då strängen bara initierar array'n, som allokeras i RAM.
Mitt exempel är fel då det blev en pointer av bara farten, men det räcker att ändra definitionen av "result" till:
Kod: Markera allt
char result[6][22] = {" \0",
" \0",
" \0",
" \0",
" \0",
" \0" };
Jag kollade aldrig koden mer än att Arduino-kompilatorn svalde den, och felet uppstår först vid körning.
/J
Re: Arduino: Slå i sönder String
Postat: 21 augusti 2014, 15:25:41
av Icecap
Det är i övrigt en mycket dålig initiering. Dels för att det är mellanslag som används och dels för att initieringen ska utföras varje gång ett nytt block ska läsas in.
Det hade alltså räckt att dimensionera ett array med plats nog (om Arduino annars har den plats) och sedan låta programmet sköta resten.
Re: Arduino: Slå i sönder String
Postat: 21 augusti 2014, 15:57:39
av jah
Dålig o dålig, men funkar...
Eftersom array'n emulerar en presentationsdisplay där vilka teckenpositioner som helst kan uppdateras 'random', så är paddingen effektiv för att ha skrivbara strängar hela tiden, annars hade vissa delar kunnat varit odefinierade.
Initieringen görs bara en gång vid programstart, därefter kommer värddatorn uppdatera/radera allt eftersom. Det finns inget 'clear screen'-kommando vad jag sett.
Det finns vad jag förstått inte heller någon definition på när ett nytt 'block' har lästs in, men det är ett annat problem. Måste antagligen avgöres med timeout på inkommande data.
Sen finns det naturligtvis andra sätt att fylla array'n än en strängkonstant med blanktecken, men tråden handlade inte om snyggaste sättet att koda i C...
/J
Re: Arduino: Slå i sönder String
Postat: 22 augusti 2014, 16:40:12
av Mr Andersson
jah skrev:Jo, det är tillåtet,
Nej, det är odefinierat beteende enligt standarden. Sen finns det säkert plattformar det "fungerar" på, men då bör det nämnas att koden inte är portabel.
jah skrev:men bara om det är en array (of char), då strängen bara initierar array'n, som allokeras i RAM.
Precis, det är inte en string literal (vad heter det på svenska?) som du modifierar.
Nu kanske det verkar som att jag bara märker ord men jag tycker det är viktigt att man inte lär ut fel saker till nybörjare.
Re: Arduino: Slå i sönder String
Postat: 22 augusti 2014, 19:08:56
av Icecap
Samtidig tar det onödig ROM-plats, initieringsvärden ska ju sparas någonstans och då finns det enbart ROM kvar.
Så allt i allt är det en mycket dålig praxis som har ett odefinierat beteende enl. standarden och som tar onödig programminneplats.