簡體   English   中英

指針弄亂了我的價​​值觀

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM