پیشرفت ساخت آپادانا 2

the_king

مدیرکل انجمن
خوشحالم :دی
دقیقاً!!! اتفاقاً همین 1 ساعت پیش داشتم به همین فکر می کردم که از یک شروع بشه یا صفر که با پژمان که حرف زدم نتیجه گرفتیم که از 1 شروع بشه.

ساختار رشته ها به مدل shortstring ئه Pascal/Delphi ئه که طول رشته در حافظه قبل از خود رشته ثبت میشه؟

shortstring_layout.gif


اگه اندیس 1 رو برای شروع در نظر بگیرید، مقداری که در اندیس 0 ثبت میشه طول رشته رو مشخص می کنه؟
کد:
$str = 'Javid'
$str[0] = 2

Result :
Ja
 

JavidX

Apadana Developer
ساختار رشته ها به مدل shortstring ئه Pascal/Delphi ئه که طول رشته در حافظه قبل از خود رشته ثبت میشه؟

shortstring_layout.gif


اگه اندیس 1 رو برای شروع در نظر بگیرید، مقداری که در اندیس 0 ثبت میشه طول رشته رو مشخص می کنه؟
کد:
$str = 'Javid'
$str[0] = 2

Result :
Ja
بله تو پاسکال و دلفی طول رشته قبل از اولین حرف رشته ذخیره میشه. البته تو تصویری که شما گذاشتید به پاسکال بیشتر میخوره تا دلفی.
توی آپادانا نمیتونید به اندیس های خارج از محدوده دسترسی پیدا کنید. آ2 قراره مشکلات حافظه که توی برنامه نویسی های بزرگ در صورت بی دقتی پیش میاد رو کامل حل کنه. چه نشتی حافظه و هر چیز دیگه. برای همین بعضی چیزا محدود میشه. توی آ2 اگه اندیس داده شده خارج از محدوده بود ارور میده. بنابراین برای فهمیدن سایز از همون String.Length استفاده می کنیم.
مثالتون هم به این شکل در میاد:
کد:
$str = String.Copy($str,1,2)
 
آخرین ویرایش:

JavidX

Apadana Developer
قسمت باقیمونده از ایندکس ها یعنی مقدار دهی هم تموم شد. الان کد زیر به درستی اجرا میشه:
کد:
Private $str
$str = 'navid2'
$str[$str[6]-1]='J'

Result:
Javid2

قسمت بعدی آرایه ها هستند. دیگه نیاز نیست نگران ایندکس ها باشم و با خیال راحت روی آرایه ها کار میکنم!
موفق و پیروز باشید
 

JavidX

Apadana Developer
سلام دوستان عزیز

قسمت عددی آرایه ها تموم شد، حالا میمونه آرایه های رشته ای. چیز جالبی شد.

