繁体   English   中英

未声明范围错误功能

[英]scope errors functions not declared

嗨,我的问题是以下我想编译我的c项目,并且说我的某些函数未在作用域中声明,但我无法理解为什么它不编译,这是行不通的

我的代码:

头文件:

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

typedef struct s {
int id;
int tipo_sorte;
char descricao[100];
int consequencia;
} S;

typedef struct sorte{
S s;
struct sorte *anterior;
struct sorte *proximo;
}SORTE;

typedef struct t {
int id;
int n_casa;
} T;

typedef struct tabuleiro{
T t;
struct tabuleiro *anterior;
struct tabuleiro *proximo;
}TABULEIRO;

typedef struct j {
int id;
char nome[50];
char sigla[5];
int jogadas;
} J;

typedef struct jogador{
J j;
struct jogador *anterior;
struct jogador *proximo;
}JOGADOR;

主文件:

#include "lista.h"

int main()
{
int opcao=0, a = 0;
SORTE *inicio = NULL;
JOGADOR *ini = NULL;
TABULEIRO *tini = NULL;
SORTE *fim = NULL;
TABULEIRO *tfim = NULL;
JOGADOR *end = NULL;


printf(" ----------------------------------------------------------------------------\n"
       "|                                Monopolio 2014.                             |\n"
       "|                                  Bem-Vindo.                                |\n"
       " ----------------------------------------------------------------------------\n");

  //carregaPerguntas(&inicio, &fim);
  //carregaJogadores(&ini, &end);
  // system("PAUSE");




  do{
    system("cls");
    printf(" -----------------------------------------------------------------------------\n");
    printf("| 1 - Jogar                                                                   |\n");
    printf("| 2 - Administrador                                                           |\n");
    printf("| 3 - Recordes TOP 10                                                         |\n");
    printf("| 4 - Sair                                                                    |\n");
    printf(" -----------------------------------------------------------------------------\n\n->");
    fflush(stdin);
    scanf("%d",&opcao);
    switch(opcao) {
        case 1 :    system("cls");
//                    jogar(inicio,fim, &ini, &end);

                    break;
        case 2 :    system("cls");
                    a = validaLogin();
                    if(a==0){
                       menuAdmin();

                    }
                    if(a==1){

                        menuAdmin1(&inicio, &fim);
                    }else{
                        //menuAdmin2(&inicio, &fim);
                    }
                    break;
        case 3 :    system("cls");
  //                  carregaRecordes(&ini, &end);
    //                listaRecordes(ini);
                    break;

        case 4 :    system("cls");
                    printf(" -----------------------------------------------------------------------------\n");
                    printf("| Obrigado por ter jogado.                                                   |\n");
                    printf(" -----------------------------------------------------------------------------\n");
                    system("PAUSE");
        default :   if(opcao<1 || opcao>4) {
                    system("cls");
                    printf("Opcao Invalida.\n");
                    system("PAUSE");

                    }
                    break;
    }
}while(opcao!=4);
// gravaRecordes(ini);
system("cls");
return 0;
}

管理文件:

 #include "lista.h"

int validaLogin(){
system("cls");
char pass[20]="", passwd[20]="";
int n_tenta = 3;
FILE *fp = fopen("pass.dat","r+b");
if(fp==NULL){
    printf("Primeiro Acesso. Por favor defina a password.\n");
    fflush(stdin);
    gets(pass);
    fclose(fp);
    fp=fopen("pass.dat","wb");
    fwrite(pass,sizeof(pass),1,fp);
    printf("\n\nPassword definida com sucesso.\n");
    system("PAUSE");
    fclose(fp);
    return 0;
}
    do{
    fflush(stdin);
    fread(passwd,sizeof(passwd),1,fp);
    printf("Introduza a password de acesso ao modo de administracao.\n");
    fflush(stdin);
    gets(pass);
    if(strcmp(pass,passwd)!=0){
        system("cls");
        n_tenta--;
        printf("Password invalida. Restam %d tentativas.\n",n_tenta);
        if(n_tenta==0){
            printf("A sair do modo de administracao.\n");
            system("PAUSE");
            return -1;
        }
    }
    else{
        printf("Password inserida com sucesso.\n");
        system("pause");
    }
}while(strcmp(pass,passwd)!=0);
fclose(fp);
return 0;
}



void inserePergunta(SORTE **inicio, SORTE **fim){
SORTE *novo = (SORTE*) malloc(sizeof(SORTE);
int gr=0, a=0;
if(novo==NULL){
    system("cls");
    printf("Erro na reserva de memoria.\n");
    system("pause");
    return;
}
printf(" -----------------------------------------------------------------------------\n");
printf("| Insira o tipo de consequencia da carta da sorta                            |\n");
printf(" -----------------------------------------------------------------------------\n");
printf("| 1 - Recuar                                                                 |\n");
printf("| 2 - Avancar                                                                |\n");
printf("| 3 - Saltar                                                                 |\n");
printf(" -----------------------------------------------------------------------------\n->");
do{
    fflush(stdin);
    scanf("%d",&gr);
    if(gr<1 || gr>3){
        printf("Opcao errada.\nInsira novamente.\n->");
    }
}while(gr<1 || gr>3);
novo->s.tipo_sorte = gr;
system("cls");
printf("Insira o tipo da consequencia.\n->");
fflush(stdin);
gets(novo->s.descricao);
if(gr==1 || gr==2 || gr==3){
    printf("Insira o numero de casas.\n->");
            fflush(stdin);
            scanf("%d",&novo->s.consequencia);

}
if(*inicio==NULL){
    novo->s.id=1;
}
else{
    novo->s.id = (*fim)->s.id + 1;
}
inserirListaP(novo->s, &(*inicio), &(*fim));
printf("ID da casa - %d\n",novo->s.id);
system("pause");
}

int listaPerguntas(SORTE *inicio){
SORTE *auxi = inicio;
char group[50]="";
if(auxi==NULL){
    return -1;
}
while(auxi!=NULL){
    if(auxi->s.tipo_sorte==1){
        strcpy(group,"Recuar");
    }
    if(auxi->s.tipo_sorte==2){
        strcpy(group,"Avancar");
    }
    if(auxi->s.tipo_sorte==3){
        strcpy(group,"Saltar");
    }
    printf(" -----------------------------------------------------------------------------\n");
    printf("| ID: %d\n",auxi->s.id);
    printf("| Carta:\t%s\n",auxi->s.descricao);
    printf("| Tipo Carta: %d (%s)\n",auxi->s.tipo_sorte,group);
    printf("| Consequencia: %d\n",auxi->s.consequencia);
    printf(" -----------------------------------------------------------------------------\n\n");
    auxi = auxi->proximo;
}
return 1;
}

void editaPergunta(SORTE *inicio){
system("cls");
SORTE *aux = inicio;
int auxi=0, l=0, a=0;
l = listaPerguntas(inicio);
if(l==-1){
          printf(" -----------------------------------------------------------------------------\n");
    printf("| Nao existem cartas inseridas para poder alterar.\n");
    printf(" -----------------------------------------------------------------------------\n");
    system("pause");
    return;
}
printf(" -----------------------------------------------------------------------------\n");
printf("| Insira o id da carta a alterar.\n");
printf(" -----------------------------------------------------------------------------\n->");
fflush(stdin);
scanf("%d",&auxi);
while(aux!=NULL){
    if(aux->s.id == auxi) {
        printf("Edite a carta.\n->");
        fflush(stdin);
        gets(aux->s.descricao);
        printf("Introduza nova consequencia.\n->");
        fflush(stdin);
        scanf("%d",&aux->s.consequencia);
        }
        printf(" -----------------------------------------------------------------------------\n");
        printf("| Dados editados com sucesso.\n");
        printf(" -----------------------------------------------------------------------------\n");
        system("pause");
        return;
    }
    else {
        aux = aux->proximo;
    }
}
printf(" -----------------------------------------------------------------------------\n");
printf("| A carta com o id '%d' nao existe.\n",auxi);
printf(" -----------------------------------------------------------------------------\n");
system("pause");
}

 void eliminaPergunta(SORTE **inicio, SORTE **fim){
SORTE *aux = *inicio;
int l=0, i=0;
l = listaPerguntas(*inicio);
if(l==-1){
    printf(" -----------------------------------------------------------------------------\n");
    printf("| Nao existem cartas inseridas para poder eliminar.\n");
    printf(" -----------------------------------------------------------------------------\n");
    system("pause");
    return;
}
printf(" -----------------------------------------------------------------------------\n");
printf("| Insira o id da carta a eliminar.\n->");
printf(" -----------------------------------------------------------------------------\n");
fflush(stdin);
scanf("%d",&i);
while(aux!=NULL && aux->s.id != i) {
    aux = aux->proximo;
}
if(aux==NULL){
    printf(" -----------------------------------------------------------------------------\n");
    printf("| A carta com o id '%d' nao existe.\n",i);
    printf(" -----------------------------------------------------------------------------\n");
    system("pause");
    return;
}
if(aux->anterior==NULL) {
    *inicio = aux->proximo;
    if(*inicio) (*inicio)->anterior = NULL;
}
else
    aux->anterior->proximo = aux->proximo;
    if(aux->proximo==NULL) {
        *fim = aux->anterior;
        if(*fim) (*fim)->proximo=NULL;
    }
    else
    aux->proximo->anterior = aux->anterior;
    free(aux);
    printf(" -----------------------------------------------------------------------------\n");
    printf("| Carta removida.\n");
    printf(" -----------------------------------------------------------------------------\n");
    system("pause");
}

