Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Передача структуры функции


Автор: AlexSm 16.3.2003, 19:38
baaa.gif Люди хелп, я начинающий программист и вот мне приглючила такая фишка надо бы передать структуру функции как это сделатьconfused.gif

Автор: Baa 16.3.2003, 21:22
AlexSm, передай указатель на неё.

Автор: Step 18.3.2003, 04:58
Baa а через тип структуры разве не получиться

Автор: Step 18.3.2003, 05:19
Код
struct a{
int y,u;

};



void ty(a ui)
{
ui.y=ui.u;
}

вызов
a po;
ty(po);



проверял- работает

Автор: DENNN 18.3.2003, 06:04
Step В твоем случае передаеться в стек вся структура, затем вызывается подпрограмма которая ее отттуда забирает. В вариантеBaa в стек помещается только указатель. При больших размерах структуры работа программы может замедлится.
Есть иакже третий вариант
Код

struct a
{
int x,y
};

void t(struct& a)
{
a.x+=1;

}

Автор: SETQ 18.3.2003, 06:19
whooooops!... а что это за фишка?
Код
void t (struct& a) {......

может чего-то поменялось, а я и не знаю.... :)

есть и четвёртый способ, раз уж на то пошло ;)))))))
Код
struct a { int x,y; } global_a;

void t () { global_a.x = ....... }

не воспринимать как руководство к действию пожалуйста :))

Автор: DENNN 18.3.2003, 20:22
Не помню как правильно называется, что-то вроде ссылочной переменной

Автор: Nastya 18.3.2003, 20:27
Цитата
whooooops!... а что это за фишка?
CODE 
void t (struct& a) {......

может чего-то поменялось, а я и не знаю.... smile.gif



Это передача параметров по ссылке (так модно передавть не только структуры, но и любые данные). Когда передается не значение переменной, а ссылка на нее.

Автор: SETQ 19.3.2003, 00:23
так...
Код
void t (struct& a) {......
по-моему, всё-таки нельзя

если вы имеете в виду ссылочные переменные, то, опять же по-моему, выглядеть это должно иначе
Код
void t (struc a& A) {...............
или я чего-то не знаю, что тоже может быть.

Автор: -=Baa=- 19.3.2003, 17:50
Есть еще много извращенных способов передачи smile.gif можно передать через инт smile.gif
в инт заносим адрес, а потом его юзаем как начало структуры. (тоже самое, что и по ссылке)

Автор: Paradox 19.3.2003, 17:59
Цитата
так модно передавть

наверное моЖно
а если все-таки моДно, то мне кажется что передавать надо не так как модно, а так как удобно или практично

Автор: Alex101 19.3.2003, 18:07
Цитата(Nastya @ 18.3.2003, 17:27)
так модно передавть не только структуры, но и любые данные

Paradox прав - это намного практичнее. Передавать по значению удобно простые типы данных (int, char и т.д.), иначе проще передавать ссылку на них, я бы сказал даже, "лучше" - нет смысла запихивать в стек громоздкие данные - смысла тут действительно будет ноль, а вот торможение может появиться.
Представьте себе, что лучше сделать - передать в функцию класс - какой-нибудь CEdit или указатель на него?

Автор: DENNN 19.3.2003, 21:03
Цитата
если вы имеете в виду ссылочные переменные, то, опять же по-моему, выглядеть это должно иначеCODE
void t (struc a& A) {...............
или я чего-то не знаю, что тоже может быть

Да все правильно. Малось не там & поставил smile.gif

А насчет стека, так ссылочная переменная для того и существует чтоб в сетк значению не запихивать. А насчет удобства, если ты кусок кода переделываешь в подпрограмму, то при использовании ссылочной переменной ничего менять не придется а для адреса выражение вида newvalue=a.name; надо заменять на newvalue=a->name; . Если кусок кода большой то и такой правки может быть достаточно много. Выгода: если захочешь потом из подпрограмы опять вернуть кусок кода то такие выражения обратно подправлять не нужно. Недостатки: на мой взгляд главный, что ссылочная переменная должна быть проинициализирована при создании, значет объявить ее членом класса не удастся, да и проверка на нулевой адрес (как при работе с указателем) некорректна.

Автор: Fantasist 20.3.2003, 01:19
Цитата
значет объявить ее членом класса не удастся


Удастся, но нужно будет ее проинициализировать в списке инициализации конструктора.

Автор: brb 20.3.2003, 02:21
Мне непонятно другое. Перед тем как решать задачу, я бы хотел знать, какие цели преследуются. Решений-то несколько. Например, если мне надо эти передаваемые параметры модифицировать и возвращать, то ни о каких других вариантах, как только через указатель(ссылку), не может быть и речи. Если это просто набор параметров, то тогда определяющими параметрами станут их число, скорость выполнения и удобство(простота) кода. Нету общего решения для общего случая. Извините.

Автор: DENNN 20.3.2003, 02:49
Цитата
Нету общего решения для общего случая.


Так про любую задачу высказаться можно smile.gif

Автор: Paradox 20.3.2003, 03:21
Цитата
Так про любую задачу высказаться можно
поэтому и вопрос нужно корректно ставить а так просто получается занимательная дискуссия smile.gif

Автор: Step 20.3.2003, 04:27
Цитата
Step В твоем случае передаеться в стек вся структура, затем вызывается подпрограмма которая ее отттуда забирает. В вариантеBaa в стек помещается только указатель. При больших размерах структуры работа программы может замедлится.
Есть иакже третий вариант
ты не сомненно прав, но это пример использования, и вообще способов дохрена, вопрос что нужно

Автор: Molnienosetz 22.3.2003, 00:34
Цитата
так...CODE
void t (struct& a) {......
по-моему, всё-таки нельзя


Извините, что выпындрываюсь, но, кажется, правильно будет так:

struct struct_name {...}; <...>

ret_type my_func(struct_name &); <...>

int main(void) { <...>

struct_name MyStruct; <...>

ret_type that_variable = my_func(MyStruct); <...>

return 0;
}

ret_type my_func(struct_name &GetStruct)
{
<...>
}

smile.gif smile.gif

Автор: Molnienosetz 22.3.2003, 00:36
Товарищи, а чё это я ШУСТРЫМ стал??!?!?!!!!!!!!

Автор: Step 22.3.2003, 00:46
Цитата
Товарищи, а чё это я ШУСТРЫМ стал??!?!?!!!!!!!!
больше 50 сообщений на форуме

Автор: DENNN 23.3.2003, 18:40
Цитата
QUOTE
значет объявить ее членом класса не удастся

Удастся, но нужно будет ее проинициализировать в списке инициализации конструктора.


Вчера попробовал- убрал конструктор по умолчанию, сделал конструктор с передачей ему ссылки в качестве параметра. Компилятор ругается

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)