Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262

Передача структуры в функцию, используя указатель

22.02.2020, 16:40. Показов 1233. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
хочу передать показатель на объект структуры в функцию. Но компилятор выдает помилкую

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
 
struct person
{
    int age;
    char name[20];
};
 
 
void change_struct_andriy(struct person *p_andriy);
 
structure_and_pointers(void)    // MAIN function in file <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
   
        struct person andriy;
        struct person *p_andriy = &andriy;
                p_andriy->age=22;
        strcpy(p_andriy->name, "Andriy");
        printf("Before change: Name: %s, age: %d", p_andriy->name, p_andriy->age);
        change_struct_andriy(p_andriy);
                printf("After change: Name: %s, age: %d", p_andriy->name, p_andriy->age);
}
 
 
void change_struct_andriy(struct person *p_andriy)
{
 
   // do something with p_andriy ...
}
компилятор говорит о конфликте типов, не понимаю почему...


structure.c: At top level:
structure.c:225:6: error: conflicting types for ‘change_struct_andriy’
void change_struct_andriy(struct person *p_andriy)
^~~~~~~~~~~~~~~~~~~~
In file included from structure.c:2:0:
structure.h:18:6: note: previous declaration of ‘change_struct_andriy’ was here
void change_struct_andriy(struct person *p_andriy);
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2020, 16:40
Ответы с готовыми решениями:

Передача массива в функцию используя указатель на функцию
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Структуры и их передача через указатель
Есть структура static struct Flash { std::string name ; unsigned short page ; unsigned short byte ; unsigned char ...

8
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
22.02.2020, 16:48
Покажите код с разделением на файлы так, как оно у вас сделано(отдельно structure.c и structure.h)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.02.2020, 16:51
Цитата Сообщение от OlegD_STM32 Посмотреть сообщение
structure.c:225:6: error: conflicting types for ‘change_struct_andriy’
void change_struct_andriy(struct person *p_andriy)
void structure_and_pointers(void) // MAIN function in file <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
0
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
22.02.2020, 16:59  [ТС]
elenayagubova,
Если я я запишу прототип финкциии
C
1
void change_struct_andriy(struct person *p_andriy);
в .с файле тогда все зкомпилюеться и все заработает, если перенести его в .h файл, тогда компилятор выдает ошибку

.h файл
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void pointers_on_functions(void);
 
static void my_sum_p(float a_f, float b_f, float *sum_f);
static void my_sub_p(float a_f, float b_f, float *sub_f);
static void my_mul_p(float a_f, float b_f, float *mul_f);
static void my_div_p(float a_f, float b_f, float *div_f);
 
void structure_and_pointers(void);                    // Main function in structure_and_pointers file
static void change_element_of_structure(void);        // Change elements structure Top
static void measure_size_structures(void);            // Measure size Top and struct_variable
static void create_object_structure(void);
static void create_local_structure(void);
static void fill_strunc_using_pointer(struct person *igor);
static void print_student_void(void *qwerty);
static void print_srt(const char *c_str);
void change_struct_andriy(struct person *p_andriy);
.с файл
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#include <stdio.h>
#include "structure.h"
 
static struct Data
{
        int x;
        int y;
} Point;                                       // Create new tipe data Point from Data
 
static struct Data Top;             // Create new tipe data Top from Data
 
// Typedef - create new type Data
// It method better than previous
typedef struct
{
    int q;
    int w;
} struct_variable;
 
// one structure inside another structure
/*
 create strucrure a and b which havs structure struct_variable
*/
typedef struct
{
    struct_variable a;
    struct_variable b;
    int j;
} coordinates;                          // Create object coordinates structure
 
struct person
{
    int age;
    char name[20];
};
 
struct team
{
    char name[20];
    int age;
};
 
//void change_struct_andriy(struct person *p_andriy);
 
structure_and_pointers()    // MAIN function in file <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
    change_element_of_structure();      // Change elements global structure Top in function
    measure_size_structures();          // Measure size Top and struct_variable
    create_object_structure();          // Create local object
    create_local_structure();                       // Same like previous
 
    // Structure and pointer on it ------------------------------------------------
    struct person boris;                                        // Create boris object from person
    struct person *p_boris=&boris;                          // Create pointer on boris object
    p_boris->age=99;                                                        // Write int
    strcpy(p_boris->name, "Boris");                         // Write string
    printf("Name: %s, age BORIS: %d\r\n",p_boris->name ,p_boris->age);
    // ----------------------------------------------------------------------------
 
        // create local strutc and transfet adress it in function  -------------------
    struct person igor;                                                 // Create new object igor from struct person
    strcpy(igor.name, "Igor");
    igor.age=34;
    printf("Before function. NAME: %s, AGE: %d\r\n", igor.name, igor.age);
    fill_strunc_using_pointer(&igor);            //transfet adress it in function
    printf("After function. NAME: %s, AGE: %d\r\n", igor.name, igor.age);
    // ----------------------------------------------------------------------------
 
    //
        struct person andriy;
        struct person *p_andriy = &andriy;
    p_andriy->age=22;
        strcpy(p_andriy->name, "Andriy");
        printf("Before change: Name: %s, age: %d\r\n", p_andriy->name, p_andriy->age);
        change_struct_andriy(p_andriy);
    printf("After change: Name: %s, age: %d\r\n", p_andriy->name, p_andriy->age);
 
 
 
 
 
//----------------------------------------------------------------------------------
    // Create local anonime structure, create qwerty object
    // and transmit pointer on object on function print_student_void.
    struct                          // Create anonime local structure
    {
      char name[60];
      unsigned char a;
      unsigned char b;
    } qwerty;
    // Fill elements of structure
    strcpy(qwerty.name, "test");
    qwerty.a=20;
    qwerty.b=30;
    print_student_void((void*)&qwerty);                                 // Transmit pointer structure in function
 
    // Create pointer on function     (not good method)
    // unsigned int *print_str_addr;                                                                    // Create pointer for function
    // print_str_addr = (unsigned int*)print_srt;                                       // Create pointer on function print_srt
    // printf ("addres function: 0x%08X \n\r", print_str_addr);         // Print address
    // printf ("addres function: 0x%08X \n\r", (unsigned int*)print_srt);           // same
    // // usint address of function
    // void (*print_str_new)(const char *c_str);
    // print_str_new = (void*)print_str_addr;
    // print_str_new("HELLO\r\n");                                                                      // Using pointer on function
 
    void (*print_str_new)(const char *c_str);         // Create pointer on some function
    print_str_new=&print_srt;                         // or without & (print_str_new=print_srt)
    print_str_new("HELLO");                           // transmit data in function
}
 
 
 
 
 
