0

私の知る限り、構造内の項目がポインタの場合は で呼び出し->、通常の値の場合は used で呼び出します.

ここに私のtypedef:

typedef struct
{
    char name[50];
    int quantity;
}ing;

typedef struct
{
    char name[50];
    ing *n;
    int price, n_ing, max_producity;
}prod;

次に、 a を宣言しprod a;、 を割り当てa->n=malloc(n*sizeof(ing));ます。しかし、アクセスしようとするとa.n->nameエラーが発生します。

4 つの組み合わせすべてで、「エラー: '->' の型引数が無効です ('prod' (または 'ing') があります)」または「エラー: 添字付きの値は配列でもポインターでもベクトルでもありません」というエラーが表示されます。

なんで?


    int ret_max_producity(prod a, ing n, int dim_n)
    {
        int max_prod=32100, i;
        for(i=0; i<a.n_ing; i++)
        {
/* here!->*/if((n[find_ing(n, a.n[i]->name, dim_n)].quantity)/(a.n->quantity)<max_prod)
            {
/* here!->*/    max_prod=(n[find_ing(n ,a.n[i]->name, dim_n)].quantity/a.n->quantity);
            }
        }
        if(max_prod==32100)
        {
            printf("ERROR WHILE FINDING MAX PRODUCITY FOR PRODUCT %s, ABORTING", a.name);
            system("pause");
            exit(EXIT_FAILURE);
        }
        return max_prod;
    }

int find_ing(ing v, char *s, int dim)
{
    int i;
    for(i=0; i<dim; i++)
    {
        if(strcmp(s, v.name)==0)
        {
            return i;
        }
    }
    printf("\n\nERROR WHILE FINDING INGREDIENT %s IN VECTOR, ABORTING...", s);
    system("pause");
    exit(EXIT_FAILURE);
}

エラー

4

2 に答える 2

4

prod * a ではなく、prod a を宣言する場合は、n によってメンバーにアクセスする必要があります。n はポインターであるため、an->name にする必要があります。

-> は、構造体へのポインターがある場合にのみ使用されます。. 構造体のインスタンスがある場合に使用されます。

製品;

an = malloc(sizeof(ing *)); //なぜこの数に n を掛けているのですか? それをしないでください。an = 作成した ing のインスタンスのアドレス。= &ing 構造。

an->whatever = これで、この値にアクセスできます

編集:

型定義を取り除きます。それは読むべきです

struct Foo{

members
};

struct Foo2{
members
};

それなら大丈夫なはずです。あなたは間違った方法でtypedefを使用しています。

struct ing
{
    char name[50];
    int quantity;
};

struct prod
{
    char name[50];
    ing *n;
    int price, n_ing, max_producity;
};

また、これら両方の構造体のアドレスを int に渡し、それらからポインターを取得する必要があります。したがって、関数宣言は次のようになります。

int ret_max_producity(prod * a, ing  *n, int dim_n)

ret_max_productivity を呼び出すときは、次のようにする必要があります。

ret_max_productivity(&a, &n, int dim_n);
于 2013-05-10T17:35:23.747 に答える
4

As far as I know, if the item inside a structure is a pointer, you call it with ->, if it's a normal value it is used ..

いいえ、.演算子は構造体のメンバーにアクセスするために使用されます。->演算子は逆参照およびのショートカットである.ため、構造体へのポインターがある場合はそれを使用します。そう:

ing *n = malloc(sizeof(ing));

n->quantity = 5;   // This is the same as 
(*n).quantity = 5; // this.

最も基本的な意味で、構造体のメンバーにアクセスするには、次のようにします。

ing n;
n.quanity = 5;

構造体へのポインターを宣言する場合に構造体のメンバーにアクセスするには、次のようにします。

ing *n;
n = malloc(sizeof(ing));
n->quanity = 5;

"prod a; and I allocate a->n=malloc(n*sizeof(ing));. But when I try to access to a->n->name it gives me error"

そのような構造を宣言している場合、エラーが発生する理由は、ポインタではないものを参照しようとしているからです。

a.n->name

正しいでしょう。

編集
あなたのコードを見た後、私はあなたの問題が何であるかがわかります:

* here!->*/if((n[find_ing(n, a.n[i]->name, dim_n)].quantity)/(a.n->quantity)<max_prod)

問題は、あなたが思っているよりも多くの逆参照を行っていることです。は[i]追加と逆参照を実行してから、->別のレベルで実行しています。

これがどのように見えるべきかの簡単な例です:

prod a;
a.n = malloc(3 * sizeof(ing));  // array of 3 ing structs
a.n[1].quantity = 5;            // access quanity member of ing struct 1

EDIT 2
問題の行は次のとおりです。

* here!->*/if((n[find_ing(n, a.n[i]->name, dim_n)].quantity)/(a.n->quantity)<max_prod)

これが本来あるべき姿です:

if((n[find_ing(n, a.n[i].name, dim_n)].quantity)/(a.n->quantity)<max_prod)

EDIT 3
明らかなことを完全に見落としています。ingと呼ばれるこの関数に単一の構造体を渡していますn

int ret_max_producity(prod a, ing n, int dim_n)
                                ^
                                | 
                         that's just a single struct totally different than
                       the n that's passed in as a member in the `a` struct

しかし、あなたの if チェックでは、この構造体に配列としてアクセスしようとしています:

n[find_ing(n, a.n[i]->name, dim_n)].quantity

変数に構造体の配列はありませ。単一の変数しかありません。したがって、この単一の構造体を構造体の配列として扱うことに対して怒鳴っています。ingning

于 2013-05-10T17:36:57.340 に答える