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

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
GOS
Сообщения: 111
Зарегистрирован: 17 фев 2004, 10:32
Контактная информация:

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 уже указатель)...

Подскажите как правильно сделать?
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

12 окт 2004, 10:15

Вместо

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

void ShortMyString(CString CStr,CString COut)

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

void ShortMyString(CString CStr,CString & COut)
Тебе писАть в COut.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

12 окт 2004, 11:08

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

CString ShortMyString(CString CStrIn);

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

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

Для ссылки на объекты надо использовать указатели, но это безопасно только если выключены исключения.
Если же исключения включены (зачем?), надо использовать смарт-указатели.
2B OR NOT(2B) = FF
Marjan
Сообщения: 27
Зарегистрирован: 25 авг 2004, 15:28
Откуда: Україна, Львів
Контактная информация:

05 ноя 2004, 13:44

Почему не испольвозвать ссылки? Это очень удобный способ чтобы функция возвращала более одного значение. Это очень хитрое и умное решение, которое очень удобно использовать! Хотя, действительно здесь они просто не нужны! Здесь просто надо возвращать CString.
Все, що не робиться - на краще!
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

05 ноя 2004, 15:38

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

А потом кому-то приходится cостыковывать pointer - based API, reference - based API, библитеки написанные мудаками
и бросающие исключения, библитеки написанные нормальными людьми и не бросающие исключения итд.
2B OR NOT(2B) = FF
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

06 ноя 2004, 16:22

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

08 ноя 2004, 13:45

Переезжаем во флейм.
2B OR NOT(2B) = FF
Ответить