在 C 语言里面,不规则的二维数组有什么比较方便高校的复制方法吗?

2020-04-16 10:56:59 +08:00
 Kellerman

就像标题说的,我现在需要将数组从一个不规则的二维数组中复制到另外一个二维数组中,这两个二维数组都是不规则的,而且结构是不一样的,只是所能容纳元素的总长度相等,这种问题,有什么高效的方法吗?谢谢大家了!

3076 次点击
所在节点    程序员
32 条回复
InkStone
2020-04-16 15:25:46 +08:00
@pkookp8 如果放在一段连续的内存里,直接 memcpy 整个长度就好了。

我觉得你这个需求多半是可以塞进连续内存里的。要解析的时候写个 struct reinterpret_cast 一下就好了。
crz
2020-04-16 15:45:19 +08:00
@zhyl 看起来说的是类似 {char, int} => {int, chart} 这样的映射,所以不能直接用 memcpy
augustheart
2020-04-16 15:51:13 +08:00
但是如果是不同的结构,不考虑两个结构体是否用可以用来取巧的区别,for 是你唯一可靠的选择。
而且就算开 for 遍历也并不慢。(当然,你也可以考虑用 duff's device 减少循环的消耗)
augustheart
2020-04-16 15:53:20 +08:00
@augustheart 当然,我并没有考虑能不能写个合用的 duff's device,所以就是个瞎说。
但是无论如何,每一个元素都必须处理到
name1991
2020-04-16 16:23:32 +08:00
如果段与段之间不连续的话是有点难办的
zjsxwc
2020-04-16 16:47:52 +08:00
C 没有 Rust 的 Match 语法

楼主的需求只能用 yacc 写个转换代码生产机,自动生成 C 代码
name1991
2020-04-16 17:05:13 +08:00
@zjsxwc 写下思路?
ExplorerLog
2020-04-16 17:25:37 +08:00
sizeof 第一段 和 memcpy 第一段,指针加第一段 size
sizeof 第二段 和 memcpy 第二段,指针加第二段 size
...

循环操作

写个函数
zjsxwc
2020-04-16 18:44:11 +08:00
@name1991 #27 原文:“@zjsxwc 写下思路?”
回复:

就是设计一个你 n 段内存数据到 m 段内存数据对应规则的描述语法 X,然后 yacc 设计一个简单的编译器把用语法 X 写的对应规则编译成相应的 C 语言源代码。


这个 X 语法很简单,比如
(n1, len1),(n2, len2),(n3, len3) -> (m1, len4),(m2, len5)

其中 len1+len2+len3==len4+len5

表示把 n 段内存中 3 段数据复制到 m 段内存中的 2 段。
zjsxwc
2020-04-16 18:54:49 +08:00
编译出来的 c 代码就是一堆 memcpy 调用以及维护每个 memcpy 三个参数的代码,挺无脑的。

当然也可以不用 yacc 直接解析也行。
nightwitch
2020-04-16 18:57:46 +08:00
pod 类型直接 for 循环拷贝就行了,不会比你换着花样 memcpy 慢很多的
Huelse
2020-04-16 19:02:58 +08:00
既然用了 c 语言,就告别了优雅的写法,自己动手操作指针、内存等,楼上都说了很多了

当然用 c++直接 template 好了,实在不行还可以用 gsl

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX