2015-01-09 59 views
-1

我正在編寫一個代碼輸出文件中的數據。代碼生成(幅度)函數尚未定義好。在編譯時,它運行正常,但輸出不是我所期望的。即使使用dwVal=0,輸出也是相同的:一串升序值而不是正弦值。帶正弦的正弦音產生(雙)意外地填滿了內存塊

long dwData=200; 
HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE, dwLength); 
int wData=(int)GlobalLock(hData);//no cast to (int) 

    for(int i=0;i<dwLength;i++){ 
     DWORD dwVal=16384*sin((double)i/20*pi); 
     memset(&wData+i, dwVal, 2); 
    }; 

//save data 
    if (!PathFileExists(szName1)) 
     strcpy(szName1, "output.pcm"); 

FILE* file=fopen(szName1, "wb"); 
    for(i=0;i<dwLength;i++){ 
     DWORD j=fputc((int)&wData+i, file); 
     if (j==EOF){ 
      cvar.mbsz("error writing", "titlu", j); 
      return; 
     }; 
    }; 
    fclose(file); 

請幫我澄清第一部分(正弦一代)以及它應該是什麼樣子。非常感謝您的時間。

編輯

int *wData=(int*)GlobalLock(hData);//no cast to (int) 

DWORD dwVal; 
    for(int i=0;i<dwLength;i++){ 
     dwVal=16384*sin(pi/20*(long)i); 
     wData[i]=dwVal; 
    }; 

FILE* file=fopen(szName1, "wb"); 
DWORD j; 
    for(i=0;i<dwLength;i++){ 
     j=fwrite(&wData[i], 1, 1, file); 
     if (j==EOF){ 
      return; 
     }; 
    }; 
    fclose(file); 

謝謝MSalters。我試圖在這裏和那裏做一些替換,但不能說它編譯。我是C++中的一個newby,我需要它在C++中...可以爲我寫下for循環。如果你同意我的觀點,dwVal變量不一定是數組。 dwLength是一個有限長度(200)。

謝謝你的觀察邁克爾華爾茲!

double pi=3.1415926535; 
long dwData=200; 
HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE, dwLength); 
long *wData=(long*)GlobalLock(hData); 

long dwVal; 
    for(int i=0;i<dwLength;i++){ 
     dwVal=16384*sin(i/20*pi); 
     wData[i]=dwVal; 
    }; 

//save data 
    if (!PathFileExists(szName1)) 
     strcpy(szName1, "output.pcm"); 

FILE* file=fopen(szName1, "wb"); 
    for(i=0;i<dwLength;i++){ 
     DWORD j=fwrite(&wData[i], 2, 1, file); 
     if (j==EOF){ 
      cvar.mbsz("error writing", "titlu", 0); 
      return; 
     }; 
    }; 
    fclose(file); 

我關閉的方式&發佈對象和文件可以嗎?

+0

'dwLength'的內容是什麼? –

+0

更糟糕的是,我回答了一個話題,就像我自己的一樣,在C中給了一個回覆,現在懷疑它會起作用。當我回來時,我會搜索它並重新進行驗證。 – paul

回答

0

你可能想是這樣的:

DWORD dwLength = 200 ; 
    HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE, dwLength); 

    int *wData=(int*)GlobalLock(hData); 

    for(int i = 0;i < dwLength; i++){ 
     wData[i] = 16384 * sin((double)i/20 * PI); 
    } 

你應該纔去學習一些C基礎知識。

+0

是的,它運行正常,但輸出pcm有預期的內容。對於我的主題,我很抱歉成爲新手和接受缺點,但我希望這個程序能夠順利運行,也許我會在你的幫助下運行它。另外,請原諒我的英文不理解MSalters。我的應用程序需要在RIFF文件中寫入Unicode chr $以及dwLength的這段代碼。這個正弦代碼將存儲在文件中,應用程序將查找這些代碼並返回一個Unicode字符。謝謝M.華爾茲 – paul

2

memset不是賦值運算符。同樣,GlobalLock返回一個有充分理由的指針。不要將它轉換爲非指針類型。由於您要存儲DWORD,因此將其轉換爲DWORD*,請選擇帶有[i]的數組元素並使用=賦值運算符。