線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:906
推到 Plurk!
推到 Facebook!

函數的呼叫

尚未結案
sunnysophia
一般會員


發表:8
回覆:4
積分:2
註冊:2004-11-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-18 19:06:45 IP:211.74.xxx.xxx 未訂閱
請問 若我寫了一個函數為 void data(double **x) 其中x[50][4] 在main裡 要呼叫此函數 寫成 data(&xj[0][0]); main中的xj陣列就是x陣列 data(&xj[0][0]); 這樣的寫法為什麼不對勒? 編譯時顯示: cannot convert parameter 1 from 'double *' to 'double ** ' 不是非常清楚它的意思 能幫忙解釋一下嗎? 謝謝
kuoyung
一般會員


發表:3
回覆:5
積分:1
註冊:2004-11-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-18 21:15:04 IP:203.64.xxx.xxx 未訂閱
這是因為在寫程式時要注意到,函數的設定若為double那麼在main中引用其函數時,也必需為double型態,依你所列的error來看是型態的問題,以下是小弟自己寫的一個程式給你參考看看,希望對你有用,也希望各位大大可以給我指導 #include  double multivar(int a,double b,float c,long d) { double y; y=a*b c*d; return y; } void main() { y=multivar(3,0.2,4.0,50);//對應函數的型態設定 printf("multivar=%f",y); }
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-18 21:50:49 IP:203.204.xxx.xxx 未訂閱
sunnysophia你好~ 此錯誤為你企圖要指定一'double *'型態的記憶體位址 傳給副函式的double**  型態變數~故會出錯~~簡略依你的內容寫一下小程式相信你看後即可明瞭~~   
#pragma hdrstop
#include "stdio.h"
//---------------------------------------------------------------------------
#pragma argsused
#include 
#include 
#include     void data(double** x)
{
       double result= _msize(x) / sizeof(double);
       cout<data(x);
        // 釋放記憶體
        for (int i = 0; i < m; i  )
        {
                free(x[i]);
        }
        free(x);
        return 0;
}     
發表人 - rogan321 於 2004/12/18 21:51:59
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-18 22:07:36 IP:61.64.xxx.xxx 未訂閱
引言: 請問 若我寫了一個函數為 void data(double **x) 其中x[50][4] 在main裡 要呼叫此函數 寫成 data(&xj[0][0]); main中的xj陣列就是x陣列 data(&xj[0][0]); 這樣的寫法為什麼不對勒? 編譯時顯示: cannot convert parameter 1 from 'double *' to 'double ** ' 不是非常清楚它的意思 能幫忙解釋一下嗎? 謝謝
double** 是指向一個double指標的指標, 而double* 為指向double的指標, 兩者型態不同, 故compiler會秀出錯誤訊息. x[50][4]為一個連續的記憶體區塊, 共分為50個小區塊, 每個小區塊包含4個int. &x[0][0] 是取得第一個小區塊的第一個元素的指標, 所以型態為double*. 所以要修正這種錯誤你就要取得一個指向double指標的指標, double* pDouble = &xj[0][0]; // 取得指向第一個小區塊第一個元素的指標 data(&pDouble); // 取得指向第一個小區塊第一個元素的指標的指標
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-19 01:55:35 IP:211.76.xxx.xxx 未訂閱
引言: double* pDouble = &xj[0][0]; // 取得指向第一個小區塊第一個元素的指標 data(&pDouble); // 取得指向第一個小區塊第一個元素的指標的指標
data(&pDouble); 上面是傳入local variable pDouble的位置,並不是xj陣列所在。形態正確但是會產生錯誤。 應該用 double** pDouble = (double**)xj; data(pDouble); 發表人 - pwipwi 於 2004/12/19 02:05:26
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-19 11:28:55 IP:61.64.xxx.xxx 未訂閱
引言:
引言: double* pDouble = &xj[0][0]; // 取得指向第一個小區塊第一個元素的指標 data(&pDouble); // 取得指向第一個小區塊第一個元素的指標的指標
data(&pDouble); 上面是傳入local variable pDouble的位置,並不是xj陣列所在。形態正確但是會產生錯誤。 應該用 double** pDouble = (double**)xj; data(pDouble); 發表人 - pwipwi 於 2004/12/19 02:05:26
pwipwi 大大您好, 您說的我昨天就試過囉, 看起來好像對, 結果是錯的. 我昨晚是用VC++試, 一開始也是用您的方法, 結果出來的結果是Access Violation. 下面是我的碼
double TestArray[10][10] = { 1, 2, 3 };
void Test(double** ArrayPointer)
{
        double j = ArrayPointer[0][1];
        printf("%f\n\n", j);
}    int main(int argc, char* argv[])
{
  double* p = &TestArray[0][0];
  double** pDouble = (double**)TestArray;
  Test(&p); // 這樣呼叫會列印出TestArray[0][1]的值
  Test(pDouble); // Access Violation
}
為什麼double** pDouble = (double**)TestArray; 這樣會錯呢?? 看下這張圖(為了方便觀看, 我把double型態改為int) 其實TestArray本身就是指向Array第一個元素的指標, 但若您強迫轉為指標的指標, 結果就如圖所示, 它的指標的指標值為 1, 1為TestArray[0][0]原本的值, 這樣做當然會錯. 您可以試試
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-19 15:43:35 IP:211.76.xxx.xxx 未訂閱
嗯~~看來我對指標的認識還有不足的地方, 謝謝Zard大大的解說囉~!
雲中鵝
一般會員


發表:14
回覆:24
積分:7
註冊:2004-12-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-21 02:19:57 IP:140.125.xxx.xxx 未訂閱
引言: sunnysophia你好~ 此錯誤為你企圖要指定一'double *'型態的記憶體位址 傳給副函式的double** 型態變數~故會出錯~~簡略依你的內容寫一下小程式相信你看後即可明瞭~~
#pragma hdrstop
#include "stdio.h"
//---------------------------------------------------------------------------
#pragma argsused
#include 
#include 
#include     void data(double** x)
{
       double result= _msize(x) / sizeof(double);
       cout<data(x);
        // 釋放記憶體
        for (int i = 0; i < m; i  )
        {
                free(x[i]);
        }
        free(x);
        return 0;
}     
發表人 - rogan321 於 2004/12/18 21:51:59
請問....到底是要如何做到呢?在rogan321的範例中是在開頭已宣告成了 dobule **型態了...但是小弟還是搞不懂要如何傳二維的值進去呢?除了設成 全域變數...及使用動態二維宣告外或是一個一個傳&a[0][]'&a[1][]外...還有其它的方法嗎? 謝謝回答 Try it!
------
Try it!
系統時間:2024-05-18 13:49:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!