鱼C论坛

 找回密码
 立即注册
查看: 686|回复: 14

[已解决]DEV 头文件和源文件

[复制链接]
发表于 2023-7-5 19:04:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhenjen 于 2023-7-5 19:40 编辑
#include <limits.h>
#include <stdlib.h>
#include<stdio.h>

#ifndef HEAP
#define HEAP
#define  Cap 20
struct Heap;

typedef struct Heap *H;
H Initialize (H heap );
int Isfull (H heap);
int Isempty( H heap);
void Insert (H heap ,int num);
void DeleteMin(H heap);
void printf_all (H heap);

#endif
struct Heap
{
        int Capacity; //数组容量 
        int Size;     //当前数量 
        int* List;
};


H  Initialize (H heap)
 {
  if(!heap)
  return heap;
  heap =(H)malloc(sizeof(struct Heap));
  if(!heap)
  {
    perror("malloc error") ;
    exit(EXIT_FAILURE);
  }
   heap->List=(int*)malloc((Cap+1)*sizeof(int));
   if(!heap->List)
   {
           perror("malloc error") ;
      exit(EXIT_FAILURE);
   }
   else
   {
           heap->Capacity=Cap;
           heap->Size=0;
           heap->List[0]=INT_MIN;
           
   }
   return heap;
   
  } 
  int Isempty (H heap)
{
        return !!(heap->Size==0);
  }  
  int Isfull(H heap)
  {
          return !!(heap->Capacity==Cap);
  }
  void Insert (H heap, int num)
  {
          int i;
          if(!heap)
          {
      perror("heap is empty") ;
      exit(EXIT_FAILURE);
          }
          for(i=heap->Size+1;heap->List[i/2]>num;i/=2)
             heap->List[i]=heap->List[i/2];
             heap->List[i]=num;
          
  }
  void DeleteMin(H heap)
  {
          int i,child;
          int Min,Max;
          if(!heap)
          {
      perror("heap is empty") ;
      exit(EXIT_FAILURE);
          }
          Min=heap->List[1];
          Max=heap->List[heap->Size-1];
          for(i=1;i*=2<=heap->Size;i=child)
          {
                  child=i*2;
                  if(heap->Size>child&&heap->List[child]>heap->List[child+1])
                  child++;
                  if(Max>heap->List[child])
                  heap->List[i]=heap->List[child];
                  else
                  break;
          }
          heap->List[i]=Max;
  }
 void printf_all (H heap)
 {
          for(int i=1;(heap->Size+1)>i;i++)
           printf("1");
 }
#include"Header.h " 
 


int main()
{
        struct Heap *heap=NULL;

        heap=Initialize(heap); 
    int n=0;
    while(scanf("%d",&n)==1)
    {
            Insert(heap,n);
        }
   printf_all(heap);
        
 } 
 
 

 

[/code][/code][/code][/code]头文件进行函数声明;(一个头文件二个源文件)
其中一个源文件进行函数定义;(文件中有#include“头文件”)
问题在包含main()函数源文件报错:函数未定义(#include“头文件”)
头文件的代码
最佳答案
2023-7-5 19:44:07
[b]你的代码中主要有以下几个问题需要注意:

1.  #include"Header.h " 这行代码包含了一个不必要的空格,它可能阻止编译器正确找到头文件。你应该使用 #include "Header.h" 。

2. 你在定义 struct Heap 之前就已经开始使用了这个类型,这可能会导致编译器报告未定义类型的错误。你需要先定义类型,然后再使用。

3. 在你的 Insert 函数中,当 heap->List[i/2]>num 为 false 时,会跳出循环,但此时 i 已经被除以2,这可能会导致数组越界错误。你需要在分配值给 heap->List[i] 之前修复 i 。

4. 在 DeleteMin 函数中, heap->Size-1 会越过数组边界,如果 heap->Size 是0,那么结果是一个负数,这在C中是未定义的行为。

5. 你的代码中,heap的实例化在 Initialize 函数中发生,而你在main函数中传入的heap是 NULL ,这不是一个好的实践。你可以直接在 Initialize 函数中创建heap,无需在函数外部创建。

以下是修改后的代码:

Header.h
#ifndef HEAP
#define HEAP
#define  Cap 20

struct Heap {
    int Capacity; //数组容量
    int Size;     //当前数量
    int* List;
};

typedef struct Heap *H;

H Initialize();
int Isfull(H heap);
int Isempty(H heap);
void Insert(H heap, int num);
void DeleteMin(H heap);
void printf_all(H heap);

#endif

Heap.c
#include <limits.h>
#include <stdlib.h>
#include<stdio.h>
#include "Header.h"

H Initialize() {
    H heap;
    heap =(H)malloc(sizeof(struct Heap));
    if(!heap) {
        perror("malloc error");
        exit(EXIT_FAILURE);
    }
    heap->List=(int*)malloc((Cap+1)*sizeof(int));
    if(!heap->List) {
        perror("malloc error") ;
        exit(EXIT_FAILURE);
    } else {
        heap->Capacity=Cap;
        heap->Size=0;
        heap->List[0]=INT_MIN;
    }
    return heap;
}

int Isempty (H heap) {
    return heap->Size == 0;
}

int Isfull(H heap) {
    return heap->Size == Cap;
}

void Insert (H heap, int num) {
    int i;
    if(!heap) {
        perror("heap is empty") ;
        exit(EXIT_FAILURE);
    }
    for(i=heap->Size+1;heap->List[i/2]>num;i/=2)
        heap->List[i]=heap->List[i/2];
    heap->List[i/2]=num;
    heap->Size++;
}

void DeleteMin(H heap) {
    int i,child;
    int Min,Max;
    if(!heap) {
        perror("heap is empty") ;
        exit(EXIT_FAILURE);
    }
    Min=heap->List[1];
    Max=heap->List[heap->Size];
    for(i=1;i*2<=heap->Size;i=child) {
        child=i*2;
        if(child != heap·>Size && heap->List[child] > heap->List[child+1])
            child++;
        if(Max > heap->List[child])
            heap->List[i]=heap->List[child];
        else
            break;
    }
    heap->List[i]=Max;
    heap->Size--;
}

void printf_all(H heap) {
    for(int i=1;i<=heap->Size;i++)
        printf("%d\n", heap->List[i]);
}

main.c
#include <stdio.h>
#include "Header.h"

int main() {
    H heap = Initialize();
    int n=0;
    while(scanf("%d",&n)==1) {
        Insert(heap,n);
    }
    printf_all(heap);
    return 0;
}

注意,这些代码不会实现一个有效的堆数据结构,因为 Insert 和 DeleteMin 函数的实现不正确,它们不会保持堆的属性。你可能需要重新实现这两个函数以实现有效的堆数据结构。[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-5 19:09:22 | 显示全部楼层
函数返回值类型一致吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 19:11:07 | 显示全部楼层
where's your code?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:12:48 | 显示全部楼层
豆嘉木 发表于 2023-7-5 19:09
函数返回值类型一致吗
zhizhi

一致
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:13:56 | 显示全部楼层
报错:E:\c编程练习\数据算法\main.o        In function `main':
18                E:\c编程练习\数据算法\main.c        undefined reference to `Initialize'
22                E:\c编程练习\数据算法\main.c        undefined reference to `Insert'
24                E:\c编程练习\数据算法\main.c        undefined reference to `printf_all'
E:\c编程练习\数据算法\collect2.exe        [Error] ld returned 1 exit status
26                E:\c编程练习\数据算法\Makefile.win        recipe for target '6.2.exe' failed
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:19:18 | 显示全部楼层

发了发了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 19:23:16 | 显示全部楼层

发在代码标签里

                               
登录/注册后可看大图

不然会冲突
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:40:41 | 显示全部楼层
歌者文明清理员 发表于 2023-7-5 19:23
发在代码标签里

不然会冲突

好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 19:42:16 | 显示全部楼层

头文件呢limits.h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-5 19:44:07 | 显示全部楼层    本楼为最佳答案   
[b]你的代码中主要有以下几个问题需要注意:

1.  #include"Header.h " 这行代码包含了一个不必要的空格,它可能阻止编译器正确找到头文件。你应该使用 #include "Header.h" 。

2. 你在定义 struct Heap 之前就已经开始使用了这个类型,这可能会导致编译器报告未定义类型的错误。你需要先定义类型,然后再使用。

3. 在你的 Insert 函数中,当 heap->List[i/2]>num 为 false 时,会跳出循环,但此时 i 已经被除以2,这可能会导致数组越界错误。你需要在分配值给 heap->List[i] 之前修复 i 。

4. 在 DeleteMin 函数中, heap->Size-1 会越过数组边界,如果 heap->Size 是0,那么结果是一个负数,这在C中是未定义的行为。

5. 你的代码中,heap的实例化在 Initialize 函数中发生,而你在main函数中传入的heap是 NULL ,这不是一个好的实践。你可以直接在 Initialize 函数中创建heap,无需在函数外部创建。

以下是修改后的代码:

Header.h
#ifndef HEAP
#define HEAP
#define  Cap 20

struct Heap {
    int Capacity; //数组容量
    int Size;     //当前数量
    int* List;
};

typedef struct Heap *H;

H Initialize();
int Isfull(H heap);
int Isempty(H heap);
void Insert(H heap, int num);
void DeleteMin(H heap);
void printf_all(H heap);

#endif

Heap.c
#include <limits.h>
#include <stdlib.h>
#include<stdio.h>
#include "Header.h"

H Initialize() {
    H heap;
    heap =(H)malloc(sizeof(struct Heap));
    if(!heap) {
        perror("malloc error");
        exit(EXIT_FAILURE);
    }
    heap->List=(int*)malloc((Cap+1)*sizeof(int));
    if(!heap->List) {
        perror("malloc error") ;
        exit(EXIT_FAILURE);
    } else {
        heap->Capacity=Cap;
        heap->Size=0;
        heap->List[0]=INT_MIN;
    }
    return heap;
}

int Isempty (H heap) {
    return heap->Size == 0;
}

int Isfull(H heap) {
    return heap->Size == Cap;
}

void Insert (H heap, int num) {
    int i;
    if(!heap) {
        perror("heap is empty") ;
        exit(EXIT_FAILURE);
    }
    for(i=heap->Size+1;heap->List[i/2]>num;i/=2)
        heap->List[i]=heap->List[i/2];
    heap->List[i/2]=num;
    heap->Size++;
}

void DeleteMin(H heap) {
    int i,child;
    int Min,Max;
    if(!heap) {
        perror("heap is empty") ;
        exit(EXIT_FAILURE);
    }
    Min=heap->List[1];
    Max=heap->List[heap->Size];
    for(i=1;i*2<=heap->Size;i=child) {
        child=i*2;
        if(child != heap·>Size && heap->List[child] > heap->List[child+1])
            child++;
        if(Max > heap->List[child])
            heap->List[i]=heap->List[child];
        else
            break;
    }
    heap->List[i]=Max;
    heap->Size--;
}

void printf_all(H heap) {
    for(int i=1;i<=heap->Size;i++)
        printf("%d\n", heap->List[i]);
}

main.c
#include <stdio.h>
#include "Header.h"

int main() {
    H heap = Initialize();
    int n=0;
    while(scanf("%d",&n)==1) {
        Insert(heap,n);
    }
    printf_all(heap);
    return 0;
}

注意,这些代码不会实现一个有效的堆数据结构,因为 Insert 和 DeleteMin 函数的实现不正确,它们不会保持堆的属性。你可能需要重新实现这两个函数以实现有效的堆数据结构。[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:50:05 From FishC Mobile | 显示全部楼层
歌者文明清理员 发表于 2023-7-5 19:42
头文件呢limits.h

第一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:50:27 From FishC Mobile | 显示全部楼层
zhenjen 发表于 2023-7-5 19:50
第一个

有函数声明的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 19:53:25 From FishC Mobile | 显示全部楼层
zhenjen 发表于 2023-7-5 19:50
有函数声明的

源文件是定义函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-5 20:34:06 | 显示全部楼层
本帖最后由 zhenjen 于 2023-7-5 21:10 编辑

1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-5 20:38:55 | 显示全部楼层
isdkz 发表于 2023-7-5 19:44
你的代码中主要有以下几个问题需要注意:

1.  #include"Header.h " 这行代码包含了一个不必要的空格,它 ...

为什么会不识别定义了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表