DELPHI 字串型態問題 |
缺席
|
wscken
初階會員 發表:28 回覆:75 積分:45 註冊:2003-08-05 發送簡訊給我 |
請問各位大大,可以幫我解答一下這種基本的問題嗎?
或者是告訴我該去什麼地方能找到有關的資料,或是那本書可以知道.. 字串型態
ShortString 跟 String 跟 pchar 在使用上時的不同,
舉例來說,ShortString 跟 String 都是字串型態,可是為什麼
當我使用 Pchar()來轉換型態時,String 可以,ShortString會發生錯誤, 還有當我使用同一個變數,比如 var testStr: String
Pchar(testStr) ;
String(testStr) ;
之後,裡面的資料就會消失了呢? 這樣我們在選用型態時,應該要注意的到底是哪一點 0.0"
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
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 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
wscken您好:
不是很明白您的意思,是不是觉得为什么使用AnsiString得设定其存放大小?
参考上面AnsiString的存储方式.AnsiString指向字符串第一个字符s[1], 在第一个字符的反方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串被引用的次数; AnsiString在宣告时如果没指定值,是不会分配内存空间的,所以要用SetLength()指定其空间大小;
不知是否会明白些,您也可以查找相关书籍或网络资源进行了解,试试看 ——行径窄处,留一步与人行——
|
wscken
初階會員 發表:28 回覆:75 積分:45 註冊:2003-08-05 發送簡訊給我 |
deity大大: 後來我查的原因似乎是因為程式寫在DLL裡面的關係,雖然我使用的是PChar來傳字串,而字串是加密過後的字串,似乎因為如此才會出現問題,
而且現在更奇怪的是,我寫了DLL存取加密的INI檔案,當我平常執行時,
一切都不會有問題,可是如果呼叫完ADOConnection後就會發生錯誤,這個ADOConnection也是包在DLL裡面的,
我以為我程式寫錯,不過當我把整個程式原封不動的從DLL拿出來到一般專案使用時,就一切正常, 而如果堅持要把ADOConnection包在Dll裡面使用的話,就必須在專案上不是DLL內的部份,
放置一個ADOConnection,而且必須要設定Connection:= True才行,所以我目前已經不知道究竟是BUG還是我字串處理上發生的問題了....
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |