Forum: Mikrocontroller und Digitale Elektronik Arrays teilweise vergleichen


von Julian F. (b0lle)


Angehängte Dateien:

Lesenswert?

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 (int i = 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

von Ben j. (scarab)


Lesenswert?

Erstmal ordentlich Formatieren..
1
for (int i = 0; i < 64; i++)
2
{
3
    if ( memcmp(Array1[4][0],Array2[i],8) == 0 )
4
        i = 64; //for abbrechen
5
}

so...

ist Array1 wirklich zweidimensional und Array2 eindimensional?

wie erkennst du denn ob und wo die Bedingung erfüllt ist?

1
i = 64; //for abbrechen
wird üblicherweise mit einem
1
break;
 gelöst. Break hätte auch den Vorteil das du danach in i die Stelle der 
Übereinstimmung stehen hättest.

von Peter (Gast)


Lesenswert?

Hi kurzes beispiel wenn du vergleichen willst aber ein Offset hast. Habe 
hier einfach mal 3 als Offset eingegeben.
1
for (int i = 0; i < 64; i++)
2
{
3
    if (Array1[i]==Array2[i+3])
4
        i = 64; //for abbrechen
5
}

Statt == kannste auch != für ungleich verwenden weiß ja nicht genau was 
du vor hast.

von Julian F. (b0lle)


Lesenswert?

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
char testarray1 [8] = {1,0,1,0,1,0,1,0};
2
char testarray2 [2][8] = {
3
    {0,0,0,0,1,0,1,0},
4
    {1,1,1,1,1,1,1,1},
5
6
for(int i=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 ^^

von DirkB (Gast)


Lesenswert?

memcmp erwartet zwei Zeiger auf die Speicherbereiche. du übergibst aber 
die ersten Elemente der Arrays.

Warum zählt die Schleife bis 8?

von scherenschleifer (Gast)


Lesenswert?

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

von scherenschleifer (Gast)


Lesenswert?

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

von Julian F. (b0lle)


Lesenswert?

@ 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 ...
1
for(int i=0; i<= 3; i++){
2
  if(memcmp(&testarray1[0], &testarray2[0][i], 4) == 0){
3
    uart_puts("gleich");
4
    _delay_ms(200);
5
  }
6
}
Ziel: wenn i = 3, sollte die if-Anweisung stimmen und "gleich" ausgeben.
Ergebnis: nichts tut sich

von DirkB (Gast)


Lesenswert?

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.
1
char testarray1 [8] = 
2
            {1,0,1,0,1,0,1,0};
3
char testarray2 [2][8] = {
4
    {0,0,0,0,1,0,1,0},
5
//   0 1 2 3 4  Das stimmt erst ab Indes 4 überein
6
    {1,1,1,1,1,1,1,1},

von Julian F. (b0lle)


Lesenswert?

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:
1
char testarray1 [8] = {1,0,1,0,1,0,1,0};
2
char testarray2 [2][8] = {
3
    {0,0,0,0,1,0,1,0},
4
    {1,1,1,1,1,1,1,1},
5
};
6
7
for(int i=0; i<= 4; i++){
8
  if(memcmp(&testarray1[0], &testarray2[0][i], 4) == 0){
9
    uart_puts("gleich");
10
    _delay_ms(200);
11
  }
12
}

Liebe Grüße
Julian

von scherenschleifer (Gast)


Lesenswert?

>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

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
Noch kein Account? Hier anmelden.