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

請教各位大大,幫小弟一個問題

答題得分者是:seaturn99
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-05 01:51:35 IP:210.66.xxx.xxx 未訂閱
小弟寫一個crc16的function,但要如何運用,main form要呼叫crc16,但出現一項錯誤 "undeclared identifier :crc16", 請大大指導一下,感激萬分,原始碼如下 unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TfrmMain = class(TForm) Edit1: TEdit; Edit2: TEdit; btnSend: TButton; btnRecive: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; implementation uses Math; {$R *.dfm} procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: array[0..1] of Byte; CRC_Lo,CRC_Hi: Byte; begin b:=crc16(a,5); CRC_Lo:=b[0]; CRC_Hi:=b[1]; end; function CRC16(CRCData: array of Byte; Datalen: Integer):Word; var CRC16Lo: Byte; CRC16Hi: Byte; SaveLo:Byte; SaveHi:Byte; GLo:Byte; GHi:Byte; i:Integer; Flag:Integer; begin CRC16Lo:=$ff; CRC16Hi:=$ff; GLo:=$01; GHi:=$a0; for i:=0 to Datalen -1 do begin CRC16Lo:=CRC16Lo xor CRCData[i]; for Flag :=0 to 7 do begin SaveLo:=CRC16Lo; SaveHi:=CRC16Hi; CRC16Hi:=CRC16Hi shr 1; CRC16Lo:=CRC16Lo shr 1; if (SaveHi and $01) = $01 then CRC16Lo:=CRC16Lo or $80; if (SaveLo and $01) = $01 then begin CRC16Hi:=CRC16Hi xor GHi; CRC16Lo:=CRC16Lo xor GLo; end; end; end; CRC16 := CRC16Lo * 256 CRC16Hi; end; end.
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-05 08:45:07 IP:203.66.xxx.xxx 未訂閱
引言: 小弟寫一個crc16的function,但要如何運用,main form要呼叫crc16,但出現一項錯誤 "undeclared identifier :crc16", 請大大指導一下,感激萬分,原始碼如下 unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; function CRC16(CRCData: array of Byte; Datalen: Integer):Word; type TfrmMain = class(TForm) Edit1: TEdit; Edit2: TEdit; btnSend: TButton; btnRecive: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; implementation uses Math; {$R *.dfm} procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: array[0..1] of Byte; CRC_Lo,CRC_Hi: Byte; begin b:=crc16(a,5); CRC_Lo:=b[0]; CRC_Hi:=b[1]; end; function CRC16(CRCData: array of Byte; Datalen: Integer):Word; var CRC16Lo: Byte; CRC16Hi: Byte; SaveLo:Byte; SaveHi:Byte; GLo:Byte; GHi:Byte; i:Integer; Flag:Integer; begin CRC16Lo:=$ff; CRC16Hi:=$ff; GLo:=$01; GHi:=$a0; for i:=0 to Datalen -1 do begin CRC16Lo:=CRC16Lo xor CRCData[i]; for Flag :=0 to 7 do begin SaveLo:=CRC16Lo; SaveHi:=CRC16Hi; CRC16Hi:=CRC16Hi shr 1; CRC16Lo:=CRC16Lo shr 1; if (SaveHi and $01) = $01 then CRC16Lo:=CRC16Lo or $80; if (SaveLo and $01) = $01 then begin CRC16Hi:=CRC16Hi xor GHi; CRC16Lo:=CRC16Lo xor GLo; end; end; end; CRC16 := CRC16Lo * 256 CRC16Hi; end; end.
wychen57 您好 請在 interface 區段,宣告即可(如同紅色的示範....) 如果只在 implementation ,就只有其下的 function 或是 member function 才能呼叫使用 另外一個方法 : 把 CRC16 function 放到 TfrmMain.FormCreate 之前 ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/03/05 08:49:14
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-05 10:23:17 IP:61.66.xxx.xxx 未訂閱
引言: 再請問大大 procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: Word; CRC_Lo: Byte; CRC_Hi: Byte; begin b:= crc16(a,6); CRC_Hi:= b div 256; CRC_Lo:= b mod 256; Edit1.Text:=IntToStr(CRC_Hi); Edit2.Text:=IntToStr(CRC_Lo); end; 以上這段程式有更好的寫法嗎,因為陣列A是來自MODBUS的查詢命令,但SPCOMM或MSCOMM的OUT只接受STRING格式資料說 function CRC16(CRCData: array of Byte; Datalen: Integer):Word; var CRC16Lo: Byte; CRC16Hi: Byte; SaveLo:Byte; SaveHi:Byte; GLo:Byte; GHi:Byte; i:Integer; Flag:Integer; begin CRC16Lo:=$ff; CRC16Hi:=$ff; GLo:=$01; GHi:=$a0; for i:=0 to Datalen -1 do begin CRC16Lo:=CRC16Lo xor CRCData[i]; for Flag :=0 to 7 do begin SaveLo:=CRC16Lo; SaveHi:=CRC16Hi; CRC16Hi:=CRC16Hi shr 1; CRC16Lo:=CRC16Lo shr 1; if (SaveHi and $01) = $01 then CRC16Lo:=CRC16Lo or $80; if (SaveLo and $01) = $01 then begin CRC16Hi:=CRC16Hi xor GHi; CRC16Lo:=CRC16Lo xor GLo; end; end; end; CRC16 := CRC16Lo * 256 CRC16Hi; end;
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-05 13:40:00 IP:203.66.xxx.xxx 未訂閱
引言: 再請問大大 procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: Word; CRC_Lo: Byte; CRC_Hi: Byte; begin b:= crc16(a,6); CRC_Hi:= b div 256; CRC_Lo:= b mod 256; Edit1.Text:=IntToStr(CRC_Hi); Edit2.Text:=IntToStr(CRC_Lo); end; 以上這段程式有更好的寫法嗎,因為陣列A是來自MODBUS的查詢命令,但SPCOMM或MSCOMM的OUT只接受STRING格式資料說
wychen57 您好 : 大大都是五星上將,我還差得遠... 這段
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-10 11:42:08 IP:61.66.xxx.xxx 未訂閱
引言:
引言: 再請問大大 procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: Word; CRC_Lo: Byte; CRC_Hi: Byte; begin b:= crc16(a,6); CRC_Hi:= b div 256; CRC_Lo:= b mod 256; Edit1.Text:=IntToStr(CRC_Hi); Edit2.Text:=IntToStr(CRC_Lo); end; 以上這段程式有更好的寫法嗎,因為陣列A是來自MODBUS的查詢命令,但SPCOMM或MSCOMM的OUT只接受STRING格式資料說
wychen57 您好 : 大大都是五星上將,我還差得遠... 這段 >< face="Verdana, Arial, Helvetica"> 大大,您可能誤會我意思了,我是問說SPCOMM的OUT只能餵給它STRING型態資料,但小弟的CRC16算出來的是ARRAY型態資料,要如何餵給SPCOMM呀,盼請指導,感恩喔
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-10 11:48:55 IP:61.66.xxx.xxx 未訂閱
] 再請問大大,如果我想把所有的>
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-11 10:18:05 IP:203.66.xxx.xxx 未訂閱
引言: ] 再請問大大,如果我想把所有的> < face="Verdana, Arial, Helvetica"> wychen57 您好 : File -> New -> Unit 將實作的程式碼寫在(貼在) implementation 區段,在 interface 區段加入 宣告(全域變數也宣告於此)即可...
unit Unit1;    interface    uses SysUtils, Classes, Windows, FileCtrl, Dialogs;    function Func1: string;    implementation    function Func1:string;
begin    end;    
main form 要使用 Unit1 ,只要在 main form 的 uses 宣告內加入 Unit1 至於 SPCOMM [Out] 只接受 String 的部分.. 您可以使用 IntToStr ,如果長度不符合.. 可以使用 copy 這個 function ,指定從 Index ,到指定長度的 copy 字串結果... 將 Array 資料轉成 string 的 pesudo code
var
  i:integer;
  Str : string;    ..
Str := '';
for i:=Low(CRC16Arr) to High(CRC16Arr) do
  Str := Str   IntToStr(CRC16Arr[i]);
至於資料結果是否正確,就要看您 CRC16 function 是否有邏輯上判斷的錯 誤了... PS. 對了,標題要改一下,要能表現問題的摘要... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/03/11 16:09:16
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-12 12:48:25 IP:61.66.xxx.xxx 未訂閱
引言: 太感謝大大您的指導了,您真是太厲害了 < face="Verdana, Arial, Helvetica">
系統時間:2024-03-29 1:39:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!