2017-06-22 175 views
0

我有一個程序,給我的錯誤[Error] conflicting types for 'empty'[Error] conflicting types for 'full'。我有一個預感,它與enum bool的使用有關(這是我第一次嘗試使用它)。我看過其他類似的問題,這些問題對我沒有幫助,因爲問題是忘記在程序中聲明原型。我已經確定在main之前寫入我的函數。enum bool的衝突類型?

這是我的代碼:

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

typedef struct{ 
    char** data; // array of strings represnting the stack 
    int top;  // -1 if empty 
    int size; 
}Stack; 

typedef enum { FALSE, TRUE } bool; 

Stack* create(){ 
    Stack *s; 
    s = (Stack*)malloc(sizeof(Stack)); 
    s->top = -1; 
    s->size = 10; 
    s->data = (char**)malloc(s->size*sizeof(char*)); 
    return s; 
} 

void deleteStack(Stack* ps){ 
    while(ps->top = 0){ 
     free(ps->data[ps->top]); 
     ps->top--; 
    } 
    free(ps->data); 
} 

void push(Stack* ps, char* str, int* size){ //may need to call realloc bfr completing push 
    if(full(ps)){ 
     char **temp = realloc(ps->data, ps->size*sizeof(char*)); 
     ps->data == temp; 
     printf("Stack capacity has grown from %d to %d elements\n", ps->size**size, ps->size**(++size)); 
    } 
    ps->data[++ps->top] = str; 
} 

char* pop(Stack* s, int* i){ //returns the string that was removed from the stack 
    if(empty(s)) 
     return NULL; 
    printf("#of elements after popping: %d\tstring popped: %s\n", --i, s->data[s->top]); 
    return s->data[s->top--]; 
} 

bool empty(Stack s){ // returns true if stack has no elements else false 
    if(s.top == -1) 
     return TRUE; 
    return FALSE; 
} 

bool full(Stack s){ //returns true if no more room else false 
    if(s.top == s.size-1) 
     return TRUE; 
    return FALSE; 
} 

int main(int argc, char *argv[]){ 
    printf("Assignment 2 Problem 1 by Jasmine Ramirez\n"); 

    FILE * input = fopen("data_a2.txt", "r"); 
    if(input == NULL){ 
     printf("File %s not found.\n", "data_a2.txt"); 
     return -1; 
    } 

    Stack *s; 
    s = create(); 
    char str[255]; 
    int i = 0, size = 1; 
    while(fscanf(input, "%[^\n]", str) == 1){ 
     i++; 
     if(strcmp(str, "pop") == 0){ 
      i--; 
      pop(s, &i); 
      //printf("#of elements after popping: %d\tstring popped: %s", i, temp); 
     } 
     else{ 
      push(s, str, &size); 
     } 
    } 

    deleteStack(s); 
    fclose(input); 
    return 0; 

} 

這是輸入:(以防萬一)

to 
sure 
Be 
pop 
pop 
pop 
you 
stop 
won't 
that 
feeling 
a 
have 
I 
but 
on 
go 
to 
much 
Not 
right 
Brilliant 
happens 
drink 
pop 
something 
and 
both 
them 
Ring 
Story 
ovaltine 
your 
pop 
pop 
Christmas 
A 
-- 
pop 
pop 
pop 
pop 

想法?或者我剛完全脫落?

+3

爲什麼不使用''和'真',而是'FALSE'一做 - 類型的參數它自己'枚舉'? –

+2

@below_avg_st函數empty和full必須在使用前聲明。這是錯誤的原因。 –

+0

@JonathanLeffler我的教授希望我們使用枚舉。 –

回答

2

在功能push()您有:

void push(Stack* ps, char* str, int* size){ 
    if(full(ps)){ 
     … 

這隱含聲明full與不確定的參數列表返回一個int的功能。您稍後將其定義爲返回bool - 這些是不同的類型,因此您會得到該錯誤。在使用之前聲明或定義full。類似的評論適用於empty,但Vlad from Moscow在他的answer中指出該代碼存在額外的問題。

如果您使用GCC,請使用諸如-Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Wold-style-declaration(或其中許多版本作爲您的版本支持)的選項,以確保您不會再遇到此問題。

+0

好吧,這只是一個編譯錯誤?我只需要在gcc的時候添加這個對吧? –

+1

不;這是一個源代碼錯誤,但是當你調用一個沒有預先聲明或定義的函數時,額外的GCC選項會告訴你 - 防止使用'隱式'int''函數聲明。你還會發現這些函數最好是'static',因爲它們不在這個源文件之外訪問。如果它們是從外部訪問的,則會有一個頭部聲明它們,並且您將使用該頭部聲明它們,無論它們在哪裏使用以及它們在何處定義。 –

1

名稱emptyfull在聲明之前使用。例如

char* pop(Stack* s, int* i){ //returns the string that was removed from the stack 
    if(empty(s)) 
     ^^^^^^^^ 
     return NULL; 
    printf("#of elements after popping: %d\tstring popped: %s\n", --i, s->data[s->top]); 
    return s->data[s->top--]; 
} 

bool empty(Stack s){ // returns true if stack has no elements else false 
    if(s.top == -1) 
     return TRUE; 
    return FALSE; 
} 

您必須在使用前聲明它們。

而且比如函數empty具有Stack而被稱爲與類型的參數Stack *

+0

@below_avg_st查看我附加的帖子。 –

+1

@below_avg_st:這就是爲什麼你在使用它們之前聲明函數的原因!函數原型是你的朋友;它們可以幫助你正確地獲得代碼,這樣當它乾淨地編譯時,它就會有一個很好的機會。 –