Почему этот код имеет ошибку «EOF in inline file» и что я могу сделать, чтобы это исправить? - PullRequest
1 голос
/ 30 марта 2019

Я получил этот исходный код напрямую от производителя и не могу его скомпилировать.Я всегда получаю EOF при ошибке файла.

Я использую Pelles C для компиляции в Windows 10 X64.Кажется, это должно быть довольно прямым, но я не могу понять это.Это должна быть программа, в которой я предоставляю строку, и она должна вывести crc

int main(){
    str scan = "";
    printf("Enter String");
    fgets(scan, 10, stdin);
    calc_crc_half(scan, 4);
    return(0);
}

INT16U cal_crc_half(INT8U far *pin, INT8U len){
    INT16U crc;
    INT8U da;
    INT8U far *ptr;
    INT8U bCRCHign;
    INT8U bCRCLow;

    INT16U crc_ta[16]={
        0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
        0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
    };
    ptr=pin;
    crc=0;
    while(len--!=0) 
    {
        da=((INT8U)(crc>>8))>>4;
        crc<<=4;
        crc^=crc_ta[da^(*ptr>>4)];
        da=((INT8U)(crc>>8))>>4;
        crc<<=4;
        crc^=crc_ta[da^(*ptr&0x0f)];
        ptr++;
    }
    bCRCLow = crc;
    bCRCHign= (INT8U)(crc>>8);

    if(bCRCLow==0x28||bCRCLow==0x0d||bCRCLow==0x0a){
        bCRCLow++;
    }

    if(bCRCHign==0x28||bCRCHign==0x0d||bCRCHign==0x0a){
        bCRCHign++;
    }
    crc = ((INT16U)bCRCHign)<<8;
    crc += bCRCLow;
    printf(crc);
    return(crc);
}

Я ожидаю, что вывод будет строкой из четырех символов.

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Поскольку вы говорите, что получили этот код "прямо от производителя", вероятно, вам нужны CRC, сгенерированные с использованием этой конкретной реализации для конкретной цели.Этот код будет работать.Если вы не можете заставить его скомпилировать, вы не делаете что-то правильно в Pelles C IDE.Если это так, вы можете попробовать использовать мастер для создания простой программы «Hello World», а когда вы ее скомпилируете и запустите, замените этот код следующим:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

unsigned short cal_crc_half(unsigned char *pin, size_t len){
  unsigned short crc;
  unsigned char da;
  unsigned char *ptr;
  unsigned char bCRCHign;
  unsigned char bCRCLow;

  unsigned short crc_ta[16]={
    0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
    0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
  };
  ptr=pin;
  crc=0;
  while(len--!=0) 
  {
    da=((unsigned char)(crc>>8))>>4;
    crc<<=4;
    crc^=crc_ta[da^(*ptr>>4)];
    da=((unsigned char)(crc>>8))>>4;
    crc<<=4;
    crc^=crc_ta[da^(*ptr&0x0f)];
    ptr++;
  }
  bCRCLow = (unsigned char)crc;
  bCRCHign= (unsigned char)(crc>>8);

  if(bCRCLow==0x28||bCRCLow==0x0d||bCRCLow==0x0a){
    bCRCLow++;
  }

  if(bCRCHign==0x28||bCRCHign==0x0d||bCRCHign==0x0a){
    bCRCHign++;
  }
  crc = ((unsigned short)bCRCHign)<<8;
  crc += bCRCLow;
  return crc;
}

int main(int argc, char* argv[])
{
  char word[256];
  unsigned short crc;
  puts("Type each word and hit 'Enter'. Enter 'quit' to exit.\n");
  while (fgets(word, 256, stdin) != NULL) {
    if (strcmp(word, "quit\n") == 0) break;
    crc = cal_crc_half(word, strcspn(word, "\n"));
    printf("%X\n", crc);
  }
  return 0;
}
0 голосов
/ 30 марта 2019

Коду не хватает подходящего буфера для чтения. Попытка записи в строковый литерал """ является неопределенным поведением (UB). @ Шон

int main() {
  // str scan = ""; 
  char scan[11];
  printf("Enter String");
  fgets(scan, 10, stdin);
  calc_crc_half(scan, 4);

Код будет рассчитывать CRC на основе входных данных, потенциально включая '\n'.


Я ожидаю, что OP нужен внешний интерфейс, больше похожий на

int main(void) {
  char scan[100];  // be more generous in input possibilities.
  printf("Enter String\n");
  if (fgets(scan, sizeof scan, stdin)) {
    scan[strcspn(scan, "\n")] = '\0'; // lop off potential \n
    calc_crc_half(scan, strlen(scan));
  }
...