double 不会在 C++ 中保留它的值

A double won't hold its value in c++

我正在用 C++ 为 JNI 库编写一些代码,出于某种原因,我设置的双精度变量之一绝对不会保存我为它设置的值。其中作为一个浮点数,一个整数等都成立,代码如下:

void DualPlayer::process(SLAndroidSimpleBufferQueueItf caller) {
pthread_mutex_lock(&mutex);
__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"into process");
float *stereoBuffer = outputBuffer[currentBuffer];

bool masterIsA = (crossValue <= 0.5f);
float masterBpm = 125.0;
bpmMaster = 125;
double msElapsedSinceLastBeatA;
if(!hasAbeenPlayedYet){
    masterBpm = 125.0;
    __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG," A has not been played : %f",masterBpm);
    __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG," A has not been played bpmMaster: %d",bpmMaster);

} else {
    __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG," b has not been played: %f",masterBpm);
     masterBpm = masterIsA ? playerA->currentBpm : playerB->currentBpm;
     msElapsedSinceLastBeatA = playerA->msElapsedSinceLastBeat;
}
//__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"34");
 // When playerB needs it, playerA has already stepped this value, so save it now.
__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"56");
__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"%i",buffersize);
__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"%f",volA);


__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"double: %d",bpmMaster);
bool silence;
if(!hasAbeenPlayedYet){
     silence = !playerA->process(stereoBuffer, false, buffersize, volA,bpmMaster, -1.0);

} else {
 silence = !playerA->process(stereoBuffer, false, buffersize, volA,bpmMaster, playerB->msElapsedSinceLastBeat);

}
//__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"78");
if(hasAbeenPlayedYet){
    if (playerB->process(stereoBuffer, !silence, buffersize, volB, bpmMaster, msElapsedSinceLastBeatA)) silence = false;
}
//__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"90");
pthread_mutex_unlock(&mutex);
//__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"before short to int");
if (silence) memset(stereoBuffer, 0, buffersize * 4); else SuperpoweredStereoMixer::floatToShortInt(stereoBuffer, (short int *)stereoBuffer, buffersize);
//__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"after short to int");
(*caller)->Enqueue(caller, stereoBuffer, buffersize * 4);
//__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG,"stereobuffe put into queue");
if (currentBuffer < NUM_BUFFERS - 1) currentBuffer++; else currentBuffer = 0;
}

然而,在我的 logcat 中,我从 double 中得到这个值:

04-17 11:28:09.020  10179-10197/com.players.jason.dualplayers V/DualPlayer﹕ A has not been played : 125.000000
04-17 11:28:09.021  10179-10197/com.players.jason.dualplayers V/DualPlayer﹕ A has not been played bpmMaster: 1074686709

即出于某种原因,即使变量在头文件中声明并且我分配了它,它也不会坚持!但是浮动效果很好。

您的注销格式字符串有误

__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG," A has not been played bpmMaster: %d",bpmMaster);

%d 是整数说明符,使用 %lf 或 %f(无论如何都会忽略 l),例如:

__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG," A has not been played bpmMaster: %lf",bpmMaster);

所以 double 中的值是正确的。您的调试输出有问题。

尝试使用 %llu 打印它:

__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG," A has not been played bpmMaster: %llu",bpmMaster);

如果您提供一个小而完整的代码示例来展示您的问题,将会有所帮助。事实上,有很多操作,其中任何一个都可能是罪魁祸首。没有人可以缩小范围。

一般而言,最有可能的问题是,在您的程序中的某处,某些代码滥用了指针(写入 NULL 指针、取消引用悬空指针、脱离数组末尾)。

更改变量类型可能会更改 data/variables 在内存中的布局,因此会更改指针上的无效操作所影响的内容。因此,问题似乎通过更改变量的类型(或大小)而消失只是偶然事件 - 原因尚未解决。

原因可能出在您显示的代码中。它也可能在您未显示的代码中,例如正在调用的函数之一(您未显示代码)。