|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
12.04.2013, 19:47 | #1 |
Новичок
Джуниор
Регистрация: 12.04.2013
Сообщений: 7
|
работа со структурами
Добрый вечер, подскажите, как правильно:
1. Передавать структуры между несколькими функциями, а именно: имеется функция main(), которая передает с помощью адреса структуру в функцию g1(). Функция g1() должна передавать эту же структуру в функцию g2(), в которой изменяются значения элементов структуры. Как я понимаю, в том случае, если функции необходимо изменить значения полей структуры, структура передается функции с помощью адреса, если функция не изменяет структуру, то передача структуры производится по имени. Как правильно передать с помощью адреса структуру из функции main() в g1() и далее в g2()? 2. Грамотно-ли организована работа со структурами в функции g3()? #include <stdio.h> struct Rec { int C_Rec; int D_Rec; }; struct trec { struct Rec tob; int B; }; struct REC { struct trec rek[100]; int A; }; void g3(void *rec, void *rec2) { struct REC *R=(struct REC*)rec; struct trec *AR=(struct trec *)rec2; R->A=1; AR->B=20; AR->tob.C_Rec=10; } void g2(struct trec *rek6, int k) { rek6->B=10; } void g1(struct REC *rek5, int i) { struct trec *A = &(rek5->rek[i]); A->tob.C_Rec=1; g2(A,0); printf("B=%d\n",A->B); } int main() { struct REC rek5; memset (&rek5,0,sizeof(rek5)); g1(&rek5,0); g3(&rek5, &rek5.rek[0]); getc(stdin); return 0; } |
12.04.2013, 20:29 | #2 |
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
|
Код:
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
|
12.04.2013, 22:19 | #3 |
Новичок
Джуниор
Регистрация: 12.04.2013
Сообщений: 7
|
Спасибо за ответ. Но я так понимаю у меня написано примерно так же. А по поводу второго моего вопроса (2. Грамотно-ли организована работа со структурами в функции g3()?)?
|
12.04.2013, 23:07 | #4 |
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
|
Лучше заменить указатели типа void* на определенного типа и прототип функции будет выглядеть так:
Код:
Код:
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Последний раз редактировалось kineziz; 12.04.2013 в 23:16. |
12.04.2013, 23:19 | #5 |
Новичок
Джуниор
Регистрация: 12.04.2013
Сообщений: 7
|
Да. Код работает. В функцию g3(&rek5, &rek5.rek[0]); передается структура struct REC и массив структур (нулевой элемент) struct trec, вложенной в struct REC. У меня вопрос состоит в том, что разумно два раза передавать фактически одну и ту же структуру? Нюанс состоит в том, что для работы функции g3() нужны элементы структуры struct REC и элементы массива структур struct trec rek[100]; структуры struct REC.
|
12.04.2013, 23:23 | #6 |
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
|
Ну да. Можно передать одну структуру, а через нее добраться до второй
Код:
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Последний раз редактировалось kineziz; 12.04.2013 в 23:28. |
12.04.2013, 23:27 | #7 |
Новичок
Джуниор
Регистрация: 12.04.2013
Сообщений: 7
|
Я понимаю, что записью &rek5 я передаю структуру struct REC в которую входит массив структур struct trec rek[100]; а записью &rek5.rek[0] я передаю непосредственно нулевой элемента массива структур struct trec rek[100]; входящего в структуру struct REC.
|
12.04.2013, 23:29 | #8 |
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
|
Ну да верно. Вторая передача является лишней. Можно и без неё
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
|
12.04.2013, 23:30 | #9 |
Новичок
Джуниор
Регистрация: 12.04.2013
Сообщений: 7
|
[QUOTE=kineziz;1213077]Ну да. Можно передать одну структуру, а через нее добраться до второй
Да, но тогда мне нужно передавать индекс массива структур: g3(&rek5, i); void (struct Rec *R, int e) { R->rek[e].B=10; R->rek[e].tob.D_Rec=20; } |
12.04.2013, 23:33 | #10 |
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
|
Да возможны оба способа. Тут это не имеет значения. Как удобнее. Я бы конечно через передачу индекса сделал, как то код более приятным выглядет
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа со структурами (C++) | DragoonSki | Помощь студентам | 6 | 03.03.2013 02:00 |
Работа со структурами | Infini | Visual C++ | 0 | 02.03.2013 13:22 |
Работа со структурами | marco_33 | Общие вопросы C/C++ | 3 | 08.11.2012 03:44 |
Работа со структурами | _Колибри_ | Помощь студентам | 2 | 28.11.2011 02:09 |
[C++] Работа со структурами... | max382 | Помощь студентам | 30 | 05.05.2011 15:56 |