Gå til hovedindhold
Version2 it for professionelle
Forsiden

Hovedmenu

  • It-nyheder
  • Blogs
  • It-job
  • It-firmaer
  • Emner
  • Opret bruger
  • Log ind
Se kommentarer (27)
Emner Udviklingsværktøjer

Ting jeg savner i C

Af Poul-Henning Kamp 29. december 2009 kl. 10:39

C sproget fik på et tidspunkt de mest ubrugelige enum's jeg kender i noget programmeringssprog og resultatet er at kun meget ideologiske programmører bruger dem overhovedet.

Her er et lille aktuelt eksempel hvor de kunne have været brugbare, hvis bare nogen havde tænkt sig om.

Jeg sidder med en microcontroller der skal tale MODBUS og har derfor en array med navngivne indices.

I kildeteksten ser det således ud:

static uint16_t hold[9];
#define HOLD_TEMPI 0
#define HOLD_TEMPIX 1
#define HOLD_TEMPO 2
#define HOLD_TEMPOX 3
#define HOLD_PWM 4
#define HOLD_RPM 5
#define HOLD_VCC 6
#define HOLD_VCORE 7
#define HOLD_VREF 8

Er det egentlig ikke til at tude over ?

Tænk hvis enum's havde været lavet fornuftigt, så kunne man f.eks have skrevet:

enum hold_vars {
    TEMPI, TEMPIX, TEMPO, TEMPOX,
    PWM, RPM, VCC, VCORE, VREF
};
static uint16_t hold[enum hold_vars];

Jeg vil vædde på at ovenstående er en temmelig triviel ting at implementere i en C-compiler, det kan næppe tage mere end 30 linier kode...

phk

Send Tweet
Udskriv
Billede af Poul-Henning KampOm Poul-Henning Kamp

Kommentarer (27)

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Thomas Ammitzbøll-bach 29. dec. 2009 - 13.01
 
Et hack

Et hack, der smager af fisk:

[code=c]
enum hold_vars {
TEMPI, TEMPIX, TEMPO, TEMPOX,
PWM, RPM, VCC, VCORE, VREF,
_HOLD_SZ
};
static uint16_t hold[_HOLD_SZ];
[/code]

Det største problem er den svage scoping og typing. Jeg ville forvente, at enum identifiers kun kunne bruges med variable, der er erklæret af den pågældende enum type (eller arrays, med indeks af den pågældende enum type).

Det er ikke vanskeligt at implementere, det koster ikke noget i køretid, og man kan altid typecast'e sig ud af konverteringer.

Thomas

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Kim Schulz 29. dec. 2009 - 13.14
 
enums er onde (i c)

På min arbejdsplads hvor stort set alt kodes i C er enums simpelthen forbudt at bruge. Det giver nogle gange noget ganske grimt kode, men til gengæld er den porterbar til alle de platforme vi arbejder med. Fatter ikke hvorfor de ikke bare fik sat en størrelse på enums elementer fra start af, så vi kunne komme ud over alt det pjat.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Hans Schou 29. dec. 2009 - 14.08
 
struct?

Hvorfor ikke en struct?

[code=c]static struct {
uint16_t TEMPI;
uint16_t TEMPIX;
uint16_t TEMPO;
uint16_t TEMPOX;
uint16_t PWM;
uint16_t RPM;
uint16_t VCC;
uint16_t VCORE;
uint16_t VREF;
} hold;
[/code]

Og en [code=c]union[/code] uden om hvis et array skulle være nødvendigt.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Lasse Reinholt 29. dec. 2009 - 14.29
 
enum vs const

Det kan være en fordel at bruge variabler i stedet, i de tilfælde hvor det er muligt:
const int HOLD_TEMPI = 0;
const int HOLD_TEMPIX = 1;
...
Det giver type checking og desuden kan deres værdier udlæses under debugging, hvilket #defines ikke kan. Hastigheds/størrelsesmæssigt giver det samme resultat undtagen i specialtilfælde. Preprocessor ting bør man i det hele taget kun bruge, hvor der ikke findes et alternativ, som er lige så godt.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Jesper Louis Andersen 29. dec. 2009 - 14.51
 
Re: enum vs const

I Go har de en noget underlig iota-konstruktion. iota resettes hver gang man støder på en const og inkrementeres så hver gang man anvender den. Den kan endda udelades:

const (  
  HOLD_TEMPI = iota  
  HOLD_TEMPIX  
  HOLD_TEMPO  
  HOLD_PWM  
  HOLD_RPM  
  ...  
)

Til gengæld ser det ikke ud til at de har lyttet til PHK for sproget lader dig ikke erklære et array i antallet af elementer som er erklæret i en const-block så vidt jeg kan se.

Til gengæld kunne jeg godt tænke mig at vide hvorfor man har et behov for det array, for der kunne være en anden måde at beskrive problemet på som er bedre.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Robert Larsen 29. dec. 2009 - 20.18
 
Enums sucks!

Hvad er enums egentlig til for ?

Når dette er tilladt:

enum test {  
    FIRST = 7,  
    SECOND = 7  
};

...og dette er muligt:

enum test {  
    FIRST = 0,  
    SECOND = 1  
};  
   
void do_stuff(enum test) {  
}  
   
int main (int argc, char ** argv) {  
    do_stuff(18);  
    return 0;  
}

...og dette ikke giver antallet af enum værdier:

#include <stdio.h>  
   
enum test {  
    FIRST = 0,  
    SECOND = 1  
};  
   
int main (int argc, char ** argv) {  
    printf("%d\n", sizeof(enum test));  
    return 0;  
}

...så forstår jeg ikke længere, hvad jeg skal bruge enum til.

Javas version af enum giver mening (synes jeg), men C's giver en falsk tryghed (synes jeg).

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Poul-Henning Kamps billede
Poul-Henning Kamp 29. dec. 2009 - 23.13
 
@Hans

Jeg bruger ikke en struct fordi MODBUS datamodellen er en array af 16 bit ints.

Ideen med at overlejre en union vil jeg slet ikke kommentere, det er hverken sikkert, kønt eller portabelt.

Poul-Henning

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Per Steffensen 30. dec. 2009 - 09.01
 
Ting jeg ikke savner:

C

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Poul-Henning Kamps billede
Poul-Henning Kamp 30. dec. 2009 - 09.44
 
@Per

Meget nuttet, men man kører nu engang ikke Java på en 8-bit microcontroller...

Poul-Henning

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Jon Loldrup 30. dec. 2009 - 10.33
 
Re: @Per

Hvad med Google Go - mon ikke det har gode chancer for at overtage C's rolle som foretrukkent sprog til ressourceknappe platforme? (f.eks. 8-bit sager)
Det ville jeg sætte pris på.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
David Askirk Fotel 30. dec. 2009 - 11.02
 
Re: @Per

Java kører da på 8-bit.

Det store firma: http://www.is2t.com/en/technology-microjvm.php oooog lejos/tinyvm http://lejos.sourceforge.net/

Jeg ved ikke om denne kan 8-bit, men det er ihvertfald lavet til at køre på "the bare metal" https://squawk.dev.java.net/

Det kan self. være der ikke er nok mem. til at køre dem, det skal jeg ikke lige kunne gøre mig klog på.

/David

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Thomas Ammitzbøll-bach 30. dec. 2009 - 11.25
 
Java

Nu er der jo tale om hardwarenært programmering, så jeg er lidt nysgerrig i forhold til Java her:

Hvordan angiver man absolutte adresser i Java?
Hvordan skifter man endianess i Java?
Hvordan mikser man assembler med Java?
Hvordan laver man interuptrutiner i Java?

Jeg har skrevet en del linier C på platforme, hvor der ikke er noget runtime system (f.eks. operativsystem), og jeg kan ikke rigtig få det til at gå op med den abstraktion, som Java giver. Men jeg kender ikke nok til Java på det felt.

Please enlighten me here

Thomas

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Per Steffensen 30. dec. 2009 - 12.11
 
Re: @Per

