Frage zu Arrays



  • Hi ihrs.

    Bin auf der Suche nach ner Lösung für mein Problem auf dieses Forum gestoßen und hoffe dass ihr mir helfen könnt.

    Zum Problem:
    Ich programmiere gerade ein Programm was eine .txt Datei einließt, verarbeitet und einen Morsecode ausgibt. Jetzt hab ich 2 Arrays. In dem ersten sind alle Buchstaben, Zahlen usw. und in dem 2ten die Codeworte für jeden Buchstaben.

    char mors_alph[40]={'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','!','"','§','$','%','&','/','(',')','=','Ä','Ö','Ü','?'};
    int mors_alph_cod[40]={10,0111,0101,011,1,1101,001,1111,11,1000,010,1011,00,01,000,1001,0010,101,111,0,110,1110,100,0110,0100,0011,10000,11000,11100,11110,11111,01111,00111,00011,00001,00000,1010,0001,1100,1110011};
    

    So, allerdings scheitere ich an dem Array mit den Zahlen. Wenn ich diesem mit ner for-Schleife ausgebe, erscheint nicht das auf dem Bildschirm was im Array steht.

    Hier mein Ausgabecode:

    for(i=0;i<40;i++){printf("%i \n", mors_alph_cod[i]);};
    

    Und dies erscheint auf dem Bildschirm:

    10
    73
    65
    9
    1
    1101
    usw.

    Wie ihr seht gibt er ein paar Felder des Arrays korrekt, andere wiederum falsch aus.

    Ich hoffe ich hab mich deutlich ausgedrückt und hoffe ihr könnt mir helfen. Danke schonmal im Vorraus.

    MfG
    Tarquinio



  • hallo

    wenn du einen integer wert hast, wird bei vorangestellter 0 auf der basis 8 gearbeitet, also oktal.

    int x=10; //dezimal
    int x=010;//oktal
    int x=0x10; //hexa

    so long



  • Mach mors_alph_cod zu nem Array von Char Arrays (also Strings).



  • Ok, danke. Macht alles Sinn.

    Wenn ich den Array als Char-Array deklariere

    char mors_alph_cod[40]={"10","0111","0101","011","1","1101","001","1111","11","1000","010","1011","00","01","000","1001","0010","101","111","0","110","1110","100","0110","0100","0011","10000","11000","11100","11110","11111","01111","00111","00011","00001","00000","1010","0001","1100","1110011"};
    

    gibt der Compiler nen Fehler aus
    [code]error C2078: Zu viele Initialisierungen[quote]

    Habts ihr nen Tipp wie ich das beheben kann?



  • char *mors_alph_cod[40]={"10","0111","0101","011","1","1101" ...
    

    Weil: Du hast ein Array aus Zeigern auch char.



  • Arrays sind cool 🕶



  • Ok, hab dank eurer Hilfe alles hinbekommen wie ichs brauche. Allerdings hab ich nun ein neues Problem.

    Hier ist meine Funktion:

    char codieren(char *puffer, int anzahl)
    {
    	int i=0,n=0,helfer=0;
    	char *mors_alph_cod[40]={"10","0111","0101","011","1","1101","001","1111","11","1000","010","1011","00","01","000","1001","0010","101","111","0","110","1110","100","0110","0100","0011","10000","11000","11100","11110","11111","01111","00111","00011","00001","00000","1010","0001","1100","1110011"};  //kein int-Array da Werte mit vorangestellter 0 als Oktalzahl gewertet werden
    	char mors_alph[40]={'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','!','"','§','$','%','&','/','(',')','=','Ä','Ö','Ü','?'};
    	char *puffer_codiert[256];
    
    	printf("\n\n");
    	for (i=0;i<anzahl;i++)
    	{
    		if (puffer[i]==' ') 
    		{	
    			puffer_codiert[i]="2";
    			break;
    		}
    
    		helfer=0;																					//Überprüfung ob ein falsches Zeichen eingegeben wurde
    		for(n=0;n<=40;n++)
    		{
    			if ( (toupper(puffer[i])) == mors_alph[n] ) 
    			{	
    				puffer_codiert[i]=mors_alph_cod[n];
    				helfer=1;
    			}
    		}
    
    		if(helfer==0) printf("\n Fehler an der Stelle %i mit dem Zeichen %c!",i,puffer[i]);
    	}
    
    	return puffer_codiert;
    }
    

    Wie ihr seht is die Funktion als char deklariert. Ich möchte allerdings einen Zeiger auf den Array puffer_codiert zurückgeben. Was muss ich da ändern? Wenn ich die Funktion so lasse kommt folgender Fehler:

    error C2440: 'return' : 'char *[256]' kann nicht in 'char' konvertiert werden

    Ich bedanke mich schonmal.



  • Und noch ein Problem.

    In dem Array puffer_codiert sind wie ihr im Post oben sehen könnt nur Strings enthalten, die sich aus 0 und 1 zusammensetzen. Jetzt habe ich einen neuen char Array deklariert in den ich nacheinander die Strings aus dem puffer_codiert reinlade um dann die Länge mit strlen auszugeben. Allerdings erfordert diese Funktion einen constanten Array.

    Wie kann ich denn meinen test-Array in **const char *** umwandeln?

    strcpy(test,puffer_codiert[0]);
    printf("\n %i",strlen(test[2]));
    

    PS: Dachte nicht, dass einen so Kleinigkeiten das Leben schwer machen können.

    MfG
    Tarquinio



  • Tarquinio schrieb:

    Wie kann ich denn meinen test-Array in **const char *** umwandeln?

    musst du garnicht. strlen erwarten einen zeiger bzw. die adresse deines charfeldes.



  • probier mal so:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    void mors_code (char *in, char *out)
    {
        static char *mors_alph_cod[]={"2","10","0111","0101","011","1","1101","001","1111","11","1000","010","1011","00","01","000","1001","0010","101","111","0","110","1110","100","0110","0100","0011","10000","11000","11100","11110","11111","01111","00111","00011","00001","00000","1010","0001","1100","1110011"};  //kein int-Array da Werte mit vorangestellter 0 als Oktalzahl gewertet werden
        static char mors_alph[]={' ','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','!','"','§','$','%','&','/','(',')','=','Ä','Ö','Ü','?'};
    
        while(*in)
        {
            char c = toupper(*in++); // geht nicht mit umlauten
            unsigned int s;
            for (s=0; s<sizeof(mors_alph); s++)
            {
                if (c == mors_alph[s])
                {
                    unsigned int i;
                    for (i=0; i<strlen(mors_alph_cod[s]); i++)
                        *out++ = mors_alph_cod[s][i];
                    break;
                }
            }
            if (s == sizeof(mors_alph))
                *out++ = '3';
        }
        *out = 0;
    }
    
    int main ()
    {
        char *out[1000]; // mindestens 4*strlen(in)
        mors_code ("hello\nworld", out);
        puts (out);
        mors_code ("hello world", out);
        puts (out);
        while (1) getchar();
    }
    

    :xmas2:



  • Bitte den sinnvollen Einsatz von const beachten:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    void mors_code(char const * restrict in, char * restrict out)
    {
        char const *mors_alph_cod[]={"2","10","0111","0101","011","1","1101","001","1111","11","1000", ... };
        char const mors_alph[]={' ','A','B','C','D','E','F','G','H','I', ...};
        while(*in)
        {
            char const c = toupper(*in++); // geht nicht mit umlauten
            unsigned int s;
            //...
    }
    //...
    

    wobei man die Suche wohl auch für Buchstaben optimieren könnte (funktioniert aber nur auf Systemen bei denen die Buchstaben in einer Reihe in der Kodierung stehen (zB ASCII))

    char const mors_alph[]={' ','!','"','§','$','%','&','/','(',')','=','Ä','Ö','Ü','?'};
    unsigned int s = toupper(c) - 'A' + 1;
    if(s > 26)
      // suche das Zeichen in mors_alph
    size_t n = strlen(mors_alph_code[s]);
    memcpy(out, mors_alph_code[s], n);
    out += n;
    

    btw toupper sollte je nach locale auch mit Umlauten klar kommen!
    btw macht es Sinn ab und an die Zeilen auch mal umzubrechen 🙂

    <edit>Bug behoben</edit>



  • rüdiger schrieb:

    Bitte den sinnvollen Einsatz von const beachten:

    das ist doch keine komplettlösung, nur ein halbwegs lauffähiges beispiel. der OP kann's ja mit 'const' zupflastern wie er lustig ist 😉

    rüdiger schrieb:

    wobei man die Suche wohl auch für Buchstaben optimieren könnte

    oder man baut die tabellen so, dass man mit dem zeichenwert den index in die piepstontabelle berechnen kann, dann brauchst nix mit schleifen zu suchen...

    rüdiger schrieb:

    // suche das Zeichen in mors_alph
    memcpy(out, mors_alph_code[s], sizeof(mors_alph_code[s]);
    

    sizeof() in dem fall geht bei bei mir nicht (ms-c 8). selbst wenn ich das array als 'const char* const mors_alph_cod[]'(constiger geht ja wohl nicht) definiere.
    :xmas2:



  • ten schrieb:

    rüdiger schrieb:

    Bitte den sinnvollen Einsatz von const beachten:

    das ist doch keine komplettlösung, nur ein halbwegs lauffähiges beispiel. der OP kann's ja mit 'const' zupflastern wie er lustig ist 😉

    naja, nur dein static-Zeugs macht einen ziemlichen Overhead!

    rüdiger schrieb:

    // suche das Zeichen in mors_alph
    memcpy(out, mors_alph_code[s], sizeof(mors_alph_code[s]);
    

    sizeof() in dem fall geht bei bei mir nicht (ms-c 8). selbst wenn ich das array als 'const char* const mors_alph_cod[]'(constiger geht ja wohl nicht) definiere.

    ups, das muss natürlich ein strlen sein.



  • rüdiger schrieb:

    naja, nur dein static-Zeugs macht einen ziemlichen Overhead!

    huch? welchen overhead?
    das 'static' sorgt doch dafür, dass die arrays nur einmal initialisiert werden und dass die nicht auf'm stack landen. das ist so als hätte man die ausserhalb der funktion angelegt...
    :xmas2:

    edit:

    rüdiger schrieb:

    ups, das muss natürlich ein strlen sein.

    trotzdem komisch, ne?
    es steht's doch alles zur compiletime fest (erst recht wenn man alles mega-const macht), z.b. ein 'sizeof(*mors_alph_cod[...])' sollte funzen.
    will aber trotzdem nicht 😕



  • Vielen Dank nochmal.

    Leider bekomme ich nen Fehler wenn ich das Programm ausführe. Keine Ahnung wieso.

    //Edit: OK. Hab jetzt erst mal alles mit den Arrays so hinbekommen wie ich es gern hätte. Vielen Dank an dieser Stelle.



  • Tarquinio schrieb:

    ...
    Leider bekomme ich nen Fehler wenn ich das Programm ausführe. Keine Ahnung wieso.

    Wir auch nicht. 😉

    Gruß,

    Simon2.



  • 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!


Anmelden zum Antworten