PDA

View Full Version : دسترسی به حافظه میانی



sajjadrad
جمعه 28 خرداد 1389, 17:53 عصر
میدونید وقتی از دستور cin برای char یا string استفاده میکنیم بعد از وارد کردن رشته توسط کاربر تموم رشته به حافظه میانی میره و دستور cin از اول رشته تا پایان خط،خط فاصله و نول میخونه....
مثلا وقتی کاربر I am fine رو وارد میکنه کل i am fine میره به حافظه میانی و دستور cin ابتدا i رو میخونه و به متغیر میفرسته و اگه دوباره cin فراخونی بشه am رو داخل متغیر میزاره و در فراخونی دوباره fine رو در متغیر میزاره و وقتی به null رسید حافظه میانی پاک میشه...
من یه دستور میخوام که حافظه میانی رو پاک کنه و یا null بفرسته ... (از کنترل Z نمیخوام استفاده کنم)

آیا دستوری هست که بشه با اون حافظه میانی رو پاک کرد؟

به طور کلی منظورم اینه :
میخوام وقتی با cin اولی i رو خوند وقتی دوباره cin رو فراخونی کردم دیگه am رو نخونه بلکه یه رشته جدید بگیره....

tdkhakpur
جمعه 28 خرداد 1389, 20:58 عصر
جناب sajjadrad (http://barnamenevis.org/forum/member.php?u=125268) حافظه میانی کدومه؟
وقتی شما از کلاس io استفاده میکنید آدرس ورودی تنها ادرسی هست که در دسترس شماست به فرض شما تابع زیر را داشته باشید.


void getstr(char *str)
{
char temp_ram[100]={0};
cin>> str;
strcpy(temp_ram, str);
}

اگر cin از حافظه میانی مانند temp_ram استفاده کند آیا امکا ن دارد که از بیرون و از خارج از دامنه تابع یا کلاس بشود به این نوع متغییر ها یا آدرس دسترسی داشت؟


مثلا وقتی کاربر I am fine رو وارد میکنه کل i am fine میره به حافظه میانی و دستور cin ابتدا i رو میخونه و به متغیر میفرسته و اگه دوباره cin فراخونی بشه am رو داخل متغیر میزاره و در فراخونی دوباره fine رو در متغیر میزاره و وقتی به null رسید حافظه میانی پاک میشه...
در مور قسمت های لایت شده مطمئن هستید همچین اتفاقی می افتد؟
به نظرم قبلا داخل یک تاپیک این سوال را کرده بودید.

sajjadrad
جمعه 28 خرداد 1389, 23:17 عصر
جناب sajjadrad (http://barnamenevis.org/forum/member.php?u=125268) حافظه میانی کدومه؟
وقتی شما از کلاس io استفاده میکنید آدرس ورودی تنها ادرسی هست که در دسترس شماست به فرض شما تابع زیر را داشته باشید.


void getstr(char *str)
{
char temp_ram[100]={0};
cin>> str;
strcpy(temp_ram, str);
}
اگر cin از حافظه میانی مانند temp_ram استفاده کند آیا امکا ن دارد که از بیرون و از خارج از دامنه تابع یا کلاس بشود به این نوع متغییر ها یا آدرس دسترسی داشت؟

در مور قسمت های لایت شده مطمئن هستید همچین اتفاقی می افتد؟
به نظرم قبلا داخل یک تاپیک این سوال را کرده بودید.

از اینکه پاسخ دادید ممنون...والا نمیدونم من خودم تو کتاب خودم اینو...حالا بحث حافظه میانی مهم نیست...من میخوام وقتی دوباره cin رو فراخونی کردم یه رشته جدید بگیرم...
در مورد اون تاپیک هم یه بحث دیگه بود و درمورد اشاره گر ها و کاراکتر ها بود...ولی الان بحثم روی string هستش...
مرسی:قلب:

sajjadrad
شنبه 29 خرداد 1389, 11:33 صبح
جناب sajjadrad (http://barnamenevis.org/forum/member.php?u=125268) حافظه میانی کدومه؟


شما میگید حافظه میانی در کار نیست؟
خب کد زیر رو ببینید:



#include <iostream>
#include <string>
using namespace std;

int main ()
{
string str;
cin>>str;
cout<<str<<endl;
str.clear();
cout<<"After Clear:"<<str<<endl;
cin>>str;
cout<<"After Cin:"<<str<<endl;
return 0;
}

طبق گفته های شما بعد از استفاده از str.clear(); رشته کاملا پاک شده و باید در cin بعدی یک رشته جدید از کاربر دربافت بشه...

اما برنامه چیز دیگه ای رو نشون میده...بعد از استفاده از دستور clear رشته str خالی شده و هنوز حافظه میانی دارای مقداره بخاطر همین در cin بعدی از حافظه میانی میخونه...
به عنوان مثال وقتی کابر در cin اول رشته "this is test" رو وارد کنه.عبارت this چاپ میشه و بعد از استفاده از clear رشته str تمامی خونه هاش 0 شده و در چاپ بعدی هیچ چیز چاپ نمیشه..
حال در خط بعدی که cin دوباره فراخونی شده برنامه از حافظه میانی is رو میخونه و در خط بعدی چاپ میکنه...

در صورتی که شما گفتید بعد از cin اول همه ی عبارت وارد str میشه پس بعد از clear باید str خالی بشه و در cin بعدی رشته جدید دریافت بشه که اینطور نیست!:اشتباه:

تنها راه پاک کردن حافظه میانی فرستادن null هست که اونم بجز کنترل Z نمیدونم راهی داره یا نه:عصبانی++:

بازم مرسی:قلب:

tdkhakpur
شنبه 29 خرداد 1389, 21:01 عصر
مطالب بالا را که ارسال کردید خوانده شد ولی این یک کار غیر عادی هست و نباید اسن شکلی باشه.
وقتی شما متغییر تعریف میکنید اصلا ارتباطی با توابع استاندارد ندارند و توابع استانداردی مانند cin آنقدر هوشمند نیست که بفهمد در کجای خط برنامه قرار دارد ویا اینکه از کدام منتغییر قبلا استفاده کرده است.
پس اونوقت کد زیر با توجه به مطالب شما چه عکس العملی از خود نشان میدهد اگر it is test را وارد کنید.


char str1[20], str2[20];
cin>>str1 ; //--> it is test
cout<<str1<<"\n";
cin>>st2
cout<<str2<<"\n";

با توجه به مطالب شما باید ابتدا it و بعد is را چاپ کند که این غیر ممکن هست!
به هر صورت یک تستی داخل کامپایلر دیگر انجام بدید.