Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Re: Редактор реестра  (Прочитано 8145 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sss
Специалист

ru
Offline Offline

« : 29-01-2010 05:11 » 

Serg79, у тебя правило такое - запускать программы на которые у тебя есть исходники, да? Или ты веришь всем, кроме меня... А код большой, потому что там VCL внутри..

А за исходники конечно стыдно...

И вообще, тебя с большой буквы это зачем?
« Последнее редактирование: 29-01-2010 05:17 от sss » Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 29-01-2010 05:19 » 

Цитата
А за исходники конечно стыдно...
тем более нужно показать! Заодно люди посоветую чего. Покритикуют Улыбаюсь Сплошные плюсы
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 29-01-2010 06:07 » 

Serg79, для небольшой программы на Delphi/BCB размер в 1 МБ - нормальное явление. Библиотеки слинкованы статически - иначе потянет за собой гору динамических библиотек. Улыбаюсь

Собственно, в правилах раздела не сказано, чтобы выкладывали исходники. Но было бы не плохо. sss, просим Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
sss
Специалист

ru
Offline Offline

« Ответ #3 : 29-01-2010 06:08 » 

Алексей1153++, у меня нет времени на базар... Что я буду обсуждать? Удачна или не удачна моя реализация красно-черных деревьев и есть ли смысл в использовании динамического полиморфизма? Почему я организовал организацию выделения памяти так а не иначе? Почему использую свой класс строк?  Код моих библиотек оттачивался мной почти 10 лет...

Ну допустим... Вот моя реализация кода поиска подстрок алгоритмом Кнута-Морриса-Пратта
Код:
int StrFindA( const char* T, const char* P) throw ( ELowResources*,  EComError*, ESystemError*)
{
  size_t n = StrLengthA( T);
  size_t m = StrLengthA( P);
  size_t k = 0;
  size_t q;

  char*  f = StrAllocA( m);
  f[0] = 0;
  for ( q = 1; q < m; q++)
  {
    while( k > 0 && P[k] != P[q])
    {
      k = f[k];
    }
    if ( P[k] == P[q]) k++;
    f[q] = k;
  }
  q = 0;
  for ( size_t i = 0; i < n; i++)
  {
    while( q > 0 && P[q] != T[i])
    {
      q = f[q];
    }
    if ( P[q] == T[i]) q++;
    if ( q == m)
    {
      StrFreeA( f);
      return (i - m + 1);
    }
  }
  StrFreeA( f);
  return -1;
}

Если бы я не упомянул Кнута-Морриса-Пратта стали бы вы спорить об его эффективности?
Даже что бы описать эту мизерную процедуру, необходимо показать реализацию  StrFreeA,
StrLengthA, ELowResources*, ESystemError*, EComError*. Смотрим!

Код:
#define StrFreeA        __GlobalMM().__StrFreeA


size_t StrLengthA( const char* src) throw ( EComError*)
{
  size_t   stRes = 0;
  HRESULT  hr;
  if ( src && FAILED( hr = ::StringCchLengthA( src, STRDEF_MAX_CCH, &stRes)))
    throw new __EComError( hr);
  return stRes;
}

#ifdef DEBUG
#define __ELowResources()        ELowResources(__FILE__, __LINE__)
#else
#define __ELowResources()        ELowResources()
#endif

class ELowResources : public EExcept
{
public:
  ELowResources();
  ELowResources( const char* _module, int _line);

  virtual ExceptionReport& GetReport( ExceptionReport& Report) const throw();
  virtual const TCHAR* getClassName() const;
  virtual u_long getErrorCode() const; 
};
//******************************************************************************
//*ESystemError
//******************************************************************************
#ifdef DEBUG
#define __ESystemError(x)             ESystemError((x), __FILE__, __LINE__)
#else
#define __ESystemError(x)             ESystemError((x))
#endif
#define SYS_ERROR_MSG                 TEXT("%s (%u)")
             
class ESystemError : public EExcept
{
protected:
  DWORD                       m_dwError;
public:
  ESystemError( DWORD dwError);
  ESystemError( DWORD dwError, const char* _module, int _line);

  DWORD getError(void) const;
  __declspec( property( get = getError))
  DWORD                       Error;
  virtual ExceptionReport& GetReport( ExceptionReport& Report) const throw();
  virtual const TCHAR* getClassName() const;
  virtual u_long getErrorCode() const;
};
//******************************************************************************
//*EComError
//******************************************************************************
#ifdef DEBUG
#define __EComError(x)             EComError((x), __FILE__, __LINE__)
#else
#define __EComError(x)             EComError((x))
#endif
#define COM_ERROR_MSG              TEXT("%s (0x%.8X)")

class EComError : public ESystemError
{
public:
  EComError( HRESULT hResult);
  EComError( HRESULT hResult, const char* _module, int _line);

  HRESULT getResult(void) const;
  __declspec( property( get = getResult))
  HRESULT                     Result;

  ExceptionReport& GetReport( ExceptionReport& Report) const throw();
  virtual const TCHAR* getClassName() const;
};



Или может быть посмотрим реализацию дескриптора безопасности?

Код:

//******************************************************************************
//* CRegkeySecurity
//******************************************************************************
class CRegkeySecurity : public CSecurityInfo
{
protected:
  static SI_ACCESS        m_RegkeyRightsBitmask[13];
  static SI_INHERIT_TYPE  m_RegkeyInheritTypes[];
public:
  CRegkeySecurity( const TCHAR* KeyName);
  CRegkeySecurity( HKEY hKeyHandle);
  virtual const PSI_ACCESS getAccessRights(void);
  virtual const PSI_INHERIT_TYPE getAceInheritTypes(void);
};

//******************************************************************************
//*CRegkeySecurity
//******************************************************************************
CRegkeySecurity::CRegkeySecurity( const TCHAR* KeyName)
                :CSecurityInfo( KeyName, SE_REGISTRY_KEY)
{
  m_bChild     = true;
  m_bContainer = true;
}
//------------------------------------------------------------------------------
CRegkeySecurity::CRegkeySecurity( HKEY hKeyHandle)
               :CSecurityInfo( hKeyHandle, SE_REGISTRY_KEY)
{
  m_bChild     = true;
  m_bContainer = true;
}
//------------------------------------------------------------------------------
const PSI_ACCESS CRegkeySecurity::getAccessRights(void)
{
  return m_RegkeyRightsBitmask;
}
//------------------------------------------------------------------------------
const PSI_INHERIT_TYPE CRegkeySecurity::getAceInheritTypes(void)
{
  return m_RegkeyInheritTypes;
}


Надо показать реализацию CSecurityInfo. Вот заголовок

Код:
//******************************************************************************
//*CSecurityInfo
//******************************************************************************
class CSecurityInfo : public CLifeControlObject, public ISecurityInformation
{
private:
  friend CPrivateSecurity;
  CSecurityInfo();
protected:
  static SI_ACCESS            m_AccessRightsBitmask[33];

  bool                        m_bContainer;               // Объект контейнер
  bool                        m_bChild;                   // Объект потомок
  wchar_t*                    m_ObjectName;               // Имя объекта
  HANDLE                      m_ObjectHandle;             // Хэндл объекта
  SE_OBJECT_TYPE              m_ObjectType;               // Тип объекта


  virtual HRESULT PrivateSetSecurity( SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor);
  virtual HRESULT PrivateGetSecurity( SECURITY_INFORMATION RequestedInformation, PSECURITY_DESCRIPTOR* ppSecurityDescriptor, BOOL fDefault);

  //Возвращает массив возможных флагов доступа. У последнего в массиве
  //mask = 0!
  virtual const PSI_ACCESS getAccessRights(void);
  __declspec( property( get = getAccessRights))
  const PSI_ACCESS            AccessRights;

  //Возвращает массив возможных флагов наследования ACE.
  virtual const PSI_INHERIT_TYPE getAceInheritTypes(void);
  __declspec( property( get = getAceInheritTypes))
  const PSI_INHERIT_TYPE      AceInheritTypes;


//////////////////////////////////
//IUnknown
  HRESULT WINAPI QueryInterface( REFIID riid, PVOID* ppvObj);
public:
  u_long WINAPI  AddRef()  { return CLifeControlObject::AddRef();};
  u_long WINAPI  Release() { return CLifeControlObject::Release();};
protected:
//////////////////////////////////
//ISecurityDescriptor
  HRESULT WINAPI GetObjectInformation( PSI_OBJECT_INFO pObjectInfo);
  HRESULT WINAPI GetSecurity( SECURITY_INFORMATION  RequestedInformation,
                              PSECURITY_DESCRIPTOR* ppSecurityDescriptor, BOOL fDefault);
  HRESULT WINAPI SetSecurity(SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor);
  HRESULT WINAPI GetAccessRights( const GUID* pguidObjectType, DWORD dwFlags,
                                  PSI_ACCESS* ppAccess, ULONG* pcAccesses, ULONG* piDefaultAccess);
  HRESULT WINAPI MapGeneric( const GUID* pguidObjectType, UCHAR* pAceFlags, ACCESS_MASK* pMask);
  HRESULT WINAPI GetInheritTypes( PSI_INHERIT_TYPE* ppInheritTypes, ULONG* pcInheritTypes);
  HRESULT WINAPI PropertySheetPageCallback( HWND hwnd, UINT uMsg, SI_PAGE_TYPE uPage);
//////////////////////////////////
public:

  CSecurityInfo( const TCHAR* name, SE_OBJECT_TYPE type) throw ( ELowResources*);

  CSecurityInfo( HANDLE hObj, SE_OBJECT_TYPE type) throw ( ELowResources*);

  ~CSecurityInfo();

  void ShowDialog( HWND hwndOwner) throw ( ESystemError*);

  virtual void QueryDacl( CAcl& dacl) throw ( ELowResources*, ESystemError*);
  virtual void SetDacl( const CAcl& dacl) throw ( ESystemError*);

  void QuerySacl( CAcl& sacl) throw ( ELowResources*, ESystemError*);
  void SetSacl( const CAcl& sacl) throw ( ESystemError*);

  virtual void QueryOwner( CSid& sid) throw ( ELowResources*, ESystemError*);
  virtual void SetOwner( const CSid& sid, bool bDefaulted) throw ( ELowResources*, ESystemError*);

  void QueryPrimaryGroup( CSid& sid) throw ( ELowResources*, ESystemError*);
  void SetPrimaryGroup( const CSid& sid) throw ( ESystemError*);

};

О чём вообще речь? А вот заголовок реализации красно-черных деревьев
Код:
//******************************************************************************
//*Двоичные деревья
//******************************************************************************
//FORWARDS
template <class _KeyT> class CBinaryTree;
template <class _KeyT> class CRbBinaryTree;


typedef int (CALLBACK *LPFNCompareKey)( const void* pKey1, const void* pKey2);

typedef int  (CALLBACK* MPNOTIFY) ( void* pContext, const void* data1ptr, const void* data2ptr);

//******************************************************************************
//*CTreeItem - Базовый класс для узлов двоичных деревьев.
//*            Нет доступа к значению ключа! Доступ могут получить
//*            только потомки этого класса.
//******************************************************************************

template <class _KeyT> class CTreeItem : virtual public CLifeControlObject
{
friend CBinaryTree<_KeyT>;
friend CRbBinaryTree<_KeyT>;
private:
  CTreeItem<_KeyT>*           m_pParent;
  CTreeItem<_KeyT>*           m_pLeft;
  CTreeItem<_KeyT>*           m_pRight;
  char                        m_Color;
  u_long                      m_ulSize; // Количество вершин, включая эту.
                                        // Дополнительно - признак NULL узла!
protected:
  _KeyT                       m_Key;

public:
  CTreeItem(void);

  const CTreeItem<_KeyT>* getParent(void) const;
  __declspec( property( get = getParent))
  const CTreeItem<_KeyT>*     Parent;

  const CTreeItem<_KeyT>* getLeft(void) const;
  __declspec( property( get = getLeft))
  const CTreeItem<_KeyT>*     Left;

  const CTreeItem<_KeyT>* getRight(void) const;
  __declspec( property( get = getRight))
  const CTreeItem<_KeyT>*     Right;

  char getColor(void) const;
  __declspec( property( get = getColor))
  char                        Color;

  _KeyT getKey(void) const;
  __declspec( property( get = getKey))
  _KeyT                       Key;

};
//******************************************************************************
//*CBinaryTree  Нимдасис
//******************************************************************************
template < class _KeyT> class CBinaryTree : virtual public CLifeControlObject
{
protected:
  mutable CRITICAL_SECTION    m_csTreeGuard;
  CTreeItem<_KeyT>*           m_pRoot;
  u_long                      m_ulBalanceFactor;
  CTreeItem<_KeyT>            m_NULL;
  LPFNCompareKey              m_pCmpFunc;
 
public:
  CBinaryTree(void);
  ~CBinaryTree(void);

  //Поиск.
  CTreeItem<_KeyT>* Search( const _KeyT& key, bool bAddRef) const throw ( ESystemError*, EComError*);

  //Минимум. Если дерево пустое возвращает NULL.
  CTreeItem<_KeyT>* Minimum(void) throw ();

  //Максимум. Если дерево пустое возвращает NULL.
  CTreeItem<_KeyT>* Maximum(void) throw ();

  //Следующий по росту. NULL - нет следующего
  CTreeItem<_KeyT>* Succ( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

  //Предыдущий по росту. NULL - нет предыдущего.
  CTreeItem<_KeyT>* Pred( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

  //Добавить новый элемент. Если ключ присутствует, генерирует
  //исключение. Память под элемент выделяет вызывающая сторона.
  //В случае успешной вставки, для узла вызывается AddRef.
  void Insert( CTreeItem<_KeyT>* pNewItem) throw ( ELowResources*, ESystemError*, EComError*);

  //Удаление. Для изъятого узла вызывается Release
  void Delete( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

  //Очистка. Для очищаемых узлов вызывается Release.
  void Clear(void) throw ();

  //Блокировать дерево вызывающим потоком. Опасно!
  void Lock(void) const throw ();

  //Разблокировать дерево
  void Unlock(void) const throw ();

  //Корень.
  const CTreeItem<_KeyT>* getRoot(void) const;
  __declspec( property( get = getRoot))
  const CTreeItem<_KeyT>*     Root;

  u_long getCount(void) const;
  __declspec( property( get = getCount))
  u_long                      Count;

  LPFNCompareKey getOnCompare(void) const;
  void setOnCompare( LPFNCompareKey cmpfunc);
    __declspec( property( get = getOnCompare, put = setOnCompare))
  LPFNCompareKey              OnCompare;

  //Выбор элемента по индексу.
  CTreeItem<_KeyT>* Select( u_long ulIdx, bool bAddRef) const throw ( ESystemError*);

  //Порядковый номер - количество элементов меньших pItem->m_Key.
  //Если дерево содержит только уникальные ключи - это индекс в массиве.
  u_long Rank( CTreeItem<_KeyT>* pItem) const throw ( ESystemError*);

};
//******************************************************************************
//*CRbBinaryTree
//******************************************************************************
template <class _KeyT> class CRbBinaryTree : public CBinaryTree<_KeyT>
{
protected:


  //Левое вращение. Правый ребенок не должен быть NULL.
  void LeftRotate( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

  //Правое вращение. Левый ребенок не должен быть NULL.
  void RightRotate( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

  //Восстановление RB свойств после удаления.
  void RBDeleteFixup( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

public:
  CRbBinaryTree(void);

  //Добавить новый элемент. Если ключ присутствует, генерирует
  //исключение. Память под элемент выделяет вызывающая сторона.
  //В случае успешной вставки, для узла вызывается AddRef.
  //RBInsert
  void Insert( CTreeItem<_KeyT>* pNewItem) throw ( ELowResources*, ESystemError*, EComError*);

  //Удаление. Для изъятого узла вызывается Release
  //RBDelete
  void Delete( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

  //Черная высота узла
  u_long BHeight( CTreeItem<_KeyT>* pItem) throw ( ESystemError*);

};
//******************************************************************************
//*Принудительное инстанцирование
//******************************************************************************

template class CTreeItem<long>;
template class CTreeItem<u_long>;
template class CTreeItem<char*>;

template class CBinaryTree<long>;
template class CBinaryTree<u_long>;
template class CBinaryTree<char*>;

template class CRbBinaryTree<long>;
template class CRbBinaryTree<u_long>;
template class CRbBinaryTree<char*>;

typedef CTreeItem<long>       CLongTreeItem, *PLongTreeItem;
typedef CBinaryTree<long>     CLongBinaryTree, *PLongBinaryTree;
typedef CRbBinaryTree<long>   CLongRbTree, *PLongRbTree;

typedef CTreeItem<u_long>     CUlongTreeItem,  *PUlongTreeItem;
typedef CBinaryTree<u_long>   CUlongBinaryTree, *PUlongBinaryTree;
typedef CRbBinaryTree<u_long> CUlongRbTree, *PUlongRbTree;

typedef CTreeItem<char*>      CTextTreeItemA,   *PTextTreeItemA;
typedef CBinaryTree<char*>    CTextBinaryTreeA, *PTextBinaryTreeA;
typedef CRbBinaryTree<char*>  CTextRbTreeA, *PTextRbTreeA;


Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #4 : 29-01-2010 06:13 » 

Пока писал, RXL уже добавил пост... Я реально не знаю как это - поделиться исходниками...
Записан

while (8==8)
zubr
Гость
« Ответ #5 : 29-01-2010 06:52 » 

Насчет исходников с sss согласен на 100%. Такое впечатление, что у желающих посмотреть исходники вагон времени - ковыряться в чужих исходниках ради спортивного интереса. Когда в инете скачиваем программы для каких либо нужд тоже смотрим под капот? Или все таки больше интересен и нужен функционал программы?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 29-01-2010 06:54 » 

zubr, порой бывает и время, а порой бывает и необходимо — когда сам не знаешь, как сделать подобное Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 29-01-2010 07:36 » 

zubr, когда в Инете скачиваем программу то там есть описание данной программы, приведен ее функционал и показаны скриншоты.

А тут Привет, это редактор реестра, пользуйтесь на свой страх и риск и все... Пускай хоть для приличия приложит описание и пару скриншотов, а то таких Привет, это редактор реестра по интернету миллионы и этот Привет, это редактор реестра малоинтересен кому в таком виде.

P.S. надо добавить требования к данному разделу по оформлению тем (что то типа того как на торрент.ру), что бы таких тем как Привет, это редактор реестра не было, информативность их нулевая, польза так же нулевая.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #8 : 29-01-2010 07:56 » 

Serg79, польза нулевая это мнение эксперта как я полагаю....
Записан

while (8==8)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 29-01-2010 07:57 » 

sss, спокойнее, пожалуйста (у меня ощущение, что ты обижаешься).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
sss
Специалист

ru
Offline Offline

« Ответ #10 : 29-01-2010 07:59 » 

RXL, да обижаюсь. Вот реально все завалено бесплатными редакторами реестра ....
Записан

while (8==8)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 29-01-2010 08:02 » 

sss, зря обижается — критика по существу. Описание нужно. И ситуация нехорошая: оба вы правы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
sss
Специалист

ru
Offline Offline

« Ответ #12 : 29-01-2010 08:09 » 

Serg79  - я вот только сейчас увидел что ты модератор раздела... Претензии понятны и приняты. Первый пост отредактирую...
Записан

while (8==8)
zubr
Гость
« Ответ #13 : 29-01-2010 08:09 » 

zubr, порой бывает и время, а порой бывает и необходимо — когда сам не знаешь, как сделать подобное Улыбаюсь
В таком случае можно спросить у автора, как он реализовывал конкретный функционал.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 29-01-2010 08:10 » 

zubr, если у него есть время...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 29-01-2010 08:15 » 

zubr честно сказать, мне не понятна Твоя принципиальность и последовательность в вопросе поддержки тех, кто скрывает и не показывает свои исходники.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 29-01-2010 08:17 » 

Наличие обид (если они есть) вообще непонятно! Гром как-то правильно сказал (дословно не помню) - интернет штука инертная, если не ввинчиваться в него, никто тебя не заметит и не оценит Улыбаюсь
Записан

Sel
Злобный
Администратор

ru
Offline Offline

« Ответ #17 : 29-01-2010 08:18 » 

Народ, вы чего??
Человек предложил программу, хотите - берете, не хотите - просто не обращаете внимания. Улыбаюсь
Если я не доверяю программе, я ею просто не пользуюсь...
Записан

Слово не воробей. Всё не воробей, кроме воробья.
sss
Специалист

ru
Offline Offline

« Ответ #18 : 29-01-2010 08:25 » 

Вот честно. Для меня проще создать программу, чем ее описать! Вот реально, наобещал переправить первый пост - сижу не как это сделать! И не потому что обиделся.... Ну вот просто почувствовал - на руках есть все модули своих библиотек (кроме VCL) которые позволят создать похожий на системный редактор реестра (нет редактора двоичных дампов, пока...) - взял и написал после толчка со стороны вируса каких то местных самодеятелей ( не определяется антивирусами уже месяц).
« Последнее редактирование: 29-01-2010 08:26 от sss » Записан

while (8==8)
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 29-01-2010 09:27 » 

sss, если Ты не показываешь свои исходники то описание твоих модулей и VCL-ов никому здесь не нужны. Ты опиши в 5 - 6 предложениях что Твоя программа делает и как с ней работать, а так же приложи пару скриншотов.

Sel, предложение программ с описанием Привет, это редактор реестра никому не нужны, польза от этого для других пользователей форума нулевая. Пускай в разделе лучше будет 2 - 3 программы с нормальным описанием, чем 50 с одной строчкой.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 29-01-2010 09:33 » 

Писать описание сложно, но полезно. И уметь надо )
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 29-01-2010 12:54 » 

Да, написать доку - задача непростая. А написать толковую доку или полное описание - считай, что написать программу дважды.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 29-01-2010 17:52 » new

Отрезал весь флуд.

Добавлю попозже в "Правила" раздела "Авторское ПО" правила и описание как создавать новые темы.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines