maze Skrevet 29. september 2012 Del Skrevet 29. september 2012 Hei. Jeg holder på med et prosjekt som man blant annet kan styre en haug med pwm kanaler. Har pr nå følgende kode. if (strcmp(name, "pwm0") == 0){pwm_data[0] = strtoul(value, NULL, 10);} if (strcmp(name, "pwm1") == 0){pwm_data[1] = strtoul(value, NULL, 10);} if (strcmp(name, "pwm2") == 0){pwm_data[2] = strtoul(value, NULL, 10);} if (strcmp(name, "pwm3") == 0){pwm_data[3] = strtoul(value, NULL, 10);} if (strcmp(name, "pwm4") == 0){pwm_data[4] = strtoul(value, NULL, 10);} if (strcmp(name, "pwm5") == 0){pwm_data[5] = strtoul(value, NULL, 10);} if (strcmp(name, "pwm6") == 0){pwm_data[6] = strtoul(value, NULL, 10);} Jeg skulle gjerne ha kjørt dette i en loop. Problemet er at strcmp forventer const char* og jeg vil gjerne generere dette ut fra en int. Ønsker noe sånt som dette. for(i=0; i<=10 ; i++){ if (strcmp(name, "pwm[i]") == 0){pwm_data[i] = strtoul(value, NULL, 10);} } Noen som har noen forslag? Lenke til kommentar
jonny Skrevet 30. september 2012 Del Skrevet 30. september 2012 Her er et forslag: #include <string.h> #include <stdio.h> #include <stdlib.h> static char *int2str[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; int main() { char *name = "pwm6"; char *pwm = malloc(5); int i; for (i = 0; i <= 10; i++) { strcpy(pwm, "pwm"); if (strcmp(name, strcat(pwm, int2str[i])) == 0) { printf("match %d\n", i); } } } Lenke til kommentar
maze Skrevet 30. september 2012 Forfatter Del Skrevet 30. september 2012 Fikk løst det nå. Innlegget ditt satt meg iallefall i riktig retning. Løsning: static char *int2str[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; int main() { char *name = "pwm6"; for (int i = 0;i<= 10; i++) { char pwm[] = {"pwm"}; if (strcmp(name, strcat(pwm, int2str[i])) == 0) { printf("match %d\n", i); } } } Lenke til kommentar
zotbar1234 Skrevet 30. september 2012 Del Skrevet 30. september 2012 (endret) Løsning: /* ... */ char pwm[] = {"pwm"}; if (strcmp(name, strcat(pwm, int2str[i])) == 0) Nei, ikke løsning: $ gcc -O3 -std=c99 strcat1.c $ ./a.out *** buffer overflow detected ***: ./a.out terminated (du har ikke plass til å gjøre en strcat()). Endret 30. september 2012 av zotbar1234 Lenke til kommentar
maze Skrevet 30. september 2012 Forfatter Del Skrevet 30. september 2012 Hmm.. forsto ikke helt dette. Men koden fungerer iallefall helt uten problem av hva jeg har testet til nå. Lenke til kommentar
zotbar1234 Skrevet 30. september 2012 Del Skrevet 30. september 2012 (endret) Hmm.. forsto ikke helt dette. I definisjonen av char array pwn, allokerer du plass til 4 bytes -- 'p', 'w', 'm' og '\0'. strcat() som du bruker senere prøver å legge til minst 2 bytes til til array pwn, noe det ikke er plass til. Forutsetningen for strcat() er at det finnes tilstrekkelig plass i destinasjonsbufferet for å legge til en suffiks. Det er ikke tilfellet her. Men koden fungerer iallefall helt uten problem av hva jeg har testet til nå. Det betyr kun at testingen din er utilstrekkelig. Problemet er trivielt å fremtvinge (jfr tidligere). Jeg overså forresten denne også: char *name = "pwm6"; Det er aldri lurt å hive ut constness under tilordning (høyre side har typen "array of const char", venstre side har typen pointer to char). Endret 30. september 2012 av zotbar1234 Lenke til kommentar
maze Skrevet 30. september 2012 Forfatter Del Skrevet 30. september 2012 Aha. char pwm[7] = {"pwm"}; Dette burde med andre ord ikke skape problemer? int2str vil uansett aldri bli høyere en 640. Lenke til kommentar
zotbar1234 Skrevet 30. september 2012 Del Skrevet 30. september 2012 Aha. char pwm[7] = {"pwm"}; Dette burde med andre ord ikke skape problemer? int2str vil uansett aldri bli høyere en 640. Det er svært ulurt med magiske konstanter (X antall måneder fremover i tid vil du aldri huske på hvorfor det stod 7 (og ikke 6 eller 8 der)), men ja, du slipper i det minste problemet med udefinert oppførsel. Jeg satt og tenkte på hvordan jeg skulle gjøre dette i C: max_len = max(len(item) for item in int2str) ... men det kom aldri noe godt ut av den tankerekken. Oh well... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå