PDA

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



GOS
11.10.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
12.10.2004, 10:15
Вместо



void ShortMyString(CString CStr,CString COut)




void ShortMyString(CString CStr,CString & COut)

Тебе писАть в COut.

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

CString ShortMyString(CString CStrIn);

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

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

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

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

Absurd
05.11.2004, 15:38
Почему не испольвозвать ссылки?
Для ссылки на объекты надо использовать указатели.
Ссылки - это костыли для работы operator*() и operator[]().

Это очень удобный способ чтобы функция возвращала более одного значение
Функция должна возвращать одно значение. Можно - коллекцию.

Это очень хитрое и умное решение, которое очень удобно использовать!
В основном, программисты предпочитают языки, которые наиболее легко позволяют превратить проект в помойку.

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

Eugie
06.11.2004, 16:22
DeeJayC прав, COut надо передавать по ссылке.


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


Absurd, ты не прав. Передача параметра в функцию по ссылке - один из стандартных способов, если тебе нужно вернуть несколько значений. По сути, ссылка - тот же указатель, только операции взятия адреса и разыменования выполняются автоматически самим компилятором. Не веришь - посмотри под отладчиком.


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

Это вопрос грамотного управления проектом. Программист всегда предпочитает пользоваться теми средствами, которыми владеет лучше (или думает, что владеет :)).


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

Любое более-менее сложное решение подразумевает состыковку. Это нормальная часть работы программиста, работающего в команде. Насчет мудаков и исключений - не вижу корреляции.

Absurd
08.11.2004, 13:45
Переезжаем во флейм.