Frage zu Arrays



  • Hi zusammen,

    ich habe ebenfalls ein Problem mit nem morsecode und zwar will ich aus einer Datei einen Morsecode laden und diesen dann als übersetzten Text ausgeben. Leider macht er aber nicht was ich will. Vielleicht kann ja einer mal drüberschauen und mir sagen woran es liegen könnte! Habe keinen Durchblick mehr!

    #include <cstring>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #define MAX 80
    #define BUFFER_SIZE 1024

    void readFile(char *file,char *buf)
    {
    int i=0;
    FILE *fp = fopen("f:\Morsecode.txt","r");

    while(!feof(fp))
    {
    buf[i]=fgetc(fp);
    i++;
    }
    fclose(fp);
    }

    int main()
    {

    char alpha[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'}; // Pool des Alphabets
    char *Ganzzahl[26] = {"12", "2111", "2121", "211"};// , '1', '1121', '211', '1111', '11', '1222', '212', '1211', '22', '21', '222', '1221', '2212', '121', '111', '2', '112', '1112', '122', '2112', '2122', '2211'};//Index Zahlenumwandlung
    char Umwandlung[MAX];
    char Umwandlung2[]={'1', '2', };
    char Codezeichen[2]={'.', '-'};
    char buffer[MAX];//BUFFER_SIZE
    readFile("f:\Morsecode.txt",buffer);
    int i,j;

    printf(" \t\tDie eingelesene Datei hat folgenden Inhalt:\n\n%s\n\n",buffer);

    for (j=0; j<strlen(buffer); j++)
    {
    for (i=0; i<3; i++)
    {
    if (Codezeichen[i]==buffer[j])
    Umwandlung[j]=Umwandlung2[i];
    if (' '==buffer[j]||'\0'==buffer[j])
    Umwandlung[j]=' ';

    }

    }

    printf("%s\n",Umwandlung);

    // Bis hier ist der code in Ordnung
    // Nun Kommt Zerlegung des Strings

    int k=1;
    char *ptr;
    {
    ptr = strtok(Umwandlung, "\n\t ");
    if (ptr != '\0')
    {

    //printf("% d. Wort: %s\n",k++,ptr);// Anzeige der einzelnen ptr Wörter
    // Vergleich der beiden Variablen
    for (j=0; j<24; j++)
    if ((char*) &ptr == (char*)&Ganzzahl[j])
    {
    printf("\n%c",alpha[j]);
    }// Ende Abschnitt Vergleich

    ptr = strtok(NULL, "\n\t ");
    }

    }
    getch();
    return 0;
    }

    [/code]



  • Erstens: Was genau macht das Programm denn falsch?

    Zweitens: Den Inhalt von char-Arrays kannst du nicht per == vergleichen, dafür gibt es strcmp():

    for (j=0; j<24; j++) 
      if (strcmp(ptr,Ganzzahl[j]) 
      { 
        printf("\n%c",alpha[j]);
        break;
      }
    

    Drittens: Ist es eigentlich Absicht, daß du nur die ersten vier Morsecodes in dein Array geschrieben hast?



  • Zu Erstens:

    Das Programm ließt einen Morsecode bestehend aus den Zeichen . und - aus einer Datei ein und wandelt diese Morsezeichen in Zahlen um. Für den Punkt wird eine 1 abgelegt und für den Strich eine 2. Leerzeichen sollen berücksichtigt werden.
    Nachdem diese Zahlen in einem neuen String inkl. der Leerzeichenformatierung abgelegt wurden, soll jeder Teilstring mit den entsprechenden Zahlen verglichen werden, woraus dann ein Wort entstehen würde.

    Als Morsecodevorlage soll zum Beispiel:

    -.. .- ...
    .. ... -
    . .. -.
    -- --- .-.- ... . -.-. --- -.. .

    dienen. Dieser wird dann in Ganzzahlen umgewandelt
    211 12 111
    11 111 2
    1 11 21
    22 222 121 111 1 2121 222 211 1

    Nun sollen diese Zahlen aus dem String wo sie hin abgelegt wurden mit den Ganzzahlen verglichen werden. Stimmt ein Teilstringg zum Beispiel mit der 211 überein, soll genau an diese Stelle dann ein D ausgegeben werden und weiter im restlichen String übersetzt werden, so dass am Schluss der Satz
    D A S
    I S T
    E I N
    M O R S E C O D E
    auf dem Monitor erscheint und als kompletter String in ein char abgelegt wird!

    ZU Zweitens:
    Ja ich weiß, hatte es auch schon damit versucht, jedoch bricht er die Übersetung nach der Wiedergabe der ersten drei Zahlen ab und schmeißt ein A raus:

    Hier der Bildschirmausdruck!

    -.. .- ...
    .. ... -
    . .. -.
    -- --- .-.- ... . -.-. --- -.. .

    211 12 111
    A

    Zu Drittens:
    Nein war keine Absicht, hatte es vergessen wieder zu ändern, habe es aber jetzt gemacht! Ich stelle nochmals den aktuellen Code jetzt hier rein:

    #include <cstring>
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #define MAX 80
    #define BUFFER_SIZE 1024
    
    void readFile(char *file,char *buf)
    {    
         int i=0;
         FILE *fp = fopen("f:\Morsecode.txt","r");
    
         while(!feof(fp))
         {
               buf[i]=fgetc(fp);  
               i++;  
         }
         fclose(fp); 
    }
    
    int main()
    {
    
    	char alpha[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'}; // Pool des Alphabets
    	char *Ganzzahl[26] = {"12", "2111", "2121", "211", "1", "1121", "211", "1111", "11", "1222", "212", "1211", "22", "21", "222", "1221", "2212", "121", "111", "2", "112", "1112", "122", "2112", "2122", "2211"};//Index Zahlenumwandlung
    	char Umwandlung[MAX];
    	char Umwandlung2[]={'1', '2', };
    	char Codezeichen[2]={'.', '-'};
        char buffer[MAX];//BUFFER_SIZE
        readFile("f:\Morsecode.txt",buffer);
        int i,j;
    
        printf(" \t\tDie eingelesene Datei hat folgenden Inhalt:\n\n%s\n\n",buffer);
    
        for (j=0; j<strlen(buffer); j++)
        { 
         for (i=0; i<3; i++)
           		{
           		if (Codezeichen[i]==buffer[j])
    					Umwandlung[j]=Umwandlung2[i];
    						if (' '==buffer[j]||'\0'==buffer[j])
    							Umwandlung[j]=' '; 
    
           		}
    
    	}
    
          printf("%s\n",Umwandlung);
    
          // Nun Kommt Zerlegung des Strings
    
       		char *ptr;
    
       		ptr = strtok(Umwandlung, "\n\t ");
       			if (ptr != '\0')
        		{
        		 //printf("% d. Wort: %s\n",k++,ptr);// Anzeige der einzelnen ptr Wörter
          		// Vergleich der beiden Variablen
       				for (j=0; j<24; j++)
      				if (strcmp(ptr,Ganzzahl[j]))
      				{
        			printf("\n%c",alpha[j]);
        			break;
      				}
    
          			}// Ende Abschnitt Vergleich
    
          ptr = strtok(NULL, "\n\t ");
    
          getch();
      return 0;
    }
    

    Und jetzt verstehe ich einfach nicht, wie ich auf die einzelnen Teilstrings mit den Zahlen zugreifen kann, um die in der gespeicherten Reihenfolge auch mit dem Feld Ganzzahl zu vergleichen um die richtigen Buchstaben zuzuordnen!

    Ich hoffe du hast ne Idee



  • Ja, du solltest das Aufteilen und Umwandeln der einzelnen Zeichen in eine Schleife packen.



  • Und du hast net zufällig nen Vorschlag wie das gehen soll!?? Ich verstehe das nicht so ganz mit dem Stringzugriff!



  • Wenn du nicht weißt, was eine Schleife ist, bist du hier falsch (sorry, aber das mußte mal gesagt werden):

    char* ptr=strtok(Umwandlung,"\n\t ");
    do
    {
      //ptr in Zeichen umrechnen
      ptr=strtok(NULL,"\n\t ");
    }
    while(ptr!=NULL);
    


  • Comunio schrieb:

    ...Dieser wird dann in Ganzzahlen umgewandelt...
    ...
    Nun sollen diese Zahlen aus dem String wo sie hin abgelegt wurden mit den Ganzzahlen verglichen werden. Stimmt ein Teilstringg zum Beispiel mit der 211 überein, soll genau an diese Stelle dann ein D ausgegeben werden und weiter im restlichen String übersetzt werden, so dass am Schluss der Satz
    D A S
    I S T
    E I N
    M O R S E C O D E
    auf dem Monitor erscheint und als kompletter String in ein char abgelegt wird!

    das ist ja übelst kompliziert.
    mach doch aus dem morsecode gleich zeichen
    ... oder nimm was fertiges: http://mirror.sg.depaul.edu/pub/OpenBSD/src/games/morse/morse.c
    🙂



  • CStoll schrieb:

    Wenn du nicht weißt, was eine Schleife ist, bist du hier falsch (sorry, aber das mußte mal gesagt werden):

    Also ich weiß sehr wohl was ne Schleife ist, da brauchst du keine Panik zu haben, jedoch funktioniert es eben mit deiner angegebenen Schleife genau so wenig wie mit meiner! Das Problem ist, dass er nicht bis zum ende durchläuft! Das musste auch mal gesagt werden 🙂

    @ ten
    Danke für Deinen Link, das war wirklich mal hilfreich, auch wenn ich ihn anpassen muss^^ Trotzdem danke



  • Comunio schrieb:

    Also ich weiß sehr wohl was ne Schleife ist, da brauchst du keine Panik zu haben, jedoch funktioniert es eben mit deiner angegebenen Schleife genau so wenig wie mit meiner! Das Problem ist, dass er nicht bis zum ende durchläuft! Das musste auch mal gesagt werden 🙂

    *grübelt* *extra nochmal nachguckt* Wo bitteschön ist in deinem letzten Programmcode eine Schleife? Du suchst das erste Zeichen des Morsecodes im Array "Ganzzahl" und gibst es aus - danach kommt noch ein strtok()-Aufruf und dann ist das Programm zu Ende.

    (btw, wozu machst du dir überhaupt die Mühe, die Eingabezeichen in 1 bzw. 2 umzuwandeln? Der Stringvergleich klappt doch genausogut mit Punkten und Bindestrichen.



  • Ja er funktioniert auch mit den Zeichen genauso gut, jedoch ist das die sch... Aufgabe hier im Buch und ich habe kein Lösungsformular mehr dazu! Sorry wenn ich dir wie ein absoluter NOOP vorkomme, aber ich gehe mal davon aus, dass auch du mal neu angefangen hast und nicht mit dem Wissen auf die Welt kamst. Dachte das hier auch Einsteiger fragen stellen können 😉

    Trotzdem vielen Dank *demoralisiert guckend*



  • Ja, du darfst hier auch als Anfänger kommen. Aber ein "es funktioniert nicht" reicht normalerweise nicht aus, um einen Fehler einschränken zu können (Stichwort: Kristallkugel), da erwarten wir zwar keine Expertenkenntnisse, aber zumindest etwas Mitarbeit von deiner Seite.



  • Das ist schon klar und ich versuche ja auch alles, ist bestimmt nicht so, dass ich hier ne Lösung will, dann kann ich es auch ganz sein lassen, da der Lerneffekt = 0,0. Daher wollte ja nur Anregungen und nun habe ich ja genug und geb mich wieder dran. Werde mich melden wenn es klappt, oder erneut Prohbs auftreten!

    DANKE für deine Hilfe!



  • So ich habe jetzt erstmal umgestellt auf direkte Umwandlung von Zeichen in buchstaben!

    Das ist mein Umwandlungsabschnitt:

    char* ptr=strtok(buffer,"\n\t ");
    do
    {
     //ptr mit morse vergleichen
      for (i=0; i<24; i++)
      				if (strcmp((char*)ptr,(char*)morse[i]))
      				{
        			printf("%c ",alpha[i]);
        			break;
                    }
    
      ptr=strtok(NULL,"\n\t ");
    }
    while(ptr!=NULL);
    

    Wenn ich jetzt das Programm starte, wirft er 20 mal A und B aus! Aber warum macht er das? Wenn ich mir den Inhalt von ptr anzeigen lasse, habe ich dort den identischen Stringinhalt wie in morse!
    Kann es daran liegen, dass in ptr bei der Teilung des Strings Buffer das Leerzeichen mit auftaucht und er deswegen keinen identischen String findet?



  • Sorry, mein Fehler - strcmp() gibt 0 raus, wenn die beiden Strings übereinstimmen und das wird von if() als false interprtiert. Richtig heißt es:

    if(strcmp(ptr,morse[i])==0)//btw, die Casts sind überflüssig
      ...
    

    PS: übrigens behandelst du durch das strtok() alle Trennzeichen im Eingabestring identisch - also müsstest du dir eine Sonderbehandlung für den Zeilenwechsel \n überlegen, bevor strtok() ihn für dich entsorgt. Eine Möglichkeit wäre es, den String mit strspn() zu zerlegen.



  • Hmm ja werde ich noch einbinden, jedoch wirft er mir nach wie vor auch mit if(strcmp(ptr,morse[i])!=0) am Ende

    A BA BAAAAAA BAAAAAAA

    aus! Verstehe ich nicht so ganz! Ich versuche das jetzt mal mit nem Eingabetext und nicht mit ner txt die er einließt, vielleicht hat er damit Probleme??



  • 🕶 *duck'n'run* Ich fürchte, langsam bin ich urlaubsreif. Das sollte natürlich heißen "if(strcmp(...)==0)".



  • LOL ja hatte ich schon gemerkt, jedoch zeigt er mir nun nur das letzte Zeichen des Morsecodes an und nicht den ganzen Text:-)

    Aber ich nähre mich ganz langsam der Sache, kann ja nur noch mit der whileschleife von ptr zusammenhängen! Hoffe und denke ich!



  • Ich habe es 🙂 HAHA hatte nen doofen Schreibfehler drin:-) Jetzt gehe ich nur noch an die Zeilenumbrüche und gut ist! tausend dank für deine Inspiration^^



  • @CSTOLL

    Ich hoffe ich kann dich nochmals nerven. Du meintest ja das ich den String mit strspn() zerlegen soll um das Problem mit den Leerzeichen bei Zeilenende in den Griff zu bekommen.
    Nur hier stehe ich ja vor dem Problem, dass wenn ich nach dem Zeichen '\n' suchen lasse und es umtragen will, er mir einen bereits gelsenene Buchstaben an der Stelle wieder überschreibt.

    Gibt es nicht auch eine Formatierungsmöglichkeit bei der Speicherung des ptr Buffers in den Ausgabetextbuffer?



  • Sorry, aber: Ich kann mir jetzt gar nicht vorstellen, was du mir damit sagen willst. Kannst du das mal etwas genauer erläutern (am besten mit Code).

    Eine Lösung wäre es noch, die Datei von vornherein zeilenweise einzulesen:

    char buf[81];//sollte lang genug sein für eine Textzeile
    while(fgets(buf,81,infile)!=NULL) //Zeile einlesen
    {
      //zerlege Zeile per strtok() o.ä. und wandle in lesbare Zeichen um
      putc('\n');//Zeilenumbruch ausgeben
    }
    

Anmelden zum Antworten