0

C と OpenGL の画像をウィンドウに表示する作業を行っています。私はこのような構造体を持っています:

typedef struct imagemRGB ImagemRGB;
struct imageRGB {
    int  width;        
    int height;        
    PixelRGB **pixel;
};

**pixelは、画像内の各ピクセルとその色を表す行列です。PixelRGB は次のような構造体です。

typedef unsigned char Byte;

typedef Byte Boolean;

/*-------------------------------------------------------------*/
/* pixel True Color */
/* http://en.wikipedia.org/wiki/True_Color#True_color_.2824-bit.29 */
typedef struct pixelRGB PixelRGB;
struct pixelRGB {
  Byte    red;         /* valor entre 0 e 255 */
  Byte    green;       /* valor entre 0 e 255 */
  Byte    blue;        /* valor entre 0 e 255*/
  Boolean visited;    /* TRUE ou FALSE */ 
};

次の関数シグネチャがあります。

void copyImageRGB (ImageRGB *target, ImageRGB *origin);

この関数は、イメージ構造 ( widthheightおよび each pixel) をにコピーすることになっているtargetため、OriginalImage を最初から保存できます。

私はこのコードでそれを実装しています:

copyImageRGB (ImageRGB *target, ImageRGB *origin)
{
int i, j;

target->width = origin->width;
target->height = origin->height;
for(i = 0; i < origin->height; i++)
  for(j = 0; j < origin->width; j++)
  {
    target->pixel[i][j].red = origin->pixel[i][j].red;
    target->pixel[i][j].blue = origin->pixel[i][j].blue;
    target->pixel[i][j].green = origin->pixel[i][j].green;
  }
}

mainしかし、引数がローカル変数であるため、期待どおりに機能するかどうかはわかりません。私は正しいですか?次のことができるように、この関数をどのように実装しますcopyImageRGB(target, originalImage);main?

4

2 に答える 2

2

問題が何であるか正確にはわかりませんが、両方のパラメーターが有効なオブジェクトへのポインターである限り、関数は正常に機能するはずです。copyImageRGB() でピクセル マトリックスにメモリを割り当てる必要があります。たとえば、次のようなものが機能するはずです。

copyImageRGB (ImageRGB *target, ImageRGB *origin)
{
int i, j;

target->width = origin->width;
target->height = origin->height;
target->pixel = (PixelRGB**)malloc(sizeof(PixelRGB[origin->height][origin->width])); // <------ NOTE memory allocation
for(i = 0; i < origin->height; i++)
  for(j = 0; j < origin->width; j++)
  {
    target->pixel[i][j].red = origin->pixel[i][j].red;
    target->pixel[i][j].blue = origin->pixel[i][j].blue;
    target->pixel[i][j].green = origin->pixel[i][j].green;
  }
}


int main() {
    ImageRGB originalImage;

    // initialize originalImage somehow

    ImageRGB target;

    copyImageRGB(&target, &originalImage);
}
于 2013-09-08T07:52:11.097 に答える
1

関数を呼び出すときにローカル変数がまだ生きている限りcopyImageRGB、コードは機能します (コンパイル)。ただし、pixelフィールドはポインターへの単なるポインターであるため、ターゲットにフィールドを割り当てる必要があります。そして、あなたはそれを内部mainで行うことができますが、内部で割り当てる方が良いオプションになる可能性がありますcopyImageRGB:

copyImageRGB (ImageRGB *target, ImageRGB *origin)
{
int i, j;
target->pixel = malloc(sizeof(PixelRGB) * origin->height * origin->width);
target->width = origin->width;
target->height = origin->height;
for(i = 0; i < origin->height; i++)
  for(j = 0; j < origin->width; j++)
  {
    target->pixel[i][j].red = origin->pixel[i][j].red;
    target->pixel[i][j].blue = origin->pixel[i][j].blue;
    target->pixel[i][j].green = origin->pixel[i][j].green;
  }
}

ピクセルを解放することを忘れないでください!

int main()
{
    ImageRGB src = /* Get is somehow */;
    ImageRGB target;

    copyImageRGB(&target, &src);
    free(src->pixel);
    free(target->pixel);
    return 0;
} 

また、ポインターをローカル変数として使用することもできますが、その場合は必ずtarget構造体を割り当てる必要があります。

int main()
{
    ImageRGB *src = /* Get it somehow */;
    ImageRGB *target = malloc(sizeof(ImageRGB));

    copyImageRGB(target, src);

    // Don't forget to free!
    free(src->pixel);
    free(src);
    free(target->pixel);
    free(target);

    return 0;

}
于 2013-09-08T07:50:33.590 に答える