Угу. Потому макросы как замену inline не уважаю.
» Вопросы по программированию на C/С++
прям подстава какая-то
Код: float f = 1.0;
int k = (int)(f * INT_MAX);
Код: float f = 1.0;
int k = (int)(f * INT_MAX);
Как можно сделать STL контейнер, хранящий указатели сам на себя?
Чтобы вот это вот сработало:
Код: typedef std::map<std::string, MyClass*> MyClass;
Чтобы вот это вот сработало:
Код: typedef std::map<std::string, MyClass*> MyClass;
V0lt
Это не подстава, а иллюстрация на тему, как важно помнить о точности вычислений, работая с плавающей точкой. Загляни в хидер float.h и посмотри значение константы FLT_DIG - это количество значащих десятичных цифр в числе типа float.
PS. FLT_DIG - это по стандарту C, по стандарту C++ надо смотреть значение std::numeric_limits<float>::digits10.
Это не подстава, а иллюстрация на тему, как важно помнить о точности вычислений, работая с плавающей точкой. Загляни в хидер float.h и посмотри значение константы FLT_DIG - это количество значащих десятичных цифр в числе типа float.
PS. FLT_DIG - это по стандарту C, по стандарту C++ надо смотреть значение std::numeric_limits<float>::digits10.
Abs62
глянул
#define FLT_DIG 6 /* # of decimal digits of precision */
значит придется считать в double или делать хитрый подгон.
глянул
#define FLT_DIG 6 /* # of decimal digits of precision */
значит придется считать в double или делать хитрый подгон.
Добрый день, кто нибудь может для Windows-32
скомпилировать код написанный на C ?
Я не знаю C, а программа нужна (лично я использую Fortran)
скомпилировать код написанный на C ?
Я не знаю C, а программа нужна (лично я использую Fortran)
bormpe А что за программа?
4vlary
Программа из Принстона - генерирует плотные упаковки шаров.
Программа из Принстона - генерирует плотные упаковки шаров.
Если код полностью готовый - возьми MinGW и откомпилируй сам.
Определить класс, описывающий равнобочную трапецию. Написать программу, в которой используются методы определенного класса.
Я эту задачку вообще понять не могу. и программу тож... че тут надо делать... помогите решить проблему
Я эту задачку вообще понять не могу. и программу тож... че тут надо делать... помогите решить проблему
90Kinoman Ну вот, тебе, например, класс для объекта типа треугольник. В нем есть методы, типа вывод периметра, вывод площади. Ну а уж на трапецию ты это думаю, сам сможешь экстраполировать.
Помогите, пожалуйста, составить блок-схему.
Дана целочисленная квадратная матрица порядка 8. Найти наименьшее из значений элементов столбца, который обладает наибольшей суммой модулей элементов. Если таких столбцов несколько, то взять первый из них.
Код:
#include <iostream>
#include <time.h>
#include <limits>
#include <iomanip>
using namespace std;
int main()
{
const int n=8;
int **Arr;
Arr = new int*[n];
srand(time(NULL));
for (int i =0;i<n;i++)
{
Arr[i] = new int[n];
for (int j=0;j< n;j++)
Arr[i][j] = rand()%100 * ((rand()%2)?1:-1);
}
for (int i = 0;i<n;i++)
{
for (int j=0;j<n;j++)
cout<<setw(3)<<Arr[i][j]<<" ";
cout<<endl;
}
int ColNum = -1;
int ResSum = numeric_limits<int>::min();
for (int i=0;i< n;i++)
{
int Sum = 0;
for (int j=0;j< n;j++)
{
Sum += abs(Arr[j][i]);
}
cout<<endl<<Sum;
if (ResSum < Sum)
{
ColNum = i;
ResSum = Sum;
}
}
int MinRes = numeric_limits<int>::max();
for (int i = 0;i<n;i++)
{
if (MinRes > Arr[i][ColNum])
MinRes = Arr[i][ColNum];
}
cout<<"\n Result : "<<MinRes<<endl;
}
Дана целочисленная квадратная матрица порядка 8. Найти наименьшее из значений элементов столбца, который обладает наибольшей суммой модулей элементов. Если таких столбцов несколько, то взять первый из них.
Код:
#include <iostream>
#include <time.h>
#include <limits>
#include <iomanip>
using namespace std;
int main()
{
const int n=8;
int **Arr;
Arr = new int*[n];
srand(time(NULL));
for (int i =0;i<n;i++)
{
Arr[i] = new int[n];
for (int j=0;j< n;j++)
Arr[i][j] = rand()%100 * ((rand()%2)?1:-1);
}
for (int i = 0;i<n;i++)
{
for (int j=0;j<n;j++)
cout<<setw(3)<<Arr[i][j]<<" ";
cout<<endl;
}
int ColNum = -1;
int ResSum = numeric_limits<int>::min();
for (int i=0;i< n;i++)
{
int Sum = 0;
for (int j=0;j< n;j++)
{
Sum += abs(Arr[j][i]);
}
cout<<endl<<Sum;
if (ResSum < Sum)
{
ColNum = i;
ResSum = Sum;
}
}
int MinRes = numeric_limits<int>::max();
for (int i = 0;i<n;i++)
{
if (MinRes > Arr[i][ColNum])
MinRes = Arr[i][ColNum];
}
cout<<"\n Result : "<<MinRes<<endl;
}
Вычислить и вывести на экран в виде таблицы значения функции F на интервале от Xнач. до Xкон. с шагом dX
F=a(x+c^2)-b при x==0 и b!=0;
F=(x-a)/-c при x==0 и b=0;
F=a+(x/c) в остальных случаях;
где a,b,c - действительные числа.
Функция F должна принимать действительные значение, если выражение (АцМОД2 Вц) И НЕ(Ац или Сц) не равно нулю, и целое значение в противном случае. Через Ац, Вц, и Сц обозначены целые части значений a,b,c, операции НЕ, И, ИЛИ и МОД(сложение по модулю2) - поразрядные. Значения a,b,c, Хнач, Хкон, dX ввести с клавиатуры.
F=a(x+c^2)-b при x==0 и b!=0;
F=(x-a)/-c при x==0 и b=0;
F=a+(x/c) в остальных случаях;
где a,b,c - действительные числа.
Функция F должна принимать действительные значение, если выражение (АцМОД2 Вц) И НЕ(Ац или Сц) не равно нулю, и целое значение в противном случае. Через Ац, Вц, и Сц обозначены целые части значений a,b,c, операции НЕ, И, ИЛИ и МОД(сложение по модулю2) - поразрядные. Значения a,b,c, Хнач, Хкон, dX ввести с клавиатуры.
90Kinoman Если ты думаешь, что здесь будут тебе решать за тебя твои лабораторки, то ты жестоко ошибаешься. Тема предназначена для обсуждения вопросов программирования на С++, а не для выполнения за лодырей и бездарей их домашних заданий. Если не получается решение элементарных задач, займись чем-то другим. Дворники, шаурмены и бастурматоры всегда будут востребованы. Либо найди кого-нибудь, кто будет вместо тебя учиться, а потом и работать, за деньги.
Ребята, как разрешить доступ к ветке реестра: HKEY_CLASSES_ROOT\CLSID\{2a11bae2-fe6e-4249-864b-9e9ed6e8dbc2}?
crasylaser
1. Registry Key Security and Access Rights
Understanding Windows File And Registry Permissions
2. Еще есть консольная утилита SubInACL
1. Registry Key Security and Access Rights
Understanding Windows File And Registry Permissions
2. Еще есть консольная утилита SubInACL
Подскажите пожалуйста, как это программно сделать на с++, система windows 7. Пробую прогу сделать, которая приоритеты встроенных кодаков меняет.
crasylaser
Утилита SubInACL (которую я посоветовал в пред посте) не работает в Виндовс 7. Вот, нашел другую - setacl. Там же и документация есть.
На мой взгляд, для изменения прав доступа ветки реестра проще всего использовать эту утилиту(или найти другую подобную), чем разбиратся с АПИ.
Ну а программно в С++ все просто - запускаешь эту утилиту с нужными тебе параметрами, обрабатываешь результат и т.д. и т.п.
Утилита SubInACL (которую я посоветовал в пред посте) не работает в Виндовс 7. Вот, нашел другую - setacl. Там же и документация есть.
На мой взгляд, для изменения прав доступа ветки реестра проще всего использовать эту утилиту(или найти другую подобную), чем разбиратся с АПИ.
Ну а программно в С++ все просто - запускаешь эту утилиту с нужными тебе параметрами, обрабатываешь результат и т.д. и т.п.
Спасибо, так и сделаю, разбираться не сильно охота
Люди помогите с этим справиться:
http://forum.ru-board.com/topic.cgi?forum=33&topic=11648
http://forum.ru-board.com/topic.cgi?forum=33&topic=11648
Taran2ul
Цитата:
Проще всего для ввода использовать строку, а уже потом пытаться преобразовать её в число и при неудаче предлагать ввести заново.
Ну или делать посимвольный ввод.
Добавлено:
Цитата:
Хотя можно просто перехватить бросаемое при неудачном вводе исключение (это ведь оно и
Цитата:
Цитата:
Требуется запретить ввод (или обработку) символов в поле года, кроме цифр.
А то при вводе буквы, программа начинает конвульсивно что-то выводить на экран.
Проще всего для ввода использовать строку, а уже потом пытаться преобразовать её в число и при неудаче предлагать ввести заново.
Ну или делать посимвольный ввод.
Добавлено:
Цитата:
Проще всего для ввода использовать строку, а уже потом пытаться преобразовать её в число и при неудаче предлагать ввести заново.
Хотя можно просто перехватить бросаемое при неудачном вводе исключение (это ведь оно и
Цитата:
программа начинает конвульсивно что-то выводить на экран).
Давно пытаюсь понять в чём ошибка в этом коде. Он распечатывает информацию о свойствах COM-объекта с помощью интерфейса ITypeInfo. Для примера взял элемент упавления календарь. При просмотре свойства FirstDay получаю нарушение памяти (access violation) внутри обработчика метода IPerPropertyBrowsing::GetPredefinedStrings(), строка 1251. Есть соображения на этот счёт?
Листинг:
[more]
Код:
[no]
#include <olectl.h>
#include <stdio.h>
bool IsEnumerated(ITypeInfo* pTypeInfo)
{
bool ok = false;
if (pTypeInfo)
{
LPTYPEATTR pTypeAttr = 0;
pTypeInfo->GetTypeAttr(&pTypeAttr);
if (pTypeAttr != 0)
{
ok = (pTypeAttr->typekind == TKIND_ENUM);
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
}
return ok;
}
bool IsBool(IDispatch* pDispatch, DISPID di)
{
bool ok = false;
VARIANT val;
VariantInit(&val);
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
HRESULT hr = pDispatch->Invoke(di, IID_NULL, LOCALE_USER_DEFAULT, \
DISPATCH_PROPERTYGET, &dispparamsNoArgs, &val, NULL, NULL);
ok = (SUCCEEDED(hr) && val.vt == VT_BOOL);
VariantClear(&val);
return ok;
}
bool IsPerPropertyBrowse(IDispatch* pDispatch, DISPID di)
{
bool ok = false;
IPerPropertyBrowsing* pBrowse = 0;
HRESULT hr = pDispatch->QueryInterface(IID_IPerPropertyBrowsing, (void**) &pBrowse);
if (SUCCEEDED(hr))
{
CALPOLESTR castr;
CADWORD cadw;
ZeroMemory(&castr, sizeof(castr));
ZeroMemory(&cadw, sizeof(cadw));
hr = pBrowse->GetPredefinedStrings(di, &castr, &cadw);
if (hr == S_OK)
{
ULONG i;
ok = true;
for (i = 0; i < castr.cElems; ++i)
{
char buff[32];
WideCharToMultiByte(866, 0, castr.pElems[i], -1, buff, 32, 0, 0);
printf("\n\t%s", buff);
}
CoTaskMemFree(cadw.pElems);
for (i = 0; i < castr.cElems; ++i)
{
CoTaskMemFree(castr.pElems[i]);
// SysFreeString(castr.pElems[i]);
}
CoTaskMemFree(castr.pElems);
}
pBrowse->Release();
}
return ok;
}
bool IsColor(ITypeInfo* pTypeInfo, DISPID di)
{
if (di == DISPID_BACKCOLOR || di == DISPID_FORECOLOR \
|| di == DISPID_BORDERCOLOR || di == DISPID_FILLCOLOR)
{
return true;
}
bool ok = false;
if (pTypeInfo != 0)
{
LPTYPEATTR pTypeAttr = 0;
pTypeInfo->GetTypeAttr(&pTypeAttr);
if (pTypeAttr)
{
if (pTypeAttr->typekind == TKIND_ALIAS)
{
ITypeLib *pTypeLib = 0;
UINT nIndex;
HRESULT hr = pTypeInfo->GetContainingTypeLib(&pTypeLib, &nIndex);
if (SUCCEEDED(hr))
{
BSTR bstrName;
BSTR bstrDoc;
hr = pTypeLib->GetDocumentation(nIndex, &bstrName, &bstrDoc, NULL, NULL);
if (SUCCEEDED(hr))
{
ok = (0 == lstrcmpW(bstrName, L"OLE_COLOR"));
}
if (bstrName)
SysFreeString(bstrName);
if (bstrDoc)
SysFreeString(bstrDoc);
pTypeLib->Release();
}
}
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
}
return ok;
}
bool IsFont(ITypeInfo* pTypeInfo, DISPID di)
{
if (di == DISPID_FONT)
return true;
bool ok = false;
if (pTypeInfo != 0)
{
LPTYPEATTR pTypeAttr = 0;
pTypeInfo->GetTypeAttr(&pTypeAttr);
if (pTypeAttr)
{
ok = InlineIsEqualGUID(pTypeAttr->guid, IID_IFontDisp);
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
}
return ok;
}
bool RegisterProperty(LPDISPATCH pDispatch, DISPID di, \
LPTYPEINFO pTypeInfo, LPTYPEINFO pUserTypeInfo)
{
BSTR bstrName = NULL;
BSTR bstrDocString = NULL;
HRESULT hr = pTypeInfo->GetDocumentation(di, &bstrName, &bstrDocString, NULL, NULL);
if (SUCCEEDED(hr))
{
printf("%S: ", bstrName);
if (IsEnumerated(pUserTypeInfo))
{
printf("enum");
}
else if (IsBool(pDispatch, di))
{
printf("bool");
}
else if (IsPerPropertyBrowse(pDispatch, di))
{
// printf("browse");
}
else if (IsColor(pUserTypeInfo, di))
{
printf("color");
}
else if (IsFont(pUserTypeInfo, di))
{
printf("font");
}
else
{
printf("generic");
}
printf("\n");
if (bstrName)
SysFreeString(bstrName);
if (bstrDocString)
SysFreeString(bstrDocString);
}
return false;
}
VARTYPE GetUserDefinedType(LPTYPEINFO pTI, HREFTYPE hrt)
{
VARTYPE vt = VT_USERDEFINED;
LPTYPEINFO pRTI = 0;
HRESULT hr = pTI->GetRefTypeInfo(hrt, &pRTI);
if (SUCCEEDED(hr))
{
LPTYPEATTR pTA = 0;
hr = pRTI->GetTypeAttr(&pTA);
if (pTA)
{
if (SUCCEEDED(hr) && pTA->typekind == TKIND_ALIAS)
{
if (pTA->tdescAlias.vt == VT_USERDEFINED)
{
vt = GetUserDefinedType(pRTI, pTA->tdescAlias.hreftype);
}
else
{
vt = pTA->tdescAlias.vt;
}
}
pRTI->ReleaseTypeAttr(pTA);
}
pRTI->Release();
}
return vt;
}
HRESULT GetEnumTypeInfo(LPTYPEINFO pTI, HREFTYPE hrt, ITypeInfo** ppEnumInfo)
{
*ppEnumInfo = 0;
LPTYPEINFO pRTI = 0;
HRESULT hr = pTI->GetRefTypeInfo(hrt, &pRTI);
if (SUCCEEDED(hr))
{
hr = E_NOINTERFACE;
LPTYPEATTR pTA = 0;
pRTI->GetTypeAttr(&pTA);
if (pTA)
{
switch (pTA->typekind)
{
case TKIND_ALIAS:
if (pTA->tdescAlias.vt == VT_USERDEFINED)
{
hr = GetEnumTypeInfo(pRTI, pTA->tdescAlias.hreftype, ppEnumInfo);
}
else
{
*ppEnumInfo = pRTI;
pRTI->AddRef();
hr = S_OK;
}
break;
case TKIND_ENUM:
case TKIND_DISPATCH:
{
*ppEnumInfo = pRTI;
pRTI->AddRef();
hr = S_OK;
}
break;
}
pRTI->ReleaseTypeAttr(pTA);
}
pRTI->Release();
}
return hr;
}
bool QueryProperty(LPDISPATCH pDispatch, LPTYPEINFO pTypeInfo, LPFUNCDESC pFuncDesc)
{
bool ok = false;
switch (pFuncDesc->elemdescFunc.tdesc.vt)
{
case VT_EMPTY:
case VT_NULL:
case VT_I2:
case VT_I4:
case VT_R4:
case VT_R8:
case VT_CY:
case VT_DATE:
case VT_BSTR:
case VT_ERROR:
case VT_BOOL:
case VT_VARIANT:
case VT_DECIMAL:
case VT_I1:
case VT_UI1:
case VT_UI2:
case VT_UI4:
case VT_INT:
case VT_UINT:
ok = RegisterProperty(pDispatch, pFuncDesc->memid, pTypeInfo, NULL);
break;
case VT_USERDEFINED:
{
HREFTYPE hRefType = pFuncDesc->elemdescFunc.tdesc.hreftype;
VARTYPE vt = VT_USERDEFINED;
LPTYPEINFO pUserTypeInfo = 0;
HRESULT hr = GetEnumTypeInfo(pTypeInfo, hRefType, &pUserTypeInfo);
if (FAILED(hr))
{
vt = GetUserDefinedType(pTypeInfo, hRefType);
}
ok = RegisterProperty(pDispatch, pFuncDesc->memid, pTypeInfo, pUserTypeInfo);
if (pUserTypeInfo)
{
pUserTypeInfo->Release();
}
}
break;
case VT_PTR:
{
TYPEDESC *pTypeDesc = pFuncDesc->elemdescFunc.tdesc.lptdesc;
if (pTypeDesc->vt == VT_USERDEFINED)
{
LPTYPEINFO pUserTypeInfo = 0;
HRESULT hr = GetEnumTypeInfo(pTypeInfo, pTypeDesc->hreftype, &pUserTypeInfo);
if (SUCCEEDED(hr) && pUserTypeInfo != 0)
{
LPTYPEATTR pTypeAttr = 0;
if (SUCCEEDED(pUserTypeInfo->GetTypeAttr(&pTypeAttr)))
{
if (InlineIsEqualGUID(pTypeAttr->guid, IID_IFontDisp))
{
ok = RegisterProperty(pDispatch, pFuncDesc->memid, pTypeInfo, pUserTypeInfo);
}
pUserTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
pUserTypeInfo->Release();
}
}
}
break;
}
return ok;
}
HRESULT QueryControl()
{
CLSID cid;
HRESULT hr = CLSIDFromProgID(OLESTR("MSCAL.Calendar"), &cid);
if (FAILED(hr))
{
return hr;
}
LPDISPATCH pDispatch = 0;
hr = CoCreateInstance(cid, NULL, CLSCTX_INPROC_SERVER, \
IID_IDispatch, (void**) &pDispatch);
if (FAILED(hr))
{
return hr;
}
LPTYPEINFO pTypeInfo = 0;
hr = pDispatch->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &pTypeInfo);
if (FAILED(hr))
{
pDispatch->Release();
return hr;
}
LPTYPEATTR pTypeAttr = 0;
hr = pTypeInfo->GetTypeAttr(&pTypeAttr);
if (FAILED(hr))
{
pTypeInfo->Release();
pDispatch->Release();
}
if (pTypeAttr->typekind == TKIND_INTERFACE)
{
// If the TKIND_DISPATCH type description is for a dual interface,
// the TKIND_INTERFACE type description can be obtained by calling
// GetRefTypeOfImplType with an index of -1, and by passing the returned
// pRefType handle to GetRefTypeInfo to retrieve the type information.
HREFTYPE hRefType;
hr = pTypeInfo->GetRefTypeOfImplType(-1, &hRefType);
if (SUCCEEDED(hr))
{
LPTYPEINFO pRefTypeInfo = 0;
hr = pTypeInfo->GetRefTypeInfo(hRefType, &pRefTypeInfo);
if (SUCCEEDED(hr))
{
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
pTypeInfo->Release();
pTypeInfo = pRefTypeInfo;
hr = pTypeInfo->GetTypeAttr(&pTypeAttr);
if (FAILED(hr))
{
pTypeInfo->Release();
pDispatch->Release();
return hr;
}
}
}
}
// sweep through looking for property put
const int MAX_MEMBERID = 0x100;
MEMBERID memberid[MAX_MEMBERID], *pMI = memberid;
for (int i = 0; i < pTypeAttr->cFuncs; ++i)
{
LPFUNCDESC pFuncDesc = 0;
hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
if (SUCCEEDED(hr))
{
if (pFuncDesc->invkind & INVOKE_PROPERTYPUT)
{
if (pMI - memberid < MAX_MEMBERID)
{
*pMI++ = pFuncDesc->memid;
}
else
{
pTypeInfo->Release();
pDispatch->Release();
return E_OUTOFMEMORY;
}
}
pTypeInfo->ReleaseFuncDesc(pFuncDesc);
}
}
// now find prop get methods
for (int i = 0; i < pTypeAttr->cFuncs; ++i)
{
LPFUNCDESC pFuncDesc = 0;
hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
if (SUCCEEDED(hr))
{
if ((pFuncDesc->invkind & INVOKE_PROPERTYGET) != 0 && (pFuncDesc->wFuncFlags
& (FUNCFLAG_FRESTRICTED | FUNCFLAG_FHIDDEN | FUNCFLAG_FNONBROWSABLE)) == 0)
{
for (MEMBERID *pMI2 = memberid; pMI2 < pMI; ++pMI2)
{
if (pFuncDesc->memid == *pMI2)
{
QueryProperty(pDispatch, pTypeInfo, pFuncDesc);
break;
}
}
}
pTypeInfo->ReleaseFuncDesc(pFuncDesc);
}
}
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
pTypeInfo->Release();
pDispatch->Release();
return S_OK;
}
int main()
{
HRESULT hr = OleInitialize(NULL);
if (SUCCEEDED(hr))
{
hr = QueryControl();
OleUninitialize();
}
return (SUCCEEDED(hr)? 0: 1);
}
[/no]
Листинг:
[more]
Код:
[no]
#include <olectl.h>
#include <stdio.h>
bool IsEnumerated(ITypeInfo* pTypeInfo)
{
bool ok = false;
if (pTypeInfo)
{
LPTYPEATTR pTypeAttr = 0;
pTypeInfo->GetTypeAttr(&pTypeAttr);
if (pTypeAttr != 0)
{
ok = (pTypeAttr->typekind == TKIND_ENUM);
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
}
return ok;
}
bool IsBool(IDispatch* pDispatch, DISPID di)
{
bool ok = false;
VARIANT val;
VariantInit(&val);
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
HRESULT hr = pDispatch->Invoke(di, IID_NULL, LOCALE_USER_DEFAULT, \
DISPATCH_PROPERTYGET, &dispparamsNoArgs, &val, NULL, NULL);
ok = (SUCCEEDED(hr) && val.vt == VT_BOOL);
VariantClear(&val);
return ok;
}
bool IsPerPropertyBrowse(IDispatch* pDispatch, DISPID di)
{
bool ok = false;
IPerPropertyBrowsing* pBrowse = 0;
HRESULT hr = pDispatch->QueryInterface(IID_IPerPropertyBrowsing, (void**) &pBrowse);
if (SUCCEEDED(hr))
{
CALPOLESTR castr;
CADWORD cadw;
ZeroMemory(&castr, sizeof(castr));
ZeroMemory(&cadw, sizeof(cadw));
hr = pBrowse->GetPredefinedStrings(di, &castr, &cadw);
if (hr == S_OK)
{
ULONG i;
ok = true;
for (i = 0; i < castr.cElems; ++i)
{
char buff[32];
WideCharToMultiByte(866, 0, castr.pElems[i], -1, buff, 32, 0, 0);
printf("\n\t%s", buff);
}
CoTaskMemFree(cadw.pElems);
for (i = 0; i < castr.cElems; ++i)
{
CoTaskMemFree(castr.pElems[i]);
// SysFreeString(castr.pElems[i]);
}
CoTaskMemFree(castr.pElems);
}
pBrowse->Release();
}
return ok;
}
bool IsColor(ITypeInfo* pTypeInfo, DISPID di)
{
if (di == DISPID_BACKCOLOR || di == DISPID_FORECOLOR \
|| di == DISPID_BORDERCOLOR || di == DISPID_FILLCOLOR)
{
return true;
}
bool ok = false;
if (pTypeInfo != 0)
{
LPTYPEATTR pTypeAttr = 0;
pTypeInfo->GetTypeAttr(&pTypeAttr);
if (pTypeAttr)
{
if (pTypeAttr->typekind == TKIND_ALIAS)
{
ITypeLib *pTypeLib = 0;
UINT nIndex;
HRESULT hr = pTypeInfo->GetContainingTypeLib(&pTypeLib, &nIndex);
if (SUCCEEDED(hr))
{
BSTR bstrName;
BSTR bstrDoc;
hr = pTypeLib->GetDocumentation(nIndex, &bstrName, &bstrDoc, NULL, NULL);
if (SUCCEEDED(hr))
{
ok = (0 == lstrcmpW(bstrName, L"OLE_COLOR"));
}
if (bstrName)
SysFreeString(bstrName);
if (bstrDoc)
SysFreeString(bstrDoc);
pTypeLib->Release();
}
}
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
}
return ok;
}
bool IsFont(ITypeInfo* pTypeInfo, DISPID di)
{
if (di == DISPID_FONT)
return true;
bool ok = false;
if (pTypeInfo != 0)
{
LPTYPEATTR pTypeAttr = 0;
pTypeInfo->GetTypeAttr(&pTypeAttr);
if (pTypeAttr)
{
ok = InlineIsEqualGUID(pTypeAttr->guid, IID_IFontDisp);
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
}
return ok;
}
bool RegisterProperty(LPDISPATCH pDispatch, DISPID di, \
LPTYPEINFO pTypeInfo, LPTYPEINFO pUserTypeInfo)
{
BSTR bstrName = NULL;
BSTR bstrDocString = NULL;
HRESULT hr = pTypeInfo->GetDocumentation(di, &bstrName, &bstrDocString, NULL, NULL);
if (SUCCEEDED(hr))
{
printf("%S: ", bstrName);
if (IsEnumerated(pUserTypeInfo))
{
printf("enum");
}
else if (IsBool(pDispatch, di))
{
printf("bool");
}
else if (IsPerPropertyBrowse(pDispatch, di))
{
// printf("browse");
}
else if (IsColor(pUserTypeInfo, di))
{
printf("color");
}
else if (IsFont(pUserTypeInfo, di))
{
printf("font");
}
else
{
printf("generic");
}
printf("\n");
if (bstrName)
SysFreeString(bstrName);
if (bstrDocString)
SysFreeString(bstrDocString);
}
return false;
}
VARTYPE GetUserDefinedType(LPTYPEINFO pTI, HREFTYPE hrt)
{
VARTYPE vt = VT_USERDEFINED;
LPTYPEINFO pRTI = 0;
HRESULT hr = pTI->GetRefTypeInfo(hrt, &pRTI);
if (SUCCEEDED(hr))
{
LPTYPEATTR pTA = 0;
hr = pRTI->GetTypeAttr(&pTA);
if (pTA)
{
if (SUCCEEDED(hr) && pTA->typekind == TKIND_ALIAS)
{
if (pTA->tdescAlias.vt == VT_USERDEFINED)
{
vt = GetUserDefinedType(pRTI, pTA->tdescAlias.hreftype);
}
else
{
vt = pTA->tdescAlias.vt;
}
}
pRTI->ReleaseTypeAttr(pTA);
}
pRTI->Release();
}
return vt;
}
HRESULT GetEnumTypeInfo(LPTYPEINFO pTI, HREFTYPE hrt, ITypeInfo** ppEnumInfo)
{
*ppEnumInfo = 0;
LPTYPEINFO pRTI = 0;
HRESULT hr = pTI->GetRefTypeInfo(hrt, &pRTI);
if (SUCCEEDED(hr))
{
hr = E_NOINTERFACE;
LPTYPEATTR pTA = 0;
pRTI->GetTypeAttr(&pTA);
if (pTA)
{
switch (pTA->typekind)
{
case TKIND_ALIAS:
if (pTA->tdescAlias.vt == VT_USERDEFINED)
{
hr = GetEnumTypeInfo(pRTI, pTA->tdescAlias.hreftype, ppEnumInfo);
}
else
{
*ppEnumInfo = pRTI;
pRTI->AddRef();
hr = S_OK;
}
break;
case TKIND_ENUM:
case TKIND_DISPATCH:
{
*ppEnumInfo = pRTI;
pRTI->AddRef();
hr = S_OK;
}
break;
}
pRTI->ReleaseTypeAttr(pTA);
}
pRTI->Release();
}
return hr;
}
bool QueryProperty(LPDISPATCH pDispatch, LPTYPEINFO pTypeInfo, LPFUNCDESC pFuncDesc)
{
bool ok = false;
switch (pFuncDesc->elemdescFunc.tdesc.vt)
{
case VT_EMPTY:
case VT_NULL:
case VT_I2:
case VT_I4:
case VT_R4:
case VT_R8:
case VT_CY:
case VT_DATE:
case VT_BSTR:
case VT_ERROR:
case VT_BOOL:
case VT_VARIANT:
case VT_DECIMAL:
case VT_I1:
case VT_UI1:
case VT_UI2:
case VT_UI4:
case VT_INT:
case VT_UINT:
ok = RegisterProperty(pDispatch, pFuncDesc->memid, pTypeInfo, NULL);
break;
case VT_USERDEFINED:
{
HREFTYPE hRefType = pFuncDesc->elemdescFunc.tdesc.hreftype;
VARTYPE vt = VT_USERDEFINED;
LPTYPEINFO pUserTypeInfo = 0;
HRESULT hr = GetEnumTypeInfo(pTypeInfo, hRefType, &pUserTypeInfo);
if (FAILED(hr))
{
vt = GetUserDefinedType(pTypeInfo, hRefType);
}
ok = RegisterProperty(pDispatch, pFuncDesc->memid, pTypeInfo, pUserTypeInfo);
if (pUserTypeInfo)
{
pUserTypeInfo->Release();
}
}
break;
case VT_PTR:
{
TYPEDESC *pTypeDesc = pFuncDesc->elemdescFunc.tdesc.lptdesc;
if (pTypeDesc->vt == VT_USERDEFINED)
{
LPTYPEINFO pUserTypeInfo = 0;
HRESULT hr = GetEnumTypeInfo(pTypeInfo, pTypeDesc->hreftype, &pUserTypeInfo);
if (SUCCEEDED(hr) && pUserTypeInfo != 0)
{
LPTYPEATTR pTypeAttr = 0;
if (SUCCEEDED(pUserTypeInfo->GetTypeAttr(&pTypeAttr)))
{
if (InlineIsEqualGUID(pTypeAttr->guid, IID_IFontDisp))
{
ok = RegisterProperty(pDispatch, pFuncDesc->memid, pTypeInfo, pUserTypeInfo);
}
pUserTypeInfo->ReleaseTypeAttr(pTypeAttr);
}
pUserTypeInfo->Release();
}
}
}
break;
}
return ok;
}
HRESULT QueryControl()
{
CLSID cid;
HRESULT hr = CLSIDFromProgID(OLESTR("MSCAL.Calendar"), &cid);
if (FAILED(hr))
{
return hr;
}
LPDISPATCH pDispatch = 0;
hr = CoCreateInstance(cid, NULL, CLSCTX_INPROC_SERVER, \
IID_IDispatch, (void**) &pDispatch);
if (FAILED(hr))
{
return hr;
}
LPTYPEINFO pTypeInfo = 0;
hr = pDispatch->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &pTypeInfo);
if (FAILED(hr))
{
pDispatch->Release();
return hr;
}
LPTYPEATTR pTypeAttr = 0;
hr = pTypeInfo->GetTypeAttr(&pTypeAttr);
if (FAILED(hr))
{
pTypeInfo->Release();
pDispatch->Release();
}
if (pTypeAttr->typekind == TKIND_INTERFACE)
{
// If the TKIND_DISPATCH type description is for a dual interface,
// the TKIND_INTERFACE type description can be obtained by calling
// GetRefTypeOfImplType with an index of -1, and by passing the returned
// pRefType handle to GetRefTypeInfo to retrieve the type information.
HREFTYPE hRefType;
hr = pTypeInfo->GetRefTypeOfImplType(-1, &hRefType);
if (SUCCEEDED(hr))
{
LPTYPEINFO pRefTypeInfo = 0;
hr = pTypeInfo->GetRefTypeInfo(hRefType, &pRefTypeInfo);
if (SUCCEEDED(hr))
{
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
pTypeInfo->Release();
pTypeInfo = pRefTypeInfo;
hr = pTypeInfo->GetTypeAttr(&pTypeAttr);
if (FAILED(hr))
{
pTypeInfo->Release();
pDispatch->Release();
return hr;
}
}
}
}
// sweep through looking for property put
const int MAX_MEMBERID = 0x100;
MEMBERID memberid[MAX_MEMBERID], *pMI = memberid;
for (int i = 0; i < pTypeAttr->cFuncs; ++i)
{
LPFUNCDESC pFuncDesc = 0;
hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
if (SUCCEEDED(hr))
{
if (pFuncDesc->invkind & INVOKE_PROPERTYPUT)
{
if (pMI - memberid < MAX_MEMBERID)
{
*pMI++ = pFuncDesc->memid;
}
else
{
pTypeInfo->Release();
pDispatch->Release();
return E_OUTOFMEMORY;
}
}
pTypeInfo->ReleaseFuncDesc(pFuncDesc);
}
}
// now find prop get methods
for (int i = 0; i < pTypeAttr->cFuncs; ++i)
{
LPFUNCDESC pFuncDesc = 0;
hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
if (SUCCEEDED(hr))
{
if ((pFuncDesc->invkind & INVOKE_PROPERTYGET) != 0 && (pFuncDesc->wFuncFlags
& (FUNCFLAG_FRESTRICTED | FUNCFLAG_FHIDDEN | FUNCFLAG_FNONBROWSABLE)) == 0)
{
for (MEMBERID *pMI2 = memberid; pMI2 < pMI; ++pMI2)
{
if (pFuncDesc->memid == *pMI2)
{
QueryProperty(pDispatch, pTypeInfo, pFuncDesc);
break;
}
}
}
pTypeInfo->ReleaseFuncDesc(pFuncDesc);
}
}
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
pTypeInfo->Release();
pDispatch->Release();
return S_OK;
}
int main()
{
HRESULT hr = OleInitialize(NULL);
if (SUCCEEDED(hr))
{
hr = QueryControl();
OleUninitialize();
}
return (SUCCEEDED(hr)? 0: 1);
}
[/no]
Доброго времени суток, уважаемые мастера!
У меня на форме несколько компонентов ListBox и мне нужно бы их заполнять. Если один пустой, то другой заполняем.. и так далее. В связи с этим в целях оптимизации возник вопрос - есть ли возможность организовать цикл по объектам формы? Перебирая имена объектов, скажем ListBox[i]->Items->Add.. как-то так
У меня на форме несколько компонентов ListBox и мне нужно бы их заполнять. Если один пустой, то другой заполняем.. и так далее. В связи с этим в целях оптимизации возник вопрос - есть ли возможность организовать цикл по объектам формы? Перебирая имена объектов, скажем ListBox[i]->Items->Add.. как-то так
gygant
Собственно это вопрос не по языку, а по оконной библиотеке.
Надо в хелпе смотреть свойства/методы, позволяющие возвращать коллекции принадлежащих её объектов.
Собственно это вопрос не по языку, а по оконной библиотеке.
Надо в хелпе смотреть свойства/методы, позволяющие возвращать коллекции принадлежащих её объектов.
Здравствуйте! В этом простом коде мне непонятно, почему при t=90/7 выводится 12 (без дробной части), а при t=90/7.0 - 12.851 (с дробной частью). Только лишь от того, что во втором случае семерка является переменной типа double, а в первом int? Но ведь результат-то в обоих случаях присваивается переменной t, которая типа double. Нелогично выходит.
Цитата:
Цитата:
// ---------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#include <iostream>
using namespace std;
// ---------------------------------------------------------------------------
int _tmain (int argc, _TCHAR* argv[]) {
system ("title Temp");
double t=90/7;
cout <<t<<endl;
system ("pause");
return 0;
}
Red Planet
Попробуйте ещё третий вариант: 90.0/7. В Си та же ситуация - если оба операнда целочисленные, то и результат целочисленный. Уже потом значение присваивается переменной t.
Попробуйте ещё третий вариант: 90.0/7. В Си та же ситуация - если оба операнда целочисленные, то и результат целочисленный. Уже потом значение присваивается переменной t.
Господа, выручайте пожалуйста!! очень нужна ваша помощь!
курсовик на тему: "Разложение Холецкого и решение СЛАУ на его основе"
в общем нужен код программы на С++
спасите, кто может, пожалуйста!
курсовик на тему: "Разложение Холецкого и решение СЛАУ на его основе"
в общем нужен код программы на С++
спасите, кто может, пожалуйста!
Цитата:
Нелогично выходит.А если там будет char-у присваиваться, то логично, чтобы деление возвращало char, что ли? А если выражение состоит из пяти операций, то логично, чтобы результат каждой из этих 5 был тот же, как и у переменной, что слева от =? А если у меня выражение не содержит присваивания, например, внутри заголовка while, то как логично в этом случае?
Ответы просты: тип результата операции зависит исключительно от типов её операндов. Это логично в любых случаях. Как в дальнейшем этот результат используется, операцию не волнует, это влияет уже на контекст использования, где этот результат сам может оказаться в качестве операнда некой операции.
KChernov
поисковики-то как раз и не угодили тем, что ничего готового не нашел...
на алглибе представлена программа со своими библиотеками, а надо стандартными средствами сделать...
я в программировании разбираюсь как свинья в апельсинах...
поэтому и спрашиваю на форумах, может кто делал, у кого осталось, кому не жалко =)
поисковики-то как раз и не угодили тем, что ничего готового не нашел...
на алглибе представлена программа со своими библиотеками, а надо стандартными средствами сделать...
я в программировании разбираюсь как свинья в апельсинах...
поэтому и спрашиваю на форумах, может кто делал, у кого осталось, кому не жалко =)
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
Предыдущая тема: не знаю как назвать тему :-)
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.