【问题标题】:how to pass struct member array to function in C如何将结构成员数组传递给C中的函数
【发布时间】:2018-10-14 09:48:13
【问题描述】:

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

结构:

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;
}

呼叫:

max_b=trova_max(r.b,k);

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

【问题讨论】:

  • @Rabbid76:“函数的形参是指向int类型数组的指针”。不,不是。在函数参数定义的上下文中,这个int *r[] 100% 等同于int ** r。所以这里r 是一个指向int 的指针。这里没有指向任何数组的指针。
  • 无效调用:max_b=trova_max(r.b,k); r 是对象数组。所以你提供了一个索引来标识你想传递哪个对象参数。您已经通过数组传递了单个整数变量 catch 。这也是无效的。最好阅读结构对象的内存对齐以及如何访问它们。

标签: c function struct parameter-passing


【解决方案1】:

我认为您最好“重载”函数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;
}

【讨论】:

  • 我可以这样做,但我想知道是否有办法传递 r[].b 以便我可以将该函数也用于 r[].a 和 r[].h
  • 我可以更新答案以符合您的要求,但我认为您所追求的设计并不是最优的,因为您总是以一个额外的循环结束。
  • 基本上我想做的是将函数 trova_max() 与 r[].b, r[].h, r[].a 一起使用,这样我就不必写了他们三个的代码相同
  • 我明白,但这并没有错。如前所述,只需创建一个循环遍历目标数组的函数,并将指针存储到结构中感兴趣的成员,然后将该数组传递给函数。那个,或者有一个工厂结构,在分离的数组中保存对所有感兴趣的成员的引用。
【解决方案2】:

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

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

【讨论】:

  • 但没有办法只将 r[].b 作为整数数组传递?
  • @orion;不,没有办法做到这一点。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    引用此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);    
    }
    

    :-)

    【讨论】:

      【解决方案5】:

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

      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;
      }
      

      【讨论】:

      • 这可行,但我想知道是否有办法只传递 r[].b 以便我可以使用同样的函数也传递 r[].h 和 r[] .a
      • @orion 检查这个修改后的版本
      猜你喜欢
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2015-09-24
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多