Проблеммы с CString в качестве параметра функции...

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Проблеммы с CString в качестве параметра функции...

Absurd » 08 ноя 2004, 13:45

Переезжаем во флейм.

Eugie » 06 ноя 2004, 16:22

DeeJayC прав, COut надо передавать по ссылке.
Когда ты начинешь писать с COut, внутренний указатель в COut отсоединяется от оригинальной строки и подключается к новому буфферу, который не возвращается.
...
Ссылки не используй - эти специальные костыли нужны чтобы возвращать величины,
хранимые в контейнерах, "по значению", если перегружен operator[](...) или operator*().
Absurd, ты не прав. Передача параметра в функцию по ссылке - один из стандартных способов, если тебе нужно вернуть несколько значений. По сути, ссылка - тот же указатель, только операции взятия адреса и разыменования выполняются автоматически самим компилятором. Не веришь - посмотри под отладчиком.
В основном, программисты предпочитают языки, которые наиболее легко позволяют превратить проект в помойку.
Это вопрос грамотного управления проектом. Программист всегда предпочитает пользоваться теми средствами, которыми владеет лучше (или думает, что владеет :) ).
А потом кому-то приходится cостыковывать pointer - based API, reference - based API, библитеки написанные мудаками и бросающие исключения, библитеки написанные нормальными людьми и не бросающие исключения итд.
Любое более-менее сложное решение подразумевает состыковку. Это нормальная часть работы программиста, работающего в команде. Насчет мудаков и исключений - не вижу корреляции.

Absurd » 05 ноя 2004, 15:38

Почему не испольвозвать ссылки?
Для ссылки на объекты надо использовать указатели.
Ссылки - это костыли для работы operator*() и operator[]().
Это очень удобный способ чтобы функция возвращала более одного значение
Функция должна возвращать одно значение. Можно - коллекцию.
Это очень хитрое и умное решение, которое очень удобно использовать!
В основном, программисты предпочитают языки, которые наиболее легко позволяют превратить проект в помойку.

А потом кому-то приходится cостыковывать pointer - based API, reference - based API, библитеки написанные мудаками
и бросающие исключения, библитеки написанные нормальными людьми и не бросающие исключения итд.

Marjan » 05 ноя 2004, 13:44

Почему не испольвозвать ссылки? Это очень удобный способ чтобы функция возвращала более одного значение. Это очень хитрое и умное решение, которое очень удобно использовать! Хотя, действительно здесь они просто не нужны! Здесь просто надо возвращать CString.

Absurd » 12 окт 2004, 11:08

Но результат не возвращается... предать как указатель не получается(прочитал что CString уже указатель)...
Когда ты начинешь писать с COut, внутренний указатель в COut отсоединяется от оригинальной строки и подключается к новому буфферу, который не возвращается. Поэтому надо поменять сигнатуру метода

CString ShortMyString(CString CStrIn);

и возвращать отсортированную строку как результат работы функции.

Ссылки не используй - эти специальные костыли нужны чтобы возвращать величины,
хранимые в контейнерах, "по значению", если перегружен operator[](...) или operator*().

Для ссылки на объекты надо использовать указатели, но это безопасно только если выключены исключения.
Если же исключения включены (зачем?), надо использовать смарт-указатели.

DeeJayC » 12 окт 2004, 10:15

Вместо

Код: Выделить всё

void ShortMyString(CString CStr,CString COut)

Код: Выделить всё

void ShortMyString(CString CStr,CString & COut)
Тебе писАть в COut.

Проблеммы с CString в качестве параметра функции...

GOS » 11 окт 2004, 21:54

Ещё один вопрос начинающего:

Есть функция, которая должна отстортировать числа в строке:

Код: Выделить всё

void ShortMyString(CString CStr,CString COut)
{
//убираем сортировку в функцию
	int sl=CStr.GetLength();

	int* Array = new int[sl];

    CString CTmp;

	//Заполняем массив данными
    for (int IndA=0; IndA<sl; IndA++)
	{
		CTmp.Empty();
		CTmp.Insert(0, CStr.GetAt(IndA));
		Array[IndA]=atoi((LPCTSTR) CTmp);
	}

	//Сортируем массив
    for (int IndB=0; IndB<sl; IndB++)
	{
	for (IndA=0; IndA<sl-1; IndA++)
	{
		if (Array[IndA]<Array[IndA+1])
		{
			int buf=Array[IndA];
			Array[IndA]=Array[IndA+1];
			Array[IndA+1]=buf;
		}
	}
	}

    for (IndA=0; IndA<sl; IndA++)
	{
		char ch[1]="";
		itoa(Array[IndA],ch,10);
		COut.Insert(0, ch);

	}

	delete[] Array;
    //COut.AnsiToOem();

}
Вызываю функцию

Код: Выделить всё

CString CStr,COut;
ShortMyString(CStr, COut);  

pWnd2->SetWindowText(COut);

Но результат не возвращается... предать как указатель не получается(прочитал что CString уже указатель)...

Подскажите как правильно сделать?

Вернуться к началу