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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вернуть LPCTSTR функции 
:(
    Опции темы
Ninazu
Дата 12.2.2013, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для работы функции необходимо 20 символов, которые я резервирую и освобождаю в конце, чтобы не было утечки. Как понимаю функция должна вернуть некий промежуточный буфер, который автоматически освободится по её завершению, но как это все работает еще не понял.
Код

LPCTSTR MyFunc(){
TCHAR* TEMP= new TCHAR[20]; 
.....
delete[] TEMP;
return ????
}

Знаю что сейчас полетят тумаки. Но раздел ведь для новичков. 
Поиском пользовался. (Или помогите сформировать правильный запрос)
PM MAIL   Вверх
korian
Дата 12.2.2013, 02:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если это C++ То вариант, например, такой (есть и другие)
Код

std::string MyFunc(){
std::string TEMP;
.....
TEMP = "hello!"
.....
return TEMP;
}



Это сообщение отредактировал(а) korian - 12.2.2013, 02:46
PM   Вверх
Ninazu
Дата 12.2.2013, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Больше интересны другие варианты. Ближе к чистому Си. У меня цель изначально стоит понять как всё может работать, поэтому сразу отказался от шаблонов уже готовых. Ведь используя их  перестаешь задумываться о механизмах которые ими движут. До этого баловался с Basic'ом, но там всё просто, и голову себе не забиваешь, о чём сейчас жалею. Приходиться переучивать себя в каких-то моментах.
Хотя с другой стороны, понять сами алгоритмы это одно, но нужно следовать стандарту и не изобретать велосипед
PM MAIL   Вверх
feodorv
Дата 12.2.2013, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ninazu @  12.2.2013,  04:03 Найти цитируемый пост)
Ближе к чистому Си

Тогда почему не
Код

LPCTSTR MyFunc(){
TCHAR TEMP[20]; 
.....
return ????
}



Цитата(Ninazu @  12.2.2013,  02:59 Найти цитируемый пост)
Как понимаю функция должна вернуть некий промежуточный буфер

Что именно Вы хотите вернуть? Тот самый временный буфер или что-то иное?


Цитата(Ninazu @  12.2.2013,  04:03 Найти цитируемый пост)
У меня цель изначально стоит понять как всё может работать

Что Вы подразумеваете под этим "всё"?

Это сообщение отредактировал(а) feodorv - 12.2.2013, 04:01


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
xvr
Дата 12.2.2013, 11:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Ninazu @  12.2.2013,  01:59 Найти цитируемый пост)
функция должна вернуть некий промежуточный буфер, который автоматически освободится по её завершению, но как это все работает 

Никак не работает. В С (да и в С++) нет автоматического сборщика мусора, так что все, что вы запрашивали с кучи, должно быть явно возвращено туда же. Использовать уже освобожденные участки памяти категорически нельзя - эта память уже принадлежит менеджеру кучи, а не вам. И то, что там случайно осталось прежнее содержимое - это большое везение (или наоборот, невезенье - как посмотреть  smile )

Единственное (ну почти единственное) средство (в чистом С) - это статически расположенные буфера. Указатели на них можно возвращать, но тут будет проблема с несколькими вызовами таких функций, данные от предыдущего вызова будут потерянны.


PM MAIL   Вверх
Ninazu
Дата 12.2.2013, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(xvr @ 12.2.2013,  11:12)
Единственное (ну почти единственное) средство (в чистом С) - это статически расположенные буфера. Указатели на них можно возвращать, но тут будет проблема с несколькими вызовами таких функций, данные от предыдущего вызова будут потерянны.

Вот мне это (ну почти единственное)  покоя и не дает. А буфере тоже думал, выделить в начале программы, и освободить в конце. Но тут два момента  скользких
1. Размер буфера, могут возникнуть ситуации когда его прийдется расширить.
2. Как вы и описали множественные обращения к нему. По большому счёту в тех же потоках. Можно конечно мьютексами прикрыться или создавать буфер для каждого потока.
Но как-то это всё не феншуйно.

PM MAIL   Вверх
xvr
Дата 12.2.2013, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Ninazu @  12.2.2013,  14:08 Найти цитируемый пост)
Можно конечно мьютексами прикрыться 

Это не поможет

Цитата(Ninazu @  12.2.2013,  14:08 Найти цитируемый пост)
создавать буфер для каждого потока.

А вот это поможет. Собственно CRT, а точнее те функции из нее, которые пользуются статическими данными внутри себя (strtok например), так и делают

См. TLS

PM MAIL   Вверх
korian
Дата 12.2.2013, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Ninazu @  12.2.2013,  13:08 Найти цитируемый пост)
1. Размер буфера, могут возникнуть ситуации когда его прийдется расширить.

обычно размер буфера зарание известен. Или известен максимально возможный размер.

В C обычно пишут так:
Код

int main() {
   TCHAR* tmp = new TCHAR[20];
   MyFunc(tmp);
   delete [] tmp;
}

void MyFunc(TCHAR* tmp){
.....
заполняем tmp
.....
}

PM   Вверх
Zmaster555
Дата 12.2.2013, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

вернуть некий промежуточный буфер, который автоматически освободится по её завершению


Немного не понятно, как (и зачем) функция вернет то, что она уже освободила? Скорее всего ты неправильно сформулировал вопрос. Мне кажется korian написал то, что тебе нужно. Т.е. память для буфера должна выделяться вне функции, и в функцию передаваться только адрес буфера, и освобождаться он должен опять же вне функции. А функция нужно только для того чтобы работать с уже переданным в нее буфером (точнее указателем на него).
PM MAIL   Вверх
bsa
Дата 14.2.2013, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Ninazu @  12.2.2013,  04:03 Найти цитируемый пост)
У меня цель изначально стоит понять как всё может работать, поэтому сразу отказался от шаблонов уже готовых. Ведь используя их  перестаешь задумываться о механизмах которые ими движут.
Совсем нет. Тебя ничто не отвлекает о решения поставленной задачи, а о реализации того или иного шаблона можно легко догадаться по выполняемым действиям.
Цитата(Ninazu @  12.2.2013,  04:03 Найти цитируемый пост)
До этого баловался с Basic'ом, но там всё просто, и голову себе не забиваешь, о чём сейчас жалею. Приходиться переучивать себя в каких-то моментах.
Это нормально. Бейсик и подобные простейшие языки нужны для того, чтобы ты смог понять, как сообщать компьютеру наборе и порядке выполнения операций. Если начинать программировать с профессионального языка (С или С++), то мозги раком встанут, и может пропасть всякое желание изучать программирование.
Цитата(Ninazu @  12.2.2013,  04:03 Найти цитируемый пост)
Хотя с другой стороны, понять сами алгоритмы это одно, но нужно следовать стандарту и не изобретать велосипед 
И это правильно. Разработчики С/С++ и стандартной библиотеки тоже не ангелы и сильно накосячили в свое время (тот же strtok, rand/srand, sstream, auto_ptr и пр.). Но им можно найти оправдание - они тогда не представляли о многопоточности, RAII и пр. Сейчас все эти технологии давно отработаны и по ним куча статей написана.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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