gpt4 book ai didi

c++ - Objective C(++) Insanity——对单个浮点变量的简单赋值导致另一个变量中的 {{{CRAZY}}} 值

转载 作者:太空宇宙 更新时间:2023-11-04 14:27:43 31 4
gpt4 key购买 nike

memberA 定义在 ClassA 的头部。

memberB 定义在 ClassB 的头部。

B类是A类的子类

在 ClassB 的实例中,通过简单赋值设置 memberA:

memberA = 0.05

...也更改了 memberB,但变成了一个疯狂的数字 -- 1028443341。此外,将 0.05 分配给 memberA 会导致 memberA 在调试器中显示为 5.33083531e-38。

两个变量都是 float ,都不是指针。我几乎肯定会犯一些菜鸟错误,但我不知道它可能是什么。什么样的错误可能会导致为一个变量赋值导致两个变量出现疯狂的值?

********************* 编辑 **********************

我将问题缩小到我为获取 C++ 成员变量所做的一些“技巧”:

感谢大家的所有想法。让像我这样的菜鸟学习这种低级语言的东西是很危险的!这是问题所在:

@interface LoopyPulser : NSObject{

float _pulseRate;
UInt32 tickInterval;
UInt32 step;
InMemoryAudioFile * audioFilePlayer;
#ifdef __cplusplus
ADSR* env;
StkFrames* audioFrames;
# endif
Pattern * pattern;
float loopLengthRatio;
float volume;
}

我在 SO 的其他地方读到过这个#ifdef __cplusplus 业务,作为一种在头文件中导入 C++ 的方法,然后由 Obj-C 文件导入。现在在我看来,这是一个糟糕的想法,很可能是我疯狂错误的原因。如果我删除了#ifdef __cplusplus 中的成员变量,问题就消失了。

那么在 Obj-C++ 中拥有 C++ 成员变量的最佳方式是什么?我可以使用 ID 吗?

最佳答案

听起来 memberA 和 memberB 是某个类的浮点成员,由于您的程序编写时出现一些错误,该类正在经历随机内存损坏。

(1) 引用计数错误(如果您没有使用 GC)可能会导致保留计数为零并处理一个对象,而您仍然持有自己的引用。然后可以重新使用内存并导致这个有趣的结果。

(2) 一些其他的指针数学、错误的间接寻址或其他 C 编程或 ObjectiveC 类型的错误(搬起石头砸自己的脚)。

不要假设只有这两件东西坏了。如何把以下是您的代码:

// in your class declaration 1
int Magic1;
float MemberB;
int Magic2;
// same thing in class declaration 2:
int Magic1;
float MemberA;
int Magic2;


// somewhere else like your setup code for each of the two classes:
Magic1 = MAGIC_1;
Magic2 = MAGIC_2;

// somewhere else where the bug occurs
if (Magic1 != MAGIC_1) || (Magic2 != MAGIC_2) { ... do something helpful like NSLog(...) ... }

关于c++ - Objective C(++) Insanity——对单个浮点变量的简单赋值导致另一个变量中的 {{{CRAZY}}} 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2458652/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com