Hallo,
ich rätsel schon seit einem Weilchen an folgender Aufgabenstellung:
Ein kleines 8-Bit Array [7x8] (Array1) soll mit einem zweitem, größerem
64-Bit Array [1x64] (Array2), teilweise vergleichen werden.
Ich möchte beim erstem Element von Array2 beginnen und, sollte der
Vergleich nicht wahr sein, mit dem zweitem weitmachen etc. ... (Bilder
sind angehängt).
Vergleichselement ist immer das komplette Array1.
In beiden Arrays stehen nur 0 oder 1.
Dazu habe ich folgenden Algorithmus:
1
for(inti=0;i<64;i++){
2
if(memcmp(Array1[4][0],Array2[i],8)==0)
3
i=64;//for abbrechen
4
}
Das Problem ist, dass diese Bedingung immer wahr zu sein scheint, auch
wenn das Array1 überhaupt nicht zu dem Array2 passt.
Hat jemand eine Idee wie man diesen Vergleich am elegantesten löst?
Passt die Eingabe von Array1 in memcmp()?
Vielen Dank für eure Anregungen.
LG
Hey,
okay das mit dem break; ist ein guter Tipp, werde ich umsetzen.
Den Vergleich einzelner Zeichen würde ich gern vermeiden, da memcmp()
näher an der HW ist und die Operation zeitkritisch ist.
Das hier habe ich gerade getestet:
1
chartestarray1[8]={1,0,1,0,1,0,1,0};
2
chartestarray2[2][8]={
3
{0,0,0,0,1,0,1,0},
4
{1,1,1,1,1,1,1,1},
5
6
for(inti=0;i<=8;i++){
7
if(memcmp(testarray1[0],testarray2[1][i],4)==0){
8
uart_puts("gleich");
9
_delay_ms(200);
10
}
11
}
Ziel: Vergleiche Testarray1 mit der zweiten Zeile des Testarray2.
Die beiden Arrays passen überhaupt nicht zusammen, aber dennoch wird die
Bedingung wahr und am uart erscheint "gleich".
Das kann doch nicht angehen ^^
Julian F. schrieb:>> for(int i=0; i<= 8; i++){> if(memcmp(testarray1[0], testarray2[1][i], 4) == 0){
Du solltest Dich über die Parametertypen von memcmp informieren
und die Warnungen Deines Compilers ernstnehmen!
testarray1[0] ist ein WERT und keine ADRESSE!
Ebenso testarray2[1][i].
HDH,
scherenschleifer
Julian F. schrieb:> Hey,>>> for(int i=0; i<= 8; i++){
Abgesehen davon, dass die Schleife hier unsinnig ist,
scheinst Du der Ansicht zu sein, der
höchste Index eines Arrays sei gleich der Anzahl seiner
Elemente.
int array[SIZE];
-->
for (i = 0; i < SIZE; i++) ....
^
scherenschleifer
@ Dirk: Die Schleife sollte in der Tat nur bis 3 zählen. Sonst machts
keinen Sinn.
@ scherenschleifer: Aus meiner C-Vorlesung meine ich mich zu erinnern,
dass in Arrays ausschließlich Adressen gespeichert werden. Ein Test mit
dem "&" bewirkt, dass die Funktion nicht mehr funktioniert :D ^^ dennoch
guter Tipp!
Sorry ich habe auch schon einige Codezeilen runtergeschrieben, aber mit
dieser FKT habe ich so meine Probleme ...
Julian F. schrieb:> @ scherenschleifer: Aus meiner C-Vorlesung meine ich mich zu erinnern,> dass in Arrays ausschließlich Adressen gespeichert werden.
Erinnerungen sind gut, Wissen ist besser.
In Arrays werden Daten gespeichert. Das können auch Adressen sein.
Julian F. schrieb:> Ziel: wenn i = 3, sollte die if-Anweisung stimmen und "gleich" ausgeben.> Ergebnis: nichts tut sich
Dann lass doch mal die Schleife bis 4 laufen.
Oh man was lange währt ... :D
tausend Dank jetzt klappts. Dann habe ich mich ja gleich zwei mal
getäuscht.
Hier nochmal alles zusammengefasst, für die die es interessiert:
>tausend Dank jetzt klappts
Meinst Du...
Du hast meinen Einwand von vorher nicht ernst genommen.
Nochmal:
>int array[SIZE];>>-->>for (i = 0; i < SIZE; i++) ....> ^
Hier
>for(int i=0; i<= 4; i++){> if(memcmp(&testarray1[0], &testarray2[0][i], 4) == 0){
greift memcmp für i == 4 über das Array hinaus.
Wenn das das ist, was Du willst...
scherenschleifer