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

» Вопросы по программированию на C/С++

Автор: CrackMe
Дата сообщения: 29.10.2006 16:47
понимаю что более ламерского вопроса чем я задам нельзя найти но, такова жизнь ops:
как созадть проект консольной проги на c++ в microsoft visual c++ 6 enterprise?
А то у меня поллучается всё без подсветки синтаксиса
Зарарнее спсибо
Автор: vshersh
Дата сообщения: 30.10.2006 09:29
CrackMe
А как связана проблема подсветки синтаксиса с проблемой "созадть проект консольной проги"?
Для создания: File -> New... -> Win32 console application ...
Для подсветки синтаксиса - ставим, например Visual Assist, который можно найти здесь
Автор: FireZone
Дата сообщения: 30.10.2006 10:53
CrackMe
Возможно, не включил в проект те самые файлы, в которых нет подсветки.
Автор: makkonen
Дата сообщения: 30.10.2006 21:45
Извините, может пишу не туда. Тему новую создавать не хочу их итак много. Вобщем излагаю проблему. Я новис плиз хелп. У меня итеративно с бектрекингом используется кодирование фигуры. Там применяются преобразования к каждой точке. всего их 16(преобразований) На 4 итерации вылетает ошибка stek overflow (вроде так, сори если неправильно написал, знающие поймут) Вобщем вопрос. Как избавится от этой бяки? Можно как-нить почистить стек системный? Просто когда выполнил 1 итерацию, уже нет необходимости держать инфу ней. Понимаю, что это не очень хороший стиль программирования, и не надо говорить об этом, я и сам понимаю. Жду возможные решения. Спасибо...
ПыСы. Написал сначала тут http://forum.ru-board.com/topic.cgi?forum=33&topic=6416&start=40#lt сглупил,модеры, почистите
Автор: KADABRA
Дата сообщения: 31.10.2006 08:54
makkonen
Храни данные в куче, а не в стеке, и удаляй, когда не нужны будут.
Автор: makkonen
Дата сообщения: 31.10.2006 10:19
KADABRA
Так и храним на каждом шаге данные в виде массива 3на2.А потом как бы переприсваиваем. Откуда там такие глюки ваще понять не могу. Мое предположение-переполняется стек, который не чистится во время выполнения программы. Стек системный,где промежуточные значения хранятся.
Автор: KADABRA
Дата сообщения: 31.10.2006 11:12
makkonen
Без кода трудно понять. Рекусивные функции не используются?
Автор: makkonen
Дата сообщения: 31.10.2006 12:57
void Tmainform::pr()
{
mas[it][0]=x;
mas[it][1]=y;
mas[it][2]=fl;
if(it<h)
{
if(mas[it][2]==1)
{it++;fl=1;pr();}
if(mas[it][2]==2)
{x=x-64/pow(4,it);y=y+64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==3)
{y=y+64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==4)
{x=x+64/pow(4,it);y=y+64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==5)
{x=x+2*64/pow(4,it);y=y+64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==6)
{x=x+2*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==7)
{x=x+2*64/pow(4,it);y=y-64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==8)
{x=x+3*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==9)
{x=x+64/pow(4,it);y=y+2*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==10)
{x=x+2*64/pow(4,it);y=y+2*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==11)
{x=x+3*64/pow(4,it);y=y+2*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==12)
{x=x+4*64/pow(4,it);y=y+2*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==13)
{x=x+3*64/pow(4,it);y=y+3*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==14)
{x=x+64/pow(4,it);y=y+3*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==15)
{y=y+3*64/pow(4,it);it++;fl=1;pr();}
if(mas[it][2]==16)
{x=x+64/pow(4,it);y=y+4*64/pow(4,it);it++;fl=1;pr();}
}
else
{
PaintP(x,y);
x=mas[it-1][0];y=mas[it-1][1];fl=mas[it-1][2]+1;it--;
pr();
}
if (it>0){
x=mas[it-1][0];y=mas[it-1][1];fl=mas[it-1][2]+1;it--;
pr();
}
}
//---------------------------------------------------------------------------

