View Full Version : Problema em C


jorijo
29-05-2007, 16:36
Boas!

Nao consigo meter o seguinte programa a funcionar por erros na indicacao do caminho para aceder aos dados da estrutura alguem em sabe dizer como resolver isso?http://el-teste.iscac.pt/moodle/pix/s/thoughtful.gif


//3.a
struct struct_dados
{
int num_aluno, ano;
char nome[50], curso[3];
};


//3.b
struct struct_dados pede_dados()
{

struct_dados aluno;

printf("Introduza o numero de aluno: ");
scanf("%d",&aluno.num_aluno);
printf("Introduza o nome do aluno: ");
gets(aluno.nome);
printf("Introduza o curso do aluno: ");
gets(aluno.curso);
printf("Introduza o ano do aluno: ");
scanf("%d",&aluno.ano);

return aluno;
}

//funcao nao pedida
mostra_alunos(struct struct_dados *alunof, int num)
{
int i;

for(i=0;i<num;i++)
printf("%d - %s - %s - %d\n",*(alunof+i).num_aluno,*(alunof+i).nome,*(alunof+i ).curso,*(alunof+i).ano);
}

//3.c
main()
{
int i,n;
struct struct_dados *alunos;

printf("Quantos alunos deseja introduzir?");
scanf("%d",&n);

if(!(alunos=(struct_dados*)malloc(n*sizeof(struct_ dados))))
{
printf("Memoria insuficiente!");
exit(1);
}

for(i=0;i<n;i++)
*(alunos+i)=pede_dados();

mostra_alunos(alunos,n);

free(alunos);
}

Myth
29-05-2007, 17:03
//3.a
typedef struct struct_dados
{
int num_aluno, ano;
char nome[50], curso[3];
};


//3.b
struct struct_dados pede_dados()
{
struct struct_dados aluno;

printf("\n###########\nIntroduza o numero de aluno: ");
scanf("%d",&aluno.num_aluno);
printf("Introduza o nome do aluno: ");
scanf("%s",aluno.nome);
printf("Introduza o curso do aluno: ");
scanf("%s",aluno.curso);
printf("Introduza o ano do aluno: ");
scanf("%d",&aluno.ano);

return aluno;
}

//funcao nao pedida
mostra_alunos(struct struct_dados *alunof, int num)
{
int i;

for(i=0;i<num;i++)
printf("%d - %s - %s - %d\n",alunof[i].num_aluno,alunof[i].nome,alunof[i].curso,alunof[i].ano);
}

//3.c
main()
{
int i,n;
struct struct_dados *alunos;

printf("Quantos alunos deseja introduzir?");
scanf("%d",&n);
alunos = (struct struct_dados*) malloc( n * sizeof(struct struct_dados) );
if( alunos == 0 )
{
printf("Memoria insuficiente!");
exit(1);
}

for(i=0;i<n;i++)
alunos[i]=pede_dados();

mostra_alunos(alunos,n);

free(alunos);
}


Em principio isto deve funcionar :P
Para a proxima sê mais claro com o erro (faz copy paste do compilador) e tenta usar pontuação, caso contrário o que escreves pode tornar-se incompreensivel.

jorijo
29-05-2007, 17:40
myth obrigado pela ajuda, mas n consigo correr o programa ah mesma!

o erro de compilacao foi:
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.num_aluno' must have class/struct/union type
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.nome' must have class/struct/union type
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.curso' must have class/struct/union type
D:\ISCAC\Algoritmos e Programação 2\Aulas\Ficha 5\exercicio3.cpp(37) : error C2228: left of '.ano' must have class/struct/union type

Myth
29-05-2007, 17:59
Que versão do VS estás a usar? Experimenta mudar a extenção de cpp, para c. É que, ficheiros com extenção cpp são compilados como se estivesses a usar C++ e não C, o que faz sentido. ;)

De qualquer das formas:
printf("%d - %s - %s - %d\n",alunof[i].num_aluno,alunof[i].nome,alunof[i].curso,alunof[i].ano);
julgo que deveria ser alunof[i]->num_aluno uma vez que é ponteiro. Mas como há uns 10 anos que não uso structs (só uso classes), posso estar enganado. Estranhamente, o meu VS compila e corre bem com o '.' e com o -> dá erro de struct.

jorijo
29-05-2007, 18:44
yap myth tinhas razao!

nao pode ser:
printf("%d - %s - %s - %d\n",*(alunof+i).num_aluno,*(alunof+i).nome,*(alunof+i ).curso,*(alunof+i).ano);

tem q ser:
printf("%d - %s - %s - %d\n",alunof[i].num_aluno,alunof[i].nome,alunof[i].curso,alunof[i].ano);

Nao faz muito sentido uma vez q existem a notacao offset é mais utilizada e deveria funcionar com estruturas mas... quem manda é a maquina!

obrigado! e ja agora se alguem souber explicar a razao agradecia deste conflito agradecia

bugg3d
29-05-2007, 19:30
(...) obrigado! e ja agora se alguem souber explicar a razao agradecia deste conflito agradecia
A razão para isso acontecer é simples: o operador . tem mais prioridade que o operador * (ver http://www.cppreference.com/operator_precedence.html).

Para que funcionasse da maneira que querias fazer inicialmente, terias de ter assim:
printf("%d - %s - %s - %d\n",(*(alunof+i)).num_aluno,(*(alunof+i)).nome,(*(alu nof+i)).curso,(*(alunof+i)).ano);
Alternativamente, ainda poderias fazer assim:
printf("%d - %s - %s - %d\n",(alunof+i)->num_aluno,(alunof+i)->nome,(alunof+i)->curso,(alunof+i)->ano);

jorijo
30-05-2007, 23:19
ok bugg3d (http://www.techzonept.com/member.php?u=7453) tas la! gracias