2015-08-28 68 views
2

编译与-Wall我的C代码,激活后返回语句,下面的警告出现与多个参数

left operand of comma operator has no effect 

这是在我的return声明提出的多参数有关。故事如下: 假设有一堆动态分配的3D数组(A,B和C)并想对它们进行一些操作。数组被定义为指向指向指针的指针,并使用malloc(标准过程)进行分配。对它们的操纵将在单独的功能中发生。出于某种原因,我宣布的功能三重指针,如下:

***func(double ***A, double ***B, double ***C) 
{ 
    do some work here on A, B and C 
    return(A, B, C); 
} 

我知道阵列传递到函数作为参考,因此基本上没有必要从这个函数返回的东西。但是,你能告诉我为什么有人会这样声明一个函数。这名工作人员混淆了我。在此先感谢

+0

为什么不返回数组 – Sunny

+1

'*** FUNC(...'无效C.至少如果没有预处理器魔法转眼就在编译之前... – alk

+0

@sergej是的。谢谢 – dimpep

回答

5

return(A, B, C) is not C,您可以使用struct返回多个参数。

struct array3d{ 
    double* A; 
    double* B; 
    double* C; 
}; 

struct array3d* func(struct array3d* p) { 
    /* do some work here on p->A, p->B and p->C */ 
    return p; 
} 

这里是***指针的工作例如:

#include <stdio.h> 
#include <malloc.h> 

struct array3d { 
    double*** A; 
    double*** B; 
    double*** C; 
}; 

struct array3d* func(struct array3d* p) { 
    /* do some work here on A, B and C */ 

    ***p->A /= 42.0; 
    ***p->B /= 42.0; 
    ***p->C /= 42.0; 

    return p; 
} 

int main() 
{ 
    struct array3d arr; 
    struct array3d* p_arr; 

    double A[] = { 1.0, 3.0}; // ... 
    double B[] = {-1.0, -2.0}; 
    double C[] = { 2.0, 4.0}; 

    double* p1A = A; 
    double* p1B = B; 
    double* p1C = C; 

    double** p2A = &p1A; 
    double** p2B = &p1B; 
    double** p2C = &p1C; 

    arr.A = &p2A; 
    arr.B = &p2B; 
    arr.C = &p2C; 

    p_arr = func(&arr); 

    printf("(A = %f, B = %f, C = %f)\n", ***p_arr->A, ***p_arr->B, ***p_arr->C); 

    return 0; 
} 
+0

@MichaelWalz谢谢。 – sergej

0

代码

***func(double ***A, double ***B, double ***C) 
{ 
    do some work here on A, B and C 
    return(A, B, C); 
} 

根本就是错误的,即使它编译:

  1. 如果函数返回ns通过它的参数ABC,它不应该有返回类型。一,E,它应该宣布恢复void

    void func(double ***A, double ***B, double ***C) { 
    
  2. 语法return(A, B, C)没有做什么,你认为它。它不构建一个列表,或将三个值传递给return。相反,它评估表达式A,将其值抛出,评估B,将其值抛离,评估C,将值C作为表达式(A, B, C)的值,最后从该函数返回该值。 (谷歌“C逗号运算符”以获取更多信息。)

  3. 如果您的函数声明为返回void(因为它可能应该是),则根本不需要return语句。