Ir para conteúdo
Fórum Script Brasil
  • 0

função com ponteiro de struct


Clau Gueno

Pergunta

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 para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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]);

Editado por mJi
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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

Editado por mJi
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...