[問題] 使用副程式呼叫動態陣列做運算

作者: moussorgsky (法國號有氣質)   2015-07-22 23:41:48
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
嚴格講起來有兩個,但我不知道是否解決了一個,另一個也可以使用同樣的概念去解決..
....
有兩組陣列,一個是bool型態,另一個是double型態。
在main()中呼叫兩組動態陣列,它們的初始值已經在副程式中給過了。
我知道如何在main()中改它們的值,但我不知道如何將他們傳到另外的副程式中,在該
副程式中做運算、改變它們的值,再將他們傳回到main()中......
我把問題直接在下面的程式碼中敘述。
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版)
#include <iostream>
using std::cout;
using std::cin;
using std::ios;
using std::cerr;
using std::endl;
#include <stdio.h>
#include <fstream>
using namespace std;
using std::ifstream;
using std::ofstream;
#include <cstdlib>
#include <math.h>
void read_obstacles();
//我在main()中呼叫obst(它是二維動態陣列,在呼叫的副程式中已經給初始值了,假設
//全部都是0),
//我另有一個txt檔,裡面有"座標",我想用read_obstacles()這個副程式來讀這個txt
//檔,只要"座標"符合obst這個陣列的"元素值",它的bool值就改設成1
//我用過void這個宣告,compile會過,但跑到一半就會出現
//想請教這邊應該怎麼改、main()中應該如何呼叫、最下面的副程式該如何寫呢?
ifstream inobst("obst.txt", ios::in);
//這個txt檔的內容如下
2 0
2 1
2 2
2 3
0 0
0 1
0 2
0 3
0 0
1 0
2 0
0 3
1 3
2 3
double ***create_3D_Array(int a, int b, int c);
bool **create_2D_Array_b(int a, int b);
bool **obst;
//########################################################################
int main()
{
int a,b,c;
int i,j,k;
a = 4;
b = 3;
c = 3;
double ***arr = create_3D_Array(a,b,c);
bool **obst = create_2D_Array_b(b,a);
//如果上面的宣告不改,最下面的副程式寫法也不改,且沒有在main中呼叫
//read_obstacles()的話,是不會有任何問題的
//但呼叫read_obstacles()的話,就會出現The variable 'b' is being
//used without being initialized.
//請問上面的宣告、這裡的呼叫、最下面的副程式應該怎麼改
//才能讀進txt檔的資料以改變obst的元素值呢?
cout << "3D:" << endl;
for(i=0; i<=a-1; i++){
arr[i][0][0] = i;
}
//第二個問題其實跟第一個問題很雷同:
//就是我可以在main中去更改arr的元素值,但要如何將它們傳到別的副程
//式中去做運算,再傳回來main中呢?
system("pause");
return 0;
}
double ***create_3D_Array(int a, int b, int c)
//########################################################################
{
double ***A = new double**[a];
for (int i = 0 ; i < a ; i++)
{
A[i] = new double*[b];
for (int j = 0 ; j < b ; j++)
{
A[i][j] = new double[c];
}
}
for (int i = 0 ; i < a ; i++)
for (int j = 0 ; j < b ; j++)
for (int k = 0 ; k < c ; k++)
A[i][j][k] = 0;
return A;
}
bool **create_2D_Array_b(int a, int b)
//#########################################################################
{
bool **B = new bool*[a];
for (int i = 0 ; i < a ; i++)
{
B[i] = new bool [b];
}
for (int i = 0 ; i < a ; i++)
for (int j = 0 ; j < b ; j++)
B[i][j] = 0;
return B;
}
void read_obstacles() {
//##############################################################################
int i, j;
int a, b;
for( j=0; j<b; j++)
{
for( i=0; i<a; i++)
{
obst[j][i] = false; //the value of false is 0
}
}
while ( inobst >> j >> i )
obst[j][i] = true; //the value of true is 1
}
// read_obstacles()
補充說明(Supplement):
作者: flyfoxy (飛狐)   2015-07-23 00:02:00
建議用class內宣告要new的指標我以前用你方法這樣做好像要多取一次位址丟回main
作者: moussorgsky (法國號有氣質)   2015-07-23 00:15:00
我有想過這問題,因為我做運算的副程式會有好幾個,而且傳進副程式的動態陣列不會只有一組,這樣做好像會很複雜......
作者: stupid0319 (徵女友)   2015-07-23 00:17:00
好多***星星**連在一起,眼睛都花了
作者: kaneson (Lance)   2015-07-23 10:43:00
當判斷j<b的時候,b是多少??
作者: iWRZ (NE~_~RO)   2015-07-23 15:24:00
拜託 //****** . //----- . //++++ ////////// 之類的拜託少用 看得人很累/****/ 這種就很好用又簡潔
作者: MOONRAKER (㊣牛鶴鰻毛人)   2015-07-23 15:26:00
好用又簡潔又不是一條橫線//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
作者: iWRZ (NE~_~RO)   2015-07-23 15:31:00
//this is a function used for blablabla. ←這樣就好了

Links booklink

Contact Us: admin [ a t ] ucptt.com