powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
21 сообщений из 21, страница 1 из 1
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009353
ЛИКБЕЗ_4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо написать функцию f () ,
которая получает число типа int
И возвращает его строковое значение. Апробировано много
Вариантов, результат неутешительный. Помогите.

// обращение к функции имеет вид:

Код: plaintext
1.
2.
3.
4.
int  count  =  1260214 ;
CString m_sWork3;
m_sWork3 = *f (count); // вариант_1 - неправильный
m_sWork3 = f(count); 	// вариант_2 - неправильный
MessageBox(m_sWork3);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//  мой текст функции ( НЕПРАВИЛЬНЫЙ )
char *f (int i) 
{
char t[ 10 ]; 
itoa(i,t, 10 );  // здесь правильно
Как вернуть строку ( адрес её начала ) ?
//-	return (*s3); 
//-	return (s3[0]); 
	return (&s3[ 0 ]); 
//	return &s3;
}

СПАСИБО
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009357
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CString a;
long i=1000;
a.Format("%d",i);
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009372
KBR,TP_4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
gardenman  - 

ЭТО Я ЗНАЮ, НО ДЕЛО УПРЩЕНО

И НУЖНА ТОЛЬКО ФУНКЦИЯ,
ВОЗВРАЩАЮЩАЯ СТРОКУ.

СПАСИБО
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009446
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
const char* f(long Value){
  static char s[ 12 ];
  sprintf(s,"%11.10d",Value);
  return s;
}
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009521
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, Вам нужна itoa(). Если Вы пишите под Виндами, то у Майкрософтовского компилятора эта функция есть. Проблема в том, что она не определена в ANSI C стандарте. Посоветую Вам набрать itoa в google, там будет тонна ссылок на то как написать свою itoa.
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009673
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenBy
Код: plaintext
1.
2.
3.
4.
const char* f(long Value){
  static char s[ 12 ];
  sprintf(s,"%11.10d",Value);
  return s;
}


Такой фокус не пролезет!

void main()
{
__int64 i=123456789012345678;
char s[40];
printf("Result : %11.10d\n", i);
printf("Result : %I64d\n", i);
}

Result : -1506741426
Result : 123456789012345678
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009677
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikhail_nНасколько я понимаю, Вам нужна itoa(). Если Вы пишите под Виндами, то у Майкрософтовского компилятора эта функция есть. Проблема в том, что она не определена в ANSI C стандарте. Посоветую Вам набрать itoa в google, там будет тонна ссылок на то как написать свою itoa.

Зачем ее писать? есть sprintf, кстати, возвращает строку.
См. пример выше. И писать-то собс-но ничего не требуется...
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33009746
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Насколько я понял человеку не ясно как создаются объекты. static возвращать не обязательно. Чревато для многопоточных приложений. Все просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
std::string my_itoa( int i )
// обрати внимание - это не указатель, не ссылка - это экземпляр класса
{
  std::string localStr;
  // делаем свое черные дела, занося резалт в localStr
  return localStr;
  // здесь произойдет вызов копирующего конструктора
  // то есть создасться временный объект, копия localStr
  // этот временный объект и уйдет наружу
}



Это одна из проблем, с который ты сталкиваешься в С++, возвращать ссылки на локальные объекты нельзя. И ты вынужден создавать времнный объект. Когда речь заходит о больших объектах цена создания и разрушения которых непомерно высока (по времени и памяти), тогда ты начинаешь думать как сделать по другому.

1) перейти на указатели. То есть
Код: plaintext
1.
2.
3.
4.
5.
6.
std::string* my_itoa( int i )
{
  std::string* localStr( new std::string );
  // ...
  return localStr;
}



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

2) использование auto_ptr или других оберток типа boost::shared_ptr, boost::ref. С первым надо быть осторожным, вторые более удобны и потоковобезопасны.

3)есть еще шаблоны выражений (template expresion), MPL самая быстрая библиотека матричных функций построенна именно на этом, можете еще посмотреть boost::ublast или std::valarray. Но последний не доведен до ума.

4) есть еще много приемов позволяющих отложить вызов конструктора/деструктора. Но наиболее удобный - это прием придуманный А.Алексанрдеску - moved contructor. Ему удалось даже реализовать классы реализующие эту технологию. Ну а в будущий стандарт это будет добавлено на уровне средств языка.
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33010100
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нужно вернуть строку для "использовать прям тут" то статическая строка внутри функции - то что нужно. Некоторые библиотечные функции так и делают.
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33010299
Tracer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли нужно вернуть строку для "использовать прям тут" то статическая строка внутри функции - то что нужно. Некоторые библиотечные функции так и делают.

Хоть они так и делают, но они все же потоко-безопастны. Условно говоря, для каждого потока свой буффер.

to dwl
имхо, чаще всего используется другой вариант

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void f( int i, char* buffer, size_t size )
{

   //****
}

//****
char buffer[12];
f( 10, buffer, sizeof( buffer ) - 1 );
//****




автор4) есть еще много приемов позволяющих отложить вызов конструктора/деструктора. Но наиболее удобный - это прием придуманный А.Алексанрдеску - moved contructor. Ему удалось даже реализовать классы реализующие эту технологию. Ну а в будущий стандарт это будет добавлено на уровне средств языка.

Про это где-нибудь можно посмотреть ?
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33010546
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Tracerимхо, чаще всего используется другой вариант
см. мой предыдущий пост - пункт 1 и пункт 2.
на самом деле это только откладывает проблему, а не решает ее. Ты смотришь на нее в рамках одной функции, попробуй посмотреть в рамках полноценного выражения.

str2 + itoa(12) + format2( str3 + str4 ) и т.д.

если смотреть на предмет временных объектов (ну или локальных выделений памяти), то будет очень много не нужных выделний (созданий объектов) памяти и последующих освобождений ея. Кстати, этим часто пользуются прграммеры которые пишут на языке с GC (например, ява или Шарп). Я имею ввиду используют для продвижения своего языка, ну или для флейма. Приводится код, где присутсвует цикл большой. внутри цикла ничего, кроме выделить память и освободить ее, нету. Далее сравнивается время работы. Разница в разы иногда и напорядок. Типа С++ какесс. 8-)))

а про moved conctructor написано давно. Его уже даже портировали на парочку компилеров в довесок к MSVC

http://www.cuj.com/documents/s=8246/cujcexp2102alexandr/alexandr.htm
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #33013271
ЛИКБЕЗ_4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО ВСЕМ
ЗА ПОМОЩЬ

В ЧАСТНОСТИ
участнику форума Tracer

Я ВАШ КОД ИСПОЛЬЗОВАЛ,

ВСЁ ОК!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38464271
OblommOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересная получается ситуация. С одной стороны "некропост", с другой - решение есть довольно свежее. Как то я в 2005-м за этим вопросом не следил, но начиная с MSVS 2010 tuple в нем появились. А в стандарты вошло это с "C++11 standard (ISO/IEC 14882:2011): 20.4 Tuples [tuple]".
Для решения этого вопроса нужно использовать <string>, так как обертка "tuple" "char *" и "char[]" в себя не заворачивает. В общем вот такой пример для MSVS >= 2010:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>
#include <tuple>
#include <string>

using namespace std;

tuple<string> getStr(char * szTxt)
{	
	char szWrk[250] = "";
	for (unsigned int n=0; n<strlen(szTxt); n++)
		szWrk[n] = szTxt[n];
	return make_tuple(szWrk);
}

int main(int argc, char * argv[])
{
	char szTst[250] = "This is my TEST!";
	auto strTst = getStr(szTst);
	cout << endl << get<0>(strTst) << endl << endl;

	system("PAUSE");
	return 0;
}


Собственно "string" применил только там где он необходим, что бы было наглядно.
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38464306
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это бот что-ли какой-то, который подымает топики и постит всякую нерелевантную херню? :)
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38464315
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На новичка больше похож. Не смотрит на даты сообщений.
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38464325
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа новичка больше похож. Не смотрит на даты сообщений.
да не, он осознает что это "некропост" - о чем прямо пишет.
Но его "свежее решение" - вообще никакого отношения к топику не имеет
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38464985
OblommOff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему отношения не имеет, если здесь разговор поднимали про move conctructor. Как раз tuple позволяет в примере объявить его локально в main, а конструктор вызывается в функции.
Скоро C++ сравняют с BASIC-ом вообще :)
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38465000
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblommOffПочему отношения не имеет, если здесь разговор поднимали про move conctructor. Как раз tuple позволяет в примере объявить его локально в main, а конструктор вызывается в функции.
Скоро C++ сравняют с BASIC-ом вообще :)
Ты считаешь что решению вернуть из функции tuple<string> можно считать хорошим решением
для вопроса автора?
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38465042
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblommOffПочему отношения не имеет, если здесь разговор поднимали про move conctructor. Как раз tuple позволяет в примере объявить его локально в main, а конструктор вызывается в функции.
Скоро C++ сравняют с BASIC-ом вообще :)

И чем же std::tuple<std::string> в данном случае лучше, чем просто std::string? Вот смотри, вот этот код на C++11 уже использует move семантику за счет RVO:

Код: plaintext
1.
2.
3.
4.
std::string foo() {
   std::string tmp;
   return tmp; // RVO
}



А явное использование std::move в этом примере "обрезало бы оптимизатору крылья".
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38465085
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblommOffПочему отношения не имеет
Специально для вас цитирую задачу:
авторНеобходимо написать функцию f () ,
которая получает число типа int
И возвращает его строковое значение.
Вы хотите сказать что ваша функция которая получает строку и возвращает непоймичто имеет отношение к этой задаче? (Да хоть к какой-нибудь задаче? :))
...
Рейтинг: 0 / 0
C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
    #38465121
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblommOffПочему отношения не имеет, если здесь разговор поднимали про move conctructor. Как раз tuple позволяет в примере объявить его локально в main, а конструктор вызывается в функции.
Скоро C++ сравняют с BASIC-ом вообще :)

В твоём случае (твой код) вся "магия" заключается только в том, чтобы вернуть строку (std::string) по значению.
Это можно было бы сделать и без оборачивания строки в tuple.

Собственно, весь вопрос топикстатрера и сводится к управлению памятью, если ты хочешь что-то вернуть, то это надо возвращать по значению. Либо "это" возвращать нельзя, а надо записывать в предоставляемый вызывающим кодом буфер.
Вот чего не мог постичь топикстартер.
А для опытного (ну или хотя бы думающего) программиста на С++ эта проблема выеденного яйца не стоит.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ , ФУНКЦИЯ , ВОЗВРАЩАЮЩАЯ СТРОКУ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]