ورود

View Full Version : تبدیل مجموعه کاراکتر به آرایه



hamid_isf_1360
یک شنبه 29 خرداد 1390, 14:53 عصر
با سلام خدمت دوستان

چطور می تونم مقدار زیر را داخل یک آرایه بریزم

CharSet:= (['@',':','{','}','،','»','«','*','"','-','!','(',')','A'..'Z']);
با توجه به کرانه های حروف a to z

یوسف زالی
یک شنبه 29 خرداد 1390, 16:18 عصر
سلام.


for i := 32 to 255 do
if chr(i) in CharSet then
insert into array

Felony
یک شنبه 29 خرداد 1390, 16:28 عصر
var
Ch: char;
ChrArray: Array of String;
begin
for Ch in CharSet do
begin
SetLength(ChrArray, Length(ChrArray) + 1);
ChrArray[Length(ChrArray) - 1] := Ch;
end;
end;

vcldeveloper
یک شنبه 29 خرداد 1390, 21:27 عصر
var
Ch: char;
ChrArray: Array of String;
begin
for Ch in CharSet do
begin
SetLength(ChrArray, Length(ChrArray) + 1);
ChrArray[Length(ChrArray) - 1] := Ch;
end;
end;


این کد جالبی نیست، چون اولا داره از array of string استفاده میکنه در حالی که باید array of char باشه. از طرف دیگه، داره در یک حلقه مرتبا اندازه آرایه رو تغییر میده، که این کار باعث میشه با اضافه شدن هر کارکتر، کل آرایه به محل جدیدی از حافظه کپی بشه، و یک خانه بهش اضافه بشه؛ که این یعنی سربار بسیار بالا!


کد زیر بهتره، البته می تونید به جای AnsiString از array of AnsiChar هم استفاده کنید:


var
Charset : set of AnsiChar;
Ch: AnsiChar;
ChrArray: AnsiString;
i: Integer;
begin
CharSet:= (['@',':','{','}','،','»','«','*','"','-','!','(',')','A'..'Z']);

SetLength(ChrArray, SizeOf(Charset) * 8);
FillChar(ChrArray[1],Length(ChrArray),0);

i := 0;
for Ch in CharSet do
begin
Inc(i);
ChrArray[i] := Ch;
end;

end;


این کد فضای مورد نیاز برای آرایه رو یک بار دریافت میکنه، و بعد از اون آرایه رو تغییر سایز نمیده. در ضمن، از AnsiChar استفاده شده، چون مجموع های کارکتری در دلفی نمی تونند یونیکد باشند، و استفاده از Char باعث تبدیل نوع های غیر ضروری میشه.

Felony
یک شنبه 29 خرداد 1390, 21:46 عصر
کد زیر بهتره
میدونستم اون کد کارائی پائینی داره ولی نمیدونستم چه طور سایز یک Set رو به دست بیارم و به یک باره سایز آرایه رو تعیین کنم ، اصلا حواسم نبود که SizeOf رو امتحان کنم ؛ ممنون .

vcldeveloper
دوشنبه 30 خرداد 1390, 03:47 صبح
میدونستم اون کد کارائی پائینی داره ولی نمیدونستم چه طور سایز یک Set رو به دست بیارم و به یک باره سایز آرایه رو تعیین کنم ، اصلا حواسم نبود که SizeOf رو امتحان کنم
سایز Set همیشه ثابته (32 بایت). من در اونجا از SizeOf استفاده کردم که اگر روزی روزگاری، محدودیت 256 عضوی set ها در دلفی برداشته شد، هم اون کد کار کنه.