PDA

View Full Version : خروجی تابع = آرایه ای از TObject



کامروا
سه شنبه 26 دی 1391, 23:02 عصر
سلام

میخوام تابع، آرایه ای از TObject را به خروجی بفرستد.

type
TCustomersList = Array of TCustomers;
و
تعریف تابع :
function TOperations.setShiftRight(Queue: TCustomersList):TCustomersList;
var
index : Integer;
begin
for index := 0 to Length(Queue) - 1 do
Result[index] := Queue[index];
end;

و Call کردن تابع :
for i := 0 to Length(Queue1) - 1 do
Queue1[i] := setShiftRight(Queue1);


اما خطای کامپایلر دارم :
Incompatible types: 'Operations.TCustomersList' and 'Main.TCustomersList'

ممنون میشم راهنمایی کنید.

Ananas
چهارشنبه 27 دی 1391, 00:03 صبح
السلام علیکم.
یک عضو آرایه رو دارید با آرایه ای از اون نوع مقدار دهی می کنید. تو قسمت :

for i := 0 to Length(Queue1) - 1 do
Queue1[i] := setShiftRight(Queue1);


در ضمن داخل تابع setShiftRight برای Result اندازه تعیین نکردید با SetLength.

کامروا
چهارشنبه 27 دی 1391, 00:09 صبح
ممنون

تابع کامل setShiftRight :
function TOperations.setShiftRight(Queue: TCustomersList):TCustomersList;
var
index : Integer;
begin
for index := 0 to Length(Queue) - 2 do
begin
Queue[index + 1] := Queue[index];
end;
Queue[0] := nil;
SetLength(Result,Length(Queue));
for index := 0 to Length(Queue) - 1 do
Result[index] := Queue[index];
end;



یک عضو آرایه رو دارید با آرایه ای از اون نوع مقدار دهی می کنید. تو قسمت :
for i := 0 to Length(Queue1) - 1 do
Queue1[i] := setShiftRight(Queue1);


باید به چه شکل بنویسم؟

اینطوری هم جواب نمیده :
Queue1 := check.setShiftRight(Queue1);

Ananas
چهارشنبه 27 دی 1391, 23:29 عصر
چند تا مطلب هست که به نظرم جای بحث داره:
اول اینکه مقدار دهی آرایه به این شکل که سمت چپ تساوی یک متغیر از نوع آرایه بنویسید و سمت راست هم متغیر آرایه ای دیگه یکمی مبهم هست. برای چی این کار رو میکنید؟ آرایه یک متغیر ساده نیست. شما چه نتیجه ای رو می خواید ازین کار بگیرید؟ ممکنه فرق کنه که شما آرایه ای از چه نوعی رو داشته باشید. شاید لازم باشه از تابع Copy استفاده کنید. شایدم تک تک عناصر آرایه رو کپی کنید بسته به انتظاری که از این مقدار دهی دارید و همچنین نوع این آرایه ها.
دوم اینکه آرایه های دلفی یا همون DynamicArray با آرایه ای که با اشاره گر ساخته میشه فرق داره و فرستادنشون به تابع و برگردوندن اونها به عنوان خروجی با متغیر های معمولی مثل Integer متفاوته و انجامش هم یکمی عجیب و مبهم به نظر میاد. (یک کپی از آرایه رو به تابع میفرستیم؟ یا آدرسشو؟ یا آدرس اولین عضوشو؟ یا چی؟ اون هم به چه منظور؟ برای فقط خوندن یا هم خوندن هم نوشتن؟)
سوم اینکه این حرکت :

for index := 0 to Length(Queue) - 2 do
begin
Queue[index + 1] := Queue[index];
end;

از اول به آخر هست که به نظر میرسه باید از آخر به اول باشه.
و اما این یکی :
for i := 0 to Length(Queue1) - 1 do
Queue1[i] := setShiftRight(Queue1);


اگه [i] رو حذف کنید (که در کد بعدی تون همین کار رو کردید) باید ایراد نگیره ولی اینکه منظور شما رو درست انجام میده یا نه نمی دونم:

اینطوری هم جواب نمیده :
1
Queue1 := check.setShiftRight(Queue1);

ارور میده؟ یا کار درستی انجام نمیده؟
در کل به فرستادن DynamicArray به تابع و تغییر سایز اون اعتماد ندارم. DynamicArray توسط دلفی کنترل و مدیریت میشه و آزاد سازی حافظه ی اون ممکنه بعد از اجرای تابع دلیل ارور باشه.
اما توصیه ی بنده : فرستادن آرایه ها به تابع و گرفتن اونها و تغییر سایز و خلاصه این عملیات ها میتونه تو یک کلاس انجام بشه که احتمال ارور کمتر بشه و شما اون کلاس رو که آرایه داخلش هست رو به تابع می فرستید.
این در صورتیه که کار با اشاره گر براتون مشکل باشه یا حتما بخواید از DynamicArray استفاده کنید وگرنه استفاده از اشاره گر و فرستادن اون به تابع خیلی راحت و خوب هست و اصولی به شرطی که به اشاره گر تسلط داشته باشید و بدونید دارید چه می کنید یعنی کلا آرایه رو با اشاره گر بسازید و خودتون آزاد کنید و به تابع بفرستید و ... فرستادن این آرایه به تابع ساده تر هست.

یوسف زالی
پنج شنبه 28 دی 1391, 05:24 صبح
سلام.
به جاش یک شی از TList رو بفرستید.
این اشیا آدرس های یک لیست از اشیا رو می تونن نگه دارن. جالب اینه که می تونید اشیای مختلطی رو باهاش ارسال کنید و لزومی به یکسان بودن انواع اونها نیست!
به نوعی فقط یک اشاره گر فرستاده می شه. از اونجایی که شی هست مقادیر درونش هم قابلیت تغییر رو در مقصد داره. یعنی به فرم ارجاع فرستاده می شه.
اشکال بوجود اومده هم برای این هست که می باید هر دو تعریف آرایتون از یک سرچشمه باشند. شما احتمالا یک تعریف نوع هم در کلاس دارید که دقیقا مثل تعریف نوع اون در یونیت هست.