【发布时间】:2019-06-07 07:31:54
【问题描述】:
如何解决这个错误?我想要一个数组,我可以在其中扫描“学生”的数据并因此使用结构。问题是,另一个结构中的位域结构失败了。
有什么方法可以解决这个问题,而不改变代码的大部分结构?只想修复,可以选择位域(日,月等)。
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX 10
#define MAXCHAR 30
char comma;
struct date {
unsigned int day:5;
unsigned int month:4;
unsigned int year:11; //funktioniert bis yr 2047;
};
struct student {
unsigned long matriculation_number;
char first_name[MAXCHAR];
char last_name[MAXCHAR];
struct date birthdate;
}Student[MAX];
/*
void scan_student(void) {
b
} */
int main(void) {
int i = 0;
printf("------------------------------\nGeben Sie alle benötigten Daten ein\n");
printf("Vorname: ");
fgets(Student[i].first_name, MAXCHAR, stdin);
printf("Nachname: ");
fgets(Student[i].last_name, MAXCHAR, stdin);
printf("Matrikelnummer: ");
scanf(" %lu", &Student[i].matriculation_number);
printf("Geburtstdatum (DD.MM.YYYY): ");
scanf(" %u%c%u%c%u", &Student.birthdate.day, &comma, &Student.birthdate.month, &comma, &Student.birthdate.year);
printf("\n");
return EXIT_SUCCESS;
}
错误日志:
student.c: In function ‘main’:
student.c:42:26: error: cannot take address of bit-field ‘day’
scanf(" %u%c%u%c%u", &Student[i].birthdate.day, &comma, &Student[i].birthdate.month, &comma, &Student[i].birthdate.year);
^
student.c:42:61: error: cannot take address of bit-field ‘month’
scanf(" %u%c%u%c%u", &Student[i].birthdate.day, &comma, &Student[i].birthdate.month, &comma, &Student[i].birthdate.year);
^
student.c:42:98: error: cannot take address of bit-field ‘year’
&Student[i].birthdate.day, &comma, &Student[i].birthdate.month, &comma, &Student[i].birthdate.year);
【问题讨论】:
-
为什么使用位域而不仅仅是
ints?除此之外,编译器错误似乎很清楚。对于scanf,您必须传递您指定的类型。你可以做类似int tmp; scanf("%d", &tmp); Student[i].birthdate.day = tmp;的事情。 -
这个任务的想法是使用位域和结构
-
但它必须在没有“tmp”步骤的情况下工作......
-
你不能获取位域的地址;没有指向位域的指针。因此,您不能将指向位域的指针传递给
scanf()以供其使用。您必须输入适当大小的局部变量(short或更大的年份;char或更大的其他字段),将指针传递给scanf(),然后将结果传递给通过赋值的位域。如果中间变量是禁止使用的,则不能在结构中使用位域。我顺便观察到您的结构将占用 32 位;您可以使用 2 个char字段和一个short来代替。 -
这些约束从何而来?它们不是很合理。