2016-10-17 9 views
0

これは、ppmイメージファイルで動作するプログラムに含まれています。c - エラー:構造体または共用体でないメンバーxxxxxxを要求します。

グローバル構造変数を受け取り、そのイメージのメンバーを抽出する関数を使用しようとすると、コンパイルエラーが発生します。

これは(ppmIO.cとppmIO.hで宣言された)グローバルな構造体である:

ppmIO.c:

struct Image *instance; 

ppmIO.h:

struct Image 
{ 
    int width; 
    int height; 
    unsigned char *data; 
}; 

extern struct Image *instance; 

これはどのようにあります私はメインから私の機能を呼び出す:

ImageInvert(&instance); 

これらは私のimageManip.cファイルの関連する部分です:

#include <ppmIO.h> 

void ImageInvert(struct Image **toInvert); 

void ImageSwap(struct Image **toSwap); 

これらは私が取得エラーです:

imageManip.c:31:23: error: request for member ‘width’ in something not a structure or union 
    int pix = (*toInvert->width) * (*toInvert->height); 
        ^
imageManip.c:31:44: error: request for member ‘height’ in something not a structure or union 
    int pix = (*toInvert->width) * (*toInvert->height); 
              ^
imageManip.c:35:18: error: request for member ‘data’ in something not a structure or union 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data)); 
       ^
imageManip.c:35:60: error: request for member ‘data’ in something not a structure or union 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data)); 
                  ^
imageManip.c:35:67: error: expected ‘;’ before ‘)’ token 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data)); 
                   ^
imageManip.c:35:67: error: expected statement before ‘)’ token 
imageManip.c:36:18: error: request for member ‘data’ in something not a structure or union 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 
       ^
imageManip.c:36:60: error: request for member ‘data’ in something not a structure or union 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 
                  ^
imageManip.c:36:69: error: expected ‘;’ before ‘)’ token 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 
                    ^
imageManip.c:36:69: error: expected statement before ‘)’ token 
imageManip.c:37:18: error: request for member ‘data’ in something not a structure or union 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 
       ^
imageManip.c:37:60: error: request for member ‘data’ in something not a structure or union 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 
                  ^
imageManip.c:37:69: error: expected ‘;’ before ‘)’ token 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 

ないこれは私のimageManip.hファイルです

#include <stdlib.h> 
#include <stdio.h> 
#include <ctype.h> 
#include <ppmIO.h> 
#include <imageManip.h> 

void ImageInvert(struct Image **toInvert) { 


    int i; 
    int pix = (*toInvert->width) * (*toInvert->height); 

    for (i = 0; i < pix; i++) 
    { 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data)); 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 
     *(toInvert)->data = ((unsigned char)255 - *(toInvert)->data++)); 
    } 

} 

メンバーに正しくアクセスしているか、ポインタを正しく使用しているかどうかを確認してください。

+3

'* toInvert-> width' - >'(* toInvert) - > width' – BLUEPIXY

+0

@BLUEPIXYのおかげ!私はすでにそれをして、ほとんどのエラーを修正しました。 – RockAndaHardPlace

答えて

0

問題がありました私がどのようにかっこを使用していたかと一緒に。

これでimageInvert機能の作業バージョン:

void ImageInvert(struct Image **toInvert) { 


    int i; 
    int pix = (*toInvert)->width * (*toInvert)->height; 

    for (i = 0; i < pix; i++) 
    { 
     (*toInvert)->data = ((unsigned char)255 - (unsigned char)(*toInvert)->data); 
     (*toInvert)->data = ((unsigned char)255 - (unsigned char)(*toInvert)->data++); 
     (*toInvert)->data = ((unsigned char)255 - (unsigned char)(*toInvert)->data++); 
    } 

} 
+1

'struct Image * image = * toInvert;'が使いやすくなり、 'image-> data'などを簡単に使うことができます。あなたの置き換えコードはUB(未定義の動作)に苦しんでいます。実際には、大きな問題があります。指し示されたデータではなくポインタを変更し続けます。それであなたはあまりにも多くのキャストが必要なのかもしれません。 –

+0

@JonathanLefflerありがとう!私は実際にこれで大きな問題に遭遇しました...ポインタの代わりに指されたデータをどのように変更できますか? – RockAndaHardPlace

+1

私は次のように書くと思います: 'void ImageInvert(struct Image ** toInvert){struct Image * image = * toInvert; int n_colour_vals =(イメージ→幅*イメージ→高さ)* 3; unsigned char * data = image-> data; for(int i = 0; i

関連する問題