【问题标题】:Why does this code have a "EOF in inline file" error and what can I do to fix it?为什么此代码有“内联文件中的 EOF”错误,我该怎么做才能修复它?
【发布时间】:2019-03-30 02:08:08
【问题描述】:

我直接从制造商那里得到了这个源代码,但我无法编译它。我总是在文件错误中收到 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);
}

我希望输出是一个四字符的字符串。

【问题讨论】:

  • 此代码不会打开或读取文件。您需要发布产生错误的代码。
  • 这是我从制造商那里得到的代码,我只是对其进行了格式化,以便于阅读。当我尝试使用“pomake.exe makefile”编译它时出现错误。
  • 原谅我,但你知道这不是一个可执行程序吗?这是一个函数的代码。你确实有一个带有main 函数的可执行程序,对吧?
  • 我添加了一个 main() 函数。我会更新原帖。
  • 这个str类型是什么?它如何与fgets() 一起使用,它需要一个至少包含 10 个元素的 char 数组?

标签: c compilation eof crc pelles-c


【解决方案1】:

既然您说您“直接从制造商处”获得此代码,那么您可能需要使用此特定实现生成的 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;
}

【讨论】:

  • da=((unsigned char)(crc&gt;&gt;8))&gt;&gt;4; crc&lt;&lt;=4;da = (crc &gt;&gt; 8) &amp; 0xF0; 有什么特别的原因吗?哦,我知道这就是 OP 正在做的事情。
  • 建议cal_crc_half(unsigned char *pin, size_t len) --> cal_crc_half(const unsigned char *pin, size_t len)
  • @chux:我对 OP 的 CRC 实现所做的唯一更改是一些类型转换,以消除编译器警告,并消除标头定义的类型以支持本机类型。不过,很好地从输入中剥离换行符。不敢相信我忘了这样做。
  • @MarkBenningfield 感谢您的回复。您的代码完美运行。我现在可以为我的太阳能充电控制器的串行命令计算 CRC。万一其他人需要它,这是 MPP Solar LV2424 的 CRC 源代码。
  • @MarkBenningfield 是否可以将其转换为 python 代码?我一直在学习编码,但是我习惯了像 Javascript 和 Python 这样的脚本语言,我只是不知道我是否可以在 python 中实现它。
【解决方案2】:

代码缺少适当的读取缓冲区。尝试写入字符串文字 """未定义的行为 (UB)。 @Shawn

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

代码将根据可能包括'\n' 的输入来计算CRC。


我希望 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));
  }

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多