问题标签 [unions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
3958 浏览

c++ - 由 float 组成的联合:完全疯狂的输出

该程序输出为:

谁能解释为什么会这样?为什么浮动的价值Values.value增加了​​?或者我在这里错过了什么?

0 投票
2 回答
1029 浏览

linq-to-sql - 具有常量值和投影的联合(或 Concat 等)

我发现 Linq-to-sql 有一个非常讨厌的问题,我不确定最好的解决方案是什么。

如果采用简单的 L2S Union 语句,一侧包含 L2S 代码,另一侧包含常量,则常量不会包含在 SQL Union 中,只会投影到 SQL 之后的输出中,从而导致 SQL 错误不为联合计算的列数。

举个例子:

这将生成错误“使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须在其目标列表中具有相同数量的表达式。

这特别阴险(而且令人抓狂),因为列表中显然存在相同数量的表达式,但是当您查看 SQL 时,您会注意到它并没有为 Union 的后半部分生成“First”列. 这是因为“First”在查询之后被插入到投影中。

好的,简单的解决方案是将每个部分转换为 Enumerables 或 Lists 或其他东西,然后在内存中而不是 SQL 中进行联合,如果您正在处理少量数据,那很好。但是,如果您正在处理大量数据,然后您计划在返回之前进一步过滤(在 sql 中),这并不理想。

我想我正在寻找一种强制 L2S 将列包含在 SQL 中的方法。那可能吗?

更新:

虽然不是完全重复,但此错误类似于This Question并具有类似的解决方案。所以我要结束了,但不会删除这个问题,因为它可能会帮助其他人以不同的方式找到可能的解决方案。

不幸的是,L2S 有时太聪明了。

0 投票
10 回答
3487 浏览

c - ANSI C 联合——它们真的有用吗?

从昨天对某个问题的回答中,我了解到写入一个联合成员并从另一个不同类型的成员读取值是不可移植且不安全的,假设成员的基本对齐。因此,经过一番研究,我发现了一个重复这一说法并指定了一个流行示例的书面来源 - 使用 int 和 float 的联合来查找 float 的二进制表示。

所以,理解这个假设是不安全的,我想知道 - 除了节省内存(呃......)工会有什么真正的用途?

注意:也就是说,在标准 C 下。显然,对于特定的实现,规则是预先知道的并且可以利用。

编辑:由于近年来的联想,“不安全”这个词可能是一个不好的措辞选择,但我认为意图很明确。

编辑2:由于这一点在答案中重复 -节省内存是一个有效的论点。我想知道除此之外是否还有什么。

0 投票
5 回答
4372 浏览

c++ - C++:联合与位运算符

我有两个char,我想将它们按位“缝合”在一起。
例如:

所以,我首先尝试的是按位运算符:

但这不起作用:我得到一个short等于c2... (1) 为什么?
(但是:c1并且c2在我的真实应用程序中是负数......也许这是问题的一部分?)

所以,我的第二个解决方案是使用union

这就像我想要的那样工作......我认为

(2) 最好/最快的方法是什么?

谢谢!

0 投票
2 回答
340 浏览

c++ - 模板化 << 朋友在与其他模板化联合类型有相互关系时不工作

在处理我的基本向量库时,我一直在尝试使用一种很好的语法来进行基于 swizzle 的打印。尝试打印与所讨论的向量不同维度的调酒时会出现问题。在 GCC 4.0 中,我最初为每个向量中的每个维度使用了朋友 << 重载函数(带有一个主体,即使它重复了代码),这导致代码工作,即使实际上从未调用过非本机维度代码. 这在 GCC 4.2 中失败了。我最近意识到(愚蠢的我)只需要函数声明,而不是代码主体,所以我这样做了。现在我在 GCC 4.0 和 4.2 上都得到了同样的警告:

加上其他函数声明的五个相同警告。

下面的示例代码准确地展示了正在发生的事情,并包含重现问题所需的所有代码。

该代码工作并产生正确的输出,但我更喜欢尽可能无警告代码。我遵循了编译器给我的建议(在此处总结并由论坛和 StackOverflow 描述为该警告的答案),并添加了两件本应告诉编译器发生了什么的事情。也就是说,我在模板联合的预定义之后将函数定义添加为非朋友:

并且,对于导致问题的每个友元函数,我<>在函数名称后添加了一个,例如 VECTOR2 的情况:

但是,这样做会导致错误,例如:

LINE 139: error: no match for 'operator<<' in 'std::cout << my2dVector.VECTOR2<float>::xxx'

这是怎么回事?是与这些模板化的类联合类结构如何相互关联有关,还是由于联合本身?

更新

在重新思考所涉及的问题,并听取了 Potatoswatter 的各种建议后,我找到了最终的解决方案。与互联网上几乎每个 cout 重载示例不同,我不需要访问私有成员信息,但可以使用公共接口来做我想做的事。因此,我为调用真正的友元重载函数的调酒部分创建了一个非友元重载函数。这绕过了编译器对模板化友元函数的问题。我已添加到我的项目的最新版本。它现在适用于我尝试过的两个 GCC 版本,没有任何警告。有问题的代码如下所示:

0 投票
1 回答
176 浏览

c - c 和缓冲区中的多态性

我有这个工会:

message_with_parameters将 amessage_base作为第一个字段,reply_message将 amessage_with_parameters作为第一个字段,然后将 a 作为message_base第一个字段。
所以基本上我可以访问它们中的任何一个,我仍然会得到我需要的所有数据,但是我从我的驱动程序获得一个缓冲区,现在我想将它序列化到消息中。
我已经知道指向缓冲区的指针是错误的,因为它与我的结构无关,但我不能拥有固定大小的缓冲区。
在某个地方我想这样做:

而且无论我有什么样的数据类型,它仍然会序列化。
如何做呢?

编辑:
这是我的结构:

0 投票
6 回答
34846 浏览

c - 有没有办法通过联合访问单个位?

我正在编写一个 C 程序。我想要一个可以作为 char 访问的变量,但我也可以访问其中的特定位。我在想我可以使用这样的工会......

但编译器不喜欢这样。显然你不能在结构中使用位。那么我能做些什么呢?

0 投票
2 回答
1081 浏览

c++ - 关于联合和堆分配内存的问题

我试图使用联合来更新一个线程中的字段,然后读取另一个线程中的所有字段。在实际系统中,我有互斥锁以确保一切安全。问题在于 fieldB,在我不得不更改它之前 fieldB 被声明为字段 A 和 C。但是,由于第三方驱动程序,fieldB 必须与页面边界对齐。当我将字段 B 更改为使用 valloc 分配时,我遇到了问题。

问题:1)有没有办法静态声明 fieldB 在页​​面边界上对齐。基本上和valloc做同样的事情,但是在堆栈上?

2) 是否可以在字段 B 或堆上分配任何字段时进行联合?不确定这是否合法。

这是我正在试验的一个简单的测试程序。除非您像字段 A 和 C 一样声明字段 B,并在公共方法中进行明显更改,否则这不起作用。

0 投票
4 回答
308 浏览

c - UNION IN C(输出将是什么)

如果我们为 x 分配 512 值并尝试打印 a[0] 和 a[1] 那么输出将是什么,请解释一下如何?

0 投票
4 回答
2830 浏览

c++ - 将具有用户定义构造函数的类填充到联合中

该代码生成此错误:

错误 C2620:联合 'Bar' 的成员 'Bar::foo' 具有用户定义的构造函数或非平凡的默认构造函数

我理解如果构造函数确实做了一些事情,为什么你会抛出那个错误,但是这里的构造函数不带参数也不做任何事情。有什么办法可以把这个类塞进一个工会?我不得不求助于所有的方法,char foo[sizeof(Foo)]并且想要一个更清洁的解决方案。