C: Problem mit Array-Muster-Vergleich

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

C: Problem mit Array-Muster-Vergleich

Beitragvon HaWe » 7. Mai 2015 16:37

hi,
ich habe momentan eine Ladehemmung für den richtigen Programmier-Ansatz.

Problem:
ich habe eine Reihe von (p) Muster-Arrays mit je (i) ints, z.B. stark reduziert:
a[1][3]
a[2][3]
a[3][3]
a[4][3]
a[5][3]

und einen aktuellen array
c[3]

ich will nun gucken, in welchem der 5 Muster genau dieselben ints in jeder Zelle sind wie im aktuellen, also
if ( (a[1][1]==c[1]) && (a[1][2]==c[2]) && (a[1][3]==c[3]) ) {match=1;}
else
if ( (a[2][1]==c[1]) && (a[2][2]==c[2]) && (a[2][3]==c[3]) ) {match=2;}
else
if ( (a[3][1]==c[1]) && (a[3][2]==c[2]) && (a[3][3]==c[3]) ) {match=3;}
// usw...
else
match=-1; // kein Treffer!

das geht ja noch.

Aber jetzt habe ich eine variable Anzahl von Mustern (ändert sich während der Laufzeit) mit einer konstanten Anzahl von ints pro Zeile (ändert sich zur Kompilierungszeit). Daher kann ich jetzt nicht alle Werte einzeln per && hintereinanderschreiben,
außerdem wird das ein bisschen viel bei ~100 Mustern zu je ~20 int Werten.

Wie kann man das jetzt in eine Schleife packen???
:roll:



Code: Alles auswählen

int16_t  CheckInputPatterns() {
   int16_t   match=-1;  // -1 == no match
   int16_t   p,i;
/* 
   for( p = 1 ; p <= NumPattern ; p++) {  //  nimm p-tes Muster an Input-Besetzung, eins nach dem anderen
      for( i = 1 ; i <= NumInput ; i++) {  //  wenn alle Inputs völlig identisch besetzt sind
         if (Input[p][i] ) == currIn[i]) && ... {  // für alle Inputs von 1 bis NumInput: wenn alle Zellen übereinstimmen:
           match=p; break;   
           // speichere die Nummer des Musters, dann => fertig !
           //...
           // aber wie weiter mit den && bei unbekannter Länge, iterativ geschrieben ??
         }
      }
   }
*/
   return match;
}
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Peter28
Schreibt viel
Schreibt viel
Beiträge: 185
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: C: Problem mit Array-Muster-Vergleich

Beitragvon Peter28 » 7. Mai 2015 18:07

Ich würde nicht das=dem + das=jenem +dieses=usw. verhackstückeln, sondern folgendes versuchen: wenn ich den Wert der Aussage (a=b)*1 mit a=2 und b=3 auswerte, kommt bei Excel zB. -1 raus. Kann in anderen Programmiersprachen auch 0 sein. Ist a tatsächlich =b, kommt 1 raus. Habe ich jetzt z Paare zu vergleichen, ginge folgender Ansatz
wert=0
for i=1 to z
wert=wert+(a+b)*1 --- für jedes richtige Paar erhöht sich wert um 1
endfor
if wert=z then ---ist alles gut und alle Paare stimmen überein
Damit wäre es sch... egal, wieviel Wertepaare miteinander verglichen werden müssen.
Falls ich von der Problemstellung her daneben liege, kannst Du den Beitrag = löschen.
Peter

Benutzeravatar
Ziz
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 36
Registriert: 16. Apr 2015 17:45
Kontaktdaten:

Re: C: Problem mit Array-Muster-Vergleich

Beitragvon Ziz » 7. Mai 2015 18:20

Hi,

Mach es doch so: Iterier über die Elemente eines Musters und wenn es mal keine Übereinstimmung gibt, dann breaks du.
Nach der Schleife schaust du, ob deine Laufvariable == NumInput + 1. Wenn ja: Match. Wenn Nein: Weitermachen. ;) In deinem Code sähe das so aus:

Code: Alles auswählen

int16_t  CheckInputPatterns() {
   int16_t   match=-1;  // -1 == no match
   int16_t   p,i;
/*
   for( p = 1 ; p <= NumPattern ; p++) {  //  nimm p-tes Muster an Input-Besetzung, eins nach dem anderen
      for( i = 1 ; i <= NumInput ; i++) {  //  wenn alle Inputs völlig identisch besetzt sind
         if (Input[p][i] ) != currIn[i]))  // Stimmt eines nicht? Raus!
           break;
         if (i == NumInput +1 ) { //break wurde nicht ausgeführt, also match
           match = p;
           break;
         }
      }
   }
*/
   return match;
}

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5288
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: C: Problem mit Array-Muster-Vergleich

Beitragvon HaWe » 7. Mai 2015 18:21

danke, ich hab jetzt diesen Tipp bekommen, aber noch nicht getestet:

Code: Alles auswählen

int16_t  CheckInputPatterns() {
   for( int16_t p = 0 ; p < NumPattern ; p++) { 
      for( int16_t i = 0 ; i < NumInput && Input[p][i]  == currIn[i]; i++);
      if(i== NumInput) return p;
   }
   return -1;
}


mal gucken, welcher schneller zum Ziel führt !

danke aber auf jeden Fall!
:)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
Ziz
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 36
Registriert: 16. Apr 2015 17:45
Kontaktdaten:

Re: C: Problem mit Array-Muster-Vergleich

Beitragvon Ziz » 7. Mai 2015 18:40

Ja stimmt, man kann natürlich auch gleich returnen. Das ist noch fixer. ;)


Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss