Как определить член структуры как сумму других членов - PullRequest
1 голос
/ 11 марта 2020

Есть некоторые вопросы, похожие на это (а именно, Определите структуру с членом, указывающим на другого члена ), но, учитывая, что я полный нуб в C, я не могу удовлетворить свои сомнения, читая их , поэтому я открываю свою собственную в ожидании, что у меня будет какая-то разница (если нет, пожалуйста, укажите мне правильный вопрос и закройте это как обман).

Я пытаюсь достичь себя Пояснение:

typedef struct  {
    int goals_as_visitor;
    int goals_as_home;
    int total_goals = goals_as_visitor +  goals_as_home;
} team

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

Любое руководство?

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Нет, это невозможно. Определение C - это примерно определение пространства для хранения, не более. Если вы хотите убедиться, что поле всегда является суммой первых, вам нужна дисциплина: каждый раз, когда вы изменяете одно из них, вам придется модифицировать третье. В этом отношении OOP языки лучше, C слишком базовый c. В любом случае вы можете попытаться использовать стиль OOP в C, что-то вроде:

typedef struct Team  {
    int goals_as_visitor;
    int goals_as_home;
    int total_goals;
} team;

void setGoalAsVisitor(struct Team *this,int value) {
    this->goals_as_visitor = value;
    this->total_goals = this->goals_as_visitor + this->goals_as_home;
}

...
setGoalAsVisitor(&team,666); // Roughly calling a method on team: aka team.setGoalAsVisitor(666) in Java style
...

и дисциплинировать себя, чтобы не использовать поля напрямую.

Примечание: вы можете скрыть много вещей чтобы усилить дисциплину, но увы C может позволить вам делать гадости и нарушать правила ...

1 голос
/ 11 марта 2020

Это невозможно в c. Но total_goals всегда будет суммировать goal_as_visitor и goal_as_home. Так что лучше всего использовать total_goals в качестве указателя на функцию, подобную этой

#include<stdio.h>


/*structure and elements*/

struct team;
int tot_g(struct team *sthis);
typedef int (*tot_gol)(struct team *sthis);

struct team
{
    int goals_as_visitor;
    int goals_as_home;
    const tot_gol total_goals;

}
const init={.goals_as_visitor=0,.goals_as_home=0,.total_goals=tot_g};

int tot_g(struct team *sthis)
{
   return (sthis->goals_as_visitor+sthis->goals_as_home);
}

typedef struct team team;

/*structure and elements*/

int main()
{
     team p=init;
     p.goals_as_home=5;
     p.goals_as_visitor=5;
     printf("%d",p.total_goals(&p));
}

Вы должны всегда инициализировать когда командный объект определен с помощью init.

Или

Простой способ сделать это - использовать функцию, подобную

#include<stdio.h>

typedef struct  {
    int goals_as_visitor;
    int goals_as_home;
} team;

int total_goals(team var)
{
    return (var.goals_as_home+var.goals_as_visitor);
}

int main()
{
     team p;
     p.goals_as_home=5;
     p.goals_as_visitor=5;
     printf("%d",total_goals(p));
}

. Вы также можете использовать параметр функции total_goals в качестве константного указателя.

1 голос
/ 11 марта 2020

Здесь вы просто определяете структуру, сообщая компилятору, какие члены он содержит. Чтобы использовать эту структуру сначала вы должны объявить структуру, а затем и только тогда будет выделена память для этой структуры. Члены структуры не могут быть инициализированы с объявлением.

Определение будет выглядеть так:

typedef struct  {
    int goals_as_visitor;
    int goals_as_home;
    int total_goals;
} team

, а объявление будет выглядеть так:

team red;
team blue;

Теперь структура имеет некоторую память выделены, и члены структуры могут быть доступны с помощью оператора точки [.].

например, red.goals_as_visitor = 10;

Вот пример кода, который может помочь вам

#include <stdio.h>

typedef struct  {
        int goals_as_visitor;
        int goals_as_home;
        int total_goals;
}team;
int main (void)
{
        team red ;
        red.goals_as_visitor=10; 
        red.goals_as_home = 5; 
        red.total_goals = red.goals_as_visitor + red.goals_as_home;

        printf("%d %d %d\n", red.goals_as_visitor, red.goals_as_home, red.total_goals);
        return 0;
}

Ниже приведены ссылки на основы конструкций [https://www.geeksforgeeks.org/structures-c/]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...