PDA

View Full Version : سوال در مورد آرایه؟



mbshareat
پنج شنبه 02 مهر 1388, 23:37 عصر
1.آیا می شه یه جوری آرایه رو یه باره مقدار دهی کرد(من نتونستم داخل قلاب مقادیر رو بذارم و یه باره انتساب انجام بدم)؟:بامزه:
2.آیا می شه آرایه پویا به عنوان پارا متر به تابع فرستاد تا دستکاری بشه؟:متفکر:
من که نتونستم آرایه رو به صورت Var بدون تعیین اندازه بفرستم به تابع.(اولش فکر می کردم حتی بدون Var هم نمی شه ولی یه آرایه از نوع TPoint رو هم تونستم برای تابع ارسال کنم!:لبخند:)

AliReza Vafakhah
جمعه 03 مهر 1388, 00:32 صبح
2.آیا می شه آرایه پویا به عنوان پارا متر به تابع فرستاد تا دستکاری بشه؟

به این مثال نگاه کن ببین همین که می خوای

تعریف

procedure Ts(var P:array of string);

فرخوانی

procedure TForm1.Button1Click(Sender: TObject);
var
P:array[0..1] of string;
begin
p[0]:='B';
Ts(p);
ShowMessage(p[0]);
end;

procedure TForm1.Ts(var P: array of string);
begin
p[0]:='A';
end;

نتیجه میشه نمایش کاراکتر A
سوال 1 هم رو که من درست متوجه نشدم ولی فکر کنم شما می خواهید مثل C++‎ مقدار دهی اولیه در تعریف آرایه رو انجام یدید ، درسته ؟

mbshareat
جمعه 03 مهر 1388, 00:53 صبح
منظورم این بود که آرایه رو در رویداد کلیک به صورت
P:array of string;:بامزه:
تعریف کنین.من می خوام یه آرایه خروجی بدون اندازه داشته باشم تا خودم مقدار توش بریزم!:لبخند:
منظورم از سوال اول هم این بود که همونطور که می شه آرایه رو به صورت Const یه باره مقداردهی کرد به صورت متغیر هم بشه!(به نظرم توی Help خونده بودم که نمی شه!:ناراحت:)

vcldeveloper
جمعه 03 مهر 1388, 01:00 صبح
.آیا می شه یه جوری آرایه رو یه باره مقدار دهی کرد(من نتونستم داخل قلاب مقادیر رو بذارم و یه باره انتساب انجام بدم)؟
FillMemory(@MyArray[0],Length(MyArray),0);
البته اگر آرایه پویا نیست، نیازی به [0] نیست.

mbshareat
جمعه 03 مهر 1388, 01:24 صبح
منظورم از مقدار دهی یکباره چیزی مثل این است:
Var
P:Array Of TPoint;
Begin
P:=[Point(0,0),Point(10,0)];

آقای کشاورز لطفا بفرمایید چطور از این دستور استفاده کنم.:متفکر:
فرض کنین من می خوام یه آرایه خالی از نوع پویا و بدون اندازه به پروسیجر بدم و در پروسیجر توی آرایه که از نوع Var یا Out به پروسیجر فرستادم، مقادیر را بریزم و تو یه پارامتر دیگه هم تعداد رو بریزم!:لبخند:
(اگه راستشو بخواین برای برنامه ای که پیکسلهای توی چند ضلعی رو بر می گردونه چنین مشکلی داشتم!:بامزه:)

vcldeveloper
جمعه 03 مهر 1388, 12:29 عصر
منظورم از مقدار دهی یکباره چیزی مثل این است
آخه اینی که شما نوشتید، معنی نداره. شما یک آرایه تک بعدی تعریف کردید، ولی کدی که نوشتید، اگر هم میشد همچین کدی نوشت، یک آرایه دو بعدی را مقداردهی میکنه!

mbshareat
جمعه 03 مهر 1388, 23:27 عصر
TPoint هم بالاخره یه نوع داده است ولی دو عدد رو نگه می داره!

vcldeveloper
شنبه 04 مهر 1388, 01:13 صبح
TPoint هم بالاخره یه نوع داده است ولی دو عدد رو نگه می داره!
بله، ولی کدی که شما به عنوان مثال نوشتید، 4 عدد را در هر خانه آرایه قرار میده، یعنی دو Tpoint در هر خانه، در حالی که آرایه ایی که تعریف کردید، یک بعد بیشتر نداره، و در هر خانه فقط میتونه یک Tpoint داشته باشه.

mbshareat
شنبه 04 مهر 1388, 11:17 صبح
جناب آقای کشاورز دوست ارجمند از حرفهاتان کم کم دارم به خودم! شک می کنم.:گیج:
فرض کنین من بخوام یه منحنی ترسیم کنم برای ارسال نقاط لنگر منحنی یا نقاط لنگر چند ضلعی می تونم یه آرایه رو به عنوان پارامتر بفرستم یا از ساختار
[Point(n,m),Point(x,Y),...,نقاط بعدی]
استفاده کنم و آرایه تک بعدی خواهد ماند!(من فکر می کنم توی Help مثال ترسیم چند ضلعی رو هم اینطوری آورده!:قهقهه:)

vcldeveloper
شنبه 04 مهر 1388, 15:39 عصر
استفاده کنم و آرایه تک بعدی خواهد ماند!(من فکر می کنم توی Help مثال ترسیم چند ضلعی رو هم اینطوری آورده!:قهقهه:)
فرق مثال پست شماره 9 با پست شماره 5 در اون سه نقطه ایی هست که فراموش کردید بزارید!

توی دلفی برای مقداردهی اولیه به یک آرایه Static از Syntax زیر استفاده میشه:

Arr : array [0..10] of Integer = (0,1,2,3,..,10);

اون برای آرایه Static بود. آرایه Dynamic در زمان تعریف هنوز طولش مشخص نیست. در زمان اجرا، بعد از اینکه طول آرایه مشخص شد، اگر نوع داده اش ساده باشه، با همون FillMemory میشه به همه آنها یکجا یک مقدار مشخص داد.

در مورد شما، آرایه Dynamic هست، نوع داده هم ساده نیست، بلکه Record هست. پس باید به تک تک اونها جداگانه مقدار بدید.

vcldeveloper
جمعه 10 مهر 1388, 13:19 عصر
منظورم از مقدار دهی یکباره چیزی مثل این استمتوجه شدم که در دلفی 2009 و 2010 می تونید کدی مثل این بنویسید:

var
Arr : TArray<TPoint>;

procedure Test;
var
P : TPoint;
begin
Arr := TArray<TPoint>.Create(Point(0,0), Point(1,1), Point(2,1));
for P in Arr do
Writeln(P.X,', ', P.Y);
end;

نوع داده TArray که Generic باشه، به این شکل در دلفی 2009 وجود نداره، پس در دلفی 2009 باید این را قبل از var اضافه کنید:
type
TArray<T> = array of T;

البته می تونید بدون استفاده از Generics ، و با استفاده از آرایه پویای معمولی هم بنویسید، به این صورت:

type
TMyArray = array of TPoint;
var
MyArr : TMyArray;

procedure Test;
var
P : TPoint;
begin
MyArr := TMyArray.Create(Point(0,0), Point(1,1), Point(2,1));
for P in MyArr do
Writeln(P.X,', ', P.Y);
end;