1. 程式人生 > >Delphi 小談之TList 篇

Delphi 小談之TList 篇

最近開發程式需要使用TList功能,轉載此文章,以作參考。

看了這裡標題,大家可能以為我會談TListBox控制元件,那就錯了。我要談的是Delphi提供給我們的具有列表性質的類:TstringList、TList和TObjectList。TstringList用來存放字串,TList存放指標,而TObjectList則存放物件(Object)。
在我們使用Delphi 的過程中,有很多資料的儲存是要靠陣列解決的。雖然Delphi現在已經支援了可變陣列,不過總有那麼點缺陷:我們不能在刪除一個項後,使後邊的項自動前靠。因此,說說Delphi現成的List還是有價值的。
TstringList (Classes.pas)
在TstringList裡,那些String被一行一行地儲存。TstringList.Text返回全部的String。如果第一、二、三行分別是/'aa/'、/'bb/'、/'cc/' 的話,那麼Text 返回的是“/'aa/'+#13#10+/'bb/'+#13#10+/'cc/'+#13#10” (不包括雙引號)。所有的String都被TstringList用回車和換行符(#13#10)連線了起來。如果依次向Text賦值的話,Text就會被自動地分割成行儲存在TstringList 裡。這充分地體現出TstringList的一個很實用的價值:它能讓我們逐行處理String。假如我們要操作第4行,只需操作TstringList[3]。相信大家會問,TstringList明明是一個類,為什麼能當陣列那樣子用呢?其實,我們在寫TstringList[3]的時候,就是在寫TstringList.Strings[3]。Strings是TstringList的一個預設屬性。陣列性的預設屬性就是這樣子使用的。如果大家在編寫類的時候要用到這麼一個功能的話,可以參照如下方法:
property AProperty[I: Integer] read *** write ***;
default;。
Strings 是一個可讀寫的屬性。這也就是說,大家不僅可以獲得第N 行的內容,也可以改變第N 行的內容。因此我們需要知道TstringList 裡S t r i n g 的總行數。TstringList的屬性Count則可以滿足我們的需要。
上面已經說過,Text是一個返回所有字串的屬性。向Text賦值時,TstringList能夠自動地把Text分成一行一行的,然後儲存在TstringList裡(當然,TstringList裡面並不完全是這麼儲存的,詳細過程建議看TstringList和TStrings的程式碼)。這樣,Strings返回的字串就是沒
有回車和換行的。但是,如果我們向Strings賦值的字串有回車和換行,那麼會出現什麼情況呢?此時,Strings就會把那個字串斷成幾行,插入到原來的位置上。如果TstringList只有這麼些功能的話,那我就不必專門拿出來講了——我是說,TstringList能讓我們任意
地插入或刪除某行,這就要用到TstringList提供的方法。
function Add(const S: string): Integer;
procedure Append(const S: string);
Add方法向TstringList的末尾新增一行String(在這裡和下面我們都假設輸入的字串沒有回車和換行,否則String將被分割)。引數S 代表的是要插入的字串的內容。Add的返回值代表了新的字串在TstringList的位置——也就是最後一行的位置,即新的Count 減去一。
Append 方法與Add 唯一不同的地方是沒有返回值。
procedure Insert(Index: Integer; const S: string);
Insert方法向TstringList插入一行字串。在Insert裡,我們可以自由地選擇字串插入的位置。引數S 代表要插入的字串的內容,Index 代表要插入的位置。
procedure Delete(Index: Integer);
Delete 方法刪除某行字串,我們同樣可以自由地選擇刪除任意一行字串。引數Index代表要刪除的那一行字串的位置。學習筆記
function IndexOf(const S: string): Integer;
IndexOf查詢某一字串在TstringList裡的位置。引數S代表要查詢的字串。如果TstringList裡不存在S的話,則返回-1。
procedure Move(CurIndex, NewIndex: Integer);
procedure Exchange(Index1, Index2: Integer);
TstringList另外還提供了兩個方法—— Move 和Exchange。Move方法能把一行字串抽出來並插入到另一個指定的位置上。引數CurIndex代表要移動的字串的位置,NewIndex 代表字串新的位置。
Exchange方法則能將隨便兩行字串交換。引數Index1和Index2代表兩行需要交換的字串的位置。
procedure LoadFromFile(const FileName: string);
procedure SaveToFile(const FileName: string);
TstringList的LoadFromFile和SaveToFile兩個方法,使得我們對文字檔案的操作變得非常方便。引數FileName 代表目標文字檔案的檔名。例如我們在編寫記事本的時候,用到的TMemo.Lines 就是TStrings(TstringList的父類,功能幾乎相同,只是因為TStrings是虛類,我們無法建立並使用)。在儲存的時候只需一行程式碼:TMemo.Lines.SaveToFile(FileName),非常方便。
TstringList還有一項特殊功能:可以把TstringList當成ini控制器使用。不過它沒有Section。現在我就來介紹TstringList的兩個屬性:Names和Values。
如果TstringList的內容是這樣子的:
ID=1
Name=Vczh
PositionID=8

