二维数组指针表示法适用于一个版本但不适用于其他版本...我认为

时间:2012-09-28 04:09:11

标签: c pointers multidimensional-array

当我对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 for the array

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函数。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

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

framebufferheightframebufferwidth unsigned longframebufferwidth指针数组的数组 IT IS

指针指向unsigned long的{​​{1}}指针数组。

这是因为,在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,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,