2013-04-21 8 views
-1

Я пытаюсь реализовать алгоритм KNN из интереса с помощью кода помощи с форума. Код следующий.Необработанное исключение

#include <opencv\cv.h> 
#include <opencv\ml.h> 
#include <opencv\highgui.h> 
#include <opencv\cxcore.h> 

#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 


using namespace std; 
using namespace cv; 

//typedef unsigned char BYTE; 

int readFlippedInteger(FILE *); 

int main() 
{ 
    FILE *fp = fopen("D:\\KNN\\train-images.idx3-ubyte", "rb"); 
     FILE *fp2 = fopen("D:\\KNN\\train-labels.idx1-ubyte", "rb"); 

    if(!fp || !fp2) 
    { 
     cout<<"Files not Found"<<endl; 
     return 0; 
    } 

    int magicNumber = readFlippedInteger(fp); 
    int numImages = readFlippedInteger(fp); 
    int numRows = readFlippedInteger(fp); 
    int numCols = readFlippedInteger(fp); 

    fseek(fp2, 0x08, SEEK_SET); 

    int size = numRows*numCols; 
    CvMat *trainingVectors = cvCreateMat(numImages, size, CV_32FC1); 
    CvMat *trainingLabels = cvCreateMat(numImages, 1, CV_32FC1); 

    //BYTE *temp = new BYTE[size]; 
    unsigned char *temp = (unsigned char *) malloc(size); 

    unsigned char tempClass=0; 

    for(int i=0; i < numImages; i++) 
    { 
     fread((void*)temp, size, 1, fp); 
     fread((void*)(tempClass), sizeof(unsigned char*), 1, fp2); 

     trainingLabels->data.fl[i] = tempClass; 

     for(int k=0; k < size; k++) 
      trainingVectors->data.fl[i*size+k] = temp[k]; 
    } 

    KNearest knn(trainingVectors, trainingLabels); 
    printf("Maximum k: %d\n", knn.get_max_k()); 

    fclose(fp); 
    fclose(fp2); 

    cvReleaseMat(&trainingVectors); 
    cvReleaseMat(&trainingLabels); 

    return 0; 
} 

int readFlippedInteger(FILE *fp) 
{ 
    int ret = 0; 
    unsigned char *temp; 

    temp = (unsigned char*)(ret); 
    fread(&temp[3], sizeof(unsigned char*), 1, fp); 
    fread(&temp[2], sizeof(unsigned char*), 1, fp); 
    fread(&temp[1], sizeof(unsigned char*), 1, fp); 
    fread(&temp[0], sizeof(unsigned char*), 1, fp); 

    return ret; 
} 

Вместо BYTE я использовал символ unsigned, который, как я думаю, должен выполнять ту же работу. Поправьте меня, если я ошибаюсь.

Тем не менее, я не специалист в области программирования, но когда я запускаю код я получаю эту ошибку

* Необработанное исключение в 0x000007FEE68F7450 (msvcr110d.dll) в K-Ближайшего Neighbour.exe: 0xC0000005: нарушение прав доступа написание местоположения 0x0000000000000003

Может кто-то помочь мне построить этот код .. Спасибо

ответ

0

вы пропустите «адреса» оператор, а SizeOf кажется неправильной:

int readFlippedInteger(FILE *fp) 
{ 
    int ret = 0; 
    unsigned char *temp = (unsigned char*)(&ret); 
    fread(&temp[3], sizeof(unsigned char), 1, fp); 
    fread(&temp[2], 1, 1, fp); // should be equivalent to above 
    ...  
} 

другая проблема может быть предположение, что int 4 байта, потому что вы компиляции с использованием 64 бит, как видно из сообщения об ошибке.

+0

Спасибо .. Это дает отладочную ошибку при запуске. –

+0

fread дать 'утверждение не удалось'? – CapelliC

+0

Я так думаю, потому что ошибка читает путь от fread.c по строке 147.Expresson (buffer! = NULL) –

Смежные вопросы