【问题标题】:pointers messing with my values指针弄乱了我的价​​值观
【发布时间】:2015-04-27 16:01:52
【问题描述】:

我正在做这个学校项目,它画了两只兔子,你应该能看穿其中一只。请注意,整个代码只是老师制作的模板,我们应该用我们自己的代码填充它。 所以我有一个循环遍历所有像素,而不是立即绘制,我们应该将它们存储在 Head 和 Node 缓冲区中。 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

当我让循环运行并像这样打印它时,得到的值也会发生变化,但仍然是巨大的

headbuffer 被初始化为保存 sizeof(int) 并保存它们的 width*heigth(of the window),每个元素的开头都是 -1

Nodebuffer 只是设置为保存 sizeof(S_Frag) 的元素,而 vecPushBack() 为我管理内存

当我尝试 printf() *ext、index、Q、fragmentIn.next 时,一切看起来都很好

如果你能指出错误,我将不胜感激,谢谢

哦,顺便说一句,除了我的 student.c 文件,我无法更改任何其他内容

编辑:我还尝试使用

从片段中获取深度
printf("::%f\n", fragmentOut->depth);

输出中有一些 0 和 -0.00000 以及诸如 -1523...25 个零...0.00000 之类的数字

【问题讨论】:

  • vecGetPtr() 返回一个 void 指针,该指针被强制转换为 S_Frag*。只要NodeBufferS_Frag 的向量,这不是问题......你如何确保它是这种情况?
  • 当渲染器被调用时,有一个函数会初始化所有内容和其中的一部分:NodeBuffer = vecCreateEmpty(sizeof(S_Frag ));
  • 在 makefrag 函数中,它试图返回一个完整的结构。这不是好的做法。更好地分配一个结构,填写结构字段,然后返回一个指向结构的指针。
  • 'typedef' 结构是一个坏主意。它使代码混乱,可能(而且经常是)误导,并使编译器名称空间混乱。
  • 在创建结构的链表时,'next' 字段应该是指向结构类型的指针,而不是整数。

标签: c pointers


【解决方案1】:

好的,我刚刚弄明白了,当然是我犯了错误,而不是仔细检查...还有另一个函数可以清除缓冲区,我认为它不会经常清除它们,但实际上它会清除它们经常,这造成了所有的混乱:D

感谢您的宝贵时间,已解决

【讨论】:

  • 请不要在这里使用不好的语言。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
相关资源
最近更新 更多