این مطلب ارسال شده است در روز یکشنبه, آذر ۳م, ۱۳۸۷ و در ساعت ۱:۲۱:۳۰ تحت دسته رایانه. شما می توانید نظرات این مطلب را با استفاده از RSS 2.0 خوراک دنبال کنید. همچنین می توانید نظر بدهید یا، بازتاب از سایت خود ارسال کنید.
گنجه
# tail -f /var/log/experience
اگر برنامهنویس C++ باشی، حتماً تا حالا مورد آزار و اذیت پیغامهای خطای سرسامآور همگردان0 در مورد STL قرار گرفتهای. مثلاً این:
testmm2.cpp:31: error: no matching function for call to ‘std::multimap<int*, int, std::less<int*>, std::allocator<std::pair<int* const, int> > >::insert(int)’ /usr/include/c++/4.3/bits/stl_multimap.h:407: note: candidates are: typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const_Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator std::multimap<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [with _Key = int*, _Tp = int, _Compare = std::less<int*>, _Alloc = std::allocator<std::pair<int* const, int> >] /usr/include/c++/4.3/bits/stl_multimap.h:431: note: typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator std::multimap<_Key, _Tp, _Compare, _Alloc>::insert(typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, const std::pair<const _Key, _Tp>&) [with _Key = int*, _Tp = int, _Compare = std::less<int*>, _Alloc = std::allocator<std::pair<int* const, int> >]
حالا این یکی بود. وقتی ده-پونزده تا از اینها یکجا رخ میده، خیلی افتضاح میشه.
مدتها با این مشکل کنار اومده بودم و دردش رو تحمل میکردم. اما اخیراً یک راه نجات یافتم: ابزاری به نام STLFilt. یک نرمافزار آزاد هست که خروجی همگردان C++ رو میگیره و اون پیغامهای وحشتناک رو مهربون میکنه. مثلاً پیغام بالا رو تبدیل میکنه به این:
testmm2.cpp:31: error: No match for ‘multimap<int *, int>::insert(int)’
stl_multimap.h:407: candidates are: map<int *, int>::iter multimap<int *, int>
::insert(const pair<const int *, int> &)
stl_multimap.h:431: map<
int *, int
>::iter multimap<
int *, int
>::insert(map<int *, int>::iter, const pair<const int *, int> &)آخش! حالا میشه خوندش!
برای استفاده از STLFilt اول باید بستهٔ مربوط به همگردانت رو بگیری. مثلاً gstlfilt.zip برای G++. توش کلی پرونده هست که همه رو بیخیال میشی به جز gSTLFilt.pl که اصل کار رو انجام میده. از stdin میخونه و توی stdout مینویسه. کاری که من کردم این بود1:
sudo su F=/usr/local/bin/stlfilt.pl echo '#!/usr/bin/perl' >$F cat gSTLFilt.pl >>$F chmod +x $F
و برای استفاده:
make 2>&1 | stlfilt.pl
برای این که هر بار نخوام stderr دستور ساخت2 (مثلاً make) رو به stdoutش redirect3 کنم، دستنوشتهٔ4 /usr/local/bin/stlfilt رو با این محتوا ساختم:
#!/bin/sh "$@" 2>&1 | stlfilt.pl
و chmod +x هم یادم نره. ![]()
حالا اینجوری استفاده میشه:
stlfilt makeبا دستنوشتهها زندگی زیباتره!
ویرایش: امید آن میرود که با معرفی «مفهوم»5ها در C++0x (به زودی!) کل مشکل از بیخ حل بشه و دیگه نیازی به ابزار اضافی نباشه.
- Compiler [↩]
- مثل همیشه نقل به مضمون و آزمایشنشده [↩]
- Build [↩]
- معادل خوبی براش داری بگو [↩]
- Script [↩]
- Concept [↩]
آذر ۳م, ۱۳۸۷ at ۸:۰۳:۵۴
سلام
اینجا بدیش اینه که فارسی و انگلیسی قاطی پاتیه!!
یه جا فارسی رو ترجمه میکنید یه جا انگلیسی!
یاعلی
پاسخ
ابراهیم پاسخ:
آذر ۳م, ۱۳۸۷ در ۲۰:۴۶:۱۱
سلام،
متشکر از یادآوریتون.
دوباره متن رو مرور کردم، ولی به جز redirect که معادل خوبی براش ندارم، فقط یک واژهٔ Concept بود که میشد ترجمه کرد. البته اون هم یک اصطلاح هست.
بقیهشون قابلترجمه نیستند. بعضی دستور لینوکس هستند (مثل make و chmod) و بعضی اسم خاص یا اصطلاح برنامهنویسی (مثل STL و stdout).
اگر باز هم مورد قابلترجمهای یافتید با گزارشش خوشحالم کنید.
پاسخ
آذر ۳م, ۱۳۸۷ at ۲۰:۵۰:۱۴
اَبَربرچسب یا برچسب ابْر؟ یا چیز دیگه؟
به نظرم ابْرِابربرچسب بهتر باشه
پاسخ
آذر ۱۱م, ۱۳۸۷ at ۱۸:۴۹:۳۳
جالب بود
پاسخ
آذر ۲۸م, ۱۳۸۷ at ۱۶:۲۱:۵۰
سلام
خوشگل می نویسی .
بعداز دوسال دوباره لینوکس نصب کردم اگه مودم رو بتونم راه بندازم دیگه به ویندوز برنمی گردم!!!!
چی گفتم!
ایول با تریبپ فارسی را پاس بداریم عجییب حال می کنم.
در مورد redirect تو دیکشنری نوشته دوباره هدایت کردن ولی اگه بخوایم دو کلمه ای برگردونیم “هدایت مجدد” خوبه.
پاسخ
ابراهیم پاسخ:
آذر ۳۰م, ۱۳۸۷ در ۱۱:۱۲:۱۶
سلام،
لطف داری.
به یاد داش مجید اخراجیها: بری دیگه بر نگردی … ایشالا!
از پیشنهادت هم ممنون. دارم در مورد همخانوادههای redirect مثل redirection فکر میکنم. در واقع redirect یک فعل هست و باید معادل فارسیش هم یک فعل باشه، که به پیشنهاد شما میشه «هدایت مجدد کردن». یه کم طولانی هست. باز فکر کنیم ببینیم معادل بهتر یافت میشه یا نه.
پاسخ