void __fastcall Tmainform::Button1Click(TObject *Sender)
{
Image->Canvas->Pen->Width = 2;
x=110;
y=110;
it=0;
fl=1;
pr();
}
int h,i;int mas[6][3]; int x,y,it,fl; -глобальные
h-количество итераций. PaintP(x,y);-просто чертит точку на координатах х и у
Предположительно неправильно выходит из рекурсии.
Автор: Qraizer
Дата сообщения: 31.10.2006 13:32
Я что-то не понял. pr() вызывается из обоих веток этого большого if, т.е. всегда будет вызываться независимо от it. А это значит, что рекурсия бесконечная. Что ж тогда удивительного в неожиданном "конце стека"?
Цитата:
else
{
PaintP(x,y);
x=mas[it-1][0];y=mas[it-1][1];fl=mas[it-1][2]+1;it--;
pr();
}
Я так сильно подозреваю, что выделенное лишнее.
Автор: makkonen
Дата сообщения: 31.10.2006 13:46
Не знаю как тут прикреплять файлы, хотел выложить прогу, чтобы посмотрели.
Qraizer и KADABRA. Помогите, может я к вам в асю постучусь, глянете прогу?
Qraizer ошибка при удалении того оператора не исчезает.
Автор: KADABRA
Дата сообщения: 31.10.2006 16:55
makkonen
Как уже сказал Qraizer, в данном коде void Tmainform::pr() вечно будет вызывать себя, не заканчивая своё выполнение, соответственно в стек будут каждый раз добавлятся локальные (автоматические) переменные при каждом вызове void Tmainform::pr(), пока он не переполнится.
Автор: vdeny
Дата сообщения: 31.10.2006 17:19
Может кто-то сталкивался с таким?
Есть главное окно программы (CDialog), на нем кнопка Settings при нажатии которой открывается модальное диалоговое окно со страницами свойств.
Все страницы свойств работают, но если перейти с первой на любую другую, и перекрыть это окно другим, то программа входит в бесконечный цикл и виснет.
Если перекрытия другим окном нет, то все работает нормально и зависаний нет.

Вот пример (проект в visual c++ .Net 2003)
http://users.i.com.ua/~vfil/tabs-freeze.rar (65kb)
Если с page1, например, перейти на page2 и потом перекрыть это окно любым другим, то программа зависнет.

Нашел в msdn похожую проблему (http://support.microsoft.com/kb/149501), но по инструкции не удалось устранить зависание.
Может кто-то сталкивался с таким? Что я неправильно делаю? Подскажите, плиз, как избавится от этого зависания.

Добавлено:
Мне уже помогли разобраться.
Нужно определить обработчик сообщения WM_ACTIVATE:
ON_MESSAGE(WM_ACTIVATE, OnActivate)
***
LRESULT CYourSheetParentWnd::OnActivate(WPARAM wParam, LPARAM lParam)
{
if (wParam == WA_INACTIVE)
{
return ::DefWindowProc(m_hWnd,WM_ACTIVATE,wParam,lParam);
}
return CYourSheetParentWnd::DefWindowProc(WM_ACTIVATE,wParam,lParam);
}
Автор: gerrCrazzy
Дата сообщения: 01.11.2006 19:44
vdeny
Судя по всему неправильно помогли разобраться
В msdn четко написано - задать стиль WS_EX_CONTROLPARENT, также приводится один из методов решения - через вызвов функции ModifyStyleEx
А твоё решение выглядит попыткой наколоть MFC, не смотря на то, что в том же топике msdn'а говорится, что это не проблема MFC, а проблема резализации "Property Sheet common control"
Автор: Elf23
Дата сообщения: 03.11.2006 13:30
Всем привет! Люди вот такой вопрос где можно достать (в электронном виде) нормальные книги или статьи о использовании WinForm очень нужно написать графический редактор!!!
Автор: pit23
Дата сообщения: 07.11.2006 15:07
Помогите понять в чем дело:

Написал следующую функцию (для загрузки файла bmp) в Visual Studio 2005:


Код:
typedef struct BITMAP_FILE_TAG
{
BITMAPFILEHEADER bitmapfileheader;
BITMAPINFOHEADER bitmapinfoheader;
UCHAR *buffer;
} BITMAP_FILE,*BITMAP_FILE_PTR;

.....

int LoadBitmapFile(BITMAP_FILE_PTR bitmap,char *filename)
{
int file_handle;
UCHAR *temp_buffer=NULL;
OFSTRUCT file_data;
if((file_handle=OpenFile(filename,&file_data,OF_READ))==-1)
    return(0);
_lread(file_handle,&bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));
if(bitmap->bitmapfileheader.bfType!=0x4d42)
{
_lclose(file_handle);
return(0);
}
_lread(file_handle,&bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));
_lseek(file_handle,-(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);
if(bitmap->buffer)
    delete (bitmap->buffer);
bitmap->buffer = new UCHAR[bitmap->bitmapinfoheader.biSizeImage];
_lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage);
_lclose(file_handle);

