Programm für Schlüsselmaschiene

Hallo Freunde, ich muss mich einmal wieder melden, da ich ein Problem habe. Meine Frau arbeitet in einer Fa. die Schliessanlagen für Vorhängeschlösser erstellt. Da die Schlüssel der Schliessanlagen alle über Schlüsselnummern die errechnet werden müssen erstellt werden, versuche ich mich daran ein Programm in Processing zu schreiben, welches die Nummern der Schlüssel bei Vorgabe von der Nummer des Hauptschlüssels über den PC errechnet. Vielleicht kennt sich ja wer aus mit Processing und kann mir helfen. Soweit habe ich alles fertig. Die 5 Stelligen Zahlen womit gerechnet wird habe ich in einer Textdatei, die von Processing geladen wird und woraus dann ein Arrey erstellt wird. Die Nummer des Hauptschlüssels ist auch eine bekannte 5 Stellige Zahl. Die Nummer des Hauptschlüssels wird über die Tastatur eingegeben und ist ein Arrey z.B. a=1 b=2 c=3 d=4 e=f jetzt kommt die 5 Stellige Zahl aus dem geladenen Arrey womit gerechnet wird dazu z.B. h[0] = 56453 , ich müsste jetzt die 5 stellige Zahl splitten in 5 einzelne Zahlen z.B. a1[0] = 5 a1[1] = 6 a1[2] = 4 u.s.w. gibt bes in C++ eine funktion womit ich das bewerkstelligen kann ? Ich finde nichts im Netz, nur über Strings :frowning:

hi,

ist wahrscheinlich nicht das kürzeste, aber Du könntest
56453 ganzzahlig durch 10000 teilen, dann hast Du 5. von 56453 510000 abziehen, ergebnis 6453.
6453 ganzzahlig durch 1000 teilen, dann hast Du 6. von 6453 6
1000 abziehen usw.
in einer for-schleife kannst Du das in zwei zeilen abarbeiten...
gruß stefan

Danke Stefan für die schnelle Antwort. aber das ist die Zahl die ja schon gesplittet ist. es geht um die 5 stelligen Zahlen die ich hochlade in ein Arrey, die Wechseln nach jeder Berechnung . Das ist ein Arrey mit 16* 5 stelligen Zahlen die aufgesplittet werden sollen.

Sorry, ist natürlich etwas Blöde beschrieben sehe ich gerade die Zahl 56453 ist die über die tastatur eingegebene Hauptschlüssel Zahl, was gesplittet werden müsste sind die 5 Stelligen Zahlen aus dem Arrey z.B. 11212,11122,11221 u.s.w. insgesamt 32 Zahlen aufgeteilt auf 2 Arreys also 2 Arreys a. 16 Zahlen.

hi,

ich meinte so:

long a[3] = {11212,11122,11221};
byte a1[5];

void setup() {
  Serial.begin(9600); 
}

void loop() {
  for(byte m = 0; m < 3; m++) {
    long dummy = a[m];
    for(byte n = 0; n < 5; n++) {
      a1[n] = dummy / pow (10, (4 - n));
      dummy = dummy - (a1[n] * pow (10, (4 - n)));
      Serial.println(a1[n]);
      delay(1000);
    }
    Serial.println();    
  }
}

ich schreibe jetzt das ergebnis in ein 5er-array. Du kannst ja was anderes damit machen...

gruß stefan

Am einfachsten macht man das mit Division und Modulo (Rest einer Division)

1234 % 10 = 4
1234 / 10 = 123
123 % 10 = 3
123 / 10 = 12
12 % 10 = 2
12 / 10 = 1
1 % 10 = 1

Das kann man in einer do-until Schleife machen bis / 10 Null ergibt. Oder hier auch einfach 5 mal da man die Anzahl der Stellen kennt.

hi,

@serenifly: daran hätt' ich auch denken können, hab's ja selber schon so gemacht...

andererseits:

a1[n] = dummy / pow (10, (4 - n));
dummy = dummy - (a1[n] * pow (10, (4 - n)));

sieht eindrucksvoller aus.

gruß stefan

eindrucksvoller

findest du?

Mir sagt das nur, dass es schon schlimm ist, was für Schrott die Leute *) als gute Tips von sich geben.

Wenn du wenigstens das Ergebnis von pow() als long gecastet hättest, hätte ich eventuell geglaubt, dass du dir was dabei gedacht hast...

Mir sieht es eher so aus, als ob
long a[3] = {11212,11122,11221};
eigentlich gar keine Dezimalzahlen wären. (Schlüsselcodierung, @Malerlein ?)

Jurs sagt zu Recht: Erstmal eine Vernünftige Datenstruktur.

Natürlich kann man auch ein paar Bit verschwenden, aber als Alternative zum Splitten von Texten wäre auch eine Behandlung als hex-Zahlen hübsch:

long a[3] = {0x11212, 0x11122, 0x11221};

void setup() {
  Serial.begin(9600);
}

void loop() {
  byte a1[5];
  for(byte m = 0; m < 3; m++) {
    long dummy = a[m];
    for(char n = 4; n >=0 ; n--) {
      a1[n] = dummy & 0x0f;
      dummy = dummy >> 4;
    }
    for (byte n = 0; n < 5; n++) {
     Serial.print(a1[n]); Serial.write(' ');
    }
    Serial.println(); 
    delay (500);  
  }
  delay(1000); 
}

