2016-04-19 14 views
1

私はC言語を新しくしており、以下の問題を解決する必要があります。ポインタを使ったディープコピー構造体

私は小さなbmp(512x512)イメージを読んでいるプロジェクトがあります。私は色を変更して、それを鏡映にしました(両方が垂直で水平です)。私は今それを-90°にする必要がある。私が動作することができない機能は、DiffCopyBitmap()です。

私は*copy->raster[i]上で、次のエラーを取得しておいてください。

indirection requires pointer operand ('PIXEL' (aka 'struct _pixel') invalid)

ROTATION(512×512)

typedef struct _pixel { 
    unsigned char blue; 
    unsigned char green; 
    unsigned char red; 
} PIXEL; 

typedef struct _bitmap { 
    char file_path[PATH_MAX+1]; 
    char magic_number[3]; 
    unsigned int size; 
    unsigned char application[5]; 
    unsigned int start_offset; 
    unsigned int bitmapHeaderSize; 
    unsigned int width; 
    unsigned int height; 
    unsigned short int depth; 
    unsigned char* header; 
    PIXEL* raster; 
} BITMAP; 

void rotate(BITMAP* bmp) { 
    int i; 
    int j; 
    PIXEL* originalPixel; 
    BITMAP* originalBmp; 

    deepCopyBitmap(bmp, originalBmp); 

    for(j=1; j <= bmp->height; j++) { 
     for(i=1; i <= bmp->width; i++) { 
      originalPixel=getPixel(originalBmp->raster, bmp->width, bmp->height, j, i); 
      setPixel(bmp->raster, bmp->width, bmp->height, (bmp->width + 1 - i), j, originalPixel); 
     } 
    }     
} 

void deepCopyBitmap(BITMAP* bmp, BITMAP* copy) { 
    *copy = *bmp; 
    if (copy->raster) { 
     copy->raster = malloc(sizeof(*copy->raster)); 
     for (int i = 0; i < copy->height; i++) { 
      copy->raster[i] = malloc(sizeof(*copy->raster[i])); 
      memcpy(copy->raster[i], bmp->raster[i], sizeof(*copy->raster[i])); 
     } 
    } 
} 

更新

void deepCopyBitmap(BITMAP* bmp, BITMAP* copy) { 
    copy = malloc(sizeof(BITMAP)); 
    *copy = *bmp; 
    if (copy->raster) { 
     size_t total_size = copy->height * copy->width * sizeof(PIXEL); 
     copy->raster = malloc(total_size); 
     memcpy(copy->raster, bmp->raster, total_size); 
    } 
} 
+1

「ピクセル」とは何ですか? –

+1

'copy-> raster'は、512個のPIXEL要素(=ギザギザの配列)を持つ配列へのポインタ、または262144個のPIXEL要素の単一配列へのポインタへのポインタの512要素を持つ配列へのポインタになっていますか? double mallocは前者を示唆しているようですが、後者は 'PIXEL *'データ型です。 – user694733

+0

'copy-> raster [i]'はポインタではなく、値です。 「ラスタ」は1D配列なので、 –

答えて

3

あなたが唯一の012を割り当てますここ:あなたが唯一再び1 PIXELを割り当て、ここで

 for (int i = 0; i < copy->height; i++) { 

:しかし

 copy->raster = malloc(sizeof(*copy->raster)); 

は、あなたが動作するように、この反復のために少なくともcopy->heightPIXEL秒を必要とする

  copy->raster[i] = malloc(sizeof(*copy->raster[i])); 

しかし、 copy->widthPIXELをコピーするつもりはありません。

あなたが本当に何をしたいのか
  memcpy(copy->raster[i], bmp->raster[i], sizeof(*copy->raster[i])); 
     } 

copy->height * copy->widthPIXEL秒を割り当て、元からコピーです。

 size_t total_size = copy->height * copy->width * sizeof(PIXEL); 
     copy->raster = malloc(total_size); 
     memcpy(copy->raster, bmp->raster, total_size); 
+0

最後の部分をtotal_sizeで試しました。 でも、コピー - >ラスタのすべてのピクセルをループする必要がありますか? –

+0

現在、エラーが表示されます。実行が終了しました。バスエラー:10;リアルタイム:320ms;ユーザ:0ms;システム:0ms –

+0

@PeterVanGorpいいえ、ループしないでください。ご覧のとおり、 'memcpy'は' total_size'パラメータですべてのピクセルをコピーしています。 – user694733

関連する問題