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

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

22.02.2020, 16:40. Показов 1258. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru