2016-06-04 2 views
0

Я использую 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; 
} 

Спасибо за ваше время. не

+2

Я вряд ли верю, что это минимальный пример вашей проблемы;) – Cat

+5

[Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve). Спасибо. – skypjack

+0

Вы должны сузить проблему и удалить все, что не имеет к этому никакого отношения. На данный момент сложнее прочитать ваш вопрос, чем решить проблему. –

ответ

0

Я не уверен, что это является причиной вашей проблемы, но ...

Ваша функция «Матричные операции» (sum(), matrixSubstraction(), matrixAddition(), matrixProductByElement(), matrixProductByScalar() и matrixDuplicate()) колеблются первый индекс от от нуля до width, а второй - от нуля до height.

Если я не ошибаюсь, это правильно и соответствует распределению/освобождению (AllocateFloatArray() и DestroyFloatArray()).

Но посмотрите на две функции matriceA(); они определяются как

float** matriceA(float **A, float **I, int N2, int N1) 
float** matriceA(float **A, float **I, float **Masque, int N2, int N1) 

В обеих функций первый диапазон индексов от нуля до N1, а второй от нуля до N2; на примере

for(int i = 1; i <= N1; i++){ 
// ... 
    for(int j = 1; j <= N2; j++){ 
    // ... 
     A[i-1][j-1] = (1.0/36)*(16*I[i-1][j-1] // ... 

Хорошо. Но вы называете matriceA() таким образом

matriceA(Ark,rk,Mask,width,height); 

Вкратце: вы размещаете свои матрицы в качестве width * height матриц; ваши "матричные операции" используют их как: width * height, но ваша matriceA() функция использует их как height * width.

Замечательный способ опустошения памяти.

Я полагаю, что решение может быть

1) переключатель N1 и N2 в matriceA() определения

2) или переключатель width и height в matriceA() вызова

p.s .: Извините за мой плохой английский.

+1

Спасибо! Ты был прав. Вы не решали проблемы, о которых я говорил, но вы нашли еще один. – Skrime

+0

И не беспокойтесь о своем английском. Я не родной, и мой английский это не самый лучший – Skrime

+0

Я ошибся. Ошибка, которую вы нашли, решила все проблемы. Вчера, когда меняли код, я не делал все правильно. Еще раз спасибо – Skrime