PDA

View Full Version : چظوری تابع بنویسم که ارگومان های وردیش متغیر باشن؟؟



mohsen.hex
یک شنبه 13 بهمن 1392, 23:38 عصر
سلام دوستان
من نیاز به یک تابع دارم که ارگومانهای ورودیش متغیر باشن یعنی یک بار 5 تا ارگومان براش بفرستم یک بار 10 تا!!
مثل دستور sprintf که براش تعریف نشده دقیقا چند ارگومان در ورودی میگیره!!

این هم کد که دارم روش کار میکنم

char menu(char linee,char locate,char *par1,char *par2,char *par3,char *par4,char *par5,char *par6,char *par7,char *par8)
{


char *mem[8][1]={{" "},{" "},{" "},{" "},{" "},{" "},{" "},{" "}};


static char flag,flag2,i;
char delay=50,delay2=20;
UINT res,s1,s2;



//strcpy(*mem[0],par1);
*mem[0]=par1;
*mem[1]=par2;
*mem[2]=par3;
*mem[3]=par4;
*mem[4]=par5;
*mem[5]=par6;
*mem[6]=par7;
*mem[7]=par8;



flag=locate;
cont=0;

lcd_clear();

for(i=0;i<linee;i++){gotoxy(0,i);print_string(mem[i][0]);}
gotoxy(0,flag);print_string_h(mem[flag][0]);

press_key(key_set_pin,delay2);




//delay_ms(300);
while(key_set_port & key_set_pin);

do
{
key = key_read();//
if(key == down)
{
//while(FIO_ReadValue(0) & key_down_pin);
cont=0;
flag++;if(flag==linee) flag=0;
for(i=0;i<linee;i++){gotoxy(0,i);print_string(mem[flag>linee-1?(flag-linee-1+i):i][0]);}
gotoxy(0,(flag>linee-1)?linee-1:flag);print_string_h(mem[flag][0]);

press_key( key_down_pin , 10);
}
else if(key==up)
{
//while(FIO_ReadValue(0) & key_up_pin);
cont=0;
if(flag==0) flag=linee-1;
else flag--;
for(i=0;i<linee;i++){gotoxy(0,i);print_string(mem[flag>linee-1?(flag-linee-1+i):i][0]);}
gotoxy(0,(flag>linee-1)?linee-1:flag);print_string_h(mem[flag][0]);

press_key( key_up_pin , 10);
}
else if(key==left)
{
while(key_left_port & key_left_pin);
lcd_clear();
return 9+locate;
}

else if(key==set || key==right )
{
while((key_set_port & key_set_pin));
while((key_right_port & key_right_pin));

return flag+1;


for(i=0;i<linee;i++){gotoxy(0,i);print_string(mem[flag>linee-1?(flag-linee-1+i):i][0]);}
gotoxy(0,(flag>linee-1)?linee-1:flag);print_string_h(mem[flag][0]);

}
else if(key==left)
{
press_key( key_left_pin , delay2);
lcd_clear();break;
}

}while(cont<4);


lcd_clear();
return 0 ;
}



تعجب نکنید
این برای کامپیوتر نیست برای میکرو کنترلر هست!!

sh4mid
دوشنبه 14 بهمن 1392, 05:17 صبح
مشابه این موضوع (http://barnamenevis.org/showthread.php?316456-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D8%AA%D8%A7%D8%A8%D8%B9-%D8%A8%D8%A7-%D8%AA%D8%B9%D8%AF%D8%A7%D8%AF-%D9%86%D8%A7%D9%85%D8%B9%D9%84%D9%88%D9%85-%D9%88%D8%B1%D9%88%D8%AF%DB%8C&p=1388561&viewfull=1#post1388561)

mohsen.hex
دوشنبه 14 بهمن 1392, 07:26 صبح
اینا همش c++ من c میخام!! کامپایلرم رو روی c فیکس کردم!!

fahimeh1512
دوشنبه 14 بهمن 1392, 09:28 صبح
یه کد قبلا نوشته بودم ساده ست ولی شاید کمکت کنه
ارگومان های ورودیش همه از یک نوع هستن و برای این که تابع بفهمه آرگومان هاش کجا به اتمام میرسن یه کاراکتر درنظر گرفتم (مثل r)

#include<stdio.h>
#include<conio.h>
void f(int,...);
int main()
{
int a,b,c,d;
char ch='r';
printf("\nenter four number:");
scanf_s("%d%d%d%d",&a,&b,&c,&d);
printf("a=%d, b=%d, c=%d, d=%d",a,b,c,d);
printf("\nsum of a,d:");
f(a,d,'r');
printf("\nsum a,b,c,d:");
f(a,b,c,d,'r');
_getch();
return 0;
}
void f(int z,... )
{
int *p,sum=0;
p=&z;
while(*p!='r')
sum +=*(p++);
printf("\n%d",sum);

}

fahimeh1512
دوشنبه 14 بهمن 1392, 09:33 صبح
لینکی که sh4mid داده بود که سی پلاس پلاس نبود توابع سی بودن

sh4mid
دوشنبه 14 بهمن 1392, 22:20 عصر
stdarg (http://en.wikipedia.org/wiki/Stdarg.h)

stdarg.h is a header in the C standard library of the C programming language that allows functions to accept an indefinite number of arguments
IEEE Std 1003.1 stdarg.h (http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdarg.h.html)