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

Этот код должен генерировать тот же вывод. Но вывод 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);

1 ответ

Проблема, вероятно, из-за того, как вы храните 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,

Другие вопросы по тегам