Forum: Mikrocontroller und Digitale Elektronik Array mit strncmp durchsuchen


von Christoph H. (christoph_b)


Lesenswert?

Hallo

Ich scheitere nun an folgender einfachen Aufgabe ;-)
Hier erstmal der Code:


1
      char output_array[100][40];
2
      check=UB_Uart_ReceiveString(COM3,buf);//buf =empfangsbuffer
3
      if(check==RX_READY) {
4
        //i++;
5
        if(strlen(buf)>40)
6
        {
7
          i++;
8
          UB_Led_Toggle(LED_RED);
9
          ptr=strtok(buf,delimiter);
10
11
           for(array_search=0;array_search<100;array_search++)
12
           {
13
             if (strncmp (output_array[array_search],ptr,16) == 0)
14
             {
15
               UB_Led_Toggle(LED_ORANGE);
16
               break;
17
             }
18
           }
19
20
            //sprintf (output_array[i],"%s",ptr);
21
          while (ptr != NULL)
22
            {
23
24
             sprintf (output_array[f],"%s",ptr);
25
             ptr = strtok(NULL, delimiter);
26
             if(f<i)
27
             {
28
               f=i;
29
               e=f-1;
30
             }
31
            }

Ich teile nun meine Zeichenfolge und speicher sie in dem 
Mehrdimensionales Array "char output_array[100][40];"

Die Zeichenfolge die im Array gespeichert wird schaut z.B. so aus.
10:68:3f:24:6e:e5 5a020c "" -54
08:d4:2b:1e:40:22 1a010c "" -66
ac:7b:a2:a3:92:5d 7e010c "" -43

Wenn die ersten 16 Zeichen der Zeichenfolge schon im Array vorhanden 
ist, soll er nicht wieder eingetragen werden.

Leider klappt das nicht.

Wenn ich die Zeichenfolge in einer anderen Reihenfolge empfange 
fünktioniert die Überprüfung nicht. Wieso weis ich nicht.

von Stefan F. (Gast)


Lesenswert?

Der Quelltext ist unvollständig und ich verstehe deine 
Problembeschreibung nicht. Fang nochmal von vorne an und erkläre in Ruhe 
und ausführlich, was das Programm tun soll und was es stattdessen tut.

>10:68:3f:24:6e:e5 5a020c "" -54
>08:d4:2b:1e:40:22 1a010c "" -66
>ac:7b:a2:a3:92:5d 7e010c "" -43

Was soll das darstellen?

von MaWin (Gast)


Lesenswert?

Christoph B. schrieb:
> Leider klappt das nicht.

Vereinfacht gesagt: Du kannst einfach nicht programmieren.

Dein Code tut etwas anderes als du beschreibst.

Wenn die ersten 16 Zeichen im empfangenen Strin in einem der 100 
Einträge vorhanden sind, blinkt die LED.

Der String wird an einem obskuren Delimiter (vielleicht Semikolon) 
zerlegt, an irgendeiner Stelle im Arry abgelegt und dann werden 
irgendwelche Variablen beeinflusst, womit man wohl erreichen will daß 
der nächste Teil des Sttings woanders hin kommt.

Nein, da ist so viel dermassen durcheinander und erkennbar ohne PLan 
zusammenkopiert, man kann dir nicht die gesamten fehlenden 
Programmierkenntnisse beibringen. Frag einen, der das kann.

Man wird sicher nicht einen unendlich langen Strong einlesen.
Man wird sicher nicht in einem unsortierten Array nach einer 
Übereinstimmung des Anfangs suchen.
Man wird sicher nicht per strtok in undefiniert lange Abschnitte 
zerlegte Strings in möglicherweise zu kurze Array schreiben.
Man tut sich auch keinen Gefallen, ein Format zu erwarten aber nicht mal 
ansatzweise zu prüfen, ob die Daten das Format haben. Und wenn man es 
analysiert hat, braucht man keine Strings mehr zu vergleichen, sondern 
z.B. 6 Bytes.
Und ein sprintf zu verwenden, um einen String zu kopieren, ist ein 
deutliches Zeichen mangelnder Kompetenz.

> UB_Uart_ReceiveString(

Hmm, wenn das die Funktion ist
http://mikrocontroller.bplaced.net/wordpress/?page_id=2838
ist die auch saumässig schlecht definiert.

Kommt 50 Zeichen lang kein CarriageReturn wird einfach der Speicher 
überschrieben.

Vergiss die vorgefertige Library. Die ist so schlecht wie dein Code. 
Frag also auch nicht deren Ersteller ob er dir hilft.

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.