многомерный массив символов - как заполнить его случайными символами? - PullRequest
0 голосов
/ 13 мая 2011

Итак, я попытался создать генератор вроде:

#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;
}

Но он не компилируется. Что я делаю не так?

Ответы [ 5 ]

2 голосов
/ 13 мая 2011

Вы не можете выделить новый массив, как вы делаете. Вы должны объявить одномерный массив правильного размера или создать массив указателей на указатель на массив.

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.

1 голос
/ 13 мая 2011

C многомерные массивы - это просто способ автоматического расчета индекса.Почему бы не объявить данные char [i * j * k] (или получить из кучи с новым), а затем заполнить их, как если бы это было одно измерение?Позже вы можете использовать [] [] [] индексы с данными.

1 голос
/ 13 мая 2011

Поскольку 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 голос
/ 13 мая 2011
s[e] = alphanum[rand % (sizeof(alphanum) - 1)];

должно быть

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

, потому что это трехмерный массив

1 голос
/ 13 мая 2011
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*/;
    }
  }
}
...