全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1222
推到 Plurk!
推到 Facebook!

請問 array 的members 如何傳址不傳值?(表達不太好)

尚未結案
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-28 15:24:25 IP:211.74.xxx.xxx 未訂閱
hi~各位大人:             您們好 我有一 class="code"> int main(int argc, char* argv[]) { int M[n*n]={1,3,16,14,13,15,2,4,8,6,11,9,12,10,5,7} ; print_M(M); // orig void flip_v(int M,int out); print_M(M);//那function(在下)是想像某種風吹"M[0]~[15], 使得上面的數值某一行或列交換,但這裡印出來, 其實是和第一個PRINT一樣的,我不知是我語法或那裡有錯,請指教>
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-28 17:14:42 IP:163.28.xxx.xxx 未訂閱
Hello kmp,    請參考底下程式碼: 因為不太曉得你的
*out  =*(M i (n-j-1)*n);
是做什麼的,所以就暫時先隨便假設變換M裡面的值. 不曉得這樣對你是否有幫助?
#include 
#include     #define n 4
void print_M(int *);
void flip_v(int *);
int i,j,v;    #pragma argsused
int main(int argc, char* argv[])
{
   v=10;
   int *M=new int[n*n];
   //給4x4矩陣初值
   for(i=0; i
            //也可以在return 0的地方設定中斷點,這樣就可以看到結果了.
  return 0;
}
//---------------------------------------------------------------------------
void flip_v(int *M)
{
v=50;
for(i=0;i
   cout << endl;
}
發表人 - nlj859 於 2004/09/28 17:39:38
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-28 21:52:46 IP:221.169.xxx.xxx 未訂閱
kmp:將下面紅字改成藍字一下試試。 void flip_v(int *M,int *out) { out=new int[n*n]; int i,j; int r=0; for(j=0;j *out =*(M i (n-j-1)*n); out[r ]=*(M i (n-j-1)*n); } } } 請參考! Andy Chang 發表人 - andychang1690 於 2004/09/28 21:53:59
------
Andy Chang
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-30 11:23:24 IP:140.127.xxx.xxx 未訂閱
hi~nlj859 您好               很高興謝謝您的講解,>< face="Verdana, Arial, Helvetica">引言: Hello kmp, 請參考底下程式碼: 因為不太曉得你的
*out  =*(M i (n-j-1)*n);
是做什麼的,所以就 j= n-j-1 若是j原本控制row的變數, 那表示第一列與最後一列值交換,另外行同理 ex:(有旋轉90,180,270,..這是一例水平鏡射) 1,3,16,14, 13,15,2,4, 8,6,11,9, 12,10,5,7 transform 14,16,3,1 4,2,15,13, 9,11,6,8, 7,5,10,12, 暫時先隨便假設變換M裡面的值. 不曉得這樣對你是否有幫助? excuse,我的表達能力不太好,我原本想說大風吹,雖然您的 副程式有實際指到那值,而且加一常數可證明,但是我是要換位置, 這其實是舉一反三的事,但我還不知是那裡出了問題,可以麻煩請您 看一下我的拙作,謝謝
#include "stdio.h"
void  print_M(int *M);
void flip_v(int *M);
#pragma argsused    int main(int argc, char* argv[])
{      
        int M[n*n]={1,3,16,14,13,15,2,4,8,6,11,9,12,10,5,7} ;            print_M(M); // orig
        void flip_v(int M);
        print_M(M);
        getchar();
}    void flip_v(int *M)
{
int i,j;    for(i=0;i
hi~andychang1690大人您好,    謝謝您的指點,我想您的意思是指標的運算好像這樣寫比較好,是嗎?    
        
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-30 14:25:02 IP:221.169.xxx.xxx 未訂閱
kmp:妳的發問主題是array 的members 如何傳址不傳值 我就是只告訴妳這樣處理可能不會錯。因為每個人有自我 的邏輯跟程式撰寫風格! 按妳的要求修正一下:以下為我測試程式!
.h檔
private:        // User declarations
  void __fastcall flip_v(int *M,int *out);
.cpp檔
#define n 4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Clear(); // 顯示M[]
  Memo2->Clear(); // 顯示out[]
  int M[n*n]={1,3,16,14,13,15,2,4,8,6,11,9,12,10,5,7} ;
  // 先宣告out
  int *out;
  out=new int[n*n];
  // 顯示M[]
  for (int i=0 ; i < n*n; i  )
    Memo1->Lines->Add(IntToStr(M[i]));
  flip_v(M,out);
  // 顯示out[]
  for (int i=0 ; i < n*n; i  )
    Memo2->Lines->Add(IntToStr(out[i]));
}
j= n-j-1 若是j原本控制row的變數,
那表示第一列與最後一列值交換,另外行同理
ex:(有旋轉90,180,270,..這是一例水平鏡射)
1,3,16,14,
13,15,2,4,
8,6,11,9,
12,10,5,7 
transform
14,16,3,1
4,2,15,13,
9,11,6,8,
7,5,10,12,    void __fastcall TForm1::flip_v(int *M,int *out)
{
  int r=0;
  for(int j=0;j < n; j  ) {
    for(int i=0;i < n; i  ) {
      out[r  ]=*(M j*n (n-i-1));
    }
  }
}
請參考!
Andy Chang
------
Andy Chang
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-30 20:37:07 IP:140.127.xxx.xxx 未訂閱
Hello nlj859:               大人您好               我覺很抱歉也很謝謝您o    hi~andychang1690:                   大人您好,很感謝您的指點o                   因為我之前是作較低階的,好像C++最近才開始,BCB是 我第一次用的C++軟體,可能我不夠聰明反應不快,以下還有一點小問題o
引言:
.h檔
private:        // User declarations
  void __fastcall flip_v(int *M,int *out);
我從來沒用過這物件導向的東西,我是後來改成function is ok,
但我使用此有如下error:   請教!
[C   Error] Unit1.h(24): E2040 Declaration terminated incorrectly
[C   Error] Unit1.cpp(31): E2268 Call to undefined function 'flip_v'
[C   Error] Unit1.cpp(40): E2316 '_fastcall TForm1::flip_v(int *,int *)' is not a member of 'TForm1'    .cpp檔
#define n 4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Clear(); // 顯示M[]
  Memo2->Clear(); // 顯示out[]
  int M[n*n]={1,3,16,14,13,15,2,4,8,6,11,9,12,10,5,7} ;
  // 先宣告out
  int *out;
  out=new int[n*n];
  // 顯示M[]
  for (int i=0 ; i < n*n; i  )
    Memo1->Lines->Add(IntToStr(M[i]));
  flip_v(M,out);
  // 顯示out[] /*因為我call兩不同function,用同樣的function
            print,我在想,是這樣的關西嗎?
        int M[n*n]={1,3,16,14,13,15,2,4,8,6,11,9,12,10,5,7} ;            print_M(M); // orig
        void flip_v(int M);
        print_M(M); */            //我剛翻一下,我現有的書,可是我找不到,我有查help,IntToStr
();              //請問如果不知有什元件可用,如此,要如何增加這方面?
  for (int i=0 ; i < n*n; i  )
    Memo2->Lines->Add(IntToStr(out[i]));
}
Andy Chang
Best Regard kmp 發表人 - kmp 於 2004/09/30 20:42:48
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-30 21:01:55 IP:221.169.xxx.xxx 未訂閱
kmp:請先去 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57088 收範例! Andy Chang
------
Andy Chang
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-30 21:23:08 IP:221.169.xxx.xxx 未訂閱
kmp:有時看妳的程式,我有點懷疑妳是不是使用BCB!?
<>//我剛翻一下,我現有的書,可是我找不到,我有查>>>索引->>    
        
------
Andy Chang
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-04 23:12:30 IP:140.127.xxx.xxx 未訂閱
hi~andychang1690: 前輩您好, 回訊晚了請見諒(身體有點不舒服),非常感謝您的講解教導o 因為我第二工作才是我第一次coding,是寫driver,as a firmware engineer, 我們都是在Ultra Edit 寫程式,下一些指令到Linux server 去compiler, 之後我去考研究所,沒考上再去一家也是firmware,所以我都會跟硬體有些關 西,因為我是電子系畢業的,我第一次用這種套裝環境,像BCB,在今暑假o 我的精神是不管語法對不對,就是要能動,可是通常像以前那樣,是要花很大的 effort,可是得到的卻是不進反而退般,因為我覺要對ANSI C/C 有好的基楚, 我沒有,所以雖然您說"我看起來沒寫過BCB",好像是知人知明,可是不只是這樣 ,是連ANSI C/C 這底子都很弱, 您可能沒發現... > 我很懷念研發工作是"看不完的 > 還有, 我>>
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-05 01:24:58 IP:221.169.xxx.xxx 未訂閱
其實。妳的問題應該是 在 main() 這個函數中的 int M[n*n]={1,3,16,14,13,15,2,4,8,6,11,9,12,10,5,7} ; 這個陣列。 要在 void flip_v(...) 這個函數中去修改它的內容吧。    如果是這樣的話。 急的方法: 把 int M[n*n]={1,3,16,14,13,15,2,4,8,6,11,9,12,10,5,7} ; 變成公用變數 就是提到 main() 的上面去。這樣就不用傳了。^_^    慢的方法: 寫個範例妳測看看。 //test.cpp #include  void myf(int *pM) { *pM = 100; *(pM 1)=101; } int main(void) { int *pM; <-------------這個 int M[5]={1,2,3,4,5}; pM = M; <-------------這個 myf(pM); <-------------還有這個 for (int i =0; i < 5; i ) printf("%d,", M[i]); return 0; } 希望這樣妳可以比較清楚怎麼把這個址傳過去。^_^
kmp
一般會員


發表:17
回覆:51
積分:13
註冊:2004-07-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-05 20:12:14 IP:140.127.xxx.xxx 未訂閱
hi~暗黑破壞神:               您好,謝謝,sorry,               因為我蒙蔽眼睛,我到現在才看到您回我這問題,               ㄣ,我有去看我原始的問題,     我想請問是不是還有其他方法可以做到, 以您的範例來改:
 
#include 
void myf(int *pM)
{
*pM = 100;
*(pM 1)=101;
}
int main(void)
{
int M[5]={1,2,3,4,5};
myf(&M);   我這有一疑問,當初我的程式就是因為我呼叫副程式的
時候就是使用array,而array傳的是第一個的"起始位置",所以我不需加一個
Address Operator, & , Therefore, on the other hand, I have a 
question, 
int *pM; <-------------這個
int M[5]={1,2,3,4,5}; //這個array已經是傳址不是傳值,
                          為什還要宣告一point給它?
pM = M; <-------------這個
myf(pM);

for (int i =0; i < 5; i  )
printf("%d,", M[i]);
return 0;
}
       
引言: 寫個範例妳測看看。 //test.cpp #include void myf(int *pM) { *pM = 100; *(pM 1)=101; } int main(void) { int *pM; <-------------這個 int M[5]={1,2,3,4,5}; pM = M; <-------------這個 myf(pM); <-------------還有這個 for (int i =0; i < 5; i ) printf("%d,", M[i]); return 0; } 希望這樣妳可以比較清楚怎麼把這個址傳過去。^_^ Thank you for your patience and attentiveness
Best Regard kmp
系統時間:2024-11-23 20:07:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!