Как передать указатель через функцию, которая работает с указателем с не указателем аргумента? - PullRequest
0 голосов
/ 10 июня 2019

Я только начинаю изучать C ++ на Code :: Blocks и выполняю упражнение с динамическим распределением памяти с помощью операторов new и delete.Основная функция позволяет пользователю запрашивать память для нескольких элементов, а затем назначать значения этим элементам / ячейкам памяти.Я хотел создать отдельную функцию void sum (int pntsize, int * pnt), которая при вызове позволяет пользователю найти сумму назначенных значений.Поскольку значения присваиваются через указатели, у меня возникают проблемы при создании этой функции.Когда я иду, чтобы скомпилировать программу, ошибок нет.Однако, независимо от того, какие значения введены или количество созданных элементов, сумма всегда возвращается как 1. Хотя ошибок нет, Code :: Blocks выдает предупреждение о том, что «адрес void sum (int, int *)»всегда будет оцениваться как 'true' [-Waddress] ", и я ожидаю, что это связано с проблемой, с которой я сталкиваюсь.Ниже приведен т

#include <iostream>
using namespace std;

void sum(int pntsize, int* pnt)
{
    for(int i=0; i<pntsize; i++)
    {
        int sum = 0;
        sum = *(pnt+i) + sum;
    }
    cout << "The sum of these values is: " << sum;
}

int main()
{

for (char userinput2 = 'y'; userinput2 == 'y';)
            {cout << "For how many elements do you wish to reserve memory?" << endl; 
            int pntsize = 1;
            cin >> pntsize;
            cout << endl;
            int* pnt = new int [pntsize];
            for (int i=0; i<pntsize; i++) //Assigns values
            {
                cout << "Enter a value for Memory Slot " << i << ": ";
                cin >> *(pnt + i);
            }

            cout << endl;

            for (int i2=0; i2<pntsize; i2++) //Displays values
            {
                cout << "Value at Memory Location " << &(pnt[i2]) << ": " << *(pnt + i2) << endl;
            }
cout << endl;
cout << "Do you wish to find the sum of these values?" << endl; //Adds values
            char userinput3;
            cin >> userinput3;

            if (userinput3 == 'y')
                sum(pntsize, pnt);
return 0;
}
}

Возможно, предупреждение не имеет ничего общего с моей проблемой, но, возможно, кто-то может объяснить, почему эта проблема продолжает возникать.

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Вы переводите сумму в цикл for.Таким образом, на каждой итерации он будет повторно инициализирован до нуля.Попробуйте:

void sum(int pntsize, int* pnt)
{
    int res = 0;
    for(int i=0; i<pntsize; i++)
    {
        res = *(pnt+i) + res;
    }
    cout << "The sum of these values is: " << res;
}

Кстати, сумма фактически ссылалась на фактическую функцию sum (), когда вы ее указали, поскольку int вышел из области видимости.Я полагаю, именно поэтому вы получили это предупреждение.

1 голос
/ 10 июня 2019

cout<<"The sum of these values is: " << sum; <- <code>sum разрешается до имени функции.Вы, вероятно, хотели использовать локальную переменную внутри цикла for.Но он не виден вне области ({}), он объявлен.Также ваш способ ничего не накапливает, так как переменная создается, инициализируется и уничтожается на каждой итерации.Исправление:

void sum(int pntsize, int* pnt)
{
    int sum = 0;
    for(int i=0; i<pntsize; i++)
    {  
        sum = *(pnt+i) + sum;
    }
    cout << "The sum of these values is: " << sum;
}

Также, пожалуйста, не используйте new, используйте std::unique_ptr.Зачем?Потому что вы уже забыли удалить его.

...