www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Codevergleichen


Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin daran mti C ein Codeschloss zu programmieren. leider habe ich 
keine gute idee, wie ich den Code der in einem Feld (datentyp umsigned 
char) gespeichert ist mit dem Code der eingegeben wird verglichen werden 
kann.

die funktion, die ich geschrieben taugt nichts:

for(z=0;z<20;z++)                 // Feldlänge 20
{

  if(Zahl[z]!=Code[z])
  {
  Fehler=1;
  break;
  }
}

da jedes feld mit null initialisiert ist, würde der eingegebene Code 
auch stimmen, wenn man gar nichts eingeben würde.

meine idee wäre das:

for(c=0;c<=20;c++)

{
if(Feld[c]==0)
break;
}

da die Ziffer null als 10 abgespeichert wird, wüsste man, wieviele 
stellen man eingegeben hätte und könnte überprüfen, ob man gleichviele 
stellen eingegeben hätte wie abgespeichert wären.

Kennt jemand vielleicht eine besser funktion?

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, so fit bin ich auch noch nicht, aber schau dir mal memcmp an, da 
kann man, wenn ich das richtig verstanden hab zwei Zeiger übergeben und 
die dann vergleichen.

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube diese Funktion gibt es nur in C++

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...dann prüf halt ob vorher ein Code eingegeben (sprich: ein paar Tasten 
gedrückt) wurde. Du kannst aber dein Array auch vor der Codeeingabe 
selbst initialisieren (sinnvollerweise mit Werten, die nicht deinem Code 
entsprechen).

Gruß,
Magnetus

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann müsste ich aber beide felder mit demselben wert initialisieren, und 
hätte das selbe problem.

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das eine Feld ist ja die Vorgabe auf die vergleihcen wird, hier 
initialisierst du mit dem Wert den du als schlüssel benutzen willst.

Das zweite Feld ist der eingebenen Code.
Diese Feld füllst du mit den Tasteneingaben und zählst dabei die Ziffern 
mit.
Nur dann wenn die geforderte Anzahl an Ziffern eingegeben ist, springst 
du zum Vergleich der beiden Felder.
Sind beide Felde gleich, so ist der richtige Code eingegeben.

Zum Vergleichen kannst die einfache For Schleife aus deinem ersten 
Posting verwenden.

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also memcpy gibts auch für C, aber ob das deine Funktion erfüllt weiß 
ich nich. Liegt in der string.h gibts auch als strcpy.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also entweder initialisierst Du die Felder unterschielich, so dass 
unbenutzte Elemente nicht als gleich erkannt werden

oder Du zählst bei der Eingabe mit, oder versuchst sonst wie 
rauszukriegen, wie lang der Code ist, und dann vergleichst Du nur die 
echte Länge.

Guck mal, wie strings abgespeichert sind: Entweder das erste Element 
enthält die Länge (wie in Pascal) oder hinter dem letzten Element kommt 
eine NUL, die in gültigen Strings nicht vorkommen darf. Kannst ja Dein 
Feld wie einen string organisieren, dann ist es einfach, die Länge 
rauszukriegen.

Autor: Michael K. (mmike)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Beispiel mit nem 10er array:

uint8_t Code[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
uint8_t InputBuffer[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Jetzt schiebst Du bei jedem Tastendruck den gedrückten Wert in den 
InputBuffer und shiftest die Anderen Werte immer um eins nach rechts

also wenn Taste gedrückt:

for (i = 9; i > 0; i--)
  InputBuffer[i + 1] = InputBuffer[i];
InputBuffer[0] = "Gedrückte Taste";

Und dann vergleichst Du einfach die beiden Arrays Elementweise. Wenn Sie 
gleich sind ist der Code richtig eingegeben worden .....

Grüße,
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.