Search code examples
c++arraysdynamic-memory-allocationdynamic-arrays

C++ How to return an array from a function?


I'm brand new to C++ and am having trouble trying to get a function (which takes an array) to return an array. The function is a very basic sorting algorithm for an array of integers of size 4. What i have is below:

int[] sortArrayAscending(int arrayToSort[3]) {
    int sortedArray[3];
    sortedArray[0] = minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[1] = lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[2] = higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[3] = maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    return sortedArray;
}

I think i'm getting really confused with the syntax i need to use (the function calls to min, lower, higher, max all work fine.

I would really appreciate some help.

Thank you

EDIT2: Thank you for all the comments. I have now solved it thanks to @Rook's and @Bob Yoplait's answers. The code is used is:

   int* sortArrayAscending(int arrayToSort[4], int sortedArray[4]) {
    sortedArray[0] = minOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[1] = lowerMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[2] = higherMidOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    sortedArray[3] = maxOfFour(arrayToSort[0],arrayToSort[1],arrayToSort[2],arrayToSort[3]);
    return sortedArray;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int testNumbers[4] = {8,14,1,27};
    int testSorted[4];
    sortArrayAscending(testNumbers,testSorted);

    for (int i = 0; i < 4; i++) {
        cout << testSorted[i] << endl;
    }

    system("pause");
    return 0;
}

Thank you for all your help - now time to lookup vectors!

PS I appreciate @Luchian Grigore's solution is most likely the best practise way of doing things, but that wasn't specifically my question


Solution

  • Me, I'd probably use std::array<int, 4> if I was using a modern C++ compiler. Deals nicely with bounds checking and memory management and returning from/passing into functions. You can also use existing STL sort mechanisms and functions upon it; no need to reinvent the wheel!

    Now, in your case,

    int sortedArray[3]; 
    

    is a local variable and you should never return a reference to it directly. You could do something like :

    int* sortedArray = new int[4];
    // do stuff
    return sortedArray;
    

    (also note the size of the array, 4, not 3 in your case!) but in this case you have to remember to delete the array at some point in the future or your application will leak memory.

    You can also pass in the array by reference, using an approach like

    void sort_array(std::array<int, 4>& the_array);
    

    or

    void sort_array(int** the_array)
    

    and in these cases you can modify the array in place, or copy the answer into the argument when you're done sorting.