2015-03-14 2 views
1

Я пытаюсь создать программу, написанную на C++ предыдущим учеником. Я использую ccmake, а затем make для создания программы. Тем не менее, после того, как я ударил make, я получаю сообщение об ошибке:unimplemented: неожиданный ast of kind ltgt_expr в C++

/workspace/arthur/Project/src/DirectoryName/name.cpp: In member function  ‘void seed::Sweep(Datareg3&)’: 
/workspace/arthur/Project/src/DirectoryName/name.cpp: sorry, unimplemented: unexpected ast of kind ltgt_expr 
/workspace/arthur/Project/src/DirectoryName/name.cpp:confused by earlier errors, bailing out 
make[2]: *** .. Error 1 
make[1]: *** ..Error 2 

Ошибка протекающие на последней строке кода ниже:

Код для этого исходного файла ниже:

#define sgn(x) ((x)>0 ? 1 : ((x)<0?-1:0)) 

void seed::Sweep(Datareg3& reg3) 
{ 
    u_int i, j, k; 
    Range resp; 
    float min, max, t; 
    float gradz; 
    float grad1xa, grad1xb; 
    float grad1ya, grad1yb; 
    float grad2xa, grad2xb; 
    float grad2ya, grad2yb; 
    int keepflat, *keepflat_y; 
    keepflat_y = (int*)malloc(sizeof(int)*reg3.dim[0]); 
    for(k=0; k<reg3.dim[2]-1; k++) 
    { 
     .. 
     for(j=0; j<reg3.dim[1]-1; j++) 
     { 
      keepflat = 1; 
      for(i=0; i<reg3.dim[0]-1; i++) 
      { 
       resp.MakeEmpty(); 

       // top 
       if(i == reg3.dim[0]-2) 
       { 
        if(keepflat && keepflat_y[i]) 
        { 
         // reached end at a flat.. add the edge values 
         min = max = reg3.getValue(i+1,j,k); 
         if((t=reg3.getValue(i+1,j,k+1)) < min) 
         { 
          min = t; 
         } 
         if(t > max) 
         { 
          max = t; 
         } 
         resp += Range(min,max); 
        } 

        // do we need to set keepflat_y[i]? 
        gradz = reg3.getValue(i,j+1,k+1) - 
          reg3.getValue(i,j+1,k); 
        grad2xa = reg3.getValue(i+1,j+1,k+1) - reg3.getValue(i,j+1,k+1); 
        grad2xb = reg3.getValue(i+1,j+1,k) - reg3.getValue(i,j+1,k); 
        grad2ya = reg3.getValue(i,j+1,k+1) - reg3.getValue(i,j,k+1); 
        grad2yb = reg3.getValue(i,j+1,k) - reg3.getValue(i,j,k); 
        keepflat_y[i] = (sgn(gradz) != 0 && 
            ((sgn(gradz) == -sgn(grad2xa) && sgn(gradz) == sgn(grad2ya)) 
             || 
             (sgn(gradz) == -sgn(grad2xb) && sgn(gradz) == sgn(grad2yb)))); 
//error occurs AT THIS LINE 

Я никогда не видел эту ошибку раньше, и когда я попытался выполнить поиск в Google, у меня было очень мало результатов. Кто-нибудь знает, как с этим справиться?

+0

Какой компилятор вы используете и какую версию? –

+0

Я уже подсчитал круглую скобку, и это правильно. Я использую gcc/4.6 – user4352158

ответ

0

Я предлагаю вам упростить выражение, чтобы помочь компилятору:

const int sgn_gradz = sgn(gradz); 
keepflat_y[i] = (sgn_gradz != 0 
       && ( (sgn_gradz == -sgn(grad2xa) && sgn_gradz == sgn(grad2ya)) 
         || (sgn_gradz == -sgn(grad2xb) && sgn_gradz == sgn(grad2yb)) 
        ) 
       ); 

Другой идеей было бы разделить соединение выражение на более мелкие выражения, используя временные bool переменные:

const bool sgn_gradz_eq_neg_sgn_grad2xa = sgn_gradz == -sgn(grad2xa); 
keepflat_y[i] = (sgn_gradz != 0 
       && (sgn_gradz_eq_neg_sgn_grad2xa && sgn_gradz == sgn(grad2ya)) 
         || (sgn_gradz == -sgn(grad2xb) && sgn_gradz == sgn(grad2yb)) 
        ) 
       ); 

По расщеплению сложное выражение в меньшие выражения с временными переменными, компилятор будет генерировать ошибку для определенного выражения, а не всей строки.

Еще один элемент, который нужно сделать, - убедиться, что функция sgn имеет декларацию в этой единицы перевода.

+0

Я пробовал эти 2 предложения, но оба они дают ту же ошибку, что и в OP. Что касается 'sgn', я забыл включить строку, где она определена. Я отредактировал OP, чтобы отразить это – user4352158