Pages: [1]   Go Down
Author Topic: String abfragen ?  (Read 931 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
este es la leche
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2751
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Umwandlung von char* in int* nicht möglich
zum Glück, sonst wäre der Fehler nur schwerer zu finden gewesen ... smiley-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

Code:
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
« Last Edit: November 09, 2012, 05:22:25 am by michael_x » Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 5
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Warum nicht einfach atoi nutzen?
Logged


Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2751
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Warum nicht einfach atoi nutzen?
Stimmt, also

Quote
Wenn nicht, gibt es mindestens 3 Möglichkeiten ...
« Last Edit: November 09, 2012, 05:34:39 am by michael_x » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
este es la leche
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

Quote
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.

Quote
Warum nicht einfach atoi nutzen?
was bitte ist "atoi" ?
Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 5
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: November 09, 2012, 08:02:22 am by markbee » Logged


Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2751
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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 == '*' ) { ... }
smiley-wink
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
este es la leche
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

nachdem ich mit
Quote
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
Quote
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  smiley ; 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  [/size]
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2751
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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:

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

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
este es la leche
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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.

Code:
#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();
  }
Logged

Pages: [1]   Go Up
Jump to: