注册 登录
编程论坛 C++教室

哪里出错了哦?一段位字段结构体运算的程序

fyz520 发布于 2010-02-25 17:44, 948 次点击
程序如下:

#include<stdio.h>
struct flag{
    unsigned class_x:1;
    unsigned class_y:2;
    unsigned      :0;
    unsigned class_z:1;
}
input(char *str){
int bits;
printf("请输入位字段%s的值:",str);
scanf("%d",&bits);
return bits;
}
void main(){
    struct flag flag1,*pdf=flag1;
    unsigned modword;
    flag1.class_x=input("class_x");
    pdf->class_y=input("class_y");
    pdf->class_z=input("class_z");
    modword=pdf->class_x^pdf->class_z;
    printf("flag1的位字段class_y的结果为:%u\n",pdf->class_y);
    printf("flag1的位字段class_x和class_z异或的结果为:%u\n",modword);
}




错误提示:


1>------ 已启动生成: 项目: lianxi, 配置: Debug Win32 ------
1>正在编译...
1>practice.cpp
1>d:\c++源文件\lianxi\lianxi\practice.cpp(11) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>        c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : 参见“scanf”的声明
1>d:\c++源文件\lianxi\lianxi\practice.cpp(12) : error C2440: “return”: 无法从“int”转换为“flag”
1>        无构造函数可以接受源类型,或构造函数重载决策不明确
1>d:\c++源文件\lianxi\lianxi\practice.cpp(15) : error C2440: “初始化”: 无法从“flag”转换为“flag *”
1>        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
1>d:\c++源文件\lianxi\lianxi\practice.cpp(17) : error C2440: “=”: 无法从“flag”转换为“unsigned int”
1>        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
1>d:\c++源文件\lianxi\lianxi\practice.cpp(18) : error C2440: “=”: 无法从“flag”转换为“unsigned int”
1>        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
1>d:\c++源文件\lianxi\lianxi\practice.cpp(19) : error C2440: “=”: 无法从“flag”转换为“unsigned int”
1>        没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符
1>生成日志保存在“file://d:\C++资料\C++源文件\lianxi\lianxi\Debug\BuildLog.htm”
1>lianxi - 5 个错误,1 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========




3 回复
#2
lackyking2010-02-25 18:14
程序代码:
#include<stdio.h>
using namespace std;

struct flag{
    unsigned class_x:1;
    unsigned class_y:2;
    unsigned      :0;
    unsigned class_z:1;
};

int input(char *str){
int bits;
printf("请输入位字段%s的值:",str);
scanf_s("%d",&bits);
return bits;
}

void main(){
    struct flag flag1;
    struct flag *pdf=&flag1;
    unsigned modword;
    flag1.class_x=input("class_x");
    pdf->class_y=input("class_y");
    pdf->class_z=input("class_z");
    modword=pdf->class_x^pdf->class_z;
    printf("flag1的位字段class_y的结果为:%u\n",pdf->class_y);
    printf("flag1的位字段class_x和class_z异或的结果为:%u\n",modword);
}

刚刚自学C++三天,也不知道改的对不对
scanf在vs2008编译器被认为是不安全的,我换成了scanf_s


[ 本帖最后由 lackyking 于 2010-2-25 18:16 编辑 ]
#3
heartnheart2010-02-25 18:15

#include<stdio.h>
struct flag{
    unsigned class_x:1;
    unsigned class_y:2;
    unsigned      :0;
    unsigned class_z:1;
};//没加分号

int input(char *str){//没写返回类型
int bits;
printf("请输入位字段%s的值:",str);
scanf("%d",&bits);
return bits;
}
void main(){
    struct flag flag1,*pdf=&flag1;//没写&
    unsigned modword;
    flag1.class_x=input("class_x");
    pdf->class_y=input("class_y");
    pdf->class_z=input("class_z");
    modword=pdf->class_x^pdf->class_z;
    printf("flag1的位字段class_y的结果为:%u\n",pdf->class_y);
    printf("flag1的位字段class_x和class_z异或的结果为:%u\n",modword);
}
#4
fyz5202010-02-26 09:56
谢谢!高手一看就知道是哪出错了,佩服,还有个不明白的,input("class_x");这里的实参怎么加引号啊?为什么不是input("flag1.class_x")
1