IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – Delcom - Ukážka stavového automatu v C

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

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

Pekné :)

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

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

Odpovedať
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

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

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

Odpovedať
23.2.2015 16:13
Chyba je mezi klávesnicí a židlí.
Avatar
αcнερ™
Tvůrce
Avatar
Odpovedá 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 :)

Odpovedať
23.2.2015 16:17
. . .
Avatar
David Novák
Tvůrce
Avatar
Odpovedá 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..

Odpovedať
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

Odpovedať
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í..

Odpovedať
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ář.

Editované 24.2.2015 18:16
 
Odpovedať
24.2.2015 18:14
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!