1

私は C++ プログラムを作成していますが、繰り返し表示される警告があります (私は g++ を使用しています):

warning: pointer to a function used in arithmetic [Wpointer-arith]

知りたいのですが、この警告メッセージは正確には何を意味していますか? 問題が(一般的に)私が間違っていることをよりよく理解できるように、コンパイラが私に伝えようとしているのは何ですか?

Google 検索は、人々のコードの特定の問題に対する特定の解決策を見つけ出しますが、この警告メッセージが何を言おうとしているのかを正確に教えてはくれません。

私はちょうど配列を学んでいて、「Hello, world!」を表示するプログラムを作ろうとしています。一度に 1 文字ずつ、各文字は個別に配列に格納され、for ループで cout に送られます。

コードは次のとおりです。

#include <iostream>
using namespace std;

int ARRAY_ELEMENTS = 14;

void greeting()
{
    char greeting[ARRAY_ELEMENTS];
    greeting[0] = 'H';
    greeting[1] = 'e';
    greeting[2] = 'l';
    greeting[3] = 'l';
    greeting[4] = 'o';
    greeting[5] = ',';
    greeting[6] = ' ';
    greeting[7] = 'w';
    greeting[8] = 'o';
    greeting[9] = 'r';
    greeting[10] = 'l';
    greeting[11] = 'd';
    greeting[12] = '!';
    greeting[13] = '\0';
}
int main(int argc, char* argv[])
{
    greeting();
    for (ARRAY_ELEMENTS = 0; 
        ARRAY_ELEMENTS <= 13;
        ARRAY_ELEMENTS++)
    {
        cout << greeting[ARRAY_ELEMENTS] << endl;
    }
    return 0;
}

お時間をいただきありがとうございます。

4

4 に答える 4

7

この行で:

cout << greeting[ARRAY_ELEMENTS] << endl;

配列であるかのように扱っているという名前の関数を参照しています。greeting

于 2012-12-07T21:30:08.770 に答える
5

greeting は関数ですが、char 配列のように出力しようとします。関数 greeting() に同じ名前の char 配列が含まれていることは、コードを明確にするのに役立ちません。これはおそらく、混乱した場所です。物事に明確な名前を付けると、何が問題なのかがより明確になります。

関数の外部からアクセスできないローカル配列に入力するだけでなく、 greeting() 関数に何かを返すようにする必要があります (いずれにせよ、関数が戻るとすぐに破棄されます)。

于 2012-12-07T21:29:34.973 に答える
2

ステートメントgreeting[ARRAY_ELEMENTS]は、あなたが思っていることをしません。

main名前の中greetingから、関数を参照しますvoid greeting()char greeting[ARRAY_ELEMENTS]変数を印刷しようとしているようです。mainしかし、その名前は内部からしか見えないため、それを行うことはできませんvoid greeting()

この混乱が再び起こらないように、関数または変数のいずれかの名前を変更する必要があります。さらに、次の 2 つのオプションがあります。関数内のループを終了するgreetingか、挨拶を設定する必要があるバッファーへのポインターを渡すかのいずれかです。関数。これはあなたの現在のレベルより少し進んでいるかもしれませんが、最終的にはそれを行う方法を学ばなければならないので、現在のような時はありません.

const int ARRAY_ELEMENTS = 14;

void make_greeting(char *greeting)
{
    greeting[0] = 'H';
    greeting[1] = 'e';
    ...
}

int main(int argc, char **argv)
{
    char buffer[ARRAY_ELEMENTS];

    make_greeting(buffer);

    std::cout << "The greeting is \"" << buffer << "\"" << std::endl;

    for(int i = 0; i != ARRAY_ELEMENTS; i++)
        std::cout << "At position " << i << ": '" << buffer[i] << "'" << std::endl;
}

もちろん、とにかく文字バッファーの代わりに std::string を使用する必要があります。

于 2012-12-07T21:33:54.573 に答える
0

ここでの問題は、このコードだと思います

greeting[ARRAY_ELEMENTS]

あなたが思っていることをしません。ARRAY_ELEMENTSこれは、関数greetingではないfunction の位置にインデックスを付けようとします。取得しているエラーは、配列として処理しようとしているとコンパイラが考えていることが原因でgreetingあり、これはあなたがやりたいことではありません。

これに対する直接的な修正はありませんが、次のいずれかを実行することを検討できます。

  1. greeting実際に配列になるように変更します。
  2. インデックスgreetingを取り、適切な配列値を生成する関数を作成します。

お役に立てれば!

于 2012-12-07T21:30:31.450 に答える