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
case0x0001:
4
machwas();
5
break;
6
case0x0101:
7
machwasanderes();
8
break;
9
case0x0102:
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
;-) 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
> 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.