Avatar billede intel4004 Novice
04. maj 2004 - 12:51 Der er 19 kommentarer og
2 løsninger

C programmering med strenge (embedded controller)

Vi (min studiegruppe) sidder med en TI MSP430 Embedded Controllor (altså ikke en PC!), og forsøger noget med strenge.

Meningen er at der skal sende nogle karakter-sekvenser over serial kommunikation til en PC. På PC har vi noget java software som forventer disse sekvenser.

Jeg har brug for at tilføje flere "0" foran en streng. Java-softwaren forventer 5 tal men eksempelvis tallet(heltal) er kun 2 cifre/tegn langt.

Vi skal altså have påklistret (5 - tal_længde) antal nuller foran tallet (til venstre for). Hvordan gøres dette? På PC kan jeg skrive:

  printf("%05d", tal); //Virker som jeg vil have det!

Men kompileren til MSP'en kan ikke forstå dette :)

Jeg kunne godt tænke mig noget kode som kunne afhjælpe os(mig) men ingen af os er særlige C-nørder...selv om vi burde være det :)

Mvh Intel4004
Avatar billede arne_v Ekspert
04. maj 2004 - 13:01 #1
Hvad med:

char buf{6];
...
sprintf(buf,"%05d", tal);

og så sende buf
Avatar billede intel4004 Novice
04. maj 2004 - 13:39 #2
arne_v>

Jeg går udfra du mener "char buf[6]" ?

Men jeg kan ikke bruge syntaksen "%05d" da printf-versionen i MSP-kompileren blot forstår dette som strengen "05d" - det er der problemet ligger.

Gør jeg som du siger får jeg blot "05d" som output :)

Mvh Intel4004
Avatar billede arne_v Ekspert
04. maj 2004 - 13:59 #3
Jep. Slag fejl.

Kedelig compiler.

Jeg har ikke flere ideer så. Jeg troede at det var printf den ikek kunne
lide p.g.a. ingen stdout.
Avatar billede brilleaben Nybegynder
04. maj 2004 - 15:39 #4
Hva' med:

#define CIFRE 5

char buffer[CIFRE+1];
int i;

buffer[CIFRE]='\x00';
for (i=CIFRE; i>0; i--) {
    buffer[i-1]=(tal%10)+'0';
    tal/=10;
}


'tal' skal indeholde en integer værdi, 0-99999
buffer (5 tegn + terminating zero) kan sendes ...
Avatar billede intel4004 Novice
04. maj 2004 - 18:18 #5
brilleaben>

Den metode fungerer bare perfekt! Men kan man lave en med dynamiske arrays? Jeg søger en måde at lave samme metode, blot med fleksibilitet for værdien for CIFRE. Måske en procedure som modtager tal og antal_cifre som argumenter? Er det noget du kan bikse sammen?

Men du har tjent pointene alligevel :)

Mvh Intel4004
Avatar billede brilleaben Nybegynder
04. maj 2004 - 18:59 #6
Jomen, så kunne følgende vel bruges:


char *
IntToStr(int num, int length)
{
    char *buffer=new char[length+1];

    buffer[length]='\x00';
    for (; length>0; length--) {
        buffer[length-1]=(num%10)+'0';
        num/=10;
    }

    return buffer;
}


Kald med:

    char *outputStr=IntToStr(123, 5);

Husk at  'delete outputStr'  når du er færdig med brug af denne (for at undgå memoryleaks).

(Jeg er ikke den store C++ haj, men ovenstående kompilerer & kører fejlfrit med g++ og linux)
Avatar billede brilleaben Nybegynder
04. maj 2004 - 19:01 #7
Øhrm, for lige at skære ud i pap:

    char *outputStr;

    outputStr=IntToStr(123, 5);
    // gør noget med outputStr, ex:
    // printf("%s\n", outputStr);
    delete outputStr;
Avatar billede intel4004 Novice
04. maj 2004 - 19:07 #8
brilleaben>

