Форум: "Прочее";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
Внизтребуется программист Delphi Найти похожие ветки
← →
Romkin © (2008-06-11 16:52) [80]Да какая разница? Когда в одном исходнике встречается три-четыре разных типа строки - тут поллитрой не обойдешься :)
← →
Пробегал2.... (2008-06-11 16:52) [81]@!!ex © (11.06.08 16:35) [76]
Чем std::string плох?
В нем вроде все тоже самое что и в дельфевом стринге...
А делают свои... наверно гемороя хочется
а этот std:string тоже является типом с автоматической сборкой мусора?
← →
@!!ex © (2008-06-11 16:54) [82]> Ну и "test" + " " + "text" не напишешь.
ммм???
std::string Test = "";
Test = Test + "Text" + " " + "Test";
← →
@!!ex © (2008-06-11 16:56) [83]> [81] Пробегал2.... (11.06.08 16:52)
В С++ мусор собирается за любым не динамически созданным объектом, насколько мне известно.
Так что да, за std::string не надо убирать.
← →
@!!ex © (2008-06-11 17:00) [84]Вот такое вот сейчас запустил:
for (int i = 0; i<10000000; i++)
{
std::string Test = "gdsfgsdbh fgjbghmnfgjbfybnkfh jmnhgfnmkhmbhvj";
};
В течении нескольких секунд программа сожрала один процессор, но при этом потребления памяти небыло.
Так что да, за стрингом убирать не надо.
← →
@!!ex © (2008-06-11 17:00) [85]Кстати, это дебаг, поэтому о том, что компилятор строку удалил - речи не идет.
← →
Anatoly Podgoretsky © (2008-06-11 17:01) [86]> Romkin (11.06.2008 16:52:20) [80]
Тут три нужно и все равно придется еще бежать.
← →
@!!ex © (2008-06-11 17:03) [87]> [80] Romkin © (11.06.08 16:52)
А кто так пишет???
← →
Anatoly Podgoretsky © (2008-06-11 17:04) [88]> @!!ex (11.06.2008 17:00:24) [84]
Добавь еще один, для строк.
← →
Romkin © (2008-06-11 17:09) [89]
> А кто так пишет???
А я знаю?void FGetInfo()
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_CONNECT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
IWbemLocator * pLocator = NULL;
if (FAILED(CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_ALL, IID_IWbemLocator, (LPVOID*) &pLocator)))
{
AfxMessageBox("Ошибка инициализации COM объекта");
::CoUninitialize();
return;
}
IWbemServices * pService = NULL;
CString str, strR;
_bstr_t ConnName = L"\\\\MyComp\\root\\cimv2"; //Имя ком-ра к которому подключемся
HRESULT hr = pLocator->ConnectServer( ConnName,NULL,NULL,NULL,NULL,NULL,NULL,&pService);
if (hr!=S_OK)
{
::CoUninitialize();
return;
}
IEnumWbemClassObject * pEnum = NULL;
_bstr_t selectString = L"SELECT * FROM Win32_Process";
if (FAILED(pService->ExecQuery( _bstr_t(L"WQL"), selectString,WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, 0, &pEnum )))
{
pLocator->Release();
::CoUninitialize();
return;
}
ULONG uReturn = 0;
while (pEnum)
{
IWbemClassObject * pObject = NULL;
if(FAILED(pEnum->Next(WBEM_INFINITE, 1, &pObject, &uReturn)))
{
pLocator->Release();
pService->Release();
pEnum->Release();
::CoUninitialize();
return;
}
if(0 == uReturn)
{
///************* Процессов больше нет
pLocator->Release();
pService->Release();
pEnum->Release();
pObject->Release();
break;
}
VARIANT vtProp;
VariantInit(&vtProp);
if(FAILED(pObject->Get(L"Name", NULL, &vtProp, NULL, NULL)))
{
//********Обработчик ошибки получения имени процесса
break;
}
else
{
vtProp.bstrVal //// Имя процесса
VariantClear(&vtProp);
/* А вот как прибить процесс, н для этого надо получить вместо "Name" "ProcessId"
BSTR ClassName = L"Win32_Process";
_bstr_t ClassNameInstance = SysAllocString(L"Win32_Process.Handle=\"");
char PidP[15];
itoa(vtProp.uintVal,PidP,10);
ClassNameInstance+=PidP;
ClassNameInstance+="\"";
_bstr_t MethodName = (L"Terminate");
BSTR ParameterName = SysAllocString(L"Reason");
...
Сидишь, думаешь...
← →
jack128_ (2008-06-11 17:10) [90]
> В течении нескольких секунд программа сожрала один процессор,
> но при этом потребления памяти небыло.
ну таки потребление памяти - было в два раза больше, чем в аналогичной дельфийской процедуре.
в с++ - эта строка - храниться в двух копиях(одна копия в образе EXE, вторая - в объекте std:string)
← →
Mystic © (2008-06-11 17:11) [91]
> std::string Test = "";
> Test = Test + "Text" + " " + "Test";
Я писал по другому:
int main()
{
std::string test = "test" + " " + "text";
return 0;
}
В результате:
error C2110: "+" : cannot add two pointers
← →
@!!ex © (2008-06-11 17:12) [92]> [90] jack128_ (11.06.08 17:10)
Про это ничего сказать не могу, т.к. н знаю.
Да и вопрос не об этом был, а о сборке мусора.
← →
@!!ex © (2008-06-11 17:14) [93]> [91] Mystic © (11.06.08 17:11)
Вас наверно удивляет, чтоfloat GetDivision(int a, int b)
{
return a/b;
};
GetDivision(10/2)==2
?
Типы надо жестко указывать.
Пишите вот так:int main()
{
std::string test = (std::string)"test" + " " + "text";
return 0;
}
И будет все как надо.
← →
@!!ex © (2008-06-11 17:15) [94]//GetDivision(10/2)==2
Не на 2, а на 4 конечно же.
← →
@!!ex © (2008-06-11 17:15) [95]GetDivision(10,4)==2
← →
jack128_ (2008-06-11 17:17) [96]
> Я писал по другому:
>
> int main()
> {
> std::string test = "test" + " " + "text";
> return 0;
> }
>
> В результате:
> error C2110: "+" : cannot add two pointers
ну это понятно почему, строковые литералы имеют тип char *, afair. нуно писать что то типа
std::string test = std::string("test") + std::string(" ") + std::string("text"); // с синтаксисом могу напутать
← →
Mystic © (2008-06-11 17:31) [97]> @!!ex © (11.06.08 17:14) [93]
Меня это не удивляет, но выглядит все-же коряво. Вынуждает в каждом конкретном случае смотреть на типы переменных, которые участвуют в выражении.
А проблема в том и заключается, что в C++ строковые константы используют тип char*, а пользоваться надо совсем другим типом. Поэтому и возникают не нужные мне приведения типов:
const char* fmt = "%d";
TestCall(static_cast<std::string>(fmt) + " %d");
И куча мелких неприятностей в процессе, когда надо помнить где std::string, где const char*.
← →
@!!ex © (2008-06-11 17:35) [98]> И куча мелких неприятностей в процессе, когда надо помнить
> где std::string, где const char*.
зачем что-то помнить?
Например, у нас в проекте запрещено использовать char*. Везде идет std::string.
Зачем вообще где то использовать char*????
"WinAPI"- скажите вы... и будете не правы.
Вот коды вызова некой функции Message с параметром PChar на дельфе и на С++:
S:String;
Message(PChar(S));
std::string S;
Message(&S[0]);
← →
@!!ex © (2008-06-11 17:35) [99]> std::string test = std::string("test") + std::string(" ")
> + std::string("text"); // с синтаксисом могу напутать
Достаточно перед первым написать.
← →
DRG (2008-06-11 17:55) [100]2 @!!ex
ты бы в личку перешел или ветку отдельную завел, а то читать это все... не к месту короче.
← →
Mystic © (2008-06-11 17:58) [101]
std::string S;
Message(&S[0]);
Не слушаешься Стандарта :) Надо использоватьS.c_str()
, ибо никто не может дать гарантии, что строка идет подряд, что нет ленивых вычислений и т. п. ;)
А вообще лично мне не удавалось полностью избавится от char*.
← →
Пробегал2.... (2008-06-11 18:05) [102]@!!ex © (11.06.08 17:35) [98]
std::string S;
Message(&S[0]);
то есть, этот std::string тоже неявно поддерживает нулевой символ в конце?
← →
@!!ex © (2008-06-11 18:39) [103]> Не слушаешься Стандарта :) Надо использовать S.c_str(),
> ибо никто не может дать гарантии, что строка идет подряд,
> что нет ленивых вычислений и т. п. ;)
Мда. мой косяк согласен. исправлюсь. Опыта еще мало и знаний. :) Спасибо.
> [102] Пробегал2.... (11.06.08 18:05)
Почему неявно? Очень даже явно... Иначе понту от него в С++ - 0...
← →
@!!ex © (2008-06-11 18:41) [104]> А вообще лично мне не удавалось полностью избавится от char*.
Почему?
У нас правда это проще, текста минимум.
← →
Пробегал2.... (2008-06-11 18:59) [105]@!!ex © (11.06.08 18:39) [103]
Почему неявно? Очень даже явно...
очень интересно послушать твою точку зрения насчет значения слова "неявно".
← →
Игорь Шевченко © (2008-06-11 19:22) [106]шире надо смотреть на мир. В нем кроме Delphi и C++ есть еще масса интересных языков, каждый со своими тараканами.
← →
@!!ex © (2008-06-11 19:57) [107]> очень интересно послушать твою точку зрения насчет значения
> слова "неявно".
Неявно - значит не определено в стандарте, но при этом присутствует.
Явно - значит описано в стандарте.
> [106] Игорь Шевченко © (11.06.08 19:22)
Но они не так часто используются.
← →
jack128_ (2008-06-11 20:00) [108]
> @!!ex © (11.06.08 18:39) [103]
> Явно - значит описано в стандарте.
>
> Почему неявно? Очень даже явно.
> Mystic © (11.06.08 17:58) [101]
> Надо использовать S.c_str(), ибо никто не может дать гарантии,
> что строка идет подряд, что нет ленивых вычислений
противорячащие друг другу утверждения, не находите??
← →
Игорь Шевченко © (2008-06-11 20:27) [109]
> Но они не так часто используются.
Тобой лично ?
Наиболее используемые языки - Java, С, С++, PHP и Visual Basic, так что не надо судить обо всем по личному опыту.
даже Lua и тот, оказывается, на 19-м месте по популярности, при том, что Delphi на 11
← →
Dmitry S © (2008-06-11 20:30) [110]А C# ?
← →
Игорь Шевченко © (2008-06-11 20:36) [111]Dmitry S © (11.06.08 20:30) [110]
> А C# ?
а сам посмотри: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
← →
Пробегал2.... (2008-06-11 20:55) [112]@!!ex © (11.06.08 19:57) [107]
Неявно - значит не определено в стандарте, но при этом присутствует.
Явно - значит описано в стандарте
это твое определение. И оно неправильное. Это называется незадокументированное, совсем из другой оперы.
Например, явное создание класса - когда ты говоришь компилятору, что нужно создать класс. А неявное - когда класс создается без твоего указания. Это не значит, что такое поведение незадокументировано, просто оно не явное.
Что такое явное и не явное приведение типов:
Вот явное:var
a: integer;
b: cardinal;
...
a := Integer(b) ;
А вот неявное приведение:var
a: integer;
b: cardinal;
...
a := b ;
Это опять же не означает, что алгоритм такого приведения не описан в документации.
Ну и последний тебе пример:type
TMyClass = class(TObject);
Это явное наследование от класса TObject, потому что ТЫ указал наследоваться от TObject.type
TMyClass = class ;
А вот это неявное наследование от класса TObject. Хоть ты и не указал это, но поскольку по-умолчанию базовым классом является TObject - происходит неявное наследование от него. Но еще раз - это не значит, что это не задокументировано.
← →
@!!ex © (2008-06-11 21:00) [113]> Тобой лично ?
Да. Я за всех говорить не назначен. :))
> [112] Пробегал2.... (11.06.08 20:55)
Спасибо. и?
← →
Anatoly Podgoretsky © (2008-06-11 21:20) [114]> Игорь Шевченко (11.06.2008 20:36:51) [111]
Интересно, какой это Паскаль резко рванул вверх в 2008 году, сразу на 8 позиций.
Кстати хоронили, а Дельфи и Паскаль улучшили свои позиции.
← →
Пробегал2.... (2008-06-11 21:26) [115]@!!ex © (11.06.08 21:00) [113]
Спасибо. и?
что и? Собственно, все. Ты неправильно трактовал термин "неявно".
Поэтому твоя фраза:
@!!ex © (11.06.08 19:57) [107]
Неявно - значит не определено в стандарте, но при этом присутствует.
Явно - значит описано в стандарте
неверная.
А значит и фраза:
@!!ex © (11.06.08 18:39) [103]
Почему неявно? Очень даже явно...
тоже неверная.
Компилятор добавляет в конце строчки символ #0 именно неявно, потому что ты его об этом хоть и не просишь, но тип так устроен. Тоже самое, что string в delphi.
← →
DRG (2008-06-11 21:28) [116]Выйдет Tiburion (жду не дождусь) версия дык еще на 8 рванет вверх.
← →
Anatoly Podgoretsky © (2008-06-11 21:29) [117]> Anatoly Podgoretsky (11.06.2008 21:20:54) [114]
Кстати стабильное возрастание показывают только Бейсик и ПХП, не считая мелких языков, остальные уверено идут вниз.
Но меня смущает из статистика, есть C и С++, но почему то все Бейсики смешаны в одну кучу, а Бейсик.NET это совсем другой язык, общее только имя.
Почему бы тогда все языки с СИ подобных синтаксисом не объединить в единое целое.
В общем измерение в попугаях.
← →
Игорь Шевченко © (2008-06-11 21:58) [118]Anatoly Podgoretsky © (11.06.08 21:20) [114]
> Интересно, какой это Паскаль резко рванул вверх в 2008 году,
> сразу на 8 позиций.
Сам удивляюсь. Вроде, кроме delphi и FreePascal я особенно сред для разработки не знаю, а последний, не думаю, что сильно популярен
← →
Eraser © (2008-06-11 22:03) [119]вроде php сейчас самый используемый язык, не помню откуда дровишки, но не от меня.
← →
korneley © (2008-06-11 22:12) [120]
> Игорь Шевченко © (11.06.08 21:58) [118]
>....Вроде, кроме delphi и FreePascal
> ...а последний, не думаю, что сильно популярен
И правильно... Вирт (как идеолог) и Борланд (как человек) Не зря хлеб ели.. Попробовал прочитать - похабно, как-то, получилось :) Но, по смыслу - верно!
Страницы: 1 2 3 4 вся ветка
Форум: "Прочее";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
Память: 0.7 MB
Время: 0.042 c