【问题标题】:Int-stream in CC中的内部流
【发布时间】:2011-12-11 03:22:14
【问题描述】:

我正在用 C 语言实现一个函数,我将一个 byte[] 转换为一个 int[]。问题是 int[] 的长度取决于 byte[] 的内容(不仅仅是 byte[] 的长度),所以在我迭代之前我不会知道 int[] 的总长度整个字节[]。因此,我正在寻找某种形式的 av int-stream 或动态增加的 int-list,我可以将其写入,然后在完成所有 int 的写入后转换为 int[]。目前我的 C 经验有点有限,所以我不太确定解决这类问题的最佳实践是什么。有什么建议吗?

【问题讨论】:

  • 使用 C,您可以表达这些结构,但您认为最合适。这是优点还是缺点取决于您的观点。
  • 你知道byte[]在到达终点之前的大小吗?
  • @stevehb - 不,在评估byte[] 之前,他不知道int[] 的大小。
  • 单次通过的解决方案将需要 realloc,随着阵列的增长,这更有可能失败。当然,除非你正在做一些严肃的处理,否则它不太可能......

标签: c arrays stream byte int


【解决方案1】:

我能想到几种方法。

根据您的问题,我假设将您的 char[] 转换为相应的 int[]s 是昂贵的(这就是为什么您要避免执行该计算两次 - 一次以确定大小,并且再次填充内容。

所以,我会这样做:

首先,您可以将转换关联到最大大小吗? EX:最大尺寸差异是 2 比 1 吗? (对于 char[] 中的每个字符,它可以创建“最多 X”个整数吗?)

如果是这种情况,并且内存使用不是问题(您没有受到超级限制) - 继续分配最大大小,在执行翻译时填充它,并在完成时重新分配缩小你的内存占用。

如果不是这种情况,那么您的处境将更加艰难,应该考虑非连续方案 - 例如链表。完成翻译并构建链表后,您就可以为数组分配空间,并访问链表中的每个元素以填充数组。

【讨论】:

    【解决方案2】:

    首先,如果您可以使用 C++,那么您可以只使用 vector,它是一个动态大小的数组。否则,您必须首先遍历字节数组以确定 int 数组的大小,然后动态分配 int 数组。其次,C没有byte类型,所以通常使用的类型是char

    #include <stdlib.h>
    char byte_array[ size ];
    int i, int_size = 0;
    int *int_array;
    
    for ( i = 0; i < size; i++ ) {
      int_size += f( byte_array[i] );
    }
    int_array = (int*) malloc( int_size );
    

    f() 是您编写的某个函数,它查看字节数组的一个元素以帮助确定 int 数组的大小。

    【讨论】:

    • 像 wallyk 的解决方案一样,这也受到 OP 似乎试图避免的双重分析问题的影响。
    • @Steve - 我在问题中没有看到他们试图避免双重分析,只是他们根本不知道如何做到这一点。
    【解决方案3】:

    首先,检查 byte[] 以确定生成的 int[] 大小。然后使用malloc() 分配适当大小的 int[] 结构。

    #include <stdlib.h>
    
    ...
        // imagine that the resulting int[] size depends on the sum of the bytes
    
        int j, size = 0;
        for (j = 0;  byte[j];  ++j)
             size += byte[j];
    
         int *int_array = (int *) malloc (size);
         for (j = 0;  j < size;  ++j)
              int_array [j] = whatever;
    

    【讨论】:

    • 我对他的问题的理解是,他特别希望避免您建议的这种双重分析。
    • @Steve:虽然单次通过可能看起来更干净,但描述“感觉”像两次通过解决方案是肯定的。
    • 您假设从 byte[] 中的元素到它们对应的 int[] 元素的转换是“便宜的”。也许每个都涉及将 Pi 计算到小数点后一百万位……关键是,如果转换便宜,我认为 OP 不会像他那样问问题。
    • @BrendanLong - 我只做一个假设 - 转换的成本足够高,他不想做两次。而且您没有提到第三个选项 - 像链表这样的非连续存储方案。
    【解决方案4】:

    最简单的方法是将int[] 分配为与byte[] 相同的长度(元素数量),当您完成并知道大小后,调用realloc 将其缩小。

    当然,这假设解释数据永远不会创建更多个整数,而不是流中的字节数。

    【讨论】:

    • 来自问题:“所以在迭代整个 byte[] 之前,我不会知道 int[] 的总长度。”
    • @steve:关键是要选择一个保证比你需要的大的随机大小(这样它就不会溢出),然后在你需要的时候把它缩小到正确的大小完成。
    • @Chris - 同意 - 但这不是海报所说的。他说“要一样长”
    • @Steve:是的,他不知道int[] 的总长度。我的假设是他知道byte[] 的总长度,并且如果byte[] 包含N 个值,那么最终的int[] 不会有超过N 个值。因此,如果他创建了一个 int[N],他是安全的,并且可以在之后调整它的大小。
    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 2020-12-22
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多