[英]pointers messing with my values
我正在這個學校的項目上工作,該項目畫了兩個兔子,您應該可以看透其中的一個。 請注意,整個代碼只是教師制作的模板,我們應該使用自己的代碼填寫。 因此,我有一個遍歷所有像素的循環,而不是立即繪制,我們應該立即將它們存儲在Head和Node Buffer中。 HeadBuffer僅存儲索引,以后在訪問NodeBuffer時將使用這些索引。
參見此處: http : //developer.amd.com/wordpress/media/2013/06/2041_final.pdf
我的問題是,在填充緩沖區時,在存儲完值后無法正確撤消該值,因此我無法正確訪問它以對其進行排序,混合顏色並寫出。
用C寫
聲明:
//in student.c
local:
int Q;
global:
S_Frag fragmentIn;
S_Frag *fragmentOut;
int *ext;
int index;
//up to here
。
typedef struct S_Vector
{
int size;
int reserved;
int elemSize;
char * data;
} S_Vector;
typedef struct S_Frag
{
S_RGBA color;
double depth;
int next;
} S_Frag;
//returns pointer to the i-th element
IZG_INLINE void * vecGetPtr(S_Vector *pVec, int i)
{
IZG_ASSERT(pVec && i < pVec->size);
return pVec->data + i * pVec->elemSize;
}
IZG_INLINE S_Frag makeFrag(S_RGBA color, double depth, int next)
{
S_Frag frag;
frag.color = color;
frag.depth = depth;
frag.next = next;
return frag;
}
//appends pElem to the end of S_Vector, returns index of new pElem
int vecPushBack(S_Vector *pVec, void *pElem);
//sets the i-th elem. of pVec to pElem
IZG_INLINE void vecSet(S_Vector *pVec, int i, void * pElem)
{
IZG_ASSERT(pVec && i < pVec->size && pElem);
MEMCOPY(pVec->data + i * pVec->elemSize, pElem, pVec->elemSize);
}
。
//student.c
Q = x + y*globWidth; //make 2 dimensional array 1 dimensional
ext = (int *) vecGetPtr(HeadBuffer, Q); //get index that was in headBuffer
fragmentIn = makeFrag(color, z, *ext); //put it in a new fragment
index = vecPushBack(NodeBuffer, &fragmentIn);//put new frag. in nodebuffer
vecSet(HeadBuffer, Q, &index);//update index in headbuffer
//here comes the messed up part
fragmentOut = (S_Frag *) vecGetPtr(NodeBuffer, index);
printf("::%d\n", fragmentOut->next);
// expected: -1 or 435 or 46 or 1120
// gotten: -8503629141
當我讓循環運行並像這樣打印它時,獲得的值也會改變,但仍然有些巨大
頭緩沖區被初始化為保留sizeof(int)並保留width * heigth(窗口的高度),每個元素的開頭為-1
只是將Nodebuffer設置為容納sizeof(S_Frag)的元素,而vecPushBack()為我管理內存
當我嘗試printf()* ext,index,Q,fragmentIn.next時,一切看起來都很好
如果您能分辨出錯誤,我將非常感謝,謝謝
哦,順便說一句,除了我的student.c文件,我無法更改其他任何內容
編輯:我還嘗試使用片段來獲取深度
printf("::%f\n", fragmentOut->depth);
在輸出中有一些0,-0.00000以及數字,例如-1523 ... 25 zeros ... 0.00000
好的,我已經弄清楚了,當然是我犯了錯誤而不是仔細檢查了。還有另一個函數可以清除緩沖區,我認為它不經常清除它們,但是實際上它可以非常頻繁地清除它們,並且造成所有混亂:D
無論如何,謝謝您的時間,解決了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.