【问题标题】:multidimentional char array - how to fill it with random chars?多维字符数组 - 如何用随机字符填充它?
【发布时间】:2011-05-13 05:56:45
【问题描述】:

所以我尝试创建一个像这样的生成器:

#include <iostream>
#include <iomanip>  
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
char* data;
void genRandomFilledChar(char *s, int i, int j, int k) { 
    const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    for (int q = 0; q < i; ++q) {
        for (int w = 0; w < j; ++w) {
            for (int e = 0; e < k; ++e) {
                s[e] = alphanum[rand() % (sizeof(alphanum) - 1)];
            }
        } }}

int main()
{
    data =  new char[10000][10000][10000];
    genRandomFilledChar(data, 10000, 10000, 10000);
    cin.get();
    return 0;
}

但是编译失败。我做错了什么?

【问题讨论】:

  • 请给我们编译器错误。
  • 这是一个相当大的数组。
  • 也许我们的FAQ on arrays 会为您解决一些问题?

标签: c++ random char generator


【解决方案1】:

你不能像你一样分配新的数组。您应该声明适当大小的一维数组或创建指向数组指针的指针数组。

char *data = new char [1000*1000*1000]; 

char ***data = new char**[1000];
for (int i=0; i< 1000; i++) {
    data[i] = new char*[1000];
    for (int j=0; j< 1000; j++) {
        data[i][j] = new char[1000];
    }
} 

您在genRandomFilledChar 中也有错误。您每次只用随机值填充前 10000 个字符。

还有,最后一个。对于rand(),您需要使用srand 初始化随机生成器。

【讨论】:

  • 是的,我们可以:char (*data)[1000][1000] = new char[1000][1000][1000];
【解决方案2】:
char* data;
// ....
data =  new char[10000][10000][10000];

错了。首先,一个三维字符数组是char***。接下来,您需要分 3 步初始化该内存。

data = new char**[10000];
for(int i=0; i < 10000; ++i){
  data[i] = new char*[10000];
  for(int j=0; j < 10000; ++j){
    data[i][j] = new char[10000];
    for(int k=0; k < 10000; ++k){
      // and for best performance, initialize directly
      data[i][j][k] = /*HERE*/;
    }
  }
}

【讨论】:

  • 您的代码将无法正常工作。您创建新的data 指针 10000 次并每次重新分配它。此外,您没有正确填写*data**data,您丢失了ij。请修复您的代码。
  • @DReJ:天啊,现在这很尴尬,一定是睡眠不足。感谢您指出错误。 >_>"
  • 多维数组和嵌套指针根本不是一回事,详情请看我们的FAQ on arrays
【解决方案3】:
s[e] = alphanum[rand % (sizeof(alphanum) - 1)];

应该是

s[q][w][e] = alphanum[rand % (sizeof(alphanum) - 1)];

因为它是一个 3 维数组

【讨论】:

    【解决方案4】:

    因为new char[10000][10000][10000] 的类型是char (*)[10000][10000],而不是char*,而是data 的类型。我认为你想要的是

    void genRandomFilledChar(char *s, int i, int j, int k) { 
        const char alphanum[] =
            "0123456789"
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz";
        for (int q = 0; q < i; ++q) {
            for (int w = 0; w < j; ++w) {
                for (int e = 0; e < k; ++e) {
                    s[e + w * k + q * j * k] = alphanum[rand() % (sizeof(alphanum) - 1)];
                }
            }
        }
    }
    
    int main()
    {
        data =  new char[10000 * 10000 * 10000];
        genRandomFilledChar(data, 10000, 10000, 10000);
        cin.get();
        return 0;
    }
    

    【讨论】:

    • 如果你能解释一下-1就好了;)
    【解决方案5】:

    C 多维数组只是一种自动计算索引的方法。 为什么不声明 char data[i*j*k] (或使用 new 从堆中获取)然后将其填充为单维?您可以稍后将 [][][] 索引与数据一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多