luis0021 Posted April 22, 2012 at 10:51 PM Report #450630 Posted April 22, 2012 at 10:51 PM boas noites ppl. estou com um problema no codigo, no qual, nao sei identificar kal e o erro #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct especialidade { char nome; char descricao; struct especialidade * proximo; // Apontador para o próximo consulta marcada da Lista } e; ..... /* Método Main */ int main() { //escolhaopcoes(); addespecialidade(); return (EXIT_SUCCESS); } ........ void addespecialidade() { FILE *especialidades; especialidades = fopen("especialidades.txt", "a"); if (!especialidades) { printf("Ficheiro não encontrado \n"); return 1; } printf("\nDigite a especialidade: \n>"); scanf("%s", e.nome); printf("\nDigite a descricao da especialidade: \n>"); scanf("%s", e.descricao); fwrite(&e, sizeof (struct especialidade), 1, especialidades); fclose(especialidades); } o erro e este /usr/bin/make -f nbproject/Makefile-Debug.mk SUBPROJECTS= .build-conf make[1]: Entering directory `/cygdrive/c/Users/Luis/Documents/NetBeansProjects/123' /usr/bin/make -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin-Windows/123.exe make[2]: Entering directory `/cygdrive/c/Users/Luis/Documents/NetBeansProjects/123' mkdir -p build/Debug/Cygwin-Windows rm -f build/Debug/Cygwin-Windows/main.o.d gcc.exe -c -g -MMD -MP -MF build/Debug/Cygwin-Windows/main.o.d -o build/Debug/Cygwin-Windows/main.o main.c main.c:182:6: warning: conflicting types for ‘addespecialidade’ main.c:53:5: note: previous implicit declaration of ‘addespecialidade’ was here main.c: In function ‘addespecialidade’: main.c:188:9: warning: ‘return’ with a value, in function returning void main.c:191:17: error: expected expression before ‘e’ main.c:193:17: error: expected expression before ‘e’ main.c:194:13: error: expected expression before ‘e’ main.c:194:13: error: too few arguments to function ‘fwrite’ nbproject/Makefile-Debug.mk:61: recipe for target `build/Debug/Cygwin-Windows/main.o' failed make[2]: *** [build/Debug/Cygwin-Windows/main.o] Error 1 make[2]: Leaving directory `/cygdrive/c/Users/Luis/Documents/NetBeansProjects/123' nbproject/Makefile-Debug.mk:54: recipe for target `.build-conf' failed make[1]: *** [.build-conf] Error 2 make[1]: Leaving directory `/cygdrive/c/Users/Luis/Documents/NetBeansProjects/123' nbproject/Makefile-impl.mk:39: recipe for target `.build-impl' failed make: *** [.build-impl] Error 2 BUILD FAILED (exit value 2, total time: 340ms) obrigado & comprimentos....
pmg Posted April 22, 2012 at 11:01 PM Report #450633 Posted April 22, 2012 at 11:01 PM 1. Corrige o primeiro erro que o gcc te indica. 2. Compila outra vez 3. Volta ao passo 1. No caso especifico acima, o primeiro erro é a dupla definicao da funcao addespecialidade, uma vez na linha 53 e outra na linha 182. Em C, uma funcao so pode ter uma definicao. A definicao na linha 53 é uma definicao implicita por ser a primeira vez que o compilador ve a funcao referenciada (como se tivesse sido declarada como um funcao que devolve um int). Quando, na linha 182 defines a funcao explicitamente devolvendo void, as duas definicoes sao diferentes e o compilador queixa-se. Ou mudas a funcao toda para antes do primeiro uso (a definicao é um prototipo valido) ou forneces um prototipo valido antes do primeiro uso. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
bubulindo Posted April 22, 2012 at 11:16 PM Report #450637 Posted April 22, 2012 at 11:16 PM Assim de repente: linha 188, tens um return numa funcão void. Muda isso para int addespecialidade() e coloca um return 0 no final da funcão. linhas 191 e 193, creio que é por teres %s e não %c e também por não estares a indicar o endereco da variável, mas a variável em si. Não tens aqui o código todo, logo não sei se fizeste isso ou não, mas devias declarar a funcão addespecialidade() antes da main() int addespecialidade(); int main() { //... } int addespecialidade(){ //... } Mas o que deve estar a estragar isto tudo é o typedef. Repara que quando fazes typedef struct especialidade{} e; defines um novo tipo de dados chamado e, mas nunca inicializas uma variável desse tipo. E mais em baixo usas o "e" como uma variável quando na realidade é um tipo. Assim seria mais correcto. typedef struct especialidade { char nome; char descricao; struct especialidade * proximo; // Apontador para o próximo consulta marcada da Lista } e; int main() { e myEspecialidade; addespecialidade(&myEspecialidade); //... } int addespecialidade( e* especialidadePtr) { //... } Já agora, quando usas o typedef, deves tentar dar nomes mais explícitos aos tipos que declaraste. Se não pretenderes declarar um novo tipo, mas uma variável composta chamada e, tira o typedef da instrucão. Info sobre o typedef: http://en.wikipedia.org/wiki/Typedef include <ai se te avio> Mãe () { }
luis0021 Posted April 24, 2012 at 06:48 AM Author Report #451054 Posted April 24, 2012 at 06:48 AM bom dia ppl, Estou tendo um probleminha no programa. quando corro ele pede "Digite a especialidade:" ele escreve, mas quando ele pede "Digite a descricao da especialidade:" ele nao escreve e o programa fecha. O que estou a fazer mal. #include <stdio.h> #include <stdlib.h> #include <string.h> struct especialidade { char nome[25]; char descricao[100]; struct especialidade * proximo; // Apontador para o próximo consulta marcada da Lista } esp; ..... int menu(); int escolhaopcoes(); int addespecialidades(); ..... int main(int argc, char** argv) { //escolhaopcoes(); addespecialidades(); return (EXIT_SUCCESS); } ..... int addespecialidades() { FILE *espec; espec = fopen("especialidades.txt", "a+"); if (!espec) { printf("Ficheiro não encontrado \n"); return 1; } printf("\nDigite a especialidade: \n>"); scanf("%[^\n]s", &esp.nome); fflush(stdin); printf("\nDigite a descricao da especialidade: \n>"); scanf("%[^\n]s", &esp.descricao); fflush(stdin); printf("\n\n----->Especialidade cadastrado com sucesso<-----\n"); fwrite(&esp, sizeof (struct especialidade), 1, espec); fclose(espec); return 0; } obrigado & comprimentos....
pmg Posted April 24, 2012 at 08:20 AM Report #451060 Posted April 24, 2012 at 08:20 AM scanf("%[^\n]s", &esp.nome); NAO! O especificador de conversao "%[...]" lê caracteres (de acordo com o ...) para o array respectivo. É um conversor completo. Tudo o que esteja antes do % ou depois do ] faz parte de outro conversor. No teu caso especifico o s é um conversor para aceitar um 's' literal ... ou seja, como todos os 's' sao "apanhados" pelo conversor "%[^\n]" o scanf nunca encontra um 's' no input e portanto não acaba. Se conseguires deixar de usar o fflush(stdin); fazes o teu programa funcionar em mais computadores. Com essa instrução ele só funciona em Windows. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
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