|
| 4 bytes med ud af en function Fra : Kasper |
Dato : 30-12-03 02:28 |
|
Hey
Hvordan får jeg 4 bytes med ud af en function ??
pointer til et array ???
Kasper
| |
Jesper Toft (30-12-2003)
| Kommentar Fra : Jesper Toft |
Dato : 30-12-03 02:36 |
|
Kasper wrote:
> Hvordan får jeg 4 bytes med ud af en function ??
gcc tolker en int er en 32 bits variabel (4 bytes)...
> pointer til et array ???
I så fald bør denne sendes til funktionen som parameter:
void funktion(char *returvariabel) {
retur[X] = ..;
}
/Jesper
| |
Morten F. Hansen (30-12-2003)
| Kommentar Fra : Morten F. Hansen |
Dato : 30-12-03 09:55 |
|
> Hvordan får jeg 4 bytes med ud af en function ??
Da de 4 bytes sikkert alligevel har noget med hinanden at
gøre, kunne det give mening at pakke dem ind i en struct
og returnere denne.
Noget i stil med:
typedef struct {
char byte0;
char byte1;
char byte2;
char byte3;
} struct_of_bytes;
struct_of_bytes get_struct()
{
struct_of_bytes s = {0, 1, 2, 3};
return s;
}
int main(int argc, char *argv[])
{
struct_of_bytes s = get_struct();
printf("%d %d %d %d\n", s.byte0, s.byte1, s.byte2, s.byte3);
...
}
| |
Kasper (30-12-2003)
| Kommentar Fra : Kasper |
Dato : 30-12-03 23:07 |
|
"Morten F. Hansen" <all.your.base@are.belong.to.us> wrote in message
news:bsrei0$c4k$1@sunsite.dk...
> > Hvordan får jeg 4 bytes med ud af en function ??
>
> Da de 4 bytes sikkert alligevel har noget med hinanden at
> gøre, kunne det give mening at pakke dem ind i en struct
> og returnere denne.
>
> Noget i stil med:
>
> typedef struct {
> char byte0;
> char byte1;
> char byte2;
> char byte3;
> } struct_of_bytes;
>
> struct_of_bytes get_struct()
> {
> struct_of_bytes s = {0, 1, 2, 3};
> return s;
> }
>
> int main(int argc, char *argv[])
> {
> struct_of_bytes s = get_struct();
> printf("%d %d %d %d\n", s.byte0, s.byte1, s.byte2, s.byte3);
> ...
> }
Hey
hvad laver det S "struct_of_bytes s"
KAn ikke få det til at køre i min compiler
Kasper
| |
Morten F. Hansen (30-12-2003)
| Kommentar Fra : Morten F. Hansen |
Dato : 30-12-03 23:58 |
|
> hvad laver det S "struct_of_bytes s"
Det burde erklære en variabel, kaldet s, af typen
struct_of_bytes.
> KAn ikke få det til at køre i min compiler
Hmm... Det virker i min Visual C++ både som C og C++ kode, men
derfor kan det jo godt være forkert alligevel Hvilken fejl
får du? Og hvordan ser linien ud, som laver fejlen?
| |
Repzak (01-01-2004)
| Kommentar Fra : Repzak |
Dato : 01-01-04 16:50 |
|
Hey
Fejl :
C:\atmega\icc\bin\imakew -f LCDPROJECT.mak
iccavr -c -IC:\atmega\icc\include -e -DATMEGA -l -g -Mavr_enhanced
F:\uC\LCDFIL~1\LCD.C
!E F:\uC\LCDFIL~1\LCD.C(39): illegal use of type name `struct_of_bytes'
!W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
!E F:\uC\LCDFIL~1\LCD.C(39): syntax error; found `s' expecting `;'
!E F:\uC\LCDFIL~1\LCD.C(39): undeclared identifier `s'
!E F:\uC\LCDFIL~1\LCD.C(39): illegal expression
!E F:\uC\LCDFIL~1\LCD.C(39): syntax error; found `0' expecting `;'
!W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
!W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
!W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
!W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
!E F:\uC\LCDFIL~1\LCD.C(39): syntax error; found `}' expecting `;'
!W F:\uC\LCDFIL~1\LCD.C(39):[warning] missing return value
!W F:\uC\LCDFIL~1\LCD.C(39):[warning] empty declaration
!E F:\uC\LCDFIL~1\LCD.C(40): unrecognized declaration
!E F:\uC\LCDFIL~1\LCD.C(43): unrecognized declaration
!E F:\uC\LCDFIL~1\LCD.C(104): illegal use of type name `struct_of_bytes'
!W F:\uC\LCDFIL~1\LCD.C(104):[warning] expression with no effect elided
!E F:\uC\LCDFIL~1\LCD.C(104): syntax error; found `s' expecting `;'
!E F:\uC\LCDFIL~1\LCD.C(104): operands of = have illegal types `int' and
`struct_of_bytes'
!W F:\uC\LCDFIL~1\LCD.C(104):[warning] expression with no effect elided
C:\atmega\icc\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1
CODE :
typedef struct {
char d0;
char d1;
char d2;
char d3;
} struct_of_bytes;
struct_of_bytes pc73recieve()
{
unsigned char tjeck=0;
do
{
pc74start();
tjeck = pc74send(0XD1); // send adresse
TWCR |= 0x40; // send ack bytes
tjeck |= pc74recieve(); // Recieve data
tjeck |= pc74recieve();
tjeck |= pc74recieve();
TWCR &= 0xBF; // sen ikke ack
tjeck |= pc74recieve();
pc74stop();
}
while(tjeck==1); // continues until all data is correct
struct_of_bytes s = {0, 1, 2, 3};
return s;
}
CALL :
struct_of_bytes s = pc73recieve();
Godt nytår Kasper
| |
Bertel Brander (01-01-2004)
| Kommentar Fra : Bertel Brander |
Dato : 01-01-04 17:35 |
|
Repzak wrote:
> Hey
>
> Fejl :
>
> C:\atmega\icc\bin\imakew -f LCDPROJECT.mak
> iccavr -c -IC:\atmega\icc\include -e -DATMEGA -l -g -Mavr_enhanced
> F:\uC\LCDFIL~1\LCD.C
> !E F:\uC\LCDFIL~1\LCD.C(39): illegal use of type name `struct_of_bytes'
> !W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
> !E F:\uC\LCDFIL~1\LCD.C(39): syntax error; found `s' expecting `;'
> !E F:\uC\LCDFIL~1\LCD.C(39): undeclared identifier `s'
> !E F:\uC\LCDFIL~1\LCD.C(39): illegal expression
> !E F:\uC\LCDFIL~1\LCD.C(39): syntax error; found `0' expecting `;'
> !W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
> !W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
> !W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
> !W F:\uC\LCDFIL~1\LCD.C(39):[warning] expression with no effect elided
> !E F:\uC\LCDFIL~1\LCD.C(39): syntax error; found `}' expecting `;'
> !W F:\uC\LCDFIL~1\LCD.C(39):[warning] missing return value
> !W F:\uC\LCDFIL~1\LCD.C(39):[warning] empty declaration
> !E F:\uC\LCDFIL~1\LCD.C(40): unrecognized declaration
> !E F:\uC\LCDFIL~1\LCD.C(43): unrecognized declaration
> !E F:\uC\LCDFIL~1\LCD.C(104): illegal use of type name `struct_of_bytes'
> !W F:\uC\LCDFIL~1\LCD.C(104):[warning] expression with no effect elided
> !E F:\uC\LCDFIL~1\LCD.C(104): syntax error; found `s' expecting `;'
> !E F:\uC\LCDFIL~1\LCD.C(104): operands of = have illegal types `int' and
> `struct_of_bytes'
> !W F:\uC\LCDFIL~1\LCD.C(104):[warning] expression with no effect elided
> C:\atmega\icc\bin\imakew.exe: Error code 1
> Done: there are error(s). Exit code: 1
>
>
>
> CODE :
>
> typedef struct {
> char d0;
> char d1;
> char d2;
> char d3;
> } struct_of_bytes;
>
> struct_of_bytes pc73recieve()
> {
> unsigned char tjeck=0;
> do
> {
> pc74start();
> tjeck = pc74send(0XD1); // send adresse
> TWCR |= 0x40; // send ack bytes
> tjeck |= pc74recieve(); // Recieve data
> tjeck |= pc74recieve();
> tjeck |= pc74recieve();
> TWCR &= 0xBF; // sen ikke ack
> tjeck |= pc74recieve();
> pc74stop();
> }
> while(tjeck==1); // continues until all data is correct
>
> struct_of_bytes s = {0, 1, 2, 3};
> return s;
> }
Det er ikke alle C compilere der tillader at man laver lokale
variaber andre steder end i starten af en blok, dvs. efter en
{.
Prøv at flytte "struct_of_bytes s = {0, 1, 2, 3};" op til starten
af funktionen (før eller efter "unsigned char tjeck=0;").
/b
| |
Repzak (01-01-2004)
| Kommentar Fra : Repzak |
Dato : 01-01-04 17:54 |
|
> Prøv at flytte "struct_of_bytes s = {0, 1, 2, 3};" op til starten
> af funktionen (før eller efter "unsigned char tjeck=0;").
Har akkurat lige fået det til at virke efter lidt læsning her :
http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_12_2.html
så d et spiller bare nu... mange TAK alle sammen
men det er sandt som du skriver med op til starten, men jeg havde bare ikke
fatter den var en declaring, jeg troede man puttede værdierne i en
variabel... Tsk Tsk (nybegynder)
Kasper
| |
Repzak (01-01-2004)
| Kommentar Fra : Repzak |
Dato : 01-01-04 18:07 |
|
Hey igen
Kan den structures egentlig decalres localt hvorfra den bliver kaldt ??
for at mindske ram brugen ??
jeg får fejl fordi den ikke er decalret når den "compiler" min function den
bliver brugt i, inden functionen den bliver kaldt fra
Kasper
| |
Bertel Brander (01-01-2004)
| Kommentar Fra : Bertel Brander |
Dato : 01-01-04 18:58 |
|
Repzak wrote:
> Hey igen
>
> Kan den structures egentlig decalres localt hvorfra den bliver kaldt ??
>
> for at mindske ram brugen ??
>
> jeg får fejl fordi den ikke er decalret når den "compiler" min function den
> bliver brugt i, inden functionen den bliver kaldt fra
>
> Kasper
>
>
Jeg er ikke sikker på at jeg forstår, men;
Du kan ikke lave typen lokalt i funktionen, den skal jo også
kendes derfra hvor du kalder funktionen.
Du kan lave strukturen lokalt i den funktion der kalder, og så
give den kaldte funktion en pointer til strukturen, hvilket måske
er en anelse mere optimalt.
void pc73recieve(struct_of_bytes *whatever)
{
whatever->d0 = 1234;
...
}
Og kaldet:
struct_of_bytes MyStruct;
pc73recieve(&MyStruc);
/b
| |
Kasper (01-01-2004)
| Kommentar Fra : Kasper |
Dato : 01-01-04 20:34 |
|
> Jeg er ikke sikker på at jeg forstår, men;
>
> Du kan ikke lave typen lokalt i funktionen, den skal jo også
> kendes derfra hvor du kalder funktionen.
>
> Du kan lave strukturen lokalt i den funktion der kalder, og så
> give den kaldte funktion en pointer til strukturen, hvilket måske
> er en anelse mere optimalt.
Problemet ligger im den function som jeg kalder, ligger i en include ful,
som jeg includere først...
så når compileren includere den, kommer den til den variabel i funktionen
der bliver kaldt, og der er den jo ikke kend af compileren hvad det er (tror
det er det der er problemet)
Kasper
| |
Bertel Brander (01-01-2004)
| Kommentar Fra : Bertel Brander |
Dato : 01-01-04 20:45 |
|
Kasper wrote:
>>Jeg er ikke sikker på at jeg forstår, men;
>>
>>Du kan ikke lave typen lokalt i funktionen, den skal jo også
>>kendes derfra hvor du kalder funktionen.
>>
>>Du kan lave strukturen lokalt i den funktion der kalder, og så
>>give den kaldte funktion en pointer til strukturen, hvilket måske
>>er en anelse mere optimalt.
>
>
> Problemet ligger im den function som jeg kalder, ligger i en include ful,
> som jeg includere først...
>
> så når compileren includere den, kommer den til den variabel i funktionen
> der bliver kaldt, og der er den jo ikke kend af compileren hvad det er (tror
> det er det der er problemet)
>
Man laver normalt ikke funktioner i header-filer, kun prototypen, selve
funktionen putter man normalt i en .c fil.
Hvis du har prototypen i en .h-fil skal du også have typedef'en i
headerfilen.
F.ex:
my.h
typedef struct {
char d0;
char d1;
char d2;
char d3;
} struct_of_bytes;
extern void pc73recieve(struct_of_bytes *sob);
one.c:
void pc73recieve(struct_of_bytes *sob)
{
sob->d3 = 12;
}
two.c:
int main(void)
{
struct_of_bytes MyStruct;
pc73recieve(&MyStruct);
return 0;
}
/b
| |
Kasper (01-01-2004)
| Kommentar Fra : Kasper |
Dato : 01-01-04 22:27 |
|
>
> Man laver normalt ikke funktioner i header-filer, kun prototypen, selve
> funktionen putter man normalt i en .c fil.
>
> Hvis du har prototypen i en .h-fil skal du også have typedef'en i
> headerfilen.
Men.. hmm... ja jeg er jo ikke så dygtig endnu.. men ligger den så ikke
declaret hele tiden i rammen også ??
har jo kun 4 kb ram at gøre godt med
Kasper
| |
Bertel Brander (02-01-2004)
| Kommentar Fra : Bertel Brander |
Dato : 02-01-04 00:33 |
|
Kasper wrote:
>>Man laver normalt ikke funktioner i header-filer, kun prototypen, selve
>>funktionen putter man normalt i en .c fil.
>>
>>Hvis du har prototypen i en .h-fil skal du også have typedef'en i
>>headerfilen.
>
>
> Men.. hmm... ja jeg er jo ikke så dygtig endnu.. men ligger den så ikke
> declaret hele tiden i rammen også ??
>
En typedef er kun en definition af en type, en typedef fylder ingenting,
hverken i ram eller rom, struct_of_bytes er kun en type.
Variable ligger i ram, hvis du vil have 4 bytes tilbage fra en funktion,
er du nødt til at gemme dem et eller andet sted.
/b
| |
Repzak (02-01-2004)
| Kommentar Fra : Repzak |
Dato : 02-01-04 00:43 |
|
>
> En typedef er kun en definition af en type, en typedef fylder ingenting,
> hverken i ram eller rom, struct_of_bytes er kun en type.
>
> Variable ligger i ram, hvis du vil have 4 bytes tilbage fra en funktion,
> er du nødt til at gemme dem et eller andet sted.
Sorry jeg er besværlig, og sætter meget pris på din hjælp !!
tror jeg har forstået lidt af det nu..
dvs.
typedef struct {
unsigned char d0;
unsigned char d1;
unsigned char d2;
unsigned char d3;
}recdata;
recdata r_data; <-- det er først herfra den fylder i rammen og til den
function hvor den ligger i er slut ??
hvis man bare skriver struct og ikke typedef, så fylder den hele tiden ?,
hvis den er global?
Kasper
| |
Bertel Brander (02-01-2004)
| Kommentar Fra : Bertel Brander |
Dato : 02-01-04 01:03 |
|
Repzak wrote:
>>En typedef er kun en definition af en type, en typedef fylder ingenting,
>>hverken i ram eller rom, struct_of_bytes er kun en type.
>>
>>Variable ligger i ram, hvis du vil have 4 bytes tilbage fra en funktion,
>>er du nødt til at gemme dem et eller andet sted.
>
>
> Sorry jeg er besværlig, og sætter meget pris på din hjælp !!
>
> tror jeg har forstået lidt af det nu..
>
> dvs.
>
> typedef struct {
> unsigned char d0;
> unsigned char d1;
> unsigned char d2;
> unsigned char d3;
> }recdata;
>
> recdata r_data; <-- det er først herfra den fylder i rammen og til den
> function hvor den ligger i er slut ??
Korrekt, recdate er en type, r_data er en variabel. Typer tager ikke
plads, variabler gør.
Man kan godt lave variabler andre steder end i starten af en funktion:
void f(int x)
{
if(x)
{
recdata r_data;
...
}
else
{
}
...
}
Her vil r_data kun optage plads hvis x er != 0. (hvis du har en god
compiler, nogle compilere vil afsætte plads til r_data fra starten af
funktionen, til den slutter).
>
> hvis man bare skriver struct og ikke typedef, så fylder den hele tiden ?,
Hvis man har:
struct
{
int x;
int y;
}xy;
Så er xy en variabel, dvs. ikke en type. Den vil som sådan fylde op
fra den er erklæret til slutningen på den blok den er erklæret i.
> hvis den er global?
Hvis xy (eller r_data) er global (dvs. erklæret uden for en funktion)
vil den tage plads fra programmet starter til det slutter (hvis det
slutter).
/b
| |
Igor V. Rafienko (02-01-2004)
| Kommentar Fra : Igor V. Rafienko |
Dato : 02-01-04 01:20 |
|
[ Bertel Brander ]
[ ... ]
> Her vil r_data kun optage plads hvis x er != 0. (hvis du har en god
> compiler, nogle compilere vil afsætte plads til r_data fra starten
> af funktionen, til den slutter).
Det kommer vel strengt tatt an på innhold av else-grenen.
[ ... ]
ivr
--
<html><form><input type crash></form></html>
| |
Troels Thomsen (05-01-2004)
| Kommentar Fra : Troels Thomsen |
Dato : 05-01-04 10:55 |
|
> >
> > hvis man bare skriver struct og ikke typedef, så fylder den hele tiden
?,
> Hvis man har:
>
> struct
> {
> int x;
> int y;
> }xy;
>
> Så er xy en variabel, dvs. ikke en type. Den vil som sådan fylde op
> fra den er erklæret til slutningen på den blok den er erklæret i.
>
Hvorfor er det at alle er så forelskede i "unnamed structs". Giv da structet
et navn, så kan du også lave forward declarations til den hvis du får brug
for det.
(Svar: Vistnok fordi gamle kompilere kan virke vrangvillige ifb med at
overføre en struct som parameter til en funktion etc. Men hvor mange har
egentlig dette problem nu?)
struct myXYtype
{
int x;
int y;
};
// bruger ingen hukommelse
if (blah)
{
myXYtype xy;
}
else
{
}
| |
Bertel Brander (05-01-2004)
| Kommentar Fra : Bertel Brander |
Dato : 05-01-04 20:25 |
|
Troels Thomsen wrote:
>>struct
>>{
>> int x;
>> int y;
>>}xy;
>>
>>Så er xy en variabel, dvs. ikke en type. Den vil som sådan fylde op
>>fra den er erklæret til slutningen på den blok den er erklæret i.
>>
>
>
> Hvorfor er det at alle er så forelskede i "unnamed structs". Giv da structet
> et navn, så kan du også lave forward declarations til den hvis du får brug
> for det.
Hvorfor skal man lave en type, hvis man ikke har brug for en type?
>
> struct myXYtype
> {
> int x;
> int y;
> };
> // bruger ingen hukommelse
>
> if (blah)
> {
> myXYtype xy;
I C (svjv programmerer Kasper i C) skal man skrive:
struct myXYtype xy;
/b
| |
Troels Thomsen (06-01-2004)
| Kommentar Fra : Troels Thomsen |
Dato : 06-01-04 14:08 |
|
> Hvorfor skal man lave en type, hvis man ikke har brug for en type?
>
Det er ikke mig der typedef'er. Hvad mener du?
> I C (svjv programmerer Kasper i C)
>
Point taken
(har selv programmeret en atmel microcontroller men det var i en Iar c++
compiler som jo ikke behøvede 'struct')
| |
Bertel Brander (06-01-2004)
| Kommentar Fra : Bertel Brander |
Dato : 06-01-04 20:03 |
|
Troels Thomsen wrote:
>>Hvorfor skal man lave en type, hvis man ikke har brug for en type?
>>
>
> Det er ikke mig der typedef'er. Hvad mener du?
>
Der er ikke nogen der typedef'er, men du lavede en type med:
struct myXYtype
{
int x;
int y;
};
"struct myXYtype" er en type (i C++ er myXYtype en type).
/b
| |
Troels Thomsen (07-01-2004)
| Kommentar Fra : Troels Thomsen |
Dato : 07-01-04 09:31 |
|
> Der er ikke nogen der typedef'er, men du lavede en type med:
>
Det jeg svarede på var
typedef struct /*her skulle navnet have stået*/ {
unsigned char d0;
unsigned char d1;
unsigned char d2;
unsigned char d3;
}recdata;
(som er et unnamed struct)
mvh Troels
| |
Ove Kjeldgaard (05-01-2004)
| Kommentar Fra : Ove Kjeldgaard |
Dato : 05-01-04 18:52 |
|
"Kasper" <RepzakRemoveme@hotmail.com> wrote:
>har jo kun 4 kb ram at gøre godt med
Det stadig AVR programmet "der spøger" ?
Når jeg skal have fat i de enkelte char's i int og long variable bruger jeg
følgende macroer:
Til og fra int:
#define LO(x) *(((uchar*)(&(x)))+0)
#define HI(x) *(((uchar*)(&(x)))+1)
Til og fra long:
#define LONG0(x) *(((uchar*)(&(x)))+0)
#define LONG1(x) *(((uchar*)(&(x)))+1)
#define LONG2(x) *(((uchar*)(&(x)))+2)
#define LONG3(x) *(((uchar*)(&(x)))+3)
I HiTech PIC-C compileres disse makroer til rene 8-bit's instruktioner.
Med følgende temporære variable: ScrChar, ScrInt og ScrLong kan man gøre
følgende:
HI(ScrInt) = ScrChar;
ScrChar = LO(ScrInt);
LONG1(ScrLong) = ScrChar;
ScrChar = LONG3(ScrLong);
Følgende burde også være gangbar:
LO(ScrInt) = LONG2(ScrLong);
Og til sidst en lille advarsel, disse macroer er der lige så lidt typecheck på
som alle andre steder i et C program.
--
Med venlig hilsen, Ove Kjeldgaard, nospam AT privat DOT dk
Natur og Friluftsliv: < http://hiker.dk>
| |
Per Pedersen (31-12-2003)
| Kommentar Fra : Per Pedersen |
Dato : 31-12-03 05:22 |
|
"Kasper" <RepzakRemoveme@hotmail.com> skrev i en meddelelse
news:3ff0d426$0$167$edfadb0f@dread11.news.tele.dk...
> Hey
>
> Hvordan får jeg 4 bytes med ud af en function ??
>
> pointer til et array ???
>
> Kasper
>
>
Du kan pakke de 4 bytes op i et longword, det kunne F.eks. se sådan ud:
- Kodefragment
char a, b, c, d = {0xFE,0xFE,0xFE,0xFE};
long ret = 0x00000000;
ret = a;
ret = ret << 8 && b; // Skift 8 bit til venstre, og put den næste byte ind
ret = ret << 8 && c; //
ret = ret << 8 && d; //
return ret;
- Kodefragment
Det kan godt virke lidt nørdet at bruge de binære operatorer, men det er
utroligt hurtigt at udføre for processoren, og en meget brugt teknik i
assembler, og særligt til billedbehandling, hvor der dog sker en hel del
mere smiden rundt med bits på kryds og tværs i registre og hukommelse.
Mvh
Per Pedersen
| |
Jonas Meyer (31-12-2003)
| Kommentar Fra : Jonas Meyer |
Dato : 31-12-03 14:09 |
|
"Per Pedersen" <perpedersen33@hotmail.com> wrote in message
news:3ff24ef3$0$17597$ba624c82@nntp05.dk.telia.net...
>
> "Kasper" <RepzakRemoveme@hotmail.com> skrev i en meddelelse
> news:3ff0d426$0$167$edfadb0f@dread11.news.tele.dk...
> > Hey
> >
> > Hvordan får jeg 4 bytes med ud af en function ??
> >
> > pointer til et array ???
> >
> > Kasper
> >
> >
>
> Du kan pakke de 4 bytes op i et longword, det kunne F.eks. se sådan ud:
>
> - Kodefragment
>
> char a, b, c, d = {0xFE,0xFE,0xFE,0xFE};
> long ret = 0x00000000;
>
> ret = a;
> ret = ret << 8 && b; // Skift 8 bit til venstre, og put den næste byte ind
> ret = ret << 8 && c; //
> ret = ret << 8 && d; //
Du mener vist
ret = ret << 8 & b;
ret = ret << 8 & c;
ret = ret << 8 & d;
Og så argumenterer du for at bruge de binære operatorer -
mener du ikke de bitvise? Man kommer
ikke langt uden de binære operatorer :)
mvh Jonas
| |
Jonas Meyer (31-12-2003)
| Kommentar Fra : Jonas Meyer |
Dato : 31-12-03 14:17 |
|
"Jonas Meyer" <a@b.c> wrote in message news:bsuhan$1jun$1@munin.diku.dk...
> Du mener vist
>
> ret = ret << 8 & b;
> ret = ret << 8 & c;
> ret = ret << 8 & d;
Ehm,
ret = ret << 8 | b;
ret = ret << 8 | c;
ret = ret << 8 | d;
Sådan må det vel være.
Beklager.
| |
Morten F. Hansen (31-12-2003)
| Kommentar Fra : Morten F. Hansen |
Dato : 31-12-03 15:39 |
|
> > Du mener vist
> >
> > ret = ret << 8 & b;
> > ret = ret << 8 & c;
> > ret = ret << 8 & d;
>
> Ehm,
>
> ret = ret << 8 | b;
> ret = ret << 8 | c;
> ret = ret << 8 | d;
>
> Sådan må det vel være.
> Beklager.
Dette viser på klareste vis at Igor har ret Klar og overskuelig kode
frem for alt -- man kan altid optimere senere hvor det viser sig nødvendigt.
| |
Igor V. Rafienko (31-12-2003)
| Kommentar Fra : Igor V. Rafienko |
Dato : 31-12-03 14:05 |
|
[ Per Pedersen ]
[ ... ]
> Du kan pakke de 4 bytes op i et longword,
Min kjemilærer pleide å si i slike situasjoner "joda, man kan til og
med lære en kanin å røyke, men hva skulle poenget med det være?"
[ ... ]
> char a, b, c, d = {0xFE,0xFE,0xFE,0xFE};
> long ret = 0x00000000;
>
> ret = a;
> ret = ret << 8 && b; // Skift 8 bit til venstre, og put den næste byte ind
> ret = ret << 8 && c; //
> ret = ret << 8 && d; //
_Takk_ for at du illustrerer hvorfor en slik "pakking" er en dårlig
løsning når ikke noe annet er kjent om problemet. En struct eller en
array vil være langt å foretrekke framfor dette svineriet.
Jeg kan se seks problemer[*] i de seks linjene over, hvorav en del er
direkte feil. _Fortell_ oss gjerne hva _du_ mener "løsningen" din
egentlig løser.
[*] 1. Feil måte å initialisere char-variablene på (python tillater
noe slikt, men ikke C).
2. For stor konstant for den respektive typen (char kan være
signed)
3. Feil operand (&& framfor |)
4. Bitmanipulasjoner av signed typer (det er bare dustete, gitt de
begrensningene som gjelder i språket)
5. Unødvendig antagelse om CHAR_BIT
6. Unødvendig (og gjerne gal) antagelse om at sizeof(long) == 4
[ ... ]
> Det kan godt virke lidt nørdet at bruge de binære operatorer, men
> det er utroligt hurtigt at udføre for processoren,
Speed gets you nowhere, if you are headed in the wrong direction.
> og en meget brugt teknik i assembler, og særligt til
> billedbehandling, hvor der dog sker en hel del mere smiden rundt med
> bits på kryds og tværs i registre og hukommelse.
Hvor var det jeg leste at man skal foretrekke den koden som forklarer
hensikten bak på den klareste mulige måten?
Bare det alene at du nevner "hurtig" over er en god nok grunn til å
avfeie forslaget ditt. Når man titter enda nærmere på det (og selv med
alle de rettelsene over), så er forslaget fremdeles feil for annet enn
et veldig snevert utvalg av problemer sett i lyset av en dårlig
kompilator.
Vær så god, neste.
ivr
--
<html><form><input type crash></form></html>
| |
|
|