رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

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

مدیران مرجع
  • تعداد ارسال ها

    97
  • تاریخ عضویت

  • روز های برد

    25

تمامی مطالب نوشته شده توسط قاسم رمضانی منش

  1. با سلام. با توجه به اینکه محیط Qt Creator برای استفاده از QWidget یا Qt Quick یک محیط‌بصری هم تعبیه کرده است که کار را برای استفاده راحت‌تر کرده است. امّا واقعاً استفاده از این ابزار در پروژه‌های بزرگ درست می‌باشد ؟ یا اینکه باید از برای کنترل بیشتر با استفاده از کدنویسی‌محض طراحی‌محیط را به عهده گرفت ؟ در این‌صورت ... وظیفه‌ی اصلی این محیط طراحی چیست ؟ - مثال‌هایی که خود Qt هم دارد ، بدون استفاده از محیط ویژوال طراحی شده است.
  2. قاسم رمضانی منش

    مرسی از توضیحاتتون. بله اطلاع از کراس‌پلتفرم شدن MS SQL Server دارم... ولی خب مایکروسافت است دیگر ... . درمورد نیاز واقعی هم گفتم که برنامه حسابداری یه موسسهٔ آموزشی هست که فقط نیاز به ذخیره اطلاعات متنی هست... . این برنامه کلاینت هست و روی دسکتاپ و موبایل قرار خروجی گرفته بشه. که دیتابیس هم داخل سرور هست. و همزمان ممکنه حداکثر ده کاربر به دیتابیس دسترسی داشته‌باشن. و با توجه به توضیحات اطلاعات پردازشی سنگین نداریم.
  3. با سلام. معیار‌ها برای انتخاب یک دیتابیس برای یک برنامهٔ حسابداری چه چیزهایی میتواند باشد ؟ بنده درحال شروع نوشتن یک برنامهٔ حسابداری با استفاده از فریمورک Qt هستم. و وهله اوّل که درحال طراحی بخش‌های مختلف برنامه هستم نیاز به انتخاب یک دیتابیس دارم. که با وجود تنوع دیتابیس‌ها در این زمینه نیاز دانستم که نظر مابقی دوستان را در این زمینه بدانم. بنده برنامه‌‌ی حسابداری هلو را دیدم که از دیتابیس MS SQL Server استفاده میکند. ولی خب برنامهٔ من Cross-Platform می‌باشد و نمیتوانم از MS SQL Server استفاده کنم.
  4. قاسم رمضانی منش

    درست متوجه منظورتون نشدم ! ولی : void Dialog::on_pushButton_2_clicked(){ mThread->Stop = false; } این اسلات (slot) وقتی صدا زده میشه خب باید مقدار متغیر MyThread::Stop رو برابر false قرار بده دیگه ! درسته ؟ و طبق دستوراتی که داخل تابع void MyThread::run نوشته شده : درصورتی‌که این متغیر مقدارش false باشه باید حلقه شکسته بشه و دیگه چیزی emit نکنه. و وقتی ما این اسلات را فراخوانی میکنیم. اتفاقی نمی‌افته و باز حلقه به کار خودش ادامه میده.
  5. با سلام. در حال یادگیرQt و Thread ها بودم که به مشکل دسترسی به متغیر در Thread بر خوردم. کلاس زیر از QThread مشتق شده است : #ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QWidget> #include <QThread> #include <QMutex> class MyThread : public QThread { Q_OBJECT public: explicit MyThread(QObject *parent = nullptr); void run() override; bool Stop; signals: void NumberChanged(int); }; #endif // MYTHREAD_H #include "mythread.h" MyThread::MyThread(QObject *parent) : QThread (parent) { } void MyThread::run() { for(int i=0; i<100000000 ; ++i){ QMutex mutex; mutex.lock(); if (this->Stop) break; mutex.unlock(); emit NumberChanged(i); this->msleep(100); } } داخل فرم خودم دو QPushBotton و یک QLabel دارم. که یکی از دکمه‌ها (QPushButton) وظیفه اجرای یک QThread را دارد و یکی دیگه باعث متوقف کردن کار QThread ایجاد شده : #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog){ ui->setupUi(this); mThread = new MyThread(this); connect(mThread,SIGNAL(NumberChanged(int)),this,SLOT(onNumberChanged (int))); } Dialog::~Dialog(){ delete ui; } void Dialog::onNumberChanged(int Number){ ui->label->setText(QString::number(Number)); } void Dialog::on_pushButton_clicked(){ mThread->start(); } void Dialog::on_pushButton_2_clicked(){ mThread->Stop = false; } در کد بالا زمانی‌که on_pushButton_clicked فراخوانی شد. QThread را اجرا میکند. و در مقابل زمانی‌که on_pushButton_2_clicked فراخوانی شد. متغیر bool MyThread::Stop را برابر مقدار false میگذارد که باعث از بین رفتن عملیات QThread ایجاد شده میشود. اما در اصل هیچ تفاوتی ایجاد نمیکند ؟ و زمان بستن برنامه با خطای لاگ زیر برخورد میکنم : 21:39:20: Starting /tmp/untitled/build-untitled-Desktop_Clang_7_0_0-Debug/untitled... QThread: Destroyed while thread is still running 21:39:32: The program has unexpectedly finished. 21:39:32: The process was ended forcefully. 21:39:32: /tmp/untitled/build-untitled-Desktop_Clang_7_0_0-Debug/untitled crashed. کجای کار اشتباه شده است ؟
  6. با سلام. به چه روشی میتوان خروجی متن را در لحظه آپدیت کرد. برای مثال کد زیر را در نظر داشته باشید : #include <iostream> int main (void){ for(unsigned int index =10 ; index <= 100 ; index+=10) std::cout << index << '%' << std::endl; return 0; } که خروجی زیر تولید میشه : [ghasem@clibcore AnotherJustForTest]$ g++ -o main main.cpp && ./main 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% خب ! حالا اگر ما بخواهیم همان خط اول فقط آپدیت بشود و از 10% تا 100% را در همان خط چاپ کند و دیگر به خط بعدی نرود چه باید کرد ؟ یه مثال دیگه ... مدیربسته‌های dnf , apt , pacman که نوارپیشرفتی در خروجی کنسول خود نشان میدن.
  7. قاسم رمضانی منش

    با تشکر از توضیحات شما @فرهاد شیری . بنده اون لینکی که پیشنهاد داده بودید و به‌علاوه موارد دیگری هم در این زمینه خوانده بودم. و دقیقاً سعی کردم مثالی مرتبط به این موضوع بزنم. پس یه نگاه دیگه به فایل هدری که مثال زده بودم بکنید : class Base{ public : Base(){std::cout << "BASE#c";} ~Base(){std::cout << "BASE#d";} }; void AnotherTest (void){} void AndAnotherTest(void){} در فایل main.cpp من تنها یک بار تابع AndAnotherTest() را فراخوانی کرده بودم. که مسلماً طبق چیزی که گفتید : و بنده به این صورت برداشت کردم : که ابتدا تمام کد های فایل هدر من کامپایل شده و سپس در زمان لینک ، لینکر می‌بایست تنها لینکی به تابع AndAnotherTest() داشته باشد. و فقط هم این تابع در خروجی کد من باشد. من برای تست این موضوع از تعریف یک کلاس و دو تابع استفاده کردم. از آن‌جایی که میدونستم کلاس تنها یه نقشه از ساختمان است. پس تا زمانی که از این نقشه نمونه‌سازی نشوند ، نباید هیچ حافظه‌ای یا کامپایلی برای کد های این کلاس درنظر گرفته بشه. که تا این قسمت با توجه به خروجی اسمبلی من درست بود و حرفی از کلاس Base زده نشده بود. اما درمورد دوتا تابع بعدی که دقیقا هر دو کامپایل و درخروجی کد من بودن. در مقایسه هایی که کردم (که تماماً در طوماری که بالا ارسال کردم ، ذکر شده) متوجه شدم تنها تفاوت در فایلی که من تابع را فراخوانی و در فایلی که فراخوانی نکرده بودم تنها یک خط در خروجی اسمبلی بود ؛ اون‌هم دستور فراخوانی تابع AndAnotherTest() : [ghasem@clibcore output]$ cat --number JustHeader | egrep "(AnotherTest|AndAnotherTest)" > OnlyHeaderGREP [ghasem@clibcore output]$ cat --number UseOneFunction | egrep "(AnotherTest|AndAnotherTest)" > UseOneFunctionGREP [ghasem@clibcore output]$ diff JustHeader UseOneFunction 55d54 < call _Z14AndAnotherTestv در مورد هدرفایل iostream هم. متغیرها و توابعی که به صورت static یا non-member function تعریف شده‌اند ، خروجی اسمبلی‌شان در فایل نهایی من هست. به غیر از tamplate-function و template-class و class ها که آن‌ها دقیقا برای کامپایل شدن نیاز به استفاده شدن را دارند. الان دلیل این اتفاق : وجود کد اسمبلی تابع استفاده نشده در فایل هدر ، در خروجی نهایی فایل ترجمه شده به اسمبلی من چیست ؟ و آیا راهی برای جلوگیری از این موضوع هست ؟
  8. قاسم رمضانی منش

    (عذرخواهی میکنم مطالبی ارسالی این پست به دلیلی خروجی اسمبلی کدها طولانی و خارج از حوصله است. لذا متن‌های بین کدها با سبک دُرُشت و اندازه ۱۸ نوشته شده است) خب مگه اون هدر فایلی که اضافه میکنیم کامپایل نمیشه ؟ الان یک نمونه تستی که من نوشتم : header.hpp class Base{ public : Base(){std::cout << "BASE#c";} ~Base(){std::cout << "BASE#d";} }; void AnotherTest (void){} void AndAnotherTest(void){} main.cpp #include <iostream> #include "header.hpp" int main(){ return 0; } خروجی اسمبلی زیر را تولید کرده : .file "main.cpp" .text .section .rodata .type _ZStL19piecewise_construct, @object .size _ZStL19piecewise_construct, 1 _ZStL19piecewise_construct: .zero 1 .local _ZStL8__ioinit .comm _ZStL8__ioinit,1,1 .text .globl _Z11AnotherTestv .type _Z11AnotherTestv, @function _Z11AnotherTestv: .LFB1524: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1524: .size _Z11AnotherTestv, .-_Z11AnotherTestv .globl _Z14AndAnotherTestv .type _Z14AndAnotherTestv, @function _Z14AndAnotherTestv: .LFB1525: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1525: .size _Z14AndAnotherTestv, .-_Z14AndAnotherTestv .globl main .type main, @function main: .LFB1526: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1526: .size main, .-main .type _Z41__static_initialization_and_destruction_0ii, @function _Z41__static_initialization_and_destruction_0ii: .LFB2010: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl %edi, -4(%rbp) movl %esi, -8(%rbp) cmpl $1, -4(%rbp) jne .L7 cmpl $65535, -8(%rbp) jne .L7 movl $_ZStL8__ioinit, %edi call _ZNSt8ios_base4InitC1Ev movl $__dso_handle, %edx movl $_ZStL8__ioinit, %esi movl $_ZNSt8ios_base4InitD1Ev, %edi call __cxa_atexit .L7: nop leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE2010: .size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii .type _GLOBAL__sub_I__Z11AnotherTestv, @function _GLOBAL__sub_I__Z11AnotherTestv: .LFB2011: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $65535, %esi movl $1, %edi call _Z41__static_initialization_and_destruction_0ii popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE2011: .size _GLOBAL__sub_I__Z11AnotherTestv, .-_GLOBAL__sub_I__Z11AnotherTestv .section .init_array,"aw" .align 8 .quad _GLOBAL__sub_I__Z11AnotherTestv .hidden __dso_handle .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits و کد زیر : #include <iostream> #include "header.hpp" int main(){ AndAnotherTest(); return 0; } خروجی اسمبلی زیر را تولید کرده : .file "main.cpp" .text .section .rodata .type _ZStL19piecewise_construct, @object .size _ZStL19piecewise_construct, 1 _ZStL19piecewise_construct: .zero 1 .local _ZStL8__ioinit .comm _ZStL8__ioinit,1,1 .text .globl _Z11AnotherTestv .type _Z11AnotherTestv, @function _Z11AnotherTestv: .LFB1524: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1524: .size _Z11AnotherTestv, .-_Z11AnotherTestv .globl _Z14AndAnotherTestv .type _Z14AndAnotherTestv, @function _Z14AndAnotherTestv: .LFB1525: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1525: .size _Z14AndAnotherTestv, .-_Z14AndAnotherTestv .globl main .type main, @function main: .LFB1526: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 call _Z14AndAnotherTestv movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1526: .size main, .-main .type _Z41__static_initialization_and_destruction_0ii, @function _Z41__static_initialization_and_destruction_0ii: .LFB2010: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl %edi, -4(%rbp) movl %esi, -8(%rbp) cmpl $1, -4(%rbp) jne .L7 cmpl $65535, -8(%rbp) jne .L7 movl $_ZStL8__ioinit, %edi call _ZNSt8ios_base4InitC1Ev movl $__dso_handle, %edx movl $_ZStL8__ioinit, %esi movl $_ZNSt8ios_base4InitD1Ev, %edi call __cxa_atexit .L7: nop leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE2010: .size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii .type _GLOBAL__sub_I__Z11AnotherTestv, @function _GLOBAL__sub_I__Z11AnotherTestv: .LFB2011: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $65535, %esi movl $1, %edi call _Z41__static_initialization_and_destruction_0ii popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE2011: .size _GLOBAL__sub_I__Z11AnotherTestv, .-_GLOBAL__sub_I__Z11AnotherTestv .section .init_array,"aw" .align 8 .quad _GLOBAL__sub_I__Z11AnotherTestv .hidden __dso_handle .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits و در کد اسمبلئ که هیچ یک از توابع فایلheader.hpp استفاده نشده است. خروجی اسمبلی توابع فایل header.hpp موجود هست : [ghasem@clibcore tmp]$ cat --number OnlyHeader | egrep "(AnotherTest|AndAnotherTest)" 11 .globl _Z11AnotherTestv 12 .type _Z11AnotherTestv, @function 13 _Z11AnotherTestv: 27 .size _Z11AnotherTestv, .-_Z11AnotherTestv 28 .globl _Z14AndAnotherTestv 29 .type _Z14AndAnotherTestv, @function 30 _Z14AndAnotherTestv: 44 .size _Z14AndAnotherTestv, .-_Z14AndAnotherTestv 92 .type _GLOBAL__sub_I__Z11AnotherTestv, @function 93 _GLOBAL__sub_I__Z11AnotherTestv: 109 .size _GLOBAL__sub_I__Z11AnotherTestv, .-_GLOBAL__sub_I__Z11AnotherTestv 112 .quad _GLOBAL__sub_I__Z11AnotherTestv و در کدی که فقط تابع AndAnotherTest() استفاده شده است : [ghasem@clibcore tmp]$ cat --number UseOneFunction | egrep "(AnotherTest|AndAnotherTest)" 11 .globl _Z11AnotherTestv 12 .type _Z11AnotherTestv, @function 13 _Z11AnotherTestv: 27 .size _Z11AnotherTestv, .-_Z11AnotherTestv 28 .globl _Z14AndAnotherTestv 29 .type _Z14AndAnotherTestv, @function 30 _Z14AndAnotherTestv: 44 .size _Z14AndAnotherTestv, .-_Z14AndAnotherTestv 55 call _Z14AndAnotherTestv 93 .type _GLOBAL__sub_I__Z11AnotherTestv, @function 94 _GLOBAL__sub_I__Z11AnotherTestv: 110 .size _GLOBAL__sub_I__Z11AnotherTestv, .-_GLOBAL__sub_I__Z11AnotherTestv 113 .quad _GLOBAL__sub_I__Z11AnotherTestv و تنها تفاوت این دو در فراخوانی تابع AndAnotherTest() هست : [ghasem@clibcore output]$ cat --number JustHeader | egrep "(AnotherTest|AndAnotherTest)" > OnlyHeaderGREP [ghasem@clibcore output]$ cat --number UseOneFunction | egrep "(AnotherTest|AndAnotherTest)" > UseOneFunctionGREP [ghasem@clibcore output]$ diff JustHeader UseOneFunction 55d54 < call _Z14AndAnotherTestv در حالی که من از پاسخ شما @سروش ربیعی فهمیدم که گفتید هدرفایل‌ها تاثیری در حجم برنامه‌ٔ‌نهایی نداره. اما مثال بالا که زدم با وجود اینکه هیچ فراخوانی از توابع نشده بود بازم هم کد های هدرفایل کامپایل شد. و اما بخشی که منو گیج کرده ! ما در این فایل هم هدرفایل iostream و هم header.hpp را وارد برنامه کرده ایم. توابعی که در header.hpp بود تماما کامپایل شده و در خروجی اسمبلی هست. اما خبری از توابع و دستورات iostream نیست. این خروجی اسمبلی بدون هدرفایل iostream هست : .file "main.cpp" .text .globl _Z11AnotherTestv .type _Z11AnotherTestv, @function _Z11AnotherTestv: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size _Z11AnotherTestv, .-_Z11AnotherTestv .globl _Z14AndAnotherTestv .type _Z14AndAnotherTestv, @function _Z14AndAnotherTestv: .LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE1: .size _Z14AndAnotherTestv, .-_Z14AndAnotherTestv .globl main .type main, @function main: .LFB2: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE2: .size main, .-main .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits و تفاوت آن با خروجی اسمبلی‌ای که هدرفایل iostream وجود داشته است : [ghasem@clibcore output]$ diff WithIostream WithoutIostrea 3,10d2 < .section .rodata < .type _ZStL19piecewise_construct, @object < .size _ZStL19piecewise_construct, 1 < _ZStL19piecewise_construct: < .zero 1 < .local _ZStL8__ioinit < .comm _ZStL8__ioinit,1,1 < .text 14c6 < .LFB1518: --- > .LFB0: 26c18 < .LFE1518: --- > .LFE0: 31c23 < .LFB1519: --- > .LFB1: 43c35 < .LFE1519: --- > .LFE1: 48c40 < .LFB1520: --- > .LFB2: 60c52 < .LFE1520: --- > .LFE2: 62,113d53 < .type _Z41__static_initialization_and_destruction_0ii, @function < _Z41__static_initialization_and_destruction_0ii: < .LFB2001: < .cfi_startproc < pushq %rbp < .cfi_def_cfa_offset 16 < .cfi_offset 6, -16 < movq %rsp, %rbp < .cfi_def_cfa_register 6 < subq $16, %rsp < movl %edi, -4(%rbp) < movl %esi, -8(%rbp) < cmpl $1, -4(%rbp) < jne .L7 < cmpl $65535, -8(%rbp) < jne .L7 < movl $_ZStL8__ioinit, %edi < call _ZNSt8ios_base4InitC1Ev < movl $__dso_handle, %edx < movl $_ZStL8__ioinit, %esi < movl $_ZNSt8ios_base4InitD1Ev, %edi < call __cxa_atexit < .L7: < nop < leave < .cfi_def_cfa 7, 8 < ret < .cfi_endproc < .LFE2001: < .size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii < .type _GLOBAL__sub_I__Z11AnotherTestv, @function < _GLOBAL__sub_I__Z11AnotherTestv: < .LFB2002: < .cfi_startproc < pushq %rbp < .cfi_def_cfa_offset 16 < .cfi_offset 6, -16 < movq %rsp, %rbp < .cfi_def_cfa_register 6 < movl $65535, %esi < movl $1, %edi < call _Z41__static_initialization_and_destruction_0ii < popq %rbp < .cfi_def_cfa 7, 8 < ret < .cfi_endproc < .LFE2002: < .size _GLOBAL__sub_I__Z11AnotherTestv, .-_GLOBAL__sub_I__Z11AnotherTestv < .section .init_array,"aw" < .align 8 < .quad _GLOBAL__sub_I__Z11AnotherTestv < .hidden __dso_handle با یه نگاه کردن به فایل iostream : #ifndef _GLIBCXX_IOSTREAM #define _GLIBCXX_IOSTREAM 1 #pragma GCC system_header #include <bits/c++config.h> #include <ostream> #include <istream> namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION extern istream cin; extern ostream cout; extern ostream cerr; extern ostream clog; #ifdef _GLIBCXX_USE_WCHAR_T extern wistream wcin; extern wostream wcout; extern wostream wcerr; extern wostream wclog; #endif static ios_base::Init __ioinit; _GLIBCXX_END_NAMESPACE_VERSION } #endif ظاهرا دلیل اون تفاوت هم مشخص هست. اما تکلیف مابقی هدرفایل هایی که داخل iostream وارد شده اند چیست ؟ مگه توابع و متغیر های آنها نیز کامپایل نمیشود ؟ پس چرا مثل خروجی کد اسمبلی‌ توابع موجود در header.hpp در سورس اسمبلی نهایی نیست ؟ (و باز عذرخواهی میکنم بابت طولانی بودن پست )
  9. با سلام. درحال بررسی کدهای کتابخانه‌های استاندارد سی‌پلاس‌پلاس بودم ، که متوجه موردی شدم ؛ تقریبا بیشتر توابع و کلاس‌هایی که از کتابخانه‌های استاندارد استفاده میکنیم دارای مقدار زیادی وابستگی به توابع و فایل‌های دیگر دارند. برای مثال تابع std::swap که برای جابه‌جایی دو نوع استفاده میشود به این‌صورت میباشد : template<typename _Tp, size_t _Nm> inline typename std::enable_if<__is_swappable<_Tp>::value>::type swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]) noexcept(std::__is_nothrow_swappable<_Tp>::value) { for (size_t __n = 0; __n < _Nm; ++__n) swap(__a[__n], __b[__n]); } که برای کامپایل نیاز به این موارد در دو فایل move.h و type_traits دارند : template<typename _Tp, _Tp __v> struct integral_constant { static constexpr _Tp value = __v; typedef _Tp value_type; typedef integral_constant<_Tp, __v> type; constexpr operator value_type() const noexcept { return value; } #if __cplusplus > 201103L #define __cpp_lib_integral_constant_callable 201304 constexpr value_type operator()() const noexcept { return value; } #endif }; template<bool __v> using __bool_constant = integral_constant<bool, __v>; typedef integral_constant<bool, true> true_type; typedef integral_constant<bool, false> false_type; template<bool, typename _Tp = void> struct enable_if { }; namespace __swappable_details { using std::swap; struct __do_is_swappable_impl { template<typename _Tp, typename = decltype(swap(std::declval<_Tp&>(), std::declval<_Tp&>()))> static true_type __test(int); template<typename> static false_type __test(...); }; struct __do_is_nothrow_swappable_impl { template<typename _Tp> static __bool_constant< noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>())) > __test(int); template<typename> static false_type __test(...); }; } template<typename _Tp> struct __is_swappable_impl : public __swappable_details::__do_is_swappable_impl { typedef decltype(__test<_Tp>(0)) type; }; template<typename _Tp> struct __is_swappable : public __is_swappable_impl<_Tp>::type { }; template<typename _Tp> struct __is_nothrow_swappable_impl : public __swappable_details::__do_is_nothrow_swappable_impl { typedef decltype(__test<_Tp>(0)) type; }; template<typename _Tp> struct __is_nothrow_swappable : public __is_nothrow_swappable_impl<_Tp>::type { }; خب ! سوال اول بنده اینجاس که در چنین مواردی ، بهتر نیست که تابعstd::swap را با توجه به نیازی که داریم خودمان پیاده‌سازی کنیم ؟ و اینکه آیا این حجم از کد و استفاده از template ها هزینه پِرفُورْمَنْس زیادی ندارد ؟ و سوال دوم : تمام این کدها در دو فایل move.h و type_traits قرار دارد (که مسلماً این فایل ها هم وابستگی‌های دیگری به دیگر فایل‌ها دارند). آیا ما نمی‌توانیم مثلا فقط تابع std::swap را در برنامه‌ی خود فراخوانی کنیم که این حجم از کد احتیاج به کامپایل نداشته باشد ؟ برای نمونه در زبان برنامه‌نویسی پایتون ، با استفاده از دستور import ما یک ماژول را وارد برنامه میکنیم : import time در این روش تمام ماژول time به فایل‌ما اضافه خواهند شد. درصورتی که ما فقط از ماژول time نیاز به تابع sleep داشته باشیم کافی است که از قابلت from ... import ... استفاده کنیم : from time import sleep آیا این حرکت در C++ نیز امکان‌پذیر هست ؟
  10. قاسم رمضانی منش

    نه هیچ برنامه‌ای به‌طور خودکار در چند ترد اجرا نمیشه. مرسی بابت پاسخ. بله الان که با خوندن فایل /proc/PID/status متوجه شدم که کلا این برنامه از یک thread بیشتر استفاده نمیکنه :).
  11. قاسم رمضانی منش

    دقیقا متوجه نشدم منظورتان را از محیط توسعه . مشخصات سیستمی که این برنامه را اجرا کرده : OS: Fedora release 29 (Twenty Nine) x86_64 Kernel: 4.19.6-300.fc29.x86_64 CPU: Intel i7 M 620 (4) @ 2.667GHz GPU: NVIDIA NVS 3100M Memory: 3801MiB و کامپایلر g++ (GCC) 8.2.1 20181105 (Red Hat 8.2.1-5) بدون دستکاری فلگ‌ها استفاده با چه فلگ هایی این عمل صورت میگیره ؟
  12. با سلام ! آیا برنامه ها به صورت خودکار در حالت Multi Threading اجرا میشوند ؟ بنده قطعه کد زیر را کامپایل و اجرا گرفته ام : main.cpp #include <iostream> int main(void){ constexpr double long AnotherIndex = 999999999999999999; for(double long index=0;index <= AnotherIndex;++index){ std::cout << index << std::endl; } return 0x0000; } بعد از اجرا ، خروجی برنامه ی htop به اینصورت بود : 1 [|||||||||||||||||||||| 71.9% ] Tasks: 166, 738 thr; 4 running 2 [||||||||||||||||||| 60.30%] Load average: 2.94 1.88 1.61 3 [||||||||||||||||||||||| 74.1% ] Uptime: 04:50:24 4 [|||||||||||||||||| 56.6% ] Mem[||||||||||||||||||||||||2.76G/3.71G] Swp[||| 790M/7.99G] PID USER PRI NI VIRT PES SHR S CPU% MEM% TIME+ Command 18991 ghasem 20 0 5616 1692 1544 R 89.1 0.0 1:13.01 /tmp/Opt/main یعنی زمان اجرای این برنامه هر چهار هسته ی پردازنده درگیر خواهد شد ! ... آیا کامپایلر به صورت خودکار متناسب با پردازش Multi Threading کد را کامپایل میکند ؟ یا اینکه این‌کار به عهده سیستم عامل می‌باشد ؟
  13. با سلام. بنده خروجی کد اسمبلی تولید شده Struct و Class را بررسی کردم ظاهرا که خروجی یکسانی دارند ! آیا واقعا دیگر تفاوتی بین کلمه‌کلیدی struct و class در سی‌پلاس‌پلاس نیست ؟ struct.cpp struct AnotherType{ public : int StructType; }; int main(){ AnotherType Object; return 0; } class.cpp class AnotherType{ public : int ClassType; }; int main(){ AnotherType Object; return 0; } و خروجی های اسمبلی تولید شده : struct.cpp [ghasem@clibcore test]$ g++ -S struct.cpp -o Struct && cat Struct .file "struct.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits class.cpp [ghasem@clibcore test]$ g++ -S class.cpp -o Class && cat Class .file "class.cpp" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 8.2.1 20181105 (Red Hat 8.2.1-5)" .section .note.GNU-stack,"",@progbits و برای اطمینان خروجی حاصل از دستور diff Struct Class : [ghasem@clibcore test]$ diff Struct Class 1c1 < .file "struct.cpp" --- > .file "class.cpp"
  14. قاسم رمضانی منش

    سلام و خسته نباشید. جناب اسدزاده باتشکر از رسیدگی شما. این مشکل در پست ارسال شده حل شد. اما همچنان در بخش ویرایشگر که میخواهیم کد را ارسال کنیم هیچ شماره خطی نمایش داده نمیشود.
  15. قاسم رمضانی منش

    @Amir Balazadeh دوست عزیز ! مرسی از پاسخِتان. ولی بهتر بود که توضیح میدادید موارد را به جای اینکه لینک ارسال کنید :). روش حل این مشکل را با توجه به روش هایی که داخل ساتی CodeProject گفته شده بود میگم تا ذخیره ای برای بقیه دوستانی باشد که این سوال رو دارن. داخل لینک سه روش گفته شده بود که دو روش رُ اینجا میگم : به همان دلیلی که گفتم + و کامپایل متوجه تعریفاتی که در فایل anothertest.cpp کردیم نمیشوند. برای رفع این مشکل ما باید یا تعاریف توابع خودمان را داخل خود کلاس قرار بدیم. یا اینکه خارج از کلاس ولی در همان فایلی که کلاس در آن هست. یعنی فایل anthertest.h. خب ! اینجا میتونیم از قابلیت های پیش‌پردازنده در سی‌پلاس‌پلاس استفاده کنیم. قبل از اینکه روش حل مشکل را بگم. یه نگاه به روش کار کرد این خط از کد بکنیم : File1.h void AnotherFunction(void){ std::cout << "I Can't do Anything :(" << std::endl; } main.cpp #include "file1.h" int main(){ return 0; } خب برای اینکه خروجی این فایل را مشاهده کنیم و متوجه بشیم که چطوری پیش‌پردازنده‌ی #include کار میکند. با استفاده از این دستور و کامپایلر gcc برنامه را کامپایل میکنیم : [ghasem@clibcore an]$ g++ -E main.cpp > file و حالا خروجی حاصل از دستور بالا : [ghasem@clibcore an]$ cat file # 1 "main.cpp" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "main.cpp" # 1 "file1.h" 1 void AnotherFunction(void){ std::cout << "I Can't do Anything :(" << std::endl; } # 2 "main.cpp" 2 int main(){ return 0; } امیدوارم کار پیش‌پردازنده‌ی #include را قشنگ متوجه شده باشید :). حالا برای قسمت حل مشکل template ها !. یه راه ساده برای حل این مشکل اینکه ما با فایل anothertest.cpp را بعد از کلاس با استفاده از #include اضافه کنیم ... به اینصورت : class TemplateTest{ private : int ClassVariable; public : TemplateTest(const int& input); int ReturnClassVariable(void); }; #include "anothertest.cpp" و یک راه دیگه : هر دوفایل anothertest.cpp و anothertest.h را داخل فایل کدمان یعنی main.cpp وارد کنیم : #include <iostream> #include "anothertest.h" #include "anothertest.cpp" int main(){ TemplateTest<int> AnotherTemplate(100); std::cout << AnotherTemplate.ReturnClassVariable () << std::endl; return 0x0000; } با تشکر.
  16. سلام در صورتی که تعاریف توابع عضو کلاس (class function member definition) را در همان فایل anothertest.h قرار دهیم برنامه بدون مشکلی اجرا میشود. اما در صورتی که تعاریف توابع را به داخل فایل anothertest.cpp انتقال دهیم ، برنامه کامپایل ولی با خطای لینکر مواجه میشود. دلیل این اتفاق چیست ؟ --ویرایش : پس از جستجویی که انجام دادم متوجه شدم که به دلیل اینکه کامپایلر برای هر نمونه از template هایی که ما نیاز داریم یک نسخه جداگانه درست میکند. مثلا در کد زیر. کد باید به این صورت تغییر کند : class TemplateTest{ private : int ClassVariable; public : TemplateTest(const int& input); int ReturnClassVariable(void); }; Git Diff #ifndef ANOTHERTEST_H #define ANOTHERTEST_H -template <class AnotherType> class TemplateTest{ private : - AnotherType ClassVariable; + int ClassVariable; public : - TemplateTest(const AnotherType& input); - AnotherType ReturnClassVariable(void); + TemplateTest(const int& input); + int ReturnClassVariable(void); }; #endif // ANOTHERTEST_H و از آنجایی که تعاریف کلاس ها در فایل دیگری قرار دارد. کامپایلر فراموش به نمونه سازی از آنها میکند. و به این دلیل است که با خطای لینکر مواجه میشویم. و برای رفع این مشکل باید تعاریف توابع را نیز در فایل anothertest.h قرار بدهیم. با این اوصاف آیا روش دیگه ای هست که از template ها در فایل های جداگانه استفاده کنیم ؟ anothertest.h #ifndef ANOTHERTEST_H #define ANOTHERTEST_H template <class AnotherType> class TemplateTest{ private : AnotherType ClassVariable; public : TemplateTest(const AnotherType& input); AnotherType ReturnClassVariable(void); }; #endif // ANOTHERTEST_H anothertest.cpp #include "anothertest.h" template<class AnotherType> TemplateTest<AnotherType>::TemplateTest(const AnotherType &input) : ClassVariable(input){ } template<class AnotherType> AnotherType TemplateTest<AnotherType>::ReturnClassVariable(){ return this->ClassVariable; } main.cpp #include <iostream> #include "anothertest.h" int main(){ TemplateTest<int> AnotherTemplate(100); std::cout << AnotherTemplate.ReturnClassVariable () << std::endl; return 0x0000; }
  17. قاسم رمضانی منش

    سلام خب اول برات delete رو میگم که ساده تره ?. شما یه توی برنامه نویسی شئ گرا که کار با کلاس ها (class) پیش میاد. همانطوری که میدونید توابعی به صورت پیشفرض کامپایلر داخل کلاس تعریف میکنه. که یکی از این توابع اسمش سازنده (constructor) هست که وظیفه مقدار دهی کلاس را داره. این مثال رو در نظربگیرید : #include <iostream> class JustForTest{ private : int ClassVariable; public : JustForTest(const int& input) : ClassVariable(input){ } int ReturnClassVariable(){ return this->ClassVariable; } }; int main(){ JustForTest Object(10); std::cout << Object.ReturnClassVariable () << std::endl; return 0; } خب کاری که داخل این کلاس انجام شده اینکه یه کلاس به اسم JustForTeste تعریف شده که دارای یه متغیر و دو تابع عضو هست. که یکی از توابع ، تابع سازنده کلاس هست. این برنامه در اجرا هیچ مشکلی نداره و دقیقا همان چیزی که ما انتظار داریم را چاپ میکنه ، که مقدار ده هست. حالا مشکل وقتی پیش میاد که برنامه نویسی بیاد و از کلاس شما استفاده کنه و سهواً مقداری از نوع char به سازنده کلاس ارسال کنه : int main(){ JustForTest Object('3'); std::cout << Object.ReturnClassVariable () << std::endl; return 0; } بر خلاف انتظارمان این کد هم کامپایل میشه ، چرا که خود char نوعی از int هست. و مسلما خروجی نامناسبی هم داره. برای اینکه این مشکل رفع بشه اغلب برنامه نویس ها از این روش استفاده میکنن : class JustForTest{ private : int ClassVariable; JustForTest(const char& input){ } public : JustForTest(const int& input) : ClassVariable(input){ } int ReturnClassVariable(){ return this->ClassVariable; } }; به این صورت که سازنده ای با ورودی char را با نوع دسترسی private تعریف میکنن که باعث میشه برنامه نویس های دیگر نتوانن مقدار از نوع char به تابع شما ارسال کنن. اما ! واضحه که این روش زیاد جالب نیست و باعث ناخوانی و زشتی کد هم میشه. لذا بهتره که با استفاده از قابلیتی که سی پلاس پلاس فراهم کرده استفاده کنیم و این سازنده را از کلاس حذف کنیم. که این کار با استفاده از کلمه کلیدی delete صورت میگیره : class JustForTest{ private : int ClassVariable; public : JustForTest(const int& input) : ClassVariable(input){ } JustForTest(const char& input) = delete; int ReturnClassVariable(){ return this->ClassVariable; } }; به همین سادگی و بدون خون ریزی و اما کلمه کلیدی explicit : تقریبا ماننده همون مثالی هست که برای کلمه کلیدی delete در قسمت بالا زدم. همانطوری که دیدید با اینکه ما مقدار char به تابع سازنده کلاس ارسال کردیم بدون مشکل برنامه کامپایل و اجرا شد. اما اتفاقی که پشت صحنه افتاده این بوده که : کامپایلر خودش مقدار char را به int تبدیل (cast) کرده. برای اینکه از این تبدیل جلوگیری کنیم. از کلمه کلیدی explicit قبل از تابع سازنده استفاده میکنیم : #include <iostream> class JustForTest{ private : int ClassVariable; public : explicit JustForTest(const int& input) : ClassVariable(input){ } int ReturnClassVariable(){ return this->ClassVariable; } }; int main(){ JustForTest Object = '3'; std::cout << Object.ReturnClassVariable () << std::endl; return 0; } برنامه ی بالا کامپایل نخواهد شد. چرا که هیچ تابع سازنده ای با پارامتر char پیدا نشده ! اما ممکنه که سوال بپرسید : پس فرق explicit با delete در چی هست ؟ جواب سوال : اگه کمی به کد دقت کنید متوجه میشید که ما با استفاده از Copy initialization (یعنی استفاده از = برای مقدار دهی) سازنده کلاس را مقدار دادیم. ولی درصورتی که از direct یا uniform initialization استفاده کنیم کد ما همچنان کامپایل میشود.. مثال : int main(){ JustForTest Object('3'); std::cout << Object.ReturnClassVariable () << std::endl; return 0; } خب برای اینکه به طور کلی ما تابع سازنده ای با پارامتر char را محدود کنیم باید از کلمه کلیدی delete‌ استفاده کنیم. خلاصه : کلمه کلیدی explicit برای محدود کردن تبدیل نوع در پارامتر کلاس هست. اما این در زمانی اتفاق می افتد که ما از copy initialization برای مقداردهی سازنده کلاس استفاده کنیم. و در صورت استفاده از direct یا uniform initialization دیگه این عمل امکان پذیر نیست. و برای اینکه یک تابع را به کلی از کلاس محدود کنیم از کلمه کلیدی delete استفاده میکنیم که باعث میشود هیچ شئ توانایی فراخوانی آن تابع را نداشته باشد.
  18. سلام اول بگم که شما نمیتونید بدون داشتن تجربه عملی و واقعی ، توانایی نوشتن کد های با کیفیت و Stable داشته باشید. و حتما باید در پروژه های واقعی و بزرگ شرکت کنید. گفتم که ! برنامه نویسی بدون تجربه و تلاش های مستمر نشدنی هست. پس به این راحتی نباید انتظار درآمد زایی داشته باشید. اما میتونید کار هایی اعم از نوشتن پروژه های جدید ... و ثبت خلاقیت های جدید انجام بدید. مثل یه نمونه از پیشنهادی که دوستمون دادن @mohamad ... و مثالی که درباره انیستاگرام زدن. و اما یک سری پیشنهاد : سعی کنید با استارت آپ های کوچک و نوپا همکار بشید و شراکت کنید. پروژه های داخل Gitlab و Github را دنبال کنید. معمولا بیشتر پروژه ها دارای یه لیست به اسم TODO هستن ، شما میتونید با کامل کردن اونا به تجربه های برنامه نویسی خودتون اضافه کنید. و همچنین رزومه ی خودتون. جهت کارآموزی به شرکت های برنامه نویسی معتبر برید. برای پیدا کردن این شرکت ها میتونید از طریق آگهی های استخدامی که داخل سایت های کاریابی مثل جابینجا استفاده کنید پروژه های درحال تست و unstable رو بررسی کنید و سعی کنید باگ های برنامه ها را پیدا و باگ ها را برطرف کنید. و رفته رفته سعی کنید بر علم برنامه نویسی و دانش خودتون توی برنامه نویسی بی‌افزایید.
  19. قاسم رمضانی منش

    مرسی ? بعد از راه اندازی دوباره محیط Qt Creator زبانه C++ Code Style دوباره در قسمت تنظیمات محیط برگشت.
  20. قاسم رمضانی منش

    بله ! از این پلاگین را فعلا کرده بودم. و دوباره بعد از غیر فعال کردن هم تاثیری در بازگشت اون زبانه C++ Cody Style نداشت
  21. قاسم رمضانی منش

    سلام ! در محیط Qt Creator 4.8 (Base On Qt 5.12.0) پس از بررسی قسمت تنظیمات (Tools -> Options ) متوجه شدم که زبانه C++ Code Style دردسترس نمی‌باشد. آیا راهی برای برگرداندن این زبان هست ؟
  22. با سلام و تشکر ! منظورتان دقیقا از یک برنامه ی قابل اعتماد چیست ؟
  23. قاسم رمضانی منش

    سلام بهتر بود که مشکلتون رُ هم با این کار بگید ! درکل برای اینکار میتونید از دستورالعمل هایی که در این قسمت گفته شده استفاده کنید : SQL Database Drivers : Building the Drivers این لینک ها هم میتونن مفید باشن : Create MySQL driver for Qt5 on Windows Connection Database in Qt creator
  24. قاسم رمضانی منش

    برنامه با Log زیر ، لحظه ای اجرا و بعد بسته میشود با استفاده از دیباگر gdb برنامه ی Qt 3D Studio را اجرا گرفتم که دلیل Segmentation fault (core dumped) را : Thread 1 "Qt3DStudio" received signal SIGSEGV, Segmentation fault. 0x0000000000916157 in CStudioApp::getDuplicateType (this=this@entry=0x11b7cc0 <g_StudioApp>) at Application/StudioApp.cpp:996 996 Application/StudioApp.cpp: No such file or directory. گفته است.
  25. قاسم رمضانی منش

    با سلام ! بعد از نصب بسته های Qt 3D Studio 2.2.0 و Qt 3D Studio Runtime 2.2.0 با استفاده از نصاب آنلاین ; برنامه را در دایرکتوری Qt/Qt3DStudio-2.2.0/bin اقدام به اجرای برنامه کردم : [ghasem@clibcore bin]$ ./Qt3DStudio برنامه با Log زیر ، لحظه ای اجرا و بعد بسته میشود : [ghasem@clibcore bin]$ ./Qt3DStudio qt3ds.trace_info: Studio: "/home/ghasem/Software/Qt/Qt3DStudio-2.2.0/bin/Qt3DStudio" qt3ds.trace_info: Version: "2.2.0" static QSurfaceFormat CWGLRenderContext::selectSurfaceFormat(QOpenGLWidget*) selected surface format: QSurfaceFormat(version 3.3, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::CoreProfile) Warning: Setting a new default format with a different version or profile after the global shared context is created may cause issues with context sharing. libpng warning: iCCP: known incorrect sRGB profile static QSurfaceFormat CWGLRenderContext::selectSurfaceFormat(QOpenGLWidget*) selected surface format: QSurfaceFormat(version 3.3, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::CoreProfile) Warning: Setting a new default format with a different version or profile after the global shared context is created may cause issues with context sharing. Segmentation fault (core dumped) طبق گفته سایت مربوطه حداقل نیاز OpenGL ورژن 3.3 هست. مشخصات نسخه ای که من استفاده میکنم : OpenGL vendor string: nouveau OpenGL renderer string: NVA8 OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.2.4 OpenGL core profile shading language version string: 3.30 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 3.1 Mesa 18.2.4 OpenGL shading language version string: 1.40 OpenGL context flags: (none) OpenGL ES profile version string: OpenGL ES 3.0 Mesa 18.2.4 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00 مشخصات پلتفرم : OS : Fedora release 29 (Twenty Nine) x86_64 Kernel : 4.19.4-300.fc29.x86_64 GPU : NVIDIA NVS 3100M Qt : 5.11.2 - 5.12.0 آیا پیشنیاز دیگه ای برای نصب نیاز هست ؟
×
×
  • جدید...