2012-03-03 84 views
0

我正在編寫我自己的俄羅斯方塊版本。在創建blockRotation方法時,我遇到了memcpy的奇怪問題。在第二次調用blockRotate的過程中,我的bool [4 * 4]數組沒有正確地保存,儘管生成正確。怎麼了?Memcpy意外行爲

這是我的錯誤日誌:

arr_shift[0]: true 
arr_shift[1]: false 
arr_shift[2]: false 
arr_shift[3]: false 
arr_shift[4]: true 
arr_shift[5]: true 
arr_shift[6]: false 
arr_shift[7]: false 
arr_shift[8]: true 
arr_shift[9]: false 
arr_shift[10]: false 
arr_shift[11]: false 
arr_shift[12]: false 
arr_shift[13]: false 
arr_shift[14]: false 
arr_shift[15]: false 
arr_rot[0]: false 
arr_rot[1]: false 
arr_rot[2]: true 
arr_rot[3]: false 
arr_rot[4]: false 
arr_rot[5]: false 
arr_rot[6]: true 
arr_rot[7]: true 
arr_rot[8]: false 
arr_rot[9]: false 
arr_rot[10]: true 
arr_rot[11]: false 
arr_rot[12]: false 
arr_rot[13]: false 
arr_rot[14]: false 
arr_rot[15]: false 
shape[0]: true 
shape[1]: false 
shape[2]: false 
shape[3]: false 
shape[4]: true 
shape[5]: true 
shape[6]: false 
shape[7]: false 
shape[8]: true 
shape[9]: false 
shape[10]: false 
shape[11]: false 
shape[12]: false 
shape[13]: false 
shape[14]: false 
shape[15]: false 


arr_shift[0]: false 
arr_shift[1]: false 
arr_shift[2]: false 
arr_shift[3]: false 
arr_shift[4]: false 
arr_shift[5]: false 
arr_shift[6]: false 
arr_shift[7]: false 
arr_shift[8]: false 
arr_shift[9]: false 
arr_shift[10]: false 
arr_shift[11]: false 
arr_shift[12]: false 
arr_shift[13]: false 
arr_shift[14]: false 
arr_shift[15]: false 
arr_rot[0]: false 
arr_rot[1]: true <--- 
arr_rot[2]: true <--- 
arr_rot[3]: true <--- 
arr_rot[4]: false 
arr_rot[5]: false 
arr_rot[6]: true <--- 
arr_rot[7]: false 
arr_rot[8]: false 
arr_rot[9]: false 
arr_rot[10]: false 
arr_rot[11]: false 
arr_rot[12]: false 
arr_rot[13]: false 
arr_rot[14]: false 
arr_rot[15]: false 
shape[0]: false 
shape[1]: false <--- 
shape[2]: false <--- 
shape[3]: false <--- 
shape[4]: false 
shape[5]: false 
shape[6]: false <--- 
shape[7]: false 
shape[8]: false 
shape[9]: false 
shape[10]: false 
shape[11]: false 
shape[12]: false 
shape[13]: false 
shape[14]: false 
shape[15]: false 

這是我的代碼:

形狀的
memset(shape, 0, 16*sizeof(bool)); 
if(toShift == true) { 
    memcpy(shape, arr_shift, 16*sizeof(bool)); 
} 
else { 
    memcpy(shape, arr_rot, 16*sizeof(bool)); 
} 
for(int i = 0; i < 4; i++) { 
    for(int j = 0; j < 4; j++) { 
     fprintf(stderr, "shape[%i]: %s\n", i*4+j, shape[i*4+j]? "true":"false"); 

    } 
} 
fprintf(stderr, "\n\n"); 

Declararation是Block類標題,如下所示:

bool shape[16]; 
+1

如果這是一個memcpy問題,請你可以構造一個簡單的代碼示例,避免所有(顯然)不相關的東西(移位,旋轉等)。理想情況下,不超過10行! – 2012-03-03 14:25:05

+2

'memcpy'意外的行爲!新聞在11 ... – Malkocoglu 2012-03-03 14:29:35

+0

完全不相關的'memset' *之前的重點是什麼?你用其他值覆蓋同樣的內存?另外,你是如何設法打印這麼多噪音的,但卻錯過了**形狀的聲明,這顯然是你的問題的核心。 – 2012-03-03 14:30:37

回答

1

您還沒有向我們展示arr_rot是在哪裏申報的,或者toShift是什麼值。但是,最有可能的是toShifttrue或者您聲明arr_rot指向另一個函數的堆棧中。

+0

你是對的。顯然對Shift來說總是如此。 damm你筆記本鍵盤! – icepopo 2012-03-03 15:11:13