PDA

View Full Version : initialize برای متغیر ها



mortezakiaee
پنج شنبه 23 آبان 1387, 11:11 صبح
کسی میتونه در مورد initialize کردن متغیر ها توضیح بده؟ راهنمای دلفی برای من زیاد مفهوم نبود


Initializes a dynamically allocated variable.

Unit

System

Category

dynamic allocation routines

Delphi syntax:

procedure Initialize(var V [ ; Count: Integer ] );

Description

Initialize should be used only in Delphi code where a variable is dynamically allocated by other means than the New standard procedure.

For global variables, local variables, objects, and dynamic variables allocated using New, the compiler generates code that initializes all long strings and variants contained by a variable upon creation of the variable. A call to Initialize is required to initialize a variable before it can be used if

The dynamic variable is created by other means than the New standard function (for example using GetMem or ReallocMem).
The variable contains long strings, variants, or interfaces.
The memory allocated for the variable is not initialized to zeros.

Initialize simply zeros out the memory occupied by long strings, variants, and interfaces, causing long strings to be empty and variants and interfaces to be Unassigned.

In cases where several variables are allocated in a contiguous memory block, the additional Count parameter can be specified to initialize all variables in one operation.

If the variable specified in a call to Initialize contains no long strings, variants, or interfaces, the compiler eliminates the call and generates no code for it.

vcldeveloper
پنج شنبه 23 آبان 1387, 17:34 عصر
این Initialize کردن برای متغیرهای عادی دلفی نیست. بجاش می تونید از FillChar یا ZeroMemory هم استفاده کنید.

بهتر هست دقیقا بگید چه چیزی را می خواید Initialize کنید، شاید اصلا به این کار نیاز نداشته باشید.

mortezakiaee
شنبه 25 آبان 1387, 09:18 صبح
من چند جا تو برنامه این hint رو میگیرم variable .... may not been initialize یکی رو یه متغیر که درواقع یه pointer به برنامه وردی هستش که از تو برنامه باز می کنم. یه جای دیگه یه متغیر از نوع tstringlist تو runtime ایجاد میکنم. البته هیچ مشکلی نداره و برنامه اجرا می شه و کار می کنه ولی موقع debug این hint مرتب میاد

Hamid_PaK
شنبه 25 آبان 1387, 20:36 عصر
دلفی در خیلی از موارد در صورتی که تصور کند در قسمتی از دستورات شما حالتی به وجود آمده که مقدار دهی اولیه متغییر فراموش شده و یا در یک شرایطی غیر فعال شده این پیغام را می دهد، در همه ی موارد اشکال از نوع کد نویسیست.

یا حق ...

vcldeveloper
شنبه 25 آبان 1387, 23:17 عصر
علت ایجاد اون Hint ربطی به تابع Initialize نداره، بلکه منظور دلفی این هست که در مسیرهای مختلفی که برای اجرای کد شما وجود داره، حالتی موجود هست که در اون ممکن هست متغیر مورد نظر درست مقداردهی اولیه نشده باشه. اینها در واقع خطاهای بالقوه هستند، نه بالفعل. ممکن هست برنامه در شرایط عادی درست کار کنه، ولی در کدی که نوشته شده، حالتی هم وجود داره که اگر اتفاق بیافته، منجر به خطا میشه. برای همین هم دلفی بهتون یادآوری میکنه تا حواستون جمع باشه. مثلا اگر شما تابعی داشته باشید که عددی را بر می گرداند، و فرضا کدی مثل این نوشته باشید:


function Test(X: integer): integer;
begin
if X = 0 then
Result := 1
else
if X = 1 then
Result := 2;
end;
دلفی به شما هشدار میده که ممکن هست مقدار برگشتی تابع غیرمعتبر باشه، چون برای این کد سه حالت اجرا وجود داره:
1- X = 0 باشه که خروجی مساوی 1 هست.
2- X = 1 باشه که خروجی مساوی 2 هست.
3- X نه صفر باشه، نه یک، در این حالت برنامه نویس هیچ خروجی برای تابع تعریف نکرده، پس مقدار برگشتی غیرمنتظره هست، و میتونه غیر معتبر باشه. برای رفع همچین مشکلی، برنامه نویس میتونه یک شرط else هم به آخر ifها اضافه کنه تا کدش همه شرایط را در بر بگیره.

اگر روی خود پیام تذکر کلیک می کردید، و کلید F1 را میزدید، دلفی علت آن را با ارائه نمونه سورس کد برایتان توضیح میداد.

mortezakiaee
یک شنبه 26 آبان 1387, 10:08 صبح
ممنون. اما من به شکل زیر کد رو مینویسم


var: templist:Tstringlist;
begin
try
templist:=Tstringlist.create;
templist.assign(*somethings*)
...
finally
templist.free;
end;
end;

مشکل این کد رو توضیح میدین؟ من فکر می کنم به محض ایجاد متغیر بهش مقدار هم میدم.

vcldeveloper
یک شنبه 26 آبان 1387, 16:41 عصر
مشکلش این هست که TempList در داخل همون بلوک Try-Finally که در آن Free میشه، Create میشه. یعنی اگر Create آن با شکست مواجه بشه هم، کد templist.Free اجرا میشه. باید می نوشتید:


var:
templist:Tstringlist;
begin
templist:=Tstringlist.create;
try
templist.assign(*somethings*)
...
finally
templist.free;
end;
end;