Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача структуры функции, Передача структуры функции 
:(
    Опции темы
AlexSm
  Дата 16.3.2003, 19:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











baaa.gif Люди хелп, я начинающий программист и вот мне приглючила такая фишка надо бы передать структуру функции как это сделатьconfused.gif
  Вверх
Baa
Дата 16.3.2003, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



AlexSm, передай указатель на неё.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Step
Дата 18.3.2003, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Baa а через тип структуры разве не получиться


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Step
Дата 18.3.2003, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Код
struct a{
int y,u;

};



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

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



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


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
DENNN
Дата 18.3.2003, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



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

struct a
{
int x,y
};

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

}

PM ICQ   Вверх
SETQ
Дата 18.3.2003, 06:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











whooooops!... а что это за фишка?
Код
void t (struct& a) {......

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

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

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

не воспринимать как руководство к действию пожалуйста :))
  Вверх
DENNN
Дата 18.3.2003, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Не помню как правильно называется, что-то вроде ссылочной переменной
PM ICQ   Вверх
Nastya
Дата 18.3.2003, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Цитата
whooooops!... а что это за фишка?
CODE 
void t (struct& a) {......

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



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


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
SETQ
Дата 19.3.2003, 00:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

если вы имеете в виду ссылочные переменные, то, опять же по-моему, выглядеть это должно иначе
Код
void t (struc a& A) {...............
или я чего-то не знаю, что тоже может быть.
  Вверх
-=Baa=-
Дата 19.3.2003, 17:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть еще много извращенных способов передачи smile.gif можно передать через инт smile.gif
в инт заносим адрес, а потом его юзаем как начало структуры. (тоже самое, что и по ссылке)
  Вверх
Paradox
Дата 19.3.2003, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



Цитата
так модно передавть

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


--------------------
---
PM MAIL WWW   Вверх
Alex101
Дата 19.3.2003, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



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

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


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
DENNN
Дата 19.3.2003, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



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

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

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


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
значет объявить ее членом класса не удастся


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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
brb
Дата 20.3.2003, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Мне непонятно другое. Перед тем как решать задачу, я бы хотел знать, какие цели преследуются. Решений-то несколько. Например, если мне надо эти передаваемые параметры модифицировать и возвращать, то ни о каких других вариантах, как только через указатель(ссылку), не может быть и речи. Если это просто набор параметров, то тогда определяющими параметрами станут их число, скорость выполнения и удобство(простота) кода. Нету общего решения для общего случая. Извините.
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.