2013-12-15 3 views
0

Я пытаюсь запустить этот код в Windows 7 после того, как он скомпилирован успешно. Любые идеи о том, почему он падает? Я дал ему случайный сгенерированный двоичный файл в качестве входных данных для тестирования, но как только он начнется, приложение сработает.Почему этот код C++ сбой?

#include <cstdio> 
#include <cstdint> 
using namespace std; 

long getFileSize(FILE *file) { 
     long currentPosition, endPosition; 
     currentPosition = ftell(file); 
     fseek(file, 0, 2); 
     endPosition = ftell(file); 
     fseek(file, currentPosition, 0); 
     return endPosition; 
} 

struct frame { 
     uint8_t bytes[535]; 
}; 

struct spectralFrame { 
     uint8_t bytes[512]; 
}; 

struct spectralFrameWord { 
     uint16_t words[256]; 
}; 

int main() { 
     char *filePath = "C:\\Payload\\Untitled.bin"; 
     uint8_t *fileBuffer; 
     FILE *file = NULL; 
     file = fopen(filePath, "rb"); 
/*  if((file = fopen(filePath, "rb")) == NULL) 
       cout << "Failure." << endl; 
     else 
       cout << "Success." << endl; 
*/ 
     long fileSize = getFileSize(file); 
     fileBuffer = new uint8_t[fileSize]; 
     fread(fileBuffer, fileSize, 1, file); 
     fclose (file); 
     long frameCount = fileSize/535; 
     frame *frames = new frame[frameCount]; 
     for(int i = 0, j = 0, k = 0; i < fileSize; i++) { 
       frames[j].bytes[k++] = fileBuffer[i]; 
       if((i % 534) == 0) { 
         j++; 
         k = 0; 
       } 
     } 
     delete fileBuffer; 
     fileBuffer = NULL; 
     spectralFrame *spectralFrames = new spectralFrame[frameCount]; 
     for(int i = 0; i < frameCount; i++) { 
       for(int j = 22, k = 0; j < 534; j++) { 
         spectralFrames[i].bytes[k++] = frames[i].bytes[j]; 
       } 
     } 
     delete frames; 
     frames = NULL; 
     spectralFrameWord *spectralFrameWords = new spectralFrameWord[frameCount]; 
     uint16_t word; 
     for(int i = 0; i < frameCount; i++) { 
       for(int j = 0, k = 0; i < 511;) { 
         word = spectralFrames[i].bytes[j++] << 8; 
         spectralFrameWords[i].words[k++] = word | spectralFrames[i].bytes[j++]; 
       } 
     } 
     delete spectralFrames; 
     spectralFrames = NULL; 
     filePath = "C:\\Payload\\Untitled.tsv"; 
     file = fopen(filePath, "w"); 
/*  if((file = fopen(filePath, "w")) == NULL) 
       cout << "Failure." << endl; 
     else 
       cout << "Success." << endl; 
*/ 
     for(int i = 0; i < 256; i++) { 
       fprintf (file, "%u\t%u\n", i, spectralFrameWords[0].words[i]); 
     } 
     fclose (file); 
     return 0; 
} 
+0

Не ссылайтесь на внешние страницы, укажите код в вопросе. –

+0

Почему вы используете 'stdio' вместо' iosream'? –

+2

** Никогда ** хранить строковый литерал в неконстантном 'char *'. Я бы предложил использовать реальные функции C++, такие как 'std :: string' и' std :: vector'. – chris

ответ

3

Если вы используете new[] вам нужно использовать delete[], не delete. Я вижу три нарушения этого правила в вашем коде.

1

Похож на код c не C++. За исключением нового [] delete [] попытайтесь запустить это с помощью valgrind, он, скорее всего, покажет вам все плохие вещи, которые у вас есть.

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