为什么此代码有 "EOF in inline file" 错误,我该如何解决?
Why does this code have a "EOF in inline file" error and what can I do to fix it?
我直接从制造商那里得到了这个源代码,但我无法编译它。我总是在文件错误中收到 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);
}
我希望输出是一个四字符的字符串。
既然您说您获得了这段代码 "straight from the manufacturer",那么您可能需要使用此特定实现生成的 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;
}
代码缺少适当的读取缓冲区。尝试写入字符串文字 """
是 未定义的行为 (UB)。
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")] = '[=11=]'; // lop off potential \n
calc_crc_half(scan, strlen(scan));
}
我直接从制造商那里得到了这个源代码,但我无法编译它。我总是在文件错误中收到 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);
}
我希望输出是一个四字符的字符串。
既然您说您获得了这段代码 "straight from the manufacturer",那么您可能需要使用此特定实现生成的 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;
}
代码缺少适当的读取缓冲区。尝试写入字符串文字 """
是 未定义的行为 (UB)。
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")] = '[=11=]'; // lop off potential \n
calc_crc_half(scan, strlen(scan));
}