【问题标题】:I am getting this error "conversion to non scalar type requested"我收到此错误“请求转换为非标量类型”
【发布时间】:2014-05-06 13:34:35
【问题描述】:

您好,我正在创建一个这样的示例程序

#include<stdio.h>
int main()
{
    typedef struct {
                int a;
                int b;
            }v;
v m;
int g =54;
m=(v)g;

}

编译时出现conversion to non-scalar type requested 错误。这里有什么问题。

【问题讨论】:

  • 你怎么知道如何投射而不是如何访问成员?
  • 错误信息就在那里。你知道什么是标量类型吗?
  • 不,我不知道什么是标量类型
  • 标量类型是表示单个值的类型,即intdouble,甚至是指针。非标量类型的示例是数组和结构。您的代码试图将标量值转换为非标量类型,这是不允许的,因此会出现错误。

标签: c


【解决方案1】:

vint 的大小不同,编译器没有关于如何从int 转换为v 的规则。

编译器有在标量类型(char、short、int、long、float、double)之间转换的规则。

如果要分配结构体,要么需要相同类型的结构体,要么单独分配字段:

m.a = 54;
m.b = 32;

【讨论】:

  • 所以本质上没有真正的用户定义数据类型。仅对典型数据类型进行分配。
  • @mrigendra:您可以将struct 分配给另一个struct。您只是不能从标量类型转换为非标量类型。您希望编译器如何将g 中的内存分配给struct v
【解决方案2】:

您收到此错误,因为不清楚您是将 54 分配给 m.a 还是 m.b

m.a = g

m.b = g

可能是你想要的。

【讨论】:

  • 我认为 typedef 将创建一个与典型数据类型相同的数据类型。一个典型的数据类型没有任何成员只有一个大小,所以我只是在 m 中分配 54 作为 4 个字节。
  • typedef,在这种情况下,只是一个捷径;使您能够使用类型v 而不是struct v。您正在尝试将 int(可能是 4 个字节)写入 v(可能是 8 个字节,由 2 个整数组成),这就是您的错误的来源。
【解决方案3】:

您使用的(v) 构造是显式转换或“强制转换”。强制转换仅适用于基本类型(此处为错误消息中的“标量类型”),不适用于结构类型。

【讨论】:

    猜你喜欢
    • 2019-01-22
    • 1970-01-01
    • 2015-12-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多