如何将结构成员数组传递给C函数

时间:2018-10-14 09:48:14

标签: c function struct parameter-passing

我试图仅将结构的一个成员传递给函数,我需要将r []。b的整个数组传递给函数中的数组,以便a可以将该函数与函数的其他成员一起使用结构(希望很清楚)。

结构:


Error:(15, 6) Kotlin: This class does not have a constructor

功能:

struct rettangolo{
    int ei,ej,b,h,a;
}r[50];

致电:

int trova_max(int r[],int k){
    int max,maxi,i;
    for(i=0;i<k+1;i++){
        if(r[i]>max){
            max=r[i];
            maxi=i;
        }
    }
    return maxi;
}

编辑:我按建议更改了功能,但不起作用。我不想使用r [i] .b,因为那样会破坏具有功能的目的

5 个答案:

答案 0 :(得分:2)

我认为您最好“重载”函数trnova_max,而不是创建一个返回指向rettangolo成员的指针数组并将该数组传递给trova_max的函数。

在这种情况下,最好传递rettangolo数组并在循环中仅使用b

int trova_max(struct rettangolo r[], int k) {
    int max, maxi, i;
    for (i = 0; i < k+1; i++){
        if (r[i].b > max) {
            max = r[i].b;
            maxi = i;
        }
    }
    return maxi;
}

答案 1 :(得分:2)

您做错了。您正在尝试传递指向struct rettangolo的指针,因此必须根据要求更改函数声明。您的函数原型应为

int trova_max(struct rettangolo r[],int k);

答案 2 :(得分:1)

您可以将偏移量传递给该函数感兴趣的成员:

int trova_max(struct rettangolo *r, size_t size, ptrdiff_t offset)
{
    int max = *(int*)((char*)&r[0] + offset);
    size_t maxi = 0;

    for (size_t i = 0; i < size; i++) {
        int v = *(int*)((char*)&r[i] + offset);
        if (v > max) {
            max = v;
            maxi = i;
        }
    }

    return maxi;
}

致电:

trova_max(r, sizeof(r) / sizeof(*r), 0)); // ei
trova_max(r, sizeof(r) / sizeof(*r), &r[0].ej - &r[0].ei)); // ej
trova_max(r, sizeof(r) / sizeof(*r), &r[0].b  - &r[0].ei)); // b
trova_max(r, sizeof(r) / sizeof(*r), &r[0].h  - &r[0].ei)); // h
trova_max(r, sizeof(r) / sizeof(*r), &r[0].a  - &r[0].ei)); // a

答案 3 :(得分:1)

引用此comment

可以使用预处理器魔术来“自动”创建代码,而无需多次编写:

#include <limits.h>

struct rettangolo{
  int ei, ej, b, h, a;
};

#define TROVA_MAX(x) int trova_max_ ## x (struct rettangolo * r, int k) \
{ \
  int max = INT_MIN, maxi, i; \
  \
  for (i = 0; i < k; ++i) \
  { \
    if (r[i].x > max) \
    { \
      max = r[i].x; \
      maxi = i; \
    } \
  } \
  \
  return maxi; \
}

#define R_MAX (50)

TROVA_MAX(ei)
TROVA_MAX(ej)
TROVA_MAX(b)
TROVA_MAX(h)
TROVA_MAX(a)

int main(void)
{
  struct rettangolo r[R_MAX];

  int ei_max = trova_max_ei(r, R_MAX);    
  int ej_max = trova_max_ej(r, R_MAX);    
  int b_max = trova_max_b(r, R_MAX);    
  int h_max = trova_max_h(r, R_MAX);    
  int a_max = trova_max_a(r, R_MAX);    
}

:-)

答案 4 :(得分:-1)

如果struct是局部变量(在函数内部声明的变量),则使用

int trova_max(struct rettangolo r[], int k);


并使用

int main() {
    struct rettangolo r[50];
    int k = 10;
    trova_max(r, k)
    return 0;
}


其他

#include <stdio.h>
struct rettangolo {
  int ei, ej, b, h, a;
} r[50];
int trova_max(int k) { // No need the struct array since it is a global variable
  int max, maxi, i;
  for (i = 0; i < k + 1; i++) {
    if (r[i].a > max) {// Assumed that you are comparing variable a of struct
      max = r[i].a;
      maxi = i;
    }
  }
  return maxi;
}

int main() {
  printf("%d\n", trova_max(2));
  return 0;
}

//重用相同的函数比较a,b和h

#include <stdio.h>
enum COMP { A_COMPARE, B_COMPARE, H_COMPARE };
struct rettangolo {
  int ei, ej, b, h, a;
} r[50];
int compare(struct rettangolo *elem, int max, enum COMP value_to_compare) {
  switch (value_to_compare) {
  case A_COMPARE:
    return elem->a > max;
  case B_COMPARE:
    return elem->b > max;
  case H_COMPARE:
    return elem->h > max;
  default:
    printf("Default statement executed\n");
  }
  return 0;
}
int trova_max(int k, enum COMP value_to_compare) { // No need the struct array since
                                              // it is a global variable
  int max, maxi, i;
  for (i = 0; i < k + 1; i++) {
    if (compare(&r[i], max,
                value_to_compare)) { // Assumed that you are comparing variable
                                     // a of struct
      max = r[i].a;
      maxi = i;
    }
  }
  return maxi;
}

int main() {
  printf("%d\n", trova_max(2, A_COMPARE));
  printf("%d\n", trova_max(2, B_COMPARE));
  printf("%d\n", trova_max(2, H_COMPARE));
  return 0;
}