[间接寻址级别不同]

dddz2012 2011-09-26 03:55:34
问题描述:
1、写了一个单链表的模板类
2、取链表中一个节点的值时,出现
错误 1 error C2040: “b”: “double *”与“double”的间接寻址级别不同 f:\work_code\vs2005_code\链表\链表\main.cpp 11

问题出在:突出部分


主函数[main.cpp]:
#include "randy_list.h"
#include <iostream>
using namespace std;
int main()
{
List<double> l;
double a = 2,b = 3;
l.add_node(&a);
l.add_node(&b);
double *b = l.get_node(2);//此句会出现上述问题
l.del_node(1);
l.del_node(1);
l.clear_list();
l.add_node(&a);
std::cout << *(l.get_node(1)) << endl; //此句能顺利通过
return 0;
}




模板类[randy_list.h]:
#ifndef _RANDY_LIST_H_
#define _RANDY_LIST_H_
#include <cstring>

#ifndef NULL
#define NULL 0
#endif
struct Node
{
void *data;
Node *next;
};
template<typename T>
class List
{
public:
List():length(0),phead(NULL),plast(NULL) {};
~List(){ if (phead) clear_list(); };
bool add_node(T *data);
bool del_node(int inode);
T* get_node(int inode);
void clear_list();
protected:
private:
int length;
Node *phead;
Node *plast;
};
template<typename T>
bool List<T>::add_node(T *data)
{
if (!phead)
{
phead = new Node;
phead->data = new T;
if (!phead->data) { delete phead; return false; }
memcpy(phead->data,data,sizeof(T));
plast = phead;
plast->next = NULL;
length++;
}
else
{
plast->next = new Node;
plast->next->data = new T;
if (!plast->next->data) { delete plast->next; return false; }
memcpy(plast->next->data,data,sizeof(T));
plast = plast->next;
plast->next = NULL;
length++;
}
return true;
}
template<typename T>
bool List<T>::del_node(int inode)
{
Node *p = phead,*q = NULL;
if (inode <= 0 || inode > length)
{
return false;
}
if (1 == inode)
{
q = phead;
phead = q->next;
}
else
{
int i = 1;
while (i < inode-1)
{
p = p->next;
i++;
}
q = p->next;
p->next = q->next;
}
delete q->data;
delete q;
length--;
return true;
}
template<typename T>
void List<T>::clear_list()
{
Node *p = NULL;
while (phead)
{
p = phead->next;
delete phead->data;
delete phead;
phead = p;
}
length = 0;
phead = NULL;
plast = NULL;
}
template<typename T>
T* List<T>::get_node(int inode)
{
Node *p = phead;
if (inode <= 0 || inode > length)
{
return NULL; //
}
int i = 0;
while (i < inode-1)
{
p = p->next;
i++;
}
return (T*)p->data;
}
#endif
希望哪位大侠能出来指点下小弟,三个妞!
...全文
640 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2011-09-26
  • 打赏
  • 举报
回复
顶1楼!!让lz乱起变量名,忘了吧!!
星羽 2011-09-26
  • 打赏
  • 举报
回复
改成

double *b2 = l.get_node(2);



因为你上面已经定义了一个

double a = 2,b = 3;
dddz2012 2011-09-26
  • 打赏
  • 举报
回复

