gpt4 book ai didi

c - 二维数组指针符号适用于一个版本但不适用于另一个版本......我认为

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:37 25 4
gpt4 key购买 nike

当我对 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 位版本,除了数组的 unsigned short 而不是 unsigned long

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;
}

我相应地更改了过滤器函数的返回类型。

这是有效代码的链接(32 位版本):http://codepad.org/GsK00pd5

这是无法正常工作的代码链接(16 位版本:http://codepad.org/6eAeTful

那里有很多。我真的很难缩小这个问题的范围,对此我深表歉意。

我希望你们中的一个能看到我看不到的东西。

可能值得一提的是,这里的重点是将指向二维数组的指针传递给 intensifyPixel 函数。

感谢您提供的任何帮助。

最佳答案

定义为参数unsigned long *grid[framebufferheight][framebufferwidth] , grid 不是

framebufferheight数组 framebufferwidth 的数组指向 unsigned long 的指针, 它是

指向 framebufferwidth 数组的指针指向 unsigned long 的指针.

那是因为,在 C 语言中,数组永远不会作为整个参数传递。传递的不是数组,而是传递指向其第一个元素的指针,无论语法如何。再看看我说的grid是和不是。这就是本质。

现在,*( *(grid + y) + x)或者,等效地,grid[y][x]解析为指向 unsigned long 的指针.

将整数分配给指针不太可能是您想要的。

您可能想重新定义 grid参数这样:

unsigned long grid[framebufferheight][framebufferwidth]

或者等效地这样:

unsigned long (*grid)[framebufferwidth]

所以 grid[y][x]将解析为 unsigned long而不是指向一个的指针。

函数外的帧缓冲区可以静态分配:

// 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;
}

输出(ideone):

................................................................
.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,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

关于c - 二维数组指针符号适用于一个版本但不适用于另一个版本......我认为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12633442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com