Sorry men vil det kode kunne forsvares i en ren C verden (ingen C++)? Uanset om kompileren æder det, så er vores eksisterende kode bygget omkring ren C.

Mvh Intel4004
Avatar billede arne_v Ekspert
04. maj 2004 - 19:10 #9
char *buffer=new char[length+1];

compiler ikke i ren C.

char *buffer=(char *)malloc(length+1);

burde
Avatar billede arne_v Ekspert
04. maj 2004 - 19:11 #10
Og så free(outputStr) i.s.f. delete outputStr.
Avatar billede intel4004 Novice
04. maj 2004 - 19:56 #11
Ok - det fungerer bare det der! Også med malloc()...!

Hvad jeg gør sådan her:

  printf("%s", IntToStr(num, minsize));

Så er jeg fri for at bruge free() ikke? Bliver værdien i hukommelsesområdet ikke kopieret til printf()'s scope og derefter "befriet" efter printf() er færdig??

Intel4004
Avatar billede arne_v Ekspert
04. maj 2004 - 19:57 #12
Nej.

Det er en memory leak.
Avatar billede intel4004 Novice
04. maj 2004 - 20:06 #13
Fordi man "brutalt" har allokeret området med malloc()??

Intel4004
Avatar billede arne_v Ekspert
04. maj 2004 - 20:08 #14
Det gælder både malloc og new. Allokering uden deallokering = memory leak.

Eneste undtagelse er alloca hvor memory automatisk deallokeres når
den allokerende funktion returnerer.

(kan ikke bruges i dette tilfælde)
Avatar billede intel4004 Novice
04. maj 2004 - 20:12 #15
ok - takker. Vi kan ikke have nogle memoryleaks da vi kun har 2kB at gøre godt med :)
Avatar billede intel4004 Novice
04. maj 2004 - 20:43 #16
Har lige et lille ekstra spørgsmål:

Hvorfor typecaster man i dette tilfælde malloc() med (char *) ?

Malloc() returnerer en pointer af typen (void *) - er det nødvendigt at typecaste?

Intel4004
Avatar billede brilleaben Nybegynder
04. maj 2004 - 20:44 #17
Sorry - fik lige sat nogle plusser på :-)

Hvorfor ikke bare overgive en buffer hvori resultatet kan skrives i?

Noget ala:

void
IntToStr(char *buffer, int num, int length)
{
    buffer[length]='\x00';
    for (; length>0; length--) {
        buffer[length-1]=(num%10)+'0';
        num/=10;
    }
}

Så:


char buffer[11];

IntToStr(buffer, 123, 5);


buffer = 11 (32 bits int = 10 cifre + term zero ...  = 11)

???
Avatar billede arne_v Ekspert
04. maj 2004 - 20:45 #18
Afhænger af compiler.

Jeg plejede at undlade det.

Og så får halvdelen warning på det.

Så jeg er bekendt at tage den med.
Avatar billede arne_v Ekspert
04. maj 2004 - 20:46 #19
Det kan man da sagtens, men spørger spurgte jo efter et dynamisk array.
Avatar billede intel4004 Novice
04. maj 2004 - 20:50 #20
arne_v> ok

brilleaben>

Det jeg nu har gjort er bruge printf() inde i min funktion. Så allokeres og deallokeres bufferen inde i funktionen... Så er memoryleaks vel også ude af billedet?

Mvh Intel4004

Takker for de mange gode forslag - i har faktisk fået mig til at åbne min splinter nye C-bog :)
Avatar billede brilleaben Nybegynder
04. maj 2004 - 21:59 #21
intel4004 - ja, det skulle jeg da mene :-)

arne_v - jeg reagerede såmænd også på udsagnet om, at der tilsyneladende kun er 2KB til
rådighed :-)    I de små størrelser er der sjældent plads til den helt store dynamik, når det er relativt små typer der arbejdes med (hellere allokere 11 bytes up front end at spilde bytes på fancy håndtering af dynamiske størrelser ...  :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester