Jump to content

Recommended Posts

Posted

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....

Posted

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!

Posted

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 () {

}

Posted

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....

Posted
    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!

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.