trovasecantigas Posted February 12, 2017 at 05:36 PM Report Share #602446 Posted February 12, 2017 at 05:36 PM Boa tarde a todos. Tenho evitado chatear a malta a perguntar coisas sobre as quais tenho obrigação de descobrir mas já ando com a cabeça à volta há alguns dias e não passo da sepa torta. Estou a desenvolver um programa em C que contem structs e ficheiros binários. Apesar de quando o programa corria não gravar corretamente a informação como eu pretendia, nem consultar, editar, etc, agora é que ele não corre de tudo. Tudo porque surge um erro na compilação indicado que a referencia à função 'x' está indefinida. Ora, se tenho o prototype devidamente assinalado, se tenho a função corretamente lá em baixo no alçapão, porque é que no ...switch case... ele não me aceita? E há 4 dias aceitava? Da-se! Peço desculpa mas caramba, não consigo resolver isto tão básico? quero eu ser programador? Apetece-me rebentar com o computador. Alguém me pode ajudar? Desejo desde já um bom Domingo a todos. Eis o código: #include <stdio.h> #include <stdlib.h> //#include <conio.h> #include <locale.h> #include <string.h> //estrutura struct cliente{ double numero; char nome[30]; int idade; double cc; double tlf; double nif; }; struct cliente cli; //PROTOTYPES void inic(); void screenheader(); void intro(); void inserirCliente(); void listarCliente(); void editarCliente(); void eliminarCliente(); void pesquisarCliente(); short clienteExiste(); FILE *fp; //==============================main======================================= int main () { setlocale(LC_ALL, ""); int op; //escolher opção char res; //resposta escolhida screenheader(); intro(); do { screenheader(); printf("\n\n\n Escolha uma opção:\n"); printf(" 1. Pesquisar Cliente\n"); printf(" 2. Listar Cliente\n"); printf(" 3. Inserir cliente\n"); printf(" 4. Editar Cliente\n"); printf(" 5. Eliminar Cliente\n"); printf(" 9. Exit\n"); scanf("%d",&op); switch(op) { case 1 : pesquisarCliente(); break; case 2 : listarCliente(); break; case 3 : inserirCliente(); break; case 4 : editarCliente(); break; case 5 : eliminarCliente(); break; case 9:exit(0); default:printf("\n\n\nErro!!!!\n\nInsira uma opção válida, sff."); getchar(); } printf("\n\nDo you want to continue:"); fflush(stdin); scanf("%c",&res); } while(res=='y'||res=='Y'); return 0; } void screenheader() { printf("\n :::::::::::::::::::::::::::::::::::::"); printf("\n :: ::"); printf("\n :: @@@@@@@@@@@@@@@@@@@@@@@ ::"); printf("\n :: @ @ ::"); printf("\n :: @ @ ::"); printf("\n :: @ BEM-VINDO @ ::"); printf("\n :: @ @ ::"); printf("\n :: @ @ ::"); printf("\n :: @@@@@@@@@@@@@@@@@@@@@@@ ::"); printf("\n :: ::"); printf("\n :::::::::::::::::::::::::::::::::::::\n\n"); } void intro() { printf("\n\t Avenida Almirantes Reis, Cidade Lisboa,\n\t\t\t\t Portugal "); printf("\n\n TEL. No.:211-272239"); printf("\n\n\n OLÁ"); printf("\n\n\n\tEste Hotel de 5 Estrelas em pleno coração de Lisboa está preparado para lhe oferecer toda a comodidade e transformar a sua visita numa estadia memorável. Com uma vista magnífica e extensos jardins ao ar livre, provaremos que este é o seu destino de sonho para qualquer amante de viagens."); printf("\n\n\tO Hotel tem os quartos diversificadamente decorados para que possa escolher aquele que se adequa mais a si. Se viaja em negócios o Corinthias Hotel estará preparado para satisfazer todas as suas necessidades de forma cómoda como se de uma viagem de lazer se tratasse.Todos os quartos estão equipados com ar condicionado."); printf("\n\n DISFRUTE das nossas condições!\n"); printf("\n\t\t\t1. Serviço de Quartos 24h/dia.\n"); printf("\t\t\t2. 12 Elevadores.\n"); printf("\t\t\t3. 2 Parques de estacionamento.\n"); printf("\t\t\t4. Segurança 24h\n"); printf("\t\t\t5. Piscina de Água quente e fria.\n"); printf("\t\t\t6. Serviço de Internet Gratuito.\n"); printf("\t\t\t7. Serviço de lavandaria 24h.\n"); printf("\t\t\t8. Passeio Turístico pela Cidade.\n"); printf("\nPressione uma Tecla para continuar:"); getchar(); } void inserirCliente() { FILE *fp; system("cls"); short numFirst; char confirm, c; int n, i; printf("\nQuantos registos pretende adicionar?"); scanf("%d", &n); for (i=0; i<n; i++) { printf("\n\n******************************** Novo Cliente *******************************************"); fp = fopen("clientes.dat", "a+b"); if (fp==NULL) { printf("\nErro!\nO ficheiro não foi aberto."); } printf("\nDigite os dados do Novo Cliente: "); printf("\nNome: "); fflush(stdin); gets(cli.nome); printf("\nIdade: "); fflush(stdin); scanf("%d", &cli.idade); printf("\nNúmero Cartão de Crédito: "); fflush(stdin); scanf("%lf", &cli.cc); printf("\nTelefone: "); fflush(stdin); scanf("%lf", &cli.tlf); printf("\nNIF: "); fflush(stdin); scanf("%lf", &cli.nif); printf("\nConfirma a inserção de todos os novos dados? (s/n) "); while (confirm == 'S' || confirm == 's') { fp = fopen("clientes.dat", "a"); if(!fp) { printf("\nErro no acesso aos dados!\n\nDigite nova tecla para encerrar o programa."); exit(0); } fwrite(&cli, sizeof(cli), 1, fp); fclose(fp); printf("\nO Novo Cliente foi inserido com sucesso!"); } while (confirm == 'n' || confirm == 'N') { printf("\nA Inserção dos Novos dados foi cancelada."); } printf("\n\nPrima ENTER para voltar ao Menu Inicial"); fflush(stdin); getchar(); } void listarCliente(){ system("cls"); printf("\n****************************************** Lista de Clientes ******************************************"); fp = fopen("clientes.dat", "r"); while (fread(&cli, sizeof(cli), 1, fp)) { printf("\n\nNúmero: %lf", cli.numero); printf("\nNome: %s", cli.nome); printf("\nIdade: %d", cli.idade); printf("\nNovo Cartão de Crédito: %lf", cli.cc); printf("\nTelefone: %lf", cli.tlf); printf("\nNIF: %lf", cli.nif); } fclose(fp); printf("\n\nPrima ENTER para voltar ao menu .."); fflush(stdin); getchar(); } void editarCliente() { int i, reg, numCliente; short iFound = 0; char confirm; system("cls"); printf("\n********************************************* Editar Cliente *********************************************"); fp = fopen("clientes.dat", "r+"); if (!fp) { printf("\nErro no acesso aos dados!\nDigite uma tecla para terminar o programa."); i = getchar(); exit(0); } printf("\n\nIntroduza o número de cliente que pretende Editar: "); scanf("%d", &numCliente); reg = 0; while (fread(&cli, sizeof(cli), 1, fp)) { if (cli.numero == numCliente){ iFound = 1; printf("\nNome: %s", cli.nome); printf("\nIdade: %d", cli.idade); printf("\nTelefone: %lf", cli.tlf); printf("\nNIF: %lf", cli.nif); printf("\n\nNovo Nome: "); fflush(stdin); gets(cli.nome); printf("\nNova Idade: "); fflush(stdin); scanf("%d", &cli.idade); printf("\nNovo Cartão de Crédito: "); fflush(stdin); scanf("%lf", &cli.cc); printf("\nNovo Telefone: "); fflush(stdin); scanf("%lf", &cli.tlf); printf("\nNovo Nif: "); fflush(stdin); scanf("%lf", &cli.nif); printf("\nConfirma alteração dos dados (s/n) ? "); fflush(stdin); confirm = getchar(); while (confirm == 's'){ fseek(fp, reg*sizeof(cli), SEEK_SET); fwrite(&cli, sizeof(cli), 1, fp); fclose(fp); printf("\nCliente alterado com sucesso !"); } } reg++; } fclose(fp); if (iFound == 0){ printf("\nO Cliente não foi encontrado."); printf("\n\nPrima ENTER para voltar ao menu .."); fflush(stdin); getchar(); } } void eliminarCliente(void){ FILE *temp; int i; double numCliente; short deleted = 0; char confirm; system("cls"); printf("\n******************************************* Eliminar Cliente *******************************************"); printf("\n\nIntroduza o Número de Cliente que pretende Eliminar: "); scanf("%lf", &numCliente); fp = fopen("alunos.dat", "r"); if (!fp){ printf("\nErro no acesso aos dados!\nPrima uma tecla para terminar o programa."); i = getchar(); exit(0); } temp = fopen("temp.dat", "a"); if (!fp){ printf("\nErro no acesso aos dados!\nPrima uma tecla para terminar o programa."); i = getchar(); exit(0); } while (fread(&cli, sizeof(cli), 1, fp)){ if (cli.numero != numCliente) fwrite(&cli, sizeof(cli), 1, temp); else { printf("\nConfirma a eliminação do Cliente Nº: %lf - %s ? (s/n) :", cli.numero, cli.nome); fflush(stdin); confirm = getchar(); if (confirm == 's'){ deleted = 1; } else { printf("\nEliminação cancelada!"); deleted = -1; break; } } fflush(stdin); } fclose(fp); fclose(temp); if (deleted == 1){ remove("clientes.dat"); rename("temp.dat", "clientes.dat"); printf("\nCliente eliminado !"); } else if (deleted == 0) printf("\nCliente não encontrado."); else if(deleted == -1) remove("temp.dat"); printf("\n\nPrima ENTER para voltar ao Menu Inicial"); fflush(stdin); getchar(); } void pesquisarCliente(){ int numCliente; short found = 0; system("cls"); printf("\n******************************************* Pesquisar Cliente *******************************************"); printf("\n\nIntroduza o Nº de Cliente: "); scanf("%d", &numCliente); fp = fopen("clientes.dat", "rb"); while ((fread(&cli, sizeof(cli), 1, fp) == 1)){ printf("\nNúmero: %lf", cli.numero); printf("\nNome: %s", cli.nome); printf("\nCartão de Crédito: %lf", cli.cc); printf("\nTelefone: %lf", cli.tlf); printf("\nNIF: %lf", cli.nif); found = 1; break; } fclose(fp); printf("\nO Cliente não foi encontrado."); printf("\n\nPrima ENTER para voltar ao Menu Inicial"); fflush(stdin); getchar(); } } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 12, 2017 at 05:42 PM Report Share #602447 Posted February 12, 2017 at 05:42 PM qual a mensagem apresentada pelo compilador e qual a linha de código referente a mensagem IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
trovasecantigas Posted February 12, 2017 at 05:48 PM Author Report Share #602448 Posted February 12, 2017 at 05:48 PM No main, no switch(op) { case 1:pesquisarcliente(); break; E em todos os outros cases excepto no inserirCliente diz: "undefined reference to "nome da funçao" } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 12, 2017 at 05:53 PM Report Share #602449 Posted February 12, 2017 at 05:53 PM eu quando pedi a mensagem do compilador estava a espera de um copy-paste IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
trovasecantigas Posted February 12, 2017 at 06:00 PM Author Report Share #602450 Posted February 12, 2017 at 06:00 PM Sim, eu bem tentei, mas o copy paste só copia o código e nao as mensagens de erro. Bem que queria aqui adicionar um print screen mas nao está fácil. Link to comment Share on other sites More sharing options...
Rui Carlos Posted February 12, 2017 at 06:07 PM Report Share #602451 Posted February 12, 2017 at 06:07 PM 1 minuto atrás, trovasecantigas disse: Bem que queria aqui adicionar um print screen mas nao está fácil. Mensagens de erro são de colocar como texto e não como imagem! Compilando o programa na linha de comandos, facilmente copias as mensagens de erro. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
trovasecantigas Posted February 12, 2017 at 06:12 PM Author Report Share #602452 Posted February 12, 2017 at 06:12 PM /tmp/ccm3ISix.o: In function `inserirCliente': main.c:(.text+0x3a0): warning: the `gets' function is dangerous and should not be used. /tmp/ccm3ISix.o: In function `main': main.c:(.text+0xba): undefined reference to `pesquisarCliente' main.c:(.text+0xc6): undefined reference to `listarCliente' main.c:(.text+0xde): undefined reference to `editarCliente' main.c:(.text+0xea): undefined reference to `eliminarCliente' collect2: error: ld returned 1 exit status Link to comment Share on other sites More sharing options...
Rui Carlos Posted February 12, 2017 at 07:03 PM Report Share #602455 Posted February 12, 2017 at 07:03 PM Aproveito para deixar aqui as mensagens de erro dadas pelo clang, que é um pouco mais restritivo na interpretação do standard do C. Citação main.c:204:21: error: function definition is not allowed here void listarCliente(){ ^ main.c:233:1: error: function definition is not allowed here { ^ main.c:317:27: error: function definition is not allowed here void eliminarCliente(void){ ^ main.c:392:24: error: function definition is not allowed here void pesquisarCliente(){ ^ 4 errors generated. Sugiro-te que tentes também indentar devidamente o código (há ferramentas que fazem isso automaticamente por ti). Penso que o teu erro se tornará óbvio (em geral, ter o código indentado correctamente ajuda a prevenir erros). Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
trovasecantigas Posted February 12, 2017 at 07:08 PM Author Report Share #602457 Posted February 12, 2017 at 07:08 PM Obrigado, Sr. Rui Carlos. 🙂 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now