还真的是,傻了吧唧的!哎!感谢2楼,3楼,O(∩_∩)O哈哈~
《单片机系统的设计与制作》期末复习提纲 一、理论基础 (一)MCS-51单片机结构和原理 内部组成 (1)CPU(包括运算器和控制器)控制器的功能是:接受来自程序存储器ROM存储单 元的指令,并对其进行译码,通过定时和控制电路,按时序规定发出指令功能所需 要的各种(内部和外部)控制信息,使各部分协调工作,完成指令功能所需的操作 。 控制器主要包括程序计数器、指令寄存器、指令译码器及定时控制电路等。 (2) 运算器ALU 运算器的功能是:对数据进行算术运算和逻辑运算。计算机对任何数据的加工、处理 必须由运算器完成。 CPU是单片机内部的核心部件,是单片机的指挥和控制中心。CPU可分为运算器和控制 器两大部分。 (2)内部RAM(空间大小、作用;256B,用户可用于读写数据的为前128B……..) (3)内部ROM(空间大小、作用)(2)内部数据存储器(内部RAM) 8051芯片中共有256个RAM单元,但其中后128单元被专用寄存器占用,能作为寄存器 供用户使用的只是前128单元,用于存放可读写的数据。因此通常所说的内部数据存储器 就是指前128单元,简称内部RAM。 (3)内部程序存储器(内部ROM) 8051共有4KB掩膜ROM,用于存放程序、原始数据或表格,因此称之为程序存储器,简 称内部ROM。 (4)定时/计数器(2个16位……)(4)定时器/计数器 8051共有2个16位的定时器/计数器,以实现定时或计数功能,并以其定时或计数结果 对计算机进行控制。 (5)并行I/O(4个8位,P0,P1,P2,P3,其中P3口具有第二功能)5)并行I/O口 MCS- 51共有四个8位的I/O口(P0、P1、P2、P3),以实现数据的并行输入输出。在实训中我 们已经使用了P1口,通过P1口连接8个发光二极管。 (6)串行口(全双工串行口,可实现单片机与其他设备之间的串行数据传送)6)串 行口 MCS- 51单片机有一个全双工的串行口,以实现单片机和其它设备之间的串行数据传送。该串 行口功能较强,既可作为全双工异步通信收发器使用,也可作为同步移位器使用 (7)中断控制系统(5个中断源)(7)中断控制系统 MCS- 51单片机的中断功能较强,以满足控制应用的需要。8051共有5个中断源,即外中断2个 ,定时/计数中断2个,串行中断1个。全部中断分为高级和低级共二个优先级别 (8)时钟电路(需外接晶振和微调电容)MCS- 51芯片的内部有时钟电路,但石英晶体和微调电容需外接。时钟电路为单片机产生时钟 脉冲序列。系统允许的晶振频率一般为6MHZ和12MHZ。 (二)指令系统 1.指令格式 "标号 "操作码 "操作数或操作地址";注释 " ": " " " " 注意区分(1)单字节指令、双字节指令、三字节指令 (2)目的操作数、源操作数 2.寻址方式 (1)寄存器寻址 R0~R7 Rn(n=0~7):表示当前工作寄存器R0~R7中的任一个寄存器 (2)直接寻址 direct (30H)direct:表示片内RAM的8位单元地址 (3)立即数寻址 #data (#30H)#data:表示8位直接参与操作的立即数 (4)寄存器间接寻址 @Rn(n只能取0或1)Ri(i=0或1):表示通用寄存器组中用于间接寻址的两个寄存器R0 , R1。 (5)变址寻址 @A+DPTR (用于查表操作 操作码 MOVC)在间接寻址方式中,表示间接寻址寄存器指针的前缀标志 DPTR:数据指针,用于寄存器间接寻址方式和变址寻址方式 (6)相对寻址相对寻址 定义:将程序计数器PC的当前值(取出本条指令后的PC值)与指令第二个字节给出的 偏移量(rel)相加,形成新的转移目标地址。称为相对寻址方式。 特点:相对寻址方式是为实现程序的相对转移而设计的,为相对转移指令所使用,其 指令码中含有相对地址偏移量,能生成浮动代码。 如: SJMP rel ; (PC) (PC) + 2 + rel 相对转移指令的目的地址=指令地址+指令字节数+偏移量 寻址范围:只能对程序存储器ROM进行寻址。相对地址偏移量(rel)是一个带符号的 8位二进制补码,其取值范围为(128~+127(以PC为中间的256个字节范围)。 (7)位寻址位寻址 定义:指令中给出的操作数是一个可单独寻址的位地址,这种寻址方式称为位寻址方 式。 特点:位寻址是直接寻址方式的一种,其特点是对8位二进制数中的某一位的地址进 行操作。 寻址范围:片内RAM低128B中位寻址区、部分SFR(其中有83位可以位寻址)。 可位寻址的位地址的表示形式如下: (1)直接使用位地址形式。如: MOV 00H, C ;(00H) (Cy) 其中:00H是片内RAM中20H地址单元的第0位。 3.指令系统1)指令的格式、功能 。 (2)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