Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Visual C++

Автор: last_wish
Дата сообщения: 10.05.2007 01:13
vshersh
ИМХО ты создаешь внутри цикла два достаточно больших объекта типа string - за КАЖДЫЙ проход цикла
попробуй вынести объявление string name и value за цикл, а внутри делай простое присвоение
Автор: vshersh
Дата сообщения: 10.05.2007 09:17
gorthaur

Цитата:
Скорее всего, дело в скорости обращения к членам IXMLDOMNodePtr , т.е. в моменте node->nodeName

По-моему как-раз наоборот! Проблема в конвертации!

last_wish
Я думаю любой оптимизатор вынесет объявление за пределы цикла...

Автор: last_wish
Дата сообщения: 10.05.2007 12:22
vshersh
Моё дело предложить
Специально проверил для Mingw (все уровни оптимизации), и для release в ms vc++ 6.0, оптимизации нет
Автор: vshersh
Дата сообщения: 10.05.2007 12:47
last_wish
Просто я тоже проверил - конвертится все-равно медленно (при выше описанных условиях). Насчет оптимизатора - лишь мое предположение.
Или у тебя при этом финте обработка происходит быстрее?
Автор: Qraizer
Дата сообщения: 10.05.2007 13:07
vshersh
С какой стати он будет их выносить? Они ж конструируются внутри цикла значениями, которые определяются тоже внутри цикла. Плюс ещё область видимости...
last_wish
Для vc++ 6.0 не советую использовать родную STL. Во-первых, она образца 1995-го года - стандарт же ратифицирован в 1998-м. Во-вторых, она местами жутко не оптимальна, в вопросах перераспределения памяти под стораджи контейнеров в частности. Для него лучше юзать какой-нибудь STLPort.
Автор: last_wish
Дата сообщения: 10.05.2007 13:09
vshersh
Тестил так:
Код: #include <iostream>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
string str;
int strt=GetTickCount();
for (int i=0; i<100;i++)
for(int j=0; j<100;j++)
for(int k=0; k<1000;k++)
string str="HI";
//str="HI"; <-поменял на это
cout << GetTickCount()-strt << endl;
cin.get();
}
Автор: vshersh
Дата сообщения: 10.05.2007 14:17
Qraizer

Цитата:
Плюс ещё область видимости...

согласен - глупость сказал...

last_wish
Все-таки в твоем цикле string конструируется 100 * 100 * 1000 = 10 лимонов раз, а в условиях исходной задачи ~ до 100 тыс. раз, как я понял а это очень большая разница.
Автор: gorthaur
Дата сообщения: 10.05.2007 15:24
Только что ради интереса проделал тест. В цикле миллион раз преобразовал строку из _bstr_t в std::string. Летает. Меньше секунды.
Автор: Qraizer
Дата сообщения: 11.05.2007 14:27
Опять-таки простые случаи компилятор может лучше оптимизировать, размернуть цикл например, проинлайнить вызовы, а то и вообще отдецимировать тело цикла, где по его мнению нету полезного действия. Сравнивать лучше на рабочем коде, а не на отдельных простых примерах.
Автор: gorthaur
Дата сообщения: 11.05.2007 14:39
Проблема оказалась всё-таки в nptr->text. Плюнул на него, достаю текст из XML, юзая nptr->xml. Замечательно работает. В чём была проблема не представляю
Автор: Elf23
Дата сообщения: 14.05.2007 12:30
Люди пожалуйста помогите написать парсер !!!! Необходимо чтобы в пересенную записывался путь файла.

Добавлено:
Или хотя бы подскажите сайт где нормально написано про Visual C++ WinForms .
Автор: vshersh
Дата сообщения: 14.05.2007 12:44
Elf23
Сам понял, что написал?

Цитата:
Необходимо чтобы в пересенную записывался путь файла.

Если путь исполняемого файла, то например так:

Код:
#include <windows.h>

int main(int argc, char* argv[])
{
    char self[MAX_PATH];
    GetModuleFileNameA(NULL, self, MAX_PATH);
    printf(self);
    return 0;
}
Автор: xC6nU38PfH
Дата сообщения: 21.05.2007 16:08
Люди добрые. Помогите добыть компилятор из Microsoft Visual Studio. NET 2002! Интересуюсь программированием компьютерных игр, но программы из книги, которые у меня есть могут компилироваться только этим менее требовательным компилятором. Даже похожий Visual C++ 6.0 слишком придирчив.
Автор: Qraizer
Дата сообщения: 21.05.2007 21:27
Замени "... менее требовательным компилятором. Даже похожий Visual C++ 6.0 слишком придирчив." на "... компилятором, соответствующим современному стандарту языка. А то Visual C++ 6.0 вышел в свет за полгода до ратификации настоящего стандарта, поэтому не подходит", что более правильно. А вообще, что тебе мешает юзать MSVC 2003 или 2005? Ссылок - лопатой греби хоть из google-а, хоть из yandex-а. Почему именно 2002? Эта "бета", насколько я помню, быстренько пропатчилась и превратилась в 2003. И вообще, что именно не компилится, приведи примеры, плз.
Автор: xC6nU38PfH
Дата сообщения: 22.05.2007 10:40
Проблема вот в чем:
На следующие строчки кода:
console->>r_script_name.clear();
console->>r_script.clear();
cmd.clear();
cmd.clear();

