Я преобразовал векторный набор данных c ++ в массив c. Я передаю тот же набор данных в функцию, которая должна давать тот же вывод

Этот код должен генерировать тот же вывод. Но вывод c кажется округленным, а c ++ — нет. Я не понимаю, что здесь происходит.
Пожалуйста, объясни.

До того момента, когда я показываю код, одни и те же значения передаются в код c и c ++.

код c:

unsigned int sz1=sz+1;
double* bMat = (double*)calloc(bMatSize,bMatSize * sizeof(double));

for (unsigned int ii = 0; ii<sz; ii++)
for (unsigned int jj = 0; jj <= ii; jj++)
{
bMat[jj*sz1 + ii] = simgms_math_ddot(numBFunc, queueTest[ii], queueTest[jj] );
bMat[ii*sz1 + jj] = bMat[jj*sz1 + ii];
}

код C ++:

std::vector<double> bMat;
unsigned int sz1=sz+1;
bMat.resize(sz1*sz1);
for(unsigned int ii=0; ii<sz; ii++)
for(unsigned int jj=0; jj<=ii; jj++)
{
bMat.at(jj*sz1+ii)=simgms_math_ddot(numBFunc, queueTest.at(ii).data(), queueTest.at(jj).data());
bMat.at(ii*sz1+jj)=bMat.at(jj*sz1+ii);
}

for (int i = 0; i < bMat.size(); ++i) {
std::cout << bMat[i] << ' ';
}
std::cout << std::endl;

общая функция

double simgms_math_ddot(unsigned int numElements, double aMat[], double bMat[])

{
const MKL_INT n=numElements;

double res = cblas_ddot(n, aMat, 1, bMat, 1);

return res;
}

c coutput (bMat)

0 0 -1 0 0 -1 -1 -1 0

c ++ coutput (bMat)

 1.05e-05 0.00134 -1 0.00134 1.11 -1 -1 -1 0

И матрица ошибок содержит значения:

1.78e-15 0.387 1.3 -0.48 -17.5 2.28 -0.387 -1.78e-15 1.48 -0.33 -17.3 2.4 -1.3 -1.48 -1.11e-16 1.08 -0.926 2.41 0.48 0.33 -1.08 0 0.551 0.74 17.5 17.3 0.926 -0.551 0 -0.384 -2.28 -2.4 -2.41 -0.74 0.384 0

std::deque< double* > queueTest;

….Он заполнен элементами errorMatrix, которые являются 2d массивами,

 e.g: queueTest.push_front(errorMatrix);

2

Решение

Проблема, вероятно, из-за того, как вы храните queueTest в deque,

queueTest.at(ii).data()

достигает элемента iith без проблем (но с O(n) сложность, и может заставить вас думать, что это индексированный доступ, тогда как это не так), но если вы передадите адрес первого элемента std::deque в вашей C-программе добавление смещения не будет работать, потому что, в отличие от std::vector объем памяти, std::deque память не является непрерывной (это связанный список), поэтому вы получаете случайные данные для ваших коэффициентов.

От http://www.cplusplus.com/reference/deque/deque/:

в отличие от векторов, deques не гарантирует хранение всех своих элементов в смежных местах хранения: доступ к элементам в deque путем смещения указателя на другой элемент вызывает неопределенное поведение.

Быстрое исправление, чтобы иметь возможность использовать его со стороны C, это преобразовать ваши deque к vector,

1

Другие решения

Других решений пока нет …