Korrekt enligt C-standard?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Korrekt enligt C-standard?

Inlägg av victor_passe »

Kod: Markera allt

short f(short p)
{
 union
  {
   short short_v;
   char char_v[2];
 }myUnion;
 myUnion.short_v=p;
 return (myUnion.char_v[1]<<8)|(myUnion.char_v[0])
}
kanske man kan köra om man vill.
Dock skulle jag nog använda #include <stdint.h> och köra med sint16_t och uint8_t för att vara säker på ordlängerna.
arte
Inlägg: 317
Blev medlem: 13 januari 2006, 01:18:50

Re: Korrekt enligt C-standard?

Inlägg av arte »

Det visade sig vara en kompilator bug, ifall man byter short mot unsigned så fungerar det.
Så hur fixar jag det?
Jag har källkoden men för mig är GCC ett stort härke av filer kors och tvärs. Tror detta är GCC 3.4.2.
victor_passe skrev: Dock skulle jag nog använda #include <stdint.h> och köra med sint16_t och uint8_t för att vara säker på ordlängerna.
Jag tror att det kanske fungerar på den buggiga kompilatorn för du allokerar utrymme på stacken. Tanken är att kompilatorn skall se till så att man kan referera till p.
sodjan skrev:Jag har fortfarande inte förstått vad "fungerar" betyder här.
Exakt vilket resultat förväntas? Eller betyder "fungerar"
bara att det går att kompilera?
Det handlar om vilket resultat som förväntas.

I vissa fall så gav operationen &x inte en giltlig address på grund av en kompilator bug.
Min misstanke var för att värdet aldrig fanns lagrat i något access bart minne, endast i ett register.
Ifall en pekare refer till en variable så måste kompilatorn se till att denna variablen sparas i något minne. T.ex kopiera från register till stack.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Korrekt enligt C-standard?

Inlägg av blueint »

Källkoden till GCC är omryktad för att vara rörig. Så ett tips är att kika på LLVM och PCC.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Korrekt enligt C-standard?

Inlägg av sodjan »

> Det handlar om vilket resultat som förväntas.

Och det är?

(Märkligt vad svårt det kan vara att få ett rakt svar på en enkel fråga... :roll: )

> Min misstanke var för att värdet aldrig fanns lagrat i något access bart minne, endast i ett register.

Så var det i mitt fall då jag testkompilerade din kod.
Tala om vad det förväntade svaret är, så vet jag om
det var det som jag åndå fick.

Hela FSHORT() funktionen blir bara 4 maskininstruktioner ("Extract Byte", "AND",
"Shift Left" och en "ADD"). 5 instruktioner inkl RETURN. Parametern "x" skickas
i ett register och ytterligare ett register används under beräkningen och svaret
returneras i ett tredje register. Inget "minne" används alls.
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Korrekt enligt C-standard?

Inlägg av mri »

Funktionen gör ingenting med siffervärdet man skickar till den, så länge det ryms i en short. Samma värde returneras som man skickar till den. Funktionen är sannolikt en nedbantad version av något mer komplicerat. "buggen" har blivit isolerad till just denna del av en större helhet.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Korrekt enligt C-standard?

Inlägg av bearing »

arte skrev:Det visade sig vara en kompilator bug, ifall man byter short mot unsigned så fungerar det.
Så hur fixar jag det?
Jag har källkoden men för mig är GCC ett stort härke av filer kors och tvärs. Tror detta är GCC 3.4.2.
I ditt första exempel använder du ju en signed short. unsigned är väl samma sak om unsigned int?
Fungerar koden med unsigned short?
Hur många bytes är short och int i kompilatorn?
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Korrekt enligt C-standard?

Inlägg av stekern »

Är lite märkligt att det fortfarande inte kommit fram vad som förväntas som korrekt beteende och vilket beteende som uppvisas.

På en little-endian maskin torde det förväntade beteendet vara:
Val 1
På en big-endian torde det förväntade beteendet vara:
Val 256
Skriv svar