в выводе я вижу, что результаты , прежде чем я получу ошибку сегментации, не являются тем, чем предполагалось.
Хорошо, было бы справедливо рассмотреть проблему с корректно работающим кодом по содержанию.Тем не менее, позвольте мне набросать несколько советов о том, где могут возникнуть основные проблемы или как использовать стратегию каменного века для определения первопричины ...
Обычная практика - иметь данныеустановить с помощью известного решения, чтобы заблаговременно обнаружить ошибку / подтвердить достоверность схемы процесса на полученных результатах, просто повторно запустив известный набор тестов.
получаю ошибку сегментации ... и я не могу понять почему .
Общие подозрения:
декларация / адресация, связанные с:
idx
== patternNum - 1
: rotatetPattern[idx]
[ {0|1} ]
idx
== patternNum - 1
: color[idx]
i
== numStep
: errors[i]
?
hostToFrame_affine
[]
?
wG
[]
вызывающая подпись (и) и / или реализациядетали, как видно из:
float
getInterpolatedElement31
(...){ ... }
float
fabs
( ... ){ ... }
Самый простой следующий шаг?Сначала следите за следами пистолета для курения ... всегда ...
Самый простой шаг, доступный сейчас, - это добавление строки трейлинг-стопа DEBUG после каждой выполненной строки:
FLINTSTONEs_DEBUG_LOG( 0 ); // ------------------------------------------------
#pragma omp parallel for schedule(static) reduction(+:ptx,pty)
for( int i = 0;
i < numSteps;
i++
)
{
FLINTSTONEs_DEBUG_LOG( 1 ); // ----------------------------------------
float energy = 0;
FLINTSTONEs_DEBUG_LOG( 2 ); // ----------------------------------------
for ( int idx = 0;
idx < patternNum;
idx++
)
{ FLINTSTONEs_DEBUG_LOG( 3 ); // ------------------------------------
float hitColor = getInterpolatedElement31(
frame->dI,
(float)( ptx
+ rotatetPattern[idx][0]
),
(float)( pty
+ rotatetPattern[idx][1]
),
wG[0]
);
FLINTSTONEs_DEBUG_LOG( 4 ); // -----------------------------------
if ( !std::isfinite( hitColor ) )
{
FLINTSTONEs_DEBUG_LOG( 5 ); // -----------------------------
energy += 1e5;
FLINTSTONEs_DEBUG_LOG( 6 ); // -----------------------------
continue;
FLINTSTONEs_DEBUG_LOG( 7 ); // -------------------------- ;)
}
float residual = hitColor
- (float) ( hostToFrame_affine[0]
* color[idx]
+ hostToFrame_affine[1]
);
FLINTSTONEs_DEBUG_LOG( 8 ); // -----------------------------------
float hw = setting_huberTH > fabs( residual )
? 1
: setting_huberTH / fabs( residual );
FLINTSTONEs_DEBUG_LOG( 9 ); // -----------------------------------
energy += hw
* residual
* residual
* ( 2 - hw );
FLINTSTONEs_DEBUG_LOG( 10 ); // ----------------------------------
}
FLINTSTONEs_DEBUG_LOG( 11 ); // --------------------------------------
...
..
.
Использование:
void FLINTSTONEs_DEBUG_LOG( int TracePOINT )
{ printf( "ACK: thread[%d]'s smoke-trail has reached TracePOINT( %d )\n",
omp_get_thread_num(),
TracePOINT
);
}
Конечно, это не наука о ракетостроении, но может легко показать вам след дыма после того, как в печати появилось следующее SegFault, так что, думаю, стоит упомянуть об этом и здесь.
Ябба Дабба Ду, иди, беги твердо, шаг за шагом.