Rart at blive betragtet som nuttet :-)

Bare lige for at slå det fast, så nævnte jeg ikke noget om java. Når det så er sagt, så er der ikke noget i sproget java, som gør at det ikke lige så godt kunne compileres ned og køre på "resourceknappe platforme". Java kunne såmænd godt kompileres "ned til jernet" i stedet for at blive kompileret til "hardward-neutral" java-bytekode, hvis man vil undgå den "store tunge" JVM.

Heldigvis findes der andre sprog end Java og C.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Thomas Elsgaard 30. dec. 2009 - 12.12
 
SUN's Sunspot

SUN's sunspot kører Java VM på "bare metal"

What kind of operating system does the Sun SPOT run on?

There is no operating system used. The Sun SPOT runs a Java VM on the bare metal.

http://www.sunspotworld.com/docs/general-faq.php

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Christian Nobel 30. dec. 2009 - 13.59
 
Re: @Per
men man kører nu engang ikke Java på en 8-bit microcontroller...

Man "kører" vel heller ikke C på en microcontroller, men man udvikler muligvis i C, for efterfølgende at kompilere til brug på mikrokontolleren.

Det skulle jo gerne fylde så lidt som muligt, men egentlig kunne man vel bruge et hvilket som helst anvendeligt programmeringssprog der kan kompilere til den givne processor - eller man kan jo være hardcore og skrive direkte i assembler.

Herudover forstår jeg slet ikke alt hypen omkring C og alle dets varianter.

/Christian

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Per Steffensen 30. dec. 2009 - 14.03
 
Re: @Per

Der er ikke (længere) nogen "hype" omkring C. Det er en defacto-standard i visse områder af branchen, som en masse udviklere derfor (uden nogen god grund, og heriblandt øjensyneligt Poul-Henning) må lide under. Mange af dem ved heldigvis ikke selv at de lider :-)

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Lars Clausen 30. dec. 2009 - 14.17
 
Enum's

Jeg vil holde med PHK, Java er et teenagersprog, hvor man ikke har nogen som helst kontrol over hvad der virkelig sker i de mange modificerede og udokumenterede objekter. Men nu må i også godt kalde mig for en programmerings dinosaur :-D Der synes det eneste 'Bare Metal' sprog er assembler, og C er højniveau ;-)

Jeg bruger selv Codevision C til AVR controllere (Altså ikke PHK's AVR GCC / GNU compiler).

Codevision fungerer absolut strålende! (Men koster 150 Euro).

Korrekt kode er: (Iflg dokumentationen:)

enum months {january, february, march, april, may, june, july, august, september, october, november, december} months_of_the_year;

Var det ikke det du efterlyste PHK ?

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Lars Clausen 30. dec. 2009 - 15.20
 
AVR ??

Ups jeg overså lige at det muligvis ikke var AVR controllere der var tale om. Variablen Vcore kunne pege på en version af ARM.

Men et opslag i Kernighan and Ritchie (1988) som jeg selvfølgelig har stående i bogreolen .. :-S viser at den korrekte syntax for enum er:

enum months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};

Så meget tæt op af PHK's eget forslag til hvordan det burde være løst. Eettallet ved JAN er for at give den første værdi 1, ellers bliver den defaulted til 0.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Poul-Henning Kamps billede
Poul-Henning Kamp 30. dec. 2009 - 15.47
 
@Lars:

Nej, det er ikke hvad jeg efterlyser.

Jeg efterlyser at min array bliver dimensioneret så den kan indexeres af alle definerede elementer i enum'en.

Poul-Henning

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Baldur Norddahl 30. dec. 2009 - 16.05
 
Re: Java
Nu er der jo tale om hardwarenært programmering, så jeg er lidt nysgerrig i forhold til Java her: Hvordan angiver man absolutte adresser i Java? Hvordan skifter man endianess i Java? Hvordan mikser man assembler med Java? Hvordan laver man interuptrutiner i Java?

Disclaimer: Jeg forslår ikke at java er det rigtige valg til systemprogrammering. Formålet med dette indlæg er blot at pointere at man godt kan, hvis man vil.

