Автоматически назначать отношения членам структуры. (C) - PullRequest
0 голосов
/ 09 июля 2020

Я определил структуру, как показано ниже (в C).

struct Temp {
int C;
int F;};

, и всегда верно, что

(C × 9/5) + 32 = F

Поскольку у меня есть несколько переменных типа «struct Temp », было бы непросто определить подпрограмму для выполнения вычисления и вызова ее для каждой переменной. Было бы решением, если бы был возможен следующий код.

struct Temp {
int C;
int F = (C × 9/5) + 32;};

Как я могу применить это отношение автоматически, когда определена новая переменная типа «struct Temp».

Спасибо заранее.

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Вы можете сделать это, инициализировав массив, но для этого вам нужно сначала присвоить значение C. Например,

struct abc{
int a;
int b;
};
int z = 97;
struct abc pqr = {z, z+9/4};

Теперь значение переменной a в pqr равно 4, а b равно 6. Вы также можете сделать это, определив макрос. Например,

#define    MYSTRUCT(NAME, VAL)    struct abc NAME = {VAL, VAL+9/4};

Затем создайте новую структуру как:

MYSTRUCT(pqr, 97);
printf("%d, %d", pqr.a, pqr.b);
0 голосов
/ 09 июля 2020

То, что вы хотите, называется Свойством, которое не поддерживается в C. Вы можете сделать это двумя способами. Первый способ - определить функцию, которая будет выполнять вычисления каждый раз, как в приведенном ниже коде. Этот метод не кэшируется.

int GetF(struct Temp temp)
{
    return temp.C * 1.8 + 32;
}

Другой способ (кэшированный) - установить значение C с функцией таким образом, чтобы вычислить и сохранить значение F, и вы можете его использовать позже быстро.

int SetC(struct Temp temp, int c)
{
    temp.C = c;
    temp.F = c * 1.8 + 32;
}
0 голосов
/ 09 июля 2020

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

ниже приведен пример использования макроса функции, чтобы сделать это безболезненно. Однако обратите внимание, что ваши типы для C и F являются целыми числами, поэтому они будут усечены при попытке преобразования. Лучше объявить их как float или double.

#include <stdio.h>
#define initF(x) (x.F = (x.C * 9/5) + 32)

struct Temp {
        int C;
        int F;
};
int main(int argc, char** argv) {
        struct Temp t;
        t.C = 32;
        initF(t);
        printf("Temp F = %d\n", t.F);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...