• 2

關於C語言一個陣列的問題

如果宣告一個MAP陣列

另外還有A,B,C,D 4個陣列

有沒有辦法做出能選擇的程式(例如switch)
比方選1能讓MAP=A
選2能讓MAP=B
選3能讓MAP=C
選4能讓MAP=D

有辦法可以做出這種功能嗎?
(ABCD四個陣列大小不一定相同...且四個皆為2維陣列)

有嘗試過int *MAP..讓MAP的OFFSET為ABCD
不過好像不能用在2維陣列...會出錯....
已經想好久了~~有沒有大大可以教學一下
2008-11-01 2:10 發佈
作switch之後,在CASE後面用迴圈一對一寫過去MAP,
一維一層迴圈,二迴就兩層迴圈,記得另外開一個計數用的變數i,
這大概是我能想到最笨的方法....

喔對,你說ABCD的大小都不一樣,那先把每個陣列的大小抓出來個別存在變數裡面,
你要在開一個陣列存其他陣列的大小也可以....
然後在CASE後面迴圈把變數放進去控制他寫到第幾個....

我的思考方式會是 陣列變數 其實只是一個 point address 用來記住列的起始位置, 所以利用 point 及型別轉換的特性就能輕易去選擇. 另外儲存一個 point address 需要的大小為 32bit, 這個部分是要先根據使用的 CPU 記憶體模式和定址能力來確定(這邊我是以 32bit CPU 為依據)

大概的方式如下

unsigned long *MAP = NULL; // 用 unsigned long 型別只是要確保 MAP 有到 32bit 的空間

// 定義陣列
int A[3][2] = {{1,2},{3,4},{5,6}};
int B[5][2];
int C[8][2];
int D[4][2];

// 將 MAP 指向某一個陣列
MAP = (unsigned long *)A;

// 從 MAP 讀出陣列的值, 利用型別強制轉換的方式轉成 int
int Temp;
Temp = (int)MAP[0,0];
Temp = (int)MAP[0,1];

基本上都是使用 ANSI C 的寫法單純利用 point 來達到 MAP 指向不同陣列的目的, 這也是 C 語言中 point
強大的地方, 處理的好甚至 A B C D 陣列都能夠是不同維數不同型別的陣列~~~

這做法是因為小弟經常在寫一些小型嵌入式系統想出來的, 或許不是很好的解法, 但也希望能對妳有所幫助囉 ^^
呆.宇 wrote:
作switch之後,...(恕刪)


這個方法我會思考看看的

alvinhyc wrote:
// 從 MAP 讀出陣列的值, 利用型別強制轉換的方式轉成 int
int Temp;
Temp = (int)MAP[0,0];
Temp = (int)MAP[0,1];


請問轉換完後之後要怎麼呼叫陣列的值

直接用MAP還是...?

PS:[0,0]<=這我看不懂
MAP = (unsigned long *)A;

就是將 MAP 指向陣列 A

// 從 MAP 讀出陣列的值, 利用型別強制轉換的方式轉成 int
int Temp;
Temp = (int)MAP[0,0];
Temp = (int)MAP[0,1];

就是將陣列中的值讀到 Temp 變數中, 因為已經將 MAP 指向 A 了, 所以操作 MAP 就等於操作 A,
這樣的操作方式效率比用迴圈一個一個複製到 MAP 快上 N 倍(point指向只要一個動作)
至於你問到 [0,0] 的意思, 就是指定陣列元素的方法, 看來你跟 C 好像很不熟, 你是學生嗎?
建議把基礎的東西K一K囉
alvinhyc wrote:
MAP = (uns...(恕刪)


我是學生沒有錯
課本幾乎都在講一些程式範例...基礎講的都不多

[0,0]跟[0][0]有什麼不一樣嗎...
sealifes wrote:
我是學生沒有錯課本幾...(恕刪)

寫法不同而已吧...反正都是座標的表示方法,
就是註解的「//」跟「/* */」一樣......
二維陣列在記憶體中其實是一個長度為ROWSIZE*COLSIZE的一維陣列
int* MAP指過去A陣列的頭
A[x][y]就可以用MAP[x*COLSIZE+y]表示囉

#include <stdio.h>

int main()
{
int* MAP;
int A[2][3]={{1,2,3},{4,5,6}};
int B[2][2]={{1,2},{3,4}};
int C[3][2]={{1,2},{3,4},{5,6}};
int choice;
char name;
int ROWSIZE,COLSIZE;

printf("Enter choice (1=>A, 2=>B, 3=>C):");
scanf("%d",&choice);
switch(choice) {
case 1:
MAP = &A[0][0];
name = 'A';
ROWSIZE = 2;
COLSIZE = 3;
break;
case 2:
MAP = &B[0][0];
name = 'B';
ROWSIZE = 2;
COLSIZE = 2;
break;
case 3:
MAP = &C[0][0];
name = 'C';
ROWSIZE = 3;
COLSIZE = 2;
break;
default:
printf("Invalid choice!\n");
return 1;
}

int x,y;
printf("Enter x:");
scanf("%d",&x);
printf("Enter y:");
scanf("%d",&y);
printf("%c[%d][%d] = %d\n",name,x,y,MAP[x*COLSIZE + y]);

return 0;
}
呵呵~
如果你能藉由引導讓他真的聊解指標與陣列的運用相信他得到的會比你給他完整的程式碼來的多來的真實不是嗎?

alvinhyc wrote:
呵呵~如果你能藉由引...(恕刪)


因為大大在樓上已經給他相關指引了,小弟只是依循這樣的觀念再提點樓主一下,並且給他一個可以執行的範例
樓主如果看不懂我們給他的指引而他是一個有心學習C的學生的話,建議他針對二維陣列、一維陣列、指標之間的關係再去好好地研究或請教人
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?