1) absolutte adresse kan angives i en integer. Hukommelse kan projekteres via et array. Arrayet kan oprettes via JNI kald.

2) Det gør man ikke, ligesom der ikke findes nogen måde i C. Det er en opgave for oversætteren.

3) Man bruger JNI.

4) På samme måde som i C. Bemærk at hverken C eller Java har nogen sprogegenskab som er specielt rettet mod at skrive interruptrutiner. Det er op til oversætteren og eksekveringsmiljøet om det smertefrit lader sig gøre.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
michael rasmussen 30. dec. 2009 - 16.51
 
Re: Java
Bemærk at hverken C eller Java har nogen sprogegenskab som er specielt rettet mod at skrive interruptrutiner

man sigaction ->
"The sigaction() system call is used to change the action taken by a process on receipt of a specific signal."

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Baldur Norddahl 30. dec. 2009 - 16.59
 
Re: Java
man sigaction -> "The sigaction() system call is used to change the action taken by a process on receipt of a specific signal."

Det står ellers meget tydeligt i det du citerer: sigaction er et systemkald, og ikke en del af sproget C. Det er f.eks. ikke tilgængeligt på mange platforme som ellers godt kan køre C programmer.

Du falder i standard fælden med at blande OS kald sammen med sproget.

På en mikrokontroller uden OS er der ikke noget sigaction kald - med mindre du skriver det selv i assembler. Og da kan du ligeså godt skrive sigaction på en måde, så den kan finde ud af at kalde en java metode, eller en metode i et vilkårligt andet sprog.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Claus Jørgensen 30. dec. 2009 - 17.00
 
Re: Java

Det er jo et specifikt systemkald. Det er vel også op til eksekveringsmiljøet at bestemme om det virker eller ej.

sigaction() findes ikke på alle platforme.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
michael rasmussen 30. dec. 2009 - 17.16
 
Re: Java
Du falder i standard fælden med at blande OS kald sammen med sproget.

At jeg nævnte sigaction, har følgende grund: "[..]Avoid its use: use sigaction(2) instead"

Siden C89 har sproget haft signals, men på de fleste, POSIX kompatible, platforme anbefales det at anvende sigaction. "signal - ANSI C signal handling" "CONFORMING TO C89, C99, POSIX.1-2001."

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Baldur Norddahl 30. dec. 2009 - 17.33
 
Re: Java
Siden C89 har sproget haft signals

Du mener at standard C biblioteket har haft signals. Det er mig bekendt ikke et reserveret keyword i sproget C. Det er en del af eksekveringsmiljøet, som ofte ikke er fuldt tilgængeligt. Normalt kalder man det vist stadig for C, selv når platformen ikke implementere hele standard C lib.

En java compiler til en mikrokontroller vil naturligvis komme med en tilsvarende funktion. Det er dog ikke en del af standard java biblioteket, for java er ikke tænkt til det brug.

Det var ikke min mening at vi skulle ud i et langt skænderi om hvad der ligger i diverse biblioteker. Mit budskab er simpelt at i selve sproget er der som sådan ikke den store forskel.

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Mark Ruvald Pedersens billede
Mark Ruvald Pedersen 31. dec. 2009 - 11.58
 
@PHK
Jeg efterlyser at min array bliver dimensioneret så den kan indexeres af alle definerede elementer i enum'en.

Tja, følgende virker i hvertfald under gcc:

enum hold_vars {
TEMPI, TEMPIX, TEMPO, TEMPOX,
PWM, RPM, VCC, VCORE, VREF,
__LAST /* !!! Keep this as last enum at all times !!! */
};
static uint16_t hold[__LAST];

Hvis jeg husker rigtigt er det altid (signed?) int's der gemmer sig bag enums. De int værdier de antager ramper op, 0-baseret - når intet andet er angivet.

Men det gælder måske ikke for din µC compiler?

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer
Poul-Henning Kamps billede
Poul-Henning Kamp 31. dec. 2009 - 12.39
 
