Morsecode - Decoder funktioniert nicht [war: HILFE]



  • Pasha schrieb:

    ... und weis ehrlich gesagt nicht was ich unter "schreib das ganze mal "schön" mit cpp tags und dann schaun wir weiter =b" verstehen soll. Was ist denn gemeint mit cpp tags 😕 Wie benutzt man dies ???

    Unter dem Editfeld hast du ja schon die Smilies gefunden.
    Unter den 🙂 😃 😉 findest du ein Kästchen wo C/C++ drin steht.
    Markiere deinen eingefügten Quelltext und drück auf das Kästchen.
    Dann werden vor und nach dem Text Tags eingefügt. In diesem Fall steht dann cpp und \cpp drin. Das macht den Quellcode hübsch und bunt.

    Pasha schrieb:

    Wieso denn Zweidim. Felder??? hab ich auch nicht verstanden...

    Das Problem ist ich verstehe nicht wie den Fehler beseitigen kann 😕

    Du verstehst auch nicht was du bis jetzt tust.

    Dein alphabet besteht aus Zeichen. Dein morsecode aus Strings. Das sind verschiedene Dinge.
    In ein char passt ein Zeichen rein. Beim Morsecode wären das '.' oder '-'.

    Da du für den Morsecode mehrere Zeichen für einen Buchstaben brauchst, musst du auch mehr Zeichen einlesen.
    Zeichen kann man noch mit == oder != vergleichen. Bei Strings musst du dann Funktionen benutzen. Z.B. strcmp() (string compare) oder strchr()

    Du musst deine MORSE2ABC() umbauen, etwa so.

    Zeile einlesen.
      Solang noch Zeichen das sind:
        Zeichen != ' ' Suchen. Stelle merken
        Nach nächsten Leerzeichen suchen.
        Dazwischen ist dann ein Morsezeichen.
        Das kannst du dann mit deiner Liste vergleichen.
      Weiter mit Schleife.
    

    Du kannst auch die Funktion strtok() benutzen.



  • Jetzt mal nur fürs einzelne Morsezeichen : zB ". " => E

    char cEingabe[]={"a"};
    	fflush(stdin);
    	fgets(cEingabe,3,stdin);
    	printf("%s",cEingabe);
    

    kann man ja einwandfrei einlesen ausgeben... Aber wenn ich dann weiterprog

    if(strcmp(cEingabe, cTest) != 0);
    	{
    		for(i=0;i<37;i++)
    		{
    			if(strcmp(morsecode[i], cEingabe ) == 0)
    			{
    				printf("%s",alphabet[i]);
    			}
    		}
    	}
    

    bei der Umwandlung beschwert der sich. Der debugger gibt eine Fehlermeldung bei printf() "Zugriffsverletzung"... Weis jmd weiter ???

    Bedenkt bitte dass ich erst seit diesem sem. programmiere,d.h. nicht zur Sau machen :p



  • könnte daran liegen das

    char alphabet[] =
    

    kein string ist du ihn aber mit %s abfragen wilst

    printf("%s", alphabet[i]);
    

    wäre glaube besser mit %c

    aber das wäre nur meine bescheidene Meinung.



  • Mal ein paar Anmerkungen

    char cEingabe[]={"a"};    //legt ein Array an mit [b]2[/b] Elementen
                              //Diese sind gefüllt mit '2' und '\0'
    fflush(stdin);            // ist [b]nicht[/b] definiert
    fgets(cEingabe,3,stdin);  // jetzt willst du 3 Zeichen einlesen 
                              // hast aber nur für 2 Platz s.o.
    printf("%s",cEingabe);
    

    Lies dir nochmal das Kapitel mit Strings durch.
    Unbedingt den Unterschied zwischen "4" und '4' und 4.
    Und was das '\0' ist.



  • zwar gibt der E aus aber hängt sich auf...

    ein plan wie ich ganze sätze umwandeln könnte????



  • zeig nochmal deinen quellcode

    ich würds so machen:

    Morsezeichen(MZ) einlesen
    Morsezeichen in string schreiben
    string mit MZCodes vergleichen (strcmp oder so)
    
    wenn es keinen Treffer gibt
    { nächstes MZ einlesen
    an String anhängen
    string mit MZCodes vergleichen
    }
    ansonsten
    {
    ausgabe des buchstabens
    string löschen(leer machen, neu aufsetzten, wie auch immmer)
    }
    


  • fgets(cEingabe,leange=strlen(cEingabe),stdin);
    

    hab es mal so versucht aba geht auch nicht... was anderes hab ich nicht finden können

    char cTest[]={"t"};
    	char cEingabe[7]={"a"};
    //	int strcmp(char *cEingabe, char *cTest);
    	fflush(stdin);
    	fgets(cEingabe,7,stdin);						
    //	printf("%s",cEingabe);
    
    		for(i=0;i<37;i++)
    		{
    			if(strcmp(morsecode[i], cEingabe ) == 0)
    			{
    				printf("%c",alphabet[i]);
    			}
    		}
    

    für genau 7 Zeichenlange codes funtkionierts... Problem ist das die Morsecodes unterschiedliche längen haben



  • Evtl. ist in cEingabe noch das '\n' drin.
    Mach mal printf("<%s>\n",cEingabe);
    Wenn da dann

    <.---
    >
    

    steht ist das '\n' noch drin.

    Zudem ist in deinem Array morsecode immer noch ein Leerzeichen am Ende der Morsezeichen.



  • Bin soweit eigentl fertig nur das einzige Problem ist, dass bei der Ausgabe vom Alphabet nicht getrennt wird. Hier nochmal code:

    int i;
    	const char *cMorsecode[] =	{".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"," "};
    	const char cAlphabet[]    =	{'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','1','2','3','4','5','6','7','8','9','0',' '};
    
    	char cEingabe[256]={"a"};
    	fflush(stdin);gets(cEingabe);	
    
    	if(strchr(cEingabe, ' ')!=0)
    	{
    		char cTeiler[] = " ";
    		char *pointer;
    		pointer = strtok(cEingabe,cTeiler);
    
    		while(pointer!=NULL)
    		{
    
    					for(i=0;i<37;i++)
    					{
    						if(strcmp(cMorsecode[i], pointer ) == 0)
    						{
    							printf("%c",cAlphabet[i]);
    						}
    					}
    
    					pointer=strtok(NULL,cTeiler);
    
    		}
    	}
    }
    

    kriege halt keine leerzeichen mehr zwischen den Wörtern zB: HALLOHALLO
    ich weis weshalb es nicht geht aber wie kann ich es ohne viel zu ändern beseitigen???



  • strtok() fasst aufeinander folgende Trennzeichen zu einem zusammen. Wenn du da einen Unterschied machen willst, wieviele Leerzeichen zwischen den Morsefolgen standen, mußt du da sensibler vorgehen, z.B. mit strchr().

    PS: fflush(stdin); solltest du schnell wieder vergessen.



  • strtok ist problematischen... im morsecode tauchen ja viele aufeinander folgende zeichen wie ... bzw --- auf...
    und mit der strchr() werden die leerzeichen weggelassen...

    ?????????????????????????????????????????????????????????



  • Pasha schrieb:

    strtok ist problematischen... im morsecode tauchen ja viele aufeinander folgende zeichen wie ... bzw --- auf...

    Die stören nicht - dein Problem ist nur, daß strtok() nicht zwischen einzelnen Leerzeichen (Trennung der Buchstaben) und mehrfachen Leerzeichen (Trennung von Wörtern) unterscheiden kann.

    und mit der strchr() werden die leerzeichen weggelassen...

    Wie meinen? strchr() lässt gar nichts weg, sondern sucht nur nach bestimmten Zeichen in einem String (und im Gegensatz zu strtok() lässt es die gefundenen Zeichen stehen, da müsstest du also selber '\0' einfügen, wenn du die Zeichen weiterverarbeiten willst:

    char* start = cEingabe;
    do
    {
      char* ende = strchr(start,' ');
      if(ende!=NULL) *ende='\0';
      ...
      start = ende+1;
    }
    while(ende!=NULL);
    

    (ungetestet)



  • CStoll schrieb:

    {
      char* ende = strchr(start,' ');
      if(ende!=NULL) *ende='\0';
      ...
      start = ende+1;
    }
    while(ende!=NULL);
    

    (ungetestet)

    Ja das merkt man. ende wird außerhalb des Sichtbarkeitsbereichs verwendet.

    struct {char *morse[37],alph[37]; } codes = {
    {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"," "},
    {'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','1','2','3','4','5','6','7','8','9','0',' '}};
    int main()
    {
      char z[100];
      while( fgets(z,100,stdin) && *z!='\n' )
      {
        char x[100],*p=z; int n=0,i;
        while( i=37,1==sscanf(p+=n,"%s%n",x,&n) )
          while( i-- )
            if( !strcmp(x,codes.morse[i]) ) printf("\n%c",codes.alph[i]);
      }
      return 0;
    }
    

Anmelden zum Antworten