String abfragen ?

Hallo zusammen, ich steh mal wieder auf dem Schlauch. Ich möchte einen String nach einem bestimmten Inhalt abfragen und komme nicht weiter. Als Basis verwende ich ITDB02_Touch_Button Test (von H.K.); wenn auf dem Display z.B. "1000" (Inhalt des Strings) steht, soll nach antippen von "ENTER" ein bestimmter Text auf dem Display erscheinen, ansonsten ein alternativer Text. Mit einer if Abfrage gehts anscheinend nicht (Umwandlung von char* in int* nicht möglich). Kann mir jemand nen Tipp geben ? Gruß und Danke

Umwandlung von char* in int* nicht möglich

zum Glück, sonst wäre der Fehler nur schwerer zu finden gewesen … :wink:

Hast du den string “1000” nicht noch als Zahl, die du in ein char geschrieben hast?

Wenn nicht, gibt es 2 Möglichkeiten sscanf (trickreich, das richtig zu parametrieren)
oder den String Zeichen für Zeichen in eine Ziffer zu wandeln und alle Ziffern zu einer Zahl

char* p = "1000";
int number = *p++ - '0'; // number sollte den Wert 1 haben und p auf das nächste Zeichen zeigen
while (*p != 0) number = number*10 + *p++ - '0'; // usw. bis der string zu Ende ist

edit:

  • erzeugt Müll wenn der string was anderes ausser Ziffern ‘0’ … ‘9’ enthält. Nur als Prinzip…
    - mit code tags sieht es schöner aus

Warum nicht einfach atoi nutzen?

Warum nicht einfach atoi nutzen?

Stimmt, also

Wenn nicht, gibt es mindestens 3 Möglichkeiten ...

Hast du den string "1000" nicht noch als Zahl, die du in ein char [] geschrieben hast?

nein, da der Inhalt des strings erst beim Tippen auf dem Touch erzeugt wird.

erzeugt Müll wenn der string was anderes ausser Ziffern '0' ... '9' enthält. Nur als Prinzip...

in der "Endversion" sollten auch Buchstaben und Zeichen (*, #) abgefragt werden können.

Warum nicht einfach atoi nutzen?

was bitte ist "atoi" ?

Eine Funktion aus C - "ASCII to Integer"

int atoi ( const char * str );

Convert string to integer Parses the C string str interpreting its content as an integral number, which is returned as an int value.

in der "Endversion" sollten auch Buchstaben und Zeichen (*, #) abgefragt werden können.

Kein Problem. Wenn dir klar ist was dann passieren soll, kannst du es auch programmieren.

if ( *p == '*' ) { ... } ;)

Hallo zusammen,

nachdem ich mit

char* p = "1000"; int number = *p++ - '0'; // number sollte den Wert 1 haben und p auf das nächste Zeichen zeigen while (*p != 0) number = number*10 + *p++ - '0'; // usw. bis der string zu Ende ist

und

atoi

irgendwie nicht richtig weiterkommen bin, habe ich folgendes in void loop eingefügt:

char stBegin[8]="*1000#"; if (strcmp(stLast, stBegin)==0) // "stLast" ist der über das TFT einegebene String.

funktioniert :) ; jetzt würde mich interessieren, ob man den Inhalt von char stBegin[8]... ändern kann, ohne das Programm neu zu laden. Ich würde den Wert gerne in einer Funktion haben, der Wert soll im externen EEPROM gespeichert werden, beim Starten abgerufen, bei evtl. Änderung neu in das EEPROM geschrieben werden und als neuer Wert im laufendem Betrieb, bzw. bei einem Neustart wieder zur Verfügung stehen

jetzt würde mich interessieren, ob man den Inhalt von char stBegin[8]... ändern kann, ohne das Programm neu zu laden

Ja, da es nicht als const definiert ist.

strcpy oder strncpy heisst das Umkopieren, oder zeichenweise:

stBegin[2] = '7';  // ändert  "*1000#"   --> "*1700#"

Bei jedem Reset ist die Änderung wieder weg, stBegin sollte also in setup mit dem eeprom sychronisiert werden.

@michael_x
Danke

das mit dem im eeprom speichern möchte ich umsetzen ( der Wert von stBegin soll beim ersten Starten auf z.B. *1000# gesetzt werden, und im EEPROM auf der Adresse 0 gespeichert werden). Bei einer Änderung soll dann der neue Wert (z.B. *1100#) den alten Wert im EEPROM überschreiben, die Initalisierung des alten Wertes in void setup wird vorher gelöscht. Allerdings bring ich das mit dem EEPROM nicht zu laufen.
Ich habe auf dem Mega-Board ein Shield für den TFT, auf dem Shield ist eine DS1307, die über den I2C-Bus angesprochen wird. Soblad ich in void setup ‘Wire.beginn…’ einsetze, zeigt mir die Uhr als Zeit ‘27:85:85’, beim Wochentag ‘xx’ und beim Datum ‘85.85.@5’, anbei der Codeausschnitt.

#include <ITDB32_Touch.h>
#include <ITDB02_Graph16_1.h>
#include <DS1307.h>
#include <EEPROM.h>
#include <Wire.h>
#define eeprom 0x50;
extern uint8_t SmallFont[];
extern uint8_t BigFont[]; 
ITDB02        myGLCD(38,39,40,41,ITDB32WC);
ITDB32_Touch  myTouch(6,5,4,3,2);
DS1307 rtc(20, 21);        // Init DS1307 // SDA pin -> Arduino Mega Digital 20, SCL pin -> Arduino Mega Digital 21
int x, y, xo, zo, twt, stst, swz, wsz, tval, val_1;
Time t;
word yr;
char stCurrent[20]="";
int stCurrentLen=0;
char stLast[20]="";
char stBegin[8]="*1000#";
// ---------------------------------------------------------------------------------------------------------------------
void setup()
  {
    myGLCD.InitLCD(LANDSCAPE);
    myGLCD.clrScr();
    myTouch.InitTouch(LANDSCAPE);
    myTouch.setPrecision(PREC_MEDIUM);
    myGLCD.setColor(255, 255, 255);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setFont(SmallFont);
    delay(50);
    myGLCD.filoScr(0,0,139,69, 225,225,225);
    rtc.halt(false);
    // Wire.begin();
  }