From 5c42c4594521a400794c1b1ebcb914e975003596 Mon Sep 17 00:00:00 2001 From: mthsrnn Date: Thu, 3 Oct 2024 15:48:37 -0300 Subject: [PATCH 1/4] more variables --- .gdb_history | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 2 +- gdb-split.sh | 11 ++++++ src/eval.c | 12 +++++-- src/inputproc.c | 2 +- src/parser.c | 2 +- src/transicoes.c | 25 +++++++------ 7 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 .gdb_history create mode 100755 gdb-split.sh diff --git a/.gdb_history b/.gdb_history new file mode 100644 index 0000000..c777ccd --- /dev/null +++ b/.gdb_history @@ -0,0 +1,92 @@ +r +n +n +q +clear +q +r 'abcdefghijklmnopqrstuvwxyz' +q +ls +r 'abcdefghijklmnopqrstuvwxyzABCDE' +q +file AT +r 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN' +q +file at +file AT +r 'abcdefghijklmnopqrstuvwxyzABCDE' +r 'abcdefghijklmnopqrstuvwxyzABCD' +r 'abcdefghijklmnopqrstuvwxyzABCDE' +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +break transicoes.c:imprimeArcos +r 'abcdefghijklmnopqrstuvwxyzABCDEF' + +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +n +n +n +q +file at +file AT +break transicoes.c:19 +r 'abcdefghijklmnopqrstuvwxyzABC' +r 'abcdefghijklmnopqrstuvwxyzABCDEFG' +c +c +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +n +c +c +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +n +c +print SIZE_MAX +print tabelaVerdade +print tabelaVerdade[] +print tabelaVerdade[0] +print tabelaVerdade[2147] +print tabelaVerdade[2147483684] +print tabelaVerdade[2147483683] +print tabelaVerdade[2147483682] +print tabelaVerdade[2147483681] +print tabelaVerdade[2147483680] +clear +q +file AT +break transicoes.c:imprimeArcos +r 'abcdefghijklmnopqrstuvwxyzABCDE' +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +c +q +file AT +break geraTabela +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +n +e +end +break +c +c +r 'abcdefghijklmnopqrstuvwxyzABCD' +n +n +n +q +file AT +break geraTabela +r 'abcdefghijklmnopqrstuvwxyzABCDE' +n +q +file AT +break geraTabela +r 'abcdefghijklmnopqrstuvwxyzABCDE' +n +c +r 'abcdefghijklmnopqrstuvwxyzABCD' +n +:q +q +file AT +r 'abcdefghijklmnopqrstuvwxyzABCDEF' +q diff --git a/Makefile b/Makefile index 42e45f5..24c42e8 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ else endif CC := gcc -CFLAGS := -Wall -Wextra -std=c11 -Isrc +CFLAGS := -Wall -Wextra -std=c11 -Isrc -g3 $(ARQUIVO): transicoes.o eval.o parser.o main.o inputproc.o $(CC) $^ -o $@ $(LIBS) diff --git a/gdb-split.sh b/gdb-split.sh new file mode 100755 index 0000000..3c43376 --- /dev/null +++ b/gdb-split.sh @@ -0,0 +1,11 @@ +#!/bin/zsh + +gdb-tmux() { + local id="$(tmux split-pane -hPF "#D" "tail -f /dev/null")" + tmux last-pane + local tty="$(tmux display-message -p -t "$id" '#{pane_tty}')" + gdb -ex "dashboard -output $tty" "$@" + tmux kill-pane -t "$id" +} + +gdb-tmux diff --git a/src/eval.c b/src/eval.c index 1c29ca3..a79afb5 100644 --- a/src/eval.c +++ b/src/eval.c @@ -1,12 +1,18 @@ #include "eval.h" #include "estruturas.h" #include +#include unsigned char *geraTabela(Nodo *arvore, int quantasEntradas, char *entradas) { - unsigned long int tamanhoVetor = 1 << quantasEntradas; + unsigned long int tamanhoVetor = 1ULL << quantasEntradas; unsigned char *tabelaVerdade = calloc((tamanhoVetor),sizeof(unsigned char)); // inicia o vetor de resultados com 2^n - for (unsigned int i = 0; i < tamanhoVetor; i++) { + if (tabelaVerdade == NULL) { + puts("Falha na alocação da tabela verdade."); + exit(-1); + } + + for (unsigned long int i = 0; i < tamanhoVetor; i++) { tabelaVerdade[i] = percorreArvore(arvore, entradas, quantasEntradas, i); } @@ -29,7 +35,7 @@ unsigned char procuraZero(Nodo *raiz, char *variaveis, int quantasEntradas, unsi int i, j; unsigned long int bit; for (i = 0; i < raiz->quantosFilhos; i++) { - if (raiz->filhos[i]->conteudo >= 'a' && raiz->filhos[i]->conteudo <= 'z') { + if ((raiz->filhos[i]->conteudo >= 'a' && raiz->filhos[i]->conteudo <= 'z') || (raiz->filhos[i]->conteudo >= 'A' && raiz->filhos[i]->conteudo <= 'Z')) { for (j = 0; j < quantasEntradas; j++) { if (variaveis[j] == raiz->filhos[i]->conteudo) { bit = quantasEntradas - j - 1; diff --git a/src/inputproc.c b/src/inputproc.c index 52236a9..b69f304 100644 --- a/src/inputproc.c +++ b/src/inputproc.c @@ -22,7 +22,7 @@ int processaVariaveis(char *entrada, char ** saidaLista) { char c; Lista *itemAnterior, *novoItem; for (i = 0; ((c = entrada[i]) != '\0'); i++) { - if (c >= 'a' && c <= 'z') { + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { for (itemAnterior = lista; ((itemAnterior->proximo != NULL) && (itemAnterior->proximo->conteudo < c)); itemAnterior = itemAnterior->proximo); diff --git a/src/parser.c b/src/parser.c index 8fe814c..636ad33 100644 --- a/src/parser.c +++ b/src/parser.c @@ -94,7 +94,7 @@ Nodo* criaArvore(char * entrada){ pilhaPush(operadores, novoNodo); } - if (c >='a' && c <= 'z'){ + if ((c >='a' && c <= 'z') || (c >= 'A' && c <= 'Z')){ novoNodo = criaNodo(c); if (operadores->tamanho > 0 && operadores->nodos[operadores->tamanho-1]->conteudo == '!'){ adicionaFilho(operadores->nodos[operadores->tamanho-1], novoNodo); diff --git a/src/transicoes.c b/src/transicoes.c index c912058..e0f4537 100644 --- a/src/transicoes.c +++ b/src/transicoes.c @@ -4,29 +4,32 @@ void imprimeArcos (unsigned char * tabelaVerdade, char * operandos, int quantosOperandos){ - int peso, i, j, k, l = 0; - long unsigned int indiceTabela = 0; + unsigned long int peso, i, j, l = 0; + int k; + unsigned long int indiceTabela = 0, indiceTabelaArco; + unsigned long int tamanhoVetor = quantosOperandos - 1ULL; - char *arco = calloc(sizeof(char), quantosOperandos+1); + char *arco = calloc(sizeof(char), quantosOperandos+1ULL); if (arco == NULL){ fputs("Nao foi possivel alocar memoria para a tabela verdade", stderr); exit(EXIT_FAILURE); } - for (i = 0; i < quantosOperandos; i++) { - for (j = 0; j < (1 << (quantosOperandos - 1)); j++) { - for (k = quantosOperandos-1; k >= 0; k--) { - peso = (quantosOperandos - 1) - k; - if (k != i) { - indiceTabela += ((j & 1 << l) >> l) * (1 << peso); //faz o l - arco[k] = '0' + ((j & 1 << l) >> l); + for (i = 0; i < (unsigned long int)quantosOperandos; i++) { + for (j = 0; j < (unsigned long int)(1ULL << tamanhoVetor); j++) { + for (k = quantosOperandos-1ULL; k >= 0; k--) { + peso = (quantosOperandos - 1ULL) - k; + if ((unsigned int)k != i) { + indiceTabela += ((j & 1ULL << l) >> l) * (1ULL << peso); //faz o l + arco[k] = '0' + ((j & 1ULL << l) >> l); l++; continue; } arco[k]=operandos[i]; } - if(tabelaVerdade[indiceTabela] != tabelaVerdade[indiceTabela + (1 << ((quantosOperandos - 1) - i))]){ + indiceTabelaArco = indiceTabela + (unsigned long int)(1ULL << (tamanhoVetor - i)); + if(tabelaVerdade[indiceTabela] != tabelaVerdade[indiceTabelaArco]){ printf("%s\n", arco); } l = 0; From 99fcc0fe4203b72008b975cf4599929c8d1afcf9 Mon Sep 17 00:00:00 2001 From: mthsrnn Date: Thu, 3 Oct 2024 16:21:17 -0300 Subject: [PATCH 2/4] updated files and bugfixes --- .gdb_history | 92 +++++++++++------------------------------------- src/eval.c | 3 ++ src/main.c | 2 -- src/transicoes.c | 4 +-- 4 files changed, 25 insertions(+), 76 deletions(-) diff --git a/.gdb_history b/.gdb_history index c777ccd..759adc1 100644 --- a/.gdb_history +++ b/.gdb_history @@ -1,92 +1,40 @@ -r -n -n -q -clear -q -r 'abcdefghijklmnopqrstuvwxyz' -q -ls -r 'abcdefghijklmnopqrstuvwxyzABCDE' -q -file AT -r 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN' q -file at file AT -r 'abcdefghijklmnopqrstuvwxyzABCDE' -r 'abcdefghijklmnopqrstuvwxyzABCD' -r 'abcdefghijklmnopqrstuvwxyzABCDE' -r 'abcdefghijklmnopqrstuvwxyzABCDEF' -r 'abcdefghijklmnopqrstuvwxyzABCDEF' -break transicoes.c:imprimeArcos -r 'abcdefghijklmnopqrstuvwxyzABCDEF' - -r 'abcdefghijklmnopqrstuvwxyzABCDEF' +break geraTabela +r 'abcdefghijklmnopqrstuvwxyzABCDEFGH' n n n -q -file at -file AT -break transicoes.c:19 -r 'abcdefghijklmnopqrstuvwxyzABC' -r 'abcdefghijklmnopqrstuvwxyzABCDEFG' -c -c -r 'abcdefghijklmnopqrstuvwxyzABCDEF' n c -c -r 'abcdefghijklmnopqrstuvwxyzABCDEF' +r 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL' +n +n +n +n +n +n +n n -c -print SIZE_MAX -print tabelaVerdade -print tabelaVerdade[] -print tabelaVerdade[0] -print tabelaVerdade[2147] -print tabelaVerdade[2147483684] -print tabelaVerdade[2147483683] -print tabelaVerdade[2147483682] -print tabelaVerdade[2147483681] -print tabelaVerdade[2147483680] -clear -q -file AT -break transicoes.c:imprimeArcos -r 'abcdefghijklmnopqrstuvwxyzABCDE' -r 'abcdefghijklmnopqrstuvwxyzABCDEF' -c -q -file AT -break geraTabela -r 'abcdefghijklmnopqrstuvwxyzABCDEF' n -e -end -break -c -c -r 'abcdefghijklmnopqrstuvwxyzABCD' n n n -q -file AT -break geraTabela -r 'abcdefghijklmnopqrstuvwxyzABCDE' n q file AT -break geraTabela -r 'abcdefghijklmnopqrstuvwxyzABCDE' +break imprimeArcos +r 'abcdefghijklmnopqrstuvwxyzABCDEFGH' +n +break transicoes.c:19 +c +n +c +c n +q +c c -r 'abcdefghijklmnopqrstuvwxyzABCD' n -:q q -file AT -r 'abcdefghijklmnopqrstuvwxyzABCDEF' q diff --git a/src/eval.c b/src/eval.c index a79afb5..9a9a320 100644 --- a/src/eval.c +++ b/src/eval.c @@ -12,6 +12,9 @@ unsigned char *geraTabela(Nodo *arvore, int quantasEntradas, char *entradas) { exit(-1); } + // FOR DEBUGGING PURPOSES ONLY: retornar o vetor com antecedência pra fazer um ablubluble no transicoes.c + return tabelaVerdade; + for (unsigned long int i = 0; i < tamanhoVetor; i++) { tabelaVerdade[i] = percorreArvore(arvore, entradas, quantasEntradas, i); } diff --git a/src/main.c b/src/main.c index 8cd0c58..d212e01 100644 --- a/src/main.c +++ b/src/main.c @@ -19,6 +19,4 @@ int main(int argc, char *argv[]) { free(tabelaVerdade); } return EXIT_SUCCESS; - - return 0; } diff --git a/src/transicoes.c b/src/transicoes.c index e0f4537..55f9f45 100644 --- a/src/transicoes.c +++ b/src/transicoes.c @@ -18,10 +18,10 @@ void imprimeArcos (unsigned char * tabelaVerdade, char * operandos, int quantosO for (i = 0; i < (unsigned long int)quantosOperandos; i++) { for (j = 0; j < (unsigned long int)(1ULL << tamanhoVetor); j++) { - for (k = quantosOperandos-1ULL; k >= 0; k--) { + for (k = quantosOperandos - 1; k >= 0; k--) { peso = (quantosOperandos - 1ULL) - k; if ((unsigned int)k != i) { - indiceTabela += ((j & 1ULL << l) >> l) * (1ULL << peso); //faz o l + indiceTabela += ((j & 1ULL << l) >> l) * (1ULL << peso); //faz o (UL)l arco[k] = '0' + ((j & 1ULL << l) >> l); l++; continue; From 121db95263d1be22807ee246e587a09acba60c2d Mon Sep 17 00:00:00 2001 From: mthsrnn Date: Thu, 3 Oct 2024 16:34:27 -0300 Subject: [PATCH 3/4] remmoved debug statement --- README.md | 14 +++++++++----- src/eval.c | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4b17a15..2619157 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,17 @@ # AT -Calculadora de arcos de transição desenvolvida em C. +Calculadora de arcos de transição desenvolvida em C. Inclui um parser e um avaliador de expressão booleana. +A entrada deve ser uma soma de produtos, composta por caracteres maiúsculos ou minúsculos do alfabeto latino. Exemplo: `'a*b + !a*c'` +Observação: o programa não verifica limites teóricos de execução, porém, observe que armazenar uma tabela verdade requer espaço `2^n` bytes, em que `n` representa a quantidade de variáveis atômicas. ## Como utilizar ### No Linux é necessário ter o `git` e o `gcc` instalados -1) faça `clone` do repositório +1) faça `clone` do repositório e acesse o diretório `AT` ``` $ git clone https://github.com/gckneip/AT.git +$ cd AT ``` 2) compile ``` @@ -16,16 +19,17 @@ $ make ``` 3) execute o programa, passando a expressão booleana como argumento de execução -**OBS:** utilize aspas simples +**OBS:** utilize aspas simples para evitar o processamento indevido do caracter "!" ``` $ ./AT 'a*b+!a*c' ``` ### No Windows é necessário ter o `git` e o `minGW` instalados e configurados na variavel `PATH` do sistema -1) faça `clone` do repositório +1) faça `clone` do repositório e acesse a pasta `AT` ``` $ git clone https://github.com/gckneip/AT.git +$ cd AT ``` 2) compile ``` @@ -33,7 +37,7 @@ $ mingw32-make ``` 3) execute o programa, passando a expressão booleana como argumento de execução -**OBS:** utilize aspas simples +**OBS:** utilize aspas simples para evitar o processamento indevido do caracter "!" ``` $ ./AT 'a*b+!a*c' ``` diff --git a/src/eval.c b/src/eval.c index 9a9a320..ec8feac 100644 --- a/src/eval.c +++ b/src/eval.c @@ -13,7 +13,7 @@ unsigned char *geraTabela(Nodo *arvore, int quantasEntradas, char *entradas) { } // FOR DEBUGGING PURPOSES ONLY: retornar o vetor com antecedência pra fazer um ablubluble no transicoes.c - return tabelaVerdade; + // return tabelaVerdade; for (unsigned long int i = 0; i < tamanhoVetor; i++) { tabelaVerdade[i] = percorreArvore(arvore, entradas, quantasEntradas, i); From db76a47f195bd82dd34572c59d14987946ab1b0b Mon Sep 17 00:00:00 2001 From: mthsrnn Date: Thu, 3 Oct 2024 16:40:49 -0300 Subject: [PATCH 4/4] removed debug statement 2 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 24c42e8..fc006d1 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ else endif CC := gcc -CFLAGS := -Wall -Wextra -std=c11 -Isrc -g3 +CFLAGS := -Wall -Wextra -std=c11 -Isrc $(ARQUIVO): transicoes.o eval.o parser.o main.o inputproc.o $(CC) $^ -o $@ $(LIBS)