Есть ли лучший способ изменить каждую переменную в структуре, C - PullRequest
3 голосов
/ 15 февраля 2020

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

struct RuntimeData
{
    double runtime_ms, sum_ms, avg_time_ms, best_time_ms;
};

int main()
{
    struct RuntimeData selection;

    // The '0' values are just for example..
    selection.runtime_ms = 0;
    selection.sum_ms = 0;
    selection.avg_time_ms = 0;
    selection.best_time_ms = 0;
}

Я бы предпочел сделать что-то подобное. ..

struct RuntimeData selection;

selection = { .runtime_ms=0,
              .sum_ms = 0,
              .avg_time_ms = 0,
              .best_time_ms = 0
};

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

РЕДАКТИРОВАТЬ: Используя ответы Нейта и Влада, составной литерал - это именно то, что мне нужно ! Большое вам спасибо.

Ответы [ 5 ]

3 голосов
/ 15 февраля 2020

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

struct RuntimeData selection;

void foo(void) {
  selection = (struct RuntimeData){ 0, 0, 0, 0 };
}

Это можно комбинировать с назначенными инициализаторами :

struct RuntimeData selection;

void foo(void) {
  selection = (struct RuntimeData){ 
                    .sum_ms = 42.3,
                    .avg_time_ms = 123.4,
                    .best_time_ms = -7e17,
                    .runtime_ms = 0.0001 
  };
}
2 голосов
/ 15 февраля 2020

Вам нужен составной литерал :

struct RuntimeData selection = /* Initialization with designated initializers */
    {
        .runtime_ms   = 0,
        .sum_ms       = 0,
        .avg_time_ms  = 0,
        .best_time_ms = 0
    };

selection = (struct RuntimeData){     /* Assignment of compound literal */
              .runtime_ms   = 23,
              .sum_ms       = 34,
              .avg_time_ms  = 45,
              .best_time_ms = 56
           };

Форматирование зависит от вас. Синтаксис должен работать в C18, C11 или C99 - составные литералы не были частью C90 (он же C89). Однако, поскольку те же комментарии относятся к назначенным инициализаторам , и вы уже используете их, это не будет проблемой для вас.

2 голосов
/ 15 февраля 2020

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

#include <stdio.h>

struct RuntimeData
{
    double runtime_ms, sum_ms, avg_time_ms, best_time_ms;
};

int main(void) 
{
    struct RuntimeData selection = 
    { 
        .runtime_ms=0,
        .sum_ms = 0,
        .avg_time_ms = 0,
        .best_time_ms = 0
    };

    {
        selection = ( struct RuntimeData )
        { 
            .runtime_ms=1,
            .sum_ms = 1,
            .avg_time_ms = 1,
            .best_time_ms = 1
        };
    }

    printf( "%.1f, %.1f, %.1f, %.1f\n ", 
            selection.runtime_ms, 
            selection.sum_ms, 
            selection.avg_time_ms,
            selection.best_time_ms );

    return 0;
}

Вывод программы:

1.0, 1.0, 1.0, 1.0

Конечно, вы можете упростить составной литерал следующим образом

selection = ( struct RuntimeData ) { 1, 1, 1, 1 };

Я приложил это задание в скобках, чтобы сократить время жизни составного литерала.

1 голос
/ 15 февраля 2020

Вы можете выполнить инициализацию с помощью составного литерала.

selection = (struct RunTimeData){0,0,0,0};
0 голосов
/ 15 февраля 2020

Попробуйте:

struct RuntimeData selection;

selection = { 0, 0, 0, 0 };

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

Ссылка на образец

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