Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

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
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
αcнερ™
Tvůrce
Avatar
αcнερ™:23.2.2015 16:06

Pekné :)

Avatar
David Novák
Tvůrce
Avatar
Odpovedať
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

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ť
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ť
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 :)

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ť
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ť
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ť
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é
Posledné komentáre sú na spodnej časti poslednej stránky.
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.

Zobrazené 10 správy z 19.