übertrittsfehler??



  • Du hast da eine Speicherverletzung drin und zwar gleich beim ersten Befehl *Einlesen=getchar();

    Einlesen zeigt irgendwohin und da möchtest du mit getchar() ein Zeichen hinschreiben. Das mag das Betriebssystem nicht!

    Anscheinend bekommst du deine Daten über die Tastatur (hab dich eigentlich schon mal gefragt, woher du deine Daten bekommst). Daher solltest du fgets() (mit stdin als Filestream) verwenden. Allerdings musst du dann noch eine Schleife um das ganze machen, da fgets() nur zeilenweise einliest. Außer du hast keinen Zeilenumbruch in deinen Daten, dann kannst du auf die Schleife verzichten.

    Dann gibt es noch was zum Vergleichen von Strings zu sagen. Einmal hab ich was gesehen da hast du eine Variable derart verglichen: var == "E"
    Das geht so leider nicht in C. Da es sich bei E ja nur um ein Zeichen handelt, brauchst du nur einfache Anführungszeichen, also 'E'.
    Dann ist mir noch aufgefallen, dass du mehrere Zeichen hintereinander extra vergleichst. So in der Art: Temp[0] == 'a' && Temp[1] == 'b' && Temp[2] == 'c' ...
    Das kannst du ganz einfach abkürzen durch ein strcmp() (vergleicht die kompletten Strings bis zum Stringendezeichen) bzw. strncmp() (vergleicht die Strings bis zu einer bestimmten Anzahl an Zeichen). Im Beispiel würde das so aussehen: strncmp(Temp, "abc", 3) == 0

    strcmp() bzw. strncmp() haben die kleine Besonderheit, dass sie 0 zurückgeben, wenn der Vergleich positiv war. Mehr über die Rückgabe findest du hier: http://www.cplusplus.com/ref/indexr.html

    Am Schluss solltest du übrigens auch ein puts() verwenden anstatt putchar() und keinen Stern vor Fertig schreiben ;).



  • AJ schrieb:

    Anscheinend bekommst du deine Daten über die Tastatur (hab dich eigentlich schon mal gefragt, woher du deine Daten bekommst). Daher solltest du fgets() (mit stdin als Filestream) verwenden. Allerdings musst du dann noch eine Schleife um das ganze machen, da fgets() nur zeilenweise einliest. Außer du hast keinen Zeilenumbruch in deinen Daten, dann kannst du auf die Schleife verzichten.

    nein, ich lese aus einer datei aus, wie mach ich das mit der schleife??
    bleibt da die eigentliche datei erhalten??

    AJ schrieb:

    Das geht so leider nicht in C. Da es sich bei E ja nur um ein Zeichen handelt, brauchst du nur einfache Anführungszeichen, also 'E'.

    Compiler schrieb:

    [C++Fehler] lis2psc.cpp(46): Cannot convert 'char' to 'char *'.

    mit 'E' gehts aber auch nicht 😞

    mfg saroll 🤡



  • Saroll schrieb:

    nein, ich lese aus einer datei aus, wie mach ich das mit der schleife??
    bleibt da die eigentliche datei erhalten??

    Dann musst du auch was mit Dateiverarbeitung machen. D. h. schau dir mal die Funktionen fopen(), fgets() und fclose() an. Die Datei bleibt natürlich erhalten ;).

    Compiler schrieb:

    [C++Fehler] lis2psc.cpp(46): Cannot convert 'char' to 'char *'.

    mit 'E' gehts aber auch nicht 😞

    mfg saroll 🤡

    Du darfst dann natürlich nicht auf Temp abprüfen, sondern musst auf *Temp abprüfen. 🙂

    Nun noch zu deiner Schleife:
    Am Anfang deines Programms musst du erstmal deine Datei öffnen (fopen()), und dann machst du deine Schleife, als Bedingung liest du die Datei ein (fgets()). fgets() liefert 0 zurück, wenn es am Dateiende ist. Und nach der Schleife schließt du die Datei wieder.

    Nach dem Öffnen nicht das Abprüfen vergessen, ob die Datei auch geöffnet werden konnte ;).



  • AJ schrieb:

    Nach dem Öffnen nicht das Abprüfen vergessen, ob die Datei auch geöffnet werden konnte .

    PFF... du überforderst mich 🤡

    was wenn bei unix die datei direkt auf den stdin draufgelegt wird??



  • Dann musst du von stdin einlesen. Da kannst du dir natürlich das Öffnen und Schließen sparen, aber das fgets() und die Schleife bleiben gleich :).



  • *heul* ich brings nicht hin *wein*
    mit c++ isses ja ganz einfach aber so?!

    *heul*



  • In C ist es auch einfach, wenn man Übung darin hat 😉

    Kleines Beispiel für die Schleife:

    ...
    while(fgets(zeile, sizeof(zeile), stdin))
    {
       printf("%s", zeile);
    }
    ...
    

    Anstatt printf() kommt natürlich dein Code ;). Mehr ist es auch nicht :).



  • und was bedeutet die schleife??
    das jedes mal eine zeile genommen wird und dann in "zeile" geschrieben wird??
    so lange bis keine zeilen mehr da sind??



  • genau, es wird jedes mal eine Zeile in zeile eingelesen (d.h. bis ein Zeilenumbruch '\n' gelesen wird) und zwar maximal sizeof(zeile)-1 Zeichen und an letzte Stelle wird ein Stringendekennzeichen '\0' gesetzt. So geht's



  • ich weiß ich nerve aber ich poste noch mal meinen sourcecode...
    ich glaub ich hab schon wieder einen buffer overflow 🤡

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <iostream.h>
    #include <conio.h>
    
    void Umschreiben(char *Alles, char *Text1, int wo)
    {strncpy(Text1,Alles, wo);
     Text1[wo]=0;
     strcpy(Alles,Alles+wo);
    }
    
    int Suchen(char *Alles, int wo)
    {int laenge=strlen(Alles);
     do
      {wo++;
       if(wo==laenge)
        {wo=0;
         break;
        }
      }while(Alles[wo]!='\x1B');
     return(wo);
    }
    
    int main()
    {char *token, seps[]="\x1B", Alles[10000], Text1[100], Text2[100], Fertig[10000], Temp[10000];
     int wo=1,laenge, restore=0;
     double koordx,koordy;
     int zeichen=0, ende=0;
    
     while(fgets(Alles, sizeof(Alles), stdin))
     {*Temp=0;
      wo=Suchen(Alles,wo);
      strcat(Temp,token = strtok( Alles, seps ));
      while( token = strtok( NULL, seps ))
           {strcat(Temp,token);
    
         if(*Temp=='E')
           {strcat(Temp,token = strtok( Alles, seps ));
           }
         strcpy(Text1,Temp);
         if(strncmp(Temp,"E%-1",4)==0)
           {strcat( Fertig, "%! " );
           }
    
         if(strncmp(Temp,"&l1O",4)==0)
           {strcat( Fertig, "90 rotate 1000 20 translate " );
           }
         if(strncmp(Temp,"&l0O",4)==0)
           {strcat( Fertig, "800 1000 translate " );
           }
         if(strncmp(Temp,"\22",3)==0)
           {strcat( Fertig, "-10 0 rmoveto " );
           }
         if(strncmp(Temp,"(19U",4)==0)
           {strcat( Fertig, "/Times-Italic findfont setfont " );
            if(Text1!="")
              {zeichen=1;
              }
           }
         if(strncmp(Temp,"(s0B",4)==0)
           {strcat( Fertig, "/Times-Roman findfont setfont " );
            strcpy(Text1,Text1+4);
            if(Text1!="")
              {zeichen=1;
              }
           }
         if(strncmp(Temp,"(s3B",4)==0)
           {strcat( Fertig, "/Times-Bold findfont setfont " );
            strcpy(Text1,Text1+4);
            if(Text1!="")
              {zeichen=1;
              }
           }
         if(strncmp(Temp,"(s1P",4)==0)
           {sprintf(Temp,"%f",koordx);
            strcat( Fertig, Temp);
            strcat( Fertig, " " );
            sprintf(Temp,"%f",koordy);
            strcat( Fertig, Temp);
            strcat( Fertig, " moveto " );
            strcpy(Text1," ");
           }
         if(strncmp(Temp,"(s16602T",8)==0)
           {strcpy(Text1," ");
           }
         if(strncmp(Temp,"(s",2)==0)
           {laenge=strlen(Temp);
            strncpy(Text2, Text1, laenge);
            Text2[laenge]=0;
            strcpy(Text1,Text1+2);
            laenge=strlen(Text1);
            strncpy(Text1, " ", laenge-1);
            Text1[laenge-1]=0;
            if(*Text2=='V')
              {strcat( Fertig, "gsave " );
               strcat( Fertig, Text1);
               strcat( Fertig, " scalefont setfont " );
               restore=1;
              }
           }
         if(strncmp(Temp,"*p",2)==0)
           {laenge=strlen(Temp);
            strncpy(Text2, Text1, laenge);
            Text2[laenge]=0;
            strcpy(Text1,Text1+2);
            laenge=strlen(Text1);
            strncpy(Text1, " ", laenge-1);
            Text1[laenge-1]=0;
            if(*Text2=='X')
              {koordx=atof(Text1);
               koordx=(koordx/11,77)*(-1);
              }
            if(*Text2=='Y')
              {koordy=atof(Text1);
               koordy=(koordy/11,77)*(-1);
              }
           }
         if(zeichen==1)
           {zeichen=0;
            strcat( Fertig, "('" );
            strcat( Fertig, Text1 );
            strcat( Fertig, "') show " );
            if(restore==1)
              {strcat( Fertig, "grestore " );
               restore=0;
              }
              }
         laenge=strlen(Alles);
    
      }}
    
     return 0;
    }
    

    *versteck* haut mich nicht!! 🤡

    mfg saroll



  • Erstmal sorry, dass ich mich jetzt erst melden kann. Hab dich nicht vergessen 😉

    Saroll schrieb:

    int Suchen(char *Alles, int wo)
    {int laenge=strlen(Alles);
     do
      {wo++;
       if(wo==laenge)
        {wo=0;
         break;
        }
      }while(Alles[wo]!='\x1B');
     return(wo);
    }
    

    Hier solltest du keine do{}while()-Schleife machen, sondern eine while(){}. Außerdem solltest du wo erst am Ende der Schleife um 1 erhöhen nicht gleich am Anfang.

    Saroll schrieb:

    int wo=1,laenge, restore=0;
    

    wo sollte mit 0 initialisiert werden. Wir wollen doch beim ersten Zeichen anfangen und nicht beim zweiten ;).

    Allgemein solltest du darauf schauen, dass auch bei jedem Schleifendurchlauf alles wieder initialisiert ist, was initialisiert sein sollte (besonders bei Strings und strcat()) bzw. ob bestimmte Sachen vor der Schleife richtig initialisiert sind (betrifft speziell Fertig[]). Außerdem solltest du darauf achten, dass du auch genügend Speicherplatz reserviert hast.


Anmelden zum Antworten