Страница 1 из 1
Проблеммы с CString в качестве параметра функции...
Добавлено: 11 окт 2004, 21:54
GOS
Ещё один вопрос начинающего:
Есть функция, которая должна отстортировать числа в строке:
Код: Выделить всё
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 уже указатель)...
Подскажите как правильно сделать?
Добавлено: 12 окт 2004, 10:15
DeeJayC
Вместо
Код: Выделить всё
void ShortMyString(CString CStr,CString COut)
Код: Выделить всё
void ShortMyString(CString CStr,CString & COut)
Тебе писАть в COut.
Добавлено: 12 окт 2004, 11:08
Absurd
Но результат не возвращается... предать как указатель не получается(прочитал что CString уже указатель)...
Когда ты начинешь писать с COut, внутренний указатель в COut отсоединяется от оригинальной строки и подключается к новому буфферу, который не возвращается. Поэтому надо поменять сигнатуру метода
CString ShortMyString(CString CStrIn);
и возвращать отсортированную строку как результат работы функции.
Ссылки не используй - эти специальные костыли нужны чтобы возвращать величины,
хранимые в контейнерах, "по значению", если перегружен operator[](...) или operator*().
Для ссылки на объекты надо использовать указатели, но это безопасно только если выключены исключения.
Если же исключения включены (зачем?), надо использовать смарт-указатели.
Добавлено: 05 ноя 2004, 13:44
Marjan
Почему не испольвозвать ссылки? Это очень удобный способ чтобы функция возвращала более одного значение. Это очень хитрое и умное решение, которое очень удобно использовать! Хотя, действительно здесь они просто не нужны! Здесь просто надо возвращать CString.
Добавлено: 05 ноя 2004, 15:38
Absurd
Почему не испольвозвать ссылки?
Для ссылки на объекты надо использовать указатели.
Ссылки - это костыли для работы operator*() и operator[]().
Это очень удобный способ чтобы функция возвращала более одного значение
Функция должна возвращать одно значение. Можно - коллекцию.
Это очень хитрое и умное решение, которое очень удобно использовать!
В основном, программисты предпочитают языки, которые наиболее легко позволяют превратить проект в помойку.
А потом кому-то приходится cостыковывать pointer - based API, reference - based API, библитеки написанные мудаками
и бросающие исключения, библитеки написанные нормальными людьми и не бросающие исключения итд.
Добавлено: 06 ноя 2004, 16:22
Eugie
DeeJayC прав, COut надо передавать по ссылке.
Когда ты начинешь писать с COut, внутренний указатель в COut отсоединяется от оригинальной строки и подключается к новому буфферу, который не возвращается.
...
Ссылки не используй - эти специальные костыли нужны чтобы возвращать величины,
хранимые в контейнерах, "по значению", если перегружен operator[](...) или operator*().
Absurd, ты не прав. Передача параметра в функцию по ссылке - один из стандартных способов, если тебе нужно вернуть несколько значений. По сути, ссылка - тот же указатель, только операции взятия адреса и разыменования выполняются автоматически самим компилятором. Не веришь - посмотри под отладчиком.
В основном, программисты предпочитают языки, которые наиболее легко позволяют превратить проект в помойку.
Это вопрос грамотного управления проектом. Программист всегда предпочитает пользоваться теми средствами, которыми владеет лучше (или думает, что владеет
).
А потом кому-то приходится cостыковывать pointer - based API, reference - based API, библитеки написанные мудаками и бросающие исключения, библитеки написанные нормальными людьми и не бросающие исключения итд.
Любое более-менее сложное решение подразумевает состыковку. Это нормальная часть работы программиста, работающего в команде. Насчет мудаков и исключений - не вижу корреляции.
Добавлено: 08 ноя 2004, 13:45
Absurd
Переезжаем во флейм.