ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
30 декабря
1562867 Топик полностью
Гyдвинволшебник (Вчера, 22:41, просмотров: 36) ответил Гyдвин на Вон чО >>
Или так: 
This shared conversation is generated by AI, for reference only.
Пример инициализации  массива структур gcc
Вот несколько примеров инициализации массива структур в GCC (C/C++):
1. Базовый пример на C
c
#include <stdio.h>
struct Point {
    int x;
    int y;
    char label[20];
};
int main() {
    // Инициализация массива структур
    struct Point points[3] = {
        {10, 20, "Point A"},      // Первая структура
        {30, 40, "Point B"},      // Вторая структура
        {50, 60, "Point C"}       // Третья структура
    };
    
    for (int i = 0; i < 3; i++) {
        printf("%s: (%d, %d)\n", points[i].label, points[i].x, points[i].y);
    }
    
    return 0;
}
2. С указанием индексов (designated initializers, C99+)
c
#include <stdio.h>
struct Student {
    int id;
    char name[30];
    float gpa;
};
int main() {
    // Инициализация с указанием полей (можно в любом порядке)
    struct Student students[3] = {
        {.id = 101, .name = "Alice", .gpa = 3.8},
        {.name = "Bob", .id = 102, .gpa = 3.5},  // порядок не важен
        {.gpa = 3.9, .id = 103, .name = "Charlie"}
    };
    
    // Можно инициализировать не все элементы
    struct Student partial[5] = {
        [0] = {.id = 201, .name = "David", .gpa = 3.7},
        [3] = {.id = 202, .name = "Eve", .gpa = 3.6}
        // Остальные будут нулевыми
    };
    
    return 0;
}
3. Пример на C++
cpp
#include <iostream>
#include <string>
struct Person {
    std::string name;
    int age;
    double salary;
};
int main() {
    // C++11 и новее: uniform initialization
    Person employees[3] = {
        {"John Doe", 30, 50000.0},
        {"Jane Smith", 25, 45000.0},
        {"Bob Johnson", 35, 55000.0}
    };
    
    // С указанием полей (C++20)
    Person managers[] = {
        {.name = "Alice Brown", .age = 40, .salary = 70000.0},
        {.name = "Tom Wilson", .age = 45, .salary = 75000.0}
    };
    
    for (const auto& emp : employees) {
        std::cout << emp.name << ", " << emp.age << " years, $" 
                  << emp.salary << std::endl;
    }
    
    return 0;
}
4. Динамическая инициализация
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
    char title[50];
    char author[50];
    int year;
    float price;
} Book;
int main() {
    // Статический массив
    Book library[2] = {
        {"The C Programming Language", "K&R", 1978, 49.99},
        {"Clean Code", "Robert Martin", 2008, 59.99}
    };
    
    // Динамический массив
    int count = 3;
    Book *dynamicBooks = malloc(count * sizeof(Book));
    
    if (dynamicBooks) {
        // Инициализация каждого элемента
        strcpy(dynamicBooks[0].title, "Book 1");
        strcpy(dynamicBooks[0].author, "Author 1");
        dynamicBooks[0].year = 2000;
        dynamicBooks[0].price = 29.99;
        
        // Или через составной литерал (C99)
        dynamicBooks[1] = (Book){"Book 2", "Author 2", 2005, 34.99};
        
        // Использование designated initializer
        dynamicBooks[2] = (Book){.title = "Book 3", .price = 39.99, 
                                 .author = "Author 3", .year = 2010};
        
        free(dynamicBooks);
    }
    
    return 0;
}
5. Вложенные структуры
c
#include <stdio.h>
typedef struct {
    int day;
    int month;
    int year;
} Date;
typedef struct {
    char name[50];
    Date birthdate;
    float height;
} Person;
int main() {
    // Инициализация массива с вложенными структурами
    Person people[2] = {
        {
            "Alex",
            {15, 7, 1990},  // Вложенная структура Date
            175.5
        },
        {
            "Maria",
            {.day = 22, .month = 11, .year = 1985},
            168.2
        }
    };
    
    return 0;
}
6. Частичная инициализация
c
#include <stdio.h>
struct Config {
    int timeout;
    int retries;
    char hostname[50];
    int port;
};
int main() {
    // Частичная инициализация (неинициализированные поля = 0)
    struct Config configs[4] = {
        {30, 3, "server1", 8080},    // Полностью инициализирована
        {60},                         // Только timeout, остальные 0
        {.hostname = "localhost"},    // Только hostname
        {}                            // Все поля = 0
    };
    
    // Специфичные элементы массива
    struct Config specific[10] = {
        [2] = {.timeout = 100, .port = 9000},
        [5] = {.hostname = "example.com", .retries = 5},
        [9] = {30, 3, "last", 80}
    };
    
    return 0;
}
Особенности GCC
    Designated initializers (C99) - поддерживаются в GCC
    Составные литералы (C99) - (тип){инициализатор}
    Диапазоны в инициализаторах (GCC расширение):
c
int arr[10] = {[0 ... 4] = 1, [5 ... 9] = 2};  // GCC расширение
Все примеры совместимы со стандартами C99/C11 и C++11/C++14. Для компиляции используйте:
bash
gcc -std=c99 -o program program.c  # для C
g++ -std=c++11 -o program program.cpp  # для C++