Visual C++ 6.0 после компиляции отреагировал так:


c:\program files\nvidia
corporation\nvsdk\opengl\include\glh\glh_glut_ext.h(285) : error
C2039: 'clear' : is not a member of 'basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >'

c:\program files\nvidia
corporation\nvsdk\opengl\include\glh\glh_glut_ext.h(787) : error
C2039: 'clear' : is not a member of 'basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >'

c:\program files\nvidia
corporation\nvsdk\opengl\include\glh\glh_glut_ext.h(961) : error
C2039: 'clear' : is not a member of 'basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >'

По совету автора книги: ”Open GL профессиональное программирование
Трехмерной графики на С++ ” Сергея Гайдукова объяснившего, что : "похоже в Visual C++ 6 класс string не поддерживает метод clear ”, заменил:

console->>r_script_name="";
console->>r_script="";
cmd = "" ;
cmd = "" ;
Компилятору не понравилась строка:
console->r_script="";
Сергей ответил так:
Похоже в 6-й студии класс list не поддерживает метод clear. Попробуте
заменить его на что-то вроде следущего кода:

console->r_script.erase(console->r_script.begin(), console->r_script.end());


Пробовал:
Две первые строки заменил на:
console->r_script.erase(console->r_script.begin(),
console->r_script.end());
А третью строку на:
cmd="";
А 4 оставил без изменения:
cmd.clear();
После компиляции :

c:\program files\nvidia
corporation\nvsdk\opengl\include\glh\glh_glut_ext.h(961) : error
C2039: 'clear' : is not a member of 'basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >'
Error executing cl.exe.

3.exe - 1 error(s), 54 warning(s)
При замене же последней строчки на:
cmd=""; компилятор впал в транс бесконечных циклов

Автор книги утверждает, что с прочими Visual ничего не выйдет, а этот код для С++ 6.0
так и не смог доработать.
Автор: WiseAlex
Дата сообщения: 22.05.2007 12:53
xC6nU38PfH
на vc6 у тебя все сервис паки стоят?
Автор: Qraizer
Дата сообщения: 22.05.2007 12:59
xC6nU38PfH
Значит, я не ошибся в формулировке предыдущего поста. STL у VC6 соответстующая.
Автор: xC6nU38PfH
Дата сообщения: 22.05.2007 16:56
Обновлял до С++ 6.5 с тем же результатом, а вот конкретно SP не ставил.
Можно поискать. Да и Visual Studio 2003, 2005 попробую использовать. Спасибо за поддержку!
Автор: DrHead
Дата сообщения: 23.05.2007 22:06
Возможно нужно было в раздел winapi

Как можно получить список обнаруженных беспроводных сетей в winxp?
Автор: Ariets
Дата сообщения: 24.05.2007 19:51
Стоит задача под MFC : построить график использования оперативной памяти, на манер такого, как в диспетчере задач...Но возникла проблема - как перед созданием новой точки графика сдвинуть на 1 пиксель уже отрисованное? (сымитировать движение графика)..Моя идея : делать некий "скриншот" области формы и сдвигать его, но какими функциями такое сделать??
Возможно есть другие способы, подскажите как правильно?
Автор: Abs62
Дата сообщения: 24.05.2007 21:48
Ariets
Посмотри функцию BitBlt.
Автор: RealDemyan
Дата сообщения: 23.07.2007 12:06
Использую библиотеку ming c www.ming.sourceforge.net. То есть пытаюсь использовать. Компилятор выдает кучу ошибок в духе:
test.obj : error LNK2028: unresolved token (0A0000A5) "extern "C" void __clrcall SWFMovie_setNumberOfFrames(struct SWFMovie_s *,int)" (?SWFMovie_setNumberOfFrames@@$$J0YMXPAUSWFMovie_s@@H@Z) referenced in function "public: void __clrcall SWFMovie::setFrames(int)" (?setFrames@SWFMovie@@$$FQAMXH@Z)
Как заставить работать?
Автор: Qraizer
Дата сообщения: 23.07.2007 12:29

Цитата:
error LNK2028: unresolved token (0A0000A5) "extern "C" void __clrcall SWFMovie_setNumberOfFrames(struct SWFMovie_s *,int)" (?SWFMovie_setNumberOfFrames@@$$J0YMXPAUSWFMovie_s@@H@Z) referenced in function "public: void __clrcall SWFMovie::setFrames(int)" (?setFrames@SWFMovie@@$$FQAMXH@Z)
Это не компилятор, это линкер. Библиотеки ему не хватает.
Автор: RealDemyan
Дата сообщения: 23.07.2007 14:37
Qraizer
Ну да линкер. Добавил в проект *.cpp файлы - таких ошибок больше нет. Зато 209 других всяких ошибок, типа "не знаю что такое malloc", "не знаю что такое parseSWF_DEFINEBITS", пропущена ; после SWFParseFunc (это тип) перед parser (это поле)" и т.д.


