Я внес ряд изменений в код, чтобы он теперь компилировался без ошибок, и протестировал его на паре файлов PNG, которые дали тот же результат, что и исходный скомпилированный код, загруженный с GitHub. Я внес три следующих изменения:
1 - В processPNG строки:
int crcLen = LEN_CKTYPE + length;
unsigned char crcInput[crcLen];
, которые выдавали ошибку, были заменены на:
char* crcResult;
int crcLen = LEN_CKTYPE + length;
unsigned char* crcInput = malloc(crcLen * sizeof(char));
if (crcInput == NULL) {
crcResult = "Failed to allocate memory for crcInput";
} else {
....
}
free(crcInput);
в соответствии с рекомендациями Ol Sten. Исходный код, следующий за объявлением crcInput, помещается в блок else с последующим освобождением памяти. Однако я не знаю, что произойдет, если вы вызовете free () после сбоя mallo c (), может ли кто-нибудь мне посоветовать по этому поводу?
Также может быть более эффективным вызов mallo c ( ) на первой итерации while l oop, затем вызовите reallo c () и переместите free () за пределы while l oop прямо в конце функции, но это потребует еще нескольких строк кода.
2 - Visual Studio также жаловалась на использование функции fopen, поэтому в readPNG я заменил эти строки:
FILE* file = fopen(path, "rb");
if (file == NULL) { printf("error: could not open file. (%s)", path); return; }
на эти:
#include <errno.h>
....
FILE* file;
errno_t err;
if ((err = fopen_s(&file, path, "rb")) != 0) {
printf("error: could not open file. (%s)", path); return;
}
3 - Также в helperFuncts.h, в l oop в функции long getNum (unsigned char * a, int start, int size) это вызывает предупреждение из-за разных типов, т.е. i беззнаковый long, но start - int:
for (unsigned long i = start; i < start + size; i++) {
....
}
Это было легко исправить, сделав start длинным без знака. После внесения этих изменений во время компиляции или выполнения не возникало ошибок.
Таким образом, похоже, что компилятор C, используемый Visual Studio 2019, более строгий, чем другие C компиляторы и, возможно, более ранние версии Visual Studio и, похоже, включает в себя некоторые части компилятора C ++. Однако это не компилятор C ++, поскольку попытки добавить c код C ++, например классы, вызывают ошибки. Есть комментарии по этому поводу?