@Mark

Ja, det virker, men forklar mig lige om du synes det er kønt at du skal bruge seks udråbstegn for at forklare læseren hvad det er du ikke kan forklare C-compileren ?

Min anke er ikke at man ikke kan lave et hack, min anke er at det ikke kan laves rent.

Poul-Henning

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer

Tilføj kommentar

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Log ind herunder eller opret en bruger for at skrive kommentarer
Du kan logge ind med din e-mail-adresse
Der er forskel på store og små bogstaver i adgangskoden.
Glemt adgangskode?

Seneste nyt

It skal spare kommunerne for 165 millioner kroner i 2012

Udgivet 9. feb 16.02Opdateret 9. feb 16.02

Adobe: Vi laver ikke Flash til Android-udgaven af Chrome

Udgivet 9. feb 15.15Opdateret 9. feb 15.15

Så oldnordisk er politiets it-miljø: Nostalgisk gensyn med 1980’erne

Udgivet 9. feb 14.22Opdateret 9. feb 15.12

EMC lægger flash-cache på PCIe-kort: 4.000 gange hurtigere end harddiske

Udgivet 9. feb 13.39Opdateret 9. feb 13.39

Egedal Kommune sparer 100.000 om året med open source-CMS

Udgivet 9. feb 12.56Opdateret 9. feb 12.56
Flere it-nyheder »
Få it-nyheder og blogs hver dag med Version2's nyhedsbrev.

Seneste debat

  1. Opdateret liste over danske iværksættere

    2 comments.
    Last update 1 time 39 minutter
    Skrevet af Therese Hansen
  2. Stop SOPA, PIPA, ACTA, TPP og alle dem der kommer efter

    50 comments.
    Last update 6 timer 31 sekunder
    Skrevet af Bjarne W. B. Petersen
  3. Derfor bliver dårlige it-projekter ikke stoppet i tide

    1 comment.
    Last update 6 timer 24 minutter
    Skrevet af Kasper Jørgensen
  4. Grotesk jobinterview i 2007: »Tag ikke jobbet, vi får alligevel aldrig Polsag til at virke«

    17 comments.
    Last update 6 timer 32 minutter
    Skrevet af Claus Waldersdorff Knudsen
  5. Så oldnordisk er politiets it-miljø: Nostalgisk gensyn med 1980’erne

    6 comments.
    Last update 6 timer 34 minutter
    Skrevet af Simon Justesen
  6. Domæne-forening: Lov om .aarhus og .cph var for tynd

    9 comments.
    Last update 7 timer 25 minutter
    Skrevet af Jarle Knudsen
  7. ACTA er i orden!

    51 comments.
    Last update 9 timer 58 minutter
    Skrevet af Jarle Knudsen
  8. It-advokat: Nu går grænsebommene ned over internettet

    10 comments.
    Last update 11 timer 44 minutter
    Skrevet af Niels Elgaard Larsen
Mere debat »

Information

  • Kontakt redaktionen
  • Job- og annoncesalg
  • Teknisk support
  • Om Version2
  • Brugerbetingelser
  • Privatlivspolitik

Aktuelle emner

  • Agil udvikling
  • Android
  • Bruttolønsordning
  • Business Intelligence
  • Cloud computing
  • Digitaliseringsstyrelsen
  • HTML5
  • Harddisk-priser
  • IE9
  • Intranet
  • It-sikkerhed
  • Kindle Fire
  • Multimedieskat
  • NemID
  • OS X Lion
  • Open source CMS
  • Projektledelse
  • Scrum
  • Sharepoint intranet
  • Storage
  • Ubuntu 11.10
  • Virtualisering
  • Windows 8
  • Windows Phone 7
  • iOS 5
  • iPhone 4S

Tjenester

  • Android-app
  • iPhone-app
  • RSS-feeds
Følg @version2dk
Få it-nyheder og blogs hver dag med Version2's nyhedsbrev.

Version2 udgives af

  • Mediehuset Ingeniøren A/S work Skelbækgade 4 1717 København V
  • Tlf. work 33265300