Tel=00000000

那麼,Names[2]就返回“PositionID ”,Values[/'PositionID/']就返回“8”。其中“Names”是隻讀屬性,而“Value”則可寫。TstringList使我們不必拘泥於ini和登錄檔。關於TstringList沒有Section這個問題,我們完全可以在Names 裡做點手腳,只要程式能夠識別就行(文

章末尾處的範例裡將出現此方法供大家參照)。

TstringList還有一個可以存放Object的功能。但是我個人認為使用TObjectList比較好,因為TObjectList在這方面提供了比TstringList更多的功能。

下面我提供一個例程來介紹Values屬性。

新建一個工程儲存,並在dpr檔案所在的資料夾裡建立一個叫做“Config.txt”的檔案,並輸入以下內容:

Name=VCZH
Address=Somewhere

[email protected]

然後,建立一個窗體。如圖所示:並在TForm1 的Private 區段裡建立一個變數:

SL:TstringList;

這個例程的功能是編輯Config.txt 裡的Name 、Address、Email。SL在程式啟動時讀入Config.txt檔案;按下Cancel 按鈕則退出;按下OK 按鈕則改變SL 的內容並儲存在Config.txt檔案裡;當程式再次執行時,改變後的內容就會顯示在三個文字框裡。程式碼如下:

procedure TForm1.FormCreate(Sender: TObject);
begin
SL:=TstringList.Create;
{ 獲取當前程式檔案所在的資料夾名稱以獲得C o n f i g . t x t 檔案的路徑 }
SL.LoadFromFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
end;
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
SL.Free;
end;

procedure TForm1.btnCancelClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
{ 通過上面介紹的V a l u e s 屬性獲得各個欄位的內容 }
edtName.Text:=SL.Values[/'Name/'];
edtAddress.Text:=SL.Values[/'Address/'];
edtEmail.Text:=SL.Values[/'Email/'];
end;

procedure TForm1.btnOKClick(Sender: TObject);
begin
{ 修改各個欄位的內容並儲存 }
SL.Values[/'Name/']:=edtName.Text;
SL.Values[/'Address/']:=edtAddress.Text;
SL.Values[/'Email/']:=edtEmail.Text;
SL.SaveToFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
Close;
end;

程式執行後如圖:
-------------------------------------------------------------------------------------
Tlist (Classes.pas)

在我剛開始接觸TList的時候,TList搞得我迷霧重重,都是Capacity屬性惹的禍。我查了Delphi的幫助,它說Capacity是TList的最大容量,又在什麼地方說MaxIntdiv 4是TList的最大容量。最後我搞明白了,Capacity是臨時的,MaxInt div 4才是真正的最大容量。只要你的內

存受得了就行,算起來一共是4G。在TList 內部有一個FList指標指向一個Pointer陣列,Capacity就是這個陣列的大小。奇怪的是Capacity是可寫的。我當時就在想,如果一直使用Add 直到超出了Capacity的範圍,會怎麼樣呢?為了解決這個問題,我特地打開了TList 的程式碼,結果發現如下幾行(註釋是我自己加的):

function TList.Add(Item: Pointer): Integer;
begin
{ 返回Item 所在的位置 }
Result := FCount;

{ 如果FList 數祖被填滿了裝不下新的Item
那麼TList 自動增加Capacity
也就是FList 指向的陣列的大小 }
if Result = FCapacity then
Grow;

{ 擴大了FList 的大小後,就能把 Item 放進陣列了 }
FList^[Result] := Item;
Inc(FCount);
if Item <> nil then
Notify(Item, lnAdded);

{ 給TList 一個訊號,通知TList 已經加上了一個新的Item }
end;

procedure TList.Grow;
var
Delta: Integer;
begin
{ 增加的規則是,如果數量小於或等於8,那麼增加4 ;如果數量在8 之上,小於或等於64 ,那麼增加16 ;如果數量比64 還大,那麼一次增加大約1/4 的空間 }
if FCapacity > 64 then
Delta := FCapacity div 4
else
if FCapacity > 8 then
Delta := 16
else
Delta := 4;

{ 改變陣列大小 }
SetCapacity(FCapacity + Delta);
end;

既然Capacity會自動增加,那麼還要Capacity幹什麼呢?還不如使用連結串列。不過我後來意識到,在使用連結串列的時候,取得某個位置的指標比陣列困難,要用比較費時間的迴圈。TList剛好解決了這個問題。我們既可以把TList 當成陣列,也可以把它當成連結串列。

TList 除了儲存的物件是指標以外,其它地方都與TstringList很像。所以接下來我只介紹二者不同之處。

我們同樣可以使用TList或者TList.Items獲得某一位置的指標。如果嫌TList.Items是屬性沒有效率的話,這裡還有一個List屬性,指向內部的FList,可以這麼用:

TList.List^。

TList提供了First和Last兩個屬性,分別返回第一個和最後一個指標。

TList 也提供了一個Remove方法。與Delete不同的是,Delete刪除的是已知位置的指標,Remove刪除的是已知指標。只要TList 包含有你想刪除的指標,就可以使用Remove(Pointer)。Remove的返回值是指標在還沒有被刪除之前的位置。使用方法如下:

procedure Delete(Index: Integer);

function Remove(Item: Pointer): Integer;

TList還有一個Pack方法。它能夠把所有不是nil的指標聚在一起,同時把Count 的值改變,這樣,所有沒用的指標就會被刪除,但是並不會減少Capacity。如果你想把沒用的空間都釋放掉的話,可以把Capacity設定成Count。

最後,我想說的是Protected裡的Notify。大家在Add的程式碼裡就能看到,在Insert、Delete之類的程式碼裡我們也能看得到Notify的蹤跡。既然FList的內容已經被改變了,Notify 還要做什麼工作呢?看一下Notify的程式碼:學習筆記
TListNotification = (lnAdded, lnExtracted, lnDeleted);
procedure TList.Notify(Ptr: Pointer; Action:
TListNotification);
begin
end;
留著一個空的Notify 有什麼用呢?再看它的宣告:
procedure Notify(Ptr: Pointer; Action: TListNotification);
virtual;
原來Notify 是一個虛擬函式,當我們因為有特殊要求而繼承TList類的話,只要TList 的內容一改變,我們就能得到通知。不過前提是我們要覆蓋N o t i f y 這個
Procedure。
-------------------------------------------------------------------------------------
TObjectList (Contnrs.pas)

T O b j e c t L i s t 中有一個不可缺少的屬性:OwnsObjects。如果OwnsObjects是True(預設值)的話,那麼TObjectList會在適當的時候把它列表中的Object釋放掉。

現在,讓我們用一個例子來結束我對Delphi的List的介紹。這個例子是一個管理人員資訊的程式。不過因為這只是一個示例,所以這個程式只是一個簡單的ConsoleApplication。使用Console Application來做示例程式可以免掉一些介面設計的工作。這個程式通過Index來管理人員資訊。人員資訊包括Name、Telephone和Address。程式通過TstringList來讀取人員資訊檔案,然後用那些指向Record的指標把資訊存放在TList裡並修改。程式碼如下:
 程式程式碼
