2015-03-23 3 views
0

Я пытаюсь написать функцию, которая отличает массив от int s до double. Он принимает постоянный указатель на исходный массив int[] (во избежание нежелательных изменений?) И возвращает указатель на массив отлитых double[]. Однако код, который я написал, кажется, не работает. Может ли кто-нибудь указать, что с ним не так?C++: передающие и возвращающие указатели на массивы - код не работает

#include <iostream> 
using namespace std; 
double* castToDouble(const int *input); 

int main(){ 
    int integers[] = {1,2,3,4}; 
    double *doubles = castToDouble(integers); 
    cout << "numElements in doubles: " << sizeof(doubles)/sizeof(double) << endl; 
    for(int i = 0; i < sizeof(doubles)/sizeof(double); i++){ 
     cout << doubles[i] << endl; 
    } 
    return 0; 
} 

double* castToDouble(const int *input){ 
    // Obtain the number of elements in input. 
    int numElements = sizeof(input)/sizeof(int); 
    double *doubleAry = new double[numElements]; 
    cout << "numElements in input: " << numElements << endl; 
    for(int i = 0; i < numElements; i++){ 
     doubleAry[i] = static_cast<double>(input[i]); 
    } 
    return doubleAry; 
} 

Выход программы заключается в следующем:

numElements in input: 2 
numElements in doubles: 1 
1 

кажется numElements пересчитанного произвольными тоже. Я довольно новичок в C++ и не могу точно определить проблему. Заранее спасибо.

+0

'SizeOf (вход)/SizeOf (INT)' не дает размер массива. Это эквивалентно 'sizeof (int *)/sizeof (int)' – Jarod42

+0

Имея только указатель на первый элемент, невозможно определить, на сколько элементов указано. 'sizeof (doubleles)/sizeof (double)' не работает должным образом в этом контексте. – Chad

+2

Вы должны прекратить использовать эту бессмысленность 'sizeof'. Либо передайте размер массива в виде отдельного аргумента, либо переключитесь на 'std :: vector'. – CoryKramer

ответ

1

Как вы отметили, что C++, я думал, что это может быть более идиоматических:

#include <vector> 
#include <algorithm> 

std::vector<double> CastToDouble(std::vector<int> const & ints) 
{ 
    auto doubles = std::vector<double>(ints.size()); 

    std::transform(ints.begin(), ints.end(), doubles.begin(), [](int value) -> double { 
     return static_cast<double>(value); 
    }); 

    return doubles; 
} 

int main(int argc, char* argv[]) 
{ 
    auto values = std::vector<int>() = { 
     1, 2, 3, 4 
    }; 

    auto doubles = CastToDouble(values); 
} 
+0

Или даже 'std :: vector CastToDouble (std :: vector const & ints) { return {ints.begin(), ints.end()}; } ' – Jarod42

+0

Гораздо лучше, да. – Robinson

Смежные вопросы