2012-03-29 12 views
5

タイトルが少し混乱している場合は、ごめんなさい。このように「アイテム」を記録するためにポインタを呼び出すためのtypedefを使用して次にCのレコードへのポインタのキーに値を代入

struct record 
{ 
    int value; 
    int key; 
}; 

typedef struct record* Item; 

基本的に私はそれがあったか、次のよ私は何をやっていることのような構造を作成しています誰かがこの本を持っている場合に備えて、290ページのRobert Sedgewick(第3版)によってCのAlgorithsで行われた。

私が問題を抱えているのは、コンソールから値を読み取ってから、その値をキーに割り当てることです。ここでは、私が持っているものだ、と私は取得していますエラー:

void setKey(Item *element, int x) 
{ 
    element->key = x; 
} 

void standInput(Item A[], int length) 
{ 
    int i; 
    int x; 
    for(i = 0; i < length; i++) 
    { 
     printf("Enter a value for spot %i: ", i+1); 
     scanf("%d", &x); 
     setKey(A[i], x); 
    } 
} 

gcc Item.h 
Item.h:33:6: warning: conflicting types for ‘setKey’ 
Item.h:23:3: note: previous implicit declaration of ‘setKey’ was here 

を私は正しい方向にナッジを得ることができれば、私はそれを本当に感謝します。 Itemが単純なintであったときに、この課題のプログラムが完璧に機能しましたが、今はItem-> Keyを使用しようとしていて、少し失われています:)ありがとう!

私が必要と思わなかったコードの他の部分が必要な場合は、リクエストが表示されるとすぐに投稿します。

改訂:コンパイルエラーがなくなるように、standKeyの上にsetKey関数を移動しました。私はかかわらず、取得していますと、セグメント・フォールトであるので、私はまだそれが間違って割り当てるよ:)

+2

+1あなたが試したことの説明とエラーメッセージを含め、十分に言及された完全な質問です。 * so *見た目がリフレッシュ – bernie

+0

配列内の各Itemにメモリを割り当てていますか? – Cornstalks

答えて

1

setKeyの最初の引数の型はItemのでItem、ないItem *、でなければなりませんすでにのタイプはです。レコードへのポインタへのポインタではなく、レコードへのポインタを渡したいとします。

3

あなたは配列要素のアドレスを渡す必要があります:

setKey(&A[i], x); 

A[i]の種類がItemとではありませんWyzard Itemで指摘したようにsetKey方法としてItem *

編集期待していますがを取るためにsetKeyのためにあなたの署名を変更する必要がありますので、すでに構造体へのポインタでありますItem *ではなく、setKey(A[i], x)としてください。

+0

Hrm、それはそれをしませんでしたが、私はそれを試してみて、私がそれを稼働させることができないかどうかを見ていきます。私はアンパサンドの問題をキャッチしなかったので、ありがとう! –

+0

@ user684594:私の答えは少し更新されました。 segfaultを解決するには、より多くのコードを表示する必要があります(どのコードが 'standInput'を呼び出しているかなど)。 – ChrisWue

3

setKeyは、Itemへのポインタをとります。 A[i]Itemへのポインタではなく、実際のItemオブジェクトです。ポインタとしてそれを渡すこと

かのいずれか:

setKey(A + i, x);

又は

setKey(&A[i], x);

+0

私は2番目の方法が好ましいと考えています。それがはっきりと何が起こっているのか。 –

+0

'setKey'は' Item'へのポインタをとりますが、*は使わないでください。 'setKey'の実装における' - > 'は' Item'を得るために 'Item * 'を逆参照するのではなく' Record'を得るために 'Item'を逆参照することを想定しています。 – Wyzard

+0

はい、私はあなたに同意します。私はあなたの答えをすでに+1しており、他の人にもそうするよう促すことができます。これは、メソッドのシグネチャに関するコンパイルの問題のみを修正しますが、誤ってダブルポインタを使用しているという別のエラーが発生するはずです。 – Cornstalks

関連する問題