Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 包含多个参数的Return语句_C_Arrays_Pointers_Return_Multiple Arguments - Fatal编程技术网

C 包含多个参数的Return语句

C 包含多个参数的Return语句,c,arrays,pointers,return,multiple-arguments,C,Arrays,Pointers,Return,Multiple Arguments,在编译激活了-Wall的C代码后,出现了以下警告 left operand of comma operator has no effect 它们和我的return语句中显示的多个参数相关。故事如下: 假设有一组动态分配的3D数组(a、B和C),并希望对它们进行一些操作。数组被定义为指针对指针,并使用malloc(标准过程)进行分配。它们的操作将在单独的函数中进行。出于某种原因,我将函数声明为三重指针,如下所示: ***func( double ***A, double ***B, double

在编译激活了-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);
}
我知道数组作为引用传递到函数中,因此基本上不需要从这个函数返回任何东西。但是,你能告诉我为什么有人会这样声明函数吗。这根棍子把我弄糊涂了。提前感谢

返回(A,B,C)不是C
,您可以使用
结构
返回多个参数

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;
}
#包括
#包括
结构阵列3D{
双***A;
双***B;
双***C;
};
结构阵列3D*func(结构阵列3D*p){
/*在A、B和C上做一些工作*/
***p->A/=42.0;
***p->B/=42.0;
***p->C/=42.0;
返回p;
}
int main()
{
结构阵列3d-arr;
结构阵列3d*p_arr;
双A[]={1.0,3.0};/。。。
双B[]={-1.0,-2.0};
双C[]={2.0,4.0};
双*p1A=A;
双*p1B=B;
双*p1C=C;
双**p2A=&p1A;
双**p2B=&p1B;
双**p2C=&p1C;
arr.A=&p2A;
arr.B=&p2B;
arr.C=&p2C;
p_arr=func(&arr);
printf(“(A=%f,B=%f,C=%f)\n),***p\u arr->A,***p\u arr->B,***p\u arr->C);
返回0;
}
代码

***func( double ***A, double ***B, double ***C)
{
  do some work here on A, B and C
  return(A, B, C);
}
这完全是错误的,即使它编译了:

  • 如果函数通过其参数
    A
    B
    C
    返回所有内容,则它不应具有返回类型。也就是说,它应该声明为返回
    void

    void func( double ***A, double ***B, double ***C) {
    
  • 语法
    return(A,B,C)
    与您认为的不同。它不构造列表,也不将三个值传递给
    return
    。相反,它计算表达式
    A
    ,丢弃其值,计算
    B
    ,丢弃其值,计算
    C
    ,将
    C
    的值作为表达式
    (A,B,C)
    的值,最后从函数返回该值。(有关更多信息,请使用谷歌“C逗号运算符”。)

  • 如果您的函数被声明为返回
    void
    (可能应该是这样),那么根本不需要
    return
    语句


  • 为什么不返回数组
    ***func(…
    不是有效的C。至少在编译之前没有预处理器魔法的情况下。。。