2011-05-13 75 views
0

所以我試圖創建一個像發電機:multidimentional char數組 - 如何填充隨機字符?

#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[] = 
     "" 
     "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; 
} 

但它無法編譯。我究竟做錯了什麼?

+1

請給我們編譯器錯誤。 – 2011-05-13 05:59:01

+2

這是一個相當大的數組,你到了那裏。 – Mat 2011-05-13 06:03:34

+0

也許我們的[關於數組的FAQ](http://stackoverflow.com/questions/4810664)會爲你清除一些東西? – fredoverflow 2011-05-13 08:27:26

回答

1
char* data; 
// .... 
data = new char[10000][10000][10000]; 

是錯的。首先,三維字符數組是char***。接下來,您需要分三步初始化該內存。

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*/; 
    } 
    } 
} 
+0

你的代碼不會像它應該那樣工作。你創建新的'數據'指針10000次並每次重新分配它。你也沒有正確填寫'* data'和'** data',你失去了'i'和'j'。請修復你的代碼。 – DReJ 2011-05-13 06:22:52

+0

@DReJ:哦,我的上帝,現在很尷尬,一定是缺乏睡眠。感謝您指出錯誤。 > _>「 – Xeo 2011-05-13 06:25:45

+0

多維數組和嵌套指針並非完全相同,詳情請參閱我們的[數組FAQ](http://stackoverflow.com/questions/4810664) – fredoverflow 2011-05-13 08:31:15

2

你不能像你那樣分配新的數組。您應該聲明適當大小的一維數組或創建指向數組指針的數組。

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初始化隨機發生器。

+0

是的,我們可以:'char(*數據)[1000] [1000] =新字符[1000] [1000] [1000];' – fredoverflow 2011-05-13 08:29:21

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

應該是

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

,因爲它是一個3維陣列

1

由於new char[10000][10000][10000]具有類型char (*)[10000][10000],不char*,的data類型。我想你想要的是

void genRandomFilledChar(char *s, int i, int j, int k) { 
    const char alphanum[] = 
     "" 
     "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; 
} 
+0

如果你解釋了'-1',那將會很好;) – fredoverflow 2011-05-13 08:28:36

1

C多維數組只是一種自動計算索引的方法。 爲什麼不聲明char數據[i * j * k](或者從堆中獲取新數據),然後將其填充爲單維?您可以稍後使用[] [] []索引與數據。