Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #90 : 23-01-2008 09:54 » |
|
А ты её в спайе включил? Там можно выбирать, какие сообщения отлавливать.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #91 : 23-01-2008 10:37 » |
|
я знаю, где они там выбираются, но там же список стандартных, а это не стандартное... В общем - я не понял, как в спае увидеть
---------- кстати, прикольную плюшку в Spy++ нашёл только что - окошко FindWindow - в нём нарисована иконка малюсенького окна, а в иконке - "прицел" , ежели этот прицел перетаскивать на окна - то они обводятся и хендл в окошке появляется )) А раньше я по списку искал ))
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #92 : 23-01-2008 11:46 » |
|
Как это не стандартное...
|
spy.gif (15.8 Кб - загружено 907 раз.)
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #93 : 23-01-2008 12:11 » |
|
ой... А сейчас запустил - усё видно. Я понял. Переработал )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #94 : 08-02-2008 12:24 » |
|
новый прикол (я в шоке) CString txt1; CString txt2; txt1="12345"; txt2=txt1;
в дебаге, в просмотрщике переменных, видно: txt1.m_pchData | 0x00422d6c "12345" txt2.m_pchData | 0x00422d6c "12345"
опачки... Это ведь если решим заменить какой нибудь символ в txt2 , то он и в txt1 заменится а я то всегда свято считал, что новый экземпляр создаётся и копируется в него из старого ----------------------- а вот так "правильно" получается - разные участки памяти CString txt1; CString txt2;
txt1="12345"; txt2.Format("%s",txt1);
------------------------ откуда вывод: если, работая с CString, хотишь поменять символы непосредственно в строке (а не просто пользоваться как "временной константой") то надо сделать копию через Format. А может какие то специальные операторы копирования у CString есть ? Я не нашёл...
|
|
« Последнее редактирование: 08-02-2008 12:36 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #95 : 08-02-2008 12:51 » |
|
во, нашёл способ
CString txt1; txt1="12345";
CString txt2; txt2+=txt1;
(учитывать только, что txt2 должен быть пустым до выполнения оператора +=)
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #96 : 08-02-2008 13:42 » |
|
Алексей1153++, По идее говоря, если ты в копии или в оригинале попытаешся изменить содержимое, оно должно прокопироваться по умолчанию на два отдельный объекта. А так экономия как бы памяти и времени. Хотя я с классом не знаком, ни могу сказать точный механизм.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #97 : 08-02-2008 13:55 » |
|
опачки... Это ведь если решим заменить какой нибудь символ в txt2 , то он и в txt1 заменится
А ты пробовал заменить? Теория считается верной (иногда), если подтверждается экспериментально. const CString& CString::operator=(const CString& stringSrc) { if (m_pchData != stringSrc.m_pchData) { if ((GetData()->nRefs < 0 && GetData() != _afxDataNil) || stringSrc.GetData()->nRefs < 0) { // actual copy necessary since one of the strings is locked AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData); } else { // can just copy references around <- твой случай Release(); ASSERT(stringSrc.GetData() != _afxDataNil); m_pchData = stringSrc.m_pchData; InterlockedIncrement(&GetData()->nRefs); } } return *this; }
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #98 : 08-02-2008 13:57 » |
|
Вить, всё правильно. Именно так и есть. До тех пор пока изменений не происходит строки АБСОЛЮТНО одинаковые. А если их использовать в дальнейшем без изменения? Зачем тогда в два раза больше места занимать?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #99 : 08-02-2008 14:18 » |
|
С другой стороны, зачем нужны две копии того же экземпляра класса, если их не изменять в последствии?
|
|
« Последнее редактирование: 08-02-2008 14:19 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #100 : 08-02-2008 14:27 » |
|
Да, но оператор присваивания об этом не знает. Ну а как пример - очень просто, ты передаёшь ссылку на второй экземпляр в некую функцию, по возвращению из которой сравниваешь объекты, поменялся второй или нет. В этом случае, если указатель на внутренний буфер не изменился, тебе даже не надо массивы сравнивать. Один сплошной выигрыш. Или?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #101 : 08-02-2008 18:49 » |
|
Да, но оператор присваивания об этом не знает.
Да, но компилятор-то знает.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #102 : 09-02-2008 07:07 » |
|
Джон, конечно я пробовал, так я и нашёл глюк. Когда работаешь с функциями класса CString - копия, похоже, создаётся, а вот такой пример: CString txt1; txt1="123.45.3445";
{ //используем txt2 как временный локальный буфер, //чтобы не менять txt1 (хотя глюк всё равно поменяет txt1)
CString txt2; txt2=txt1; strtok((char*)(const char*)txt2,".\r\n"); }
//вуаля: //txt1=="123\045.3445";
|
|
« Последнее редактирование: 09-02-2008 07:11 от Алексей1153++ »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #103 : 09-02-2008 07:16 » |
|
Алексей1153++, Ты используеш не по назначению класс. Скажи спасибо, что еше не получил переполнение буфера строки, со всеми вытикаюшими последствиями.С волками жить, по волчьи выть. Если используеш класс для инкрементации строки, так и используй только методы класса. Не нарушай принципа инкапсуляции.
|
|
« Последнее редактирование: 09-02-2008 07:21 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #104 : 09-02-2008 08:25 » |
|
Finch, я ничего не нарушал - размер буфера я не меняю, только заменяю символы. А кроме того - создаю временный объект, который тут же уничтожится после парса
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #105 : 09-02-2008 08:29 » |
|
Тебе сам класс говорит, что const char * он выдает. Ты потом насильно приводиш к просто char *. За твои насильные действия класс не отвечает. Т.е. вся ответственность ложится только на твои богатырские плечи.
|
|
« Последнее редактирование: 09-02-2008 08:30 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #106 : 09-02-2008 11:18 » |
|
это всё понятно. Только я поначалу думал, что копируется Теперь буду знать
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #107 : 11-02-2008 00:23 » |
|
Да, но оператор присваивания об этом не знает.
Да, но компилятор-то знает. О чём? О том, что произойдёт с этими с этими объектами ПОТОМ, будут они изменяться или нет? Откуда он это интересно знает? Только я поначалу думал, что копируется Копируется, Лёш, но только тогда, когда это становится нужным, а до тех пор экономится память.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #108 : 11-02-2008 11:25 » |
|
О чём? О том, что произойдёт с этими с этими объектами ПОТОМ, будут они изменяться или нет? Откуда он это интересно знает? В зависимости от контекста. В исходном примере были 2 локальные переменные с некой локальной операцией над ними и всё. В таком масштабе компиляторы обычно умеют оптимизировать код (хотя я не говорю, что gcc, или VC++, или интелловский компилятор это сделают). Вот с возвращаемыми функцией переменными уже сложнее - только если inline-функция, доступная в той же единице компиляции. Ещё сложнее с передаваемым функции параметром.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #109 : 11-02-2008 11:43 » |
|
передачу внутрь функции тозе опробовал - то же самое а вообще, зря разработчики так сделали, ежели мне захочется экономии памяти - я и так ссылку/указатель передам
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #110 : 11-02-2008 12:20 » |
|
dimka, пример вобще ничего не делает. Те даже с точки зрения оптимизации должен существовать только один объект - он и существует, один. А если например копия будет передаваться в ф-ю динамически подгружаемой библиотеки? Сам БГ те ГБ не в состоянии будет предсказать, что там с ней произойдёт. Поэтому оператор и не старается особо. Лёш, передача указателя/ссылки это не одно и тоже. А если в ф-ции всё-таки произойдут изменения объекта? CString txt1; CString txt2; txt1="12345"; txt2=txt1; MyFunction(&txt2); if(txt1.Compare(txt2)==0) { ... } Если MyFunction ничего не сделает с объектом (это можно элементарно установить, сравнив указатели m_pchData), то ты сэкономил память и дважды время.
|
|
« Последнее редактирование: 11-02-2008 12:22 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #111 : 04-04-2008 19:04 » |
|
класс CDatabase. Для запуска встроенной процедуры необходимо начать и завершить транзакцию , иначе процедура вроде бы вызывается, но ничего не делает. Пока допёр - весь нерв убил CDatabase* pBase=... (уже открытая база) ... ;
pBase->BeginTrans(); pBase->ExecuteSQL("execute procedure my_procedure(13)"); pBase->CommitTrans();
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #112 : 16-05-2008 05:05 » |
|
Конечно ничего не делает, может ты транзакцию потом откатить решишь... не пойму что тут удивительного, не нравится не открывай транзакцию, в тdоем примере это допустимо, если же там более одной SQL инструкции выполняется, тогда транзакцию оставь, но и коммитить ее не забывать.
А дискусия по поводу CString вообще не понятна особенно если обратить внимание на std::string, там все тоже самое, более того описание и акценттрование внимания есть в Effective STL (или more ... точно не помню). Передача же указателя (если надо только почитать) не рулит, например если передавать указатель только для чтения, то надо клиенту точно знать жив ли еще объект строки или нет (может сам объект уже грохнули), а вот если создать новый объект строки, который имеет тот же буфер и веждет подсчет ссылок этого буфера и следит за изменениями содержания буфера все очень хорошо, при уничтожении оригинальной строки наш клиент располагает вполне корректной строкой, которая самоликвидируется при выходе клиентского объекта строки из области видимости.
А от насилия пушистого над строкой я посмеялся от души (char *)(const char *)bubu ))) спасибо.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #113 : 17-05-2008 07:43 » |
|
lapulya, Конечно ничего не делает, может ты транзакцию потом откатить решишь... не пойму что тут удивительного, не нравится не открывай транзакцию, в тdоем примере это допустимо, если же там более одной SQL инструкции выполняется, тогда транзакцию оставь, но и коммитить ее не забывать.
автокоммит включен. Другие то запросы (например Update) без явного коммита выполняются - и ничё , не ждут, откачу я их или нет Транзакцию я не начинал в первом случае, если ты не обратил внимание А дискусия по поводу CString вообще не понятна особенно если обратить внимание на std::string,
дойдя до "std::string" нашёл для себя это предложение бессмысленным, ибо не пользуюсь А от насилия над строкой я посмеялся от души (char *)(const char *)bubu ))) спасибо.
а поясни причину смеха, мне даже интересно поcлушать
ладно, теперь другая заморочка опять вопрос - кто переработал, я или компилятор ? вот такой у меня кусок кода (для вопроса неважно, что он делает) unsigned __int64 qw=0;
//заполнение qw , для примера - от балды qw=0x12345;
//сделать из тетрад число DWORD dwdPrev1=0; dwdPrev1=(DWORD)qw; qw=0;
for(;;) { if(!dwdPrev1)break; qw+= (*(7+(BYTE*)&dwdPrev1) >>4); //<<==== ТУТ qw*=10;
if(!dwdPrev1)break; qw+= (*(7+(BYTE*)&dwdPrev1) & 0xf); qw*=10; dwdPrev1<<=8; }
компилятор VC++6 говорит warning C4700: local variable 'dwdPrev1' used without having been initialized чё за бред ? даже под отладчиком глянул - всё но, зараза, инициализирован
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #114 : 17-05-2008 09:00 » |
|
qw+= (*(7+(BYTE*)&dwdPrev1) >>4);
Ну вполне обоснованные притензии. (BYTE*)&dwdPrev1 приводиш к указателю на BYTE, затем даеш смешение на 7 байт и береш значение из полученного указателя на BYTE. Сам компилятор совсем не знает, что там находится. Так как скорее всего твои навароты еше и оптимизирует.
|
|
« Последнее редактирование: 17-05-2008 09:02 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #115 : 17-05-2008 11:13 » |
|
to Алексей1153++ Транзакцию я не начинал в первом случае, если ты не обратил внимание может я чего пропустил, во вопрос по работе с БД у меня один и там же ссылка на код вот он CDatabase* pBase=... (уже открытая база) ... ;
pBase->BeginTrans(); pBase->ExecuteSQL("execute procedure my_procedure(13)"); pBase->CommitTrans(); Тут открывается транзакция (явно), пока ее не закоммитишь, ничего в базе меняться не будет (при любых запросах, да же при update ))) ) Ну а твои издевательства над строкой и потом искреннее удивление почему у меня во втором объекте строки что-то поменялось и типа вывод "Ага!!! не работает!!!" ну или что-то в этом роде (без обид). Сродни тому что я когда то писал тут на форуме про возвращение приведенного объекта с примерно следующим примером int i = 10;
class MyWindow : public CWnd { CWnd * getWnd(); };
CWnd * MyWindow::getWnd() { return (CWnd *)i; }
компилится, но не работает
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #116 : 17-05-2008 14:29 » |
|
Finch, упс , точно ))) Там 3 должно быть, это значит я заработался всё же Всплыло бы, когда тестировать начал ))
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #117 : 18-05-2008 13:32 » |
|
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #118 : 29-05-2008 18:20 » |
|
недавно в MS Paint нашёл такую фишку: если зажать Ctrl , то клавишами "+" и "-" можно точно менять толщину ЛЮБОГО инструмента ) Но самое главное не это, а то, что это же самое работает в редакторе ресурсов Visual Studio! Только с шифтом. И точнее - при работе с иконками и растром
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #119 : 27-06-2008 07:45 » |
|
является ли символ SP_Undo каким то зарезервированным в студии №6 ?
4 часа долбился и искал причину такого фокуса: при отладке (на и , видимо, в рантайме) эта переменная int SP_Undo иногда начинала с каждой командой ассемблера (неважно где код исполняется) уменьшаться на 1 (альт+8 - шагал в режима дизассемблера) , при чём код совершенно не затрагивал переменную , ставил break point на изменение памяти на месте переменной
тупо переименовал в SP_Undo7 и стало всё ок
|
|
« Последнее редактирование: 27-06-2008 12:35 от Алексей1153++ »
|
Записан
|
|
|
|
|