NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Mezinárodní den IT společnosti je tady! Pouze nyní můžeš získat 90 % extra kreditů při nákupu od 1199 kreditů s promo kódem AJTACI90. Tak neváhej!

Diskuze – Delcom - Ukázka stavového automatu v C

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
αcнερ™
Tvůrce
Avatar
αcнερ™:23.2.2015 16:06

Pekné :)

Odpovědět
23.2.2015 16:06
. . .
Avatar
David Novák
Tvůrce
Avatar
Odpovědět
23.2.2015 16:07
Chyba je mezi klávesnicí a židlí.
Avatar
αcнερ™
Tvůrce
Avatar
Odpovídá na David Novák
αcнερ™:23.2.2015 16:10

Keby to bolo na Javu tak máš jednoduchý obfuskátor :D

Odpovědět
23.2.2015 16:10
. . .
Avatar
David Novák
Tvůrce
Avatar
David Novák:23.2.2015 16:12

Jej.. Teď koukám, že stav 6 je tam úplně zbytečně.. -_-

To budu muset opravit.. :D

Odpovědět
23.2.2015 16:12
Chyba je mezi klávesnicí a židlí.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na αcнερ™
David Novák:23.2.2015 16:13

obfuskátor? :D to si mám přeložit jak..?

Odpovědět
23.2.2015 16:13
Chyba je mezi klávesnicí a židlí.
Avatar
αcнερ™
Tvůrce
Avatar
Odpovídá na David Novák
αcнερ™:23.2.2015 16:17

Myslím to v dobrom, pretože obfuskátor maže aj komentáre v kóde :)

Odpovědět
23.2.2015 16:17
. . .
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na αcнερ™
David Novák:23.2.2015 16:24

Jj..

Musel jsem si vygooglit, co to znamená.. :[ :D S Javou jsem zatím nikdy nic nedělal.. A to slovo jsem, přiznám se, neznal..

Odpovědět
23.2.2015 16:24
Chyba je mezi klávesnicí a židlí.
Avatar
David Novák
Tvůrce
Avatar
David Novák:23.2.2015 16:51

Tak jsem nakonec čirou náhodou narazil na jeden zásadní nedostatek - když je v kódu někde uvozovka jako znakový literál, tak ji to bere jako začátek řetězce - takže opět přidávám šestý stav.. ale s jiným významem.. :D

Odpovědět
23.2.2015 16:51
Chyba je mezi klávesnicí a židlí.
Avatar
David Novák
Tvůrce
Avatar
David Novák:23.2.2015 17:19

Tak do třetice všeho dobrého.. Ještě jsem zapomněl na \" v řetězcovém literálu.. :(

Obrázek už je aktuální, text a kód čeká na schválení..

Odpovědět
23.2.2015 17:19
Chyba je mezi klávesnicí a židlí.
Avatar
tomisoka
Tvůrce
Avatar
tomisoka:24.2.2015 18:14

Celkem pěkná ukázka stavového automatu.

Část kódu, která by se měla starat o:

./delcom < vstup.c > vystup.c

je odstraněna úmyslně nebo jen nějakým nedopatřením?

Jinak zkusil jsem vytvořit variantu bez stavového automatu a nějak se mi nezdá, že by to bylo složité/nepřeh­ledné:

#include <stdio.h>
#include <stdint.h>

void endStr(FILE *inF, FILE *outF, int ctrlC, uint32_t maxC){
  int in, i=0;
  while((in=fgetc(inF))!=EOF && i<=maxC){
    fputc(in,outF);
    if(in==ctrlC)return;
    if(in=='\\'){
      if((in=fgetc(inF))==EOF)break;
      fputc(in,outF);
    }++i;
  }
}

void endMultiRowCom(FILE*inF, FILE *outF){
  int in;
  while((in=fgetc(inF))!=EOF){
    while(in=='*'){
      if((in=fgetc(inF))==EOF)break;
      if(in=='/')return;
    }if(in=='\n')fputc('\n', outF);
  }
}

void delcom(FILE *inF, FILE*outF){
  int in;
  while((in=fgetc(inF))!=EOF){
    if(in=='\"'){
      fputc('\"', outF);
      endStr(inF, outF, '\"',-1);
    }else if(in=='\''){
      fputc('\'', outF);
      endStr(inF, outF, '\'', 1);
    }else if(in=='/'){
      if((in=fgetc(inF))==EOF)break;
      if(in=='*')endMultiRowCom(inF, outF);
      else if(in=='/'){/*
        if((in=fgetc(inF))==EOF)break;
        if(in=='*'){
          fputc('/', outF);
          endMultiRowCom(inF, outF);
        }else{*/
          while((in=fgetc(inF))!=EOF)if(in=='\n')break;
          fputc('\n', outF);
        //}
      }
      else{
        fputc('/', outF);
        fputc(in, outF);
        if(in=='\"')endStr(inF, outF, '\"',-1);
        if(in=='\'')endStr(inF, outF, '\'',1);
      }
    }else fputc(in, outF);
  }
}

int main(int argc, char **argv){
  FILE *inF, *outF;

  if(!(inF = fopen(argv[1], "r")))fprintf(stderr, "Input file cannot be open!\n");
  if(!(outF = fopen(argv[2], "w")))fprintf(stderr, "Output file cannot be open!\n");

  delcom(inF, outF);

  fclose(inF);
  fclose(outF);
  return 0;
}

Zakomentoval jsem tam část starající se o případy jako:

a = b //* tady dělím */c;

Přijde mi to jako zbytečné, nikdo to neudělá a i GCC vezme ten řádkový komentář.

Editováno 24.2.2015 18:16
 
Odpovědět
24.2.2015 18:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 19.