این کد رو اگه به برنامه بدید:
کد:
$arr[1,2,3,4]='str'
$arr[1,2][5]=123
$arr[2]=True
Dialog.message($arr)
نتیجه ای که داخل یک مسیج باکس نشون داده میشه:
کد:
[COLOR=#ff0000][B] Arra[/B][/COLOR][B][COLOR=#ff0000]y(1->[/COLOR][/B][COLOR=#ff0000][/COLOR][COLOR=#0000cd]Array([/COLOR][COLOR=#0000ff]2->[/COLOR][COLOR=#ff8c00]Array(3->[/COLOR][COLOR=#000000][B]Array(4->str)[/B][/COLOR][COLOR=#ff8c00], 5->123[/COLOR][B][COLOR=#ff8c00])[/COLOR][/B][COLOR=#0000cd])[/COLOR][COLOR=#ff0000][B], 2->True)[/B][/COLOR]

نکته ای که فکر کنم قبلا هم گفتم اینه که چه شما بین ایندکسهای آرایه های چند بعدیتون کاما بذارید چه ][ فرقی نداره.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام دوستان عزیز

قسمت عددی آرایه ها تموم شد، حالا میمونه آرایه های رشته ای. چیز جالبی شد.

این کد رو اگه به برنامه بدید:
کد:
$arr[1,2,3,4]='str'
$arr[1,2][5]=123
$arr[2]=True
Dialog.message($arr)
نتیجه ای که داخل یک مسیج باکس نشون داده میشه:
کد:
[COLOR=#ff0000][B] Arra[/B][/COLOR][B][COLOR=#ff0000]y(1->[/COLOR][/B][COLOR=#ff0000][/COLOR][COLOR=#0000cd]Array([/COLOR][COLOR=#0000ff]2->[/COLOR][COLOR=#ff8c00]Array(3->[/COLOR][COLOR=#000000][B]Array(4->str)[/B][/COLOR][COLOR=#ff8c00], 5->123[/COLOR][B][COLOR=#ff8c00])[/COLOR][/B][COLOR=#0000cd])[/COLOR][COLOR=#ff0000][B], 2->True)[/B][/COLOR]

نکته ای که فکر کنم قبلا هم گفتم اینه که چه شما بین ایندکسهای آرایه های چند بعدیتون کاما بذارید چه ][ فرقی نداره.

اگه درست متوجه شده باشم 'str[1,2,3,4]='str$ یعنی str$ یک آرایه چهار بعدی (یا پنج بعدی، چون 'str' خودش یک آرایه ئه) است،
که در خونه ای از این آرایه رشته str قرار گرفته که معادل 'str[1][2][3][4]='str$ هم هست.
ظاهرا مقدار دهی یک اندیس از آرایه به مفهوم تعریف ابعاد کل آرایه نیست، چون str[2]=true$ هم معتبره. چند تا نکته مبهم هست :
1) حالا [str[1 $ می تونه مستقلا وجود داشته باشه و مقدار دهی بشه یا همون (((Array(2->Array(3->Array(4->str است و اگه مقدار دهی بشه آرایه قبلی از بین رفته؟
2) اگه [str[2,1 $ مقدار دهی بشه، تناقضی با [str[2 $ که قبلا مقدار دهی شده نداره و هر دو سر جاشون هستند؟ اگه جواب مثبته و [str[2 $ هم یک رشته بود [str[2,1 $ کاراکتر اول
رشته قبلی است یا مقدار داخل آرایه ای که بعدا مقدار دهی شده؟
3) رشته آرایه حساب میشه، پس الان [str[1,2,3,4,2 $ یا همون [str[1][2][3][4][2 $ برابر t است؟ [str[2,2 $ یا همون [str[2][2 $ خطای اندیس نامعتبر آرایه میده؟
4) اگه [str[3,1 $ و [str[3,3 $ رو مقدار دهی کردیم، [str[3,2 $ نیازی به مقدار دهی داره؟ اگه مقدار دهی نشه، به دلیل بروز خطا حلقه x از 1 الی 3 هم برای [str[3][x $ قابل استفاده نیست؟
5) آیا str[3]=$str$ یا other=$str$ یا [sub[1,1]=$str[1,2 $ قابل استفاده است؟ مقادیر داخل آرایه رو کپی می کنند یا ارجاعی به بخشی از حافظه str$ میشه؟
6) الان یک str$ ای داریم که بخشی اش آرایه است، بخشی اش نیست، اندیس شروع و انتهای ابعاد شون متغیره، نوع داده داخل شون هم همین طور. چطوری یک
حلقه for می تونه تمامی خونه های این آرایه ترکیبی رو پیمایش کنه؟
 

JavidX

Apadana Developer
اگه درست متوجه شده باشم 'str[1,2,3,4]='str$ یعنی str$ یک آرایه چهار بعدی (یا پنج بعدی، چون 'str' خودش یک آرایه ئه) است،
که در خونه ای از این آرایه رشته str قرار گرفته که معادل 'str[1][2][3][4]='str$ هم هست.
ظاهرا مقدار دهی یک اندیس از آرایه به مفهوم تعریف ابعاد کل آرایه نیست، چون str[2]=true$ هم معتبره. چند تا نکته مبهم هست :
1) حالا [str[1 $ می تونه مستقلا وجود داشته باشه و مقدار دهی بشه یا همون (((Array(2->Array(3->Array(4->str است و اگه مقدار دهی بشه آرایه قبلی از بین رفته؟
2) اگه [str[2,1 $ مقدار دهی بشه، تناقضی با [str[2 $ که قبلا مقدار دهی شده نداره و هر دو سر جاشون هستند؟ اگه جواب مثبته و [str[2 $ هم یک رشته بود [str[2,1 $ کاراکتر اول
رشته قبلی است یا مقدار داخل آرایه ای که بعدا مقدار دهی شده؟
3) رشته آرایه حساب میشه، پس الان [str[1,2,3,4,2 $ یا همون [str[1][2][3][4][2 $ برابر t است؟ [str[2,2 $ یا همون [str[2][2 $ خطای اندیس نامعتبر آرایه میده؟
4) اگه [str[3,1 $ و [str[3,3 $ رو مقدار دهی کردیم، [str[3,2 $ نیازی به مقدار دهی داره؟ اگه مقدار دهی نشه، به دلیل بروز خطا حلقه x از 1 الی 3 هم برای [str[3][x $ قابل استفاده نیست؟
5) آیا str[3]=$str$ یا other=$str$ یا [sub[1,1]=$str[1,2 $ قابل استفاده است؟ مقادیر داخل آرایه رو کپی می کنند یا ارجاعی به بخشی از حافظه str$ میشه؟
6) الان یک str$ ای داریم که بخشی اش آرایه است، بخشی اش نیست، اندیس شروع و انتهای ابعاد شون متغیره، نوع داده داخل شون هم همین طور. چطوری یک
حلقه for می تونه تمامی خونه های این آرایه ترکیبی رو پیمایش کنه؟
$arr یک آرایه ی 4 بعدی است توی این مثال.
1) نه مستقل نیست. یه متغیر نمیتونه همزمان هم آرایه باشه هم مثلاً یک رشته.
2) جوابتون رو فکر کنم توی مورد 1 گرفتید
3) اگه $str یک رشته باشه و ما ایندکس دو یا چند بعدی بهش بدیم تنها عددی که میتونه توی دومین ایندکس به بعد قرار بگیره 1 هست. چون ایندکس اول کاراکتر داخل رشته رو مشخص می کنه که نتیجه اش فقط و فقط یک کاراکتره واسه همین فقط 1 میشه استفاده کرد وگرنه به ارور میخوریم.
4) نه به هیچ وجه نیازی نیست. اما کاربر باید خودش حواسش باشه چه برنامه ای داره می نویسه! اگه یک برنامه بنویسه که خونه 1 و 3 رو مقدار دهی کنه ولی 2 رو بخونه مقدار پیشفرض یعنی 0 در نظر گرفته میشه.
5) نکته ی خوبی بود. تصمیمی که خودم دارم اینه که آرایه کپی بشه ولی فعلا ارجاع داده میشه.
6) یعنی چی بخشیش هست بخشیش نیست؟ ببینید آرایه های آپادانا خیلی شبیه php هستند دقیقا همون رفتار باهاشون میشه. هر چیزی که شما بنویسید اگه منطق برنامه شما درست باشه درست کار می کنه؛ مهم نیست چه چیزایی مقدار دهی شدن و چه چیزایی بی مقدارند، و یا چه Range ئی رو در نظر گرفتید. اگه یه موقع هم سعی کردید به اندیسی دسترسی پیدا کنید که قبلا مقدار دهی نشده همونطور که گفتم 0 یا رشته ی خالی یا False و... ، بسته به چیزی که توی Expression نیازه به شما تحویل داده میشه.
اگه بازم سوالی داشتید در خدمتم.
 
آخرین ویرایش:

JavidX

Apadana Developer
خب آرایه های با ایندکس رشته ای هم تموم شد!
این کد رو ببینید:
کد:
Private $str
$str[0,'Name']='Nick'
$str[0,'LastName']='Sh'
$str[0,'Age']=20
$str[1,'Name']='Omid'
$str[1,'LastName']='Ch'
$str[1,'Age']=22
for $i=0 to 1 {
        dialog.message("Person #[$i+1] name is [$str[$i,'Name']] [$str[$i,'LastName']]")
}
ببینید رشته های پیشرفته توی آپادانا از php هم سرترند! توی اینا میشه همونجا عملیات محاسباتی هم انجام داد.
با اجرای این برنامه دو تا پیغام پیاپی نمایش داده میشه:
کد:
Person #1 name is Nick Sh
---------------------------
OK   
---------------------------

و

Person #2 name is Omid Ch
---------------------------
OK   
---------------------------
 

JavidX

Apadana Developer
کپی کردن آرایه هم درست شد. یعنی الان با مساوی قرار دادن یک آرایه با آرایه ی دیگه مقدار کپی میشه. بخش اسکریپت تقریبا تمومه فقط switch..case مونده. نوع داده ی اشیاء هم باقی مونده که یکی از جالبترین قسمت های آ2 هست که در موردش توضیحی نمیدم.
قبلا قرار بود With هم اضافه بشه که دیگه با وجود حذف ساختار داده Structure و جایگزینیش توسط آرایه دیگه نیازی بهش نیست و معلق میشه.

دوستان ما رو از نظرای خودتون بی بهره نذارید.
موفق باشید
 
آخرین ویرایش:

JavidX

Apadana Developer
بخش آبجکت ها هم ساخته شد. همونطوری که برنامه ریزی کرده بودم در آوردمش و راضیم.
برای اینکه بدونید کار شیء چیه توی آ2، به عنوان مثال برای کار با فایل توی سطح پایین توی آ2، باید شیء فایل ساخته بشه و سپس ازش استفاده بشه. به این صورت:
کد:
$h=File.Open('D:\test.txt',0)
File.Close($h)
که فایل رو باز می کنه و بلافاصله میبنده.
اشیاء توی آ2 یه خاصیتی خیلی جالبی دارند که از نوآوری های آ2 ئه به همین خاطر چیزی در موردش نمیگم.

موفق و پیروز باشید
 

JavidX

Apadana Developer
سلام دوستان

Switch Case هم تموم شد اما فعلاً چیز ساده ایه مثلا قابلیت تشخیص بین دو عدد بودن و اینها رو نداره ولی تصمیم دارم برای ورژن های بعدی اضافش کنم.
تبریک می گم دوستان مهم ترین و بزرگترین قسمت های پلیر تموم شد.
فعلا دیگه روی پلیر کاری ندارم فقط پیاده سازی توابع مونده که اینم خیلی سادست چون همه ی پیش نیازها رو نوشتم و فقط و فقط و فقط کافیه برنامه مخصوص هر تابع رو بنویسم و هیچ کد اضافه ای نیاز نیست که اونم به مرور نوشته میشه. فعلا برمیگردم روی دیزاینر. یه قسمت هایی هم مثل دیباگر که باید همزمان روی هر دو کار کنم. چیزی که خیلییی وقت پیش (در حد 2 سال پیش) که کنکور داشتم واسه دیباگر نوشتم الان به درد نمیخوره چون با چند نخی سازگار نیست. البته بعضی جاهاش به درد می خوره.

قعلا نمونه کد Switch Case رو ببینید... (کد مسخره ایه فقط خواستم ساختارش رو ببینید)
کد:
$s = 5
Switch (5 * $s)
{
  Case 0, 2, 3
  {
    Dialog.Message('0,2,3')
  }
  Case 6, 25 {
    Dialog.Message('6,25')
  }
  Case Else {
    Dialog.Message('else')
  }
}

موفق و پیروز باشید
 

+Mohammad+

Well-Known Member
فکر کنم اون Case Else مث همون Default توی PHP عمل میکنه ... اگه اینطوره بهتره از همون Default استفاده بشه ... خواناتر و واضح تره ...
 

JavidX

Apadana Developer
فکر کنم اون Case Else مث همون Default توی PHP عمل میکنه ... اگه اینطوره بهتره از همون Default استفاده بشه ... خواناتر و واضح تره ...
دلیل انتخاب Case Else اینه:
1- Case تنها بخاطر نظم دادنه چون اعلان شرطهای داخل سوییچ همیشه با Case هست گفتم کیس Else رو هم با Case مشخص کنم.
2- Else بخاطر این که اولین چیزیه که به ذهن کاربر میرسه چون با If هم همخوانی داره. و بهتر توی ذهن میچرخه تا default.

در اصل به نظر خودم else خالی (شبیه دلفی) بهتر از عبارت Default هست اما به دلیلی که عرض کردم Case رو هم گذاشتم.
لطفا بقیه دوستان هم نظر بدند با دلیل که تصمیم بگیریم چی استفاده کنیم.
 

the_king

مدیرکل انجمن
دلیل انتخاب Case Else اینه:
1- Case تنها بخاطر نظم دادنه چون اعلان شرطهای داخل سوییچ همیشه با Case هست گفتم کیس Else رو هم با Case مشخص کنم.
2- Else بخاطر این که اولین چیزیه که به ذهن کاربر میرسه چون با If هم همخوانی داره. و بهتر توی ذهن میچرخه تا default.

در اصل به نظر خودم else خالی (شبیه دلفی) بهتر از عبارت Default هست اما به دلیلی که عرض کردم Case رو هم گذاشتم.
لطفا بقیه دوستان هم نظر بدند با دلیل که تصمیم بگیریم چی استفاده کنیم.

به سلیقه و استراتژی طراح بستگی داره، برای کسی که می خواد یک زبان جدید رو یاد بگیره فرقی نمی کنه. این رو در نظر بگیرید که
برای خودتون خوانایی کد مطرحه یا خلاصه تر شدن زبان.
Case Else سبک زبان بیسیک ئه اما با Select Case و End Select تناسب بیشتری داره، با { و } خیلی جور در نمیاد.

در بیسیک نزدیکی زبان به زبان محاوره ای انسان اهمیت زیادی داشته، به همین جهت اضافه شدن عبارت هایی مثل Case و As برایش مزیت محسوب می شده، نه عیب.
تا جایی که تونسته اند پایان دهنده بلوک های کد رو از هم تفکیک کرده اند، برای هر کدوم یک End و Exit جداگانه در نظر گرفته اند.
در مقابل در زبان هایی مثل C تا جایی که امکانش بوده تعداد عبارات کلیدی رو کمتر کرده اند. اون چیزی که براشون مهم بوده خلاصه و کوچکتر شدن بوده، براشون مهم نبوده که
چند تا { و } تو در تو خوانایی کمتری نسبت به End If و End Select و End Sub و End While و ... داره یا توانایی های break در بلوک های تو در تو کمتر از Exit Do و Exit For و Exit While و Exit Sub ئه.
 

JavidX

Apadana Developer
به سلیقه و استراتژی طراح بستگی داره، برای کسی که می خواد یک زبان جدید رو یاد بگیره فرقی نمی کنه. این رو در نظر بگیرید که
برای خودتون خوانایی کد مطرحه یا خلاصه تر شدن زبان.
Case Else سبک زبان بیسیک ئه اما با Select Case و End Select تناسب بیشتری داره، با { و } خیلی جور در نمیاد.

در بیسیک نزدیکی زبان به زبان محاوره ای انسان اهمیت زیادی داشته، به همین جهت اضافه شدن عبارت هایی مثل Case و As برایش مزیت محسوب می شده، نه عیب.
تا جایی که تونسته اند پایان دهنده بلوک های کد رو از هم تفکیک کرده اند، برای هر کدوم یک End و Exit جداگانه در نظر گرفته اند.
در مقابل در زبان هایی مثل C تا جایی که امکانش بوده تعداد عبارات کلیدی رو کمتر کرده اند. اون چیزی که براشون مهم بوده خلاصه و کوچکتر شدن بوده، براشون مهم نبوده که
چند تا { و } تو در تو خوانایی کمتری نسبت به End If و End Select و End Sub و End While و ... داره یا توانایی های break در بلوک های تو در تو کمتر از Exit Do و Exit For و Exit While و Exit Sub ئه.
من توی کل برنامه سعی کردم میانه روی کنم که هم یوزرهای حرفه ای و هم یوزرهای تازه کار بتونن به راحتی با کد نویسی آپادانا رابطه برقرار کنند. اینو توی قسمت های مختلف ساینتکس میشه دید.
ظاهراً Case Else به درد کار ما نمیخوره. فکر کنم همون Else خالی بهترین گزینه ی موجود باشه.
 

loo30fer

کاربر متخصص مولتی مدیا بیلدر
سلام جاوید جان
خوشحالم که آ2 هروز در حال پیشرفته
میخواستم بدونم وضعیت sdk پلاگین چه جوریاست؟چه مزیتهای نسبت به sdk بیلدر براش در نظر گرفتین؟
 

JavidX

Apadana Developer
سلام جاوید جان
خوشحالم که آ2 هروز در حال پیشرفته
میخواستم بدونم وضعیت sdk پلاگین چه جوریاست؟چه مزیتهای نسبت به sdk بیلدر براش در نظر گرفتین؟
سلام محمد عزیز

sdk هنوز کامل نشده ولی بستر اصلیش فراهم شده در حد اینکه پلاگین خودشو معرفی کنه و یونیکد بودن یا نبودنش رو مشخص کنه. چیزی که تو فکرمه خیلی چیز بزرگیه ولی نمیدونم وقت بشه پیادش کنم یا نه. بعضی از ایده هایی که برای آ2 دارم رو نتونستم روی این ورژن بخاطر کمبود وقت اجرا کنم؛ بالاخره هر چی باشه هسته ی اصلی برنامه هم مهمه هم وقت گیر، در عوض درست نوشتن هسته باعث میشه آپدیت کردن برنامه خیلی راحت تر باشه.
 

loo30fer

کاربر متخصص مولتی مدیا بیلدر
sdk هنوز کامل نشده ولی بستر اصلیش فراهم شده در حد اینکه پلاگین خودشو معرفی کنه و یونیکد بودن یا نبودنش رو مشخص کنه. چیزی که تو فکرمه خیلی چیز بزرگیه ولی نمیدونم وقت بشه پیادش کنم یا نه. بعضی از ایده هایی که برای آ2 دارم رو نتونستم روی این ورژن بخاطر کمبود وقت اجرا کنم؛ بالاخره هر چی باشه هسته ی اصلی برنامه هم مهمه هم وقت گیر، در عوض درست نوشتن هسته باعث میشه آپدیت کردن برنامه خیلی راحت تر باشه.
بله همینطوره , دیگه مطمئنا این آپادانا2 انقلابی رو در زمینه مولتی مدیا بپا میکنه.
بهرحال موفق بشی و همیشه آرزوی موفقیت و شادمانی رو برات دارم.:rose:
 

JavidX

Apadana Developer
بله همینطوره , دیگه مطمئنا این آپادانا2 انقلابی رو در زمینه مولتی مدیا بپا میکنه.
بهرحال موفق بشی و همیشه آرزوی موفقیت و شادمانی رو برات دارم.:rose:

ایشالا. ممنون آقا محمد عزیز امیدوارم شما هم همیشه شاد و خرم باشید :rose:


ضمناً دوستان Else رو برای کیس استفاده کردم رفت.
موفق باشید
 

NicSoft

Active Member
سلام محمد عزیز

sdk هنوز کامل نشده ولی بستر اصلیش فراهم شده در حد اینکه پلاگین خودشو معرفی کنه و یونیکد بودن یا نبودنش رو مشخص کنه. چیزی که تو فکرمه خیلی چیز بزرگیه ولی نمیدونم وقت بشه پیادش کنم یا نه. بعضی از ایده هایی که برای آ2 دارم رو نتونستم روی این ورژن بخاطر کمبود وقت اجرا کنم؛ بالاخره هر چی باشه هسته ی اصلی برنامه هم مهمه هم وقت گیر، در عوض درست نوشتن هسته باعث میشه آپدیت کردن برنامه خیلی راحت تر باشه.

سلام
ولی باید کاری کنید که نرم افزار امکانات زیادی داشته باشه
تا دیگه به پلاگین نیازی نباشه!!!!!
 

JavidX

Apadana Developer
سلام
ولی باید کاری کنید که نرم افزار امکانات زیادی داشته باشه
تا دیگه به پلاگین نیازی نباشه!!!!!
سلام
خیالتون راحت امکانات در حدی هست که پلاگین اجباری نیست. (الان MMB دیگه برای رفع کمبودهاش کل سیستمش شده پلاگین و میشه گفت تو بعضی پروژه ها فقط وظیفش صدا زدن توابع پلاگینه :green:)
 

جدیدترین ارسال ها

بالا