PDA

View Full Version : اشاره گر



s++ 68-87
جمعه 27 اردیبهشت 1387, 17:44 عصر
چطوري مي شه به ارايه مقدار اوليه داد البته به شكل اشاره گر؟؟؟
مثلا برنامه زير:

#include <iostream.h>
#include <conio.h>
void getbin(char *s)
{
int i=0;
cout<<"adadi be sorate binery vared konid (0 or 1)";
while ((*(s+i)=='0') || (*(s+i)=='1'))
{
cin>>*(s+i);
i++;
}
cout<<*(s+2);
}
int main()
{
char str[10];
getbin (str);
getch ();
return 0;
}

موندم مشكلش از اشاره كر هستش يا چيز ديگه!!
اجرا مي شه ولي
while رو كلا نديد مي گيره ...!!!
(مي خوام فقط صفر و يك رو قبول كنه)

A_Salimi
جمعه 27 اردیبهشت 1387, 18:19 عصر
من یه نگاهی به برنامه انداختم


while رو كلا نديد مي گيره ...!!!

مشکل اینجاست که شما کلا داری یه رشته خالی رو به تابع پاس میکنی و انتظار داری که تو حلقه while تابع عمل کنه.

در حقیقت فکر میکنم برنامه شما با این مشکل مواجه باشه :اشاره گرهایی که مقدار اولیه ندارند .

s++ 68-87
جمعه 27 اردیبهشت 1387, 19:09 عصر
رشته خالي مي فرستم كه بهش مقدار اوليه بدم
يعني امكان اين وجود نداره؟

A_Salimi
جمعه 27 اردیبهشت 1387, 19:44 عصر
خوب شما میخوای تو حلقه while بهش مقدار اولیه بدی مسلما در حلقه while هم باید اول اون شرطها بر آورده شن . . . ولی هیچوقت اون شرطها برقرار نمیشن پس بهتره قبل از while مقدار اولیه رو اعمال کنی

pars.engineer
جمعه 27 اردیبهشت 1387, 20:30 عصر
همانطور كه دوستمون گفت شما هيچ مقدار اوليه اي به آرايه نداده ايد پس چطور مي خواهيد آن را در در حلقه While با اعداد 0 و 1 مقايسه كنيد.
همانطور كه مي دانيد اشاره گر ها آدرس مكانهايي از حافظه اند، همچنين مكانهاي حافظه نيز با يكسري از كاركترها به صورت Random پر شده اند(مگر اينكه به صورت Global تعريف شوند) بنابراين به احتمال زياد شرطه حلقه while شما در همان مرحله اول false مي شود.

نمي دونم منظورتون رو درست فهميدم يا نه ولي كليت كار شبيه كد زير است(كد خود شما با كمي تغيير است)



#include <iostream.h>
#include <conio.h>
void getbin(int *s)
{
int i=0;
int temp;
char charsign;
cout<<" adadi be sorate binery vared konid (0 or 1):\n";
while (i<10)
{
cin>>temp;
if(temp==0 || temp==1)
{
*(s+i)=temp;
++i;
}
else
cout<<"\n You must enter binary Number!";
}//End of while
cout<<"\n For Print Press P and For Exit press any key: ";
cin>>charsign;
if( charsign=='p'||charsign=='P')
{
i=0;
while(i<10)
cout<<"\n"<<*(s+i++);
}
else {}
}
//**************************************
int main()
{
int str[10];
getbin (str);
getch ();
return 0;
}



موفق باشيد.

s++ 68-87
شنبه 28 اردیبهشت 1387, 01:46 صبح
با تشكر....
بازم يه سوال ديكه:


#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
class Des-Bin
{
char *bin;
int dec;
void getbin()
{
cout<<"enter binnary:";
gets(bin);
}

void getdec()
{
cout<<"enter a intiger to convert it to binnary :";
cin>>dec;
}

int dec2bin()
{
int y,t=0,count=0,r,s=0;
y=dec;
while(dec!=0)
{
dec/=2;
count++;
}
for(int i=1;i<=count;i++)
{
r=y%2;
y=y/2;
s=r*pow(10,t++)+s;
}
s=y*pow(10,t++)+s;
return s;
}

int bin2dec()
{
int i=0;
int a=0;
while (str[i])
{
a=a*2+(str[i]-'0');
i++;
}
return a;
}

};
int main()
{
Des-Bin bin[10];
Des-Bin dec;
bin.getbin();
dec.getdec() ;
int bina= dec.dec2bin();
int deci= bin.bin2dec();
cout<<bina<<endl<<deci;
getch ();
return 0;
}


اين برنامه جواب نمي ده
تو قسمت تابع main احتمالا مشكل داشته باشه
(تعريف شي از نوع اشاره كر يا ارايه و استفاده ازش)


char bin[10];
int dec;
bin.getbin();
dec.getdec() ;
int bina= dec.dec2bin();
int deci= bin.bin2dec();

emad_67
شنبه 28 اردیبهشت 1387, 06:41 صبح
مشکلات برنامت اینا هستند:
توی این تابع:


void getbin()
{
cout<<"enter binnary:";
gets(bin);
}
قبل از اینکه bin رو از ورودی بگیری باید اونو تخصیص حافظه کنی. به این شکل:


bin=new char [10];


class Des-Bin
{
char *bin;
int dec;
........
در ابتدای کلاس باید لیبل public رو بنویسی تا بتونی توابع رو در main فراخوانی کنی.

نام کلاس و همچنین نام شی هایی که تعریف کردی اینه :Des-Bin
که باید بینش _ (under line) بزاری چون الان منها گذاشتی و کامپایلر اونو به عنوان عملگر تفریق به حساب میاره.
در تابع bin2dec اینو نوشتی:


while (str[i])
{
a=a*2+(str[i]-'0');
i++;
}
در صورتی که اصلا str تعریف نشده هست. (احتمالا منظورت bin بوده)
در main آرایه ای از اون کلاس تعریف کردی ولی به صورت یک شی ازش استفاده کردی:


Des-Bin bin[10];
که باید اینوجوری بنویسی:


Des_Bin bin;
اینا مشکل های سینتکسی برنامت بود ولی بازم برنامت موقع اجرا خطا میده که اونو خودت رفع کن.

s++ 68-87
شنبه 28 اردیبهشت 1387, 10:56 صبح
خیلی خیلی .... ممنون مشکل حل شد
ولی
_ نفهمیدم چرا باید تخصیص ی حافظه کنیم برای اشاره گر!!؟؟ اگه اونو به صورت ارایه تعریف می کردم نیازی به تخصیص حافظه نداشت؟
_ و این که اگه بخوایم از یه شی به صورت اشاره گر استفاده کنیم مثلا همین bin توابع چطوری فراخوانی می شن؟
برا مثال همین کد زیر اگه bin یه اشاره گر بود چطوری باید نوشته می شد؟

bin.getbin();

emad_67
شنبه 28 اردیبهشت 1387, 12:57 عصر
نفهمیدم چرا باید تخصیص ی حافظه کنیم برای اشاره گر!!؟؟ اگه اونو به صورت ارایه تعریف می کردم نیازی به تخصیص حافظه نداشت؟وقتی متغیری رو اشاره گر تعریف می کنی یعنی اینکه این متغیر میتونه به مکانی از حافظه اشاره کنه و در واقع آدرس اون مکان حافظه در اشاره گر قرار میگیره. پس به تنهایی یک اشاره گر حافظه ای نداره. مثلا وقتی تعریف میکنی:


char *bin;
یعنی متغیری تعریف کردی به اسم bin که این متغیر اشاره گری به یک خونه از حافظه هست که اون خونه حافظه از نوع char تعریف شده ولی تا اینجا فقط اشاره گر رو تعریف کردی و هنوز اون خونه حافظه موجود نیست. حالا وقتی مینویسی:


bin=new char[10];
سیستم میاد و 10 خونه حافظه رو در نظر میگیره و آدرس اولین خونه اونو در bin قرار میده. این مورد صرفا برای آرایه ها نیست. میتونی اینجوری بنویسی:


bin=new char;
که تنها یک خونه حافظه گرفته میشه و آدرس اون در bin قرار میگیره.

اگه بخوایم از یه شی به صورت اشاره گر استفاده کنیم مثلا همین bin توابع چطوری فراخوانی می شن؟
برا مثال همین کد زیر اگه bin یه اشاره گر بود چطوری باید نوشته می شد؟برای تعریف اشاره گر به یک شی باید اینجوری بنویسی:


Des_bin *bin=new Des_bin;
در اینجا bin اشارهگری به شی ایی از کلاس هست. در این حالت برای دسترسی به توابع باید از <- استفاده کنی که نماد همون اشاره گر هست.


bin->getbin();