ОБНОВЛЕНИЕ ВНУТРИ ====
Некоторое время назад я сделал следующую функцию, которую я успешно использовал для получения значений серого из изображений ( wxh измерение), которые были преобразованыв .bin-файлы.Это просто дает массив всех значений пикселей. Однако это была не такая функция, а немедленная вставка в main ().
// read the BIN-file as grayscale image
void decodeBIN(const char* filename, short image[], int w, int h){
int i = 0;
unsigned char buffer[16]; // no specific size attributed
FILE *ptr;
ptr = fopen(filename, "rb");
if (!ptr){
printf("\nUnable to open file!\n"); // error
}
while (!feof(ptr)){
fread(buffer,2,1,ptr); // read w bytes to buffer
image[i] = buffer[1];
//printf("%u ", image[i]); // DEBUG
i++;
}
fclose(ptr);
printf("\nBinary image read (npixels: %i).\n", i-1); // DEBUG
}
Я решил расширить код, поэтому переписал его в предыдущую функцию.и поместил его в отдельный файл для функций, а также сделал заголовочный файл.Дополнительный файл для функций и заголовочный файл работают на 100%, так что это не проблема.Теперь этот код больше не работает, и я получаю ошибку разрушения стека.Некоторые переменные, вызванные после этой функции, также перешли на другое значение, поэтому я решил, что проблема связана с буфером (я не знал о правильном размере буфера, но он работал ...).После некоторых экспериментов и испытаний я придумал следующую функцию.Я заменил буфер на массив символов с именем image2, чтобы просто попробовать и протестировать его:
void decodeBIN(const char* filename, short image[], int w, int h){
int i = 0, res;
char image2[];
FILE *ptr;
ptr = fopen(filename, "rb"); //"MySnap_20180327-2239-010.bin"
if (!ptr){
printf("\nUnable to open file!\n"); // error
}
res = fread(image2,1,w*h,ptr) // need to read w*h pixels
while (i < w*h){ // DEBUG
printf("%i ", (int)image2[i]); // DEBUG
i++;
}
printf("\nRead %u bytes\n", res); // DEBUG
fclose(ptr);
printf("Binary image read (npixels: %i).\n", i); // DEBUG
}
Я немного растерялся, как он работал, и внезапно, когда я перемещаю код из main() для функции, которая перестает работать, поэтому любая помощь приветствуется!
Заранее спасибо.
Отказ от ответственности: Я намерен написать это с помощью как можно меньшего количества библиотек
===== ОБНОВЛЕНИЕ:
После ответа @alainmerigot я получил этот код, который помог получить правильные значения:
void decodeBIN(const char* filename, unsigned char image[], int w, int h){
int i = 0, res;
FILE *ptr;
res = fread(image,sizeof(char),w*h,ptr) // need to read w*h pixels
fclose(ptr);
}
Ошибка сегментации иПерескоченные переменные все еще на месте, так что здесь более подробный обзор того, что я делаю:
char filenamePathed["[path of file]/file.bin"];
short img1[npixels]; // npixels = w*h
printf("i_file: %i\n", i_file); // correct value
decodeBIN(filenamePathed, img_curr, w, h); // decode bin
printf("i_file: %i\n", i_file); // value jumped
while (i < npixels){
img1[i] = (short)img_curr[i];
i++;
}
Возможно, это хорошо, что я делаю это итеративно для нескольких файлов (времясерии)?Мне также нужно, чтобы он получился в (коротком) формате (или целочисленном), но в конечном итоге он должен быть эффективным с точки зрения памяти, а пиксели имеют диапазон 0-255, так что int немного обилие imo).