2011-01-27 95 views
0

即使printf不起作用,此代碼中出現了什麼問題。但它正在編譯這段代碼有什麼問題?事件printf未被打印

#include <speex/speex.h> 
#include <stdio.h> 
#include <stdlib.h> 
/*The frame size in hardcoded for this sample code but it doesn't have to be*/ 
#define FRAME_SIZE 160 



int main() 
{ 
    printf("decoding"); 
    char *outFile; 
    FILE *fout, *fs; 
    short out[FRAME_SIZE]; 
    float output[FRAME_SIZE]; 
    char cbits[200]; 
    int nbBytes; 
    void *state; 
    SpeexBits bits; 
    int i, tmp; 
    fout = fopen("test_40khz_mono_Q5.spx", "rb"); 
    if(fout == NULL){ 
    printf("******Error*******"); 
    } 
    else{ 
    printf("*******Okay********"); 
    } 

    fs = fopen("pcmfile","wb"); 
    if(fs == NULL){ 
    printf("****Error pcm creation****"); 
    } 
    else{ 
    printf("*****pcm File created*****"); 
    } 
state = speex_decoder_init(&speex_nb_mode); 

    tmp=1; 
    speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp); 
    speex_bits_init(&bits); 

    while (!(feof(fout))) 
    { 
    fread(&nbBytes, sizeof(int), 1, fout); 
    fread(cbits, 1, nbBytes, fout); //Problem area 
    speex_bits_read_from(&bits, cbits, nbBytes); 
    speex_decode(state, &bits, output); 

    for (i=0;i<FRAME_SIZE;i++) 
     out[i]=output[i]; 

     fwrite(out, sizeof(short), FRAME_SIZE, fs); 
    } 

    speex_decoder_destroy(state); 
    speex_bits_destroy(&bits); 
    fclose(fout); 
    fclose(fs); 
    return 0; 
} 
+2

有3個printf's。請問一個真正的問題。通過刪除所有不會導致問題的信號來清理你的例子。留下最小的部分,我會更有興趣看看它。 – 2011-01-27 12:42:53

+3

爲這些診斷性`printf`添加一些換行符 - 它們可能被成功調用,但直到緩衝區已滿,它們纔會真正到達屏幕,您調用fflush或者打印換行符,添加新行然後告訴我們在哪裏它得到 – tobyodavies 2011-01-27 12:45:01

回答

2

很可能是您的printf正在被緩衝,並且您的編程可能會崩潰(您沒有說出發生了什麼),導致緩衝區被丟棄。在* nix中的輸出一般是行緩衝,你會printf的,如果你結束行,像這樣將開始工作:

printf("decoding\n"); 

,或者你可以明確地刷新緩衝區(因爲你可能需要在某些平臺上)

printf("decoding\n"); 
fflush(stdout); 

不僅如此,如果我們沒有得到更多的信息很難幫助你。是否崩潰?它是否打印類似'Segmentation fault'或類似的東西?

HTH

0

您的printf()s可能不會出現,因爲您的程序在刷新緩衝區之前崩潰。

爲什麼會崩潰?很難說,也許讀入nbBytes的數字大於200,那麼你的下一次讀取會溢出分配給cbit的空間?

1

爲了看你的程序走多遠,你需要換行添加到您的的printf聲明:中

printf("decoding\n"); 

代替:

printf("decoding"); 

否則,輸出只是緩衝並從未寫入控制檯。