Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1214779348
Германн
2008-06-30 02:42
2008.08.24
Поддержим отечественных производителей ПО. Часть 2.


15-1215413564
ПЛОВ
2008-07-07 10:52
2008.08.24
Файл bla.bla является скрытым


6-1192218336
prisoner849
2007-10-12 23:45
2008.08.24
IdHTTP и Post в Indy 10 (BDS 2006)


15-1214910468
pasha_golub
2008-07-01 15:07
2008.08.24
Отождествление пустой строки и NULL


15-1214935991
DVM
2008-07-01 22:13
2008.08.24
А у кого нибудь ICQ работает, но через сторонний клиент?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский