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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> тип функции структура, тип функции структура 
:(
    Опции темы
Poison80
Дата 14.9.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



День добрый! У меня возник такой вопрос, тип функции может быть структура
например
Код


typedef struct a {
   double alfa;
   double rtr;
   double fi;
   } alfa_rtr_fi;

extern "C" __declspec(dllexport) alfa_rtr_fi __export WINAPI hello(double a)
{
.............
   
}



smile собсвенно вопрос , каким образом то получить доступ из функции к полям стркутуры и чего написать в return
всем зарание спасибо
PM MAIL   Вверх
srd
Дата 14.9.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Код

typedef struct a {
    double alfa;
    double rtr;
    double fi;
} alfa_rtr_fi;

extern "C" __declspec(dllexport) alfa_rtr_fi __export WINAPI hello(double a)
{
    alfa_rtr_fi s = {0};
    s.alfa = a;
    return s;      
}


P.S.
Делать структуры возвращаемым значением функции - это не очень хорошая практика.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Poison80
Дата 14.9.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!
PM MAIL   Вверх
Дрон
Дата 14.9.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(srd @ 14.9.2005, 16:06)
елать структуры возвращаемым значением функции - это не очень хорошая практика.

Ну... А как же тогда?

Нет, я конечно понимаю, что можно передать указатель, и заполнить его, как на каждом шагу делается в WinAPI.
Но если у нас С++, то возвращать объекты -- самое правильное поведение.

Это сообщение отредактировал(а) Дрон - 14.9.2005, 15:12


--------------------
Да. Именно так.
PM   Вверх
Poison80
Дата 14.9.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А каким способом посоветуете способом вернуть из вунцкии нескоклько переменных?!
(желательно с примером) спасибо!
PM MAIL   Вверх
Дрон
Дата 14.9.2005, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(Poison80 @ 14.9.2005, 16:08)
А каким способом посоветуете способом вернуть из вунцкии нескоклько переменных?!

Вот так обычно делается:
Код

typedef struct a {
    double alfa;
    double rtr;
    double fi;
} alfa_rtr_fi;

extern "C" __declspec(dllexport) void hello(double a, alfa_rtr_fi *pS)
{
    pS->alpha = a;
}

А вызывать так:
Код

alfa_rtr_fi ZZZ;
hello(123.456, &ZZZ);



--------------------
Да. Именно так.
PM   Вверх
srd
Дата 14.9.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Цитата
Нет, я конечно понимаю, что можно передать указатель, и заполнить его, как на каждом шагу делается в WinAPI.
Но если у нас С++, то возвращать объекты -- самое правильное поведение.

Не вижу причины тратиться на копирование объекта, если можно обойтись без него. А это и происходит в том случае, если функция возвращает объект структуры/класса. Уж лучше передавать функции ссылку (что хорошо) или указатель (что менее хорошо). А возвращать объекты лучше или тривиальных типов, или для которых реализован подсчёт ссылок.

Это сообщение отредактировал(а) srd - 14.9.2005, 15:18


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Дрон
Дата 14.9.2005, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Ну да, я и сам понимаю. Просто в большинстве случаев эти траты незначительны, по сравнению с остальными операциями.

Хотя ведь именно из-за этих трат при передаче объекта by value я предпочитаю не пользоваться структурами в C# smile

ЗЫ: Как-то я невовремя своё сообщение отредактировал. Сорри.


--------------------
Да. Именно так.
PM   Вверх
Artemon
Дата 17.9.2005, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



Цитата

Уж лучше передавать функции ссылку (что хорошо) или указатель (что менее хорошо).


SRD, Чем это вам указатель не угодил?


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Гость_AISIN
Дата 17.9.2005, 16:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Artemon Я обычно пользуюсь указателем. Указатель - это круто, но ссылка немного проще для понимания, зато ссылка должна обязательно ссылаться на какой нибудь тип переменной.
  Вверх
En_t_end
Дата 18.9.2005, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Artemon Я обычно пользуюсь указателем. Указатель - это круто, но ссылка немного проще для понимания, зато ссылка должна обязательно ссылаться на какой нибудь тип переменной.

Указатель это круто, но вот если допусим передается указатель на переменную типа структуры либо обьект какого-то класса, то здесь безусловано удобнее пользоваться ссылкой.
допустим BOOL somefunc(SomeClass &obj);
А вот в таком случае указатель - это ваапще незаменимый друг:
BOOL somefunc(void *some_mem_memb);
Добавлено @ 07:25
Хотя мне кажется гораздо нагляднее делать так : void somefunc(SomeClass *obj);
Ибо потом в коде будет наглядно показанно, что в функцию передается адресс somefunc(&someobj); А с somefunc(someobj); - в случае с параметром ссылкой некоторые ненатасканные личности могут подумать, что обьект someobj не может быть изменен, в таких случаях конечно надо всегда анализировать семантику функции перед её использованием.
PM MAIL ICQ Skype GTalk Jabber   Вверх
srd
Дата 18.9.2005, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Цитата(Artemon @ 17.9.2005, 21:31)

SRD, Чем это вам указатель не угодил?

Просто предосторожность. Если объект отдаёт наружу указатель, то возникает соблазн применить к этому указателю delete smile

Цитата(En_t_end @ 18.9.2005, 15:20)
Хотя мне кажется гораздо нагляднее делать так : void somefunc(SomeClass *obj);
Ибо потом в коде будет наглядно показанно, что в функцию передается адресс somefunc(&someobj); А с somefunc(someobj); - в случае с параметром ссылкой некоторые ненатасканные личности могут подумать, что обьект someobj не может быть изменен, в таких случаях конечно надо всегда анализировать семантику функции перед её использованием.

Распространённый аргумент. ИМХО чепуха. Потому что somefunc(&someobj) тоже совершенно ни о чём не говорит, т.к. функция может быть как somefunc( SomeClass* ), так и somefunc( const SomeClass*). Давай внятные имена функциям и парметрам, тогда не будут возникать вопросы, кто чего зачем изменяет, не зависимо от того, является ли аргумент ссылкой или указателем.



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
En_t_end
Дата 18.9.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



srd
Цитата(srd @ 18.9.2005, 13:05)
Распространённый аргумент. ИМХО чепуха.

Я имел ввиду простака, ибо конечно там может быть не просто SomeClass *someobj, но и const SomeClass *someobj и даже const *SomeClass someobj - всегда надо смотреть на семантику(!!!), что я и делаю.

PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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