void menuAdmin(){
system("cls");


    system("cls");
    printf(" -----------------------------------------------------------------------------\n");
    printf("|                    Menu Administracao.                                      |\n");
    printf(" -----------------------------------------------------------------------------\n");
    printf("| 1 - Gerir Cartas da sorte                                                   |\n");
    printf("| 2 - Gerir Tabuleiro                                                         |\n");
    printf("| 0 - Menu anterior                                                           |\n");
    printf(" -----------------------------------------------------------------------------\n->");

} 


void menuAdmin1(SORTE **inicio, SORTE **fim){
system("cls");
int op=0;
do{
    system("cls");
    printf(" -----------------------------------------------------------------------------\n");
    printf("|                    Menu Administracao.                                      |\n");
    printf(" -----------------------------------------------------------------------------\n");
    printf("| 1 - Inserir Pergunta                                                        |\n");
    printf("| 2 - Editar Pergunta                                                         |\n");
    printf("| 3 - Eliminar pergunta                                                       |\n");
    printf("| 0 - Menu anterior                                                           |\n");
    printf(" -----------------------------------------------------------------------------\n->");
    fflush(stdin);
    scanf("%d",&op);
    switch(op){
        case 1: system("cls");
                inserePergunta(&(*inicio), &(*fim));
                break;
        case 2: system("cls");
                editaPergunta(*inicio);
                break;
        case 3: system("cls");
                eliminaPergunta(&(*inicio), &(*fim));
                break;
        default:if(op<0 || op>3){
                    printf("Opcao errada.\n");
                    system("PAUSE");
                }
                gravaPerguntas(*inicio);
                system("PAUSE");
                break;
    }
}while(op!=0);
}

错误日志:

C:\Users\JD\Desktop\Prog\main.c In function 'int main()':
42  41  C:\Users\JD\Desktop\Prog\main.c [Error] 'validaLogin' was not declared in    this scope
44  38  C:\Users\JD\Desktop\Prog\main.c [Error] 'menuAdmin' was not declared in this scope
49  35  C:\Users\JD\Desktop\Prog\main.c [Error] 'menuAdmin1' was not declared in this scope
28      C:\Users\JD\Desktop\Prog\Makefile.win   recipe for target 'main.o' failed

这些功能在管理文件中,我不明白为什么会出现此错误,请帮帮我

您需要在调用函数之前声明它们,方法是添加所谓的函数原型

例如,在main.cpp文件中的main函数之前,添加以下行

int validaLogin();

那是一个函数声明 ,并告诉编译器存在一个名称为validaLogin的函数,它不带任何参数,并且返回一个int


为了更清楚,您的main.cpp文件应如下所示

#include "lista.h"

// Declare function prototypes of the functions I use,
// but are defined in another file
int validaLogin();

int main()
{
    // All your code here
}

当然,您还需要添加其他功能。

您的.h文件应仅具有函数和类型声明的正向声明,您的.cpp文件应仅具有函数体。 在.cpp文件中使用函数时,必须添加包含该函数的文件.h的包含。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM