2

bool myArr[] = { false, false, true };新しく定義した配列を既存の関数の下に渡したい。

void fun(bool** pArr, int idx)
{
    if(NULL == *pArr)
       return;

    (*pArr)[idx] = false;

    ...
    ...

    return;
}

サブルーチンで何も変更することは許可されておらずfun、識別子を使用して関数を呼び出したいですmyArr。試してみるfun(&myArr, 2);と、コンパイルエラーが発生します。

の呼び出しに一致する関数がありませんfun(bool (*)[3], int)

候補は: void fun(bool**, int)

私が考えることができる1つの方法は以下のとおりです

bool* ptr = myArr;
fun(&ptr, 2);

しかし、私には汚れているように見えますfunmyArr

4

4 に答える 4

4

ポインターへのポインターが必要な関数は、通常、ジャグ配列を想定しています。次のように、単一の要素で配列の配列を構築し、myArrayその配列を関数に渡すことができます。

bool *arrayOfPtrs[] = { myArray };
fun(arrayOfPtrs, 2);

ポインターの配列を作成すると、ポインターへのポインターを作成する理由 ( demo )の疑問が解消されるため、これはポインター ソリューションよりもわずかに読みやすくなっています。

于 2016-05-25T15:19:21.787 に答える
1

この関数は へのポインターを想定しているbool*ため、それを呼び出す唯一の方法は、実際のbool*オブジェクトをどこかに置くことです。あなたの解決策は唯一のものです。

于 2016-05-25T15:13:30.000 に答える
0

関数を呼び出すたびにハックを使用したくない場合は、単純にラッパー関数を記述できます。

void fun(bool** pArr, int idx)
{
    if(NULL == *pArr)
       return;

    (*pArr)[idx] = false;
}

void super_fun(bool* pArr, int idx)
{
    fun(&pArr, idx);
}

int main()
{
    bool myArr[] = { false, false, true };

    super_fun(myArr, 2);
}
于 2016-05-25T15:38:33.523 に答える
0

私は少し違うことをします。これは少しきれいだと思います:

void fun2(bool * pArr, int idx)
{
    *(pArr + idx) = true;

    return;
}


int main(int argc, _TCHAR* argv[])
{
    bool myArr[] = { false, false, true };

    fun2(myArr, 1);

    return 0;
}

今、私は c++14 でこれをいじっていましたが、インデクサーを使用して要素に直接アクセスすることはできませんでした。もしかしたらいつの間にか変わっていた?でもこれは合理的だと思いました。

編集、これは本当に良いです:

void fun3(bool pArr[], int idx)
{
    if (NULL == *pArr)
        return;

    pArr[idx] = false;

    return;
}
于 2016-05-25T15:27:22.220 に答える