как передать массив членов структуры в функцию в C - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь передать только элемент структуры в функцию, мне нужно, чтобы весь массив 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, потому что это лишило бы цели иметь функцию

Ответы [ 5 ]

0 голосов
/ 14 октября 2018

Ссылаясь на этот комментарий :

Вы можете использовать магию препроцессора, чтобы "автоматически" создавать код так часто, как вам хочется, без необходимости писать его несколько раз:

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

: -)

0 голосов
/ 14 октября 2018

Вы можете передать смещение интересующему вас члену функции:

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
0 голосов
/ 14 октября 2018

Вы делаете это неправильно.Вы пытаетесь передать указатель на struct rettangolo, и поэтому вам необходимо изменить объявление функции согласно требованию.Прототип вашей функции должен быть

int trova_max(struct rettangolo r[],int k);
0 голосов
/ 14 октября 2018

Если структура является локальной переменной (переменная объявлена ​​внутри функции), тогда используйте

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;
}
0 голосов
/ 14 октября 2018

Я думаю, что вам лучше "перегрузить" функцию 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;
}
...