DMR, Digital Mobile Radio...

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
AndLi
Inlägg: 17045
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: DMR, Digital Mobile Radio...

Inlägg av AndLi »

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

Re: DMR, Digital Mobile Radio...

Inlägg av Mr Andersson »

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.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: DMR, Digital Mobile Radio...

Inlägg av Marta »

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".
Användarvisningsbild
AndLi
Inlägg: 17045
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: DMR, Digital Mobile Radio...

Inlägg av AndLi »

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

Re: DMR, Digital Mobile Radio...

Inlägg av Mr Andersson »

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.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: DMR, Digital Mobile Radio...

Inlägg av Marta »

Ö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.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: DMR, Digital Mobile Radio...

Inlägg av Marta »

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?
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: DMR, Digital Mobile Radio...

Inlägg av Marta »

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;
Användarvisningsbild
ajje
Inlägg: 2351
Blev medlem: 12 mars 2010, 16:35:31
Ort: Smedjebacken

Re: DMR, Digital Mobile Radio...

Inlägg av ajje »

Det är olika på olika arkitekturer om gcc räknar char som signed eller unsigned.

https://wiki.debian.org/ArchitectureSpe ... mo#Summary
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 905
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: DMR, Digital Mobile Radio...

Inlägg av mankan »

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.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: DMR, Digital Mobile Radio...

Inlägg av Marta »

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.
Skriv svar