【问题标题】:Objective C(++) Insanity -- simple assignement to a single float variable results in {{{CRAZY}}} values in another variableObjective C(++) Insanity - 对单个浮点变量的简单赋值导致另一个变量中的 {{{CRAZY}}} 值
【发布时间】:2010-03-16 22:35:11
【问题描述】:

memberA 在 ClassA 的头部定义。

memberB 在 ClassB 的头部定义。

ClassB 是 ClassA 的子类

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

memberA = 0.05

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

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

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

我将问题缩小到我为了获取 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 吗?

【问题讨论】:

  • 我认为AB 的一组类定义仍然可以重现问题将是一个好主意。问题中的英文描述往往无法传达必要的细节。
  • 另外知道您使用的编译器和调试器会有所帮助,也可能是它们无法正常工作
  • 是的,我认为源代码示例对于在这种情况下确定可能的解决方案至关重要。
  • 复制了您所描述的内容,这里没有问题。是时候找一些来源了。
  • 我最初没有包含源代码,因为这看起来很奇怪,很可能简化版本可以正常工作。我敢打赌,如果我简化,我将无法重现它。我会慢慢简化,直到我弄清楚它是什么,或者它足够简单,可以在这里发帖。祝我好运!

标签: c++ objective-c


【解决方案1】:

听起来 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(...)  ... }

【讨论】:

  • 感谢沃伦的故障排除指点。我最终只是逐步简化,直到问题消失,结果证明这与我没有掌握如何混合 Objective C 和 C++ 有关。
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多