program Info[color=#0000ff];

{$APPTYPE CONSOLE}

uses

SysUtils, Classes;

type

PInfo=^TInfo;

TInfo=record

Name:String;

Tel:String;

Address:String;

end;

var

SL:TstringList;

List:TList;

AppPath:String;

{ 開闢一個新的PInfo 指標,填入資訊並返回指標將在Command_Delete 或FinaInfo 裡釋放 }

function MakeInfo(Name,Tel,Address:String):PInfo;
var P:PInfo;
begin
New(P);
P^.Name:=Name;
P^.Tel:=Tel;
P^.Address:=Address;

{ 返回的指標將被儲存在List 裡 }
result:=P;
end;


{ 在螢幕上列印所有可用的命令 }
procedure PrintMenu;
begin
writeln(/'======選單======/');
writeln(/'V---- 檢視所有人員的資訊/');
writeln(/'A---- 增添新的人員資訊/');
writeln(/'D----刪除人員/');
writeln(/'E---- 修改人員資訊/');
writeln(/'M---- 檢視所有可用命令/');
writeln(/'X----退出程式/');
end;

{ 修改人員資訊的程式 }
procedure Command_Edit;
var I:Integer;
Name,Tel,Address:String;
P:PInfo;
begin
write(/' 請輸入要修改的人員資訊的序號:/');
readln(I);
if(I<0)or(I>=List.Count)then
writeln(/' 輸入超出範圍。/')
else
begin
{ 取得某個人員資訊的指標 }
P:=List.Items;
writeln(/' 開始輸入人員資訊(若某項資訊不需要修改則留
空):/');
write(/' 姓名:/');
readln(Name);
write(/' 電話號碼:/');
readln(Tel);
write(/' 地址:/');
readln(Address);

{ 儲存輸入的資訊 }
if Name<>/'/' then P^.Name:=Name;
if Tel<>/'/' then P^.Tel:=Tel;
if Address<>/'/' then P^.Address:=Address;
writeln(/' 修改人員資訊執行完畢。/');
end;
end;

{ 增加人員資訊的程式 }
procedure Command_Add;
var Name,Tel,Address:String;
begin
writeln(/' 開始輸入人員資訊:/');
write(/' 姓名:/');
readln(Name);
write(/' 電話號碼:/');
readln(Tel);
write(/' 地址:/');
readln(Address);

{ 使用MakeInfo 生成TInfo 的指標
並加入Tlist 中 }
List.Add(MakeInfo(Name,Tel,Address));
writeln(/' 增加人員資訊執行完畢。/');
end;

{ 列印所有人員資訊的程式 }
procedure Command_View;
var I:Integer;
P:PInfo;
begin
writeln(/' 人員資訊列表:/');
for I:=0 to List.Count-1 do
begin
P:=List.Items;
writeln(IntToStr(I)+/'號===================/');
writeln(/'姓名:/'+P^.Name);
writeln(/'電話:/'+P^.Tel);
writeln(/'地址:/'+P^.Address);

{ 滿六個就暫停,剛好填滿一個螢幕 }
if I mod 6=5 then
begin
writeln(/' 請按回車鍵繼續。/');
readln;
end;
end;
writeln;
end;


{ 刪除人員資訊的程式 }
procedure Command_Delete;
var I:Integer;
P:PInfo;
begin
write(/' 請輸入要刪除的人員資訊的序號:/');
readln(I);

if(I<0)or(I>=List.Count)then
writeln(/' 輸入超出範圍。/')
else
begin
P:=List.Items;
List.Delete(I);

Dispose(P);


writeln(/' 刪除執行完畢。/');


writeln;


end;


end;


{ 處理使用者輸入的命令 }


function GetCommand:Boolean;


{ 返回False 表示退出 }


var C:Char;


begin


write(/' 輸入命令並回車:/');


readln(C);


result:=True;


case C of


/'V/',/'v/':Command_View;


/'A/',/'a/':Command_Add;


/'D/',/'d/':Command_Delete;


/'M/',/'m/':PrintMenu;


/'X/',/'x/':result:=False;


/'E/',/'e/':Command_Edit;


else writeln(/' 未知命令。/');


end;


end;


{ 從Info.txt 把人員資訊載入入Tlist }


procedure LoadInfo;


var I:Integer;


Name,Tel,Address,Index:String;


begin


SL.LoadFromFile(AppPath+/'Info.txt/');


for I:=0 to SL.Count div 3-1 do


begin


Index:=IntToStr(I)+/'./';


{ 檔案格式:Index.Field=Value


在這裡使用Index.X 區別不同序號的人員資訊的欄位名稱


然後通過Values 屬性讀取資訊 }


Name:=SL.Values[Index+/'Name/'];


Tel:=SL.Values[Index+/'Tel/'];


Address:=SL.Values[Index+/'Address/'];


List.Add(MakeInfo(Name,Tel,Address));


end;


end;


{ 把TList 裡的人員資訊儲存到Info.txt }


procedure SaveInfo;


var I:Integer;


P:PInfo;


begin


SL.Clear;{ 清空TstringList }


for I:=0 to List.Count-1 do


begin


P:=List.Items;


SL.Add(IntToStr(I)+/'.Name=/'+P^.Name);


SL.Add(IntToStr(I)+/'.Tel=/'+P^.Tel);


SL.Add(IntToStr(I)+/'.Address=/'+P^.Address);


end;


SL.SaveToFile(AppPath+/'Info.txt/');


end;


{ 初始化程式 }


procedure InitInfo;


begin


SL:=TstringList.Create;


List:=TList.Create;


{ 獲得本程式所在的路徑 }


AppPath:=ExtractFilePath(ParamStr(0));


end;


{ 清空程式使用的記憶體 }


procedure FinaInfo;


var I:Integer;


begin


for I:=0 to List.Count-1 do


Dispose(PInfo(List.Items));


List.Free;


SL.Free;


end;


begin


{ TODO -oUser -cConsole Main : Insert code here }


InitInfo;


LoadInfo;


writeln(/'Information Editor V1.0 by VCZH/');


PrintMenu;


while GetCommand do;{ 迴圈直到返回False }


SaveInfo;


FinaInfo;


writeln(/' 謝謝使用。請按回車鍵退出程式。/');


readln;


end.[/color]



在這個程式測試完畢(由於時間關係,並沒有執行嚴格的測試,所以一些小細節可能會沒有注意到,不過不會影響程式功能的正確性)時,Info.txt 的內容如下


在迴圈開始時,I 的值被指向0,然後Index的值就變成“0.”。在執行Name:=SL.Values[Index+/'Name/']時,就等於執行Name:=SL.Values[/'0.Name/']於是, “0.Name”這個欄位的內容就被讀取,然後Name 就變成了“vczh ”。接著進入下一個迴圈。程式就是通過在欄位前加“Index.”這樣的方法區別不同人員的資訊。在讀取完一個人的資訊後,程式執行List.Add(MakeInfo(Name,Tel,Address)),資訊便存放在List裡了。程式通過操作List 增加、刪除或修改人員資訊。在使用者退出程式時,程式將List裡的所有資訊儲存在“Info.txt”裡。過程是這樣的:程式先清空SL 裡的內容,然後按照Info.txt原來的檔案格式填寫資訊。因為Info.txt裡的人員數目是會改變的,因此便不能使用TstringList.Values屬性修改,而必須在清空TstringList後手動構建欄位並填寫資訊。


0.Name=vczh


0.Tel=1234567


0.Address=Jupiter


1.Name= 陳梓瀚


1.Tel=8888888


1.Address=Venus


2.Name=chenzihan


2.Tel=9999999


2.Address=Mars


3.Name=Victor


3.Tel=0000000


3.Address=Saturn


經過這樣的介紹,大家對Delphi 包含的與List,有相似性質的類都有了一定的認識。Delphi VCL 開發組為我們準備了這麼多既實用又有效率的功能。而List在龐大的Delphi VCL 裡只是滄海一粟。所以我們今後應當繼續研究Delphi VCL,充分利用 VCL,為自己的專案增添光輝。

相關推薦

Delphi TList

最近開發程式需要使用TList功能,轉載此文章,以作參考。 看了這裡標題,大家可能以為我會談TListBox控制元件,那就錯了。我要談的是Delphi提供給我們的具有列表性質的類:TstringList、TList和TObjectList。TstringList用來存放字

與其放在電腦裏占內存,還不如拿出來幫助一群白白html

ext one mar solid ul li lis class eight seo <!doctype html><html><head><meta charset="utf-8"><title>無標題文檔&l

與其放在電腦裏占內存,還不如拿出來幫助一群白白html之一

電腦 text htm document cal ngs all ply cti <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <t

與其放在電腦裏占內存,還不如拿出來幫助一群白白html

ext tco confirm char utf type lang html click <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8">

與其放在電腦裏占內存,還不如拿出來幫助一群白白html

var wid gin ack document type solid load ntb <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &

與其放在電腦裏占內存,還不如拿出來幫助一群白白html

mon one cli tle .get put cas true stc <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <titl

與其放在電腦裏占內存,還不如拿出來幫助一群白白html

cell pan adding rowspan add 歌曲 作者 ctype lsp <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &l

與其放在電腦裏占內存,還不如拿出來幫助一群白白html十一

dcl body window let ctype urn doctype 繼續 document <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><

程式入門(一)

      大家好,我是小編,這幾天自己學習了小程式,發現真的太爽了,以下是我寫下的筆記,希望給入門的盆友提供一些幫助吧。 app.js   用於監聽並處理小程式的生命週期函式,宣告全域性變數,呼叫框架,提供豐富的API 同步儲存:wx.setStorageSync()

Delphi容器類---Tlist,TStringlist,THashedStringlist的效率比較

本人在做一個測試,伺服器是IOCP的,我假定最大連線數是50000個。如果每個連結之間的資料需要伺服器中轉的話,那麼我需要一個數據容器儲存使用者的關鍵資料和連結。以上是測試背景。剛剛我簡單的做了一段簡單的程式碼,關鍵程式碼段如下:RTest = record    Key:

golang中json字串轉浮點數

有時會有這種需求,將一個json資料形如: {"x":"golang", "y":"520.1314"} 中的y反序列化為浮點型別,如果這樣寫: package main import ( "encoding/json" "fmt

Delphi容器類---TList、TStringList、TObjectList,以及一個例程的程式碼分析

  看了這裡標題,大家可能以為我會談TListBox控制元件,那就錯了。我要談的是Delphi提供給我們的具有列表性質的類:TStringList、TList和TObjectList。TStringList用來存放字串,TList存放指標,而TObjectList則存

python 甲魚教程 Easygui

重要 顯示錯誤 小甲魚 博客 str BE 表示 files enter 博客轉自 https://blog.csdn.net/bestallen/article/details/51933427 終於有點實質性可以看到摸到的界面了,搜了一下雖然easygu

【數學】kd 樹演算法思路(憂傷的兔子)

導語:kd 樹是一種二叉樹資料結構,可以用來進行高效的 kNN 計算。kd 樹演算法偏於複雜,本篇將先介紹以二叉樹的形式來記錄和索引空間的思路,以便讀者更輕鬆地理解 kd 樹。 圖較多,小心流量  作者:肖睿編輯:巨集觀經濟算命師本文由JoinQuant量化課堂推出,本文的難度屬於

yxy和志願者姐姐番外大寶寶123追番記(補題,淘汰賽)

1264: yxy和志願者小姐姐番外篇之大寶寶123追番記                                  

如何寫出一手好的程式多端架構

作為微信小程式底層 API 維護者之一,經歷了風風雨雨、各種各樣的吐槽。為了讓大家能更好的寫一手小程式,特地梳理一篇文章介紹。如果有什麼吐槽的地方,歡迎去 developers.weixin.qq.com/ 開發者社群吐槽。 PS: 老闆要找人,對自己有實力的前端er,可以直接發簡歷到我的郵箱:

白兩部落格熟練操作MyCQL 第二

  小白兩篇部落格熟練操作MyCQL  之   第二篇 一. 檢視   檢視是一個虛擬表,其本質是根據SQL語句獲取動態的資料集,併為其命名,使用者使用時只需使用名稱即可獲取結果集, 並可以將其當做表來使用. select * fro

初夏:記憶體管理常見記憶體錯誤(重點乾貨)

想來說說記憶體管理已經好長時間了,但是不知如何較好的表達。整理了幾天,來給大家分享這種底層問題。 學好C語言就要學好記憶體管理。那麼記憶體分為那幾個區呢? 先來說說記憶體中大致的這幾個區:棧區,堆區,全域性變數區,和程式碼區。 棧區:就是用來儲存區域性變數。棧上的

資料結構排序——選擇排序 //交換第i下標與最下標,只交換一次

首先在陣列的所有元素中找到一個最小的元素, 將該元素與陣列的第一個元素進行交換, 這樣交換之後,陣列的第一個元素就變成了陣列元素中的最小值,     再在除第一個元素外的其它陣列元素中,尋找最小的陣列元素,     將這個第二小的陣列元素與陣列

菜鳥江濤帶你學最物聯網系統模組(01)—— WIFI模組ESP12F初次親密接觸

最近想搞下物聯網相關的東西,淘寶上買了兩塊ESP12F的WiFi模組,於是大張旗鼓(偷偷摸摸)的搞起來,自己每天的學習進度在部落格上做個記錄,也給有類似想法的同學一個踩坑避雷的借鑑,大家共同進步,好了,閒話不多說,開始進入正題。 1.WIFI模組ESP12F的初次親密接觸。