Array Problem - Allgemeines Problem mit if in Verbindung von einem A-Sensor

Push !

ich hatte Dir schon geantwortet.

Ich kann nun aber schon Striche und Punkte gesondert voneinander erkennen mit meiner Methode

Was jetz fehlt ist die Speicherung des wertes, worauf du mir noch nicht geantwortet hattest.

Da war ja eben die Idee eines Arrays jedoch kann ich nur bestimmte längen eingeben..

MfG

mrlowalowa:
Ich kann nun aber schon Striche und Punkte gesondert voneinander erkennen mit meiner Methode

Glückwunsch. Auch die Pausen zwischen zwei Buchstaben ?

Was jetz fehlt ist die Speicherung des wertes, worauf du mir noch nicht geantwortet hattest.
Da war ja eben die Idee eines Arrays jedoch kann ich nur bestimmte längen eingeben..

Das stimmt, der RAM des Arduino ist begrenzt.
Wie lange soll der Arduino laufen? Warum speichern, wenn du's schon zum PC übertragen hast?
Edit : Sorry, hab dein ersten Post nicht sorgfältig genug gelesen.
Fehlt ja noch die Erkennung der Morsezeichen.
Aber dafür reicht doch ein Array von 5 (?) Byte, oder so.
Schwieriger ist vermutlich das dekodieren.

Was hältst du davon: Punkt ist 0, Strich ist 1, und jedes Zeichen fängt mit einer 1 an, damit man die Länge erkennt.
Das ganze wird in ein Byte geshiftet, und daraus ein Zeiger auf die Ergebnistabelle gemacht

e = . = 0b00010  = 2
t = - = 0b00011  = 3
i = .. = 0b00100  = 4
a = .- = 0b00101  = 5

usw.

Das ist nicht speicheroptimiert, aber 64 byte solltest du haben.

//                           0    1    2    3    4    5     ...                                   
const char morsetable[] = { '?', '?', 'e', 't', 'i', 'a' ,  // ... usw   
};

Die Pause hat mich nun gereitzt :roll_eyes:

Habe nun die drei Pausen Typen eingebaut und auch Erkennung wann das ganze anfängt und wieder aufhört.

Hab auch jeweils was in die Kommies zur Erklärung dazugeschrieben.

int count = 0;
int sensor = A0;
int i;
int c;
int pause;
int start_pause;
int count_p;

//int array[];

void setup(){          // initialisierung meiner int's
  Serial.begin(9600);
  i = 0;
  c = 0;
  pause = 0;
  start_pause = 0;
  count_p = 0;
}

void loop() {
  
  int sensorValue = analogRead(sensor); // Abfragen des Fototransistors
  
  if(sensorValue <= 100){               // Wenn kein Licht bzw Steulicht von Raum etc
    count = 0;
    if (start_pause == 1){              // Beginnt erst, wenn schon einmal Licht war
      if (pause == 0){                  // Wenn Pause zurückgesetz wurde, dann mitzählen
        count_p = 0;
      }
      pause = pause + 1;                
      count_p = count_p + 1;            // Kann das eventuell rausgelassen werden? nur für letzte funktion   
    }
    
  }
  
  if (sensorValue >= 100){
    i = i + 1;
    count = count + 1;
    start_pause = 1;
   
  }
  if (i > 3 && count == 0){
     // array[c] = "-";
     c = c + 1;
     i = 0;
     pause = 0;
     Serial.println ("Strich");
   } 
   if (i == 3 && count == 0){
     // array[c] = ".";
     c = c + 1;  
     i = 0;
     pause = 0;
     Serial.println ("Punkt");
    }
    
   if (i == 1 && pause == 3 && start_pause == 1){
     pause = 0;
     Serial.println("Pause Buchstabe");            // Zwischen jedem Buchstaben ist eine Punkt länge Pause
   }
   if (i == 1 && pause == 6 && start_pause == 1){
     pause = 0;
     Serial.println("Pause Wort");                // Zwischen jedem Wort sind zwei Punkte bzw ein Strich Pause
   }
   if (i == 1 && pause == 9 && start_pause == 1){
     pause = 0;
     Serial.println("Pause Satz");                // Zwischen jedem Satz sind 3 Punkt-längen Pause
   }
  
   if (count_p >= 10){
     start_pause = 0;                          // Damit keine unnötigen Pausen gezählt werden
     count_p = 0;                              // Zurücksetzten
     
     Serial.println ("Übertragung Abgeschlossen"); // Könnte dem Array / Plotter sagen: jetz umwandeln
   }
  
  delay(100);                        // Fragt nur alle 100 ms den Wert am Sensor ab
  
}

Die jetzigen Serial.println sind nur zum Testen da, damit man sieht, dass was ankommt.

Ich find die Idee super! :slight_smile: :slight_smile:

Nach deinem Prinzip müsste dann das hier stimmen: (Zwecks Verständniss)

u = ..- = 0b01001
q = --.- = 0b11101

ß = ...--.. = 0b10001100 (Das würde jetz aber den Ramen von max 4 Zeichen sprengen, wegen Sonderzeichen)

Das ß könnte man aber auch erstmal auslassen ^^ Das sind Träumereien aber cool wäre es schon.

Habe übrigens 32.256 Bytes Platz, also könnte man sich da ruhig austoben :wink:

Das Problem ist dann aber immernoch die Speicherung?

Achsoooo... ich kann die Dann ja alle hintereinander in einer Line im Serial Port ausgeben lassen und dann bei neuer eingabe in die nächste Zeile springen. :slight_smile: Jetz kapiere ich auch deine aussagen vor dem Edit.

Wie erzeugt man bei Arduino Object C einen Pointer? Hab die bisher nur beim iPhone gemacht..

Momentan spielt sich bei mir alles im void loop() ab, dafür will ich ja aber eine weitere "Funktion" oder sehe ich das falsch?

Schon mal danke für den Super Tipp!! :slight_smile: :slight_smile:

Dein Verständnis ist richtig.
Glaube nicht dass Samuel Morse ein 'ß' gekannt hat. (Edit: bzw sowas exotisches übertragen wollte) Kommt noch nicht mal in ASCII vor.

Wie erzeugt man bei Arduino Object C einen Pointer? Hab die bisher nur beim iPhone gemacht..

Weiss nicht was das mit "Object" zu tun hat. Pointer sind was ganz normales bei c.
Brauchst du aber noch nicht mal.
Wenn du deine Morsesignale entschlüsselt hast und z.B.

byte x = 0b1001;  // wir haben "..- " empfangen und das Zeichen ist fertig
char z = morsetable[x]; // der Inhalt von morsetable[17] ( 'u' ) ist jetzt in z
Serial.print(z);

Mit Pointern sähe das so aus

char* zp = morsetable+x;
Serial.print( *zp );

Edit: P.S.

Habe übrigens 32.256 Bytes Platz, also könnte man sich da ruhig austoben

Z.Zt. liegt eine Kopie der morsetable im RAM, und der ist beim UNO nur 2k gross.
Da die Tabelle konstant ist, könntest du sie auch aus dem Flash-Speicher lesen ( PROGMEM ), aber wenn's auch so geht, warum ?

Ich versteh nicht, was du auf dem Arduino speichern willst:
Nach der Zeichen-Pause kannst du ein Zeichen dekodieren und ausgeben.
Bei der Wort-Pause gibst du ein extra Leerzeichen aus.
Bei der Satz-Pause gibst du ein extra Newline ( '\n' )
Nach 10 Pausen Ruhe ( oder eher deutlich später ) kommt "Übertragung beendet".
Arduino hat und braucht hierfür kaum Speicher.

Hallo,
hab mir mal eine Idee mit millis() ausgedacht (aber nicht getestet):

unsigned long time;
int sensor = A0,
    sensorValue = 0;
byte signal = 0,  // Signal ja/nein
     wert = 0;    // 0= Pause   1= Kurz   2= Lang   3= Zeilenwechsel

void setup()
{
  Serial.begin(9600);
  // time = millis();
}

void loop()
{
  if ( signal == 0 && analogRead(sensor) > 100)
  { 
    signal = 1;
    time = millis();
    while ( analogRead(sensor) > 100)
    {}
    if ( millis() - time >= 2000 )  // Pause 2 sec -> Zeilenumbruch
    { wert = 3; } // Zeilenumbruch
    else
    { wert = 0; } // Pause
  }
  if ( signal == 1 && analogRead(sensor)  <= 100)
  { 
    signal = 0;
    time = millis();
    while ( analogRead(sensor) <= 100)
    {}
    if ( millis() - time > 300 )
    { wert = 2; } // Lang
    else
    { wert = 1; } // Kurz
  }

Damit kannst Du die Zeitspannen exakt bestimmen.
Vielleicht hilfts Dir ja ein bischen....

Gruß
Reinhard

.... einen hab ich noch..... :wink:
Eigentlich sind bei analogRead<=100 3 Zustände vonnöten:
<300 Zeitspanne zwischen einem Piep und dem nächsten
300-2000 Leerstelle, löst gleichzeitig einen Abgleich der letzten Signale mit dem Zeichen-Array aus. Ausgabe des Zeichens mit Serial print

2000 Zeilenumbruch

Gruß
Reinhard

@michael_x:

Da geb ich dir Recht :smiley: Wäre nur schön gewesen, da ich ein solches Zeichen in meinem Name trage und das dann noch ne Spur eindrucksvoller wirken würde :stuck_out_tongue: (ist aber wie gesagt nur eine Spielerei :wink: )

Das Object kommt eben vom iPhone App programmieren. Aber mir ist auch gerade aufgefallen, dass ich gar nicht mit Objekten zu tun habe (sprich [blablalba] ).

michael_x:
Ich versteh nicht, was du auf dem Arduino speichern willst:
Nach der Zeichen-Pause kannst du ein Zeichen dekodieren und ausgeben.
Bei der Wort-Pause gibst du ein extra Leerzeichen aus.
Bei der Satz-Pause gibst du ein extra Newline ( '\n' )
Nach 10 Pausen Ruhe ( oder eher deutlich später ) kommt "Übertragung beendet".
Arduino hat und braucht hierfür kaum Speicher.

Was ich Speicher will ist das was du auch vergessen hast oder ich den vielleicht selbstverständlichen Weg nicht weiß.

Um die Zeichenfolge " . . - " entschlüsseln zu können musst du die Zeichenfolge erst einmal Speichern bzw zusammen schieben.

Das stelle ich mir nun aber eher "einfach" vor. Man könnte einen Array mit 4 bzw 3 (wegen der 0 Speicherfläche ?? ) erzeugen und mit 0 o.ä. füllen. Wenn jetz ein Punkt kommt den Platz mit 1 vollschreiben und bei Strich eben mit 2. Um dann etwas zusammen geschobenes auszugeben lässt man die Nullen eben "fallen" und schreibt den Array dann wieder mit Nullen voll damit kein Fehler für die nächsten Zeichen übrig bleibt.

@spaceball:

Danke für deine Überlegungen! Die werde ich auch mal ausprobieren! :wink:
int sensorValue hast du anscheinend initialisiert aber nie gebraucht und kann deshalb weggelassen werden?

millis() - time verstehe ich auch nicht so ganz vom Prinzip her. Dachte time = millis() .

Das wäre ja dann das gleiche wie " x - x " und das ist immer null.

Von daher müsste man 2 unterschiedliche Zeiteinheiten parralel laufen lassen und deren Differenz würde dann dem hier entsprechen oder sehe ich das falsch?

Ich frage mich nur wann dann die andere Zeit einheit anfagen soll. Da man dann aufgrund der schon gelieferten Zeichensätze zusätzlich Zeit mit einberechnen müsste, welche ja variieren und daher meinen Ausgaben am Schluss noch ein verbrauch_time = XY machen müsste abhängig von den punkten und Strichen.

Danke auf jedenfall schon mal euch beiden für eure Super Unterstützung!!!! :slight_smile: :slight_smile: :slight_smile:

Gruß
Flo

millis() liefert die Anzahl der Millisekunden zurück, die seit dem starten des Arduino vergangen sind. Daher ändert sich der Wert ständig.
Mit time = millis() merkst Du dir den aktuellen Wert. Mit millis() - time bekommst Du die Millisekunden, die seit dem Merken vergangen sind.

Hallo mrlowalowa,
tja, das sensorValue ist wirklich umsonst. Hatte ich am Anfang anstatt "signal" gedacht.

time= millis();
damit nehme ich den aktuellen Wert der hochgezählten Zeitvariablen ( wie von MaFu beschrieben... Danke! ).
Dann warte ich mit der while-Schleife solange, bis sich der Sensorzustand von Licht zu Dunkel oder umgekehrt ändert und lese dann noch mal die Zeítvariable aus.
Nun ergibt die Differenz die Länge des Signals: entweder des Lichtsignals oder der Pause!
Somit kann ich auch gleich zwischen Kurz oder Lang und zwischen Leerzeichen, Zeilenumbruch und "Signalzwischenraum" unterscheiden.

Natürlich bleibt das Programm in der while-Schleife hängen, solange sich der Sensorzustand nicht ändert.
Dies sollte aber in Deinem Fall kein Problem darstellen.

Wegen dem Array:
Wenn ich meinem Beispiel folge, würde die 0 den Vergleich starten, der die gespeicherte Signalfolge mit der in einem mehrzeiligen 2D-Array gespeicherten Buchstabentabelle abgleicht und darin den entsprechenden Eintrag ermittelt.
Das Array müßte Byte entsprechen, da es 2 Signal-Zustände gibt (Kurz und Lang) und eben noch den "da kommt nichts mehr Zustand" (Array-Wert = z.B. 255 oder auch 0 ...), falls die Morsetabelle nur ein kurzes Piep verlangt...

Gruß
Reinhard

PS.: Ich entschuldige mich im Voraus, falls meine grauen Zellen meine Überlegungen etwas verwirrend formuliert haben sollten, aber um 1:40 Uhr und nach mehreren Geburtstagsfeierbierchen läufts einfach nicht mehr ganz so rund....
XD

Du hast Geburtstag und sagst mir nichts?
Alles Gute!

nene! Das dauert noch ein paar Monate.
Bin nur Opfer.
Aber was tut man nicht alles für seine Freunde! :smiley:

Jetz komm ich dahinter, danke euch zwein!

Ist viel produktiver, da ich nicht immer genau dort anfange zu morsen wenn ich nur alle 100ms den Wert abfrage. Da variiert der Punkt dann immer zwischen 1 und 3...

Werde das nun mal versuchen einzubauen.

Ich habe jetz noch 2 Probleme mit dem iPhone. Zum einen wird das erste Zeichen immer nur als minimalsten blitz ausgegeben (da die LED am iPhone auch erst warm werden / hochfahren etc muss ^^)

Daher würde ich vorschlagen, dass ein anfangs signal von so 1 sec als Start auch gehen würde. Damit wird dann die LED auf betriebstemperatur gebracht und der Arduino ist sich auch sicher, dass es jetz losgeht. Die jetzigen Methoden sind ja darauf aufgebaut, dass bei einem ersten Signal es dann auch schon losgeht, aber was macht der Aruino wenn jetz über 1 sec eingestrahlt wird und danach einfach nichts kommt? Gibt es für solche fälle dann Probleme oder gibt er einfach nur nichts aus?

Ich fände es so also praktisch wenn man am anfang und ende Start / End leuchten machen würde was so eine sec aufwärts sein könnte.

Das Zweite Problem ist, dass mein Programm von . auf - zicken macht und der Punkt dem Strich anscheinend etwas Zeit klaut und somit ein Punkt mit doppelter Pause und einem Punkt daraus entsteht. Wieso auch immer.. Das muss ich noch rausfinden. Denke es ist sinnvoller meine iPhone APP dementsprechend anzupassen als jetz den Arduino auf diesen Fehler anzupassen.

Mit "gespeicherter Zeichenfolge" meinst du dann meine Speichermethode mit dem Array und 4 Nullen??

Was meinst du mit "Das Array müsste Byte entsprechen" ??

Und die Morsetabelle sollte nichts verlangen, die sollte nur passiv aggieren und nicht aktiv oder hab ich da nen denk fehler?

Gruß
Flo

So iPhone App läuft jetz stabil mit folgenden werten: ein Punkt 0.5, eine Pause (zwischen Zeichen) 0.5 , ein Strich 1,5 und zwischen Wörtern auch 1,5 Pause (alles in Sekunden Angabe)

Da mach ich am besten alles was über 450 ms usw ist, da ich wahrscheinlich nicht in die bedingung " == 500 " schreiben kann was den äußeren Umständen echt weng hoch angerechnet währe wenn der exakt 500 messen würde :smiley:

Jedenfalls hab ich noch eine Idee zum speichern der Werte:

Wir haben ja schon Byte x = 0b10101 = .-.- = Buchstabe (das ist die Methode von Michael_x)

Könnte man es nicht einfach so machen, dass man byte x = 0b1 initialisiert und dann bei wert 1 eine 0 hinten dran hängt und bei wert 2 eben eine 1.

Sprich sowas

x = x "+ 1" bzw "+ 0";

Nur will ich nicht den wert um eines erhöhen sondern hinten dran hängen. Das wird mit einem normalen Plus auf diese Weise nicht funktionieren ^^

Hab mich mal zu 2D Arrays kurz schlau gemacht, aber noch ein bis 2 fragen:

Am anfang muss man einen Datatype angeben, jedoch wird in den Zwei Ebenen ja jeweils ein anderer datatype verwendet (int bzw byte und char (für die buchstaben) )

Wie muss ich den dann definieren? Und in die erste Ebene schreibe ich dann meine Byte stränge rein. Nur werden dann bei zum beispiel bei dem buchstaben "e" der Byte strang so aussehen : x = 0b10 ;

Das kommt dann in meine morsetabelle und wird am besten gleich so ausgegeben (??):

byte x = 0b1;
if (wert == 1){     // steht für punkt aus spaceball's idee zu den millis()
   x = x "+ 0";      // hinten dran hängen
}
Serial.print(morsetable[x]);

So sollte das Prinzip ausschauen:

Bei kurzen pausen wird einfach hochgezählt und eventuell bei über 4 ein Fehler ausgegeben.
Bei dreifacher Pause (nächstes Wort) Wird ein Befehl gegeben den Byte strang auszuwerten und zu Printen.
und bei Fünffacherpause wird eine neue Zeile Begonnen bzw Die Übertragung beendet, falls es über 4 sec lang sein sollte

Bräuchte jetz erstmal nur die Sache mit den Bytes und wie ob das so mit dem 2D Array funktioniert wie ich es in meinem kleinen Sample versucht habe zu veranschaulichen. :slight_smile:

Gruß
Flo

EDIT:

mein 2D Array schaut nun so aus: bei DIM_0_SIZE und DIM_1_SIZE wird wahrscheinlich die länge des Alphabets rein gehören? (--> 26)

byte char array [DIM_0_SIZE] [DIM_1_SIZE] = {
   //as many vals as dim1
  {0b101, 0b11000, 0b11010, 0b1100, 0b10, 0b10010, 0b1110, 0b10000, 0b100, 0b10111, 0b1101, 0b10100, 
0b111, 0b110, 0b1111, 0b10110, 0b11101, 0b1010, 0b1000, 0b11, 0b1001, 0b10001, 0b1011, 0b11001, 0b11011, 0b11100},
  {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z}//as many rows as dim0
};

Nur will ich nicht den wert um eines erhöhen sondern hinten dran hängen. Das wird mit einem normalen Plus auf diese Weise nicht funktionieren ^^

Richtig. Shiften nennt man die Operation, an die du denkst.

x = 1; // init
while ( true ) {
 byte i = getPunktStrichPause () ; // nur so als Pseudo-Code   ( 0 = .  /  1 = _   /  2 = Pause, mindestens die zwischen zwei Zeichen ) 
 if ( input < 2) x = (x << 1) | i;  // Shift um ein Bit nach links, neuer Punkt/Strich dazu
 else break; // Ende von while (true) 
}

Statt des ODER ( | ) könntest du auch ein PLUS ( + ) verwenden, das ergibt hier dasselbe, da nur 0 oder 1 mit einer 0 verknüpft werden.

Das heißt ich habe jetzt das hier:

byte x = 0b00001;

Dann shifte ich die 1 um eins nach links und füge 0 bzw 1 hinzu was dann das hier ergeben sollte:

x = 0b00010;

Bei i gleich 2 oder höher würde dann die Umwandlung in einen Buchstaben statt finden oder zusätzlich weitere Aktionen, wie Zeilenumbruch etc

Dann exportiere ich meine Funktionen mal schön, damit das ganze etwas übersichtlicher wird und nehme die Variablen mit.

Der 2D Array müsste dann so passen nur fehlen jetz noch die ganzen 0 bei z.B. 0b10 ( = " . " ) ---> 0b00010

Dann sollte der Code auch funktionieren.

Habe meine Hardware nun auch um einen Button, 3 Status LED's in Grün, Gelb, Rot und einen Lautsprechererweitert. Mal schaun was sich aus meinem Kleinen Projekt noch so entwickelt :slight_smile:

Dein 2D Array mit 226 byte ist nicht kürzer als ein 132 Array, macht nur das Auswerten komplizierter und länger. ( Wenns schon läuft, ist es auch gut. )
Erst wenn du auch Morsecodes für Zahlen mitnimmst, hast du ein 1*64 Array mit einigen Lücken.

Wo kriegst du eigentlich die Morse-Signale her, dass du auf so strikte Zeiten vertrauen kannst ?

Übrigens:
0b101 und 0b00101 ist nur eine andere Schreibweise der gleichen Zahl.

So um zum Array Problem zurück zu kommen: Hier bin ich nun :smiley:

byte array [26] [26] = {
    {0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100, 
    0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}
  };
  const char b_array[26] =  {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};

Kommt ein Fehler, dass const char [] zu viele Enterys hat...
Muss ich jetz splitten ?? Sprich wenn ausgabe aus array über 4 ist gehe in e-f_array etc? Oder gibt es da eine sinnvollere Lösung?

Kann euch auch mal gerne mein bisheriges werk präsentieren ^^

unsigned long time;
int sensor = A0,
    ma_count = 0, // Array Position hochzählen / zuweisen
    strich = 1,
    punkt = 0; 
byte signal = 0,  // Signal ja/nein
     wert = 0,    // 0= Pause   1= Kurz   2= Lang   3= Zeilenwechsel
     code;

char ausgabe;

byte array [26] [26] = {
    {0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100, 
    0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}
  };
 const char b_array[26] =  {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};



void setup()
{
  Serial.begin(9600);
  // time = millis();
  code = 0b00001;
}

void loop()
{
  if ( signal == 0 && analogRead(sensor) > 100)
  { 
    signal = 1;
    time = millis();
    while ( analogRead(sensor) > 100)
    {}
    if ( millis() - time >= 2000 )  // Pause 2 sec -> Zeilenumbruch
    { wert = 3; } // Zeilenumbruch
    else
    {char ausgabe;
    ausgabe = moersetable(code);
     Serial.print(ausgabe);
    }
      
     
  }
  if ( signal == 1 && analogRead(sensor)  <= 100)
  { 
    signal = 0;
    time = millis();
    while ( analogRead(sensor) <= 100)
    {}
    if ( millis() - time > 450 ) // Lang
    { code = code << 1 | strich;} 
    else // Kurz
    {code = code << 1 | punkt;}

  }
  
}

byte moersetable(byte code){
 
  // steht bereits im Head, aber kann hier vielleicht besser angebracht sein
 /* byte array [26] [26] = {
    {0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100, 
    0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}
  };
  const char b_array[26] =  {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
  */
  byte pos;
  char result;
  pos = array[code];
  result = b_array[pos];
  return result;
 
  
}

Und den Fehler Code den ich dazu bekomme:

Morse_Entschl_ssler_2:16: error: too many initializers for 'const char [26]'
Morse_Entschl_ssler_2.cpp: In function 'byte moersetable(byte)':
Morse_Entschl_ssler_2:72: error: invalid conversion from 'byte*' to 'byte'

Ich weiß auch noch nicht genau wie ich aus meinem 2D Byte Array dann eine positions angabe im Alphabet array machen kann.. :confused:

Gruß Flo[/code]

mrlowalowa:

byte array [26] [26] = {

{0b00101, 0b11000, 0b11010, 0b01100, 0b00010, 0b10010, 0b01110, 0b10000, 0b00100, 0b10111, 0b01101, 0b10100,
    0b00111, 0b00110, 0b01111, 0b10110, 0b11101, 0b01010, 0b01000, 0b00011, 0b01001, 0b10001, 0b01011, 0b11001, 0b11011, 0b11100},
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}
  };
  const char b_array[26] =  {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};



Und den Fehler Code den ich dazu bekomme:


Morse_Entschl_ssler_2:16: error: too many initializers for 'const char [26]'
Morse_Entschl_ssler_2.cpp: In function 'byte moersetable(byte)':
Morse_Entschl_ssler_2:72: error: invalid conversion from 'byte*' to 'byte'

Der Code enthält drei Fehler.

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26}

sind 27 Einträge und nicht 26.
const char b_array[26] =  {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};Das sind Zeichenketten und keine einzelnen Zeichen. Du musst es so schreiben:

const char b_array[26] =  {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

Und zu guter letzt...

byte array [26] [26] = {

definiert ein Array mit 26 x 26 Zeichen. So wäre es richtig:

byte array [2] [26] = {