رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

پرچمداران

  1. فرهاد شیری

    فرهاد شیری

    مدیران مرجع


    • امتیاز

      12

    • تعداد ارسال ها

      120


  2. قاسم رمضانی منش

    قاسم رمضانی منش

    میانجی گر‌ها


    • امتیاز

      3

    • تعداد ارسال ها

      57


  3. کامبیز اسدزاده

    کامبیز اسدزاده

    بنیـــان گذار


    • امتیاز

      2

    • تعداد ارسال ها

      302


  4. بهنام صباغی

    بهنام صباغی

    مدیران مرجع


    • امتیاز

      2

    • تعداد ارسال ها

      81



مطالب محبوب

در حال نمایش مطالب دارای بیشترین امتیاز از زمان یکشنبه, 23 تیر 1398 در همه بخش ها

  1. 3 امتیاز
    @Alireza4 درود؛ اینکه چه کاری انجام بدهید و به کدام راه برید، تماماً بستگی به خودتان دارد. پیشنهاد می‌کنم که قشنگ درمورد کاری که می‌خواهید انجام بدید تحقیق کنید : - هدفتان از برنامه‌نویسی چیست ؟ - چقدر حوصلهٔ یادگیری مطالب را دارید ؟ - چقد دید سیستمی به برنامه‌نویسی دارید ؟ و ..، این مطلب را حتماً مطالعه کنید : کدام زبان برنامه‌نویسی را انتخاب کنم ؟ ، در این مقاله توضیحات لازم داده شده که بتونید خودتان تصمیم بر انتخاب زبان بگیرید. چرا که باید بدونید «درسته‌که زبان سی‌پلاس‌پلاس قدرت زیادی داره» امّا باید بدونید که هرچیز خوبی بالاخره هزینه‌ای هم داره و یادیگری کار کردن با این زبان به شش‌ماه تموم نمیشه، برای اینکه دراین‌باره هم بیشتر اطلاعات کسب کنید مقالهٔ چرا و چگونه باید ++C را یادبگیریم ؟ ، شاید اصلاً چیزی نبود که شما فکر می‌کردید.
  2. 2 امتیاز
    دوست گرامی! اگر منظورتون استفاده از پلتفرم هایی مثل کیوت که توانایی ایجاد خروجی اندروید هم دارند که می توان بازبان ++C هم برای این پلت فرم برنامه نوشت، هست که باید عرض کنم هرچند قبلا خیلی بحث شده! ولی اینکه Qt,QML را یاد بگیرید خیلی از مباحث اندروید را هم یاد میگیرید باید عرض کنم خیر! حالا چرا به این علت که اغلب این فریم وورک هایی که توانایی خروجی دادن اندروید را هم دارن خودشون مستقل از اندروید یک تفسیر کننده دارند! مثلا برای همین کیوت شما کلا با مفاهیم Activity , Fragment ,... برای ایجاد GUI های تعامل با کاربران کاری نخواهید داشت بلکه زبان مستقلی به نام QML را باید یاد بگیرید واز اون استفاده کنید. والبته خیلی بحث های دیگه .... بنابراین خیلی خوب که پارالل هم اندروید جاوا را یاد یگیرید وهم پلت فرم Qt, QML را یاد بگیرید. البته پیشنهاد میکنم حتما کتاب آموزش Qt جناب اسدزاده را تهیه کنید، کتاب آموزش پیشرفته ++C همراه Qt (پیشرفته) 1.3.7
  3. 2 امتیاز
    با سلام وقت بخیر, این دومین پیام و اولین پاسخی است که در این انجمن ارسال می کنم. این را هم ذکر کنم که سوالتان واضح و شفاف علمی نیست. ذکر کردید که یک تابعی بنام Calculate دارید که ممکن است در شرایط مختلف نیاز به عملکرد متفاوتی رو داشته باشید. خب در این حالت نیاز به یک حافظه برای تعیین وضعیت دارد. بطور مثال اگر وضعیت 0 بود باید عملیات های مشخص شده ای انجام دهد و اگر 1 بود دستورات خاص و مجزای دیگری... برای نگهداری وضعیت کنونی می توانید از یک متغییر یا هر تکنیک دیگری حتی فایل استفاده کنید. که با فراخوانی و خواندن مقدار آن در داخل تابع Calculate می توانید تکلیف خودتان را مشخص کنید تا چه نوع عملیات و دستوراتی را اجرا کنید. نمونه مشابه در C : int state=0; void calculate() { if(state == 0) { // ... } else { // ... } // OR // // switch(state) { // case 0: break; // case 1:break; // } } void changeState() { if(state == 0) { state=1; } else { state=0; } } ممکن است منظورتان را درست و کامل متوجه نشده باشم و راهنمای بی فایده ای در مسیر دیگه ای کرده باشم. هنگامی که به تنها به عنوان این مطلب نگاهی میکنم, بنظرم بهتر است اینگونه بگویم که : شما در زمان اجرا نمی توانید تصمیم جدیدی برای نوشتن دستوراتی جدید برای اجرا بگیرید. (بصورت منطقی) چون کد ها از قبل باید کامپایل شده باشند و موتور کامپایلر در زمان اجرا در کنار شما نخواهد بود. (در حالت کلی) چند سال پیش این قابلیت در تیم توسعه گوگل برای زبان برنامه نویسی گو مطرح شد تا بر روی این قابلیت کار شود تا بتوانیم در زمان اجرا کامپایلی را انجام دهیم, شخصا پیگیر این موضوع بودم. اگرچه تا کنون فقط پشتیبانی محدودی دارد و امید است تا تا سال آینده پشتیبانی این موضوع کامل شود. اگرچه این موضوع چیزی نیست که شما مطرح کردید. چون حتی برای این موضوع یک کامپایلر کوچک برای زمان اجرا کنار برنامه خواهد بود که قطعا حجمی نسبتا زیاد در کنار کار شما خواهد بود که می تواند موجب ایجاد یک بسته های جدید و مجزا شود که بتوانید از آنها در برنامه استفاده کنید. اگرچه این ارتباطی به زبان سی یا سی پلاس پلاس ندارد. اما در جریان باشید که موضوع کامپایل های زمان اجرا موضوعی است که در سال های اخیر در حال کار بوده است و موضوعی است که به نتیجه ی مطلوبی با دید و نگاه عادی نخواهد شد. اگرچه این مورد می تواند در برخی فضا ها بسیار مفید واقع شود. بهرحال در پاسخ دادن و نقد کردن پیام من راحت باشید! مکس بیس / Max Base
  4. 1 امتیاز
    با این حساب باید تمرکزم رو روی Meta Data قرار بدم اگر چه با توجه به استفاده از SP در برنامه های دیگر کارفرما به استفاده از آن و یا مواردی مشابه آن تمایل بیشتری دارد. آخه عمری با روش SP کارکردن و به آن عادت کرده اند. از وقتی که گذاشتید متشکرم. اگر در ادامه در مورد استفاده از Meta Data به مشکل و یا سوالی برخوردم مزاحم شما خواهم شد.
  5. 1 امتیاز
    دقیقا چه بخشی را متوجه نمیشید؟ هر Content Provider می تونه متد های مختلفی برای insert داشته باشه! سوال شما مبهمه در ضمن بهتره کمی درباره Content Provider ها مطالعه داشته باشید اغلب سوالات خودتون را پیدا میکنید!
  6. 1 امتیاز
    یک Content Provider ارائه دهنده محتوا داده ها از یک برنامه به برنامه های دیگر بر اساس درخواست عرضه میکنه! معمولا چنین درخواست هایی توسط کلاس ContentResolver انجام می شود. یک ارائه دهنده محتوا می تواند از روش های مختلف برای ذخیره داده های خود استفاده کند و داده ها را می توان در پایگاه دادهSQLlite، فایل ها یا حتی در وب سرویس ها ذخیره کرد. اگر بخوام بهتر توضیح بدم اینطور بگم در سیستم عامل ویندوز که ابزارهای مختلفی برای ذخیره سازی داده ها وجود دارد مانند SQL Server , Oracle ,Access,Excel,... بنابراین محل های ذخیره سازی زیادی داریم که بنا بر استراتژی نرم افزارهای خودمون از یکی از این ابزارها ویا از چنتاشون باهم استفاده میکنیم خوب حالا ویندوز برای اینکه تمامی این ابزارها با هم سینک باشن و بتونیم به راحتی باهشون ارتباط برقرار کنیم ابزارهایی مثل ODBC,ADO,ADO.NET,.... را تدارک دیده که دقیقا همون کاری را میکنن که Content Provider ها در اندروید انجام میدن! به این آموزش هم مطالعه کنید یک مثال ساده هم وجود داره! - Android - Content Providers
  7. 1 امتیاز
    و البته زمانی که از نخ ها مانند AsyncTask استفاده میکنید و عملیاتهای مختلف I/O انجام میدید بهتره که از همه اکسپشن ها را در یک Try ارسال نکنید و همچنین از یک خاصیت به نام autoclose هم می توانید برای کلاسهای جاوا استفاده کنید که نیازی به نوشتن متد close برای هر کلاس ورودی و خروجی نداشته باشید. مثال ویرایش شده... @Override protected String doInBackground(String... params) { try(URL url=new URL("http://s8.picofile.com/d/8349389850/06c69ac4-70fb-4d33-991f-ac01b8c5324f/b.mp3")){ URLConnection connection=url.openConnection(); connection.connect(); try( InputStream fis=new BufferedInputStream(url.openStream(),10*1024)){ try(FileOutputStream fos=new FileOutputStream(Environment.getExternalStorageDirectory().getPath()+"/saeed.mp3")){ int c=0; byte[] d=new byte[1024]; while ((c=fis.read(d))!=-1){ fos.write(d,0,c); } fos.flush(); } catch (IOException expOutPutStream) { expOutPutStream.printStackTrace(); } } catch (IOException expInputStream) { expInputStream.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } return null; }
  8. 1 امتیاز
    کلاس بافر یک Wrapper برای کلاس InputStream هست که امکان استفاده از یک بافر داخلی(آرایه داخلی) را به شما میده که میتونه سرعت بهتری نسبت به کلاس Base به شما بده! و اینکه چه مقادیری برای استریم های ارسالی و دریافتی تعیین میکنید بسته به شرایط ونوع فایل ها متفاوت هست! مثلا وقتی در کلاس بافر سایز تعریف میکنید باید به این نکته توجه کنید که درصورتی که یک بایت را بخواهید شیفت بدید کلاس بافر میاد از کلاس Array.copy استفاده میکنه وتمام بایت ها را دوباره مینویسه بنابراین در صورتی که این مقادیر را بیش از اندازه بزرگ تعریف کنید هزینه ی زیادی براتون داره در مصرف منابع حافظه. ویا وقتی یک آرایه از بایت ها تعریف میکنید بهتر هست که کمترین سایز ممکن را تعریف کنید که در صورتی که به هردلیل مشکلی در آرایه بایت ها به وجود آمد هزینه کمتری بابت از دست رفتن منابع بدهید به همین علت است که معمولا فایلهای خیلی بزرگ را در نخ های Background دانلود میکنن ونه در نخ اصلی ودریکبار بافر کردن داده ها. استریم بایت ها را به صورت بسته های خیلی کوچک در یک نخ کاربری background دریافت میکنن و در زمان مناسب همه بایت ها را به هم وصل میکنن! توجه داشته باشید که برنامه نویسی در زبانهای جاوا و دات نت اتلاف منابع حافظه ای زیادی میتونه در بر داشته باشه بنابراین باید همیشه به این نکات توجه داشته باشید. پیشنهاد میکنم این مطالب راهم مطالعه کنید! 10 تکنیک کاربردی که باعث بهینه شدن عملکرد برنامه های جاوا می شود
  9. 1 امتیاز
    اول از سوال دوم شروع کنم ! فلسفه SP ها در SQLServer به علت اینکه دستوری به نام Alter وجود دارد این امکان را به برنامه نویس میده که هر وقت خواست کل منطق SP را مجددا بنویسه و SP جدید را Execute کنه که خوب البته که این امکان فوق العاده ست ولی باعث از بین رفتن یکپارچگی داده هم میشه! و البته که این مهم به علت وجود دستور Alter هست و الباقی ماجرا... فکر کنم در پست های بالایی هم اشاره کردم که برای این کار باید از Meta Data ها استفاده کنید یعنی تمامی این شرایط که می فرمایید اگر از قبل روشن هست که خوب بهتر اگرهم نیست کافی امکانی تدارک ببنید که کاربر سیستم بتونه این متادیتاها را ایجاد کنه و حالا تمام مقادیری که برای اجرا شدن منطق های مختلف نیاز دارید را کافی در این متا دیتا ها کپسوله کنید و در سمت برنامه هم parser هایی بنویسید که این مقادیر را از متا دیتاها Map کنن داخل کلاسهای Model که دارید و در کلاسهای Logic از این مدل ها استفاده کنید و لایه Viewهم براساس تصمیمات Logic خروجی مناسب را نمایش بده! این مثال که عرض میکنم کاملا واقعی هست و همین الان در حوزه صنعت ریلی کشور در حال استفاده است، یعنی ما برای اینکه بتوانیم رفتارهای سنسورها و تمامی المانهایی که به صورت سخت افزاری برای نرم افزارهای کنترلی که نوشته ایم دیتا ارسال کنند وبرای اینکه هر ایستگاه قطارهای برون شهری با هم کاملا متفاوت هستند و حتی این تفاوت در ایستگاه های متروها هم کاملا متفاوت هست بنابراین با رفتارهای متفاوت سخت افزارهای متفاوتی روبه رو هستیم بنابراین قطعا متادیتاهایی داریم که به صورت مجزا هر ایستگاه را کاملا جداگانه با نوع داده ها و رفتارهای متفاوت تعریف میکنیم داخل نرم افزارهای اصلی هم تعریف کردیم که فقط از این متادیتا ها برای منطق کنترل سیگنالینگ خطوط استفاده کنند.در پست های قبلی هم براتون یک نمونه قرار دادم. پس نه به مفسر اسکریپتوری نیاز دارید ونه به هیچ ابزار دیگه ای! البته یا باید خودتون Parser ها را بنویسید ویا اگر از فرمت های استاندارد برای متادیتا ها استفاده میکنید، مثلا JSON,GSON,XML می توانید از کلاس های Parser که برای این فرمت داده ها وجود دارد هم استفاده کنید. قطعا هم سیستمی به مراتب Scalability بهتر وهم Responsibility بسیار بهتری خواهد داشت، وهم Configurable خواهد بود. بنابراین کافی که این شرایط که مثلا باید خودرو ها داشته باشند ویا منطق های تصمیم گیری که ذکر کردید را در یک متادیتا فایل استاندارد تعریف کنید و در زمان مناسب اونها را parse کنید. ویا یک نمونه ملموس تر همین فایلهای Make که برای کامپایل برنامه ها استفاده میکنیم شما در این فایلها مجموعه ای از قوانین مختلف و شرایط مختلف را دارید تعریف میکنید این کامپایلر هست که تصمیم میگیره چه تصمیمی بگیره براساس این داده ها بنابراین همانطور که مشاهده میکنید کامپایلرها هم از متادیتاها برای رفع این معضل استفاده میکنند. بنابراین همین مدل داده ای که دارید را کافی که در یک فایل متادیتا اکستراکت کنید و تغییرات لازم را اعمال نمایید و الباقی سناریو.... امیدوارم توضیحاتم مفید فایده باشه!
  10. 1 امتیاز
    تا کنون در مجموعه‌ی مقالات اصول طراحی، در مورد تعادل و رنگ صحبت کردیم. در این بخش این روند را با موضوع تضاد (Contrast) ادامه می‌دهیم. تضاد هنگامی رخ می‌دهد که دو عنصر در یک صفحه متفاوت باشند. به عنوان مثال، تضاد می‌تواند خودش را در رنگ‌های متنوع بین متن و رنگ پس زمینه نشان دهد. یا یک عنوان بزرگ و درشت در کنار یک فونت sans-serif برای متن بدنه باشد. یا میتواند تفاوت بین یک گرافیک بزرگ و یک گرافیک کوچک باشد و یا ترکیب یک بافت خشن با بافت ظریف که یک تضاد قابل توجهی ایجاد می‌کند. چشمان ما علاقه‌مند به دیدن تضاد هستند. نکته‌ی حائز اهمیتی که در رابطه با تضاد وجود دارد این است که تضاد باید کاملا چشم‌گیر و غیر جزئی باشد. ۱. تضاد از نظر چشمان ما جذاب است. یکی از دلایل استفاده‌ی ما از تضاد، چه در چاپ و چه در وب، جلب کردن توجه مخاطب است. سایت Carsonified از تضاد جهت اثرگذاری استفاده می‌کند. این سایت از متن و عکس‌های درشت و بالعکس و ترکیب رنگ‌های متضاد بهره برده است. همانطور که در زیر می‌بینیم جلد مجله‌ی Proximity، از عکس چندین قایق شناور کوچک در درون دریای آبی تیره استفاده کرده است که تضاد زیبایی را به تصویر کشیده است. ۲. تضاد به سازماندهی اطلاعات کمک می‌کند. استفاده از تضاد نه تنها سبب جذابیت هر چه بیشتر طراحی می‌شود بلکه به هدف و سازماندهی اسناد وضوح بهتری می‌بخشد. در مجله‌ی منتشرشده در زیر، Studio8 از قوانین تضاد، تعادل (Balance) و مجاورت (Proximity) برای ایجاد صفحاتی غیر معمول و چشم‌گیر استفاده کرده است. عناوین درشت مشکی تضاد جالبی با متن ظریف روشن ایجاد کرده‌اند. در ادامه‌ی مجله، Studio8 صفحات را به دو قسمت تقسیم کرده است که از لحاظ ظاهری کاملا متضاد هم هستند. هر صفحه اطلاعاتی را در مورد محصول‌های جداگانه‌ای می‌دهد که به هم مرتبط هستند. مفهوم این ارتباط توسط علامت '&' ادا شده است. ۳. تضاد سبب ایجاد تمرکز می‌شود. آگهی‌ها و تبلیغات مشهور iPod از مفهوم تضاد به صورت کاملا حرفه‌ای برای متمرکز ساختن توجه بینندگان به پخش‌کننده‌ی موسیقی استفاده کرده است. در این تبلیغات یک شخصیت تیره رنگ بر روی زمینه‌ی رنگی قرار گرفته است. iPod و هدفون‌ به رنگ سفید هستند که در مقابل شخصیت تیره رنگ و زمینه‌ی رنگی خود را به خوبی نشان می‌دهند. طراحی برای این بطری سفارشی بر پایه‌ی تضاد بین متن سفید و رنگ قرمز تیره‌ی نوشیدنی است که به عنوان یک کادوی کریسمس، منحصر به فرد است. مواردی که هنگام افزودن تضاد به طرح‌های خود باید به آن‌ها فکر کنید: ۱. چگونه تضاد را ایجاد میکنید؟ از طریق بافت، تایپوگرافی، رنگ یا شکل؟ ۲. اگر می‌خواهید از طریق تایپوگرافی تضاد ایجاد کنید، کدامیک از فونت‌ها را استفاده می‌کنید؟ آیا آن‌ها بسیار متفاوت هستند یا فقط کمی با هم تفاوت دارند؟ گزینههای فونت خود را با دقت بررسی کنید اما به خاطر داشته باشید که متن قابل خواندن باشد. ۳. آیا تضاد به کار رفته، ایده‌ی طراحی شما را تقویت می‌کند؟ پی‌نوشت: مقالات و دوره‌های سایت Sitepoint پیشنهاد می‌شوند. با ایجاد حساب کاربری امکانات جذابی در اختیارتان قرار خواهد گرفت.
  11. 1 امتیاز
    مایکروسافت در به‌روز‌رسانی بعدی خود که در ماه‌های اول سال ۲۰۲۰ عرضه خواهد شد، مرورگر اج خود را حذف خواهد نمود و بر اساس گزارش ها مرورگری برا پایه کرومیوم را عملکردی متفاوت در اختیار کاربران قرار خواهد داد. در ادامه به جزییات این خبر خواهیم پرداخت. حذف نسخه قدیمی مرورگر اج از ویندوز 10 مایکروسافت مراحل حذف مرورگر Edge را آغاز کرده است تا فضا را برای مرورگر جدید خود ایجاد کند. البته این جایگزینی فعلا انجام نخواهد شد و فقط شاهد حذف این مرورگر خواهیم بود. البته حذف این مرورگر نیز به طور کامل انجام نخواهد شد و نسخه پنهانی از آن در بین برنامه های ارائه می شود اما مراحل حذف آن در حال انجام است. البته دوره این وضعیت موقت خواهد بود و به زودی شاهد مرورگر جدیدی در ویندوز 10 خواهیم بود. اولین تست مرورگر اج مبنی بر کرومیوم برای ویندوز 10 ارائه شد و در اختیار توسعه دهندگان قرار گرفت در نتیجه این مرورگر در مراحل نهایی خود قرار دارد. در واقع این مرورگر جدید با بهره گیری از توابع کروم توانسته تا مرورگری متفاوت و با کارایی بالا را ارائه دهد در نتیجه امکان پشتیبانی از قابلیت های کروم نیز در آن وجود خواهد داشت. نسخه جدیدی و بعدی مرورگر اج بر پایه کرومیوم برای کاربران ویندوز 7، 10 و حتی سیستم عامل مک قابل استفاده خواهد بود اما هنوز زمان دقیق انتشار آن مشخص نشده است. نظرات خود را در راستای این مرورگر جدید اج و حذف مرورگر قبلی از ویندوز 10 بیان کنید.
  12. 1 امتیاز
    قطعا مفسر اسکریپتی Lua خیلی معروفتر و تکمیلتر از اسکریپتور معرفی شده در پست های قبلی اشاره شد، ولی روش کار همون هست. خیر تغییر logic میسر نخواهد بود! بهتر بود یکم سناریوی خودتون را واضحتر بیان کنید تا روشهای بهتری بشه پیشنهاد داد!
  13. 1 امتیاز
    اگر یک نمونه مثال هم برای توضیحاتی که دادید ارسال کنید فکر کنم تاثیر بهتری داشته باشه!
  14. 1 امتیاز
    خیر توبع توی سی پلاس پلاس نوشته میشند و توی کد ریجستر میشند یعنی کد همون کد کامپایل شده سی پلاس پلاس هست ولی میتونید توی ران تایم صداشون کنید مثلا ما برای کار روی تصویر ازش استفاده کردیم میتونستیم تصاویر رو الگوریتم های مختلف روشون اعمال کنیم فرض کنید خروجی یه تابع تصویر بود و بعد میشد فیلتر های مختلف و عملیات مختلف رو که توابعشون رو ریجستر کرده بودیم رو روش اعمال کنیم و تابع Save هم داشتیم که تصویر رو بعد عملیات ذخیره می‌کردیم خوبیش این بود که برای کارهای دم دستی و ساده روی تصویر میتونست کاربر خودش کارهایی که میخواست رو روی تصویر انجام بده و بعد از رسیدن به یک کد نسبتا خوب این کد میومد توی سی پلاس پلاس میشد یک ابزار برای نرم‌افزار یعنی تیم علمی یه ابزار راحت داشت که سرعت سی پلاس پلاس رو داشت و میتونست کارهایی که میخواست رو انجام بده بدون این که توی کد سی پلاس پلاس دست ببره و سرعت سی پلاس پلاس رو هم داشت. باید کاربرد دقیق تعریف بشه تا بشه توی این پیادش کرد مثلا کار ما با تصویر بود میشد گرفت و ذخیرش کرد یا حتی تابع خوندن تصویر داشتیم توش. درکل توابع از قبل کامپایل شده و ریجستر شده رو میتونه ران کنه یعنی یه جورایی میتونید مفسر خودتون رو طوری که دوست دارید و کاربردتون هست تعریف کنید مثل کاری که ما کردیم.
  15. 1 امتیاز
    زبان های اسکریپتی زیادی الان وجود دارن که هرکدوم یکسری مزیت و یکسری معایب دارن که با توجه به کارتون باید یکیو انتخاب کنید. من پیشنهادم همین Lua هست که صرفا بخاطر اینکه قبلا باهاش کار کردم و از نظر سرعت و سادگی خوب بوده میگم. شاید زبان اسکریپت بهتری برای کار شما وجود داشته باشه که من ازش مطلع نیستم. بهتره یک جستجو بکنید. توجه داشته باشید که شما تو زبان اسکریپتی مثل Lua نمیتونید دقیقا بایت به بایت یک فانکشن رو تغییر بدید. تغییراتی که میتونید بدید در حده 1- صدا زدن فانکشنهای از قبل بایند شده 2- تغییر/مقدار دهی متغییرهای از قبل بایند شده 3- ساخت فانکشن های جدید (ترکیبی از فانکشنهای بایند شده ++C و کدهای Lua) هست و بییشتر از این انتظاری از یک زبان اسکریپتی نیست. که البته همین هم فوق العاده کاربردیه.
  16. 1 امتیاز
    میتونند از http://chaiscript.com هم استفاده کنند که به شما اجاره میده توابع از پیش تعریف شده سی پلاس پلاس رو در ران تایم صدا بزنید اگر توابع پایه ای که لازم دارند رو اضافه کنند میتونند توی ران تایم کد بنویسند و اجرا کنند. به مثال خودش دقت کنید : #include <chaiscript/chaiscript.hpp> std::string helloWorld(const std::string &t_name) { return "Hello " + t_name + "!"; } int main() { chaiscript::ChaiScript chai; chai.add(chaiscript::fun(&helloWorld), "helloWorld"); chai.eval(R"( puts(helloWorld("Bob")); )"); } این چیزی رو که مد نظرتون هست پیاده میکنه ؟ @kambiz behnia
  17. 1 امتیاز
    یکی از پارادایم های برنامه نویسی همین موضوع کنترل رفتارهای برنامه در شرایط و ورودی های مختلف هست. یکی از راه های پرکاربرد که در سیستم عامل لینوکس هم خیلی شایع هست استفاده از متا دیتا فایلهاست یعنی شما نوع رفتاری که برنامه باید ازخودش نشون بده را داخل یک فایل تکست می نویسید مثل فایل زیر.... [TEST_CYCLE]=15; [AXLE_ELEMENT_ID]=4; [NET]=0,[CPU]=0 #Byte-1 #If you put in this byte true can be receive data from this NET and CPU. Otherwise put false can't receive data. # [RECEIVE]=true; #NOTHING, RESET, NEVER_SENT, MISMATCH # [IO_STATUS]=NOTHING; #OD_NORMAL, RX_TIMEOUT, TX_TIMEOUT, CD_CUT # [OD_COMM]=OD_NORMAL; #Just submit the errors you want # #(FL_NORMAL_MASK,FL_FPGA_LIVE) - (SH_NORMAL_MASK,SH_SECOND_HALF) - (FH_NORMAL_MASK,FH_FIRST_HALF) # [ERROR_FL_SH_FH]=FL_FPGA_LIVE | SH_SECOND_HALF | FH_FIRST_HALF |; #Byte-1 #Just submit the faulty you want #(PG_ERREONOUS,PG_NO_ERREONOUS_MASK ) - (PULS_ERREONOUS,PULS_NO_ERREONOUS_MASK) - (PILOT1_ERREONOUS, PILOT1_NO_ERREONOUS_MASK) # #(PILOT2_ERREONOUS,PILOT2_NO_ERREONOUS_MASK) - (RESET_ACK 0, NORMALLY_MASK 1)-(MiCRO_ERREONOUS 0, MiCRO_NO_ERREONOUS_MASK 1) # [FAULTY_ERROR]=PG_ERREONOUS | PULS_NO_ERREONOUS_MASK | PILOT1_NO_ERREONOUS_MASK | PILOT2_NO_ERREONOUS_MASK | NORMALLY_MASK | MiCRO_NO_ERREONOUS_MASK |; #If you put in this 3 bytes ($), then the original byte will be used. Otherwise, enter a number. # #Byte-1 [AXLE_COUNTER_VALUE]=$; #Byte-1 [CYCLE_COUNTER_VALUE]=$; #Byte-1 [CRC_VALUE]=$; حالا وقتی برنامه را با متادیتا های فوق بنویسید یعنی رفتار برنامه را در زمان اجرا می توانید تغییر بدید! البته بحث استفاده از متادیتا ها خیلی گسترده است با چند خط نمیشه توضیح داد ولی جان مطلب همین بود که عرض کردم فکر کنم کار شما را راه بندازه! اصولا چه نیازی هست که شما بخواهید از داخل برنامه سی پلاس پلاس کدهای پایتون را اجرا کنید من فکر میکنم که مطلبی که عرض کردم مشکل شما را رفع میکنه البته لازم هست که کمی هم مطالعه کنید راجع به Meta Data
  18. 1 امتیاز
    خوب اگر منظورتون رفتار های متفاوت یک تابع در زمان اجراست که اغلب تکنیک های شی گرایی و الگوهای طراحی دقیقا برای این قبیل چالش ها ایجاد شده اند. بنابراین به راحتی می توانید یک تابع با یک نام ویک امضا ثابت داشته باشید که در زمان اجرا بسته به شرایطی که تعیین میکنید رفتارهای مختلفی داشته باشد.وقطعا هم باید از قبل کامپایل شده باشند اگر منظور شما استفاده از procedure این بوده باشد. البته روشهایی هم هست که تکنیک های تزریق سورس کدهای پویا و استاتیک مشهور هستند که بیشتر برای کرک کردن استفاده میشود البته نه در سورس برنامه بلکه در خروجی اسمبلی برنامه! و اگرهم اهداف دیگه ای دارید که پیشنهاد میکنم منابعی درباره کامپایلر زمان اجر دات نت JIT ویا منابعی درباره ماشین مجازی جاوا JVM ویا Dalvik مطالعه داشته باشید البته کامپایلرهای زبانهای مفسری مثل پایتون و پی اچ پی هم خیلی کمک میکنه!
  19. 1 امتیاز
    Object Slicing یکی از چالش هایی که در وراثت با استفاده از زبان پیشرفته سی پلاس پلاس وجود دارد، دسترسی به متدهای کلاس پایه و متدهای override شده در کلاس فرزند با استفاده از یک شی ثابت ویا غیر ثابت از کلاس فرزند هست. جهت واضح شدن این مطلب به مثالهای زیر توجه نمایید. تصور کنید یک کلاس Base داریم ویک کلاس Child که از روی کلاس Base ارث بری کرده است (رابطه 1 به 1) که هم در کلاس پایه و هم کلاس فرزند متد getA را پیاده سازی کرده ایم. #include <iostream> #include <vector> #include <functional> class Base { public: Base() : m_a(0) {} virtual void getA(){ std::cout << "Base is call" << '\n'; } virtual void getA() const{ std::cout << "const Base is call" << '\n'; } private: int m_a ; }; class Child : public Base { public: Child() : Base() { } using Base::getA ; void getA() override { std::cout << "Child is call" << '\n'; } void getA() const { std::cout << "const Child is call" << '\n'; } }; اکنون با تعریف کلاس های بالا اگر آبجکت هایی به شکل زیر داشته باشیم... std::cout <<"Object slicing : " << '\n'; Child child2; child2.getA(); //call child method Base& base1ref = child2; //call child method because reference to Child object base1ref.getA(); Base* base1ptr = &child2; //call child method because reference to Child object base1ptr->getA(); همانطور که مشاهده میکنید هر سه آبجکت تعریف شده متد getA کلاس فرزند را اجرا خواهند کرد. دلیل این اشکال هم این هست که در حال حاضر هر سه شی به کلاس فرزند اشاره دارند در زمان اجرا هیچ راه مستقیمی به کلاس پایه وجود ندارد(البته استثنایی هم دارد قطعا با استفاده از dynamic_cast می توان به کلاس پایه دسترسی داشت ولی منظور استفاده نکردن از explicit cast می باشد). و حال اگر چنین تعاریفی داشته باشیم... Base baseSlice = child2;//call base method because copy the Child object baseSlice.getA(); اکنون با تعریف چنین شی به متد های کلاس پایه دسترسی خواهیم داشت که به علت ارسال یک کپی از شی فرزند می باشد که یک نوع از کلاس پایه می باشد(call by value object). Function Slicing اکنون تصور کنید که توابعی را به صورت زیر تعریف کرده ایم(برای اینکه ابهامی در استفاده از توابع رخ نده از overloading function استفاده نشده است) //call base because b is call by value and copy of Base void print(const Base b) { b.getA(); } //call Child because b is call by reference no copy of Base void printref(const Base& b){ b.getA(); } //call Child because b is call by reference by pointer no copy of Base void printptr(const Base* b){ b->getA(); } و در صورتی که این توابع را به شکل زیر استفاده نماییم، توجه نمایید که object slicing چگونه رخ می دهد... std::cout <<"function slicing : " << '\n'; print(child2); printref(child2); printptr(&child2); با توجه به توضیحات قبلی در تابع اول به علت ارسال یک کپی از شی فرزند قطعا به کلاس پایه دسترسی خواهیم داشت. در صورتی که اگر همین شی فرزند را به صورت رفرنس ویا اشاره گر به توابع دوم و سوم ارسال نمایید قطعا فقط به متدهای کلاس فرزند دسترسی خواهیم داشت. Vector Slicing چالش object slicing در زمان استفاده از کانتینر هایی مانند vector بیش از پیش دچار ابهام خواهد بود که در صورت توجه نکردن به این اشکال قطعا در زمان اجرا رفتار برنامه تعریف نشده خواهد بود. تصور کنید که یک کانتینر وکتور به شکل زیر داریم... std::cout <<"vector element copy call by value slicing : " << '\n'; std::vector<Base> v; v.push_back(Base()); // add a Base object to our vector v.push_back(Child()); // add a Child object to our vector // Print out all of the elements in our vector // all vector element call base because vector element call by value // and copy of Base. for(const auto& element : v){ element.getA(); } v.clear(); همانطور که مشاهده میکنید وقتی اشیا وکتور را به صورت مقداری ذخیره میکنید بازهم object slicing خودنمایی خواهد کرد و رفتار برنامه را زیر سوال خواهد برد. اکنون برای رفع این چالش از کانتینر وکتور دو راه حل وجود دارد... استفاده از اشاره گرها به شکل زیر -1 std::cout <<"vector element not copy call by pointer slicing : " << '\n'; std::vector<Base*> vPtr; vPtr.push_back(new Base); vPtr.push_back(new Child); // Print out all of the elements in our vector // all vector element call base because vector element call by value // and copy of Base. for(const auto* element : vPtr){ (*element).getA(); } /*issue-1 * important: can not forget delete element pointer*/ for(const auto* element : vPtr){ delete element; element = nullptr; } vPtr.clear(); خوب همانطور که حدس زده اید این تکه برنامه هم طولانی تر شده است و هم کدتکراری boiler plate code استفاده شده است، آن هم به علت اینکه حتما باید فضای استفاده شده در heap را باز پس گیری نماییم که در حلقه دوم این کار انجام شده است. اکنون شاید تصور کنید که میشد از چنین تعریفی برای کانتینر وکتور استقاده میکردیم... std::vector<Base&> vRefWrap; قطعا من هم دوست داشتم چنین چیزی وجود داشت ولی متاسفانه با قوانین که در حوزه تعریف رفرنس ها وجود دارد تعریف چنین وکتور امکان پذیر نمی باشد آنهم به علت اینکه یکی از این قوانین این هست که برای تعریف یک رفرنس حتما در زمان تعریف باید یک رفرنس برای آن در نظر بگیرید قطعا استفاده رفرنس به این شکل در پلی مورفیسم سی پلاس پلاس امکانپذیر نخواهد بود. ولی خبر خوشی که می توانم بدهم این هست که استفاده از رفرنس ها در اشیا پلی مورفیک مانند کانتینرهای وکتور درC++11 با استفاده از کلاس استاندارد std::reference_wrapper امکانپذیر شده است. اگر از سی پلاس پلاس 11 به بعد استفاده می نمایید می توانید چنین کدی بنویسید... std::cout <<"vector element not copy call by reference wrapper slicing : " << '\n'; std::vector<std::reference_wrapper<Base>> vRefWrap; Base base1; Child child3; vRefWrap.push_back(base1); vRefWrap.push_back(child3); for(const auto& element : vRefWrap){ element.get().getA(); } /* no need delete element*/ vRefWrap.clear(); اکنون به راحتی به رفرنس هایی از کلاس فرزند و کلاس پایه دسترسی خواهید داشت و هم خطر استفاده از اشاره گرها را نخواهید داشت و کد بسیار ساده تر و هم قابلیت نگهداری بهتری نسبت به سایر کدهای نوشته شده دارا می باشد. امیدوارم موفق باشید.
  20. 1 امتیاز

    نگارش 2.3.1

    12 دریافت

    همانطور که می‌دانید محیط توسعه‌ی یکپارچه‌ی نرم‌افزار Visual Studio عنوان یکی از جامع‌ترین محیط‌های توسعه بسیار شناخته شده است. برنامه‌نویسان سی‌پلاس‌پلاس بسیاری از پروژه‌های خود را تحت این محیط علاوه بر آن کیوت کریتور توسعه می‌دهند. کتابخانه‌ی کیوت افزونه‌ای را برای یکپارچه سازی خود با محیط ویژوال استودیو ارائه داده است که در حالت عادی از کتابخانه‌ی Qt به خوبی پشتیبانی می‌کند و اجازه می‌دهد تا شما کُد‌های خود را که بر اساس کتابخانه‌ی کیوت هستند در محیط ویژوال استودیو توسعه و خروجی بگیرید. آخرین اخبار و گفتگو‌ها درباره‌ی این ابزار

    رایگان

  21. 0 امتیاز
    مثال رو که در پست اول فرستادم دقت نکردید ؟
این صفحه از پرچمداران بر اساس منطقه زمانی تهران/GMT+04:30 می باشد
×
×
  • جدید...