ورود

View Full Version : سوال: خطا در یک برنامه



programmer.z
پنج شنبه 15 اردیبهشت 1390, 23:33 عصر
سلام
این برنامه خطای زمان اجرا داره اما هرکارش می کنم درست نمیشه لطفا بگید خطاش از چیه؟ و چطور رفع می شه؟
برنامه یک رشته رو دریافت می کنه و اون رو با یک تابع بازگشتی معکوس می کنه و برمی گردونه.
#include <iostream>
#include <conio>
#include <cstring>

string makos(string s)
{
int x=s.length()-1;
string s1=s.replace(x,1,"");
if(x>0)
return s[x]+makos(s1);
return s[x];
}
void main()
{
string s;
cin>>s;
cout<<makos(s);
getch();
}

ژوپیتر
پنج شنبه 15 اردیبهشت 1390, 23:56 عصر
اگر Error رو می نوشتین میشد راحتتر کمکتون کنم، به نظر میاد در s.replace تعریف کردید که در x هر جا که کاراکتر با کد اسکی عدد 1 قرار داره رو با نال جایگزین بکنه چون "" برابر با نال هست و فکر کنم باید یک اسپیس میزدید مثل " " ، چون اونجوری در x چندین نال ساخته شده که طول x یا همون Length ش فقط به نال آخر اشاره میکنه و باعث اشکال میشه.

tdkhakpur
جمعه 16 اردیبهشت 1390, 02:02 صبح
این برنامه خطای زمان اجرا داره اما هرکارش می کنم درست نمیشه
اون متدهایی رو که استفاده کردید منبعش از کجاست!?
اما اگر هدفتان استفاده از کلاس string هست باید حرف s رو با حرف بزرگ یعنی S بنویسید یعنی String.

programmer.z
جمعه 16 اردیبهشت 1390, 16:43 عصر
اگر Error رو می نوشتین میشد راحتتر کمکتون کنم، به نظر میاد در s.replace تعریف کردید که در x هر جا که کاراکتر با کد اسکی عدد 1 قرار داره رو با نال جایگزین بکنه چون "" برابر با نال هست و فکر کنم باید یک اسپیس میزدید مثل " " ، چون اونجوری در x چندین نال ساخته شده که طول x یا همون Length ش فقط به نال آخر اشاره میکنه و باعث اشکال میشه.

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

programmer.z
جمعه 16 اردیبهشت 1390, 16:47 عصر
اون متدهایی رو که استفاده کردید منبعش از کجاست!?
اما اگر هدفتان استفاده از کلاس string هست باید حرف s رو با حرف بزرگ یعنی S بنویسید یعنی String.

اگر منظورتون از منبع همون هدر فایل است که در خود برنامه هم نوشتم cstring و باید بگم که ربطی به حرف بزرگ و گوچک نداره چون اولا در زبان c همه ی دستورات با حروف کوچیک هست دوما در اون صورت باید خطای کامپال می داد نه زمان اجرا.

حامد مصافی
جمعه 16 اردیبهشت 1390, 18:46 عصر
لطفا متن خطای دریافتی رو ذکر کنید و عنوان تاپیک رو هم متناسب با همون خطا تغییر بدید :-)

programmer.z
دوشنبه 19 اردیبهشت 1390, 13:40 عصر
لطفا متن خطای دریافتی رو ذکر کنید و عنوان تاپیک رو هم متناسب با همون خطا تغییر بدید :-)

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

programmer.z
چهارشنبه 21 اردیبهشت 1390, 11:02 صبح
سلم دوستان من خودم جواب سوالم رو یادفهمیدم حالا می خوام به شما هم بگم تا یاد بگیرید.

این درست شده ی این برنامه است:
#include <iostream>
#include <conio>
#include <cstring>

string makos(string s)
{
int x=s.length()-1;
string s1=s;
if(x>0)
return s[x]+makos(s1.replace(x,1,""));
return s[x];
}
void main()
{
string s;
cin>>s;
cout<<makos(s);
getch();
}

اصل خطا اولا به خاطر این بود که متد replace یه حرف از آخر متغییر s کم می کرد و می ریخت توی خودش اما من فکر می کردم که نمی ریزه دوما اینکه توی خط 10 اول می رفت سراغ makos(s1( بعد می رفت s[x] رو حساب می کرد و همه ی اینها دست در دست هم می دادند و یه خطای زمان اجرای درست و حسابی که عقل جنم بهش نرسه ایجاد می کردند برای اینکه خیلی بهتر و کاملتر بفهمید باید خودتون یه بار روی کاغذ اجراش کنید.:لبخندساده:

و در آخر جوینده یابنده بود.

با تشکر از همه ی شما

tdkhakpur
جمعه 23 اردیبهشت 1390, 01:03 صبح
و همه ی اینها دست در دست هم می دادند و یه خطای زمان اجرای درست و حسابی که عقل جنم بهش نرسه ایجاد می کردند

این که خطای زمان اجرا معمولی به حساب نمیآد شما به یک نوعی دسترسی غیر مجاز به داده هایتان پیدا میکنید که این هم برمیگرده به تحلیل اشتباه در طراحی برنامه توسط شما.


و در آخر جوینده یابنده بود.


قضیه مثل اون کسی میمونه که یک دانه سنگ رو تو چاه میندازه 100 عاقل جمع بشن نمیتونن از اون تو درش بیارن.