![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| shad0w |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 9.5.2005 Репутация: нет Всего: нет |
Очень извеняюсь если тема уже проходила.
Нужно сложыть 2 строки на C. Делаю:
Пишет Error: noname01.cpp(8,10):Invalid pointer addition Что не так? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
char q -- символ. ты хочеш две строки сложить в символ?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
В параграфе 6.5.6 стандарта C99 сказано, что для сложения необходимо чтобы оба операторы имели арифметический тип, либо один из операторов имел арифметический тип, а другой был указателем.
Другими словами, Си не позволяет складывать указатели, а "sss" и "ddd" и есть указатели на тип char. Значит Си не позволит сложить их. Поэтому возникает error. Для сложения строк в Си используется в частности функция strcat(3), которая во-первых стандартная, во-вторых рассматривалась в этом же форуме "С/С++ Общие Вопросы", последнее обновление кстати "24.5.2005, 09:31\nАвтор: Peter" и называлось это "Работа с strcat". -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Irokez |
|
|||
![]() индеец ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1180 Регистрация: 20.10.2004 Репутация: нет Всего: 53 |
|
|||
|
||||
| bel_nikita |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Irokez
Это сообщение отредактировал(а) bel_nikita - 25.5.2005, 20:41 |
||||
|
|||||
| Irokez |
|
||||
![]() индеец ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1180 Регистрация: 20.10.2004 Репутация: нет Всего: 53 |
говорю же, недоучил с++
|
||||
|
|||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Гм.
Вообще-то правильно использовать оператор "+" только в применении к классу CString, так как он там перегружен. А по стандарту:
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Только не забудь:
|
|||
|
||||
| gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Считаю, что каждый СиПлюсПлюснутый должен иметь свой класс работ со строками.
-------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Считаю, что что каждый СиПлюсПлюснутый должен использовать std::string - да бы не было недоразумения и велосипедов, и была переносимость кода |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 1 Всего: 111 |
Если бы небыло "велосипедов", то так же небыло бы компьютера, машин и много других великих открытий человечества. Недоразумение - тоже знание, а точнее опыт! |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Это не тот случай. На ошибках нужно учиться, а не повторять каждый раз одни и те же.
И использовать написанное умными людьми. Ну все, ушли в оффтоп, хотя тут и обсуждать нечего -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Да, не надо оффтопить плиз
Эти вопросы часто возникают. Много новичков программировали на "простых" языках типа Бэйсика или какого нибудь скриптового языка. Им не там просто понять, что указатель и сам массив вещи немного разные Вот можно было бы людей туда перенаправлять. |
|||
|
||||
| Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
вот есть статьи о строках и их сравнение, вполне доступные для понимания новичков:
Строки в С и С++ Сравнение std::string без учета регистра -------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
| WERITAS |
|
|||
|
******** ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 2.5.2005 Где: Москва Репутация: нет Всего: 5 |
shad0w
сhar g - Один символ! Если хочешь сложить, хотя бы массив выдели. q="sss"+"ddd"; - строки скалдываются не так Alastis А хорошая ссылка, кста -------------------- Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак" |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
ссылка хорошая, но для новичков ИМХО чуточку слишком много ...
Надо бы на пальцах.. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
sergej.z Статья уже есть или мне можно приниматься?..
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Нет статьи
|
|||
|
||||
| ManiaK |
|
||||||||||||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Не вопрос!..
Типы данных. Сказанное ниже гарантировано соотносится со спецификациями Си/Си++. Наверняка во многих других языках действуют похожие правила. 1. Простые типы данных. К простым типам относят: одиночные символы, любые числовые переменные и пр.
2. Сложные типы данных. К сложным типам данных относят для Си - структуры, объединения и массивы; для Си++ - тоже + классы. Сложные типы можно также назвать составными, т.к. они в конечном итоге всё равно содержат в себе простые (сложный тип = набор простых). Важно понять, что процессор не умеет работать со сложными типами. Он не может понять, что такое std::string или char[10]. Для него это - набор простых типов. Программист так же никогда не работает со сложными типами напрямую - он работает только с указателями на сложные типы. Что это такое разберём дальше. 3. Указатели. Любой указатель принадлежит простому типу и содержит в себе адрес определённой ячейки памяти. Чаще всего в 32-битных процессорах x86 используют 32-битные же указатели. Проще говоря, в большинстве случаев любой указатель имеет тип unsigned int. Программист работает со сложными объектами только при помощи указателей. Даже когда он видит перед собой объект типом char[10] он должен знать, что это - лишь указатель на область памяти, где находится десять переменных простого типа char. Типы int* и int[] абсолютно идеинтичны - это указатели на массивы памяти. Разница только в одном: один из этих указателей динамический, а другой статический. Что это такое? Проще пояснить примером:
Первый массив называют статическим, второй - динамическим. Соответственно, переменная iArray - статическая, pInt - динамическая. Кстати, если вы напишете вот это:
То вы получите десять переменных-указателей и ни одного массива. Чтобы получать массивы динамическим образом ("на ходу") вам необходимо самостоятельно вызвать оператор new или функцию выделения памяти и после завершения использования - удалить массив вызовом delete или функцией освобождения памяти. Со статическими массивами проще - там компилятор сам решает где взять память и когда её освободить, причём делает и то и другое с необыкновенной быстротой, потому как всё это определяется ещё на моменте компиляции, а не в процессе исполнения. Казалось бы, все преимущества статических переменных на лицо, зачем же использовать динамические? Не торопитесь.
Теперь можно привести примеры с извечной проблемой строк, которая проблемой по сути является только для новичков (камень в огород Си-ненавистников).
Почему первая строка работает, а вторая - сбоит? Всё просто. "STRING" - константный набор данных. Откройте свою программу любым текстовым редактором - вы там без труда найдёте эту строку. В первой строке вышеприведённого кода происходит присвоение указателю char* str адреса константной области данных, содержащей "STRING". При попытке изменить эту область операционная система даёт нам оплеуху и выкидывает программу из списка процессов. Вот этот код работает:
Лучше такой экзотикой не заниматься, а писать сразу в вызов функции strcpy строку "STRING", потому как никто не гарантирует, что где-нибудь в губине кода не произойдёт следующее:
---------- Думаю достаточно понятно объяснил. Если нет - критикуйте, поправлю. Могу продолжить тему и написать что-нибудь вроде "Трюкачи на Си++", но в принципе, говорят, по этому делу есть множество книг Это сообщение отредактировал(а) ManiaK - 31.5.2005, 18:58 |
||||||||||||||
|
|||||||||||||||
| Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Несколько ЗУП (замечаний/уточнений/предложений):
1) Про всеми любимый strcat забыл. 2)
Для блеска: лучше что-нибудь типа "по размеру совпадает с unsigned long" - ибо 1) Сработает и для 64 битных компов тоже, и для 16битного доса с оговоркой, что это FAR указатель. 2) Указатели все же имеют тип указателя. 3)
Не правда. pInt - это как раз массив из десяти указателей. Если бы я был новичком, меня бы это могло спутать: как так, [10] есть, а массива нет? Я б вообще мог решить что TYPE* blahblah[] некорректно, и надо юзать только одно - либо TYPE*=new, либо TYPE[]. 4) Опять же, если бы я был новичком в сях, то я считал бы,что первый элемент массива имеет индекс 1, а не 0. То есть я считал бы a[0] бредом(а a[-2] вообще научной фантастикой) А что есть "трюкачи для С++"? Типа a^=b,b^=a,a^=b? Тогда давай! Это сообщение отредактировал(а) Mayk - 31.5.2005, 19:44 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
ManiaK
Продолжать будешь? Как насчет строк в STL, std::string? Вообще хотелось бы прочитать все возможное о строках. Или хотя бы РАБОТУ со строками, это же лишь введение, показано лишь как правильно объявлять, удалять... -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| kometa_triatlon |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Несколько важных моментов для новичков и тех, кто переходит с Паскаля:
Добавлено @ 20:14 И еще. Кавычки Ух, сколько дельфистов ломают себе голову, почему не работает
Дело в том, что одинарные кавычки применяются только для символов, для строк - двойные. Это сообщение отредактировал(а) kometa_triatlon - 31.5.2005, 20:08 -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||||
|
|||||||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Mayk за пункт 3 и 4 - спасибо! сейчас поправлю статью. Насчёт "трюкачей" - это например:
Вообщем "подводные камни" на тему типов данных и шаблонов. kometa_triatlon Напишем! Можно даже нечто вроде урока "пишем свой класс строк" со всеми подробностями. STL - без вопросов!.. |
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Об этом действительно стоит написать не статью, а целую книгу... и не одну... И такие книги есть. И вообще, речь изначально о новичках шла
Вот это, имхо, будет очень хорошое пособие по "классостроению в C++ для начинающих"! Поддерживаю! (к сожалению, только морально, ибо сессия -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| ManiaK |
|
||||||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Пишем свой класс строк.
0. Объяснительная. Прежде чем использовать что-то, уже сделанное "дядями", я считаю, лучше понять, как оно работает. Проще всего, по моему мнению, это сделать написав что-нибудь самому. Особенно это хорошо работает в данном случае - мы не операционную систему писать всё-таки собираемся и потому базис можно собрать за относительно небольшой промежуток времени. 1. А что нам, собственно, надо? Для начала определимся, что должен делать наш класс по определению, без чего он вообще жить не может. Для многих начинающих программистов этот вопрос является едва ли не самым сложным. Вот мой список: 1) Класс должен полностью замещать Си-строку. В идеале, везде, где можно воткнуть char* мы должны воткнуть String, но я по ряду причин отказался от данной технологии и остановился на функциях GetCStr. 2) Присвоение. 3) Конкатенация (сложение). 4) Вставку строк/символов в определённое место. 5) Вырезание отдельных символов/строки. 6) Сравнение. 7) Замена. 8) Поиск строк/символов с заданной позиции. 9) Поиск числа вхождений строк/символов. 10) Преобразование строк в численные типы и обратно. Для ускорения написания статьи я буду использовать собственный класс QString. Большинство функций его отлажено и проверенно временем, но некоторые (особенно редко использующиеся) могут содержать некоторые ошибки. Так что, проверяйте, как говорится, "если что - я не виноват":) 3. Пишем объявление класса. Мой метод написания классов: пишу сначала объявление (то, что в *.h находится) не вдаваясь ни в какие подробности реализации и только потом берусь за проработку каждой отдельной функции. Этот метод позволяет на первой стадии не отвлекаться на мелочи и "сверху" взглянуть на проблему, уловить некоторые моменты, про которые можно просто забыть. Так как я использую класс из собственной библиотеки, типы данных у меня объявлены по-своему. Если кому-то не понравится - на то есть операция "Замена" в любом текстовом редакторе. Лично мне кажется, что подобное объявление хоть и приводит к излишей писанине, значительно упрощает чтение программы. Итак, вот список typedef-определений:
Как видите, не трудно "угадать" что под чем скрывается даже при первом прочтении. Только теперь вспомнил: мой класс работает только со строками char*. Но ведь, я думаю, не трудно будет это и самому переделать "по аналогии"?.. Вот декларация базового класса из моей библиотеки: (пара функций и данные будут использоваться в строковом классе, потому привожу здесь. Код копировать не буду - всё элементарно, никаких операций практически не выполняется. Если же будут у кого проблемы - напишу, обращайтесь)
Как видите, всё просто. Аллокатор у меня свой, однако это ни на что не должно влиять. Прошу обратить внимание на все эти "const" разбросаные по всему классу: говоря словами Д. Элджера, подобную технологию надо использовать с полным фанатизмом, либо не использовать вовсе, причём приветствуется первое. Однако это не так просто, особенно когда происходят стыковки со сторонними бибиотеками, где константы не используют - вот тут-то, случается, ночи напролёт боёв с компилятором!.. Теперь декларация класса строки:
У вас в глазах не рябит? Кстати, если вы уже заметили, этот класс совершенно изолирован и может использоваться сам по себе, без подключения даже стандартных string.h или stdlib.h. Разумеется, это только для заголовочного файла - при реализации всё равно придётся на что-то опираться (хотя бы из соображений эфективности). Вопреки опУпсевшемуся уже оператору приведения к char*, я его не включил в список. Хотя бы уже из соображений безопастности (никто не гарантирует мне, что переданный указатель на m_pData будет использоваться только для чтения). Однако вы можете это сделать сами вставив всего одну строчку в декларацию класса:
Разделю-ка я на два поста статейку... Реализация - в следующем. Это сообщение отредактировал(а) ManiaK - 31.5.2005, 22:02 |
||||||||
|
|||||||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
В глаза бросилось... И еще - value-типы передавать с модификатором const, имхо, немножко некрасиво... и бессмысленно Это сообщение отредактировал(а) Void - 31.5.2005, 21:17 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Не вижу такого. У меня вот:
Про value-типы скажу ещё. |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
А это поправка -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Любопытно:) Я раньше на это внимания не обращал, спасибо!:)
|
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Хмм. А в статье нельзя обойти использование наследования?
Это ведь вроде как для новичков? Если бы я опять был новичком, то слова "allocator, QObject<Char_t>, operator" были бы для меня открытыием. "operator Int_t const ()" я б вообще не понял. Кстати, оно тут вообще надо? Предположим есть функция myConnect(const QString& host, int port), а мы напишем myConnect(123, someHost()). QString host получится из конструктора (кстати, const int в конструкторе - это перебор), someHost() преобразуется в int, а в результате получится совсем не то, что надо. Ну их нафиг эти приведения типов. ИМХО. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Не бейте пиониста: он играет как может:)
Обойти наследование можно, но для этого нужно время. У меня его не шибко много. Если кто-то захочет переделать мою статью - бога ради, я не обижусь:) Так уж и быть, убью константы, где это ни на что не повлияет. Уболтали:) |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Чем дальше в лес, тем толще партизаны...
Куда вы залезли? Зачем это тем, кто начинает изучать? Господи, перегрузка, шаблоны, классы... Да новичок испугается и сразу закроет статью, к тому же не поймет ничего. Так что есть предложение перенести пару этих постов в отдельную тему, например "Нюансы использования строк", "Строки для продвинутых" или что-то такое. А то тема переросла в что-то несистематическое и непонятное. Как будто выбросили хороший кусок посредине. И нет самого основного - работы со строками. По-моему, остается еще нераскрытый вопрос: арифметические операции с указателями в применении к строкам. То есть операции типа str++, (array+4)*... Void кстати показал хороший пример на эту тему, но раз у него сессия... Это сообщение отредактировал(а) kometa_triatlon - 31.5.2005, 22:18 -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Амортизатор |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 17.4.2005 Где: в Караганде Репутация: 1 Всего: 8 |
Черт, да я давно мечтал написать свой класс строк! Но еще больше мне хочется реализовать класс строковых списков. В vcl имеются очень грамотный и полезный класс TStringList, о мелкософтофский аналог CStringList, я извиняюсь, такое г-но, извращенная муть, что каждый раз при использовании этого д-ма руки чешутся написать свой класс, независящий ни от каких библиотек (кроме библиотеки С++ ес-но
-------------------- Поехали! |
|||
|
||||
| bel_nikita |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
А написали-то
Вставлю и я своих пять копеек ManiaK
З.Ы.: А вообще, новичку нужно использовать std::string дабы не грузить свою голову template'ами и т.д. и т.п. Всему свое время. Когда научится использовать std::string тогда и можно будет поговаривать о изучении и написании своего класса строки. |
||||||||
|
|||||||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
Это Борланд не есть гуд Borland SUXX Напишите про std::string!!! -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Тиха!
|
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 2 Всего: 6 |
ManiaK
Ну так и все, что ты написал и то, что пишешь, и то, что будешь писать, и то, о чем еще не знаешь - все ведь в книгах описано -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Тогда уж лучше убрать ссылку. Если мы не собираемся менять возвращаемое значение, то передавать по ссылке имеет смысл только большие структуры, а не примитивные типы. Соглашусь, что здесь const в передаваемом параметре нафиг не нужен. Не очень догнал красоты наследования класса строки от чего-то. Виртуальный деструктор добавляет таблицу виртуальных методов, а это еще +4 байта к классу. В большинстве случаев это приемлимо, но для класса строки по-моему излишне. Если хочется приладить свое управление памятью, то лучше создать allocator'ы на подобее STL'евских.
Лучше, конечно, такого вообще не упоминать, ибо Страуструп говорит, что не гарантируется, что для хранения указателя всегда хватит int'а. Но если упоминать, то лучше: "большинстве случаев любой указатель по размеру совпадает с int". Long - это вроде процессоронезависемый тип в отличие от int. И unsigned тоже не нужно - размер от этого не меняется. Unsigned - это просто указание компилятору как инерпиртировать содержимое, в большинстве случаев. -------------------- Волны гасят ветер... |
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
[offtop]
Да, точно, сглупил малость. unsigned/signed не суть важно когда говорим о размере. А вот конвертить поинтеры "лучше" все же в unsigned. Но long это еще ой-ой-ой как процессорозависимый тип. На x86 это 32 бита, на АМД64 - 64 бита. АМДшники же кажется придерживаются LP64 модели? А вот int АФАИР сейчас равен 32 битам как на x86, так и на AMD64. Единственное, не забываем про sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) [<= sizeof(long long) с недавних пор]. А вот [u]int8_t, [u]int16_t, [u]int32_t, [u]int64_t действительно процессорнезависимы. Да и Vim их к тому же по дефолту подсвечивает [/offtop] А теперь по топику - где работы со строками? АФАИР сейчас никто не пишет про сишные strXXX? Тогда, пожалуй я начну. Это сообщение отредактировал(а) Mayk - 2.6.2005, 19:10 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| PGsoft |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 30.5.2005 Где: Петербург Репутация: нет Всего: 1 |
И вообще, что за дела с этими строками?! То CString, то AnsiString, то char*.... Куда деваться от разнообразия?!
|
|||
|
||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
И? Я об этом в паре постов назад говорил. Просто лично мне к примеру значительно удобнее и проще побродить по форуму, чем ехать куда-то покупать какие-то книги. Я даже больше скажу: в инете уже есть всё, о чём я пишу и о чём я буду писать! И что это даёт? Загляни в репу ко мне - неужели ты думаешь, что Чип с Сергей.Z навешали мне просто так репейники? Значит оно надо! Не буду описывать зачем - лень Сейчас чуть времени малова-то. Допишу статьи позже... Добавлено @ 11:53
Некоторые, вроде Gepard'а, пишут свои классы. И ни в чём не проигрывают - свой класс можно всегда настроить под себя и тратить от того на программы значительно меньше времени. |
||||
|
|||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
ManiaK
MSVC: есть CString и std::basic_string Borland: есть AnsiString и std::basic_string Еще где-то: есть Что-то и std::basic_string У Вас: есть Что-то и std::basic_string Так может досточно знать std::basic_string? |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Твоё личное мнение, не забывай. Американцы тоже говорили Ираку: "Зашем вам строить какой-то режим, когды есть Демократия?" Результаты известны. А если серьёзно, зависит сильно от личности. У меня например от всего STL вообще la blavou . Я эстет даже в программировании и стиль, в котором написана эта библиотека мне очень напоминает то, как Си-шники пишут на языке Си++. И таких, как я, не так уж и мало. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
А то, что STL и la blavou, то мне кажется, просто напросто от незнания и нежелания |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Впервые в жизни слышу подобное утверждение -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Под словом стиль в данном случае подразумевается нечто иное. Вот это:
bel_nikita вы ошибаетесь, достаточно долгое время я программировал, используя эту библиотеку. |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Ребята, извините за критику, но на мой взгляд вы не тем занялись. Склеивание строк обсуждается в любом учебнике по программированию на С++. Там же можно найти и препроцессорный способ(операцией ##), и string, и использование strcat. Да в конце концов можно MSDN полистать.
На мой взгляд самый удoбный класс для работы со строками это QString, но это уже из другой оперы. -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Добавляет к data строку str. Добавлено @ 15:52 data определён как char* data в классе. -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
gepard
А зачем каждый раз вычислять strlen(str)? Я думаю одного раза будет достаточно И на вход нужно подавать conat char* str . Кажись ManiaK
Давайте возьмем std::string и ваш класс строки и сравним, где кривость дизайна проявиться Это сообщение отредактировал(а) bel_nikita - 9.6.2005, 16:10 |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Сниму шляпу перед тем, кто законкенатит быстрее.
Это сообщение отредактировал(а) Mayk - 9.6.2005, 16:49 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
ИМХО: Только мне кажется если есть класс String, то там можно хранить текущую длинну data, а не выполнять все время strlen(data)
|
|||
|
||||
| gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Верно. Просто версия старая. -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |