Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 391 392 [393] 394 395 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5881
,
|
|
|
|
незнаю, спроси у D_KEY, я тоже не понял причем тут это. |
|
Сообщ.
#5882
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Я о том, что если ты предлагаешь простую передачу буфера туда-обратно, то для строки " KILLER "([ KILLER \0]) после trim в буфере будет [KILLER\0 \0]. Теперь ты пытаешься вернуть буфер в std::string. И тут возникает два вопроса. Во-первых, как std::string определит размер буфера? Как он это делает сейчас? Сейчас ему это не нужно - ты ему не буфер возвращаешь, а передаешь С-строку Ему, кстати, можно указать количество символов и тогда он не будет учитывать '\0'. Цитата Я хочу задать тебе тотже вопрос, вот именно какой длины будет строка, с учетом того, что для std::string '\0' не обладает никакими специальными особенностями сейчас, на любом выбранном тобою компиляторе? Вот код: ![]() ![]() #include <iostream> #include <string> int main() { std::string s; const char* p = "str\0ing"; s.assign(p); std::cout << s.length(); return 0; } Я предполагаю что 3. Во всяком случае у меня так... Так тут ты явно передаешь С-строку. Попробуй так: ![]() ![]() #include <iostream> #include <string> int main() { std::string s; const char p[] = "str\0ing"; s.assign(p, sizeof(p)); std::cout << s.length(); return 0; } Он у тебя не только '\0' в середине возьмет, он еще и последний будет символом считать |
|
Сообщ.
#5883
,
|
|
|
|
D_KEY, речь идет именно о массиве печатных символов, бинарные буферы обсуждать тут я не собираюсь. ты от темы уходишь. если я возьму хоть сейчас, строку с '\0' всереждине, то у меня сишные функции, которые работают с С-строками, будут так же работать неверно. И толку их юзать я не вижу.
|
|
Сообщ.
#5884
,
|
|
|
|
Цитата KILLER @ D_KEY, речь идет именно о массиве печатных символов, бинарные буферы обсуждать тут я не собираюсь. ты от темы уходишь. если я возьму хоть сейчас, строку с '\0' всереждине, то у меня сишные функции, которые работают с С-строками, будут так же работать неверно. И толку их юзать я не вижу. Причем тут все это? Я тебе говорю, что если ты будешь просто возвращать буфер, то всякие trim все-равно будут работать некорректно. Тебе хочется стандартного класса строк для работы именно с С-строками. Его нет, т.к. он был бы полезен исключительно для обратной совместимости и ни для чего другого. |
|
Сообщ.
#5885
,
|
|
|
|
Цитата D_KEY @ Причем тут все это? Я тебе говорю, что если ты будешь просто возвращать буфер, то всякие trim все-равно будут работать некорректно. Тебе хочется стандартного класса строк для работы именно с С-строками. Его нет, т.к. он был бы полезен исключительно для обратной совместимости и ни для чего другого. Почему? c_str ведь возвращает корректный буфер. |
|
Сообщ.
#5886
,
|
|
|
|
Цитата D_KEY @ теперь ответь, что больше подходит для работы с массивом, std::vector или std::string ? std::array<char> |
|
Сообщ.
#5887
,
|
|
|
|
Цитата KILLER @ Цитата D_KEY @ Причем тут все это? Я тебе говорю, что если ты будешь просто возвращать буфер, то всякие trim все-равно будут работать некорректно. Тебе хочется стандартного класса строк для работы именно с С-строками. Его нет, т.к. он был бы полезен исключительно для обратной совместимости и ни для чего другого. Почему? c_str ведь возвращает корректный буфер. Если ты после trim вернешь буфер std::string'у то как он должен интерпретировать данные в буфере? |
|
Сообщ.
#5888
,
|
|
|
|
Цитата D_KEY @ Если ты после trim вернешь буфер std::string'у то как он должен интерпретировать данные в буфере? если ты собрался на бинарный буфер натравливать сишные функции работающие с С-строкой, это твои проблемы, хоть сейчас, хоть тогда. Я тебе толкую о С-строках, а не о бинарных буферов. Сейчас ведь он как то интерпретирует то что я ему передаю после trim. |
|
Сообщ.
#5889
,
|
|
|
|
Кстати.
Вот в первом приближении: ![]() ![]() #include <string> struct c_str_char_traits : public std::character_traits<char> { static int compare(const char_type* s1, const char_type *s2, size_t n) { return std::strncmp(s1, s2, n); } static size_t length(const char_type *s1) { return std::strlen(s1); } static char_type* copy(char_type* s1, const char_type* s2, size_t n) { return std::strncpy(s1, s2, n); } }; typedef std::basic_string<char, c_str_char_traits> nt_string; А поскольку в новом стандарте: Цитата The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s, the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 <= n < s.size(). То ты получишь все, что тебе нужно. И все будет работать. Ну может что-то еще не учел в своих traits - сейчас нет времени проверять. Добавлено Цитата KILLER @ Цитата D_KEY @ Если ты после trim вернешь буфер std::string'у то как он должен интерпретировать данные в буфере? если ты собрался на бинарный буфер натравливать сишные функции работающие с С-строкой, это твои проблемы, хоть сейчас, хоть тогда. Я тебе толкую о С-строках, а не о бинарных буферов. Да причем тут бинарные буферы, если речь идет о просто trim? Цитата Сейчас ведь он как то интерпретирует то что я ему передаю после trim. Сейчас он копирует то, что ты ему передаешь. Если передаешь указатель + размер - он скопирует все. Если передашь только указатель, он подумает, что это C-строка и скопирует все до '\0'. |
|
Сообщ.
#5890
,
|
|
|
|
Цитата D_KEY @ Вот в первом приближении: Я же еще раз повторяю, мне нехочеца писать кучу оберток на каждый писк. Я хочу иметь эту совместимость встроенную в С++. Добавлено Цитата D_KEY @ Да причем тут бинарные буферы, если речь идет о просто trim? Тогда не понимаю, в чем у тебя вопрос касательно trim был? Цитата D_KEY @ Сейчас он копирует то, что ты ему передаешь. Если передаешь указатель + размер - он скопирует все. Если передашь только указатель, он подумает, что это C-строка и скопирует все до '\0'. ну и отлично, в чем проблемы? Или если мы добавим std::string'у новый метод, то от этого что то изменится? |
|
Сообщ.
#5891
,
|
|
|
|
Не, я прогнал. будут проблемы с итераторами и пр.
Добавлено Цитата KILLER @ Я хочу иметь эту совместимость встроенную в С++. Совместимость чего с чем? Нет такого типа "С-строка". Цитата ну и отлично, в чем проблемы? Или если мы добавим std::string'у новый метод, то от этого что то изменится? У него в буфере после trim будет лежать вот это: [KILLER\0<space><space>\0] Обычный std::string интерпретирует это как строку из 10 символов и никакого специального символа для него не существует. Например, он спокойно найдет пробел. |
|
Сообщ.
#5892
,
|
|
|
|
Цитата KILLER @ Я же еще раз повторяю, мне нехочеца писать кучу оберток на каждый писк. Я хочу иметь эту совместимость встроенную в С++. Мне не хочецца работать Дайте мне в std выдаватель зарплаты! |
|
Сообщ.
#5893
,
|
|
|
|
Цитата MyNameIsIgor @ Мне не хочецца работать Дайте мне в std выдаватель зарплаты! ![]() о да, клевая работа Цитата =) писать кучу оберток на каждый писк |
|
Сообщ.
#5894
,
|
|
|
|
korvin, лучше вбрось что-нибудь новенькое...
|
|
Сообщ.
#5895
,
|
|
|
|
Цитата D_KEY @ Совместимость чего с чем? Нет такого типа "С-строка". зато есть соглашение. Цитата D_KEY @ У него в буфере после trim будет лежать вот это: [KILLER\0<space><space>\0] Обычный std::string интерпретирует это как строку из 10 символов и никакого специального символа для него не существует. Например, он спокойно найдет пробел. Это если ему указать размер, тогда да найдет. |