矩陣如何存成這樣的型式 |
尚未結案
|
nngg123
一般會員 發表:7 回覆:4 積分:2 註冊:2004-10-07 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
引言: 各位大大你們好阿 小弟有個問題 今天有多筆資料從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 發送簡訊給我 |
引言: nngg123:不太了解你16*n的矩陣意思,按字面指定16*n的矩陣,表示你一 定要等資料接受完畢或告一段落才能處理!? 如果是的話,假設你資料暫存Memo上那要先求Memo1->Lines->Count的數值, 在除以十六得n數,並判斷是否有餘數 if (Memo1->Lines->Count % 16 != 0) n++; // n數要加一才能符合你的16*n的矩陣意義! 請參考! Andy ChangAndy 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 發送簡訊給我 |
|
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
|
nngg123
一般會員 發表:7 回覆:4 積分:2 註冊:2004-10-07 發送簡訊給我 |
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 發送簡訊給我 |
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;j請參考! Andy Chang
------
Andy Chang |
nngg123
一般會員 發表:7 回覆:4 積分:2 註冊:2004-10-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |