Я делаю программу на 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;
}
Спасибо за ваше время.
На этой линии:
cout << greeting[ARRAY_ELEMENTS] << endl;
вы имеете в виду функция названный greeting
что вы относитесь как к массиву.
Приветствие — это функция, но вы пытаетесь распечатать ее как массив символов. Для вашего кода не поможет ясность того, что функция приветствие () содержит массив символов с тем же именем — это, вероятно, где вы запутались. Если вы дадите разные имена, было бы более очевидно, что происходит не так.
Вам нужно, чтобы ваша функция приветствия () возвращала что-то, а не просто заполняла локальный массив, который не будет доступен снаружи функции (и в любом случае будет отброшен, как только функция вернется).
Заявление 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 вместо символьных буферов.
Я думаю, что проблема здесь в том, что этот код
greeting[ARRAY_ELEMENTS]
не делает то, что вы думаете, что делает. Это пытается индексировать в положение ARRAY_ELEMENTS
функции greeting
, который не является функцией. Ошибка, которую вы получаете, вызвана компилятором, который думает, что вы пытаетесь лечить greeting
как массив, а это не то, что вы хотите сделать.
Прямого решения этой проблемы не существует, но вы можете рассмотреть возможность выполнения одного из следующих действий:
greeting
на самом деле быть массивом.greeting
функция, которая получает индекс и выдает соответствующее значение массива.Надеюсь это поможет!