PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل عجیب با تابع string



Ma3ood
15-03-2012, 12:55
درود بر دوستان گل :hi:
مشکل اين برنامه کجاست ميخوام يه رشته ثابت و يه رشته که از ورودي پر ميشه به وسیله یه صفحه کلید رو با هم مقايسه کنم ولي هيچ موقع يکسان نمي شه يا بزرگتره يا کوچکتر :baad:
همه کاري هم کردم حتي ته رشته 1 رو هم با صفر بستم دیگه نمی دونم چیکار کنم :x





void main(void)
{
int key_p, result=3;
unsigned char buffer[16],x=0;
unsigned char str1[6]="";
unsigned char str2[6]="00000";
lcd_init(16);

while (1)
{
lcd_gotoxy(0,0);
lcd_putsf("enter code:");
key_p=scan_key();
if(key_p>-1&&key_p<10&&x<5){
lcd_gotoxy(x+11,0);
itoa(key_p,buffer);
str1[x]=key_p;
delay_ms(150);
lcd_puts(buffer);
delay_ms(150);
x++;
}

if(key_p==15){
x=0;
strcat(str1,0x00);
delay_ms(5);
result=strcmp(buffer,str2);
if(result==0){
lcd_clear();
lcd_putsf("yes");
delay_ms(1000);
}
if(result==-1||result==1) {
lcd_clear();
lcd_putsf("no!");
delay_ms(1000);
}
}
}
}

sadmonew
16-03-2012, 00:21
سلا مهندس
من يه سوال مي پرسم ببينم شما متوجه اشتباه من ميشيد؟


int key_p = 12;
unsigned char c = "12";

if(key_p == c)
{

}

Ma3ood
16-03-2012, 00:39
سلا مهندس
من يه سوال مي پرسم ببينم شما متوجه اشتباه من ميشيد؟


int key_p = 12;
unsigned char c = "12";

if(key_p == c)
{

}

سلام داداش
حق با شما هستش ولی یه برنامه میخوندم همین کارو کرده بود !
دو ارایه تعریف کرده بود و در تعریف ارایه ها مقدار دهی به صورت لیترال رشته ای ("")بود و بعد مثل برنامه ای که گذاشتم اعداد رو توی یه ارایه میریخت و بعد مقایسه
اخه خودمم موندم تابع strcmp برای مقایسه تو تا رشته به کار میره نه تو ارایه
حالا دوست عزیز میشه درستش رو به ما بگی:0013:

agape
16-03-2012, 11:04
دوست من رشته توی زبان سی همون آرایه هست ، شما از همون strcmp استفاده بکن و البته به نظر من برنامه رو بهتر میتونی بنویسی ! و در ضمن چرا شما داری بافر رو با str مقایسه میکنی ، این اشتباهه چرا که بافر هر بار با فشرده شدن کلید توسط فرمان itoa مقدار جدیدی میگیره ، و همیشه یک کارکتر رو در خودش ذخیره میکنه نه یک رشته!

Ma3ood
16-03-2012, 11:13
دوست من رشته توی زبان سی همون آرایه هست ، شما از همون strcmp استفاده بکن و البته به نظر من برنامه رو بهتر میتونی بنویسی ! و در ضمن چرا شما داری بافر رو با str مقایسه میکنی ، این اشتباهه چرا که بافر هر بار با فشرده شدن کلید توسط فرمان itoa مقدار جدیدی میگیره ، و همیشه یک کارکتر رو در خودش ذخیره میکنه نه یک رشته!

ممنون دوست عزیز
نمی دونم چرا اینجا اینجوری نوشتمii998)
ولی درستش که تو برنامه من استفاده می کنم اینه


strcat(str1,0x00);
delay_ms(5);
result=strcmp(str1,str2);
ولی به هیچ راهی درست جواب نمی ده البته اگه دو تا ارایه برابر تعریف کنی و بزاری توی اون تابع به خودش زحمت میده میگه برابرند و گرنه هر کاری من کردم جواب نداد خودم به تعریف اولیه شک دارم لطفا اگه اشتباه گفتم راهنمایی کنید!

ali_h
16-03-2012, 11:35
سلام.
یک بار هر دوتا رشته کاراکتری رو روی LCD چاپ کنید ببنید واقعاً برابرند یا نه.
من فکر می کنم چون key_p از نوع int هست، وقتی اون رو در آرایه ای از نوع unsigned char ذخیره می کنید بخش MSB متغیرتون داده های قبلی آرایه رو خراب می کنه.

Ma3ood
16-03-2012, 12:19
دوست عزیز عکس زیر با این برنامه حاصل شد !



void main(void)
{
char key_p,x=0,buffer[16],buffer1[16];
char result=0,i=0;
char str1[6]={0};
char str2[6]={1,2,3,4,5};
lcd_init(16);
while (1)
{
lcd_gotoxy(0,0);
lcd_putsf("enter code:");
key_p=scan_key();
if(key_p>-1&&key_p<10&&x<5){
lcd_gotoxy(x+11,0);
str1[x]=key_p;
itoa(key_p,buffer);
delay_ms(150);
lcd_puts(buffer);
delay_ms(150);
x++;
}
if(key_p==14){
x=0;
strcat(str1,0x00);
delay_ms(5);
result=strcmp(str1,str2);
if(result==0){
lcd_clear();
lcd_putsf("yes");
delay_ms(1000);
}
if(result==-1||result==1) {
lcd_clear();
lcd_putsf("no!");
delay_ms(1000);
}
}
if(key_p==15){
lcd_clear();
for(i=0;i<5;i++){
lcd_gotoxy(i,0);
sprintf(buffer,"%d%c",str1[i],0);
lcd_puts(buffer);
delay_ms(200);
}
for(i=0;i<5;i++){
lcd_gotoxy(i,1);
sprintf(buffer1,"%d%c",str2[i],0);
lcd_puts(buffer1);
delay_ms(200);
}
}

}
}


ii998)ii998)ii998)ii998)ii998)
واما جواب مقایسه طبق معمول no!

ali_h
17-03-2012, 14:01
ته str2 رو با 0 ببندید ببنید فرقی می کنه یا نه!

Ma3ood
17-03-2012, 14:31
و باز هم ما متعجم:018: میشویم ii998)ii998)ii998)
با یه سری تغییرات و عمل به توصیه اخر شما درست نشد هر چی بهش بدی میده yes خوبه بازم یه تغییری کرد
فایل +شبیه سازی رو ضمیمه میکنم از دوستان تقاضا میشه یه نگاهی بهش بندازن :0013:

ali_h
17-03-2012, 15:13
درست شد!
نیازی به بستن ته رشته ها نبود! در ضمن شما از strcpy استفاده کرده بودی بجای strcat واسه همین هرچی می زدی yes جواب می داد!
حالا چرا تو رشته کاراکتر ذخیره نمی کنید و عدد ذخیره می کنید؟

ali_h
17-03-2012, 15:15
آها برنامه اولتون کاراکتری بود. راه جل اون رو هم پیدا کردم. توی کدتون بجای خط زیر :

str1[x]=key_p;
از این استفاده کنید :

str1[x]=buffer[0];

ali_h
17-03-2012, 15:20
آها متوجه شدم. برنامه اولتون کاراکتری بود. راه حل اون رو هم پیدا کردم. به جای خط زیر :

str1[x]=key_p;
از این استفاده کنید :

str1[x]=buffer[0];

Ma3ood
17-03-2012, 21:08
خیلی خیلی خیلی ممنونم:0013:
خیلی خیلی خیلی متعجبم!!!!ii998):baad::baad: