从函数C编程返回结构数组

从函数C编程返回结构数组,c,arrays,function,struct,C,Arrays,Function,Struct,所以我试图写一个函数,它将返回一个包含多个值的数组。目前,它运行正常,但仅输出最终计算值。如何使输出包含所有计算值 我的代码如下所示: //Practice to output an array of structs #include <stdio.h> #include <stdlib.h> #include <math.h> struct boat_params { double V, Uc, Vc; }; struct boat_p

所以我试图写一个函数,它将返回一个包含多个值的数组。目前,它运行正常,但仅输出最终计算值。如何使输出包含所有计算值

我的代码如下所示:

//Practice to output an array of structs

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct boat_params {
    double V, Uc, Vc;
    };

struct boat_params submerged_volume(double L1, double L2, double Lavg, double H) {

    struct boat_params volume;

    double V_sub, Uc_sub, Vc_sub;
    V_sub = 0;

    //Boat description
    double C, delta;
    double theta, theta_rad, theta_min, theta_min2, theta_lim, theta_lim2, theta_lim_deg;
    double Ug1, Ug2, Vg1, Vg2, V1, V2;
    double pi; 

    pi = 4*atan(1);
    C = sqrt(L1*L1 + L2*L2);
    delta = acos(L1/C);

    theta_lim = asin(H/L1);
    theta_lim_deg = (theta_lim/pi) * 180.0;
    theta_min = asin(H/C) - delta; 
    theta_min2 = 0;

    //Calculating the submerged volume and centre of gravity for each different angle
    for (theta = 0; theta <= 10; theta ++) {

    //**Note: I've taken out the actual calculations of V_sub, Uc_sub, and Vc_sub for brevity**


        volume.V = V_sub;
        volume.Uc = Uc_sub;
        volume.Vc = Vc_sub;
        }


    return volume; 

    }


int main () {

double L1, L2, Lavg, H;
struct boat_params volume; 

L1 = 17.6; 
L2 = 3; 
Lavg = 4;
H = 4.5;

volume = submerged_volume(L1, L2, Lavg, H);

printf("V = %lf\nUc = %lf\nVc = %lf\n", volume.V, volume.Uc, volume.Vc);

return 0;

}
//练习输出结构数组
#包括
#包括
#包括
结构船参数{
双V、Uc、Vc;
};
结构船参数淹没体积(双L1、双L2、双Lavg、双H){
结构船参数体积;
双V_sub、Uc_sub、Vc_sub;
V_sub=0;
//船舶描述
双C,δ;
双θ,θrad,θmin,θmin 2,θlim,θlim 2,θlimdeg;
双Ug1、Ug2、Vg1、Vg2、V1、V2;
双pi;
pi=4*atan(1);
C=sqrt(L1*L1+L2*L2);
增量=acos(L1/C);
θlim=asin(H/L1);
θlim_deg=(θlim/pi)*180.0;
θ_min=asin(H/C)-δ;
θ_min2=0;
//计算每个不同角度的淹没体积和重心

对于(θ=0;θ试试这个,只需将逻辑添加到循环和数学:

#include <stdio.h>
#include <stdlib.h>

#define ARRSIZE 100

typedef struct boat_params {
  double  V, Uc, Vc;
} Volume;

struct boat_params submerged_volume(double L1, double L2, double Lavg, double H, Volume *volumes[]) {
  double theta;

  int i = 0; /* only example, change as needed */
  Volume *p;
  for (theta = 0; theta <= 10; theta ++) {
    p = malloc(sizeof(* p)); 
    if (p == NULL) {
      printf("malloc failed to allocate a new space");
      exit(0);
    }                   

    p->V = 1; //V_sub;
    p->Uc = 2; //Uc_sub;
    p->Vc = 3; //Vc_sub;

    volumes[i] = p;
    i++;
  }

}


int main () {
  double L1, L2, Lavg, H;

  L1 = 17.6; 
  L2 = 3; 
  Lavg = 4;
  H = 4.5;

  Volume *volumes[ARRSIZE];

  submerged_volume(L1, L2, Lavg, H, volumes);
  printf("V = %lf\nUc = %lf\nVc = %lf\n", volumes[0]->V, volumes[0]->Uc, volumes[0]->Vc); /* first element for example */

  return 0;
}
#包括
#包括
#定义ARRSIZE 100
类型定义结构船参数{
双V、Uc、Vc;
}体积;
结构船参数淹没体积(双L1、双L2、双Lavg、双H、体积*体积[]){
双θ;
int i=0;/*仅为示例,根据需要进行更改*/
体积*p;
对于(θ=0;θV=1;//V_-sub;
p->Uc=2;//Uc\u sub;
p->Vc=3;//Vc\u sub;
体积[i]=p;
i++;
}
}
int main(){
双L1,L2,Lavg,H;
L1=17.6;
L2=3;
Lavg=4;
H=4.5;
体积*体积[ARRSIZE];
淹没体积(L1、L2、Lavg、H、体积);
printf(“V=%lf\nUc=%lf\nVc=%lf\n”,卷[0]->V,卷[0]->Uc,卷[0]->Vc);/*例如,第一个元素*/
返回0;
}

如果你事先不知道卷数组的大小,你应该考虑使用链表。

你是对的,你需要有一个数组。如果数组中的元素数是常量,你也可以创建一个包含精确数元素的结构,但是请不要这样做。 不幸的是,要在数组上操作,您需要指针。在C中,一种非常常见的方法是不返回指针,而是传入“result”指针。这意味着函数的用户可以分配空间并释放空间,他也可以使用数组语法。在代码中,值的数量似乎是恒定的,这就是另外,您可以在堆上分配空间(使用<代码> MaloC/<代码>)并返回指针,但这意味着用户需要释放他从未分配的内存,违反直觉,如果忘记了,可能会导致内存泄漏。
void submerged_volume(double L1, double L2, double Lavg, double H, struct boat_params *result) {
    // your calculations here
    for (theta = 0; theta <= 10; theta ++) {
        (result+theta)->V = V_sub;
        (result+theta)->Uc = Uc_sub;
        (result+theta)->Vc = Vc_sub;
    }
}

// somewhere in your code where you want to use your function
struct boat_params values[11];
unsigned char i = 0;
submerged_values(/* parameters */, values);
for (; i <= 10; ++i) {
    printf("V = %lf\nUc = %lf\nVc = %lf\n", values[i].V, values[i].Uc, values[i].Vc);
}
void undered_volume(双L1、双L2、双Lavg、双H、结构船参数*结果){
//你的计算在这里
对于(θ=0;θV=V_sub;
(结果+θ)->Uc=Uc\u sub;
(结果+θ)->Vc=Vc_sub;
}
}
//在代码的某个地方,您希望使用函数
结构船参数值[11];
无符号字符i=0;
水下_值(/*参数*/,值);

对于(;我不是下选者,但你的代码不返回任何数组,它将值放入全局数组。另外,不要强制转换malloc。谢谢!我得到了它并修复了。你需要传递
而不是
你说得很对,我不知道当时我脑子里在想什么。我以前没有看到结果+theta语法。。。这是什么?或者这仅仅是增量的?好的,只是再讨论一下(对不起,花了我一段时间!)。我想澄清几件事……调用结构的位置是作为函数的输入。这与我在代码中所做的相同吗?另外,我是否不需要使用计数器(I)而my theta for循环中的printf语句在重新分配之前打印计算值?这里的Result是指针,因此
Result+theta
也是指针。C中的指针算法确保它是数组中指针指向其第一个元素的
theta
th值。它相当于
Result[theta].V=V_sub;
。我不确定为什么选择了不同的语法,请随意使用您认为合适的语法。