گنجه

# 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 (به زودی!) کل مشکل از بیخ حل بشه و دیگه نیازی به ابزار اضافی نباشه.

  1. Compiler []
  2. مثل همیشه نقل به مضمون و آزمایش‌نشده []
  3. Build []
  4. معادل خوبی براش داری بگو []
  5. Script []
  6. Concept []

۶ نظر به “از پیغام‌های خطای STL نجات یافتم”

  1. ساقی می گوید:

    سلام

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

    یاعلی

    پاسخ

    ابراهیم پاسخ:

    سلام،
    متشکر از یادآوریتون.
    دوباره متن رو مرور کردم، ولی به جز redirect که معادل خوبی براش ندارم، فقط یک واژهٔ Concept بود که می‌شد ترجمه کرد. البته اون هم یک اصطلاح هست.
    بقیه‌شون قابل‌ترجمه نیستند. بعضی دستور لینوکس هستند (مثل make و chmod) و بعضی اسم خاص یا اصطلاح برنامه‌نویسی (مثل STL و stdout).
    اگر باز هم مورد قابل‌ترجمه‌ای یافتید با گزارشش خوش‌حالم کنید. :)

    پاسخ

  2. سلمان می گوید:

    اَبَربرچسب یا برچسب ابْر؟ یا چیز دیگه؟
    به نظرم ابْرِابربرچسب به‌تر باشه ;)

    پاسخ

  3. معین می گوید:

    جالب بود :)

    پاسخ

  4. مهدی می گوید:

    سلام
    خوشگل می نویسی .
    بعداز دوسال دوباره لینوکس نصب کردم اگه مودم رو بتونم راه بندازم دیگه به ویندوز برنمی گردم!!!!
    چی گفتم!

    ایول با تریبپ فارسی را پاس بداریم عجییب حال می کنم.

    در مورد redirect تو دیکشنری نوشته دوباره هدایت کردن ولی اگه بخوایم دو کلمه ای برگردونیم “هدایت مجدد” خوبه.

    پاسخ

    ابراهیم پاسخ:

    سلام،
    لطف داری.
    به یاد داش مجید اخراجی‌ها: بری دیگه بر نگردی … ایشالا! :D
    از پیش‌نهادت هم ممنون. دارم در مورد هم‌خانواده‌های redirect مثل redirection فکر می‌کنم. در واقع redirect یک فعل هست و باید معادل فارسیش هم یک فعل باشه، که به پیش‌نهاد شما می‌شه «هدایت مجدد کردن». یه کم طولانی هست. باز فکر کنیم ببینیم معادل به‌تر یافت می‌شه یا نه. :)

    پاسخ

نظر شما


بسم الله الرحمن الرحیم

راه‌رو گر صد هنر دارد توکل بایدش

برگه‌ها

رایانه‌ای‌ها

آمار

در کل 47 بیننده برای این صفحه
امروز 2 بیننده
در کل 1927 بیننده
از 2011/02/6