我想將已經充滿字符的二維陣列傳遞給不同的方法來處理它。背景:我正在嘗試實作 GameOfLife。而且我已經成功地實作了帶有亂數量活細胞的游戲板。但現在我想將 board(Array) 傳遞給不同的方法以繼續使用它。怎么做?
//wow das wird hurenshon
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void spielStarten(int x, int amountOfLiving){
char feld[x][x];
for(int i = 0; i < x; i ){
for(int j = 0; j < x; j ){
feld[i][j] = 'o';
}
}
for(int i = 0; i < amountOfLiving; i ){
int a = (rand()%x);
int b = (rand()%x);
feld[a][b] = 'x';
}
printf("Gameboard: \n");
for(int i = 0; i < x; i ){
for(int j = 0; j < x; j ){
printf("%c ", feld[i][j]);
}
printf("\n");
}
spielRun(feld);
}
void spielRun(char feld[][]){
int neighbCount;
char feldNew[][] = feld[][];
for(int i = 0; i < x; i ) {
for(int j = 0; j < x; j ) {
checkForNeighbours(feld[x][y]);
// in progress
}
}
}
int main(int argc, char* argv[]){
srand(time(NULL));
int x = 16;
if(argc < 2 || argc > 3){
printf("2. Argument eine Zahl fuer Feldgroesse eingeben\n");
printf("1. Argument eine Zahl 0-10 fuer ungef?hre prozentuale Belegung mit lebenden
Zellen eingeben \n");
return 0;
}
if(argv[2] != NULL){
x = atoi(argv[2]);
}
int i;
i = atoi(argv[1]);
i = (x^2)*(0,1*i);
spielStarten (x,i);
return 0;
}
在方法“Spiel starten”的最后一行中,我想將陣列提供給下一個方法“spielRun”。
編輯:感謝其他用戶,我發現了這個結構:
void printarray( char (*array)[50], int SIZE )
但這對我不起作用,因為我無法對數字進行硬編碼,因為陣列大小取決于用戶輸入。謝謝!
uj5u.com熱心網友回復:
這里的困難是你的陣列的大小是靜態未知的(曾幾何時,你的代碼甚至不會因為同樣的原因編譯)。
int **再加上 2D 陣列不是 1D 陣列的陣列這一事實(與 malloc a然后 every在其中發生的情況相反int *),因此在將其傳遞給 a 時不指定大小是沒有意義的功能。
當使用陣列的陣列(技術上,指向一堆整數指標的指標)時,像這樣
void f(int **a){
printf("%d %d %d\n", a[0][0], a[1][0], a[0][1]);
}
int main(){
int **t=malloc(10*sizeof(int *));
for(int i=0; i<10; i ) t[i]=malloc(20*sizeof(int));
f(t);
}
該代碼是無用的,它只列印未初始化的值。但關鍵是,f了解它應該列印什么值。指標算術告訴它是什么a[1],然后是什么a[1][0]。
但是如果這個二維陣列不是指向指標的指標,而是真正的陣列,像這樣
void f(int a[][20]){
printf("%d %d %d\n", a[0][0], a[1][0], a[0][1]);
}
int main(){
int t[10][20];
f(t);
}
然后,被呼叫函式必須知道陣列的大小(或至少所有大小,但對于第一個維度)。因為它不是指向指標的指標。這是一個200整數的區域。編譯器需要知道形狀才能推斷出t[5][3]地址 t 處的 5×20 3=103th int。
因此,這大致是評論中給出的鏈接中(更好)解釋的內容:您需要指定大小。就像我在這里做的那樣。
現在,在您的情況下,它更復雜,因為您不知道(靜態)大小。
所以三種方法。您可以切換到指向指標的指標。您可以將陣列轉換為 a char *,然后自己進行索引計算(x*i j)。或者使用足夠現代的 C,您可以只傳遞大小,然后使用它,甚至在引數、宣告中
void f(int x, int a[][x]){
printf("%d %d %d\n", a[0][0], a[1][0], a[0][1]);
}
int main(){
int t[10][20];
f(t);
}
無論如何,從應用的角度來看(或只是為了避免段錯誤),您需要知道大小。所以你必須通過它。那么為什么不將它作為第一個引數傳遞(請注意,您遇到此大小問題的函式 spielRun 確實指的是 a x,它不知道。因此,傳遞大小x無論如何都是您的下一個問題)
因此, spielRun 可能看起來像這樣(不評論它包含的其他錯誤)
void spielRun(int x, char feld[][x]){
int neighbCount;
char feldNew[][] = feld[][]; // Other error
for(int i = 0; i < x; i ) {
for(int j = 0; j < x; j ) {
checkForNeighbours(feld[i][j]); // Corrected one here
// in progress
}
}
}
然后呼叫這個 spielRun 可能是
spielRun(x, feld);
請注意,我在這里只處理大小為 x 的陣列的傳遞。還有很多其他錯誤,而且,無論如何,這顯然不是一個完成的代碼。例如,您既不能宣告雙精度陣列char newFeld[][] = oldFeld[][];,也不能以這種方式影響它。您需要自己顯式復制它,并指定大小(如果您通過它,您可以這樣做)。我也很確定這i = (x^2)*(0,1*i);不會像您期望的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523669.html
標籤:数组C
上一篇:為什么普通的C陣列索引是有符號的,而stl索引是無符號的?
下一篇:如何為IEnumerable賦值
