2015-03-03 3 views
0

Я не совсем понимаю, почему я получаю эту ошибку: Неизвестное имя типа 'DATA'.C Неизвестный тип name 'DATA'

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

typedef int DATA; 
#include "PriorityQueue.h" 


int main(){ 
    int priority; 
    DATA value; 
    LINK *head; 
    createEmpty(&head); 
    add(&head, 1, 7); 
    checkIfEmpty(head); 
    add(&head, 5, 5); 
    add(&head, 3, 4); 
    deleteElement(&head, &priority, &value); 
    add(&head, 1, 3); 
    destroy(head); 
    createEmpty(&head); 
    add(&head, 10, 10); 
    return 0; 
} 

Основные

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

#include "PriorityQueue.h" 

void add(LINK **head, int p, DATA v){ 
    LINK *curr=(*head); 
    LINK *beforeCurr=(*head); 
    LINK *newElement=NULL; 
    if((*head)->priority==-1){ 
     (*head)->priority=p; 
     (*head)->value=v; 
    } 

    else{ 
     newElement=(LINK*)malloc(sizeof(LINK)); 
     newElement->priority=p; 
     newElement->value=v; 
     newElement->next=NULL; 

     while(p>(curr->priority) && curr->next!=NULL){ 
      beforeCurr=curr; 
      curr=curr->next; 
     } 

     if(curr->next==NULL && p>(curr->priority)) 
      curr->next=newElement; 

     else if(curr==(*head)){ 
      newElement->next=curr; 
      (*head)=newElement; 
     } 
     else{ 
      beforeCurr->next=newElement; 
      newElement->next=curr; 
     } 
    } 
} 

void deleteElement(LINK **head, int *p, DATA *v){ 
    LINK *curr=(*head); 
    LINK *currB=(*head); 
    while(curr->next!=NULL) { 
     currB=curr; 
     curr=curr->next; 
    } 
    currB->next=NULL; 
    (*p)=curr->priority; 
    (*v)=curr->value; 
    free(curr); 
} 

void checkIfEmpty(LINK *head){ 
    if(head->priority==-1) 
    printf("Queue is empty\n\n"); 
    else 
    printf("Queue is not empty\n\n"); 
} 

void destroy(LINK *head) { 
    LINK *current; 
    LINK *next; 
    current=head; 
    while(current!=NULL){ 
     next=current->next; 
     free(current); 
     current=next; 
    } 
    head=NULL; 
} 


void createEmpty(LINK **head) { 
    LINK *curr=NULL; 
    curr=(LINK*)malloc(sizeof(LINK)); 
    curr->next = NULL; 
    curr->priority = -1; 
    (*head)=curr; 
} 

Функции файла

#ifndef PRIORITY_QUEUE_H_ 
#define PRIORITY_QUEUE_H_ 

typedef struct priorityQueue{ 
    int priority; 
    DATA value; 
    struct priorityQueue *next; 
}LINK; 

void createEmpty(LINK **head); 
void add(LINK **head, int p, DATA v); 
void deleteElement(LINK **head, int *p, DATA *v); 
void checkIfEmpty(LINK *head); 
void destroy(LINK *head); 
#endif 

Заголовок

Я использую проект CodeBlocks скомпилировать его. Кроме того, "typedef int DATA;" на основном было бы предпочтительным

+0

Возможный дубликат [Передача определенного типа в главном заголовке в C] (http://stackoverflow.com/questions/28811140/passing-defined-type-in-main-to-header-in-c) – user694733

+0

Это дублирует ваш предыдущий пост. Пожалуйста, не делайте двойную запись. Удалите это и отредактируйте свой старый пост. – user694733

ответ

0

Вы должны объявить typedef int DATA; в файле заголовка и включить этот файл заголовка во все исходные файлы.

В настоящее время другим источникам не существует способа узнать, что такое DATA.

+0

Нет ли способа сохранить его в главном? – DevGambit

+0

Нет, нет никакого способа сделать это, если вы не объявите 'typedef int DATA;' во всех исходных файлах, которые также включают заголовок. – Vagish

+0

Спасибо за информацию! :) – DevGambit

1

typedef ключевое слово подчиняется обзорного правилам, как описано здесь: Are typedef and #define the same in c?

Это означает, что если вы объявите:

typedef int DATA; 

И эта линия не входит в другой файл он не будет объявлен там ,

DATA должно быть объявлено в каждом файле, который использует его либо путем включения другого файла, который его объявил, либо путем явного объявления его.

Смежные вопросы