Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Knifflige (?) Speicherverletzung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.01.2006, 11:53 Uhr
dirweis



hi,

ich hoffe natürlich, dass die lösung nicht wirklich knifflig sein wird, aber mir bereitet es schon einiges kopfzerbrechen:
ich habe ein ganz kleines programm für die nicht wirklich gesprochene sprache snowball in c implementiert, das den snowball-code mit html-tags versehen soll, um sowas wie einen hervorhebungsmodus in meinem browser zu haben. naja, bisher soweit problemlos bis auf die sache mit kommentaren. sobald ich die kommentare in dem code mit tags wie <span style='color:#808080'><i> versehen will, funktioniert das zwar, aber die umkonvertierung der kommentare findet trotzdem statt - als wäre es richtiger code. ich habe mich an flag-variablen bedient und dachte, daran könnte mein programm merken, wann etwas von dem code auskommentiert ist und wann nicht...

Code:
if(!flag_kk && !flag_kl) //flag_kk steht fuer flag_kommentar_kurz{

das 2. problem ist die tatsache, dass der 'kommetar-modus' nie beendet wird (was natürlich schwerwiegender ist als das 1.). wenn mein programm in diesem 'modus' ist, hat die entsprechende flag-variable natürlich einen wahrheitswert. wenn dann ein zeilenumbruch (für den fall des einzeiligen kommentars - die syntax ist c-identisch) kommt, sollte das den modus beenden.

Code:
if(flag_kk && '\n' == z){
               flag_kk = 0;
                  fputs("</i></span>", ziel);
            } //z ist das aktuelle zeichen aus der quelldatei

und mittlerweile erhalte ich sogar eine speicherverletzung, die ich mir überhaupt nicht erklären kann. hier kommt mal der ganze code der problematischen funktion 'konvertieren':

Code:
void konvertieren(FILE *quelle, FILE *ziel, const char *quellname){
   int z, zlr = 0, letztes;
   char wort[MAX_WORD_LEN], flag_s = 0, flag_kk = 0, flag_kl = 0;
  
   fputs("<html>\n<head>\n<title>", ziel);
   fputs(quellname, ziel);
   fputs("</title>\n</head>\n\n<body>\n<pre>\n", ziel);
  
   while(EOF != (z = getc(quelle))){
    if(!flag_kk && !flag_kl){
    switch(z){
       case '<' : {fputs("&lt;", ziel);continue;}
       case '&' : {fputs("&amp;", ziel);continue;}
       case ' ' : case '(' : case '\n' : case ')' : case '[' : case ']' : {zlr = wort[zlr] = 0;
               if(strlen(wort)>1){
            fseek(ziel, -strlen(wort), SEEK_CUR);
            fputs(res_wort(wort), ziel);
            }
            fputc(z, ziel);
            letztes = z;
            /* **!Not-working check for comment ending!** */
            if(flag_kk && '\n' == z){
               flag_kk = 0;
                  fputs("</i></span>", ziel);
            }
            continue;}
       case 39 : {if(flag_s){
                  fputc(z, ziel);
               fputs("</span>", ziel);
               zlr = wort[zlr] = 0;
               flag_s = 0;
               letztes = z;
               continue;
             }
            else    if(!isalpha(letztes))    {fputs("<span style='color : #ff0000'>", ziel);flag_s=1;}}
       /* **!Not-working check for comment beginning!** */
       /*case 47 : {if(47 == letztes){
               flag_kk = 1;
            fseek(ziel, -1, SEEK_CUR);
            fputs("<span style='color : #808080'><i>/", ziel);
             }}
       /*case '*' : {if(47 == letztes){
               flag_kl = 1;
            fseek(ziel, -1, SEEK_CUR);
            fputs("<span style='color : #808080'><i>/", ziel);
             }}*/
    }
    }
    /* **!Not-working check for comment ending!** */
    if(flag_kl && '/' == z && '*' == letztes){
       flag_kl = 0;
       fputs("</i></span>", ziel);
    }
    wort[zlr++] = z;
    fputc(z, ziel);
    letztes=z;
   }
   fputs("</pre>\n</body>\n</html>\n", ziel);
}


besten dank schonmal!
--
main(){int x=0,y=1228443207;for(;x<105;++x,y=x<32?y:x<64?3392743058u:x<96?611502372:137)putchar((x+1)%21?y&1<<x?64:32:10);}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.01.2006, 14:40 Uhr
dirweis



uh, ich seh grad der code ist ja ohne hervorhebung. hoffentlich klappts diesmal

C++:
void konvertieren(FILE *quelle, FILE *ziel, const char *quellname){
   int z, zlr = 0, letztes;
   char wort[MAX_WORD_LEN], flag_s = 0, flag_kk = 0, flag_kl = 0;
  
   fputs("<html>\n<head>\n<title>", ziel);
   fputs(quellname, ziel);
   fputs("</title>\n</head>\n\n<body>\n<pre>\n", ziel);
  
   while(EOF != (z = getc(quelle))){
    if(!flag_kk && !flag_kl){
    switch(z){
       case '<' : {fputs("&lt;", ziel);continue;}
       case '&' : {fputs("&amp;", ziel);continue;}
       case ' ' : case '(' : case '\n' : case ')' : case '[' : case ']' : {zlr = wort[zlr] = 0;
               if(strlen(wort)>1){
            fseek(ziel, -strlen(wort), SEEK_CUR);
            fputs(res_wort(wort), ziel);
            }
            fputc(z, ziel);
            letztes = z;
            /* **!Not-working check for comment ending!** */
            if(flag_kk && '\n' == z){
               flag_kk = 0;
                  fputs("</i></span>", ziel);
            }
            continue;}
       case 39 : {if(flag_s){
                  fputc(z, ziel);
               fputs("</span>", ziel);
               zlr = wort[zlr] = 0;
               flag_s = 0;
               letztes = z;
               continue;
             }
            else    if(!isalpha(letztes))    {fputs("<span style='color : #ff0000'>", ziel);flag_s=1;}}
       /* **!Not-working check for comment beginning!** */
       /*case 47 : {if(47 == letztes){
               flag_kk = 1;
            fseek(ziel, -1, SEEK_CUR);
            fputs("<span style='color : #808080'><i>/", ziel);
             }}
       /*case '*' : {if(47 == letztes){
               flag_kl = 1;
            fseek(ziel, -1, SEEK_CUR);
            fputs("<span style='color : #808080'><i>/", ziel);
             }}*/

    }
    }
    /* **!Not-working check for comment ending!** */
    if(flag_kl && '/' == z && '*' == letztes){
       flag_kl = 0;
       fputs("</i></span>", ziel);
    }
    wort[zlr++] = z;
    fputc(z, ziel);
    letztes=z;
   }
   fputs("</pre>\n</body>\n</html>\n", ziel);
}

--
main(){int x=0,y=1228443207;for(;x<105;++x,y=x<32?y:x<64?3392743058u:x<96?611502372:137)putchar((x+1)%21?y&1<<x?64:32:10);}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: