Iは整数の範囲を表すC構造を有する:構造と一定の構造
typedef struct {
int* data;
unsigned start;
unsigned end;
} Range;
Iから読み取り範囲
bool range_put(Range* const r, int value, unsigned idx)
{
if(r->start <= idx && idx < r->end)
{
r->data[idx] = value;
return true;
}
else
{
return false;
}
}
一関数に値を書き込むつの機能を有しています範囲
bool range_get(const Range* const r, int* const out, unsigned idx)
{
if(r->start <= idx && idx < r->end)
{
*out = r->data[idx];
return true;
}
else
{
return false;
}
}
私がしたいことは、これらの機能を拡張してRang eをconst整数に変換する。
typedef struct {
const int* data;
unsigned start;
unsigned end;
} ConstRange;
どのように私はrange_get()
がRange
とConstRange
の両方で動作させることができますの線に沿って何か?
range_get()
の機能を単純に新しい機能bool crange_get(const ConstRange*...)
に複製することが1つの解決策ですが、機能の数を低く抑えたいと考えています。
別の解決策は、(これが「許可」されているかどうか疑わしい)Range
を団結することです
typedef union {
ConstRange const_range;
struct {
int* data;
unsigned start;
unsigned end;
}
} Range;
ここ欠点Range
range_get()
を呼び出すための構文は少し複雑になりますということです
Range range;
...
range_get(&range.const_range ...);
機能の数を減らしたり機能を複雑にしたりする他の方法はありますか?
Range range;
ConstRange const_range;
...
range_get(&range ...);
range_get(&const_range ...);
メモリを指している 'const int * 'を取得した後は、ポインタを使ってメモリを変更したり、*初期化したりすることはできません。たとえば、 'malloc'でメモリを割り当てると、初期化されていないメモリが残っています。解決策は、* once *に書き込まれた範囲内のどの要素を追跡して、それらに再度書き込むことを許可しないことです。これは、範囲内の各要素に対して1つのフラグを持つフラグの配列で実現できます。const/non-const部分に関しては、単純な論理フラグで十分です。 –
@JoachimPileborg "...あなたは変更できません..." - あなたは**できません。 'const'はプログラマが保証するものであり、コンパイラによって強制されるものではありません。コンパイラはユーザーに警告することができますが、彼の足での射撃を妨げません。 – Olaf
あなたは2つの値を持つ 'union'を使用できます。変更関数を除くすべての関数に 'const int *'を使用してください。 – Olaf