*) Und eigentlich doch ganz vernünftige Leute :wink:

hi,

da ist wohl jemand mit dem falschen fuß aufgestenden... :o

stimmt, den teil mit pow hätte ich casten sollen, das ist bei höheren zaheln eine falle.
aber was meinst Du mit:

Mir sieht es eher so aus, als ob
long a[3] = {11212,11122,11221};
eigentlich gar keine Dezimalzahlen wären.

?

stefan

pow() ist gedacht um ( 3.14519 ^ -2.5 ) zu rechnen, wofür auch immer sowas gut sein soll.
Aber doch nicht, um eine 10 oder 100 zu erzeugen, tss, tss, tss.

aber was meinst Du mit: "eigentlich keine Dezimalzahlen"

Das Stichwort "Schlüsselmachine" und das auffällige Ziffernmuster aus 1 und 2 hat mich raten lassen, dess es sich evtl um die Codierung eines Schlüssels handelt, der evtl. 5 Stifte bewegt, aber sicher nicht jeden Stift in 10 möglichen Positionen.

Eine Dezimalzahl wie 12112 ist also das gleiche wie "ABAAB" und könnte ( falls es nur A und B gäbe )
auch in einem Byte als B1001 abgelegt werden,
statt ein long (ein int ginge übrigens auch)
oder einen String zu verschwenden.

Da durch 10 zu dividieren, für einen Controller höhere Mathematik darstellt, ist die Dezimalzahl
12112 die in Wirklichkeit ( :wink: ) als 00002F50 im Prozessor liegt, eventuell eine suboptimale Art der Speicherung des Schlüsselcodes.

Das meinte ich damit.


Aber nachdem ich mich jetzt eh schon reingehängt habe mit meinem Gemecker, hab ich mir auch den Anfang nochmal genauer angeschaut.
Dass es nur 1er und 2er gibt, war falsch geraten, aber mit dem unnötigen "Problem des Splittens einer fünfstelligen Zahl" denke ich weiter, dass da nach der Lösung eines Problems gefragt wird, das gar kein Problem sein sollte.

Ist mir zwar unklar, was es mit dem Hauptschlüssel auf sich hat, jedenfalls es geht um eine Textdatei, in der so etwas wie " 56453 " drinsteht. Daraus soll dann ein Array wie byte a1[5] = {5,6,4,5,3}; werden.

Kann man natürlich mit dem Umweg über long a = 56453; machen, ist aber immer ein Umweg.
Das Einlesen in eine Dezimalzahl ist versteckt, aber Teil 1 des Umwegs. Mehrfaches /10 dividieren und Rest ist dann der Rück-Umweg, wo doch eigentlich nur aus dem Buchstaben '5' eine 5 gemacht werden soll. ( z.B. indem man '0' (=48 =0x30 )subtrahiert, oder die Maske & 0x0F drüberlegt. )

hi,

ein tss, tss, tss halte ich für übertrieben. klar kann man damit 3.14519 ^ -2.5 berechnen, aber ich kenne keine konvention, die es verbietet, damit gemütlich zehnerpotenzen in einer zählschleife zu erzeugen.

egal, jeder kann seine eigene meinung haben.

gruß stefan

Zitat: "Das Stichwort "Schlüsselmachine" und das auffällige Ziffernmuster aus 1 und 2 hat mich raten lassen, dess es sich evtl um die Codierung eines Schlüssels handelt, der evtl. 5 Stifte bewegt, aber sicher nicht jeden Stift in 10 möglichen Positionen."

Nein Michael, die Codierung geht nur über 9 Ziffern und ja Du hast recht sie geht nicht über alle Positionen der Stifte im Schloss sondern das sind Schlüssel für Schliessanlagen aber für Vorhängeschlösser. Es geht darum wenn ein Kunde Schlüssel nachbestellt , dann Gibt er die Codierung des Hauptschlüssels an z.B. die angegebene Zahl: 56453 die ich ja dann von Hand eingebe , sie liegt dann in einem Arrey mit 5 Feldern also {5,6,4,5,3} Ich habe eine Liste womit dann gerechnet wird. das sind je 16 Zahlen wie 11212, 11122 u.s.w. die lade ich von einer Textdatei in Processing in ein Arrey mit 16 Feldern, die wiederum müssen gesplittet werden in einem Arrey mit 5 Felder und das 16x. Processing vergleicht dann in den einzelnen Positionen und Zählt Hoch z.B. Hauptschlüssel pos[4] plus pos1[4] von der zu rechnenden Zahl und das in 2er Schritten so das die 9 nicht überschritten wird dann passiert das selbe mit pos[3] plus pos1[3] u.s.w. daraus errechnet sich die Anzahl der Schlüssel die man erstellen kann mit der einzelnen Codierung. Zum Schluss wird nur noch eingeteilt Welche Codierung für was ist, so das der Hauptschlüssel für alle Schlösser ist und die anderen werden so aufgeteilt, das sie nur für bestimmte Schlösser zum schliessen gehen. Ich habe es gelöst mit dem Splitten, in der Art wie Stefan es geschrieben hat, mit Modulo (Rest einer Division). Das war die einfachste Lösung alles andere sind ja nur noch die Abfragen......

Wenn du da sowieso schon einen String hast, kannst du auch einfach über den String iterieren und jeden Buchstaben in eine Zahl wandeln. Also von ASCII nach Dezimal.