Я использую QtCreator для кодирования алгоритма, который я уже закодировал на Matlab.APPCRASH (не при отладке) и ошибка сегментации с использованием QtCreator (C/C++)
При кодировании этой программы у меня есть две ошибки. Фрагмент один (APPCRASH) появляется только тогда, когда я строю и выполняю программу нормально, но не тогда, когда я пытаюсь ее отладить (Heisenbug), и она появляется в функции matriceA. Я пытался сделать переменные волатильными и написать матрицу Формулы выражения для другой функции, надеясь, что это остановит оптимизацию компилятора (я думаю, что оптимизация компилятора может вызвать проблему), но я не смог решить проблему , Я не пытался скомпилировать проект, используя опцию -o0, потому что мой профессор (это университетский проект) должен иметь возможность компилировать его в обычном режиме (без особых опций).
Второй - это ошибка сегментации SISSEGV. Это происходит, когда код поступает в «DestroyFloatArray (& b, width);» на InpaintingColor.
А вот коды:
clanu_process.cpp (это немного грязный, потому что я пытался много вещей ...)
#include "clanu_process.h"
#include "iomanip"
void InpaintingColor(float **Rout, float **Gout, float **Bout, float **Rin, float **Gin, float **Bin, float **Mask, int width, int height, double param)
{
cout << "1" << endl;
float alphak = 0, bethak = 0, res = 0;
float **b = 0, **xk = 0, **dk = 0, **rk = 0, **Ark = 0, **tmp1 = 0,**tmp2 = 0,**tmp3 = 0;
Ark = AllocateFloatArray(width, height);
tmp1 = AllocateFloatArray(width, height);
tmp2 = AllocateFloatArray(width, height);
tmp3 = AllocateFloatArray(width, height);
xk = AllocateFloatArray(width, height);
dk = AllocateFloatArray(width, height);
rk = AllocateFloatArray(width, height);
b = AllocateFloatArray(width, height);
cout << "2" << endl;
res = 1e8;
matrixProductByScalar(b,1.0/(3.0*256),Rin,width,height);
matrixDuplicate(xk, b, width, height);
// APPCRASH error
matriceA(Ark,xk,Mask,width,height);
//More code
// SIGSEGV error
DestroyFloatArray(&b, width);
DestroyFloatArray(&xk, width);
DestroyFloatArray(&dk, width);
DestroyFloatArray(&rk, width);
DestroyFloatArray(&Ark, width);
DestroyFloatArray(&tmp1, width);
DestroyFloatArray(&tmp2, width);
DestroyFloatArray(&tmp3, width);
}
float** matriceA(float **A, float **I, float **Masque, int N2, int N1){
volatile bool bool_iplus = false, bool_imoins = false, bool_jmoins = false, bool_jplus = false;
volatile int iplus = 0, imoins = 0, jplus = 0, jmoins = 0;
for(int i = 1; i <= N1; i++){
bool_iplus = i<N1;
iplus = i+1 < N1 ? i+1 : N1;
bool_imoins = i>1;
imoins = i-1 > 1 ? i-1 : 1;
for(int j = 1; j <= N2; j++){
bool_jplus = j<N2;
jplus = j+1 < N2 ? j+1 : N2;
bool_jmoins = j>1;
jmoins = j -1 > 1 ? j-1 : 1;
if(Masque[i-1][j-1]!=0){
//cout << "if - " << i << ", " << j<< endl;
A[i-1][j-1] = (1.0/36)*(16*I[i-1][j-1]
+ 4*(
(bool_iplus?I[iplus-1][j-1]:0)
+ (bool_imoins?I[imoins-1][j-1]:0)
+ (bool_jplus?I[i-1][jplus-1]:0)
+ (bool_jmoins?I[i-1][jmoins-1]:0)
)+(
(bool_iplus&&bool_jplus?I[iplus-1][jplus-1]:0)
+ (bool_imoins&&bool_jplus?I[imoins-1][jplus-1]:0)
+ (bool_imoins&&bool_jmoins?I[imoins-1][jmoins-1]:0))
+ (bool_iplus&&bool_jmoins?I[iplus-1][jmoins-1]:0));
}else{
//cout << "else - " << i << ", " << j << endl;
A[i-1][j-1]=
-(1.0*N1*N2)*(
-8.0*I[i-1][j-1]
+ I[iplus-1][j-1]
+ I[imoins-1][j-1]
+ I[i-1][jplus-1]
+ I[i-1][jmoins-1]
+ I[iplus-1][jplus-1]
+ I[imoins-1][jplus-1]
+ I[imoins-1][jmoins-1]
+ I[iplus-1][jmoins-1]);
}
}
}
return A;
}
Функции AllocateFloatArray и DestroyFloatArray
float ** AllocateFloatArray(int width, int height)
{
float ** r = new float*[width];
for(int i=0; i<width; i++)
r[i] = new float[height];
return r;
}
void DestroyFloatArray(float ***a, int width)
{
if(*a == 0) return;
for(int i=0; i<width; i++)
delete[] a[0][i];
delete[] *a;
*a = 0;
}
Спасибо за ваше время. не
Я вряд ли верю, что это минимальный пример вашей проблемы;) – Cat
[Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve). Спасибо. – skypjack
Вы должны сузить проблему и удалить все, что не имеет к этому никакого отношения. На данный момент сложнее прочитать ваш вопрос, чем решить проблему. –