Jump to content
Fórum Script Brasil
  • 0

função com ponteiro de struct


Clau Gueno

Question

Olá, eu comecei a estudar C a pouco tempo e estou com dúvida no seguinte código:

// Eu declarei no inicio uma struct Turma turma e dentro dela outra struct Aluno aluno

typedef struct Turma TipoTurma;

typedef struct Aluno TipoAluno;

int main(void) {

int status;

ini(TipoTurma);

for (;;) {

status = menu();

switch (status) {

case 1:

adiciona_cadastro(TipoTurma);

break;

case 2:

busca_aluno(TipoTurma);

break;

case 3:

exclui_cadastro(TipoTurma);

break;

case 4:

exit(0);

break;

}

}

}

Então, esta é a main do meu programa! Mas ela retorna o seguinte ERRO: diz que há poucos argumentos pras funções( essas funções eu já tenho desenvolvidas em outra parte do código, e nelas eu coloquei como parâmetro: (TipoTurma *turma)).

Enfim, os únicos erros que dão são o mesmo...um em cada linha que eu uso as funções que criei.

não sei o que fazer! Alguém tem ideia de como resolvo isso? .-.

Obrigada, desde já!

=D

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Você definiu as structs como 'TipoTurma' e 'TipoAluno', mas eu não ví nenhuma declaração de veriáveis destes tipos. Você deve criá-las e submetê-las ás suas funções.

Pelo que entendi, você está submetendo o tipo às funções, e isso não faz sentido. É a mesma coisa que enviar 'int', 'float' ou 'void' como parâmetro para uma função.

Link to comment
Share on other sites

  • 0
Você definiu as structs como 'TipoTurma' e 'TipoAluno', mas eu não ví nenhuma declaração de veriáveis destes tipos. Você deve criá-las e submetê-las ás suas funções.

Pelo que entendi, você está submetendo o tipo às funções, e isso não faz sentido. É a mesma coisa que enviar 'int', 'float' ou 'void' como parâmetro para uma função.

hummmmm eu criei as structs assim:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAX_CADASTROS 30

#define MAX_TURMAS 6

#define MAX_MAT 10

#define MAX_PROVA 3

typedef struct Aluno TipoAluno;

struct Aluno {

char matricula[MAX_MAT];

char prova1[MAX_PROVA];

char prova2[MAX_PROVA];

char prova3[MAX_PROVA];

};

typedef struct Turma TipoTurma;

struct Turma {

int cod_turma;

TipoAluno aluno[MAX_CADASTROS];

};

e usei assim nas funções...por foi o único jeito, dentre os quais eu fui tentando que fez a função que eu criei, não apresentar nenhum bug,erro,warning etc.

Por exemplo nessa aqui:

//vê se o turma e aluno já estão cadastrados

int verifica_status_turma(TipoTurma *turma) {

int i = 0, h = 0, condicao = 1;

for (; turma[h].cod_turma && h < MAX_TURMAS; h++) {

if (h == MAX_TURMAS) {

printf("Capacidade total de cadastro de turmas completa!");

return condicao = 0;

} else {

for (; turma[h].aluno.matricula && i < MAX_CADASTROS; i++) {

if (i == MAX_CADASTROS) {

printf("Espaço pra novos cadastros esgotado!");

return condicao = 0;

} else {

return condicao = 1;

}

}

}

if (condicao == 1) {

condicao = h;

return condicao;

}

}

}

ACHO que estou me confundindo no processo de criar-declarar-usar as structs, só não entendo o que está errado! :|

Link to comment
Share on other sites

  • 0

Seria melhor se postasse todo o código...

Isso são structs:

struct Aluno {
          char matricula[MAX_MAT];
          char prova1[MAX_PROVA];
          char prova2[MAX_PROVA];
          char prova3[MAX_PROVA];
};

