Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Эквивалент out keyword в C++, не удаётся обнаружить 
V
    Опции темы
marcusmae
Дата 27.2.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Всем привет smile

Сабж.

Самое очевидное направление поиска заключается в том, чтобы открыть MSDN на какой-нибудь функции типа TryGetValue(TKey key, out TValue value) и посмотреть, как записывается её C++ -ный прототип. Но что-то я устал и/или ничего не понял : некий OutAttribute, который кажется мало относящимся к out-у.

В общем, подскажите, пожалуйста, как на C++ записать прототип функции, эквивалентная запись которой на C# имеет модификатор out при одном из параметров.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Mymik
Дата 27.2.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



передавать параметр по ссылке... 


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
Idsa
Дата 27.2.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Mymik @  27.2.2007,  08:38 Найти цитируемый пост)
передавать параметр по ссылке... 

Это аналог ref.
Out же обязывает, чтобы переменной было присвоено значение внутри функции:
Цитата

The out keyword causes arguments to be passed by reference. This is similar to the ref keyword, except that ref requires that the variable be initialized before being passed.


Рефлектор же C# функцию
Код

static void func(out int i)
    {
      i = 0;
    }

преобразовал в C++ вот так:
Код

private: static void __gc* func([System::Runtime::InteropServices::Out] System::Int32 __gc* *i)
{
      i = 0;
}



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
marcusmae
Дата 27.2.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Idsa, спасибо, но что-то всё-равно несовсем ясно :

Во-первых, новый синтаксис обязывает ставить крышку вместо __gc* :

Код

bool TryGetValue(int code, [Out] int^ *value)
{
    ...
}


Во-вторых, при такой записи второй параметр имеет тип System.ValueType*, хотя по идее должен был бы быть виден, как out int.

Поясните, плз.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Idsa
Дата 27.2.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сам я на MC++ не пишу, так что ничего точного сказать не могу. То, что не согласуется синтаксис, - нормально: это ведь всего лишь рефлектор. Думаю, главное в этом примере - атрибут [Out]. Остальное уже можно приладить smile.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Любитель
Дата 4.3.2007, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



1. Рефлектор даёт код для MC++, а не C++/CLI (хотя поседний поддерживает ужасный старый синтаксис)
2. А варианты:
Код

bool TryGetValue(int code, [Out] int& value)
// ...
bool TryGetValue(int code, [Out] int value)

не прокатят? (сам не пробовал - сейчас негде).


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


stravaganza
**


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

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



Господа, Вы будете смеяться, но ответ следующий :

Код

bool TryGetNorm(int code, ref int norm)


эквивалентно

Код

bool TryGetNorm(int code, int %norm)


а

Код

bool TryGetNorm(int code, out int norm)


эквивалентно

Код

bool TryGetNorm(int code, [Out] int %norm)


Знак процента. И долго же я думал smile

Это сообщение отредактировал(а) marcusmae - 4.3.2007, 02:46


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

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


 




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


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

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