当我为32位版本使用以下函数定义时,一切都很好:
void intensifyPixel(int x, int y, double distance, unsigned long *grid[framebufferheight][framebufferwidth], unsigned long color){
unsigned long intensity;
//assign intensity returned from filter function
intensity = filter ((floor(fabs (distance)) + .5), color);
//write intensity value to x,y coordinates of framebuffer memory
*( *(grid + y) + x) = intensity;
}
现在,我正在尝试使用相同的代码来实现一个16位版本,除了数组的无符号短代码而不是无符号长代码
void intensifyPixel(int x, int y, double distance, unsigned short *grid[framebufferheight][framebufferwidth], unsigned short color){
unsigned short intensity;
//assign intensity returned from filter function
intensity = filter ((floor(fabs (distance)) + .5), color);
//write intensity value to x,y coordinates of framebuffer memory
*( *(grid + y) + x) = intensity;
}
我相应地更改了filter函数的返回类型。
这里有一个链接,指向有效的代码(32位版本):http://codepad.org/GsK00pd5
以下是无法正常工作的代码链接(16位版本:http://codepad.org/6eAeTful
那里有很多。我真的很难缩小这个问题的范围,对此我深表歉意。
我希望你们中的一个人能看到我看不到的东西。
值得一提的是,这里的要点是将指向二维数组的指针传递给intensityPixel函数。
感谢您提供的任何帮助。
定义为参数unsigned long *grid[framebufferheight][framebufferwidth]
,grid
不是
framebufferheight
的数组指向unsigned long
的framebufferwidth
指针的数组,IT IS
指向指向CCD_ 7的CCD_ 6指针数组的指针。
这是因为,在C中,数组永远不会作为参数整体传递。传递的不是数组,而是指向其第一个元素的指针,不管语法如何。再看看我说的grid
是和不是。这就是本质。
现在,*( *(grid + y) + x)
或等效地,grid[y][x]
解析为指向unsigned long
的指针。
给指针指定一个整数不太可能是你想要的。
您可能想以这种方式重新定义grid
参数:
unsigned long grid[framebufferheight][framebufferwidth]
或者等效地说:
unsigned long (*grid)[framebufferwidth]
所以CCD_ 13将解析为CCD_。
功能之外的帧缓冲区可以静态分配:
// 2-d array of unsigned longs
unsigned long grid[framebufferheight][framebufferwidth];
或动态:
// pointer to an array of framebufferwidth unsigned longs
unsigned long (*grid)[framebufferwidth] = malloc(sizeof(unsigned long) * framebufferheight * framebufferwidth);
按原样传递给intensifyPixel()
:intensifyPixel(..., grid, ...)
,并以相同方式访问:grid[y][x] = something;
更新:如果尽管我试图解释它,但你仍然没有正确理解或忘记了什么,请参阅更完整的示例:
#include <stdio.h>
#include <stdlib.h>
#define framebufferheight 20
#define framebufferwidth 64
void visualize(unsigned long (*grid)[framebufferwidth])
{
int y, x;
for (y = 0; y < framebufferheight; y++)
{
for (x = 0; x < framebufferwidth; x++)
printf("%c", (char)grid[y][x]);
printf("n");
}
}
void drawBox(unsigned long (*grid)[framebufferwidth],
int x1, int y1, int x2, int y2, char c)
{
int y, x;
for (y = y1; y <= y2 ; y++)
for (x = x1; x <= x2; x++)
grid[y][x] = c;
}
void clear(unsigned long (*grid)[framebufferwidth], char c)
{
drawBox(grid, 0, 0, framebufferwidth - 1, framebufferheight - 1, c);
}
int main(void)
{
{
unsigned long (*grid)[framebufferwidth] = malloc(sizeof(unsigned long) * framebufferheight * framebufferwidth);
clear(grid, '.');
drawBox(grid, 1, 1, 10, 5, '1');
drawBox(grid, 40, 10, 55, 18, '2');
grid[framebufferheight / 2][framebufferwidth / 2] = '+';
visualize(grid);
}
{
unsigned long grid[framebufferheight][framebufferwidth];
clear(grid, ',');
drawBox(grid, 1, 1, 10, 5, 'a');
drawBox(grid, 40, 10, 55, 18, 'b');
grid[framebufferheight / 2][framebufferwidth / 2] = '*';
visualize(grid);
}
return 0;
}
输出(视频):
................................................................
.1111111111.....................................................
.1111111111.....................................................
.1111111111.....................................................
.1111111111.....................................................
.1111111111.....................................................
................................................................
................................................................
................................................................
................................................................
................................+.......2222222222222222........
........................................2222222222222222........
........................................2222222222222222........
........................................2222222222222222........
........................................2222222222222222........
........................................2222222222222222........
........................................2222222222222222........
........................................2222222222222222........
........................................2222222222222222........
................................................................
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,aaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,aaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,aaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,aaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,aaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,bbbbbbbbbbbbbbbb,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,