일부 이미지를 분석하는 Gtk + 3 애플리케이션을 작성했습니다. 파일 이름 목록이 만들어지면 이미지를 읽고 일부 작업을 수행하는 콜백 단추를 통해 함수를 호출합니다. 나는이 4D-배열을 계산할 때 모든 것은 제외하고 잘 작동 (즉, 1 ~ 큰 2GB입니다) :gtk + 3 콜백에서 곱셈 후 잘못된 결과가 임의로 발생했습니다.
는 각 실행에 대한 동일 (종종 전체 행) 수없는 몇 가지 점에서 사실for(int i=0; i<Nimages; i=i+2){
TIFF* tifA = TIFFOpen(impath[i], "r");
TIFF* tifB = TIFFOpen(impath[i+1], "r");
for (row = 0; row < length; row++){
TIFFReadScanline(tifA, bufA, row,0);
TIFFReadScanline(tifB, bufB, row,0);
dataA=bufA;
dataB=bufB;
for(col = 0; col < width; col++){
A[row][col] = dataA[col];
B[row][col] = dataB[col];
}
}
TIFFClose(tifA);
TIFFClose(tifB);
for (row = 0; row < length; row++){
for (col = 0; col < width; col++){
for (int x = 0 ; x < csiMax ; x++) {
for (int y = 0 ; y < psiMax ; y++){
C[row][col][x][y] += A[row][col]*B[row+x][col+y];
}
}
}
}
}
, 그것은 0을 제공합니다 A와 B 요소가 정확하고 0과 다른 경우에도 마찬가지입니다. 명령 행 버전에서 정확히 동일한 코드가 올바르게 작동합니다. 누군가 이런 일이 일어난 이유를 말해 줄 수 있습니까?
제발, 도와주세요!
EDIT 여기서 1
코드의 추가 정보.
gdouble ****alloc4D (gint maxx, gint maxy,gint maxr,gint maxc) {
gdouble *rows = g_malloc0(maxx*maxy*maxr*maxc*sizeof(*rows));
gdouble **cols = g_malloc0(maxx*maxy*maxr*sizeof(*cols));
gdouble ***mat = g_malloc0(maxx*maxy*sizeof(*mat));
gdouble ****result = g_malloc0(maxx*sizeof(*result));
for (int x = 0 ; x < maxx ; x++) {
result[x] = mat;
mat += maxy;
for (int y = 0 ; y < maxy ; y++) {
result[x][y] = cols ;
cols += maxr;
for (int r = 0 ; r < maxr ; r++) {
result[x][y][r] = rows;
rows += maxc;
}
}
}
return result;
}
void free4D(gdouble ****Mat4D){
g_free(Mat4D[0][0][0]);
g_free(Mat4D[0][0]);
g_free(Mat4D[0]);
g_free(Mat4D);
}
void TIFFanalyzePairs(GtkWidget *widget, gpointer data){
MYlist *plist=data;
long int Nimages=g_slist_length(plist->List);
long int Npairs=Nimages/2;
TIFF* tif = TIFFOpen((gchar*)g_slist_nth_data(plist->List,1), "r");
uint32 length;
uint32 width;
tsize_t scanline;
tdata_t bufA;
tdata_t bufB;
uint16 *dataA;
uint16 *dataB;
int csiMax;
int psiMax;
int row;
int col;
TIFFGetField(tif, TIFFTAG_IMAGELENGTH,&length);
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH,&width);
TIFFClose(tif);
g_print("length %d pixel \n",length);
g_print("width %d pixel \n",width);
scanline = TIFFScanlineSize(tif);
bufA = _TIFFmalloc(scanline);
bufB = _TIFFmalloc(scanline);
g_print("--------------------------\n");
plist->Am=(double**)malloc(length*sizeof(double*));
plist->Bm=(double**)malloc(length*sizeof(double*));
plist->SA=(double**)malloc(length*sizeof(double*));
plist->SB=(double**)malloc(length*sizeof(double*));
plist->A=(uint16**)malloc(length*sizeof(uint16*));
plist->B=(uint16**)malloc(length*sizeof(uint16*));
plist->u=(double**)malloc(length*sizeof(double*));
plist->v=(double**)malloc(length*sizeof(double*));
for(row=0; row<length; row++){
plist->u[row]=(double*)malloc(width*sizeof(double));
plist->v[row]=(double*)malloc(width*sizeof(double));
plist->Am[row]=(double*)malloc(width*sizeof(double));
plist->Bm[row]=(double*)malloc(width*sizeof(double));
plist->SA[row]=(double*)malloc(width*sizeof(double));
plist->SB[row]=(double*)malloc(width*sizeof(double));
plist->A[row]=(uint16*)malloc(scanline);
plist->B[row]=(uint16*)malloc(scanline);
}
/* HERE I OMITTED THE SECTION WHERE I COMPUTE Am, Bm, SA, SB BECAUSE IT'S RIGHT*/
MEMORYSTATUSEX statex;
statex.dwLength = sizeof (statex);
GlobalMemoryStatusEx (&statex);
double memfree;
memfree=(double)statex.ullAvailPhys;
csiMax=plist->dtop+plist->ddown+1;
psiMax=plist->dleft+plist->dright+1;
double maxram=ceil(memfree*plist->Kmem);
double maxArraySize=maxram/(csiMax*psiMax*sizeof(double)*width);
double stepR=length/maxArraySize;
stepR=ceil(stepR);
long int row_step=ceil(length/stepR);
int *forstep=(int*)malloc(length*sizeof(int));
forstep[0]=0;
long int dummy;
long int k=0;
for(row=1; row<length; row++){
dummy=(row+1)%row_step;
if(dummy==0){
k=k+1;
forstep[k]=row;
}
}
if(forstep[k]!=length-1){
forstep[k+1]=length-1;
k=k+1;
}
g_print("rowstep %ld pixel\n", row_step);
for(int l=0; l<=k;l++){
g_print("l=%d ->row=%d \n", l,forstep[l]);
}
gdouble **A=(gdouble**)g_malloc(length*sizeof(double*));
for(row=0; row<length; row++){
A[row]=(gdouble*)g_malloc(width*sizeof(gdouble));
}
gdouble **Bneg;
Bneg=(gdouble**)g_malloc((csiMax+length)*sizeof(gdouble*));
for(row=0; row<length+csiMax; row++){
Bneg[row]=(gdouble*)g_malloc((width+psiMax)*sizeof(gdouble));
}
for(row=0; row<length+csiMax; row++){
for(col=0; col<width+psiMax; col++){
Bneg[row][col]= log(-1);
}
}
gint csiNeg=plist->dtop;
gint psiNeg=plist->dleft;
for(int step=0; step<k; step++){
gdouble ****C = alloc4D(row_step,width,csiMax,psiMax);
for(int i=0; i<Nimages-1; i=i+2){
TIFF* tifA = TIFFOpen((gchar*)g_slist_nth_data(plist->List,i), "r");
TIFF* tifB = TIFFOpen((gchar*)g_slist_nth_data(plist->List,i+1), "r");
for (row = 0; row < length; row++){
TIFFReadScanline(tifA, bufA, row,0);
TIFFReadScanline(tifB, bufB, row,0);
dataA=bufA;
dataB=bufB;
for(col = 0; col < width; col++){
A[row][col] = (dataA[col]-plist->Am[row][col])/(plist->SA[row][col]);
Bneg[row+plist->dtop][col+plist->dleft] = (dataB[col]-plist->Bm[row][col])/(plist->SB[row][col]);
}
}
TIFFClose(tifA);
TIFFClose(tifB);
/* calcolo di C[x][y][r][c] */
for (row = 0; row < row_step; row++){
for (col = 0; col < width; col++){
for (int x = 0 ; x < csiMax ; x++) {
for (int y = 0 ; y < psiMax ; y++){
C[row][col][x][y] += A[row+forstep[step]][col]*Bneg[x+row+forstep[step]][y+col];
}
}
}
}
}
/* HERE A SECTION THAT DEPENDS ON C[row][col][x][y] , SO I OMITTED BECAUSE THE PROBLEMS START CALCULATING C*/
free4D(C);
}
_TIFFfree(bufA);
_TIFFfree(bufB);
free2D(A,length);
free2D(Bneg,length);
toc(t0);
}
int
main (int argc,
char **argv)
{
gtk_init (&argc, &argv);
GtkWidget *window;
GtkWidget *grid;
GdkPixbuf *icon;
GtkWidget *start_button;
GtkWidget *select_files_button;
GtkWidget *button;
MYlist datalist;
datalist.dtop=6;//csiNeg
datalist.dleft=3;//psiNeg
datalist.ddown=6;//csiPos
datalist.dright=30;//psiPos
datalist.Kmem=0.6;
/* create a new window, and set its title */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "SPEC beta");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 900, 700);
gtk_container_set_border_width (GTK_CONTAINER (window), 15);
grid = gtk_grid_new();
gtk_container_add (GTK_CONTAINER (window), grid);
start_button = gtk_button_new_with_label ("Start");
g_signal_connect (start_button, "clicked", G_CALLBACK (TIFFanalyzePairs), &datalist);
gtk_grid_attach (GTK_GRID (grid), start_button, 0, 0, 2, 1);
/* bottone selezione files con annessa finestra di dialogo (callback) */
select_files_button = gtk_button_new_with_label ("Select files or folder");
g_signal_connect (select_files_button, "clicked", G_CALLBACK (select_files), &datalist);
gtk_grid_attach (GTK_GRID (grid), select_files_button, 0, 1, 2, 1);
gtk_widget_show_all (window);
g_signal_connect(window, "destroy",
G_CALLBACK(gtk_main_quit), NULL);
g_object_unref(icon);
gtk_main();
return 0;
}
편집 2
The exact values of a C[row][col][:][:] calculated by the command line version of the code
The same matrix calculated by the code with Gtk
당신이 볼 수 있듯이, 결과가 다릅니다 및 요소가 다르게 나는를 실행할 때마다 위치이 제로 프로그램.
게시 한 코드가 분리되어 작동하는 경우, 코드를 제공하지 않은 다른 상황에 어떤 문제가 있는지 어떻게 알 수 있습니까? [MCVE] (http://stackoverflow.com/help/mcve)를 제공해주십시오. – Phillip
어레이를 생성하는 동안 수정할 수있는 전역 변수가 있습니까? – Gerhardh
@Gerhardh 도움이 될만한 것이 있다면 필자는 주요 섹션 코드를 작성했습니다. – SimoneG