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

请教各位大哥,在 C 语言中表示的结构,在 DELPHI 中怎么表示?谢谢!

尚未結案
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-26 14:27:22 IP:219.128.xxx.xxx 未訂閱
请教大哥: 在 C 语言中有: Public Const DATA_MAX = 100 typedef struct _COMDATA{ unsigned char ComPort; unsigned char Address; unsigned char ReData[DATA_MAX]; }COMDATA; 在 DELPHI 中怎么表示啊? 我这样表示,是不是写错了啊? const DATA_MAX = 100; type COMDATA=packed record comport:byte; Address:byte; ReData:array[0..DATA_MAX-1] of byte; end; 还是这样表示: const DATA_MAX = 100; type COMDATA=packed record comport:char; Address:char; ReData:array[0..DATA_MAX-1] of char; end; 是哪一种表示方法啊?还是两种都写错了呢? 谢谢 各位大哥^_^!
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-26 15:16:35 IP:220.244.xxx.xxx 未訂閱
在C中, unsigned char实际上是一个integral type, 所以用Delphi中的byte来替换更合适一些. 如果是signed char, 则可用shortint来替换. _________________________ Programming is a passion 發表人 - yyu10 於 2005/03/26 15:18:51
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-26 15:44:26 IP:219.128.xxx.xxx 未訂閱
非常感谢 yyu10 大哥: 还向 yyu10 大哥帮我看看下面两个问题: 请先看 原 函数在 C 语言中的声明: VC声明: short u_PCSaleCoin(COMDATA &comdata, BCD card, MONEY &coin) //这是一个购币的函数 输入参数: COMDATA结构 : ComPort 通信串口号 1 - 255 Address 设备地址 0 - 255 ReData 函数输出值 (100 Bytes) BCD结构 : Value 用户卡号 (8 Bytes 十六进制字符 “00000000” - “FFFFFFFF”) MONEY结构 : Value 硬币数 (8 Bytes “00000000” - “16777215” 单位:分) 函数返回值: 000: 通信成功。 242: 命令执行出错,返回错误代码。 160: 硬件返回系统错误。 其它: 通信失败,具体返回值含义请参阅返回值代码表 函数描述: PC销售硬币。 输出值格式(函数执行成功): “33” typedef struct _COMDATA{ unsigned char ComPort; unsigned char Address; unsigned char ReData[DATA_MAX]; }COMDATA; typedef struct _BCD{ unsigned char Value[8]; }BCD; typedef struct _MONEY{ unsigned char Value[8]; }MONEY; 我 在delphi 中把它写为: const DATA_MAX = 100; type COMDATA=packed record comport:byte; Address:byte; ReData:array[0..DATA_MAX-1] of byte; end; type BCD=packed record Value:array[0..7] of byte; end; type MONEY=packed record Value:array[0..7] of byte; end; 问题1: s[i 1]:=IntToStr(a[i])[1]; 中的 [1] 是什么意思啊? 问题2: 假设 卡号 为:AABBC124 通过:edit1 输入 购买 币数(游戏机币) 为:5 个 通过 edit2 输入 现在我的问题是: procedure TForm1.Button6Click(Sender: TObject); // var com:COMDATA; card:BCD; coin:MONEY; i:integer; s:string; begin com.comport:=1; com.Address:=0; s:=edit1.text; move(s[1],card[0],length(s)); 可是 现在买 5 个币,但是 coin 的长度为 8 这要怎么处理呢? u_PCSaleCoin(com,card,coin);//调用是这样的吗? end; 谢谢 yyu10 大哥大哥
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-26 20:49:31 IP:220.244.xxx.xxx 未訂閱
lsh998, 你好,
引言: 问题1: s[i 1]:=IntToStr(a[i])[1]; 中的 [1] 是什么意思啊?
IntToStr(a[i]) 返回一个string. IntToStr(a[i])[1] 是这个string的第一个字符, 如'ABC'中的'A'.
引言: 可是 现在买 5 个币,但是 coin 的长度为 8 这要怎么处理呢?
这要看u_PCSaleCoin如何使用coin了. 可能作为string使用, 也可能作为integer使用. Delphi区分这两种类型, 而C并不严格区分它们, 比如 char c = 65, 所以仅仅从Money结构的定义不能确定其真实类型. 你最好能提供C中使用u_PCSaleCoin的范例, 或者u_PCSaleCoin的C代码.
引言: u_PCSaleCoin(com,card,coin);//调用是这样的吗?
可以. 使用前加上 funtion u_PCSaleCoin(var comdata: COMDATA; card: BCD; var coin:MONEY):SmallInt; stdcall; external 'xxx.dll'; _________________________ Programming is a passion
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-27 10:30:24 IP:218.14.xxx.xxx 未訂閱
yyu10 大哥: 您太热了~~ 我晚上把 u_PCSaleCoin的C代码的代码 贴上来! 您再帮我看看,好吗? 谢谢 yyu10 大哥
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-28 08:26:49 IP:219.128.xxx.xxx 未訂閱
yyu10 大哥: 您好! 在 C 语言中的 MONEY 结构如下: typedef struct _MONEY{ unsigned char Value[8]; }MONEY; 在 DELPHI 中把它表示为: type MONEY=packed record Value:array[0..7] of byte; end; 请教: yyu10 大哥,byte 类型,我不是很理解 请问 yyu10 大哥,byte 类型,是不是只能由 0 和 1 的 字符组成。array[0]:=2 行吗? 请给我解释一下 byte 类型,好吗? 还有一个问题: 可是 现在买 5 个币,但是 coin 的长度为 8 这要怎么处理呢? 我把 u_PCSaleCoin C 的原码付上来了,请 yyu10 大哥 再给我看看: short WINAPI u_PCSaleCoin(COMDATA &comdata, BCD &card, MONEY &coin) { return u_GSHW.HW_PCSaleCoin(comdata,card,coin); } short CGSCtrl::HW_PCSaleCoin(COMDATA &comdata, BCD &card, MONEY &coin) { unsigned char T_Dat[DATA_MAX] = {0}; unsigned char nCmd = PCSALECOIN; unsigned short nNum = 7; short sRt = 0,sRt1 = 0; unsigned char ucMoney[9] = {0}; memset(&comdata.ReData,0,DATA_MAX); m_ucComPort = comdata.ComPort; m_ucID = comdata.Address; //Check the parameter if(!IsHexNum(card.Value,8)) return INVALID; if(!IsDecNum(coin.Value,8)) return INVALID; //Proccess the card NO. for(int i = 0;i < 4;i ) { T_Dat[i] = CHRTOBCD(card.Value,i * 2); } //Coin memcpy(ucMoney,coin.Value,8); if(atoi((char *)ucMoney) < 0 || atoi((char *)ucMoney) > 0xffffff) return INVALID; T_Dat[4] = (atoi((char *)ucMoney) & 0xff0000) >> 16; T_Dat[5] = (atoi((char *)ucMoney) & 0xff00) >> 8; T_Dat[6] = atoi((char *)ucMoney) & 0xff; sRt = ProcessData(&nCmd,T_Dat,&nNum); if(sRt != SUCCESS) return sRt; if((sRt1 = ProcessCmd(comdata.ReData,T_Dat,nCmd)) != SUCCESS) return sRt1; return sRt; } 谢谢 yyu10 大哥!
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-28 14:35:21 IP:219.128.xxx.xxx 未訂閱
请 yyu10 大哥,再帮我顶一下啊? 谢谢!
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-03-28 16:39:02 IP:220.244.xxx.xxx 未訂閱
引言: byte 类型,是不是只能由 0 和 1 的字符组成。array[0]:=2 行吗?
在Delphi中, byte是一个integral type, 取值范围:0..255. 在Delphi Help里直接查byte看看.
引言: 可是 现在买 5 个币,但是 coin 的长度为 8 这要怎么处理呢?
在u_PCSaleCoin中, BCD和MONEY实际上是作为字串使用的, 所以在Delphi中相应结构用char更加方便些.
type 
  BCD=packed record
    Value:array[0..7] of char;
  end;      MONEY=packed record
    Value:array[0..7] of char;
  end;
读取卡号和币数
var
  ...
  i: integer;
  s:string;
begin
  ...
  s := Trim(edit1.Text);
  i := Min(Length(s), SizeOf(card));
  Move(s[1], card, i);
  ...
  ...
  s := Trim(eidt2.Text);
  if Lengh(s) > SizeOf(coin) then
  begin
    //显示错误
  end
  else
  begin
    if Lengh(s) < SizeOf(coin) then
      FillChar(coin, SizeOf(coin), ' ');  //' ' -> 一个空格
    i := SizeOf(coin)-Length(s);
    Move(s[1], coin.Value[i], Length(s));
  end;
  ...
  ...
  u_PCSaleCoin(com,card,coin);
  ...
end;
_________________________ Programming is a passion
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-03-28 17:53:29 IP:219.128.xxx.xxx 未訂閱
yyu10 大哥: 谢谢!谢谢!
系統時間:2024-07-03 23:02:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!