2016-06-13 2 views
2

Я новичок в программировании на C++, и у меня есть эта проблема. Я хочу передать указатель double в функцию (которая будет обрабатывать некоторые данные на нем) и прочитать (после процесса) фиксированное значение этого «массива». Я сделать this:Что случилось с передачей этого двойного указателя и получить значение?

void ReadDoubles(double* samples, int size) 
{ 
    for (int i=0; i < size; ++i) 
    { 
     *samples = i*10.1; 
     samples++; 
    }  
} 

int main() 
{ 
    int size = 10; 
    double *values=0; 
    ReadDoubles(values, size); 
    cout << *(values+3); 
} 

Но, конечно, кажется, что я не могу инициализировать указатель, что путь. Я думаю, мне нужно запустить указатель, выделяющий 10 значений? Протестировано:

double *values[size]; 

но это не решение. Как бы вы справились с этой простой задачей?

+0

Попробуйте 'double values ​​[size];' (и 'const int size = 10;'). – molbdnilo

+0

'std :: vector значения', передать его по ссылке ... – Nim

+0

@Nim: nope. не может изменить метод ReadDoubles. – markzzz

ответ

3

Вам необходимо сначала выделить массив. Здесь вы

#include <iostream> 

void ReadDoubles(double* samples, size_t size) 
{ 
    for (size_t i = 0; i < size; ++i) 
    { 
     *samples = i*10.1; 
     samples++; 
    }  
} 

int main() 
{ 
    size_t size = 10; 
    double *values = new double[size]; 
    //    ^^^^^^^^^^^^^^^^ 

    ReadDoubles(values, size); 

    std::cout << *(values+3) << std::endl; 

    delete []values; 
} 

Выход программы

30.3 

Если вы не хотите использовать оператор new, то есть два основных подхода. Либо вы можете объявить массив как, например

int main() 
{ 
    const size_t size = 10; 
    //^^^^ 
    double values[size]; 
    //  ^^^^^^^^^^^^ 

    ReadDoubles(values, size); 

    std::cout << *(values+3) << std::endl; 
} 

или вы можете использовать стандартный класс std::vector<double> .В этом случае функция должна быть переписан соответствующим образом.

Например

#include <iostream> 
#include <vector> 

void ReadDoubles(std::vector<double> &samples, size_t size) 
{ 
    samples.resize(size); 

    for (size_t i = 0; i < size; ++i) 
    { 
     samples[i] = i*10.1; 
    }  
} 

int main() 
{ 
    size_t size = 10; 
    std::vector<double> values; 

    ReadDoubles(values, size); 

    std::cout << values[3] << std::endl; 
} 
+0

Почему, если я пишу 'double values ​​[size]' он говорит, выражение не оценивалось константой? – markzzz

+1

'new' &' delete' в программе выглядит как запах кода – Destructor

+0

@paizza: потому что это так, как указано в стандарте. – Destructor

0

Если вы не можете изменить функцию RealDoubles и вы должны иметь функцию возврата размера, то должно работать:

#include <string> 
#include <iostream> 
#include <math.h> 
#include <cmath> 

using namespace std; 

void ReadDoubles(double* samples,int size) 
{ 
    for (int i=0; i < size; ++i) { 
     *samples = i*10.1; 
     samples++; 
    } 
} 

int get_size() 
{ 
    return 10; 
} 

int main() 
{ 
    int size = get_size(); // get size from function 
    //double *values=0; 
    double *values = new double[size] {0}; // Use new to allocate array. Optional: use {0} to init first element to 0, others default initialized to 0 
    ReadDoubles(values,size); 
    cout << *(values+3); 
    delete[] values; 
} 

Если вы предпочитаете, чтобы избежать new и delete, то вы можете позволить std::vector управлять контейнером для вас:

#include <string> 
#include <iostream> 
#include <math.h> 
#include <cmath> 
#include <vector> 

using namespace std; 

void ReadDoubles(double* samples,int size) 
{ 
    for (int i=0; i < size; ++i) { 
     *samples = i*10.1; 
     samples++; 
    } 
} 

int get_size() 
{ 
    return 10; 
} 

int main() 
{ 
    int size = get_size(); // get size from function 
    //double *values=0; 
    std::vector<double> value_container(size,0); // vector will do the new and delete for us 
    double *values = value_container.data(); 
    ReadDoubles(values,size); 
    cout << *(values+3); 
} // vector destructor will do delete when it goes out of scope 
+0

Я получил размер от функции. В нем говорится, что это не может оправдать это. Другой путь? – markzzz

+0

@paizza Я сделал некоторые обновления – wally

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