Sida 2 av 2
Re: Korrekt enligt C-standard?
Postat: 29 maj 2014, 17:57:43
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.
Re: Korrekt enligt C-standard?
Postat: 29 maj 2014, 22:56:23
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.
Re: Korrekt enligt C-standard?
Postat: 29 maj 2014, 23:17:27
av blueint
Källkoden till GCC är omryktad för att vara rörig. Så ett tips är att kika på LLVM och PCC.
Re: Korrekt enligt C-standard?
Postat: 30 maj 2014, 11:34:39
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...

)
> 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.
Re: Korrekt enligt C-standard?
Postat: 30 maj 2014, 14:19:26
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.
Re: Korrekt enligt C-standard?
Postat: 30 maj 2014, 14:55:17
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?
Re: Korrekt enligt C-standard?
Postat: 9 juni 2014, 17:10:30
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