Программа на C ++ явно печатает адрес памяти вместо массива - PullRequest
1 голос
/ 09 сентября 2010
#include <iostream>
using namespace std;

int main(){
    int findMax(int *);

    const int MAX = 100;
    int values[MAX];
    char ivals[256];
    // Get the space-separated values from user input.
    cin.getline(ivals, 256, '0');
    char *helper;
    // Clean input array and transfer it to values.
    for(int i = 0; i < (MAX) && ivals[i] != 0; i++){
        helper = ivals[i * 2];
            values[i] = atoi(helper);

    }

    int mval = findMax(values);
    cout << values << endl << mval;
    return 0;
}
//Function to find the maximum value in the array
int findMax(int arr[]){
    int localmax = 0;
    for(int i = 0; i < (sizeof(arr)/sizeof(int)); i++){
        if(arr[i] > localmax){
            localmax = arr[i];
        }
    }
    return localmax;
}

Целью этой программы является ввод пользователем разделенного пробелами ряда значений, оканчивающихся на 0. Затем этот массив нужно проанализировать, чтобы найти макс. Я выяснил, как преобразовать то, что изначально является char [], в int [], чтобы я мог безошибочно использовать функцию findMax (), но в цикле сортировки, похоже, есть собственная проблема, и когда "cout << значения << endl << mval; " вызывается, он возвращает только адрес памяти вместо того, что должно быть непустой последовательностью целых чисел. Кто-нибудь может объяснить, что я делаю не так? Кажется, что я, возможно, допустил некоторую ошибку, используя указатели, но я не могу понять, что. </p>

Ответы [ 4 ]

8 голосов
/ 09 сентября 2010

Печать values не будет печатать содержимое массива, как вы ожидаете, она напечатает ячейку памяти первого элемента массива.

Попробуйте что-то вроде этого:

#include <iterator>
#include <algorithm>

// ...

copy(&values[0], &values[MAX], ostream_iterator(cout, " "));

Извините, я не могу опубликовать реальный рабочий код, но ваш оригинальный пост - беспорядок со многими синтаксическими и синтаксическими ошибками.

РЕДАКТИРОВАТЬ: Чтобы быть более полным, более доступным и понятным для начинающих, я написал небольшую программу, которая иллюстрирует 4 способа достижения этой цели.

Метод 1 использует copy с ostream_iterator, как я делал выше. Метод 2, приведенный ниже, является, вероятно, самым простым и простым для понимания. Метод 3 является методом C ++ 0x. Я знаю, что вопрос помечен C ++, но я подумал, что это может быть полезно, чтобы добавить это. Метод 4 - это подход C ++, использующий vector и for_each. Я реализовал функтор, который выполняет сброс.

Поделиться и наслаждаться

#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

struct dump_val : public unary_function<int,void>
{
    void operator()(int val)
    {
        cout << val << " ";
    }
};

int main(){
    int vals[5] = {1,2,3,4,5};


    // version 1, using std::copy and ostream_iterator
    copy(&vals[0], &vals[5], ostream_iterator<int>(cout, " "));
    cout << endl;

    // version 2, using a simple hand-written loop
    for( size_t i = 0; i < 5; ++i )
        cout << vals[i] << " ";
    cout << endl;

    // version 3, using C++0x lambdas
    for_each(&vals[0], &vals[5], [](int val) 
    {
        cout << val << " ";
    }
    );
    cout << endl;

    // version 4, with elements in a vector and calling a functor from for_each
    vector<int> vals_vec;
    vals_vec.push_back(1);
    vals_vec.push_back(2);
    vals_vec.push_back(3);
    vals_vec.push_back(4);
    vals_vec.push_back(5);
    for_each( vals_vec.begin(), vals_vec.end(), dump_val() );
    cout << endl;

}
3 голосов
/ 09 сентября 2010

Когда вы передаете массив X, это действительно указатель на массив X, который вы передаете. Поэтому, когда вы передаете values в cout, у него есть только указатель для распечатки.

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

Например, чтобы напечатать все элементы в массиве, вы можете просто написать

std::copy(values, values+MAX, std::ostream_iterator<int>(std::cout, "\n"));

Чтобы найти максимальный элемент, вы можете просто написать

int mval = *std::max_element(values, values+MAX);

Итак, ваш код становится

#include <iostream>
using namespace std;

int main(){

    const int MAX = 100;
    int values[MAX];
    char ivals[256];
    // Get the space-separated values from user input.
    cin.getline(ivals, 256, '0');
    char *helper;
    // Clean input array and transfer it to values.
    for(int i = 0; i < (MAX) && ivals[i] != 0; i++){
        helper = ivals[i * 2];
            values[i] = atoi(helper);

    }

    copy(values, values+MAX, ostream_iterator<int>(cout, "\n"));
    cout << *std::max_element(values, values+MAX);
    return 0;
}

Это исключает необходимость использования вашего метода findMax.

Я бы также переписал ваш код, чтобы вы использовали вектор вместо массива. Это делает ваш код еще короче. И вы можете использовать stringstream для преобразования строк в числа.

Что-то вроде этого должно работать и намного меньше кода, чем оригинал.

int main(){


    vector<int> values;
    char ivals[256];

    // Get the space-separated values from user input.
    cin.getline(ivals, 256, '0');

    int temp = 0;
    stringstream ss(ivals);
    //read the next int out of the stream and put it in temp
    while(ss >> temp) {
        //add temp to the vector of ints
        values.push_back(temp);
    }

    copy(values.begin(), values.end(), ostream_iterator<int>(cout, "\n"));
    cout << *std::max_element(values.begin(), values.end());
    return 0;
}
2 голосов
/ 09 сентября 2010
for(int i = 0; i < (sizeof(arr)/sizeof(int)); i++){

sizeof (arr) здесь это размер указателя на массив.C ++ не пропустит фактический массив, что было бы крайне неэффективно.Обычно вы получаете только один проход через цикл.Объявите вашу функцию следующим образом:

int findMax(int* arr, size_t elements) {
    //...
}

Но, действительно, используйте вектор.Прокрутите массив и напечатайте каждый отдельный элемент.

2 голосов
/ 09 сентября 2010

Массив int повышается до указателя на int при передаче в функцию.Там нет оператора << взятия обычного массива.Если вы хотите использовать оператор << таким образом, вам нужно вместо этого использовать std :: vector. </p>

Примечание: технически возможно различить массив при передаче в функцию с использованием шаблона, но это не реализовано длястандартный оператор <<. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...