void pointers_on_functions(void)
{
  printf("functions_and_pointers\r\n");
  /*
  Create arrey pointers on several functions
  */
  void (*arith_operations[4])(float, float, float*) = {my_sum_p, my_sub_p, my_mul_p, my_div_p};
  float a=3. ,b=5, res=.0;
  for(unsigned char i=0; i<4; i++)
  {
    arith_operations[i] (a, b, &res);
    printf("Valye operation %hd is %f\n", i, res);
  }
}
 
 
static void my_sum_p(float a_f, float b_f, float *sum_f)
{
  *sum_f = a_f+b_f;
}
 
static void my_sub_p(float a_f, float b_f, float *sub_f)
{
  *sub_f = a_f-b_f;
}
 
static void my_mul_p(float a_f, float b_f, float *mul_f)
{
  *mul_f = a_f*b_f;
}
 
static void my_div_p(float a_f, float b_f, float *div_f)
{
  *div_f = a_f/b_f;
}
 
void change_element_of_structure(void)
{
  // Write data in elements STRUCTURE Top
  Top.x=88;
  Top.y=99;
  printf("Data from Top.x: %d\r\n", Top.x);
  printf("Data from Top.y: %d\r\n", Top.y);
}
 
void measure_size_structures(void)
{
  printf("Memory size struct_variable: %d\r\n", sizeof(struct_variable));
  printf("Memory size coordinates: %d\r\n", sizeof(coordinates));
}
 
/*
Create local object "kate", it object are local in it function.
*/
void create_object_structure(void)
{
 
  struct person kate = {31, "Kate"};            // Create object "kate" from structure "pointer" and writing data
  printf("Kate AGE: %d  Kate NAME: %s\r\n", kate.age, kate.name);
}
 
