Gast
#2011060
Hallo! Ich habe da ein dickes Problem im GCC AVR gefunden. Ich will einen String nach einer Reihe von Schlüsselwörtern durchsuchen. Wenn die Schlüsselwörtern im Ram stehen und unter verwendung von strcasecmp geht das auch wunderbar. Kommen die Schlüsselwörter aus dem Flash mit strcasecmp_P geht das nur wenn der index in Strings[] eine konstante ist. Kennt da jemand einen workaround? #include <avr/pgmspace.h> #include <stdio.h> #include <avr/iom128.h> #include <avr/interrupt.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int16_t indx; char cliline_ram[] = "WRITE"; const char PROGMEM Str1[] = "HELP"; const char PROGMEM Str2[] = "INFO"; const char PROGMEM Str3[] = "WRITE"; const char PROGMEM Str4[] = "READ"; const char PROGMEM Str5[] = "POLL"; const char PROGMEM Str6[] = "DEFINE"; const char PROGMEM Str7[] = "SCAN"; const char PROGMEM Str8[] = "IPADDR"; const char PROGMEM Str9[] = "IPMASK"; const char PROGMEM Str10[] = "GATEWAY"; const char PROGMEM Str11[] = "PORT"; const char* PROGMEM Strings[] = { Str1, Str2,Str3 ,Str4 ,Str5 ,Str6 ,Str7 ,Str8,Str9,Str10,Str11 }; int16_t gr; uint8_t i; int16_t main(void) { indx =strcasecmp_P((const char*)&cliline_ram,Strings[0]); //nicht gefunden indx =strcasecmp_P((const char*)&cliline_ram,Strings[1]); //nicht gefunden indx =strcasecmp_P((const char*)&cliline_ram,Strings[2]); //gefunden ok i=2; indx =strcasecmp_P((const char*)&cliline_ram,Strings[i]); //geht nicht gr = sizeof(Strings) / 2; for (i=0;i<gr; i++) { indx =strcasecmp_P((const char*)&cliline_ram,Strings[i]); //geht nicht indx =strcasecmp_P((const char*)&cliline_ram,Strings[2]); //geht } return 0; }