鱼C论坛

 找回密码
 立即注册
查看: 2333|回复: 7

[已解决]C++写静态链表时报错“间接寻址级别不同”。

[复制链接]
发表于 2019-6-3 13:21:55 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 菜鸟小乔 于 2019-6-3 13:24 编辑

问题描述:静态链表初始化代码只写了初始化函数,就报错:

错误        C2040         “Slist”:“Slist [10]”与“Slist”的间接寻址级别不同.

请问这个错误具体原因是什么?如何改正?


-----------StaticLinkList.h文件---------------------
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
        int id;
        string name;
}EleType;

//静态链表,就是一个结构数组
typedef struct Slist{
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist[MAX_SIZE_SSL];

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif
-------------------.cpp文件---------------------
#include<iostream>
#include"StaticLinkList.h"
using namespace std;


void InitSLL(Slist sList)//初始化静态链表:每个元素的游标都指向下一个元素
{
        for (int i = 0; i < MAX_SIZE_SSL; i++)//数组第一个元素的游标存放第一个空闲节点的下标
        {
                sList[i].next = i + 1;
        }
        
        sList[MAX_SIZE_SSL - 1].next = 0;//将最后一个结点置空(最后一个元素的next用来保存第一个插入的元素的下标)
        
        sList[MAX_SIZE_SSL - 2].next = 0;//倒数第二个元素也置零(备用链表尾结点置空,去除首尾后剩余的部分是备用链表)
}
------------------main.cpp----------------------------------
#include<iostream>
#include"StaticLinkList.h"
using namespace std;

void testSLL();

int main()
{
        testSLL();
        return 0;
}

void testSLL()
{
        Slist sList;
        InitSLL(sList);
}
最佳答案
2019-6-3 23:01:30
本帖最后由 人造人 于 2019-6-3 23:12 编辑

在C++中
struct EleType
{
        int id;
        char name[64];
};

EleType e1;
struct EleType e2;

EleType e1;
struct EleType e2;
加struct和不加完全一样,书上好像就是这么写的
struct后面的名字在全局空间

在C语言中
struct EleType
{
        int id;
        char name[64];
};

EleType e1;
struct EleType e2;

EleType e1;报错,说找不到这个名字

C语言中的struct后面这个名字不在全局空间,你用的时候每次都要加上struct,很麻烦,解决方法是用typedef把这个名字放到全局空间
例如这样就可以了
typedef struct EleType
{
        int id;
        char name[64];
} Eletype;

EleType e1;
struct EleType e2;

但是在C++中名字本来就在全局空间,你用typedef反而导致了名字冲突

也就是说,理论上改成这样就行了
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
        int id;
        string name;
}EleType;

//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct {
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist[MAX_SIZE_SSL];

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif


但是,C/C++中的这个typedef真的就是一个别名,你这样改编译器会说
‘void InitSLL(<unnamed struct>*)’, declared using unnamed type, is used but never defined 

编译器会说Slist sList的类型是<unnamed struct>*


C/C++中的这个typedef真的就是一个别名
那么好吧,这样总行了吧,你别说这样一改还真行了^_^
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
        int id;
        string name;
}EleType;

//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct Slist_tag{
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist[MAX_SIZE_SSL];

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif

也就是保证struct后面的名字和typedef生成的名字不一样,因为这两个名字都在全局空间,名字一样会导致冲突
//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct Slist_tag{
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist[MAX_SIZE_SSL];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-3 13:35:20 | 显示全部楼层
把.cpp改成.c看看
main.c和StaticLinkList.c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-3 15:14:15 | 显示全部楼层
本帖最后由 菜鸟小乔 于 2019-6-3 15:17 编辑
人造人 发表于 2019-6-3 13:35
把.cpp改成.c看看
main.c和StaticLinkList.c


试了,改文件类型以及头文件,不行。。。

我新建了一个工程,写了一样的代码,就没有报错。。。

我又试了原来那个有问题的工程文件,只留了main.cpp文件,只写了一个return 0;的空的main函数,竟然也报错,这是工程文件哪里有问题吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 23:01:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2019-6-3 23:12 编辑

在C++中
struct EleType
{
        int id;
        char name[64];
};

EleType e1;
struct EleType e2;

EleType e1;
struct EleType e2;
加struct和不加完全一样,书上好像就是这么写的
struct后面的名字在全局空间

在C语言中
struct EleType
{
        int id;
        char name[64];
};

EleType e1;
struct EleType e2;

EleType e1;报错,说找不到这个名字

C语言中的struct后面这个名字不在全局空间,你用的时候每次都要加上struct,很麻烦,解决方法是用typedef把这个名字放到全局空间
例如这样就可以了
typedef struct EleType
{
        int id;
        char name[64];
} Eletype;

EleType e1;
struct EleType e2;

但是在C++中名字本来就在全局空间,你用typedef反而导致了名字冲突

也就是说,理论上改成这样就行了
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
        int id;
        string name;
}EleType;

//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct {
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist[MAX_SIZE_SSL];

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif


但是,C/C++中的这个typedef真的就是一个别名,你这样改编译器会说
‘void InitSLL(<unnamed struct>*)’, declared using unnamed type, is used but never defined 

编译器会说Slist sList的类型是<unnamed struct>*


C/C++中的这个typedef真的就是一个别名
那么好吧,这样总行了吧,你别说这样一改还真行了^_^
#ifndef staticlinklist_h_include
#define staticlinklist_h_include
/*
静态链表 SLL
*/
#include<iostream>
using namespace std;

#define MAX_SIZE_SSL 10

typedef struct {
        int id;
        string name;
}EleType;

//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct Slist_tag{
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist[MAX_SIZE_SSL];

void InitSLL(Slist sList);//初始化

void PrintSLL(Slist sList);//打印
#endif

也就是保证struct后面的名字和typedef生成的名字不一样,因为这两个名字都在全局空间,名字一样会导致冲突
//静态链表,就是一个结构数组
//typedef struct Slist{
typedef struct Slist_tag{
        EleType data;
        int next;                //游标cursor,若果为零表示无指向
}Slist[MAX_SIZE_SSL];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 23:07:11 | 显示全部楼层
本帖最后由 人造人 于 2019-6-3 23:17 编辑

这个位置没用了,可以删除,我好像无法删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 23:09:10 | 显示全部楼层
本帖最后由 人造人 于 2019-6-3 23:17 编辑

这个位置也没用了,可以删除,我好像无法删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 23:10:00 | 显示全部楼层
本帖最后由 人造人 于 2019-6-3 23:18 编辑

这个位置也没用了,可以删除,我好像无法删除
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-4 11:58:09 | 显示全部楼层
人造人 发表于 2019-6-3 23:10
这个位置也没用了,可以删除,我好像无法删除

我也无法删除,送你上最佳答案吧,谢谢帮忙看帖啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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