struct Turma {
          int cod_turma;
          TipoAluno aluno[MAX_CADASTROS];
};
Aqui você as define como tipos:
typedef struct Aluno tipoaluno;
typedef struct Turma tipoturma;
Ou seja, você cria dois novos tipos de variáveis, chamadas tipoaluno e tipoturma. Mas isso não significa que você já pode usar esses tipos. Você deve declarar variáveis do tipo:
...
int main(){
          tipoaluno x;
...
Neste caso, foi criada uma variável do tipo 'tipoaluno'. Caso você pretende fazer cadastramento de aluno, e é necessário armazenar dados de vários alunos, o idela é criar um vetor do tipo 'tipoaluno':
...
int main(){
          tipoaluno x[100];
...
Neste caso, foi criado um vetor com 100 elementos do tipo 'tipoaluno'. O protótipo da sua função está correta no código que você passou... porém na hora da chamada, você enviou 'TipoTurma', que é o nome do tipo, não da variável que você quer passar. Neste exemplo que eu mostrei, você criaria um vetor do tipo 'tipoaluno' de 100 elementos, e passaria para uma função de protótipo
int verifica_status_turma(tipoaluno turma);
dessa maneira:
variavel = verifica_status_turma(x);
E para enviar apenas um elemento da estrutura:
variavel = verifica_status_turma(x[indice do elemento]);

Edited by mJi
Link to comment
Share on other sites

  • 0

Huuum acho que entendi.... mas ainda assim estou confusa quanto ao uso disso como parâmetro nas funções, poia acho que eles devem ser ponteiros....

Óhh esse é o código inteiro =D

/*
 * Cadastro  de notas dos alunos de Prog.I
 *
 *  Created on: 13/11/2011
 *      Author: Claudia Gueno
 */

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

#define MAX_CADASTROS 30
#define MAX_TURMAS 6
#define MAX_MAT 10
#define MAX_PROVA 3

typedef struct Aluno TipoAluno;

struct Aluno {
    char matricula[MAX_MAT];
    char prova1[MAX_PROVA];
    char prova2[MAX_PROVA];
    char prova3[MAX_PROVA];
};

typedef struct Turma TipoTurma;

struct Turma {
    int cod_turma;
    TipoAluno aluno[MAX_CADASTROS];
};

//inicializa
void ini(TipoTurma *turma) {
    int i, j;
    for (j = 0; j < MAX_TURMAS; j++) {
        for (i = 0; i < MAX_CADASTROS; i++) {
            turma[j].aluno[i].matricula[0] = '';
        }
        turma[j].cod_turma = j + 1;
    }
}

//procura aluno por turma
void busca_aluno(TipoTurma *turma) {
    int i, j;
    char matricula;
    printf("Digite a matrícula do aluno.");
    gets(matricula);
    for (i = 0; i < MAX_TURMAS; ++i) {
        for (j = 0; j < MAX_CADASTROS; ++j) {
            if (strcmp(matricula, turma[i].aluno[j].matricula)) {
                printf("O aluno não está matriculado!");
            } else {
                printf("Aluno está matriculado na turma %s\n\n",
                        turma[i].cod_turma);
                printf("Nº da matricula: %s\n", turma[i].aluno[j].matricula);
                printf("Nota da prova 1: %s\n", turma[i].aluno[j].prova1);
                printf("Nota da prova 2: %s\n", turma[i].aluno[j].prova2);
                printf("Nota da prova 3: %s\n", turma[i].aluno[j].prova3);
            }
        }
        printf("Este número de matrícula é inválido!");
    }
}

void adiciona_cadastro(TipoTurma *turma) {
    int num_turma, num_aluno;
    num_aluno = status_aluno();
    num_turma = verifica_status();
    if (num_turma == 0) {
        printf("Não será possivel inserir um novo cadastro.\n");
    } else {
        printf("\nNúmero da matrícula:");
        fgets(turma[num_turma].aluno[num_aluno].matricula, 6, stdin);

        printf("\nNota da Prova 1:");
        fgets(turma[num_turma].aluno[num_aluno].prova1, 3, stdin);

        printf("\nNota da Prova 2:");
        fgets(turma[num_turma].aluno[num_aluno].prova2, 3, stdin);

        printf("\nNota da Prova 3");
        fgtes(turma[num_turma].aluno[num_aluno].prova3, 3, stdin);
    }

}

int exclui_cadastro(TipoTurma *turma) {
    char matricula[MAX_MAT];
    int i = 0, j = 0;
    printf("Digite o numero da matrícula que deseja excluir!\n");
    for (; i < MAX_TURMAS; ++i) {
        for (j = 0; j < MAX_CADASTROS; ++j) {
            if (strcmp(matricula, turma[i].aluno[j].matricula)) {
                break;
            } else {
                turma[i].aluno[j].matricula[0] = '';
                printf("Matrícula excluída com sucesso!\n");
            }
        }
    }
    return 0;
}

//vê se o turma e aluno já estão cadastrados
int verifica_status_turma(TipoTurma *turma) {
    int i = 0, h = 0, condicao = 1;
    for (; turma[h].cod_turma && h < MAX_TURMAS; h++) {
        if (h == MAX_TURMAS) {
            printf("Capacidade total de cadastro de turmas completa!");
            return condicao = 0;
        } else {
            for (; turma[h].aluno[i].matricula && i < MAX_CADASTROS; i++) {
                if (i == MAX_CADASTROS) {
                    printf("Espaço pra novos cadastros esgotado!");
                    return condicao = 0;
                } else {
                    return condicao = 1;
                }
            }
        }
        if (condicao == 1) {
            condicao = h;
            return condicao;
        }
    }
}

//retorna o próximo cadastro de aluno que está disponivel, se houver!
int status_aluno(TipoTurma *turma) {
    int h = 0, i = 0, condicao = 1;
    for (; turma[h].cod_turma && h < MAX_TURMAS; h++) {
        if (h == MAX_TURMAS) {
            printf("Capacidade total de cadastro de turmas completa!");
            return condicao = 0;
        } else {
            for (; turma[h].aluno[i].matricula && i < MAX_CADASTROS; i++) {
                if (i == MAX_CADASTROS) {
                    printf("Espaço pra novos cadastros esgotado!");
                    return condicao = 0;
                } else {
                    return condicao = i;
                }
            }
        }
    }
}

// tela de inicio,mostra as opcoes
int menu(void) {
    char choice[2];
    int choi;
    printf("\n---CADASTRO DE ALUNOS---\n\n");
    printf("1-Adicionar cadastro de aluno\n");
    printf("2-Buscar cadastro de aluno\n");
    printf("3-Excluir cadastro\n");
    printf("4-Sair\n");
    do {
        printf("O que deseja fazer?\n");
        scanf("%s", choice);
        choi = atoi(choice);
    } while (choi < 0 || choi > 4);
    return choi;
}

int main(void) {
    struct Turma turma[MAX_TURMAS];
    struct Aluno aluno[MAX_CADASTROS];
    int status;
    ini(TipoTurma *turma);
    for (;;) {
        status = menu();
        switch (status) {
        case 1:
            adiciona_cadastro(TipoTurma *turma);
            break;
        case 2:
            busca_aluno(TipoTurma *turma);
            break;
        case 3:
            exclui_cadastro(TipoTurma *turma);
            break;
        case 4:
            exit(0);
            break;
        }
    }
}

Link to comment
Share on other sites

  • 0

typedef struct Aluno TipoAluno;

struct Aluno {
    char matricula[MAX_MAT];
    char prova1[MAX_PROVA];
    char prova2[MAX_PROVA];
    char prova3[MAX_PROVA];
};

typedef struct Turma TipoTurma;

struct Turma {
    int cod_turma;
    TipoAluno aluno[MAX_CADASTROS];
};
Não tenho certeza se é válido fazer o typedef antes de declarar a struct. Substitua por isso:
typedef struct {
    char matricula[MAX_MAT];
    char prova1[MAX_PROVA];
    char prova2[MAX_PROVA];
    char prova3[MAX_PROVA];
} TipoAluno;

typedef struct {
    int cod_turma;
    TipoAluno aluno[MAX_CADASTROS];
} TipoTurma;
Na sua declaração dos vetores, você declarou como structs mesmo tendo feito o typedef:
int main(void) {
    struct Turma turma[MAX_TURMAS];
    struct Aluno aluno[MAX_CADASTROS];
Tente usar assim:
int main(void) {
    TipoTurma turma[MAX_TURMAS];
    TipoAluno aluno[MAX_CADASTROS];
Ah, fica a questão... O seu tipo 'TipoAluno' você usa apenas internamente ao tipo 'TipoTurma'? Se sim, ao declarar o vetor de 'TipoTurma' vocÊ automaticamente já possui o vetor de alunos dentro de cada elemento do vetor de turmas. Então não precisaria declarar este vetor de alunos. E nesse switch, você faz as chamadas de funções de maneira incorreta. Ao chamar a função, não se deve colocar o tipo da variável que será enviada por parâmetro.
switch (status) {
        case 1:
            adiciona_cadastro(TipoTurma *turma);
            break;
        case 2:
            busca_aluno(TipoTurma *turma);
            break;
        case 3:
            exclui_cadastro(TipoTurma *turma);
            break;
        case 4:
            exit(0);
            break;
        }
Substitua por isso:
switch (status) {
        case 1:
            adiciona_cadastro(turma);
            break;
        case 2:
            busca_aluno(turma);
            break;
        case 3:
            exclui_cadastro(turma);
            break;
        case 4:
            exit(0);
            break;
        }

Como 'turma' é um vetor, pode ser enviado por referência sem o operador '&' ('E' comercial).

Só olhei isso no código, se tiver algum problema só postar

Edited by mJi
Link to comment
Share on other sites

  • 0
E o que é essa mensagem agora: "Lauch failed. Binary not found." ¬¬

O que tenho que fazer...criar alguma coisa...algum arquivo?

Tente dar o comando

sudo apt-get install g++

no teu Ubuntu.

Se não resolver, tente instalar um compilador.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...