изменить значение структуры с помощью указателя void - PullRequest
0 голосов
/ 26 мая 2020

Я упростил свою задачу до следующего:

Допустим, у меня есть структура (t_struct1), и если я передаю эту структуру в функцию (do_something_with_struct (...)), значения другой структуры (t_struct2) будет скопирован в первую структуру (t_struct1). Итак, в основном ...

void do_something_with_struct(struct){
        struct = struct2;
}
do_something_with_struct(struct1);

... должно произойти.

Несколько вещей, которые не разрешены в моей программе: 1. функция ничего не знает о struct, поэтому я в основном не могу привести указатель void на структуру внутри функции и 2. параметр функции должен быть указателем void.

Это «настоящая» программа, которую я использую, но она не работает по какой-то причине.

struct test_struct {
        int test_int;
        char test_char;
};
struct test_struct t_struct1;
struct test_struct t_struct2;

void do_something_with_struct(void *p){
        void* temp = (void*)&t_struct2;
        p = temp; 
}

int main(void) {
        t_struct2.test_char = 'b';
        t_struct2.test_int  = 2;

        do_something_with_struct((void*)&t_struct1);

        // I want the values of t_struc1 to be the same as t_struct2 (so 2 and 'b'),
        // but they aren't. Instead t_struct1 is is filled with random/default values.

        while (1);
}

Как я уже говорил выше, программа не работает. Есть ли у кого-нибудь решение / мысль, которая заставит мою программу работать.

Заранее спасибо,

Арджон

1 Ответ

0 голосов
/ 26 мая 2020

Я хочу, чтобы значения t_struc1 были такими же, как t_struct2 ...

void * это обычно используется в качестве аргумента функции, когда эта функция должна поддерживать обработку нескольких типов ввода. И, как правило, поскольку для функции важно знать, какой тип данных, также должен быть аргумент, сообщающий функции, как преобразовать данные void *. В этом случае мы знаем тип приема, поэтому преобразование будет эквивалентно:

struct test_struct *new = (struct test_struct *)p;  

Как показано ниже:

Простите мои typedef s, (предпочтение удобочитаемости). но ниже показано, как можно присвоить значения из одной структуры другой:

typedef struct test_struct {
        int test_int;
        char test_char;
}TEST;
TEST t_struct1;
TEST t_struct2;

void do_something_with_struct(void *p){

    TEST *new = (TEST *)(p);    //create a temporary pointer and with a cast
                                //assign it to point to the argument `p`
    new->test_char = t_struct2.test_char;//make assignments of values
    new->test_int =  t_struct2.test_int;
    p = new; //update p
}

int main(void) {
    t_struct2.test_char = 'b';
    t_struct2.test_int  = 2;

    do_something_with_struct((void*)&t_struct1);
    t_struct1;//because of global scope, changes made in function 
              //are visible here. (t_struct1 == t_struct2)
    printf("t_struct2.test_char: %c\nt_struct2.test_int: %d\n" \
        "t_struct1.test_char: %c\nt_struct1.test_int: %d\n" \
        "(Hit any key to exit.)", \
        t_struct2.test_char,t_struct2.test_int,  \        
        t_struct1.test_char,t_struct1.test_int);

    return 0;
}
...