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

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

Автор: Qraizer
Дата сообщения: 14.12.2010 04:54
Угу. Потому макросы как замену inline не уважаю.
Автор: V0lt
Дата сообщения: 15.12.2010 19:25
прям подстава какая-то

Код: float f = 1.0;
int k = (int)(f * INT_MAX);
Автор: panda3
Дата сообщения: 15.12.2010 19:48
Как можно сделать STL контейнер, хранящий указатели сам на себя?
Чтобы вот это вот сработало:

Код: typedef std::map<std::string, MyClass*> MyClass;
Автор: Abs62
Дата сообщения: 15.12.2010 20:10
V0lt
Это не подстава, а иллюстрация на тему, как важно помнить о точности вычислений, работая с плавающей точкой. Загляни в хидер float.h и посмотри значение константы FLT_DIG - это количество значащих десятичных цифр в числе типа float.

PS. FLT_DIG - это по стандарту C, по стандарту C++ надо смотреть значение std::numeric_limits<float>::digits10.
Автор: V0lt
Дата сообщения: 15.12.2010 20:24
Abs62
глянул
#define FLT_DIG 6 /* # of decimal digits of precision */
значит придется считать в double или делать хитрый подгон.
Автор: bormpe
Дата сообщения: 19.12.2010 14:28
Добрый день, кто нибудь может для Windows-32
скомпилировать код написанный на C ?

Я не знаю C, а программа нужна (лично я использую Fortran)

Автор: vlary
Дата сообщения: 21.12.2010 22:07
bormpe А что за программа?
Автор: bormpe
Дата сообщения: 22.12.2010 15:00
4vlary

Программа из Принстона - генерирует плотные упаковки шаров.
Автор: tylddcom
Дата сообщения: 23.12.2010 23:39
Если код полностью готовый - возьми MinGW и откомпилируй сам.
Автор: 90Kinoman
Дата сообщения: 26.12.2010 18:46
Определить класс, описывающий равнобочную трапецию. Написать программу, в которой используются методы определенного класса.

Я эту задачку вообще понять не могу. и программу тож... че тут надо делать... помогите решить проблему
Автор: vlary
Дата сообщения: 26.12.2010 19:02
90Kinoman Ну вот, тебе, например, класс для объекта типа треугольник. В нем есть методы, типа вывод периметра, вывод площади. Ну а уж на трапецию ты это думаю, сам сможешь экстраполировать.
Автор: stasiun
Дата сообщения: 28.12.2010 12:02
Помогите, пожалуйста, составить блок-схему.

Дана целочисленная квадратная матрица порядка 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;
}
Автор: 90Kinoman
Дата сообщения: 30.12.2010 06:02
Вычислить и вывести на экран в виде таблицы значения функции 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 ввести с клавиатуры.
Автор: vlary
Дата сообщения: 30.12.2010 22:57
90Kinoman Если ты думаешь, что здесь будут тебе решать за тебя твои лабораторки, то ты жестоко ошибаешься. Тема предназначена для обсуждения вопросов программирования на С++, а не для выполнения за лодырей и бездарей их домашних заданий. Если не получается решение элементарных задач, займись чем-то другим. Дворники, шаурмены и бастурматоры всегда будут востребованы. Либо найди кого-нибудь, кто будет вместо тебя учиться, а потом и работать, за деньги.
Автор: crasylaser
Дата сообщения: 13.01.2011 11:07
Ребята, как разрешить доступ к ветке реестра: HKEY_CLASSES_ROOT\CLSID\{2a11bae2-fe6e-4249-864b-9e9ed6e8dbc2}?
Автор: Alexand
Дата сообщения: 13.01.2011 12:29
crasylaser
1. Registry Key Security and Access Rights
Understanding Windows File And Registry Permissions
2. Еще есть консольная утилита SubInACL
Автор: crasylaser
Дата сообщения: 13.01.2011 13:07
Подскажите пожалуйста, как это программно сделать на с++, система windows 7. Пробую прогу сделать, которая приоритеты встроенных кодаков меняет.
Автор: Alexand
Дата сообщения: 13.01.2011 13:50
crasylaser
Утилита SubInACL (которую я посоветовал в пред посте) не работает в Виндовс 7. Вот, нашел другую - setacl. Там же и документация есть.
На мой взгляд, для изменения прав доступа ветки реестра проще всего использовать эту утилиту(или найти другую подобную), чем разбиратся с АПИ.
Ну а программно в С++ все просто - запускаешь эту утилиту с нужными тебе параметрами, обрабатываешь результат и т.д. и т.п.
Автор: crasylaser
Дата сообщения: 13.01.2011 14:21
Спасибо, так и сделаю, разбираться не сильно охота
Автор: Taran2ul
Дата сообщения: 18.01.2011 13:13
Люди помогите с этим справиться:
http://forum.ru-board.com/topic.cgi?forum=33&topic=11648
Автор: KChernov
Дата сообщения: 18.01.2011 15:13
Taran2ul

Цитата:
Требуется запретить ввод (или обработку) символов в поле года, кроме цифр.
А то при вводе буквы, программа начинает конвульсивно что-то выводить на экран.

Проще всего для ввода использовать строку, а уже потом пытаться преобразовать её в число и при неудаче предлагать ввести заново.
Ну или делать посимвольный ввод.

Добавлено:

Цитата:
Проще всего для ввода использовать строку, а уже потом пытаться преобразовать её в число и при неудаче предлагать ввести заново.

Хотя можно просто перехватить бросаемое при неудачном вводе исключение (это ведь оно и
Цитата:
программа начинает конвульсивно что-то выводить на экран
).
Автор: karakurt2
Дата сообщения: 31.01.2011 13:40
Давно пытаюсь понять в чём ошибка в этом коде. Он распечатывает информацию о свойствах 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]
Автор: gygant
Дата сообщения: 01.02.2011 04:15
Доброго времени суток, уважаемые мастера!

У меня на форме несколько компонентов ListBox и мне нужно бы их заполнять. Если один пустой, то другой заполняем.. и так далее. В связи с этим в целях оптимизации возник вопрос - есть ли возможность организовать цикл по объектам формы? Перебирая имена объектов, скажем ListBox[i]->Items->Add.. как-то так
Автор: KChernov
Дата сообщения: 01.02.2011 12:22
gygant
Собственно это вопрос не по языку, а по оконной библиотеке.
Надо в хелпе смотреть свойства/методы, позволяющие возвращать коллекции принадлежащих её объектов.
Автор: Red Planet
Дата сообщения: 04.02.2011 19:22
Здравствуйте! В этом простом коде мне непонятно, почему при 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;
}
Автор: juvaforza
Дата сообщения: 04.02.2011 20:17
Red Planet
Попробуйте ещё третий вариант: 90.0/7. В Си та же ситуация - если оба операнда целочисленные, то и результат целочисленный. Уже потом значение присваивается переменной t.
Автор: AndreySmirnoff
Дата сообщения: 04.02.2011 21:02
Господа, выручайте пожалуйста!! очень нужна ваша помощь!
курсовик на тему: "Разложение Холецкого и решение СЛАУ на его основе"

в общем нужен код программы на С++
спасите, кто может, пожалуйста!
Автор: Qraizer
Дата сообщения: 05.02.2011 04:57

Цитата:
Нелогично выходит.
А если там будет char-у присваиваться, то логично, чтобы деление возвращало char, что ли? А если выражение состоит из пяти операций, то логично, чтобы результат каждой из этих 5 был тот же, как и у переменной, что слева от =? А если у меня выражение не содержит присваивания, например, внутри заголовка while, то как логично в этом случае?
Ответы просты: тип результата операции зависит исключительно от типов её операндов. Это логично в любых случаях. Как в дальнейшем этот результат используется, операцию не волнует, это влияет уже на контекст использования, где этот результат сам может оказаться в качестве операнда некой операции.
Автор: KChernov
Дата сообщения: 05.02.2011 11:15
AndreySmirnoff
А чем поисковики не угодили?
Вот например сразу нашлось.
Автор: AndreySmirnoff
Дата сообщения: 05.02.2011 13:23
KChernov

поисковики-то как раз и не угодили тем, что ничего готового не нашел...
на алглибе представлена программа со своими библиотеками, а надо стандартными средствами сделать...

я в программировании разбираюсь как свинья в апельсинах...
поэтому и спрашиваю на форумах, может кто делал, у кого осталось, кому не жалко =)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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