Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+4 невидимых) |
eXeL@B —› Программирование —› ламерский вопрос по СИ++ |
Посл.ответ | Сообщение |
|
Создано: 04 мая 2008 14:29 · Поправил: locker_fx · Личное сообщение · #1 Привет всем! Заранее приношу свои извинения за тупейший вопрос. Решил попробовать написать что-нибудь на СИ(обычно пишу на Делфи), это можно сказать первый опыт. Вобщем переклинило меня и ни в какую не могу найти ошибку(весь хелп перерыл, гугл тоже...жопа): вот кусок кода: ---------- string str; cin >> str; int j=3; str=str.substr(0,j)+str.substr(j+1,str.length()-j); cout << str; ---------- введём к примеру qwerty на выходе должно быть qwety а выводится qwety0 Как я с ним не долбался...Подскажите, пожалуйста, как избавится от 0-я в конце? Ещё раз прошу прощения за тупейший вопрос, ну переклинило меня, с кем не бывает? ----- моя подпись! |
|
Создано: 04 мая 2008 14:32 · Личное сообщение · #2 |
|
Создано: 04 мая 2008 14:34 · Личное сообщение · #3 |
|
Создано: 04 мая 2008 14:37 · Поправил: El_Diablo · Личное сообщение · #4 |
|
Создано: 04 мая 2008 14:40 · Личное сообщение · #5 |
|
Создано: 04 мая 2008 15:52 · Личное сообщение · #6 |
|
Создано: 04 мая 2008 19:30 · Личное сообщение · #7 El_Diablo пишет: P.S.: странно, но у меня без нуля нормально выводится Тоже все гуд работает locker_fx Попробуй такой скомпиль #include<stdio.h> #include <string> #include <iostream> using namespace std; int main(int argc, char *arg[]) { string inString; string outString; cin >> inString; int j=3; outString = inString.substr(0,j) + inString.substr(j+1,inString.length()-j); cout << outString; return 0; } ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 04 мая 2008 20:34 · Поправил: S_T_A_S_ · Личное сообщение · #8 |
|
Создано: 05 мая 2008 19:34 · Личное сообщение · #9 2 ALL: ппц...сегодня всё работает. и старый код и предложенные вариации с std. код не менял, просто вчера сохранил и закрыл, а сегодня открыл и запустил. S_T_A_S_ пишет: '0' не должно быть ни при каких обстоятельствах, ищи ошибку в другом месте. ноль пропал. насчёт другого места - вырезал весь лишний код. S_T_A_S_ пишет: PS только это оверхед жуткий, лучше использовать erase() ок, заюзаем ирэйз. Всем спасибо! Но тайна глюка осталась тайной ----- моя подпись! |
|
Создано: 05 мая 2008 20:11 · Личное сообщение · #10 |
|
Создано: 05 мая 2008 21:04 · Личное сообщение · #11 locker_fx пишет: Но тайна глюка осталась тайной Да тут никакой тайны нет, таких топиков много на сайтах по C/C++ Обычно они заканчиваются - утром встал, ничего не менял, все скомпилилось и работает Всем спасибо %) А вообще там ноль мог появиццо, если его туда специально только в конце записать Потому как "класс basic_string(string)" создаст новый пустой буфер, метод substr выполнит все нужные действия и результат запишет в этот только что созданый буфер (qwety), а старый буфер удалит(qwerty) В MSDN есть целый раздел(называеццо "basic_string Members") с функами(свойствами/методами) для работы со строками (там их около 50-ти) и есть маленькие готовые примеры кода А вообще на будущее можно просто в окне редактора Visual Studio установить бряк В проекте установить режим debug и нажать F5 Вызовется отладчик студии остановиццо на бряке и дальше трейсишь прямо по исходнику(F10/F11) и в окне Locals (Ctrl+D+L) можно видеть результаты, которые будут в твоих переменных типа str, j и т. д. (будет получаццо типа как в C#) %) ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 06 мая 2008 07:22 · Личное сообщение · #12 substr буферов не удаляет (и не може, т.к функция константная) код примерно равносилен такому: { string tmp1(str, 0, j); string tmp2(str, j+1); str = tmp1 + tmp2; // вот здесь старый буфер str мог быть реаллоцирован, если бы результат не поместился } // будут удалены tmp - из-за них и оверхед (а так же еще из-за временного объекта в + выше) Короче std::string - полная *опа эффкетивности, по MSDN с ними как следует работать не научишся, лучше почитать какую-ниь книжку где про это есть... или смотреть сорцы Хотя говорят что 5й STLPort всё хитро заоптимизирует.. s0larian пишет: убирай все сгенерировынные файлы когда копаешь такую ситуёвину +1. в студии даже специальная команда для этого есть - rebuild all, вроде |
|
Создано: 06 мая 2008 19:23 · Личное сообщение · #13 s0larian пишет: locker_fx, может ты просто не перекомпилил .exe или глючнул IDE и всё время линковал старый .obj? Такое бывает - убирай все сгенерировынные файлы когда копаешь такую ситуёвину. Похоже на правду. Если честно меня Борланд СИ++ билдер просто убивает, косяк на косяке...Но благо обходы предыдуших багов нагуглил, а с этим никак не мог, поэтому к Вам и обратился. Юзаю делфи не один год глюков вроде не было(тьфу-тьфу-тьфу). Неужели Борланд под делфи ИДЕ смогла нормальный сделать, а под СИ слабо? ----- моя подпись! |
|
Создано: 06 мая 2008 20:22 · Личное сообщение · #14 |
|
Создано: 06 мая 2008 22:25 · Личное сообщение · #15 S_T_A_S_ пишет: функция константная Хз.. ИМХО вот так, скорее всего, будет в VS(а как там в Борланде, хз) string tmp1(str, 0, j); string tmp2(str, j+1); string tmp3 = tmp1 + tmp2; delete tmp1, tmp2, str return tmp3 //(str) вроде как все преобразования со строками осуществляются только с копиями строк(но может я и ошибаюсь) ну да ладно хс. Все равно убогая реализация класса basic_string получается ИМХО S_T_A_S_ пишет: по MSDN с ними как следует работать не научишся да эт точно, MSDN тут мимотазика, также как и VS... [offtop] S_T_A_S_ пишет: или смотреть сорцы хз.. Лично нет желания, да и вообще я протефф ООП по крайней мере, в какой оно форме сейчас, если конечно тупо формочки клепать или проектик за пару десятков мину сбацать, то тут - о дааа ООП рулит %)(и то, это касается общих задач, а под конкретные надо писать все самому и ручками) помню, читал туториал по OllyScript(вернее перевод vnekrilov`а ) у него переведено: BPHWS, режим // Скрипт активизирует аппаратную breakpoint с режимом // чтение, запись, выполнение (r, w, x). // Типы режима r, w, x Так вот думаю, а откуда там появилось r(чтение), вроде должно быть rw, но никак не r На железку можно ведь ставить только w, rw, x(port I/O в данном случае опускается..) порылся в исходнике и точно #define HB_ACCESS 2 // Active on read/write access string str1; if(str1 == "r") type = HB_ACCESS; Sethardwarebreakpoint(dw1, 1, type); И вот увидел этот самый string str1, прикинул сколько лишнего кода и чет вообще руки опустились А ведь движок выполняется в цикле отсюда и тормоза Но применение string в данном случае вроде как оправдано, меньше кодить надо(да и удобнее) S_T_A_S_ пишет: всё хитро заоптимизирует Много кода все равно не заоптимизируешь, чтобы он меньше стал - ИМХО Да и у тебя проект интересный есть, хоть и опенсорсный, но сильно в нем много "прибамбасов" от C++ Если бы, ты его сделал на СИ, было бы вообще гуд - ИМХО [/offtop] ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 06 мая 2008 22:46 · Поправил: reversecode · Личное сообщение · #16 |
|
Создано: 07 мая 2008 04:28 · Личное сообщение · #17 locker_fx Может это и субьективно, но в C++ Builder 6 как-то давно столкнулся с багом логических операций (смотрел тогда в отладчике по отдельности на параметры в момент сравнения и на переход в итоге), с тех пор для быстрой разработки с GUI использую C++ Builder 5, и вроде проблем за 6 лет не всплывало ----- DREAMS CALL US |
|
Создано: 08 мая 2008 20:23 · Личное сообщение · #18 Немного не в тему, но про кривость борланда. А может мою. Скажите, почему в С параметр метода - указатель на объект (this), а в дельфи - объект self, причем адрес последнего ничуть не напоминает первого. Он в стеке. И когда я его возвращал рекурсивным поиском, программа крашилась. Но тем не менее self.member := value нормально работает. Как это? Я не очень понял и ввел доп. поле в объект с его адресом. Тогда все заработало. Вот скажите, где я дурак? |
|
Создано: 08 мая 2008 21:00 · Поправил: s0larian · Личное сообщение · #19 Сравнивать Delphi и С++ мало смысла... В C++ "this" это аргумент (всегда на стеке):
"This" это просто указатель на данные. Объект (instance) может быть "on the stack" или "in the heap". Приколы начинаются когда вызываешь виртуальные методы. Читай "Thinking in С++" - бесплатная книжка. |
|
Создано: 10 мая 2008 21:03 · Личное сообщение · #20 s0larian пишет: locker_fx, а вот и holy war... Скажу только вот что - у Borland протосто старинный убогий компилер, не сравнить даже с g++. У Microsoft компильер и быстрый и поддерживает, вроде, весь ISO C++ standard, ну а Intel генерит очень быстрый код. Уже поставил себе вижуал студию 2003. Скоро серьёзный проект намечается, скорее всего в ней и буду делать. А что под линь порекомендуете? ----- моя подпись! |
|
Создано: 11 мая 2008 00:15 · Личное сообщение · #21 |
|
Создано: 11 мая 2008 08:54 · Личное сообщение · #22 =TS= пишет: в C++ Builder 6 как-то давно столкнулся с багом логических операций да, было у меня нечто подобное. я просто прогу переделал и заработало, а на сей факт просто забил. Оказывается не у меня одного такие баги. У меня там ещё пачка регулярных багов в ИДЕ... El_Diablo пишет: компилер gcc а версию самую последнюю? ----- моя подпись! |
|
Создано: 11 мая 2008 09:14 · Личное сообщение · #23 |
eXeL@B —› Программирование —› ламерский вопрос по СИ++ |