客観的なC(++)狂気-単一のfloat変数への単純な割り当ては、別の変数に{{{CRAZY}}}値をもたらす

c++ objective-c
客観的なC(++)狂気-単一のfloat変数への単純な割り当ては、別の変数に{{{CRAZY}}}値をもたらす

memberAは、ClassAのヘッダーで定義されます。

memberBは、ClassBのヘッダーで定義されます。

ClassBはClassAのサブクラスです

ClassBのインスタンス内で、単純な割り当てを介してmemberAを設定します。

memberA = 0.05

…​also changes memberB, but to a crazy number — 1028443341.
さらに、0.05をmemberAに割り当てると、デバッガーに5.33083531e-38としてmemberAが表示されます。

両方の変数は浮動小数点数であり、どちらもポインターではありません。 私はほとんど間違いなくnoobの間違いを犯していますが、それが何であるかについての手がかりはありません。 1つの変数に値を割り当てると、2つの変数に狂った値が表示されるため、どのような種類の混乱が発生する可能性がありますか

  • 編集**

私は、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;
}

この#ifdef cplusplusビジネスについては、SOのどこかで読みました。ヘッダーファイルにC ++をインポートしてから、Obj-Cファイルによってインポートする方法として。 これはひどい考えであり、恐らく私のクレイジーなバグの原因である可能性が高いように思えます。 #ifdefcplusplus内のメンバー変数を削除すると、狂気はなくなります。

それでは、Obj-C でC メンバー変数を使用する最良の方法は何でしょうか。 多分IDを使用できますか?

  1  0


ベストアンサー

memberAやmemberBのようなサウンドは、プログラムにエラーが発生したためにランダムなメモリ破損が発生しているクラスの浮動小数点メンバーです。

(1)参照カウントエラー(GCを使用していない場合)は、保持カウントが0になり、オブジェクトが破棄される可能性があります。 その後、メモリを再利用して、この興味深い結果を引き起こすことができます。

(2)他のいくつかのポインター計算、誤った間接指定、または他のCプログラミングまたはObjectiveCのタイプの間違い(自己撮影)。

壊れているのはこれらの2つだけだと思い込まないでください。 以下をコードに入れてみてはいかがですか:

// 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(...)  ... }

0


タイトルとURLをコピーしました