Hi, also die grundsätzliche Verwendung von memcmp / strcmp ist mir soweit klar und funzt auch ABER ich weiß nicht wie ich folgendes lösen soll: buffer[1]={0x48,0x49}; // Buffer[5]="01"; if (memcmp(&buffer[0],"00"==0) {Menü 0 Untermenü 0} if (memcmp(&buffer[0],"01"==0) {Menü 0 Untermenü 1} if (memcmp(&buffer[0],"10"==0) {Menü 1 Untermenü 0} if (memcmp(&buffer[0],"11"==0) {Menü 1 Untermenü 1} DAS IST SOWEIT KLAR, aber wie vergleiche ich: buffer[5]={0x00,0x01}; if (memcmp(&buffer[0],{0x00,0x01}==0) {tue etwas} geht ja nicht. und ständig vor dem if ein Temparray[1]={0x00,0x01} usw. ist meines erachtens zu unständlich. in VB würde ich schreiben: !!! VB Code !!! if String = chr(0) & chr(1) then {tue dies und das} geht sowas auch in C ???? Gruß DIAN
Du könntest die beiden aufeinanderfolgenden Bytes in Buffer als 16-Bit-Wert ansprechen, dann sähe das ganze so aus:
1 | if (*((int *) buffer) == 0x0001) |
2 | machwas(); |
3 | if (*((int *) buffer) == 0x0101) |
4 | machwasanderes(); |
5 | if (*((int *) buffer) == 0x0102) |
6 | lassesbleiben(); |
Dann wird es so übersichtlicher:
1 | switch (*(int *) buffer)) |
2 | {
|
3 | case 0x0001: |
4 | machwas(); |
5 | break; |
6 | case 0x0101: |
7 | machwasanderes(); |
8 | break; |
9 | case 0x0102: |
10 | lassesbleiben(); |
11 | break; |
12 | default:
|
13 | machsonstwas(); |
14 | break; |
15 | }
|
Hier ist allenfalls die Reihenfolge der Bytes zu klären (->Endianness), d.h. in welcher Reihenfolge der genutzte Prozessor MSB und LSB eines 16-Bit-Wertes im Speicher ablegt.
danke, das ist ertmal ne gute Lösung. das ganze kann ich ja dann bis 32bit ausreizen, das sollte auch reichen, aber was macht man wenn's darüber hinaus geht? ich also werte wie 0x0102030405060708 oder so brauche? Gruß DIAN
Dann solltest Du vielleicht Dein Konzept überdenken?
;-) gute Antwort... also schlußfolgere ich daraus, dass C hier an seine Grenzen stößt ? ist eben doch nicht alles möglich in C ? naja, werde das Konzept auf Buchstaben umstellen, da hab ich erstmal 27 zeichen pro Byte die ich garantiert und einfach abfragen kann. ich dachte es gibt in C sowas wie "BLA SÜLZ" kann man auch schreiben als {'B','L','A',' ','S','Ü','L','Z','\0'} von mir aus auch in eckigen oder runden Klammern oder mit Semikolon, Binderstrich,Punkt, Plus oder & ........ (fast) jede andere Programmiersprache kann sowas.
Der Haken ist dabei, dass du irgendwo den Speicher für das dergestalt zu generierende Array allozieren musst. Das kostet dich auf die Dauer ziemlich viel RAM. Der GCC kann sowas (Rückgabe eines Wertes aus einer `brace group') übrigens wirklich, siehe die Implementierung des PSTR-Makros in der avr-libc. Dort ist es aber ein Makro, mit dem explizit im ROM Speicher angefordert wird.
> danke, das ist ertmal ne gute Lösung. das ganze kann ich ja dann bis > 32bit ausreizen, das sollte auch reichen, aber was macht man wenn's > darüber hinaus geht? ich also werte wie 0x0102030405060708 oder so > brauche? Wenn Du es schaffst eine Switch-Anweisung für 2^32 verschiedene Fälle zu schreiben, dann bist Du 200 Jahre alt und längst gestorben :-) . Außerdem stimmt der Aufruf vom memcmp() nicht. .. if (memcmp(&buffer[0],"00"==0) {Menü 0 Untermenü 0} .. muß wohl eher heißen : if (memcmp(buffer,"00",2) == 0) {Menü 0 Untermenü 0} Klaus
> 0x0102030405060708
"\x01\x02\x03\x04\x05\x06\x07\x08"
> also schlußfolgere ich daraus, dass C hier an seine Grenzen stößt ? > ist eben doch nicht alles möglich in C ? Wenn der Fahrer nicht fahren kann ist natürlich zuerst das Auto schuld.
Werner B. wrote: >> also schlußfolgere ich daraus, dass C hier an seine Grenzen stößt ? >> ist eben doch nicht alles möglich in C ? > > Wenn der Fahrer nicht fahren kann ist natürlich zuerst das Auto schuld. Ja, sowas in der Art habe ich mir auch dabei gedacht... Ich wette, dass man in C allein von den verfügbaren Programmiermethoden einiges mehr machen kann, als mit anderen Programmiersprachen. Ich sag nur Pointer bzw. Pointerarithmetik. Das gibts nicht überall
Bist Du sicher, dass das funktioniert bzw. das ist, was Du möchtest? > buffer[1]={0x48,0x49}; // Buffer[5]="01"; Wenn buffer ein Array von Pointern wäre, also char *buffer[20] oder ähnlich, dann würde aber > if (memcmp(&buffer[0],"00"==0) {Menü 0 Untermenü 0} auch wenn die Syntax soweit korrekt wäre, mit &buffer[0] die Adresse (nicht den Wert) des ersten Pointers holen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.