我意识到,迄今为止编译器特有的,但是我期望的是,安置的远远说明应该是有意义的对那些真正地理解指针。

因此,我有两个应用程序,分享处理器的整个存储空间。

应用程序需要调function foo存在的应用程序,B。

我知道你的存储位置的功能foo。

因此,这应当工作,在应用程序:

typedef int (* __far MYFP)(int input);

void somefunc(void)
{
   int returnvalue;
   MYFP foo;

   foo = (MYFP) 0xFFFFFA;

   returnvalue = foo(39);
}
  • 是__远在正确的位置在typedef?
  • 我需要添加__远的(MYFP)铸的?
  • 一些信息表明,呼吁foo不需要引用,什么是您的经验?
  • 还有什么别的关于这个看起来不正确的,或许我尝试来完成这个吗?

  • 有没有更好的方式做到这一点?

编辑:

这是一个嵌入式装置(飞思卡尔S12XEQ设备)的使用代码的战士。这是一个16位设备与24位的存储空间,所以,是的,这是分段/库存的.

-亚当

有帮助吗?

解决方案

是__远在正确的位置在typedef?

[编辑,在响应ChrisN的评论--的感谢]

这是一个编译器的依赖功能,因为它不是部分的ANSI C。根据该手册的编译器 <http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM.pdf>,第8章,你拥有它正确放置。在其他编译器,可能需要反的顺序。这应该是很容易弄清楚,虽然由于完全两个选项之一将汇编与任何特定的编译器。

我需要添加__远的(MYFP)铸的?

不,这是部分的类型。

一些信息表明,呼吁foo不需要引用,什么是您的经验?

功能的指针可以选择地引用。下线是两个有效的做同样的事情:

foo = (MYFP)0xFFFFFA;
returnvalue = foo(39);  // 1
returnvalue = (*foo)(39);  // 2

还有什么别的关于这个看起来不正确的,或许我尝试来完成这个吗?

你已经做到了完全正确。

其他提示

__far 关键词,至少在MS的世界,是使用当时创造的二进制文件中使用的分段记忆。你需要了解8086存储系统来理解这一点。8086分记忆进入分段,每个分段是64K长,因此每个地址在一段必要的16位.地址来了两种形式:远近。近地址是16位,是一个抵消为目前的段,一个CS,DS,ES,SS根据的指令,是32位,并包括一段以及偏移。在8086,绝对地址是16*段移给一个可寻的范围为1mb.

如果你不使用一个分段存储系统,并且它看起来就像你是不是,那么所有的地址具有同样的位数所以近/远的区分是不必要的,这意味着关键字大概是忽略的编译器。

这是一段代码工作从一个项目,我的工作。它的范C++,使它使用的一些版本的Borland.CPU它使用的是一个8086克隆,因此分割的20位存储器。

void softSerial0SR(unsigned16);
void (__far *softHandler)(unsigned16);

我初始化softHandler为0没有投诉。

然后,

softHandler = softSerial0SR;

在设置代码。

称呼它,就叫softHandler像一个普通的功能。

注意,这个代码是稍微调整了你从实际代码我有。

这两个项目都由相同的编译/选项,因此它们使用相同的腰带?

同意代码看起来不错-在这种情况下,我会得到一个拆卸产生的代码和图出,如果它出来的权利。应该只有10说明,在大多数-然后你会知道的如果它的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top