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

矩陣如何存成這樣的型式

尚未結案
nngg123
一般會員


發表:7
回覆:4
積分:2
註冊:2004-10-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-24 20:29:37 IP:140.134.xxx.xxx 未訂閱
各位大大你們好阿 小弟有個問題 今天有多筆資料從rs232讀進程式裡 顯示在 Memo 上,其顯示型式為 n*1 的型式 1 2 . . n 我想把這讀進來的資料存在一個16*n的矩陣 n > 50 1 2 3 ... n 2 3 . . 16 請問要用什麼方法呢? 對於bcb是超級新手 之前再摸spcomm就花了不少的時間了 煩請各位大大能幫個忙 謝謝
andychang1690
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-24 23:25:58 IP:221.169.xxx.xxx 未訂閱
引言: 各位大大你們好阿 小弟有個問題 今天有多筆資料從rs232讀進程式裡 顯示在 Memo 上,其顯示型式為 n*1 的型式 1 2 . . n 我想把這讀進來的資料存在一個16*n的矩陣 n > 50 1 2 3 ... n 2 3 . . 16 請問要用什麼方法呢? 對於bcb是超級新手 之前再摸spcomm就花了不少的時間了 煩請各位大大能幫個忙 謝謝
nngg123:不太了解你16*n的矩陣意思,按字面指定16*n的矩陣,表示你一 定要等資料接受完畢或告一段落才能處理!? 如果是的話,假設你資料暫存Memo上那要先求Memo1->Lines->Count的數值, 在除以十六得n數,並判斷是否有餘數 if (Memo1->Lines->Count % 16 != 0) n ; // n數要加一才能符合你的16*n的矩陣意義! 請參考! Andy Chang
------
Andy Chang
nngg123
一般會員


發表:7
回覆:4
積分:2
註冊:2004-10-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-25 03:11:01 IP:140.134.xxx.xxx 未訂閱
引言: nngg123:不太了解你16*n的矩陣意思,按字面指定16*n的矩陣,表示你一 定要等資料接受完畢或告一段落才能處理!? 如果是的話,假設你資料暫存Memo上那要先求Memo1->Lines->Count的數值, 在除以十六得n數,並判斷是否有餘數 if (Memo1->Lines->Count % 16 != 0) n++; // n數要加一才能符合你的16*n的矩陣意義! 請參考! Andy Chang
Andy Chang大大 不好意思喔,我試著去寫程式,執行的結果如下 剛好資料為16筆的時候的結果,餘數=0 資料>16以後,餘數都是等於 2 , 不太清楚為什麼會這樣子,還煩請大大說明在詳細些 另外阿,若把n求出來了 要如何把 n 當作 陣列的大小呢 int arr[16]][n] ; 這樣子設矩陣的會顯示 Constant expression required 的錯誤 謝謝大大的指教!! 程式如下: void __fastcall TForm1::Button9Click(TObject *Sender) { int n; n=Memo2->Lines->Count ; if (n % 16 != 0) n++; ShowMessage(AnsiString("n=")+IntToStr(n)); } 發表人 - nngg123 於 2004/10/25 03:15:12 發表人 - nngg123 於 2004/10/25 03:16:13 發表人 - nngg123 於 2004/10/25 03:20:28
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-25 04:58:29 IP:211.76.xxx.xxx 未訂閱
關於int arr[16][n] ; 你要利用動態宣告陣列的方式...
   int **ary;
   int n;
   ary=new int*[16]; 
   for(int i=0; i<16; i++) 
      ary[i]=new int[n];
andychang1690
資深會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-25 13:32:55 IP:221.169.xxx.xxx 未訂閱
nngg123:動態宣告陣列的方式請參考GGL大的說明,但宣告完畢後最好給一個初始值。
for(int i=0; i<16; i  ) 
  for (int j=0;j    Andy Chang
        
------
Andy Chang
nngg123
一般會員


發表:7
回覆:4
積分:2
註冊:2004-10-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-25 14:15:07 IP:140.134.xxx.xxx 未訂閱
Andy 大大 我貼錯程式了,有問題的應該是這個 這樣才會符合之前貼的圖
  void __fastcall TForm1::Button9Click(TObject *Sender)
{
  int n;
  if ( n=Memo2->Lines->Count % 16 != 0)
     n++;
   ShowMessage(AnsiString("n=")+IntToStr(n));
}    
另外阿,之前貼的程式覺得有問題的是 執行後所告知的 n 是程式有多少筆資料+1 好像跟 % 16 沒有關係
void __fastcall TForm1::Button9Click(TObject *Sender)
{
  int n;
  n=Memo2->Lines->Count ;
  if (n % 16 != 0)
    n++;
     ShowMessage(AnsiString("n=")+IntToStr(n));
}
測試的數據目前是使用 spcomm , 透過 rs232 由 pc 端依序送出 0~f 到單晶片 89c51上 再傳回到pc 目前只是rs232 的第 2,3 腳短路作測試 傳回來的資料經過轉換把16位元的資料轉換成10進位資料 就如第二個memo所示 程式部分如下: spcomm接收資料:
void __fastcall TForm1::Comm1ReceiveData(TObject *Sender, Pointer Buffer,
      WORD BufferLength)
{      Memo1->Lines->Add((char*)Buffer);  //  把51端adc的輸出顯示於memo1上      AnsiString hex=(char*)Buffer;
  double t;
  //  轉換成電壓值
  t= SimpleRoundTo( (double)StrToInt("$"  hex)/51, -2);
  Memo2->Lines->Add(t);
}
由spcomm送出指令: 依序送出 0~f
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{      Comm1->WriteCommData("0", 1);
  Timer2->Enabled=true;
  Timer1->Enabled=false;
}
還有勞 Andy 大哥 指點迷津了 感激不盡
andychang1690
資深會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-25 16:57:29 IP:221.169.xxx.xxx 未訂閱
nngg123 :另外阿,之前貼的程式覺得有問題的是
執行後所告知的 n 是程式有多少筆資料+1 
好像跟 % 16 沒有關係 
這是數學運算式;你的條件是16xN,若有餘數會造成你的16xN
不成立,其實我說的n  並不是那麼正確(我懶)而是應該記錄餘數。
分析一下    int j=Memo2->Lines->Count;
int n=j / 16;
int r=j % 16; // 餘數
if ( r != 0)
    n  ;
/*
(j==16) % 16 == 0 ; r=0; n=1;
(j==17) % 16 == 1 ; r=1; n=2;
...
(j==31) % 16 == 15; r=15;n=2;
類推
*/
//我搞不清楚你是要處理Memo1還是Memo2;按你的問法應該是Memo2!?
//重新解剖一下:
void __fastcall TForm1::Button9Click(TObject *Sender)
{
  Memo3->Clear();
  int j=Memo2->Lines->Count;
  int n=j / 16;
  int r=j % 16; // 餘數
  if ( r != 0)
    n  ;
/*
  int **ary;
  ary=new int*[16];
  for(int i=0; i<16; i  )
    ary[i]=new int[n];
  for(int i=0; i<16; i  )
    for (int j=0;jLines->Strings[l  ] " ";
      if (i >= r ) {
        j =n 100; // 跳離
      }
    }
    Memo3->Lines->Add(S);
  }
  ShowMessage(AnsiString("n=")+IntToStr(n));
  // 表示顯示為16xn
}
請參考! Andy Chang
------
Andy Chang
nngg123
一般會員


發表:7
回覆:4
積分:2
註冊:2004-10-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-26 18:24:13 IP:140.134.xxx.xxx 未訂閱
感謝  Andy 大大的賜教    我會在試試看的    程式真的是一們很高深的學問    要學習的地方還有很多    也謝謝 GGL 大大的指教    感激不盡 
系統時間:2024-05-19 10:03:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!