Добавлено:
Кто нить,вообще встречался с этой библотекой? Поделитесь опытом, pls. Очень надо.
Автор: Qraizer
Дата сообщения: 24.07.2007 14:22
Я так понимаю, это параллельна ветка от Простейший Flash-редактор своими руками?
Автор: RealDemyan
Дата сообщения: 24.07.2007 23:52
Типа того. Столкнулся с проблемой в вижуал плюсах, решил здесь спросить. может кто знает.
Автор: RealDemyan
Дата сообщения: 17.08.2007 16:01
Нужна помощь:
Необходимо передать в метод класса указатель на вектор (vector)
Делаю так:

...
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
     Image image1=(L"I.gif");
     vector <Image *> storage;
     storage.push_back(&image1);
     VC->SetImgs(&storage);
...

void CVideoControl::SetImgs(vector <Image *> *storage)
{
     imgs=storage;
}


void CVideoControl::OnPaint()
{
...
     HDC hdc;
     HWND hWnd;
    hWnd=p_Video->m_hWnd;
     PAINTSTRUCT ps;
     hdc = ::BeginPaint(hWnd, &ps);
     Graphics g(hdc);
g.SetPageUnit(UnitPixel);
     RectF bounds(2, 2,14,14);
     g.DrawImage(*(imgs->begin()), bounds);
...
     }

Приложение вылетает во время выполнения. Видимо проблема с доступом к полям и методам Image. Кроме того при отладке на строке

g.DrawImage(*(imgs->begin()), bounds);

у imgs[0] LastResult равен "чему-то там непонятному". Хотя после

imgs=storage;

он "OK".

В чем ошибка? Пробовал передавать не указатель, а сам vector - тоже не работает. Пробовал сделать storage внешним и в методе использовать его сам, все равно не помогает.

Подскажите, пожалуйста, что надо делать в этой ситуации.
(MS VC++, MFC, GDI+, vector)
Автор: N28E88O
Дата сообщения: 09.09.2007 10:58
Скажите пожалуйста, как пользоваться компонентом EditBox , Check Box, ListBox в Visual C++ 6.0! Какие команды нужно написать, чтоб текст из EditBox заносился в ListBox !
И еще нужно создать 5 групп элементов управления.
1-    я группа состоит из элемента editbox, combobox и button. Работа с ней должна осуществляться следующим образом: пользователь заносит текст в editbox, затем нажимает элемент button, после чего текст из editbox заносится в элемент combobox.
2-    я группа состоит из элементов editbox, button, button1. Работа с ней должна осуществляться следующим образом: пользователь заносит текст в editbox, затем нажимает элемент button, после чего текст из editbox отображается на элементе button1, таким образом, что размер кнопки соответствует размеру текста помещаемого на неё, соответственно при уменьшении или при увеличении размеров текста кнопка должна увеличиться или уменьшиться.
3-    я группа состоит из элементов editbox, button, radiobutton1, radiobutton2, radiobutton3. Работа с ней должна осуществляться следующим образом: пользователь заносит имена элементов radiobutton в editbox, затем нажимает элемент button, после чего соответствующий элемент помечается, причем со всех остальных пометки должны сниматься, при повторном нажатии на button метка radiobutton не должна исчезать.
4-    я группа состоит из элементов editbox, button, checkbox1, checkbox 2, checkbox3. Работа с ней должна осуществляться следующим образом: пользователь заносит имена элементов checkbox в editbox, затем нажимает элемент button, после чего соответствующий элемент помечается.
5-    я группа состоит из элементов editbox,button1,button2,button3,listview(listview – состоит из двух столбцов). Работа с ней должна осуществляться следующим образом: пользователь заносит текст в editbox, затем нажимает элемент button1, после чего текст из editbox заносится в первый столбец элемента listview, затем нажимает элемент button2 после чего выделенный текст из первого столбца listview заносится во второй столбец элемента listview, затем нажимает элемент button2 после чего выделенный текст из второго столбца listview заносится в первый столбец элемента listview.


Автор: Mickey_from_nsk
Дата сообщения: 10.09.2007 12:43
RealDemyan

Цитата:
Image image1=(L"I.gif");
vector <Image *> storage;
storage.push_back(&image1);


Как ты думаешь, где у тебя этот Image лежит то? Если ты думаешь, что в куче - глубоко ошибаешься. Он, как грится, при выходе из функции давно тю-тю.
Автор: Qraizer
Дата сообщения: 10.09.2007 12:44
RealDemyanТы уверен, что на момент использования этого вектора он уже заполнен?

Страницы: 123456789

Предыдущая тема: MSAgent - как получить указатель на MS Balloon?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.