Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2013, 19:47   #1
StrelKz
Новичок
Джуниор
 
Регистрация: 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;
}
StrelKz вне форума Ответить с цитированием
Старый 12.04.2013, 20:29   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Код:
struct TestStruct
{
      int a;
};

void g2(TestStruct* pStruct)
{
      pStruct->a = 10
}
void g1(TestStruct* pStruct)
{
      g2(pStruct);
}
int main()
{
      TestStruct Test;
      g1(&Test);
}
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 12.04.2013, 22:19   #3
StrelKz
Новичок
Джуниор
 
Регистрация: 12.04.2013
Сообщений: 7
По умолчанию

Спасибо за ответ. Но я так понимаю у меня написано примерно так же. А по поводу второго моего вопроса (2. Грамотно-ли организована работа со структурами в функции g3()?)?
StrelKz вне форума Ответить с цитированием
Старый 12.04.2013, 23:07   #4
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Лучше заменить указатели типа void* на определенного типа и прототип функции будет выглядеть так:

Код:
void g3(REC* rec, trec* rec2)
И зачем создавать еще указатели на эти структуры, когда к ним можно обращаться напрямую через аргументы:

Код:
void g3(REC* rec, trec* rec2)
{
       rec->A=1;
       rec2->B=20;
       rec2->tob.C_Rec=10;
}
Указатели void* лучше использовать, когда нужно передать в функцию адрес заранее неизвестного типа. Это используется в библиотеках COM например.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 12.04.2013 в 23:16.
kineziz вне форума Ответить с цитированием
Старый 12.04.2013, 23:19   #5
StrelKz
Новичок
Джуниор
 
Регистрация: 12.04.2013
Сообщений: 7
По умолчанию

Да. Код работает. В функцию g3(&rek5, &rek5.rek[0]); передается структура struct REC и массив структур (нулевой элемент) struct trec, вложенной в struct REC. У меня вопрос состоит в том, что разумно два раза передавать фактически одну и ту же структуру? Нюанс состоит в том, что для работы функции g3() нужны элементы структуры struct REC и элементы массива структур struct trec rek[100]; структуры struct REC.
StrelKz вне форума Ответить с цитированием
Старый 12.04.2013, 23:23   #6
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Ну да. Можно передать одну структуру, а через нее добраться до второй

Код:
void g3(REC* rec)
{
       rec->A=1;
       rec->rek[0].B=20;
       rec->rek[0].C_Rec=10;
}
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 12.04.2013 в 23:28.
kineziz вне форума Ответить с цитированием
Старый 12.04.2013, 23:27   #7
StrelKz
Новичок
Джуниор
 
Регистрация: 12.04.2013
Сообщений: 7
По умолчанию

Я понимаю, что записью &rek5 я передаю структуру struct REC в которую входит массив структур struct trec rek[100]; а записью &rek5.rek[0] я передаю непосредственно нулевой элемента массива структур struct trec rek[100]; входящего в структуру struct REC.
StrelKz вне форума Ответить с цитированием
Старый 12.04.2013, 23:29   #8
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Ну да верно. Вторая передача является лишней. Можно и без неё
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 12.04.2013, 23:30   #9
StrelKz
Новичок
Джуниор
 
Регистрация: 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;
}
StrelKz вне форума Ответить с цитированием
Старый 12.04.2013, 23:33   #10
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Да возможны оба способа. Тут это не имеет значения. Как удобнее. Я бы конечно через передачу индекса сделал, как то код более приятным выглядет
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со структурами (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