2

そのため、キュー viz に挿入する関数を作成しましたen_queue。関数本体は次のとおりです。

void en_queue(queue,max,front,rear) 
{
    int ch1;
    printf("\n Enter element to add->");
    scanf("%d",&ch1);
    if(front==0 && rear==(max-1))
    {
        printf("\n Caution!! Queue Overflow!!");
    }
    else if(rear==(max-1) && front>0)
    {
        rear=0;
        *queue[rear]=ch1;
    }
    else if(front==-1 && rear==-1)
    {
        front=rear=0;
        *queue[rear]=0;
    }
    else 
    {
        rear++;
        *queue[rear]=ch1;
    }
}

プロトタイプ宣言は次のとおりです。

void en_queue(int *,int, int, int);

そして、呼び出し中に、次のように呼び出しました:

en_queue(queue,MAX,front,rear);

ここqueue[MAX]で、 は配列 ( #define MAX 10)、MAXは配列に組み込むことができる要素の数、frontrearは現在の値を持つ整数です-1type error: pointer expectedとのエラーが繰り返されますConflicting argument declarations for function 'en_queue'.

引数が一致しない理由がわかりません。配列のアドレスを渡し、それをポインター変数で受け取り、ポインターを操作したためです。では、どのようにエラーが発生するのでしょうか?

4

4 に答える 4

3

の場合、「配列」としてアクセスする正しい方法queueは次のとおりです。int *

queue[index];

はない *queue[index]

queue[index]は実際に*(queue + index)

もしそうなら、*queue[index]あなたは実際にやってい*(*(queue + index))ます。

(queue + index)に保存されているアドレスindexから離れた場所に到達しqueueます。*(queue + index)アドレスに格納されている値を取得することで逆参照します。*(*(queue + index))フェッチされた値をアドレスとして使用し、別のフェッチを試みますが、整数を逆参照するため、これは間違っています。

于 2013-09-13T04:45:11.277 に答える
3

初め:

void en_queue(queue,max,front,rear) 
{

次のようにする必要があります。

void en_queue(int *queue, int max, int front, int rear) 
{

第二に、 isという理由*queue[rear] = 0;だけでlike の式を使用する必要があります。queue[rear] = 0;queueint*

注: 式a[i]==*(a + i)であるため、 ifaがポインタである場合、式では明示的に参照a[i]する必要はありません。*

あなたの式では、例えば==はポインターではなく int であるため、2回逆参照するため、エラーが発生します。したがって、コンパイラーのメッセージにはポインターが必要です*queue[rear]type error: pointer expected*queue[rear]* *(queue + rear)*(queue + rear)

en_queue()コンパイラ メッセージ:最初の引数が であるため、「関数の引数宣言が競合しています」 int*。関数定義のように、引数の型を指定しない場合、デフォルトは int 型と見なされます。

于 2013-09-13T04:45:33.550 に答える
2

引数に名前を付けずに型指定子を与えるだけで宣言を書くことはできますが、名前だけで指定子なしで定義を書くことはできません。コンパイラが定義内のconflicting argument declarations引数名を名前ではなく型として解釈するため、エラーが発生します。考えてみてください。コンパイラは、型なしで指定された名前と名前なしで指定された型の違いをどのように認識できるでしょうか?

@grijesh が書いたように、定義を次のように書く必要があります。

void en_queue(int *queue, int max, int front, int rear)

代わりは。

もう 1 つの問題は、ポインターを 2 回逆参照していることです。これは、整数へのポインターでは意味がありません。配列とポインターは、さらにインデックスを作成するために使用できるメモリ アドレスを提供するという点で似ています。これは、通常のインデックス演算子を使用して実行できます。

queue[index]

または、明示的なポインター逆参照 operator*と、次のようなポインター演算を使用します。

*(queue + index)

ポインター演算の詳細については、こちらをご覧ください。

于 2013-09-13T04:55:28.997 に答える
0

あなたが言った:..where queue[MAX] is an array..

あなたの宣言は次のとおりです。void en_queue(int *,int, int, int);

それでは、これはどういう意味ですか:*queue[rear]=ch1;

整数を逆参照しようとしています

上記のように、プログラム内のすべてのインスタンスを次のように修正します。queue[rear] = ch1;

于 2013-09-13T04:45:35.607 に答える