Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

требуется программист 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;
Скачать: CL | DM;

Наверх




Память: 0.71 MB
Время: 0.033 c
15-1215162423
DN
2008-07-04 13:07
2008.08.24
Что за кодировка?


15-1215110556
oldman
2008-07-03 22:42
2008.08.24
Нужен контроллер EGA!


4-1194957509
snake-as
2007-11-13 15:38
2008.08.24
Узнать класс окна


15-1215461152
maxon
2008-07-08 00:05
2008.08.24
Никто не хочет написать НОВУЮ статью про оптимизацию?


2-1216297461
User
2008-07-17 16:24
2008.08.24
обработка ошибок записи SaveToFile