DMR, Digital Mobile Radio...
Re: DMR, Digital Mobile Radio...
Man kan ju säga samma sak om din åsikt om static... varför finns static om det ändå är så det ska bli som standard...
Fick du inte en varning om att den var deklarerad på två ställe?
Fick du inte en varning om att den var deklarerad på två ställe?
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: DMR, Digital Mobile Radio...
Det är inget fel, och ger ingen varning, att deklarera samma namn flera gånger så länge det är samma typ.
Länkaren kommer slå ihop dem till samma variabel.
Det man inte får göra är att ha flera definitioner.
Det här är OK (Endast en definition)
fil1.c int a;
fil2.c int a;
fil3.c int a=0;
Det här är inte OK (Flera definitioner)
fil1.c int a=0;
fil2.c int a=0;
fil3.c int a=0;
Angående extern så är det väl mest ett skydd mot misstag.
Variabeldeklarationer är implicit också definitioner om namnet inte redan finns.
Säg t.ex. att jag vill använda en variabel från fil2 i fil1..
fil1.c int a;
fil2.c int a=0;
Om jag glömmer inkludera fil2 i makefilen kommer länkaren automatiskt att definiera a som oinitialiserad. Inte bra.
Om jag istället skriver
fil1.c extern int a;
fil2.c int a=0;
så stänger extern av den implicita definitionen och jag får kompileringsfel länkningsfel om jag missar att inkludera fil2.
Länkaren kommer slå ihop dem till samma variabel.
Det man inte får göra är att ha flera definitioner.
Det här är OK (Endast en definition)
fil1.c int a;
fil2.c int a;
fil3.c int a=0;
Det här är inte OK (Flera definitioner)
fil1.c int a=0;
fil2.c int a=0;
fil3.c int a=0;
Angående extern så är det väl mest ett skydd mot misstag.
Variabeldeklarationer är implicit också definitioner om namnet inte redan finns.
Säg t.ex. att jag vill använda en variabel från fil2 i fil1..
fil1.c int a;
fil2.c int a=0;
Om jag glömmer inkludera fil2 i makefilen kommer länkaren automatiskt att definiera a som oinitialiserad. Inte bra.
Om jag istället skriver
fil1.c extern int a;
fil2.c int a=0;
så stänger extern av den implicita definitionen och jag får kompileringsfel länkningsfel om jag missar att inkludera fil2.
Re: DMR, Digital Mobile Radio...
I dokumentationen till gcc, avsnitt 6.2 står det:
Unless explicitly stated otherwise, declarations made at the top-level of a file (i.e., not within a function) are visible to the entire file, including from within functions, but are not visible outside of the file.
Jag tolkade "explicitly stated otherwise" som att ett direktiv måste användas, men vid närmare eftertanke finns inget "export"e.dyl. De syftar på någonstans i manualen, inte i koden...
Hur som helst borde linkern kräka upp ett felmeddelande om inte extern använts. Det här är verkligen otäckt. Det är ju förfärande enkelt att råka återanvända ett variabelnamn så som skedde nu. Resultatet blev en lång jakt på overflows eller att interleavern "stänkte".
Unless explicitly stated otherwise, declarations made at the top-level of a file (i.e., not within a function) are visible to the entire file, including from within functions, but are not visible outside of the file.
Jag tolkade "explicitly stated otherwise" som att ett direktiv måste användas, men vid närmare eftertanke finns inget "export"e.dyl. De syftar på någonstans i manualen, inte i koden...
Hur som helst borde linkern kräka upp ett felmeddelande om inte extern använts. Det här är verkligen otäckt. Det är ju förfärande enkelt att råka återanvända ett variabelnamn så som skedde nu. Resultatet blev en lång jakt på overflows eller att interleavern "stänkte".
Re: DMR, Digital Mobile Radio...
Dra dit en static framför dina globala variabler så försvinner risken!
Det är ju en annan skojighet med c, de ganska olika innebörderna av att sätta static framför...
Det är ju en annan skojighet med c, de ganska olika innebörderna av att sätta static framför...
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: DMR, Digital Mobile Radio...
gcc-manualen har tekniskt sett rätt, men demonstrerar samtidigt hur förrädiskt declarations vs definitions är.
Deklarationen i fil1 syns inte utanför filen från kompilatorns synvinkel (den kompilerar en fil i taget),
men om du deklarerar samma namn med samma typ i en annan fil kan länkaren se den tidigare definitionen och reglerna säger att matchar typen ska det vara samma instans.
Jag delar AndLis rekommendation, använd alltid static på fil-globala variabler (och funktioner) om du inte 100% vet att de ska delas mellan flera filer.
Deklarationen i fil1 syns inte utanför filen från kompilatorns synvinkel (den kompilerar en fil i taget),
men om du deklarerar samma namn med samma typ i en annan fil kan länkaren se den tidigare definitionen och reglerna säger att matchar typen ska det vara samma instans.
Jag delar AndLis rekommendation, använd alltid static på fil-globala variabler (och funktioner) om du inte 100% vet att de ska delas mellan flera filer.
Re: DMR, Digital Mobile Radio...
Övre vänstra hörnet av appform har en liten icon. Hur sätter jag denna? Får bara blaj från google.
Har skapat en xpm med GIMP, men därifrån till hörnet är det tvärnit.
Programmet använder xlib direkt, utan mellanliggande megaklump.
Har skapat en xpm med GIMP, men därifrån till hörnet är det tvärnit.
Programmet använder xlib direkt, utan mellanliggande megaklump.
Re: DMR, Digital Mobile Radio...
Håller nu på och hyfsar till programmet inför att lägga upp det på min hemsida. Har dykt upp lite problem som jag behöver lite råd för bästa lösning.
Utöver Debian provade jag ett par kladdlinux i VB och fick problem med att texten flöt ut över gränserna och att teckenhöjden blev fel. Skulle behöva sätta upp ett antal fonts som kan testas automatiskt tills en brukbar hittas. Det skall vara en smal sans serif propfont. Förslag sökes från Er med erfarenhet?
Fick även trubbel med ljudet med en kladdlinux (LM). Allt ser rätt ut, men det hörs ingenting och miken är stendöd. Judenheterna öppnas däremot utan gnäll. Vad tror Ni experter det kan vara?
Utöver Debian provade jag ett par kladdlinux i VB och fick problem med att texten flöt ut över gränserna och att teckenhöjden blev fel. Skulle behöva sätta upp ett antal fonts som kan testas automatiskt tills en brukbar hittas. Det skall vara en smal sans serif propfont. Förslag sökes från Er med erfarenhet?
Fick även trubbel med ljudet med en kladdlinux (LM). Allt ser rätt ut, men det hörs ingenting och miken är stendöd. Judenheterna öppnas däremot utan gnäll. Vad tror Ni experter det kan vara?
Re: DMR, Digital Mobile Radio...
Fick oväntat problem med att porta till RPi.
void main(){
char i;
i=-10;
printf("test %d\n", i);
};
marta@lillan:~/dvg $ gcc test.c
marta@lillan:~/dvg $ ./a.out
test 246
marta@lillan:~/dvg $
Är detta bug eller feature? Skall signed char försvinna?
Fick växla till int och sedan if (crap>127) crap|=0xffffff00;
void main(){
char i;
i=-10;
printf("test %d\n", i);
};
marta@lillan:~/dvg $ gcc test.c
marta@lillan:~/dvg $ ./a.out
test 246
marta@lillan:~/dvg $
Är detta bug eller feature? Skall signed char försvinna?
Fick växla till int och sedan if (crap>127) crap|=0xffffff00;
Re: DMR, Digital Mobile Radio...
Det är olika på olika arkitekturer om gcc räknar char som signed eller unsigned.
https://wiki.debian.org/ArchitectureSpe ... mo#Summary
https://wiki.debian.org/ArchitectureSpe ... mo#Summary
Re: DMR, Digital Mobile Radio...
Varför använda char till annat än tecken när typerna i stdint.h har funnits bra länge nu? Verkar som det är int8_t du vill ha.
Re: DMR, Digital Mobile Radio...
Tackar för hjälpen.
Orsaken är enkel, jag är för gammal för det hä och har alltid använt char för signed 8-bit.
Det verkar finnas fler skillnader i arm-versionen. X11 tycks buffra på ett annat sätt. Kan dra ett annat fönster över utan att det genererar redraws.
Verkar vara stökigt att hålla den kvalitet på programmet som jag skulle vilja göra. Har problem med fonter som inte finns så det kan inte ens visas felmeddelande utan att starta från terinal i debug-läge.
Även problem med att speca ljudenheter i .conf på ett bra sätt. Finns där verkligen ingen vettig kortform likt /dev/ttyUSB0 istället för en hel rad med blaj som t.ex. alsa_input.pci-0000_00_1b.0.analog-stereo? Sådana strängar är stökiga för användaren.
Orsaken är enkel, jag är för gammal för det hä och har alltid använt char för signed 8-bit.
Det verkar finnas fler skillnader i arm-versionen. X11 tycks buffra på ett annat sätt. Kan dra ett annat fönster över utan att det genererar redraws.
Verkar vara stökigt att hålla den kvalitet på programmet som jag skulle vilja göra. Har problem med fonter som inte finns så det kan inte ens visas felmeddelande utan att starta från terinal i debug-läge.
Även problem med att speca ljudenheter i .conf på ett bra sätt. Finns där verkligen ingen vettig kortform likt /dev/ttyUSB0 istället för en hel rad med blaj som t.ex. alsa_input.pci-0000_00_1b.0.analog-stereo? Sådana strängar är stökiga för användaren.