1

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

現在、配列の unsigned long ではなく unsigned short を除いて、同じコードを使用して 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;
}

それに応じて、フィルター関数の戻り値の型を変更しました。

動作するコードへのリンクは次のとおりです (32 ビット バージョン): http://codepad.org/GsK00pd5

正しく動作しないコードへのリンクは次のとおりです (16 ビット バージョン: http://codepad.org/6eAeTful

そこにはたくさんあります。この問題を絞り込むのは非常に難しく、申し訳ありません。

私が見えないものをあなたの誰かが見ることができることを願っています。

ここでのポイントは、2 次元配列へのポインターを intensifyPixel 関数に渡すことです。

ご協力いただきありがとうございます。

4

1 に答える 1

2

パラメータとして定義unsigned long *grid[framebufferheight][framebufferwidth]grid IS NOT

へのポインタの配列framebufferheight配列、IT ISframebufferwidthunsigned long

へのポインターの配列へのframebufferwidthポインターunsigned long

これは、C では配列全体がパラメーターとして渡されることがないためです。配列が渡される代わりに、構文やそうでないものに関係なく、最初の要素へのポインターが渡されます。私が言ったこととそうgridでないことをもう一度見てください。それが本質です。

現在、*( *(grid + y) + x)または同等に、grid[y][x]へのポインターに解決されますunsigned long

ポインターに整数を代入することは、あなたが望むものではありません。

おそらく、grid次のようにパラメーターを再定義する必要があります。

unsigned long grid[framebufferheight][framebufferwidth]

またはこれと同等の方法:

unsigned long (*grid)[framebufferwidth]

そのため、1 つへのポインターではなく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,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
于 2012-09-28T04:52:32.497 に答える