Gå til innhold

[Løst] arduino strcmp() loop problem.


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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 av zotbar1234
Lenke til kommentar

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 av zotbar1234
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...