如何修复C程序中‘expected expression before ‘EvidenceType’’错误
C结构体函数编译错误修复方案
问题重现
我定义了如下结构体:
typedef struct { int id; char room[MAX_STR]; char device[MAX_STR]; float value; int timestamp; } EvidenceType;
并编写了printEvidence()函数来打印结构体内容:
void printEvidence(EvidenceType*){ char* thermal_string; char* sound_string; char* emf_string; int no_of_hours = floor(EvidenceType->timestamp / 3600); int no_of_minutes = floor((EvidenceType->timestamp % 3600) / 60); int no_of_seconds = EvidenceType->timestamp - (no_of_hours * 3600); no_of_seconds = no_of_seconds - (no_of_minutes * 60); printf("%4s |%25s |%10s |%16s |%10s\n", "ID", "Room", "Device", "Value", "Timestamp"); if(strcmp(EvidenceType->device, "EMF") == 0){ if(EvidenceType->value > 4.0){ emf_string = "(HIGH)"; } else{ emf_string = ""; } printf("%-4d |%25s |%10s |%7.1f%10s |%2d:%2d:%2d\n", EvidenceType->id, EvidenceType->room, EvidenceType->device, EvidenceType->value, emf_string, no_of_hours, no_of_minutes, no_of_seconds); } else if(strcmp(EvidenceType->device, "THERMAL") == 0){ if(EvidenceType->value < 0.0){ thermal_string = "(COLD)"; } else{ thermal_string = ""; } printf("%-4d |%25s |%10s |%7.2f%10s |%2d:%2d:%2d\n", EvidenceType->id, EvidenceType->room, EvidenceType->device, EvidenceType->value, thermal_string, no_of_hours, no_of_minutes, no_of_seconds); } else{ if(EvidenceType->value < 35.0){ sound_string = "(WHISPER)"; } else if(EvidenceType->value > 70.0){ sound_string = "(SCREAM)"; } else{ sound_string = ""; } printf("%-4d |%25s |%10s |%7.1f%10s |%2d:%2d:%2d\n", EvidenceType->id, EvidenceType->room, EvidenceType->device, EvidenceType->value, sound_string, no_of_hours, no_of_minutes, no_of_seconds); } }
在main函数中调用方式:
EvidenceType a; printEvidence(&a);
编译时出现错误:
In function ‘printEvidence’:
error: expected expression before ‘EvidenceType’
int no_of_hours = floor(EvidenceType->timestamp / 3600);
错误原因
printEvidence函数的参数只声明了类型EvidenceType*,但没有给参数命名。EvidenceType是结构体的类型名,不是变量名,不能用->操作符直接访问成员。必须给参数指定一个变量名,才能通过这个变量访问结构体成员。
修复后的代码
给函数参数添加变量名(比如ev),并将函数内所有EvidenceType->替换为ev->,同时补充了一些细节优化:
#include <math.h> // 引入floor函数所需头文件 #include <string.h> // 引入strcmp函数所需头文件 void printEvidence(EvidenceType* ev){ // 添加参数名ev char* thermal_string = ""; // 初始化指针,避免未定义行为 char* sound_string = ""; char* emf_string = ""; // 用3600.0/60.0确保浮点运算,避免整数除法截断 int no_of_hours = floor(ev->timestamp / 3600.0); int no_of_minutes = floor((ev->timestamp % 3600) / 60.0); int no_of_seconds = ev->timestamp - (no_of_hours * 3600) - (no_of_minutes * 60); printf("%4s |%25s |%10s |%16s |%10s\n", "ID", "Room", "Device", "Value", "Timestamp"); if(strcmp(ev->device, "EMF") == 0){ if(ev->value > 4.0){ emf_string = "(HIGH)"; } // 用%02d保证时间格式补零,输出更规范 printf("%-4d |%25s |%10s |%7.1f%10s |%02d:%02d:%02d\n", ev->id, ev->room, ev->device, ev->value, emf_string, no_of_hours, no_of_minutes, no_of_seconds); } else if(strcmp(ev->device, "THERMAL") == 0){ if(ev->value < 0.0){ thermal_string = "(COLD)"; } printf("%-4d |%25s |%10s |%7.2f%10s |%02d:%02d:%02d\n", ev->id, ev->room, ev->device, ev->value, thermal_string, no_of_hours, no_of_minutes, no_of_seconds); } else{ if(ev->value < 35.0){ sound_string = "(WHISPER)"; } else if(ev->value > 70.0){ sound_string = "(SCREAM)"; } printf("%-4d |%25s |%10s |%7.1f%10s |%02d:%02d:%02d\n", ev->id, ev->room, ev->device, ev->value, sound_string, no_of_hours, no_of_minutes, no_of_seconds); } }
内容的提问来源于stack exchange,提问作者Girly Girl
相关产品推荐
相关产品推荐

