我试图仅将结构的一个成员传递给函数,我需要将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,因为那样会破坏具有功能的目的
答案 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;
}