Arduino: Slå i sönder String

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jah
Inlägg: 659
Blev medlem: 16 januari 2009, 13:00:08
Ort: Eslöv

Re: Arduino: Slå i sönder String

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino: Slå i sönder String

Inlägg 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.
jah
Inlägg: 659
Blev medlem: 16 januari 2009, 13:00:08
Ort: Eslöv

Re: Arduino: Slå i sönder String

Inlägg 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
Mr Andersson
Inlägg: 1409
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Arduino: Slå i sönder String

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino: Slå i sönder String

Inlägg 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.
Skriv svar