![]() |
|
![]() ![]() ![]() |
|
Dreamuchiy |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 26.12.2006 Репутация: нет Всего: -1 |
У меня такая проблема: Как сделать слово из частей или букв? Например если есть три переменные типа char s1='a', char s2 = 'b', char s3 = "c". Нужно что бы в Memo получилась строка вида "abc". Затем следущая строка с другим содержимым. Как вобще организовать вывод в Мемо любых символов друг за другом в строку или как сделать из нескольких переменных строку для вывода ее в Memo? Я пробовал использовать функцию strcat c с файлом string.h, но оно ваще не работает а строка была такая : strcat (s1,s2,s3) Не работает оно! Помогите плиз! Если не сложно то с комментариями
--------------------
Мечтаю написать в карман Биллу Гейтсу... Или как минимум посмотреть крах Майкрософт... |
|||
|
||||
586 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 57 Всего: 146 |
|
||||||
|
|||||||
Dreamuchiy |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 26.12.2006 Репутация: нет Всего: -1 |
последний вариант у меня не работает! Ошибка
--------------------
Мечтаю написать в карман Биллу Гейтсу... Или как минимум посмотреть крах Майкрософт... |
|||
|
||||
Rodman |
|
|||
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 7 Всего: 122 |
а через обычный плюс???
|
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 57 Всего: 146 |
||||
|
||||
Dreamuchiy |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 26.12.2006 Репутация: нет Всего: -1 |
Вот собственно прога с третим вариантом:
билдер указывает на строку char s[20]; --------------------
Мечтаю написать в карман Биллу Гейтсу... Или как минимум посмотреть крах Майкрософт... |
|||
|
||||
Dmi3ev |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 16 Всего: 41 |
надо поставить { перед char s[20]; тк функция начинается с {, а вы ее стерли ![]() -------------------- |
|||
|
||||
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Понятное дело, что поздно, но я нашёл тему случайно, значит и другие могут найти. Поэтому решил ответить на вопрос. Накидал несколько возможных вариантов.
К тому же не забывайте, что в Builder есть ещё целый ряд своих классов по типу AnsiString, UnicodeString и другие. Можете написать собственные классы. Можно на темплейтах соорудить что-нить. Можно написать универсальные функции или методы с неопределённым количесвтом параметров (...) и т.д. Проявите фантазию! Задача крайне элементарная и очень тривиальная! А автору хочу сказать, что прежде чем паниковать и писать "Ааа! Не работает оно! Помогите!", надо сначала просто внимательно изучить документацию, благо её много! Книги Страуструпа, Шилда, Кернигана и Ритчи и т.п. К тому же есть сайтик полезный: http://www.cplusplus.com/ strcpy имеет два параметра, так же как и strcat (а вы передавали ей три, притом, вас не интересовало в какую область памяти будет происходить копирование и какие типы данных вы ей передаёте). Если бы поискали, обнаружили что есть ещё sstream. Там всё ещё проще! Человек не пытался читать документацию, а сразу полез на форум. На форуме помогают решить проблему. А ваша лень и невнимательность - это проблема, которую на форуме помочь решить не могут. Надеюсь, сейчас вы более внимательны и вдумчивее читаете документацию. Если как-то задел вас - прошу прощения. Это сообщение отредактировал(а) Bodro - 21.6.2012, 16:25 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 3 Всего: 85 |
Похвально конечно. хотя в данном случае можно и вовсе не инициализировать. (не упоминал бы если бы не пропуск действительно необходимой инициализации, см. ниже) sizeof(char) - зачем? у вас много лишнего времени? sizeof(char) == 1 по определению. А где *(res + 3) = 0; Вот этого пропускать нельзя! Иначе программка может напечатать вам роман Л.Толстого "Война и Мир", с последующим выпадением в осадок. зачем (void) ? Излишняя тщательность (граничащая с параноей), И одновременно халатность, там где инициализация просто необходима. Добавлено через 1 минуту и 39 секунд Прошу прощения, за придирки. Что-то на меня нашло. Сорри. |
|||
|
||||
Bodro |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Вы, судя по всему, не очень хорошо знаете язык.
![]()
Например, тут описание calloc: http://www.cplusplus.com/reference/clibrary/cstdlib/calloc/ Тут malloc: http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/ Тут memset: http://www.cplusplus.com/reference/clibrary/cstring/memset/ Аналог кода с calloc можно написать так (malloc и memset):
По поводу (void) перед функциями, возвращающими значение. Дело в том, что некоторые компиляторы (например компилятор для процессоров на ядре SH4) сильно ругаются на это. Так же ругаться может gcc. По-стандарту, мы обязаны обработать значение, которое возвращает функция. Если мы этого не делаем, то должны явно указать что мы не собираемся использовать возвращающий результат. Борланду плевать на это, а другие компиляторы могут ругаться. Во многих библиотеках есть специальные макросы для этого, например, макрос в Qt: Q_UNUSED. Если вам не нравится (void) (иногда есть ситуации, когда компилятор ругается на (void), только несколько другими сообщениями - такое тоже может быть), можете использовать в С99 или в С++ такую функцию:
Всегда старайтесь писать код, чтобы при включённой опции компилятора -Wall или аналогичной полностью отсутствовали предупреждения. По поводу излишней инициализации. Открываем книгу ISBN 5-8459-0226-6, глава 27. Читаем полностью. Это, конечно, касается не C++, а C, но сути это не меняет. Герберт Шилдт очень хорошо описал правила проектировки программ на C. В том числе и о неоходимости явной инициализации локальных переменных. По поводу 0 вместо NULL. Читаем тут: ISBN 978-5-7989-0425-9 параграф 5.1.1. Это Б.Страуструп. Теперь по поводу sizeof(char) == 1 по-определению. Скажите мне, по какому такому определению? Лично я никогда не сталкивался с тем, что sizeof(char) больше 1, но это не означает что такого не может быть. Посмотрите на другие типы данных - int, long, long long, short. Они какие должны быть по-определению? Они от машины к машине, от компилятора к компилятору могут быть совершенно разные! В таких случаях лучше использовать stdint для явного указания размера. Это раз. А второе, указание sizeof(char) явно говорит человеку, читающему программу, что мы не просто выделяем какой-то блок данных, а что мы выделяем его именно для 4 символов. В данном случае это, конечно, не столь важно - пример крайне простой, но вот в более сложном и громозком коде это может существенно облегчить чтение и понимание программы. Скажем так, это просто хороший стиль написания. Хотя я не исключаю наличие систем с sizeof(char) отличным от 1. Споры затевать не надо на эту тему - свою позицию я объяснил. Когда вы будете писать кроссплатформенные, кросскомпиляторные отказоустойчивые системы, вы поймёте почему я делаю именно так. Вот где действительно можно сделать мне замечание, так это в присваивании, которое используется как логическое выражение. Читается не легко, а довольно проблематично. К тому же - это место потенциальной ошибки, но в данном конкретном примере такое допущение весьма применимо. Так же заметил, что в func8 перед printf забыл поставить (void). Вы согласны со мной? Это сообщение отредактировал(а) Bodro - 23.6.2012, 16:23 |
||||||
|
|||||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 3 Всего: 85 |
Bodro, по поводу calloc, и инициализации нулями, да вы правы.
|
||||
|
|||||
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Очень рад что наш разговор заставил вас заглянуть в стандарт C++11, к сожалению, в настоящее время мало кем поддерживаемым (я знаком только с gcc кто более или менее в полной мере его поддерживает). Больше, я так понимаю, добавить вам нечего?
Но по поводу стандарта вы совершенно правы - char не меняется ни в C ни в C++. Занимает ровно 1 байт. Он прописан во всех стандартах. Про sizeof(char) я уже написал достаточно - дело не только в стандарте, но ещё и в читабельности кода. К тому же, если вы опытный программист, то должны знать, что стандарт не поддерживает полностью практически ни один компилятор. Я уже об этом говорил, что я не встречал систему, где char занимал бы более чем 1 байт. Но это ни в коей мере не говорит о том что такого не может быть! Это просто хороший стиль написания кода! Если вы с ним не согласны - не используйте его - пишите просто 1. Никто вас не неволит - не вижу тут никакой ошибки. Вот в каждом форуме найдётся человек, который домотается до мелочей, а про суть ничего не скажет. Вам просто надо было показать что вы тоже многое знаете? Показали? Молодец. Я не сомневался что вы умный и талантливый человек. Я видел ваши ответы - очень грамотные и чёткие. Но, вместо того, чтобы искать соринки в моём коде (я так понимаю, мы выяснили что их там нет), лучше бы написали ещё в с десятка два примеров как реализовать конкатеницию символов. Это было б куда полезнее, чем пытаться развести тут холивар. К тому же, судя по всему, вы хорошо знаете C++11 - вот и привели бы примеры с замыканиями и лямбдой. Если вам хочется всё же продолжить данную тему, предлагаю перенести её в нашу личную беседу посредством личных сообщений. Но для начала вы попробуйте собрать представленный мной код на любой платформе и на любом компиляторе. Если будут проблемы - что-то упадёт или что-то не заработает - пишите! Буду рад обсудить с вами реальную интересную задачу. А тратить время на пустую болтовню считаю бессмысленной затеей. Вы, разве, не согласны? Предлагаю просто закрыть тему! К тому же ей уже 4 года! Я написал несколько примеров рабочего кода, проверил их. Код работает. Думаю, это главное для решения задачи. Модератор, для предотвращения холивара - закрывай тему. ![]() Это сообщение отредактировал(а) Bodro - 24.6.2012, 00:14 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 3 Всего: 85 |
Ну собственно в стандарте ISO/IEC 14882:1998, ISO/IEC 14882:2003, таже самая фраза. Цитировать не буду, можете посмотреть сами, она и там, под тем же самым номером 5.3.3. Или и стандарты 1998 и 2003 года тоже мало кем поддерживаются? просто sizeof измеряет размер в чарах, (чему бы не был равен чар!) сдедовательно sizeof (char) - это тафталогия. Bodro, нет! Меня просто раздразило излишнее многословие в вашем коде. (выдаваемое за кроссплатформенность) Не знаю почему, но меня это раздразило. Обычно я не вступаю в дискуссию по стилю написания, потому-что у каждого свой стиль. И лезть со своими мерками - моветон. |
|||
|
||||
Bodro |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 27.1.2006 Где: Россия, г. Рязань Репутация: 2 Всего: 4 |
Ok
|
|||
|
||||
Dem_max |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
Это же надо было такую дурацкую конструкцию придумать.
Компилятор уже будет знать размер на стадии компиляции. а вот calloc(4, sizeof(char)) выделение 4 байтов памяти это вообще пипец. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |