Как можно скопировать значение одного поля struct в другое поле структуры?

Как мне инициализировать поле `len` структуры `My_Struct` так, чтобы оно автоматически принимало значение равное длине вектора, хранящегося в поле `vec` при создании экземпляра структуры?
  • 22 апреля 2024 г. 12:20
Ответы на вопрос 2
Для копирования значения одного поля структуры в другое можно сделать следующее:

```c
#include <stdio.h>

typedef struct {
    int a;
    int b;
} My_Struct;

int main() {
    My_Struct struct1 = {10, 20};
    My_Struct struct2;

    struct2.a = struct1.a;
    struct2.b = struct1.b;

    printf("struct2.a = %d\n", struct2.a);
    printf("struct2.b = %d\n", struct2.b);

    return 0;
}
```

Чтобы инициализировать поле `len` структуры `My_Struct` при создании экземпляра структуры, можно воспользоваться конструктором (`constructor`) в C++. В C конструкторов нет, поэтому можно воспользоваться функцией для инициализации:

```c
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int len;
    int *vec;
} My_Struct;

My_Struct createStruct(int *array, int size) {
    My_Struct myStruct;
    myStruct.len = size;
    myStruct.vec = (int *)malloc(size * sizeof(int));
    for (int i = 0; i < size; i++) {
        myStruct.vec[i] = array[i];
    }

    return myStruct;
}

int main() {
    int array[] = {1, 2, 3, 4, 5};
    My_Struct myStruct = createStruct(array, sizeof(array) / sizeof(array[0]);

    printf("myStruct.len = %d\n", myStruct.len);

    free(myStruct.vec);
    
    return 0;
}
```
Вообще-то тебе поле тут вовсе не нужно, ибо там где надо - ты можешь обратиться к vec.len() =) 
Но если сильно надо:
fn main()
{
    #[derive(Debug)]
    struct MyStruct {
        vec: Vec<usize>,
        len: usize,
    }
    let vector = vec![];
    let mut test_struct = MyStruct {
        len: vector.len(),
        vec: vector,
    };
    println!("{:?}", test_struct);
}
Похожие вопросы