PDA

View Full Version : ساختن یک " نوع " جدید در c,c++



alireza es
جمعه 10 آبان 1392, 21:49 عصر
با عرض سلام اگه دلفی کار کرده باشید میدونید که با این دستور میشه یه نوع جدید تعریف کرد
type xxx = 0 .. 10000000
توی مثال بالا دلفی یه نوع جدید در نظر میگیره و و میتونیم ازش استفاده کنیم حالا معادل دستور بالا در c++ چیه؟؟

rahnema1
جمعه 10 آبان 1392, 23:06 عصر
از typedef استفاده کنید

FastCode
جمعه 10 آبان 1392, 23:38 عصر
تیتر سوالتون رو در پست قبلی پاسخ دادن.
پاسخ متن سوالتون میشه این:
http://www.eng.cam.ac.uk/help/tpl/languages/C++/buildingclasses2.html
اگر خود سوال چیز دیگه ای هست دوباره بپرسید.

alireza es
شنبه 11 آبان 1392, 14:49 عصر
از typedef استفاده کنید
میشه بیشتر توضیح بدین ؟


تیتر سوالتون رو در پست قبلی پاسخ دادن.
پاسخ متن سوالتون میشه این:
http://www.eng.cam.ac.uk/help/tpl/languages/C++/buildingclasses2.html
اگر خود سوال چیز دیگه ای هست دوباره بپرسید.

ببخشید ارور Page not found میده

rahnema1
شنبه 11 آبان 1392, 15:04 عصر
من نمی دونم در چه سطحی باید بگم شما بگو واسه چی می خواهی تا متناسب با مورد شما جواب بدم
وگرنه اگه توی گوگل هم بزنید میاد

Ananas
شنبه 11 آبان 1392, 15:17 عصر
سلام.
این یک یونیت پاسکال هست:

unit Unit2;

interface
type
TBIT_0_1 = 0..1;
TBIT_0_10 = 0..10;
TBIT_0_100 = 0..100;
TBIT_0_1000 = 0..1000;
TBIT_0_10000 = 0..10000;
TBIT_0_100000 = 0..100000;
TBIT_0_1000000 = 0..1000000;
TBIT_0_10000000 = 0..10000000;
TBIT_0_100000000 = 0..100000000;
TBIT_0_1000000000 = 0..1000000000;
TBIT_0_10000000000 = 0..10000000000;
TBIT_0_100000000000 = 0..100000000000;
TBIT_0_1000000000000 = 0..1000000000000;
TBIT_0_10000000000000 = 0..10000000000000;
TBIT_0_100000000000000 = 0..100000000000000;
TBIT_0_1000000000000000 = 0..1000000000000000;
TBIT_0_10000000000000000 = 0..10000000000000000;
TBIT_0_100000000000000000 = 0..100000000000000000;
TBIT_0_1000000000000000000 = 0..1000000000000000000;
implementation

end.


حالا C++Builder به شکل زیر همین متغیر ها رو از روی این یونیت تعریف میکنه:

typedef System::Int8 TBIT_0_1;
typedef System::Int8 TBIT_0_10;
typedef System::Int8 TBIT_0_100;
typedef System::Word TBIT_0_1000;
typedef System::Word TBIT_0_10000;
typedef int TBIT_0_100000;
typedef int TBIT_0_1000000;
typedef int TBIT_0_10000000;
typedef int TBIT_0_100000000;
typedef int TBIT_0_1000000000;
typedef __int64 TBIT_0_10000000000;
typedef __int64 TBIT_0_100000000000;
typedef __int64 TBIT_0_1000000000000;
typedef __int64 TBIT_0_10000000000000;
typedef __int64 TBIT_0_100000000000000;
typedef __int64 TBIT_0_1000000000000000;
typedef __int64 TBIT_0_10000000000000000;
typedef __int64 TBIT_0_100000000000000000;
typedef __int64 TBIT_0_1000000000000000000;

که چند خط اول وابسته به دلفی هست. اما به شکل زیر میشه تعریف کرد که وابسته به دلفی نباشه و در کامپایلرهای مختلف اجرا شه:

typedef __int8 TBIT_0_1;
typedef __int8 TBIT_0_10;
typedef __int8 TBIT_0_100;
typedef __int16 TBIT_0_1000;
typedef __int16 TBIT_0_10000;
typedef __int32 TBIT_0_100000;
typedef __int32 TBIT_0_1000000;
typedef __int32 TBIT_0_10000000;
typedef __int32 TBIT_0_100000000;
typedef __int32 TBIT_0_1000000000;
typedef __int64 TBIT_0_10000000000;
typedef __int64 TBIT_0_100000000000;
typedef __int64 TBIT_0_1000000000000;
typedef __int64 TBIT_0_10000000000000;
typedef __int64 TBIT_0_100000000000000;
typedef __int64 TBIT_0_1000000000000000;
typedef __int64 TBIT_0_10000000000000000;
typedef __int64 TBIT_0_100000000000000000;
typedef __int64 TBIT_0_1000000000000000000;

FastCode
شنبه 11 آبان 1392, 18:22 عصر
میتونم بپرسم محدودیت دقیقا کجا اعمال شده؟

sh4mid
شنبه 11 آبان 1392, 20:08 عصر
سلام اگه فقط می خوای یه نام جدید برای یه نوع درست کنی می تونی از typedef (http://www.cplusplus.com/doc/tutorial/other_data_types/) استفاده کنی مثلا
typedef unsigned int WORD;
مشکلش اینه که واقعا فرقی بین WORD و unsigned int نیست ، اما اگه بخوای یه جورایی یه نوع جدید رو شبیه سازی کنی میتونی از BOOST_STRONG_TYPEDEF (http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/strong_typedef.html) استفاده کنی ، کار خاصی هم نمیکنه یه ماکروه که یه کلاس جدید میسازه یا خودت یکی بسازی

UfnCod3r
شنبه 11 آبان 1392, 20:12 عصر
محدودیت نیست فقط الکی لقهمه رو چند صد بار دور خودشون چرخوندن بعد گذاشتن دهن .

typedef __int8 TBIT_0_1;
typedef __int8 TBIT_0_10;
typedef __int8 TBIT_0_100;
typedef __int16 TBIT_0_1000;
typedef __int16 TBIT_0_10000;
typedef __int32 TBIT_0_100000;
typedef __int32 TBIT_0_1000000;
typedef __int32 TBIT_0_10000000;
typedef __int32 TBIT_0_100000000;
typedef __int32 TBIT_0_1000000000;
typedef __int64 TBIT_0_10000000000;
typedef __int64 TBIT_0_100000000000;
typedef __int64 TBIT_0_1000000000000;
typedef __int64 TBIT_0_10000000000000;
typedef __int64 TBIT_0_100000000000000;
typedef __int64 TBIT_0_1000000000000000;
typedef __int64 TBIT_0_10000000000000000;
typedef __int64 TBIT_0_100000000000000000;
typedef __int64 TBIT_0_1000000000000000000;


این چه وضعشه الان:قهقهه:
سوالتو خوب نرسیدی.
برا تعریف نوع داده ای جدید می تونی ی کلاس جدید درست کنی و بعد هم اپراتو های = و .. رو براش بنویسی .
هرکاری می شه کرد.

FastCode
شنبه 11 آبان 1392, 23:02 عصر
میشه بیشتر توضیح بدین ؟



ببخشید ارور Page not found میده
معذرت میخوام.

لینک درست:
http://www.eng.cam.ac.uk/help/tpl/languages/C++/buildingclasses2.html

Ananas
یک شنبه 12 آبان 1392, 13:55 عصر
میتونم بپرسم محدودیت دقیقا کجا اعمال شده؟این محدودیتیه که دلفی حین کامپایل میگذاره وگرنه واقعا محدودیت زمان اجرا نیست و زبان C++‎‎ هم فرق داره. ایشون سوال کرد که معادل کدشون تو C++‎‎ چی میشه؟ منم چیزی رو نوشتم که خود دلفی نوشته! وقتی یک فایل pas رو به پروژه ی C++‎‎ اضافه میکنید C++‎‎builder به طور خودکار یک فایل با همون نام و پسوند hpp میسازه و کد لازم رو توش مینویسه که من از اونجا کپی کردم. اصلا شما نمیتونید متغیری تعریف کنید که تعداد بیتهاش به 8 بخش پذیر نباشه! فضا گرفته میشه به هر حال. اگر میخاید محدودیت بگذارید موقع مقدار دهی، میتونید از یک تابع استفاده کنید تا با یک if چک کنه که تو اون محدوده هست یا نه.
کد زیر تو دلفی نشون میده که حافظه گرفته شده چهار بایته و مقداردهی خارج از رنج هم میشه کرد حتی :

procedure TForm1.FormCreate(Sender: TObject);
type
xxx = 0..10000000;
var
x : xxx;
begin
PDWORD(@x)^ := 1000000023 ;
ShowMessage(
IntToStr(x) + ' size : ' +
IntToStr(SizeOf(x)));

end;

خروجی:


1000000023 size : 4

FastCode
یک شنبه 12 آبان 1392, 15:05 عصر
موضوع تعداد بیت نیست.موضوع محدودیته و ظاهرا من توی پستی که دادم جادو کردم.چون به هیچ عنوان نمیتونید دورش بزنید.