2014-01-13 2 views
0

이것은 또 다른 문제입니다. 우선 PicoScope 6에서 내 보낸 정보가 들어있는 레벨 4의 MATLAB 파일을 읽으려고합니다.이 파일은 A, Tstart, Tinterval 및 Length 파일에서 네 개의 배열을 읽습니다. 배열 번호 1은 지금까지 가장 큰 번호이며 1000004 개의 값을 포함하지만 나머지 3 개는 각각 하나의 값만 포함합니다. 아래의 코드를 실행하면 성공적으로 파일을 읽고 다차원 배열에 저장하지만 은 배열을 사용하려고 할 때이 실패합니다.C에서 큰 배열을 사용할 때 EXCEPTION_ACCESS_VIOLATION

#include <jni.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <matio.h> 
#include "ReadMatFile.h" 

//macros 
#define getLength(x) (sizeof(x)/sizeof(x[0])) 

//variables 
double *dataMatrix[4]; 
int innerSize[getLength(dataMatrix)]; 

//functions 
jobjectArray convertToArray(JNIEnv *env, double **data, int length1D, 
     int *length2D); 

JNIEXPORT jdoubleArray JNICALL Java_ReadMatFile_readMatFile(JNIEnv *env, 
     jobject object, jstring str) { 
    const char *fileName = (*env)->GetStringUTFChars(env, str, 0); 
    mat_t *matfp; 
    matvar_t *matvar; 
    matfp = Mat_Open(fileName, MAT_ACC_RDONLY | MAT_FT_MAT4); 
    if (NULL == matfp) { 
     fprintf(stderr, "Error opening MAT file %s\n", fileName); 
     return NULL; 
    } 
    int i = 0; 
    while (NULL != (matvar = Mat_VarReadNext(matfp))) { 
     double *data = (double*) (matvar->data); 
     dataMatrix[i] = data; 
     innerSize[i] = (int) matvar->nbytes/matvar->data_size; 
     Mat_VarFree(matvar); 
     matvar = NULL; 
     i++; 
    } 
    Mat_Close(matfp); 
    (*env)->ReleaseStringUTFChars(env, str, fileName); 
    int s; 
    for(s = 0; s < innerSize[0]; s++) 
     printf("A[%d] = %e\n", s, dataMatrix[0][s]); /* Fails here */ 
    return NULL; 
    //return convertToArray(env, dataMatrix, getLength(dataMatrix) ,innerSize); 
} 

jobjectArray convertToArray(JNIEnv *env, double **data, int length1D, 
     int *length2D) { 
    jsize outerSize = (jsize) length1D; 
    jclass class = (*env)->FindClass(env, "[D"); 
    jobjectArray outer = (*env)->NewObjectArray(env, outerSize, class, 0); 
    jsize i; 
    for (i = 0; i < outerSize; i++) { 
     jsize innerSize = (jsize) length2D[i]; 
     jdoubleArray inner = (*env)->NewDoubleArray(env, innerSize); 
     (*env)->SetDoubleArrayRegion(env, inner, 0, innerSize, data[i]); 
     (*env)->SetObjectArrayElement(env, outer, i, inner); 
     (*env)->DeleteLocalRef(env, inner); 
    } 
    return outer; 
} 

이 원인은 무엇입니까? 이 응용 프로그램을 실행할 때 minidump이 생성됩니다. 배열이 너무 큽니까? 이것에 대한

수정과도 설명 많이 주시면 감사하겠습니다 무엇이 잘못되었는지의!

미리 감사드립니다.

답변

2

나는 당신의 문제는 다음 코드에서 의심 :

double *data = (double*) (matvar->data); 
dataMatrix[i] = data; 
innerSize[i] = (int) matvar->nbytes/matvar->data_size; 
Mat_VarFree(matvar); // whoopsie 

Mat_VarFree 내가 dataMatrix[i] 더 이상 유효한 포인터, 따라서 충돌이다 의미가없는, matvar->data 더 이상 유효한 포인터, 그것은하지 생각하지 어떤 않는 경우 .

내가 무엇을 할 의도하는 것은, matvar->data의 데이터의 로컬 복사본을 만들고 dataMatrix에 저장되어

innerSize[i] = matvar->nbytes/matvar->data_size; 
dataMatrix[i] = malloc(sizeof *dataMatrix[i] * innerSize[i]); 
if (dataMatrix[i]) 
    memcpy(dataMatrix[i], matvar->data, matvar->nbytes); 
Mat_VarFree(matvar); 

의 라인을 따라 뭔가 더 생각합니다. 원래 코드에서 복사 한 모든 것은 포인터 값이었습니다. 데이터의 별도 사본을 만들지 않았습니다.

+0

감사합니다. 시도해 보겠습니다. – Linus

관련 문제