Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 376 377 [378] 379 380 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5656
,
|
|
|
|
|
Сообщ.
#5657
,
|
|
|
|
Цитата KILLER @ как работать с этим? Что мне передавать, например в функцию: ![]() ![]() DWORD WINAPI GetCurrentDirectory( __in DWORD nBufferLength, __out LPTSTR lpBuffer ); ?? Да, к сожалению строки не дают гарантии линейного размещения в памяти и корректной ссылки из operator[]. Или в новом стандарте есть изменения? А вот вектор такие гарантии дает, потому можно так: ![]() ![]() typedef std::vector<TCHAR> tstring; //... tstring my_string(buf_size); //... GetCurrentDirectory(my_string.size(), &my_string[0]); //... // далее нам доступны все средства для std::vector'а и его итераторов |
|
Сообщ.
#5658
,
|
|
|
|
Цитата MyNameIsIgor @ Вот так. не может это быть порблемой WinAPI и сишных либ, потому что их юзают, а им плевать кто их юзает и где их юзают, это как раз проблема программиста использущего эти либы... Уж в 21 веке, могли бы допилить std::string, как нибудь, чтобы он нормально синхронизировался с последовательностями строк типа char* ... Цитата MyNameIsIgor @ Работать с последовательностью символов равносильно разрешать кому-то писать в свой внутренний буфер? Не думаю... В смысле? Добавлено Цитата D_KEY @ А вот вектор такие гарантии дает, потому можно так: Казалось бы причем тут std::string |
|
Сообщ.
#5659
,
|
|
|
|
Цитата KILLER @ Уж в 21 веке, могли бы допилить убогий WinAPI FIXED Цитата KILLER @ В смысле? Что в смысле? С какой стати строки должны позволять то же, что D_KEY показал для векторов? С чего бы это разрешать кому-то писать во внутренний буфер объекта? Не вижу для этого причин... |
|
Сообщ.
#5660
,
|
|
|
|
Цитата MyNameIsIgor @ Цитата Уж в 21 веке, могли бы допилить убогий WinAPI FIXED А какой смысл его допиливать? Это что, часть языка С++ ? Это вообще отдельное приложение, с чего бы вдруг его нужно допиливать под стандарты С++ ? Цитата MyNameIsIgor @ Что в смысле? С какой стати строки должны позволять то же, что D_KEY показал для векторов? С чего бы это разрешать кому-то писать во внутренний буфер объекта? Не вижу для этого причин... А они разве этого не позволяют? не смеши меня, я видел код где реально в функции с out char* параметрами, передавали (char*)mystring.c_str() . Цитата MyNameIsIgor @ С чего бы это разрешать кому-то писать во внутренний буфер объекта? Не вижу для этого причин... А ты и так туда можешь писать, через конструктор, через оператор присваивания... |
|
Сообщ.
#5661
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ А вот вектор такие гарантии дает, потому можно так: Казалось бы причем тут std::string ![]() Ну так проблема в несоответствии C Win API и стандартной библиотеки C++. Это никак не связано с обсуждением. Кроме того, что конкретно тебе нужно от строк такого, чего не даст тебе вектор? Кстати, на стыке С и С++ можно и так: ![]() ![]() typedef std::vector<TCHAR> tbuffer; typedef std::basic_string<TCHAR> tstring; //... tbuffer buf(buf_size); GetCurrentDirectory(buf.size(), &buf[0]); // Можем работать с буфером, если нам этого достаточно // Или создать строку: tstring my_str(buf.begin(), buf.end()); Добавлено Цитата MyNameIsIgor @ С какой стати строки должны позволять то же, что D_KEY показал для векторов? Я, честно говоря, не знаю, почему бы строкам не давать такие же гарантии, что дают вектора? |
|
Сообщ.
#5662
,
|
|
|
|
Цитата KILLER @ А какой смысл его допиливать? Это что, часть языка С++ ? Это вообще отдельное приложение, с чего бы вдруг его нужно допиливать под стандарты С++ ? Ну, а с чего бы вдруг допиливать C++ под какой-то там WinAPI и его венерологические проблемы? ![]() И да, WinAPI надо допиливать не для плюсов... Его вообще надо переделывать, ибо он уё...щен от рождения. Цитата KILLER @ А они разве этого не позволяют? не смеши меня, я видел код где реально в функции с out char* параметрами, передавали (char*)mystring.c_str() . А я видел тех, кто прыгает с десятиэтажки. Так и запишем - прыгать с высотных зданий можно. Но только после вас... может быть... и то вряд ли. Цитата KILLER @ А ты и так туда можешь писать, через конструктор, через оператор присваивания... Я? Нет, не могу. Я могу лишь сказать что туда записать, но сам я не пишу. |
|
Сообщ.
#5663
,
|
|
|
|
Цитата D_KEY @ Ну так проблема в несоответствии C Win API и стандартной библиотеки C++. Это никак не связано с обсуждением. Проблема не в этом, проблема в том, что в большинстве приложений/SDK/либ юзают свой тип строк либо стандартный char* Цитата D_KEY @ Кроме того, что конкретно тебе нужно от строк такого, чего не даст тебе вектор? Очень замечательный вопрос, теперь скажи, нахер мне нужен std::string, если есть std::vector<char>, полностью заменяющий std::string, и даже лучше? Цитата D_KEY @ стати, на стыке С и С++ можно и так: а не проще так? ![]() ![]() TCHAR myBuffer[MAX_PATH]; GetCurrentDirectory(MAX_PATH, myBuffer); ?? |
|
Сообщ.
#5664
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Ну так проблема в несоответствии C Win API и стандартной библиотеки C++. Это никак не связано с обсуждением. Проблема не в этом, проблема в том, что в большинстве приложений/SDK/либ юзают свой тип строк либо стандартный char* Я с этим утверждением не согласен. Цитата Очень замечательный вопрос, теперь скажи, нахер мне нужен std::string, если есть std::vector<char>, полностью заменяющий std::string, и даже лучше? Ты меня спрашиваешь, зачем тебе что-то там нужно? Цитата Цитата D_KEY @ стати, на стыке С и С++ можно и так: а не проще так? ![]() ![]() TCHAR myBuffer[MAX_PATH]; GetCurrentDirectory(MAX_PATH, myBuffer); ?? Если тебе с массивами удобнее работать, чем с векторами и строками - то пожалуйста |
|
Сообщ.
#5665
,
|
|
|
|
Цитата MyNameIsIgor @ Ну, а с чего бы вдруг допиливать C++ под какой-то там WinAPI и его венерологические проблемы? ![]() Потому что С++ не имеет своего типа строка. Цитата MyNameIsIgor @ И да, WinAPI надо допиливать не для плюсов... Его вообще надо переделывать, ибо он уё...щен от рождения. Это уже к теме отношения не имеет. Цитата MyNameIsIgor @ А я видел тех, кто прыгает с десятиэтажки. Так и запишем - прыгать с высотных зданий можно. Но только после вас... может быть... и то вряд ли. Ммм... Т.е. если язык позволяет сделать то, что делать в принципе нельзя, значит - это так и нужно? Цитата MyNameIsIgor @ Я? Нет, не могу. Я могу лишь сказать что туда записать, но сам я не пишу. Передавая c_str в винапишную функцию, ты тоже туда ничего не пишешь, пишет функция! Добавлено Цитата D_KEY @ Ты меня спрашиваешь, зачем тебе что-то там нужно? Ну да, тебя, ты ведь тут рассказываешь делфистам, какой замечательный и незаменимый класс basic_string... И тут выясняеца, что мол де, много где он никому нафиг не нужен... Теперь ты предлогаешь юзать вектор, зачем мне юзать вектор, если есть std::string ? А если вектор дает все, что мне нужно для работы со строками, тогда зачем нужен std::string ? Цитата D_KEY @ Если тебе с массивами удобнее работать, чем с векторами и строками - то пожалуйста ![]() Мне удобнее написать элементарно понятный код, а не хреначить куда не попадя половину STL'я, только затем, чтобы показать какой я кул знаток STLя |
|
Сообщ.
#5666
,
|
|
|
|
Цитата KILLER @ Цитата MyNameIsIgor @ Ну, а с чего бы вдруг допиливать C++ под какой-то там WinAPI и его венерологические проблемы? ![]() Потому что С++ не имеет своего типа строка. А как же basic_string?Цитата Т.е. если язык позволяет сделать то, что делать в принципе нельзя, значит - это так и нужно? Зависит от целей и идеологии языка Цитата Передавая c_str в винапишную функцию, ты тоже туда ничего не пишешь, пишет функция! По стандарту ты вообще не знаешь куда она там пишет Теоретически строка может даже не измениться. |
|
Сообщ.
#5667
,
|
|
|
|
Цитата KILLER @ Потому что С++ не имеет своего типа строка. Т.е. std::basic_string не существует? Как интересно... Цитата KILLER @ Это уже к теме отношения не имеет. WinAPI отношения к теме не имеет. Но раз уж он был помянут, то следует сказать, что это образец того как не надо делать. Цитата KILLER @ Ммм... Т.е. если язык позволяет сделать то, что делать в принципе нельзя, значит - это так и нужно? Ах! Так надо, чтобы язык запрещал? Ну, это вон .NET, JVM, лиспы и всякая разная функциональщина. А в плюсах принято думать головой, прежде чем прыгать ![]() Цитата KILLER @ Передавая c_str в винапишную функцию, ты тоже туда ничего не пишешь, пишет функция! Передать результат c_str куда-то, что может записывать, нельзя. Прежде надо этот результат скастовать. Тот, кто пропустит так код на ревью - му..ак. А тот, кто напишет... думаю, ясно |
|
Сообщ.
#5668
,
|
|
|
|
Цитата D_KEY @ А как же basic_string?это пользовательский класс строка, который имеет свои недостатки, приведенные например выше, я имел ввиду встроенный тип string, наподобии как в делфях. Цитата D_KEY @ По стандарту ты вообще не знаешь куда она там пишет Теоретически строка может даже не измениться. По какому стандарту? В стандарте есть описание винапишных функций? Добавлено Цитата MyNameIsIgor @ Т.е. std::basic_string не существует? Как интересно... D_KEY'ю ответил... Цитата MyNameIsIgor @ WinAPI отношения к теме не имеет. Но раз уж он был помянут, то следует сказать, что это образец того как не надо делать. Конечно не имеет, я его тут привел в качестве API, в котором работа с классом basic_string затруднительна... Цитата MyNameIsIgor @ Ах! Так надо, чтобы язык запрещал? Ну, это вон .NET, JVM, лиспы и всякая разная функциональщина. А в плюсах принято думать головой, прежде чем прыгать ![]() И часто ты в С++ думаешь головой, прежде чем прыгать? Цитата MyNameIsIgor @ Передать результат c_str куда-то, что может записывать, нельзя. Прежде надо этот результат скастовать. Тот, кто пропустит так код на ревью - му..ак. А тот, кто напишет... думаю, ясно ![]() Всяко бывает, всего не уследишь... Особенно если изменений много много... |
|
Сообщ.
#5669
,
|
|
|
|
Цитата KILLER @ это пользовательский класс строка Стандартный Цитата который имеет свои недостатки, приведенные например выше Какой там был выше приведен недостаток ?Цитата я имел ввиду встроенный тип string Если язык позволяет создать точно такой же пользовательский тип, то зачем его зашивать в язык Цитата Цитата D_KEY @ По стандарту ты вообще не знаешь куда она там пишет Теоретически строка может даже не измениться. По какому стандарту? В стандарте есть описание винапишных функций? Нет, стандарт не дает тебе гарантий, что твои попытки писать в результат c_str(), изменят исходную строку(а не какой-то дополнительный буфер, например). |
|
Сообщ.
#5670
,
|
|
|
|
Цитата KILLER @ это пользовательский класс строка Какой же он пользовательский то в std? ![]() Цитата KILLER @ Конечно не имеет, я его тут привел в качестве API, в котором работа с классом basic_string затруднительна... Конечно. Всем не угодишь. Я ещё раз говорю: строки в плюсах не проектировались как выходные буфера. Они проектировались как строки. Цитата KILLER @ И часто ты в С++ думаешь головой, прежде чем прыгать? Я стараюсь вообще всегда думать головой |