2013-09-06 2 views
4

Visual Studio 2010에서 작업하고 있습니다.이 프로그램 자체는 원래 미래의 CUDA 포트를 고려하여 설계되었으므로 이제는 모두 CUDA를 사용하도록 설계되었습니다. 그러나 지금은 만약 그것이 C++에서 작동한다면 테스트를해라. (실제로 내가 익숙하기 때문에 실제로는 C에 집중하려고한다.)fprintf로 0x00000014 위치에 액세스 위반을 얻는 중

관련 코드 :

#define NMBR_EXP_ENERGIES 21 
#define NMBR_Ls 3 
#define NMBR_POINTS 20000 

<Emin, Emax, dE are initialized as global constants> 
int NMBR_EXP_ENERGIES_L[NMBR_Ls]; 

<Some functions> 

void write_results(double ** u, int * NmbrNodes, int * div){ 
const char prefix[] = "wave_function_"; 
char filename[24]; 
double *eigenergies; 
int div0,i,j,k,l,m; 
FILE *file_u; 
FILE *file_output; 

eigenergies = (double *)malloc(NMBR_EXP_ENERGIES*sizeof(double)); 
j=0; 
m=0; 
file_output = fopen("computation_results.out","w"); 
fprintf(file_output,"This file contains the output\n"); 


for(l=0;l<NMBR_Ls;l++){ 
    div0=div[l*NMBR_ENERGIES]; 
    for(i = l*NMBR_ENERGIES;i<NMBR_ENERGIES*(l+1);i++){ 
     if (div[i] != div0 && m<NMBR_EXP_ENERGIES_L[l]){ 
      div0=div[i]; 
      j++; 
      m++; 
      eigenergies[j-1] = (Emin+((double) (i-l*NMBR_ENERGIES))*dE)-dE/2.0; 
      fprintf(file_output,"The eigenergy %d is %1.15lf and the wavefunction has %d nodes\n",j,eigenergies[j-1],NmbrNodes[i]); 
      sprintf(filename,"%d_%s%d.out",l,prefix,j); 
      file_u = fopen(filename,"w"); 
      for(k=0;k<NMBR_POINTS;k++){ 
       fprintf(file_u,"%lf %1.15lf \n",k*RMAX/NMBR_POINTS,u[i][k]); 
      } 
      fclose(file_u); 
     } 
    } 
    if (j < NMBR_EXP_ENERGIES_L[l]){ 
     j = NMBR_EXP_ENERGIES_L[l]; 
    } 
    m=0; 
    } 
fprintf(file_output,"R = %1.15lf\n ",error_control(eigenergies)); 
fprintf(file_output,"%d eigenergies were found\nIts eigenfunctions were stored on the file %sj.out, 1<j<%d",j,prefix,j); 
fclose(file_output); 
free(eigenergies); 
} 

<Some functions> 

int main(void){ 

<Code that executes the computation and stores it on u[i][j],NmbrNodes[i] and div[i]> 

write_results(u, NmbrNodes, div); 

} 

벡터 DIV 이전 1 충진 -1 필요한. l = 0이고 l = 1 인 동안 프로그램이 잘 실행됩니다. 그러나 그가 마지막 시간 (l = 2)에 외부 루프를 시작하고 두 번째 시간에 if를 입력하면 fprintf(file_output,"The eigenergy %d is %1.15lf and the wavefunction has %d nodes\n",j,eigenergies[j-1],NmbrNodes[i]); 라인에서 충돌합니다. 오류 메시지가

First-chance exception at 0x77dd3ea0 in Potential_Model_Numerov.exe: 0xC0000005: Access violation writing location 0x00000014. 
Unhandled exception at 0x77dd3ea0 in Potential_Model_Numerov.exe: 0xC0000005: Access violation writing location 0x00000014. 

프로그램을 깰 선택,이 기능 void __cdecl _lock의 끝에서 mlock.c 파일을 엽니입니다.

나는 이미 할당 된 공간 이상으로 벡터를 읽지 않는 것을 확인했다. (eigenergies는 eigenergies [20]와 j = 17이 될 때까지 계속된다. NmbrNodes는 NmbrNodes [3071]와 i = 3009가 될 때까지 계속된다. 충돌의 순간). 그래서 나는 그가 왜 금지 된 메모리 주소를 읽으려고하는지 알지 못한다. 어떤 사람이 어떤 생각을 가지고 있습니까?

감사합니다.

사이드 노트 : 기본적으로 동일한 기능을 수행하지만 하드 드라이브에 아무 것도 쓰지 않고도이 기능이 제대로 작동합니다. 또한 때로는 mlock.c 대신 osfinfo.c 파일을 열고 함수 int __cdecl __lock_fhandle의 끝에서 중지합니다.

+3

fprintf를 인쇄 할 때마다 별도의 명령문으로 분리하면 어떤 메모리 참조가 문제를 일으키는 지 알 수 있습니다. 이것들을 개별적으로 출력하십시오'eigenergies [j-1]'과'NmbrNodes [i]' – dcaswell

+0

'file_output'이 성공적으로 열렸는지 확인하지 마십시오. 열리지 않으면 프로그램이 UB에 들어갑니다. 구성 및 최적화 설정에 따라 즉시 충돌이 발생하지 않을 수 있습니다. – nneonneo

+0

필자는 printf를 여러 부분에서 깨뜨리는 제안을 구현했습니다. 에러는'fprintf (file_output, "eigenergy % d", j);'에서 발생합니다. 그러나 디버거가 액세스 할 수 있으며 값 17을 저장하고 있음을 보여줍니다. nneonneo가 말한 것일 수 있습니다. 나는 file_output == 0인지 확인하여 제대로 초기화되었는지 확인했다. 나는 최선의 해결책이 아니라는 것을 알고 있으므로, is_open()을 사용하여 테스트를 할 수 있기 위해 c 대신 C++ 명령을 사용하여 열고 작성하는 방법을 알아 내려고 노력 중이다. – WilhelmM

답변

1

eigenenergiesNULL이 아닙니까? 반환 값 malloc()을 결코 확인하지 마십시오. 당신이 액세스 위반이 주소 0x00000014에 있습니다 얻을

을 감안할 때 당신은

eigenergies이가는 주장 나의 첫번째 추측 될 것

eigenergies [20]

까지. 0x1420과 같습니다.

malloc() ing을 건너 뛰고 double eigenenergies[NMBR_EXP_ENERGIES]을 사용하고자 할 수 있습니다.

관련 문제