/*
Create local object oleg in function from struct "team"
It structure work only in this function
*/
void create_local_structure(void)
{
    static struct team oleg;                        // Create local objet oleg
    strcpy(oleg.name, "Oleg Demkiv");
    oleg.age=28;
 
    printf("Name worker: %s \r\n", oleg.name);
    printf("Age: %d\r\n", oleg.age);
}
 
/*
Function gets pointer on new structure igor
In function, for change element object structure igor we use ->
becouse we work with pointers in elements of structure.
*/
fill_strunc_using_pointer(struct person *igor)
{
    strcpy (igor->name, "lubomyr");
    igor->age;
    printf("In function. NAME: %s, AGE: %d\r\n", igor->name, igor->age);
}
 
// What different between it function and fill_strunc_using_pointer(struct person *igor)????
void print_student_void(void *qwerty)
{
    typedef struct
    {
        char name[60];
        unsigned char a;
        unsigned char b;
    } stdn;
 
    printf("%s, %d, %d \n\r", ((stdn*)qwerty)->name, ((stdn*)qwerty)->a, ((stdn*)qwerty)->b );
}
 
void print_srt(const char *c_str)
{
    printf("%s \n\r", c_str);
}
 
 
void change_struct_andriy(struct person *p_andriy)
{
    p_andriy->age=33;
    strcpy(p_andriy->name, "ANDRIY");
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.02.2020, 17:03
Цитата Сообщение от OlegD_STM32 Посмотреть сообщение
в .с файле тогда все зкомпилюеться и все заработает, если перенести его в .h файл, тогда компилятор выдает ошибку
В с-файле сделай void structure_and_pointers() и всё.
В h-файле сделай extern void structure_and_pointers(void);
1
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
22.02.2020, 17:03  [ТС]
structure.c: At top level:
structure.c:222:6: error: conflicting types for ‘change_struct_andriy’
void change_struct_andriy(struct person *p_andriy)
^~~~~~~~~~~~~~~~~~~~
In file included from structure.c:2:0:
structure.h:18:6: note: previous declaration of ‘change_struct_andriy’ was here
void change_struct_andriy(struct person *p_andriy);
^~~~~~~~~~~~~~~~~~~~
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
22.02.2020, 17:06
Цитата Сообщение от OlegD_STM32 Посмотреть сообщение
structure.c:222:6: error: conflicting types for ‘change_struct_andriy’
C++
1
2
3
4
5
6
7
8
#include <stdio.h>
 
struct person;
 
void pointers_on_functions(void);
 
static void my_sum_p(float a_f, float b_f, float *sum_f);
static void my_sub_p(float a_f, float b_f, float *sub_f);
0
7 / 7 / 0
Регистрация: 26.11.2018
Сообщений: 262
22.02.2020, 17:18  [ТС]
oleg-m1973,
у меня есть 4 файлы.
main.c (в нем я запускаю функцию structure_and_pointers())
main.h (у меня там extern void structure_and_pointers(void); ибо функция используется только в main.c )
structure.c (здесь я определяю функцию structure_and_pointers )
structure.h (здесь я ее декларирую void pointers_on_functions(void)
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
22.02.2020, 17:19
Лучший ответ Сообщение было отмечено OlegD_STM32 как решение

Решение

OlegD_STM32, h-файл не знает, что такое struct person - нужно там ее объявить.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2020, 17:19
Помогаю со студенческими работами здесь

Передача в функцию указателя на указатель
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { FUNC((int **)ptr); ...

Передача указателя на указатель в функцию
Вопрос к знатокам: Есть абстрактный класс(Symbol) и его производный (Cross). Создаю указатель этого абстрактного класса(Symbol *first) ,...

Передача в функцию указателя на указатель
Добавление нового элемента в начало списка: void Add_Beg(List **u, Data &amp;x) // Почему в 1 аргументе функции указатель на указатель? { ...

Передача массива в функцию через указатель
В каких случаях массив обязательно передается в качестве указателя в функцию?

Передача массива в функцию через указатель
Доброго времени суток! Почему компилятор ругается : error C2664 невозможно преобразовать параметр 3 из 'float ' в 'float *' ? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru