Erro conflito de tipos

1. Erro conflito de tipos

Ricardo Oliveira Pinheiro
ROP

(usa Ubuntu)

Enviado em 27/11/2016 - 19:21h

O seguinte código está retornando erro de conflito de tipos. Alguém pode me informar onde está o erro:

#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <string.h>

int usage(){
int opt;

printf("_____________________\n");
printf("| Criptografia |\n");
printf("|--------------------|\n");
printf("| 1. Criptografar |\n");
printf("| 2. Descriptografia |\n");
printf("| 3. Sair |\n");
printf("|____________________|\n");
printf("--> ");
scanf("%d", &opt);
system("cls");
return opt;
}

void encrypt(){
char msg[128], chave[128], stringAux[128];
int i, x, len, chavelen, chave_cript;

setbuf(stdin, NULL);

printf("Insira a mensagem a ser criptografada: ");
gets(msg);
printf("Insira a chave: ");
gets(chave);
strcpy(stringAux, msg);
x = strlen(stringAux) - 1;
len = strlen(msg);
chavelen = strlen(chave);
for(i=0;i<len;i++){
msg[i] = stringAux[x];
x--;
}
for(i=0;i<len;i++){
chave_cript = chavelen + selec_num(msg[i]);
if (chave_cript>26){
chave_cript = chave_cript % 26;
}
msg[i] = selec_letra(chave_cript);
}
}
int selec_num(char x){
int num;

switch (x){
case 'a':{
num = 1;
break;
}
case 'b':{
num = 2;
break;
}
case 'c':{
num = 3;
break;
}
case 'd':{
num = 4;
break;
}
case 'e':{
num = 5;
break;
}
case 'f':{
num = 6;
break;
}
case 'g':{
num = 7;
break;
}
case 'h':{
num = 8;
break;
}
case 'i':{
num = 9;
break;
}
case 'j':{
num = 10;
break;
}
case 'k':{
num = 11;
break;
}
case 'l':{
num = 12;
break;
}case 'm':{
num = 13;
break;
}
case 'n':{
num = 14;
break;
}
case 'o':{
num = 15;
break;
}
case 'p':{
num = 16;
break;
}
case 'q':{
num = 17;
break;
}
case 'r':{
num = 18;
break;
}
case 's':{
num = 19;
break;
}
case 't':{
num = 20;
break;
}
case 'u':{
num = 21;
break;
}
case 'v':{
num = 22;
break;
}
case 'w':{
num = 23;
break;
}
case 'x':{
num = 24;
break;
}
case 'y':{
num = 25;
break;
}
case 'z':{
num = 26;
break;
}
}

return num;
}
char selec_letra(int x){
switch (x){
case 1:{
return 'a';
break;
}
case 2:{
return 'b';
break;
}
case 3:{
return 'c';
break;
}
case 4:{
return 'd';
break;
}
case 5:{
return 'e';
break;
}
case 6:{
return 'f';
break;
}
case 7:{
return 'g';
break;
}
case 8:{
return 'h';
break;
}
case 9:{
return 'i';
break;
}
case 10:{
return 'j';
break;
}
case 11:{
return 'k';
break;
}
case 12:{
return 'l';
break;
}
case 13:{
return 'm';
break;
}
case 14:{
return 'n';
break;
}
case 15:{
return 'o';
break;
}
case 16:{
return 'p';
break;
}
case 17:{
return 'q';
break;
}
case 18:{
return 'r';
break;
}
case 19:{
return 's';
break;
}
case 20:{
return 't';
break;
}
case 21:{
return 'u';
break;
}
case 22:{
return 'v';
break;
}
case 23:{
return 'w';
break;
}
case 24:{
return 'x';
break;
}
case 25:{
return 'y';
break;
}
case 26:{
return 'z';
break;
}
}
}
main(){
int opt;

inicio:
opt = usage();

switch (opt){
case 1:{
encrypt();
break;
}
case 2:{
break;
}
default:{
printf("Comando Inválido!!!");
system("cls");
goto inicio;
break;
}
}
}



  


2. Re: Erro conflito de tipos

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/11/2016 - 12:37h

Você está usando um dialeto obsoleto do C. Qual compilador ou ambiente de desenvolvimento você está usando, que aceita essa sintaxe tornada obsoleta já em 1989 (27 anos atrás!)?

Provavelmente você vai resolver seu erro se trocar a ordem da definição das funções, colocando a definição da função encrypt() após as definições de selec_num() e selec_letra().

A causa do erro é que, ao usar as funções antes de as declarar, você autoriza versões obsoletas da linguagem a fazem algumas assunções sobre tipos de dados envolvidos na passagem de parâmetros e valores de retorno. Quando vem a definição da função com características diferentes daquelas que você autorizou o compilador a fazer, os compiladores um pouquinho melhores indicam a discrepância (os mais antigos, os mais simples e os piores talvez até a ignorem, confiando que você sabe o que está fazendo).

Fora esse erro, existem outros problemas no seu código.

Também relacionado a linguagem obsoleta está o fato de você usar uma definição de main() que não respeita nenhuma das duas formas prescritas pelo padrão (a saber: “int main(void)”, se você não quiser que o programa receba argumentos do ambiente de execucação, ou “int main(int argc, char **argv)”, se quiser que os receba).

Além do mais, aquelas longas tripas de código destinadas a transformar letras em números e vice-versa é absolutamente desnecessária. Em C, caracteres são dados inteiros e com características aritméticas. É possível fazer, por exemplo, algo como “'a'+1”, cujo resultado é numericamente igual a “'b'”. Também é possível medir a distância entre caracteres através de uma simples subtração (por exemplo: “'d'-'a'” produz como resultado o valor 3, pois 'd' é disposto três posições após a posição de 'a' na tabela de caracteres). Assim sendo, você pode trocar dezenas de linhas de código por expressões simples, de não mais do que vinte e poucos caracteres de extensão, cabendo numa só linha.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts