2014-03-27 150 views
0

我不认为说这个话题是什么很重要。我只想提到我想打印ia以及1如何从c中的某个函数返回多个值

这里是我的代码:

int riz(int k,int *p,int *q) 
{ 
    int i; 
    int a; 

    for (i = 1; i <= sqrt((double)k) + 1; i++) 
    { 
     for (a = 1 ; a <= sqrt((double)k) + 1; a++) 
     { 
      if (a*a+i*i == k) 
      { 
       p=&a; 
       *p=a; 
       q=&i; 
       *q=i; 

       return 1; 
      } 
     } 
    } 

    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    int p; 
    int q; 
    int a; 

    printf("Give me a number or type 0 to exit \n"); 
    scanf("%d", &a); 
    if (a == 0) 
     return 0; 
    printf("%d\n", riz(a, &p, &q)); 

    while (a != 0) 
    { 
     printf("Give me a number or type 0 to exit \n"); 
     scanf("%d", &a); 
     if (a == 0) 
      return 0; 
     printf("%d\n", riz(a, &p, &q)); 
    } 

    return 0; 
} 

我阅读过的与此相关的其他问题,但我仍然想不通为什么我不能打印ia

+0

你想返回'我'和'a'? – Dinesh

+0

您正在打印'ri'''0'或'1'的返回值。 –

+0

我正在打印返回值,我也想打印我和一个 –

回答

0

在调用点,你需要指针传递到您想要的返回值放置变量,你在做:

int main(int argc, char *argv[]) { 
    int p; 
    int q; 

    ... 

    riz(a,&p,&q) 

到目前为止,这么好;但是,在函数中,只需将要返回的值分配给指针已指向的位置即可。你不想改变指针;来电者已经设置它们指向他们应该在的位置。这是错误的:

 p=&a; 
     *p=a; 
     q=&i; 
     *q=i; 

这应该只是:

 *p=a; 
     *q=i; 

最后,如果你想在函数返回后打印的值,你必须调用函数,然后打印值。或者:

printf("%d", riz(a,&p,&q)); 
    printf(" %d %d\n", p, q); 

或者,如果你想用一个单一的调用来完成它printf

int r; 
    r = riz(a,&p,&q); 
    printf("%d %d %d\n", r, p, q); 

做:

printf("%d %d %d\n", riz(a,&p,&q), p, q); 

,因为C不保证评估参数的顺序,所以pq可能是01之前的值 riz被调用。

不过请注意,当riz回报0pq已经更新,所以它们的值将是垃圾(我们盲目地打印)。如果这确实是您希望它工作的方式,那么您可能需要检查返回值以决定是否要使用pq执行任何操作。

在一个不相关的说明中,main中有一个主要代码复制问题(几乎一半的代码被复制,这意味着您必须执行两次修复错误的工作)。为什么不这样做:

int main(int argc, char *argv[]) 
{ 
    int p; 
    int q; 
    int a; 

    for(;;) { 
     printf("Give me a number or type 0 to exit \n"); 
     scanf("%d", &a); 
     if (a == 0) 
      break; 
     printf("%d\n", riz(a, &p, &q)); 
    } 

    return 0; 
} 
0

如果要从函数中返回多个值,则必须通过传递给该函数的参数返回它们。

编辑

,你应该值存储在*p而不是让p点的a地址。

Here是一些解释。

0

您正在更改'a'(p = & a)和'a'在函数结束时超出范围的'p'点。如果你只是让* p = a,那么这将保持p指向的值为'a'。

同样会去你的其他变量“Q”,所以您的代码将与

if (a*a+i*i==k){ 
     *p=a; 
     *q=i; 
} 

这是因为你让你的函数传递的指针指向局部变量落得“里兹'的方法,所以当方法'riz'终止变量a和我超出范围,并不意味着什么你的主。因此,上面的代码将“p”指向的值设置为“a”所具有的值,我认为这是您想要的值。

2

的问题是在这里:

if (a*a+i*i==k){ 
     p=&a; // p now points to a in riz instead of a in main 
     *p=a; // This is equivalent to a=a 
     q=&i; // q now points to i in riz instead of i in main 
     *q=i; // This is equivalent to i=i 

改成这样:

if (a*a+i*i==k){ 
     *p=a; // This will write the value of a in riz to a in main 
     *q=i; // This will write the value of i in riz to i in main