Цель C (++) Безумие - простое присвоение одной переменной с плавающей точкой приводит к значениям {{{CRAZY}}} в другой переменной - PullRequest
1 голос
/ 17 марта 2010

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;
}

Я читал об этом #ifdef __cplusplus бизнесе где-то еще на SO, как способ импорта C ++ в заголовочные файлы, которые затем импортируются файлами Obj-C. Теперь мне кажется, что это ужасная идея и, скорее всего, причина моей сумасшедшей ошибки. Если я удалю членские переменные внутри #ifdef __cplusplus, безумие исчезнет.

Итак, как лучше всего иметь переменные-члены C ++ в Obj-C ++? Могу ли я использовать идентификаторы, может быть?

1 Ответ

0 голосов
/ 17 марта 2010

Похоже, что 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(...)  ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...