Проблема с кодом C из файла, загруженного с GitHub, для сканирования файла PNG - PullRequest
0 голосов
/ 01 августа 2020

После перерыва в несколько лет работы с JavaScript, Java и другим программным обеспечением, связанным с Inte rnet, я снова посмотрел на C и C ++. Я загрузил код C с GitHub по ссылке:

https://github.com/rvong/png-debugger

и получил скомпилированный тестовый код PNGDebugger.exe в папке Debug для просканируйте файл изображения example.png в тестовой папке и сгенерируйте выходные данные, как указано в README.md. Я также попробовал PNGDebugger.exe с созданным мной PNG-файлом, и, по-видимому, он снова заработал без каких-либо проблем.

После этого я установил бесплатную версию Visual Studio Community версии 2019 на мою платформу Windows 10, а затем установил C ++ и его различные зависимости. Сделав это, я открыл пустой проект консоли C ++ и скопировал файлы .h и. c с GitHub. Между прочим, чтобы вызвать компилятор C, а не компилятор C ++, вы просто убедитесь, что все файлы с расширением. cpp заменены на. c.

В любом случае Visual Studio отмечает ошибку для строки 117 файла readPNG. c загружено по ссылке:

https://github.com/rvong/png-debugger/blob/master/readPNG.c

Строки 116 и 117:

int crcLen = LEN_CKTYPE + length;
unsigned char crcInput[crcLen];

и при наведении курсора мыши на строку 117 появляется ошибка «Выражение должно иметь постоянное значение». Эта и другие ошибки генерируются строкой 117, когда я пытаюсь собрать приложение. Остальная часть кода выглядит нормально.

LEN_CKTYPE имеет значение 4, как указано в #define в файле constants.h, а длина определяется как long в начале, а l oop рядом начало функции void processPNG (...) в файле readPNG. c.

Как эта проблема исправлена ​​и как получилось, что исходный код успешно скомпилирован? Возможно, использовалась более старая версия Visual Studio, в которой не было проблем.

1 Ответ

0 голосов
/ 03 августа 2020

Я внес ряд изменений в код, чтобы он теперь компилировался без ошибок, и протестировал его на паре файлов 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 ++, например классы, вызывают ошибки. Есть комментарии по этому поводу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...