2016-06-15 2 views
0

Мне нужно сделать точечный продукт двух векторов, а затем отобразить результат. Из того, что я узнал, лучшее, что я могу сделать с C++, - это вернуть результирующий вектор (указатель). В настоящее время я делаю что с этим кодом:Использовать возвращаемый указатель массива в другой функции

// Dot product. 
double * dot(double u[3], double v[3]) { 
    double result[3]; 
    result[0] = u[0] * v[0]; 
    result[1] = u[1] * v[1]; 
    result[2] = u[2] * v[2]; 
    return result; 

Я тогда нужно напечатать результат, поэтому у меня есть еще одна функция, которая принимает указатель:

void pvec(double * ptr) { 
    cout << "[" << *(ptr + 0) <<", " << *(ptr + 1) << ", " << *(ptr + 2) << "]\n"; 
} 

Это не работает. Результирующие значения - все мусор.

Как это сделать? Исходя из python, я действительно чувствую, что не могу передавать массивы через функции, вроде как руки или ноги, и я не могу правильно играть в игру с указателем.

+2

Функция 'dot' возвращает указатель на локальный объект. Когда он разыменовывается, поведение не определено. –

+2

Кроме того ** не играйте в игру с указателем **. Пожалуйста, делайте все на C++. –

+1

Вы можете сделать результат статическим «статическим двойным результатом [3];» или выделить его динамическим (лучше) 'double * result = new double [3];' и освободить его, если не нужно 'delete [] ptr'. См. Https://ideone.com/FU8L0I для демонстрации в реальном времени. – kwarnke

ответ

1

Самый простой способ, на мой взгляд, изменить dot прототип быть следующее:

void dot(double u[3], double v[3], double result[3]) 

и настроить остальную часть кода к нему.

+2

№ Простейший способ - использовать правильные типы контейнеров, такие как 'std :: vector'. –

+0

@NickyC ... прошу отличаться. Контейнеры добавляют много накладных расходов и сложности. Особенно для новичков. – GMichael

+1

№ Стандартные контейнеры библиотеки соответствуют принципу нулевой окладной нагрузки. Легко обрабатывать контейнер как обычный объект, особенно. с фоном Python. Обучение намного сложнее, когда оно связано с осложнениями, включая, но не ограничиваясь, распад от массива до указателя, настройку из массива на указатель в аргументе функции, время жизни объекта/массива и оборванный указатель, отслеживание размера массива и т. Д. –

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