2016-09-23 5 views
-3

У меня есть функция, которая возвращает указатель на массив, и я хочу, чтобы напечатать каждое значение в массивезначение печати от указателя на массив возвращается из функции (C++)

Когда я запускаю его, он печатает

int* merge_sort(int arr[], int size) { 
    if (size <= 1) { 
     return &arr[0]; 
    } 

    int size1 = size/2; 
    int arr1[size1]; 
    for (int i = 0; i < size1; i++) { 
     arr1[i] = arr[i]; 
    } 

    int size2 = size-size1; 
    int arr2[size2]; 
    for (int i = 0; i < (size2); i++) { 
     arr2[i] = arr[i+size1]; 
    } 

    int p1 = 0; 
    int p2 = 0; 
    int sorted[size]; 

    while (p1 < size1 && p2 < size2) { 
     if (arr1[p1] < arr2[p2]) { 
      sorted[p1+p2] = arr1[p1]; 
      p1++; 
     } else { 
      sorted[p1+p2] = arr2[p2]; 
      p2++; 
     } 
    } 

    while (p1 < size1) { 
     sorted[p1+p2] = arr1[p1]; 
     p1++; 
    } 

    while (p2 < size2) { 
     sorted[p1+p2] = arr2[p2]; 
     p2++; 
    } 

    cerr << "sorted: "; 
    for (int& i : sorted) { 
     cerr << i << ","; 
    } 
    cerr << endl; 

    return &sorted[0]; 
} 

/** 
* Auto-generated code below aims at helping you parse 
* the standard input according to the problem statement. 
**/ 
int main() 
{ 
    int N; 
    int horses[N]; 

    cin >> N; cin.ignore(); 
    for (int i = 0; i < N; i++) { 
     int Pi; 
     cin >> Pi; cin.ignore(); 
     horses[i] = Pi; 
    } 

    int *sorted = merge_sort(horses, N); 

    cerr << "~ " << sorted[0] << " " << sorted[1] << " " << sorted[2] << endl; 

    //cerr << "~~ " << sorted << " " << *sorted << " " << endl; 

    cerr << "^ " << *(sorted + 0) << endl; 
    cerr << "^ " << *(sorted + 1) << endl; 
    cerr << "^ " << *(sorted + 2) << endl; 

    for (int i = 0; i < N; i++) { 
     //cerr << "i " << i << endl; 
     // cerr << "SORTED?? " << sorted[i] << endl; 
     cerr << "value: " << *(sorted + i) << " "; 
     //cerr << "*** " << *(sorted) + i << endl; 

    } 
    cerr << endl; 
} 

Когда я бегу, он печатает

отсортирован: 5,8,9, ~ 5 8 9 ^ -5728 ^ 942815029 ^ 6297320 значение: 959592096 значение: 0 значение: -157570874

Почему мой цикл петли не печатает значения «5, 8, 9»? Как я могу это исправить, чтобы это произошло?

(под редакцией быть более детализированы. Кроме того, я понимаю, моя сортировка слиянием неправильно, но я просто пытаюсь заставить его вернуть то, что я могу использовать прямо сейчас ^. ^)

+2

Можете ли вы попробовать создать [Minimal, Complete, и Проверяемость Пример] (HTTP: // StackOverflow .com/help/mcve) и показать нам? –

+3

Если массив является указателем, который вы передаете функции, то почему вы его возвращаете? – PRP

+0

@PRP, хорошая точка, OP уже имеет указатель, где он называет 'sort', а сам указатель не изменяется. – SingerOfTheFall

ответ

0

Убедитесь, что вы вернулись правильный указатель, например (если указатель должен указывать на values):

std::cerr << "\n" << sorted << " "<< &values << "\n"; 

должен возвращать одинаковые значения:

003DFD64 003DFD64 
0

Кажется нормально. Проверьте вашу функцию сортировки

cpp.sh/4rrk

// Example program 
#include <iostream> 
#include <algorithm> 

const size_t N = 3; 

int* sort(int arr[]) { 
    // Sort arr and it should be equal to [5, 7, 8] 
    std::sort(arr, arr+N); 
    return arr; 
} 

int main() { 
    int values[N]; 
    values[0] = 7; 
    values[1] = 5; 
    values[2] = 8; 

    for (size_t i = 0; i < N; ++i) { 
     std::cout << *(values + i) << " "; 
    } 
    std::cout << std::endl << values[0] << " " << values[1] << " " << values[2] << std::endl; 

    int *sorted = sort(values); 

    std::cout << "It is same arrays: " << values << " " << sorted << std::endl; 

    for (size_t i = 0; i < N; ++i) { 
     std::cout << *(sorted + i) << " "; 
    } 
    std::cout << std::endl << sorted[0] << " " << sorted[1] << " " << sorted[2] << std::endl; 

    return 0; 
} 

Выход:

7 5 8 
7 5 8 
It is same arrays: 0x7329bfdc1d90 0x7329bfdc1d90 
5 7 8 
5 7 8 
Смежные вопросы