массивы — Что это значит (C ++): & quot; предупреждение: указатель на функцию, используемую в арифметике [Wpointer-arith] & quot ;?

Я делаю программу на C ++, и у меня появляется предупреждение, которое постоянно появляется (я использую g ++):

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

и я хочу знать: что именно означает это предупреждение? Что мой компилятор пытается сказать мне, что проблема (в общих чертах), чтобы я мог лучше понять, что я делаю неправильно?

Поиски в Google выявляют конкретные решения конкретных проблем в коде людей, но никогда не говорят мне точно, что пытается сказать это предупреждающее сообщение.

Я просто изучаю массивы и пытаюсь создать программу, которая печатает «Hello, world!» один символ за раз, каждый символ сохраняется индивидуально в массиве и перекачивается в цикл for.

Вот код:

#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;
}

Спасибо за ваше время.

0

Решение

На этой линии:

cout << greeting[ARRAY_ELEMENTS] << endl;

вы имеете в виду функция названный greeting что вы относитесь как к массиву.

6

Другие решения

Приветствие — это функция, но вы пытаетесь распечатать ее как массив символов. Для вашего кода не поможет ясность того, что функция приветствие () содержит массив символов с тем же именем — это, вероятно, где вы запутались. Если вы дадите разные имена, было бы более очевидно, что происходит не так.

Вам нужно, чтобы ваша функция приветствия () возвращала что-то, а не просто заполняла локальный массив, который не будет доступен снаружи функции (и в любом случае будет отброшен, как только функция вернется).

4

Заявление greeting[ARRAY_ELEMENTS] не делает то, что вы думаете, что делает.

Изнутри main имя greeting относится к функции void greeting(), Вы, кажется, пытаетесь напечатать char greeting[ARRAY_ELEMENTS] переменная. Но вы не можете сделать это из main так как это имя видно только изнутри void greeting(),

Вам следует переименовать либо функцию, либо переменную, чтобы избежать повторения этой путаницы, кроме того, у вас есть два варианта: либо выполнить цикл внутри функции 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 вместо символьных буферов.

2

Я думаю, что проблема здесь в том, что этот код

greeting[ARRAY_ELEMENTS]

не делает то, что вы думаете, что делает. Это пытается индексировать в положение ARRAY_ELEMENTS функции greeting, который не является функцией. Ошибка, которую вы получаете, вызвана компилятором, который думает, что вы пытаетесь лечить greeting как массив, а это не то, что вы хотите сделать.

Прямого решения этой проблемы не существует, но вы можете рассмотреть возможность выполнения одного из следующих действий:

  1. + Изменить greeting на самом деле быть массивом.
  2. Делать greeting функция, которая получает индекс и выдает соответствующее значение массива.

Надеюсь это поможет!

0