C запись uint16 в файл получил ошибку

Моя операционная система - окно, я хочу записать свои данные в ПКМ с 16 битами. Вот мой код:

typedef unsigned short uint16;
void write2PCM(char* file_path, int length, double* data) {
FILE* file=NULL;
file = fopen(file_path, "wb+");
for (int i = 0; i < length; i++) {
    uint16 val=data[i]*10000;
    uint16 fin_val = (val >> 8 & 0x00ff) | (val << 8 & 0xff00);
    fwrite(fin_val,sizeof(fin_val),1,file);
}

fclose;}

и когда я вызываю его, я получаю сообщение об ошибке вместо fwrite: "Произошло нарушение доступа при чтении местоположения 0x....", я вижу, что файл был успешно создан, поэтому я не знаю, почему произошла эта ошибка,

2 ответа

Решение

Разве ты не получаешь никакой диагностики вообще? Каждое предупреждение от компилятора C является значительным, обычно это признаки серьезных ошибок! Кроме того, когда вы спрашиваете о переполнении стека, пожалуйста, скопируйте любую диагностику из дословного компилятора в вопрос.

Проблема здесь:

fwrite(fin_val, sizeof(fin_val), 1, file);

Прототип fwrite является

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

Первый аргумент должен быть указателем на const void, но вы передаете uint16_t, Так должно быть &fin_val, чтобы fwrite получает адрес этой переменной.

На связанной ноте, fclose; это не вызов функции, и это также должно было привести к появлению диагностического сообщения в любом нормальном компиляторе. Так должно быть fclose(file);,

Вот пример вывода из GCC без предупреждений:

% gcc -c pcm.c
pcm.c: In function ‘write2PCM’:
pcm.c:10:12: warning: passing argument 1 of ‘fwrite’ makes pointer from integer without a 
             cast [-Wint-conversion]
     fwrite(fin_val,sizeof(fin_val),1,file);
            ^~~~~~~

и здесь со всеми включенными предупреждениями:

% gcc -c pcm.c -Wall
pcm.c: In function ‘write2PCM’:
pcm.c:10:12: warning: passing argument 1 of ‘fwrite’ makes pointer from integer without a 
             cast [-Wint-conversion]
     fwrite(fin_val,sizeof(fin_val),1,file);
            ^~~~~~~
In file included from pcm.c:1:0:
/usr/include/stdio.h:717:15: note: expected ‘const void * restrict’ but argument is of 
             type ‘uint16 {aka short unsigned int}’
 extern size_t fwrite (const void *__restrict __ptr, size_t __size,
               ^~~~~~
pcm.c:13:1: warning: statement with no effect [-Wunused-value]
 fclose;}
 ^~~~~~

fwrite ожидает указатель на данные, которые вы хотите записать.

Это напишет fin_val в файл в двоичном режиме:

fwrite(&fin_val,sizeof(fin_val),1,file);

Ваш компилятор должен был предупредить вас, что вы указали целочисленное значение вместо указателя. Вы должны увеличить уровень предупреждения вашего компилятора. Если вы используете gcc, добавлять -Wall в командной строке компилятора.

Другие вопросы по тегам