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

DELPHI 字串型態問題

缺席
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-10 14:29:59 IP:210.243.xxx.xxx 未訂閱
請問各位大大,可以幫我解答一下這種基本的問題嗎? 或者是告訴我該去什麼地方能找到有關的資料,或是那本書可以知道.. 字串型態 ShortString 跟 String 跟 pchar 在使用上時的不同, 舉例來說,ShortString 跟 String 都是字串型態,可是為什麼 當我使用 Pchar()來轉換型態時,String 可以,ShortString會發生錯誤, 還有當我使用同一個變數,比如 var testStr: String Pchar(testStr) ; String(testStr) ; 之後,裡面的資料就會消失了呢? 這樣我們在選用型態時,應該要注意的到底是哪一點 0.0"
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-10 15:03:58 IP:218.15.xxx.xxx 未訂閱
wscken您好:
string分配和释放由Delphi去优化,你不用关心是否会造成内存泄漏。在每
  一个String变量前都有详细的RTTI去管理它。AnsiString和WideString其实
  和String在使用时是一样的,因为Delphi并未为AnsiString和WideString建
  立特殊的函数。传递参数时是一个地址。例如将流中的数据读到一个String
  中,应该按下列方式操作:
  SetLength(Result, Count);      //相当于分配空间
  Stream.Read(Result[1], Count); //读数据到串    string分两种:
  一种是与Pascal传统string相兼容,叫ShortString,
  它的存储结构如下:
    ---------------------    
   | 1Byte |  字符串内容 |
    --------------------- 
   0       1 ......
    其中第一个字节为字符串的长度。
    所以ShortString最大长度是由程序员指定的,但最多255个字符是不错。问题是Delphi在处理时有很大不同。ShortString可以用Str[0]取字符串长。在
  申请局部变量或者传递参数时ShorString在堆栈段分配空间,而其它类型的
  串是在堆中;如:MyStr: string[48];在堆栈段分配52字节空间存放一个短
  串。      另一种是叫长字符串AnsiString,  它就是一个指向字符串的指针,不过具体的存储有些特别。
  它的存储结构如下:
   ----------------------- 
  | 4B | 4B |  字符串内容 |
   ----------------------- 
  -8   -4   0  ......
  其中,AnsiString指向字符串第一个字符,
        在第一个字符的反方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串被引用的次数。    pchar就是纯指向字符串(#0字符结尾)的指针,与C语言中的char *是一样的。    char数组也是指向字符串的指针,它与pchar的区别在于:
    1.char数组(均指非动态数组)一旦定义好,它的长度就固定了;
    2.char数组的地址是常量,不能另赋其它值,不能象pchar一样,
       如: sPchar:pchar; sArray1,sArray2:array[0..80]of char;
         sPChar:=sArray2; sPChar;=sArray1;
         但不能sArray2:=sArray1;
   char数组就相当于const char *     procedure TForm1.Button1Click(Sender: TObject);
var 
  teststr:string;
begin
  teststr:='try try see';
  showmessage(string(teststr));
  showmessage(pchar(teststr));
end;
具体可试试看~
——行径窄处,留一步与人行——
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-13 14:54:53 IP:210.243.xxx.xxx 未訂閱
感謝deity大大的回答, 後來我解決問題是看到一本書上寫的方法 在我使用AnsiString於要求PChar的函數或程序之後,將字串變數設為已零字元捷委的字串長度, SetLength(S,StrLen(PChar(S))) ; 不過使用String()跟Pchar()就能互相轉換,為什麼要另外再用一個Function來處理,實在令我覺得很奇怪..
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-13 17:18:59 IP:218.15.xxx.xxx 未訂閱
wscken您好: 不是很明白您的意思,是不是觉得为什么使用AnsiString得设定其存放大小? 参考上面AnsiString的存储方式.AnsiString指向字符串第一个字符s[1],    在第一个字符的方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串被引用的次数; AnsiString在宣告时如果没指定值,是不会分配内存空间的,所以要用SetLength()指定其空间大小; 不知是否会明白些,您也可以查找相关书籍或网络资源进行了解,试试看 ——行径窄处,留一步与人行——
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-15 17:42:14 IP:210.243.xxx.xxx 未訂閱
deity大大: 後來我查的原因似乎是因為程式寫在DLL裡面的關係,雖然我使用的是PChar來傳字串,而字串是加密過後的字串,似乎因為如此才會出現問題, 而且現在更奇怪的是,我寫了DLL存取加密的INI檔案,當我平常執行時, 一切都不會有問題,可是如果呼叫完ADOConnection後就會發生錯誤,這個ADOConnection也是包在DLL裡面的, 我以為我程式寫錯,不過當我把整個程式原封不動的從DLL拿出來到一般專案使用時,就一切正常, 而如果堅持要把ADOConnection包在Dll裡面使用的話,就必須在專案上不是DLL內的部份, 放置一個ADOConnection,而且必須要設定Connection:= True才行,所以我目前已經不知道究竟是BUG還是我字串處理上發生的問題了....
系統時間:2024-05-22 8:15:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!