return(1);
}

Автор: STEEL
Дата сообщения: 08.11.2006 00:06
Нормализовать строку
Whitespace
newlines
Удаление '\r\n'
Как хотите, но помогите мне удалить эти чертовы символы.


std::string s = "Hello world!\r\n";

Автор: ShIvADeSt
Дата сообщения: 08.11.2006 01:06
Народ, что касается программирования под винду (в частности АПИ и МФЦ) здесь не поститет плиз
Автор: kainFromSpb
Дата сообщения: 08.11.2006 01:18

Цитата:
Народ, что касается программирования под винду (в частности АПИ и МФЦ) здесь не поститет плиз
Поддерживаю, а то я сюда не заглядываю уже почти. В этой теме, судя по названию, должен обсуждаеться сам язык программирования, а не какие-то конкретные библиотеки и прикладные интерфейсы. (Boost не считается - про него говорить здесь весьма уместно, ИМХО =) ).
Автор: Jokerjar
Дата сообщения: 08.11.2006 03:44
Как написать класс, в котором присутствовали бы какие-нибудь события (которые обычно начинаются на "On")? Нужен простой пример.
Автор: distance
Дата сообщения: 08.11.2006 13:56
Jokerjar
а что такое "событие" в рамках c++?
Автор: Jokerjar
Дата сообщения: 09.11.2006 00:42
distance, к примеру класс, который просто инкрементирует какую-либо переменную. И у него есть событие, которое, скажем, вызывается когда величина этой переменной становится равной какому-либо числу...
Автор: SaDFromSpb
Дата сообщения: 09.11.2006 11:55
Jokerjar
В самом с++ событий нет в любом случае. Поэтому, непонятно, что ты хочешь сделать.

Цитата:
И у него есть событие, которое, скажем, вызывается...
События могут генерироваться, перехватываться и обрабатываться. А вызвать можно метод какой-нибудь.
Автор: distance
Дата сообщения: 09.11.2006 12:15
Jokerjar
у тебя явно какая-то путаница в понятиях. "Класс" не может инкрементировать перемнную, т.к. класс - это определяемый пользователем тип. вероятно, речь идет о какой-либо функции этого класса. ну и я, собственно, так и не понял, причем здесь какие-то "события"? Но, судя по описанию желаемого, возможно тебе поможет Boost.Signals
Автор: Jokerjar
Дата сообщения: 09.11.2006 15:12
Меня интересует реализация чего-то вроде этого:


Код: typedef void __fastcall (__closure *Event)();
...
Event FOnPort;
...
__property Event OnPort = {read=FOnPort, write=FOnPort};
Автор: xdude
Дата сообщения: 09.11.2006 15:29
Вероятно, речь идет о Callback-функции, указатель на которую должен присваиваться переменной, и которая должна вызываться по этому указателю при достижении какого-либо состония. Тогда, например, в классе прописывается переменая OnVar100 типа, скажем, typedef void (*var100_callback_t)(), а потом создается функция, например, on_var100(){printf("100\n");};, и объекту класса прописывается, как "событие": CMyClass cl;cl.OnVar100=on_var100;
Единственное, что нужно сделать - это проследить, чтобы значение целевой переменной, за которой идет наблюдение, изменялась только специальными функциями, которые и будут вызывать "событие" OnVar100 (т.е., нашу функцию on_var100) при достижении переменной значения 100. Естественно, это упрощенный вариан задачи, дальше уже на сколько у автора фантазии хватит

Добавлено:

Цитата:
__property Event OnPort = {read=FOnPort, write=FOnPort};

Это уже на Делфи похоже, а не на C++. Не бывает в C++ всяких там property со свойствами read/write. Даже OLE/COM объекты для C++ имеют немного иной доступ к свойствам, чем в языках типа Делфи и VisualBasic - здесь используются функции с префиксами get_ и put_, например, window->get_Width(), window->put_Height(100), в то время как в делфи можно написать просто window.Width:=100; C++ - язык более низкого уровня.
Автор: Vladimir_Pashutin
Дата сообщения: 09.11.2006 15:46
Да, __property Event ... средствами стандартного С++ реализовать невозможно, только спецрасширения от Builder-а. Но в С++ есть такое понятие как указатель на метод класса, на таком синтаксисе можно реализовать аналогичную функциональность переопределяя operator== для всех подобных типов, но морока при этом получается большая, так как при вызове события по такому обработчику приходится каждый раз обрамлять специальными оболочками, так как в стандартном сиснтаксисе при вызове обработчика по указателю на метод ему каждый раз нужно подставлять указатель на экземпляр класса для которого этот метод вызывается. Писал я когда-то давно подобную штуку, но потом перешёл на Builder и вздохнул с облегчением. Если сильно нужно могу порыться в древних архивах, но это займёт довольно много времени!
Автор: Jokerjar
Дата сообщения: 09.11.2006 17:13
Да, вы правы, речь шла о Билдере. Возможно я ошибся с темой, но я думал, что все упирается в синтаксис языка С++. Дело в том, что я пишу класс (не vcl компонент). А этот __property OnPort, как я понял, должен быть в секции __published, который может быть только у vcl компонента. Вот здесь я и застрял.
Автор: distance
Дата сообщения: 09.11.2006 18:12
проперти реализовать на pure c++ возможно. для этого мембер OnPort должен быть инстансом специального proxy-класса, с переопределенными операторами присваивания и кастинга. в сети есть множество generic-реализаций подобной функциональности (искать в гугле: c++ properties). и все же проперти имеют к callback-функциям, вызываемых по определенному условию, весьма далекое отношение. опиши конкретно и точно, что именно требуется?
Автор: DoctorLans
Дата сообщения: 09.11.2006 19:29
Вот что:

Цитата:
error C2440: '=' : cannot convert from 'char *' to 'char [10]'
1> There are no conversions to array types, although there are conversions to references or pointers to arrays


Почему нельзя осуществить это преобразование?
Ведь по сути это одно и то же.
Автор: Qraizer
Дата сообщения: 09.11.2006 20:19
Э-э-э, брат, сколько не(пробел)опытных программеров накололось на самой распространённой в учебниках лжи о том, что указатели и массивы суть одно и то же. Одинаковый синтаксис использования - да, но полной одинаковости нет и быть не может. Это весьма разные типы данных, как например, int и float - очень похожи в использовании, но не скажешь же, что они одинаковые.
А нельзя вот по какой причине. char[10] имеет статически распределённый сторадж под 10 символов. char* же имеет статически распределённый сторадж только под указатель на символ. Сравни sizeof(char[10]) и sizeof(char*). А теперь подумай, как второй присвоить первому... Правильно, каким-нибудь strcpy(), но никак не присваиванием.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


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