2012-03-06 45 views
1

我在這段代碼中遇到了一些麻煩。它具有quint8的競爭條件或問題。Qt原始類型,與QTimer賽車和C++

quint8 chunk3[CHUNK_SIZE_MULT]; 
memset(chunk3,0x00, sizeof(chunk3)); 
for (int cx = 0; cx < CHUNK_SIZE; cx++) 
    for (int cz = 0; cz < CHUNK_SIZE; cz++) { 
     int i = cx * CHUNK_SIZE + cz; 
     float abs[2]; 
     abs[0] = x * CHUNK_SIZE + lastPosX + cx; 
     abs[1] = z * CHUNK_SIZE + lastPosZ + cz; 
     int perlin = (int)(wallsPerlin->Get(abs[0], abs[1])) % 8; 
     chunk3[i] = perlin > 6 ? perlin : 0;//(int)(sin(i) + 1.0 * 32.0); 
    } 

如果我使用chunk3 [i] = 0或30或i%30,它將正常工作。然而,當我引入一個sin函數,rand函數或perlin噪聲時,它會拋出內存錯誤。我認爲這可能是從雙重轉換爲字符,但現在看起來不太可能。

有人可以澄清這是否與quint8或時間有關嗎?

是否使用QTimer間隔來調用上述代碼和OpenGL相關函數,QTimer是否可能在沒有完成前一個事件的情況下觸發一個事件?

如果是這樣,我怎樣才能更好地構建我的gameloop與Qt?使用usleep?

編輯:我現在看到這不是一個時間問題,因爲離開perlin和打印它,但設置chunk3 [i]到一個固定的30工作正常。

編輯:鑄造int quint8似乎並沒有解決這個問題。

+2

彈出一個正確的東西是quint8是一個字節的數據,並且你正在向它插入(int)轉換值(4字節)。我不認爲這是你的問題,但我會解決這個問題:)。 CHUNK_SIZE_MULT究竟是CHUNK_SIZE * CHUNK_SIZE? – 2012-03-06 20:53:29

+0

我首先投射到一個int,因爲我認爲它可能是它將一個double投射到char的問題。但我認爲這不是問題。 CHUNK_SIZE_MULT確實是CHUNK_SIZE * CHUNK_SIZE。 – RobotRock 2012-03-06 22:32:25

+0

我現在看到這不是一個計時問題,因爲離開perlin並打印它,但將chunk3 [i]設置爲固定的30就可以正常工作。 – RobotRock 2012-03-06 22:42:04

回答

0
 quint8 perlin = (quint8)((int)(wallsPerlin->Get(abs[0], abs[1])) % 8 + 8); 

修正了它。