2017-05-11 12 views
1

私はパラメータとしてconstポインタを取得する関数(func1)を持っています。 このポインタの値は、2番目の関数(func2)に使用されます。 ブール値に応じて、この値をfunc2に渡す前にこの値を変更したいと思います。私はそれを変更する必要がある場合、私はそれの変更されたバージョンを格納するために新しいメモリを割り当てます。実際にconst intポインタは大きな配列なので、私はそれをコピーしたくありません。 私はそのように解決しようとした:C/C++ 1つの関数呼び出しでconst関数ポインタまたは単純ポインタを渡す方法

void func1(const int* value, bool change) 
{ 
    int* valueToUse; 

    if(change) 
    { 
    int changedValue = (*value)++; 
    valueToUse = &changedValue; 
    } 
    else 
    { 
    valueToUse = value; // <= here the Error occurs 
    } 

    func2(valueToUse); 
} 

void func2(const int* foo) 
{ 
    // ... 
} 

しかし、私はこのようにそれを行う場合、私は、単純なポインタへのconstポインタを割り当てるので、私はエラーを取得:

error: invalid conversion from 'const int* to int*'

は、任意の使いやすいがありますこれを解決する方法?

私は、それぞれのケースに対して2つの特別な機能を持つソリューション、または2つのポイントでfunc2を呼び出すバージョンを想像することができます。しかし、このコードは実際のコードの単純化されたバージョンなので、簡単な解決策があれば私は迷っています。

ベストは、CおよびC++で動作するソリューションです。

ありがとうございます!

+6

へ引数が指す場合は、 'const'を削除します。 – InternetAussie

+0

変更された値と残りの値だけをいくつかのセンチネルとして持つ別のコピーを使用できます。これで、両方の配列を他の関数に渡すことができます。最初にarray2を調べます。もしそれがセンチネルなら、それはメイン配列から取ることができ、センチネルでなければ、それはコピー配列から取るでしょう。 –

+0

センチネル値が利用できない場合は、値を選択する場所を指定するために3番目のブール値配列を使用します。 true = array2の値、false = array1の値(constの値) –

答えて

3

これは機能しますか? const int*

void func1(const int* value, bool change) 
{ 
    const int* valueToUse; 
    int changedValue; 

    if(change) 
    { 
     changedValue = (*value) + 1; 
     valueToUse = &changedValue; 
    } 
    else 
    { 
     valueToUse = value; 
    } 

    func2(valueToUse); 
} 

intconstポインタでないconst intへのポインタです。したがって、ポインタ自体は自由に変更できます。

また、がconst intであるため、(*value)をインクリメントするとエラーになります。

+2

私のソリューションはよりシンプルで、おそらくそれを使用していると思いますが、あなたの意見はOPが尋ねたものに近く、「明確化」を必要としません – stefaanv

+0

確かに真実です。制限が存在する –

-7

このコードを実行すると、警告が表示されますが、タイプ変換が役に立ちます。

valueToUse = (int*)value; 
+8

これはダンプテープをコンパイラの口の上に置くだけです。それは、コードが間違っていると叫ぶが、あなたはそれをシャットダウンすることを選択? – InternetAussie

2

func1のでは、あなたがfunc2の2本の電話をかけることができ、この方法は必要ありません何のコピーが存在しないと元の値が変更されることはありません:

void func1(const int* value, bool change) 
{ 
    if(change) 
    { 
    int changedValue = *value+1; 
    func2(&changedValue); 
    } 
    else 
    { 
    func2(value); 
    } 
} 
+0

OPは実際には明示的に彼は2つのファンクションコールを望んでいないと言っていたが、 –

+1

いいえ、2つのファンクションコールではなく2つの追加のファンクションを言った。 – stefaanv

+0

"... 2点でfunc2を呼び出します。"本当にこれは間違っていますか?真剣に私は今日自信がないスーパーです、私はすでに10億の間違いを作った。 –

0
void func1(const int* value, int change) 
{ 
    int* valueToUse; 

    if(change) 
    { 
    (*(int*)value)++; 
    valueToUse = (int*)value; 
    } 
    else 
    { 
    valueToUse = (int*)value; // <= here the Error occurs 
    } 

    func2(valueToUse); 
} 

しかし、あなたは本当にこれを必要としません。 valueToUse、それは私が思うように、そうです。

void func1(const int* value, int change) 
{ 
    if(change) 
    (*(int*)value)++; 

    func2(value); 
} 
+1

'(int *)'はコンパイラをシャットダウンしますが、問題は適切に解決されません。引数の型を変更するだけではどうですか? – InternetAussie

0
const int* value 

これは、一定のint型valueへのポインタを意味します。定数intの値を変更することはできません。 これを解決するには2通りの方法があります。一定の鋳造後にはfunc1への最初の関数の

  1. 変更署名がvoid func1(int* value, bool change)
  2. パス引数const_castを使用して変更 int changedValue = (*value)++;あなたは関数がポインタがあることメモリを変更することができるようにしたい場合はint changedValue = *value + 1;
+0

実際に値のポイントを変更する予定がない場合があります。 – stefaanv

+0

@stefaanv私はOPの論理的な記述を解決しようとしていませんでした。彼の総合的な誤りを解決できる2つの方法を知らせるだけです。 –

関連する問題