私はいくつかのパラメータと一意のIDで定義された要素の配列を持っています、私は特定の一意のIDに関連付けられた要素を返す関数を作成しましたが、無効なIDが入力された配列によって)、私の関数に返す有効な値はありません。有効な値が返されない場合のCの処理は?
私の問題は、関数が必ずしも何かを返さない場合、私のコードはコンパイルされないということです。ここでそれを行うのは大丈夫だとコンパイラに伝える方法はありますか?
ありがとうございます。
私はいくつかのパラメータと一意のIDで定義された要素の配列を持っています、私は特定の一意のIDに関連付けられた要素を返す関数を作成しましたが、無効なIDが入力された配列によって)、私の関数に返す有効な値はありません。有効な値が返されない場合のCの処理は?
私の問題は、関数が必ずしも何かを返さない場合、私のコードはコンパイルされないということです。ここでそれを行うのは大丈夫だとコンパイラに伝える方法はありますか?
ありがとうございます。
無効な値を定義する必要があります。この値は、有効な値のセットに属していない値です。例えば
:
有効な値は、[0、INFある場合)次いで-1が良い無効値あります。
さて、私はこれをやります、ありがとう! –
私はこのアプローチでは少し破れています。単一の無効な値を取得するために、膨大な値の範囲を犠牲にしているからです。私はしばしば '0'に無効な値を設定しようとし、範囲は他の全ての符号なし整数(ある程度の大きさ)にします。 – StoryTeller
@StoryTellerこのアプローチは、有効な値のセットが真に限定されており、明確に定義されている場合にのみ有効です。もちろん、他のアプローチもありますが、これはシンプルでエレガントです。しかし、それは確かに常に動作しません。また、多くの重要なアプリケーションで使用されていると考えられます。たとえば、文字列終了の場合は '\ 0'、ポインタの場合はNULLが最も広く使用され、標準化されています。私は "EOF"に行くことができる...しかし、あなたはポイントを得る。 –
これを行うにはいくつかの方法があります。
最も簡単な方法は、値の有効範囲にない値を返すことです。
もう1つの方法は、エラーの役割を果たす変数へのポインタであるもう1つのパラメータを宣言することです。あるいは、エラー値を返し、参照のように宣言されたパラメータとして有効な値を返すこともできます。例えば
int /* error */ f(T *valid_value);
もう一つの方法は、のいずれかが失敗または成功を報告するブール値である2つの値の構造を返すことです。
要素自体ではなく、要素へのポインタを返します。このような。
struct Element* find(struct Element* elements, int count, int id)
{
for(int i = 0; i < count; i++)
{
if(elements[i].id == id)
return elements + i; //pointer to i'th element
}
return NULL; //if it makes it here return NULL since no element was found.
}
次に、このようなことができます。
struct Element* e = find(elements, m, 1234);
if(e) //check and see if it is not null
{
//handle found case
}
else
{
//handle not found case
}
あなたのアプローチに問題があります。あなたは 'free()'に 'NULL'を渡すことができますが、この関数の戻り値を' free() 'に渡すことはできません。これは私が提案したものとほぼ同じですが、 'NULL'はそれ自身のユースケースです。おそらく、無効なメンバーと 'int element_is_valid(Element *)'関数を持つ要素がそうです。また、型に '*'を付けることは悪い考えであり、私の目を引き裂こうとしています! –
@IharobAlAsimi - 'struct Element * find(.....'? – 4386427
)私は "戻り値を解放できません"とは確信していませんが、有効な苦情です。 –
.....これは、ここでそれを行うためにokですコンパイラに指示する方法はありますか?
いいえ、それを行う方法はありません。
関数は、常に同じ型(宣言で指定した型)の値を返すか、何も返さない(つまり、void foo(...)
と宣言した)。
場合によっては値を返すことはできず、それ以外の場合は「何も返さない」ことがあります。同様に、場合によっては整数を返すことも、他の場合には構造体を返すこともできません。戻り値は、すべての場合で同じでなければなりません。
一般的な回避策は、関数が要求された要素を見つけられなかったことを呼び出し元に伝える方法を導入することです。他の答えで述べたように、これを行うには複数の方法があります。どの解決策が必要なのかは、コードとニーズによって異なります。
通常、この関数は値0が "失敗"を意味し、ゼロ以外は "成功"を意味するint
を返します。私はポインタを使って要素を "返す"でしょう。この擬似コードのように:
int foo(struct MyStruct *p, .....)
{
if (found.....)
{
*p = the_found_element;
return 1;
}
return 0;
}
struct MyStruct ms;
if (foo(&ms, ....))
{
// okay - carry on using ms
...
}
else
{
// failure - don't use ms as it is invalid
...
}
コードの一部を投稿してください。 – Jarvis
コード例が役立つでしょう... –