На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 392 393 [394] 395 396 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата KILLER @
    Цитата D_KEY @
    Совместимость чего с чем? Нет такого типа "С-строка".

    зато есть соглашение.

    Ну так следуй ему и дальше. Возьми аналог С-массивов в С++(vector, array) и следуй на здоровье своему соглашению.
    Причем тут нормальные строки-то?

    Цитата
    Цитата D_KEY @
    У него в буфере после trim будет лежать вот это: [KILLER\0<space><space>\0]
    Обычный std::string интерпретирует это как строку из 10 символов и никакого специального символа для него не существует. Например, он спокойно найдет пробел.

    Это если ему указать размер, тогда да найдет.

    Мы о внутреннем буфере говорим.
    Или когда ему возвращают буфер он должен его взять и посчитать длину, как от С-строки?
      Цитата korvin @
      о да, клевая работа

      При чём тут клёвость работы? Она для всех разная. Кому не нравится, могут искать другую. А если было принято решение писать на плюсах, значит, так надо.
      И да
      Цитата D_KEY @
      korvin, лучше вбрось что-нибудь новенькое...
        Цитата D_KEY @
        Мы о внутреннем буфере говорим.
        Или когда ему возвращают буфер он должен его взять и посчитать длину, как от С-строки?

        Если не передать размер? да, именно сейчас он так и работает.
        Сообщение отредактировано: KILLER -
          Цитата KILLER @
          Цитата D_KEY @
          Мы о внутреннем буфере говорим.
          Или когда ему возвращают буфер он должен его взять и посчитать длину, как от С-строки?

          Если не передать размер? да, именно сейчас он так и работает.

          Сейчас ты не возвращаешь ему внутренний буфер :)
          Т.е. ты предлагаешь специальный метод, который бы отдавал внутренний буфер строки в распоряжение пользователя, а потом строка могла бы его(буфер) обратно принять, рассматривая его содержимое или как С-строку, или просто как массив(если передаем длину)?
          Сообщение отредактировано: D_KEY -
            Цитата D_KEY @
            Т.е. ты предлагаешь специальный(ые) метод(ы), который бы отдавал внутренний буфер строки в распоряжение пользователя, а потом строка могла бы обратно его обратно принять, рассматривая его содержимое или как С-строку, или просто как массив(если передаем длину)?

            Да, что то типо того.

            Цитата D_KEY @
            Сейчас ты не возвращаешь ему внутренний буфер :)

            В каком смысле?
              Цитата KILLER @
              Цитата D_KEY @
              Т.е. ты предлагаешь специальный(ые) метод(ы), который бы отдавал внутренний буфер строки в распоряжение пользователя, а потом строка могла бы обратно его обратно принять, рассматривая его содержимое или как С-строку, или просто как массив(если передаем длину)?

              Да, что то типо того.

              Кода получится столько же, как и с буферным вектором. Все ради того, чтобы не копировать?

              Цитата
              Цитата D_KEY @
              Сейчас ты не возвращаешь ему внутренний буфер :)

              В каком смысле?

              В таком, что assign от const char * принимает внешнюю С-строку и копирует ее содержимое до '\0' в свой буфер. А ты, как я понял, предлагаешь, чтобы std::string просто воспользовался переданным ему.
                Цитата D_KEY @
                В таком, что assign от const char * принимает внешнюю С-строку и копирует ее содержимое до '\0' в свой буфер. А ты, как я понял, предлагаешь, чтобы std::string просто воспользовался переданным ему.

                нет. assign как останется так и останется.

                Цитата D_KEY @
                Кода получится столько же, как и с буферным вектором. Все ради того, чтобы не копировать?

                меньше копирований, проще работать.
                  Цитата KILLER @
                  Цитата D_KEY @
                  В таком, что assign от const char * принимает внешнюю С-строку и копирует ее содержимое до '\0' в свой буфер. А ты, как я понял, предлагаешь, чтобы std::string просто воспользовался переданным ему.

                  нет. assign как останется так и останется.

                  А, то есть assign именно скопирует буфер? Тогда вообще не ясно какой профит по сравнению с вектором. У тебя будет разница, только если тебе нужно в C-API передать одну и ту же строку и на чтение и на запись. Что бывает крайне редко.
                    Цитата D_KEY @
                    А, то есть assign именно скопирует буфер? Тогда вообще не ясно какой профит по сравнению с вектором. У тебя будет разница, только если тебе нужно в C-API передать одну и ту же строку и на чтение и на запись. Что бывает крайне редко.

                    Не совсем понял. Профит = -1 копирование, из строки в временный буфер, но это так, пока без особого мозгового штурма, если посидеть все нормально прикинуть, думаю еще лучше можно сделать.
                      Цитата D_KEY @
                      korvin, лучше вбрось что-нибудь новенькое...

                      никаких идей. мне в джаве не хватает(впрочем может я просто не знаю как это сделать) чего-то типа "локального переопределия метода" для класса, например, есть такой класс:
                      ExpandedWrap disabled
                        public class A {
                         
                            public String show() {
                                return "instance of class A";
                            }
                        }

                      и например, такие методы, работающие с объектами данного класса:
                      ExpandedWrap disabled
                        public class Utils {
                         
                            public static A newA() {
                                return new A();
                            }
                         
                            public static void show(A x) {
                                System.out.println(x.show());
                            }
                        }


                      теперь я хочу написать какой-то метод с этими функциями и объектами класса A, но при этом хочу, чтобы в этом методе A.show() вел себя по-другому
                      ExpandedWrap disabled
                        public class App {
                         
                            public static void main(String[] args) {
                                Utils.show(Utils.newA()); // => "instance of class A"
                            }
                        }


                      т.е. хочется чего-нибудь вроде
                      ExpandedWrap disabled
                        public class App {
                         
                            local extend A {
                         
                                public String show() {
                                    return "my cool A object";
                                }
                            }
                         
                            public static void main(String[] args) {
                                Utils.show(Utils.newA()); // => "my cool A object"
                            }
                        }
                      Сообщение отредактировано: korvin -
                        korvin, а нельзя создать "локального" наследника и переопределить метод? Я просто плохо джаву знаю...
                          Кстати, а непрерывность буфера у строк по новому Стандарту случайно не даёт чёткого определённого поведения при const_cast<std::basic_string<TCHAR>::pointer>(str.c_str()); user posted image

                          Добавлено
                          В случае изначально неконстантного str, разумеется.
                            Цитата KILLER @
                            Цитата D_KEY @
                            А, то есть assign именно скопирует буфер? Тогда вообще не ясно какой профит по сравнению с вектором. У тебя будет разница, только если тебе нужно в C-API передать одну и ту же строку и на чтение и на запись. Что бывает крайне редко.

                            Не совсем понял. Профит = -1 копирование, из строки в временный буфер

                            Так оно тебе нужно, только если строку используют и на чтение и на запись.
                            На чтение(достаточно текущей реализации строки)
                            ExpandedWrap disabled
                              some_read_fun(s.c_str());


                            На запись(достаточно текущей реализации строки)
                            ExpandedWrap disabled
                              std::vector<char> buffer(sz);
                              some_write_fun(&buffer[0], buffer.size());
                              str.assign(&buffer[0]);


                            И вот чтение-запись:
                            ExpandedWrap disabled
                              std::vector<char> buffer(str.begin(), str.end());
                              some_read_write_fun(&buffer[0], buffer.size());
                              str.assign(&buffer[0]);
                               
                              // С твоим буфером:
                              size_t size = str.size();
                              const char *buffer = str.release();
                              some_read_write_function(buffer, size);
                              str.assign(buffer);
                              delete[] buffer;

                            Да, тут на одно копирование меньше. Но это жесть какая-то, не находишь?
                            Сообщение отредактировано: D_KEY -
                              Цитата MyNameIsIgor @
                              korvin, а нельзя создать "локального" наследника и переопределить метод? Я просто плохо джаву знаю...

                              а как ты "превратишь" объект предка в наследника?
                              ExpandedWrap disabled
                                B b = (B) Utils.newA();
                                Utils.proc(b);

                              не прокатит:
                              ExpandedWrap disabled
                                Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
                                    at App.main(App.java:25)
                                    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                                    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
                                    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                                    at java.lang.reflect.Method.invoke(Method.java:601)
                                    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

                              покажи как бы ты на C++ сделал (там-то, я думаю, твой или подобный способ можно заюзать), может это наведет меня на мысль, как сделать в джаве =/
                                Цитата MyNameIsIgor @
                                korvin, а нельзя создать "локального" наследника и переопределить метод? Я просто плохо джаву знаю...

                                Можно. Там анонимные классы есть. Только проблему это не решит - объект создается в Utils, а не там, где ты хочешь сделать "локальный" метод.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 392 393 [394] 395 396 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.6117 ]   [ 15 queries used ]   [ Generated: 30.07.26, 09:05 GMT ]