Передать различные члены данных в функции в C - PullRequest
0 голосов
/ 12 июня 2018

Просто вопрос о программировании на C, поскольку я новичок в этом.

Итак, у меня есть typedef struct с именем students, и я создал их массив.У каждого из них есть элементы данных q1, q2, q3, q4, final.

Я пытаюсь выполнить вычисления для каждого из этих элементов данных, и в настоящее время у меня естьотдельные функции для каждой, например, так:

int highestQ1(student[], int);
int highestQ2(student[], int);
int highestQ3(student[], int);
int highestQ4(student[], int);
int highestFinal(student[], int);
int highestQ1(student[], int);

Но это делает код действительно длинным, и мне интересно, есть ли способ для меня создать функцию, которая позволит мне указать, какой элемент данных изструктура, используемая для расчета в качестве параметра, таким образом, я могу просто использовать одну функцию и вывести свой код.

Примером моей цели будет

int highestVal(student[] data, int size, char[] wildcard)
{
    int i = data[x].wildcard;
}

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 13 июня 2018

Вы можете использовать смещение в качестве указателя на элемент данных:

void print(const student* students, int size, int offset)
{
    for (int i = 0; i != size; ++i) {
        const int member = *((const int*)(((const char*) &students[i]) + offset));

        printf("%d ", member);
    }
    printf("\n");
}

с вызовом, подобным:

print(students, size, offsetof(student, q1));

Демо

0 голосов
/ 12 июня 2018

Допустим, вы хотели найти наивысшую оценку в массиве учащихся с использованием группового значения / значения группы, и на ваш вопрос очень близко подходит следующее:

#include <stdio.h>


typedef struct student {
    char * name;
    int mark;
    char * wildcard;
} student;


int highestMark(student[], int, char *);

int main() {
    // Make an array of students
    student all_students[] = {
        {.name = "John", .mark = 75, .wildcard = "Final"},
        {.name = "Mark", .mark = 83, .wildcard = "Q1"},
        {.name = "Melanie", .mark = 81, .wildcard = "Q2"},
        {.name = "Ashley", .mark = 92, .wildcard = "Q3"},
        {.name = "Sandra", .mark = 90, .wildcard = "Final"},
        {.name = "Jacob", .mark = 79, .wildcard = "Q1"},
        {.name = "Marlene", .mark = 74, .wildcard = "Q2"},
        {.name = "Layla", .mark = 70, .wildcard = "Q4"},
        {.name = "John", .mark = 84, .wildcard = "Final"},
        {.name = "Mark", .mark = 83, .wildcard = "Q2"},
        {.name = "Melanie", .mark = 100, .wildcard = "Q2"},
        {.name = "Ashley", .mark = 97, .wildcard = "Q3"},
        {.name = "Aysha", .mark = 100, .wildcard = "Final"},
        {.name = "Devin", .mark = 95, .wildcard = "Q1"},
    };
    // Call the highestMark function for wildcards of value "Final"
    // int arr_length = sizeof(all_students)/sizeof(student);
    int arr_length = sizeof all_students/sizeof all_students[0];
    printf("%d\n", highestMark(all_students, arr_length, "Final"));
}

// Grab the highest mark number given a wildcard
// Wildcards can be Q1, Q2, Q3, Q4 or Final
int highestMark(student students[], int size, char * wildcard) {
    int highest = 0;
    for (int i=0; i < size; i++) {
        if (students[i].wildcard != wildcard) {
            continue;
        }
        if (highest < students[i].mark) {
            highest = students[i].mark;
        }
    }
    return highest;
}

Надеюсь, это окажется полезным.

0 голосов
/ 12 июня 2018

, если Q имеют одинаковый тип, тогда вы можете передать их смещение:

struct Student {
    int q1, q2, q3, q4;
};

int highestQ(struct Student students[], int size, size_t offset) {
  for (int i=0; i<size; i++) {
    struct Student *s = students+i;
    int *q = (int *)(((char *)s) + offset);
    // do something with *q
  }
  return something;
}

// Example of a call
struct Student student_array[10] = { /* whatever to initialize */};
highestQ(student_array, 10, offsetof(struct Student, q2));

Вы также можете использовать встроенный массив:

struct Student {
    int q[4];
};

int highestQ(struct Student students[], int size, int idx) {
  for (int i=0; i<size; i++) {
    int q = students[i].q[idx];
    // do what you want with q
  }
  return something;
}

// call example
struct Student student_array[10] = { /* whatever to initialize */};
highestQ(student_array, 10, 2);

Если Q не относятся кодин и тот же тип или алгоритм, применяемый к ним, может не совпадать, тогда как аналогичные вещи должны применяться отдельно для каждого случая.

0 голосов
/ 12 июня 2018

Вы можете сделать более общую функцию, которой вы передаете index члена данных, который будет использоваться для расчета.

Например, этот индекс может быть one to one картой вашегоQ.Скажем, если вы передадите 1, вы рассмотрите Q1 для расчета, 2 рассмотрите Q2 и т. Д.

...