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
의 끝에서 중지합니다.
fprintf를 인쇄 할 때마다 별도의 명령문으로 분리하면 어떤 메모리 참조가 문제를 일으키는 지 알 수 있습니다. 이것들을 개별적으로 출력하십시오'eigenergies [j-1]'과'NmbrNodes [i]' – dcaswell
'file_output'이 성공적으로 열렸는지 확인하지 마십시오. 열리지 않으면 프로그램이 UB에 들어갑니다. 구성 및 최적화 설정에 따라 즉시 충돌이 발생하지 않을 수 있습니다. – nneonneo
필자는 printf를 여러 부분에서 깨뜨리는 제안을 구현했습니다. 에러는'fprintf (file_output, "eigenergy % d", j);'에서 발생합니다. 그러나 디버거가 액세스 할 수 있으며 값 17을 저장하고 있음을 보여줍니다. nneonneo가 말한 것일 수 있습니다. 나는 file_output == 0인지 확인하여 제대로 초기화되었는지 확인했다. 나는 최선의 해결책이 아니라는 것을 알고 있으므로, is_open()을 사용하여 테스트를 할 수 있기 위해 c 대신 C++ 명령을 사용하여 열고 작성하는 방법을 알아 내려고 노력 중이다. – WilhelmM