Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/64: Рейтинг темы: голосов - 64, средняя оценка - 4.78
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384

Об отладке. Трассировка и более удобные инструменты.

06.03.2012, 06:07. Показов 12273. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я не профессиональный программист и пишу маленькие утилитки. 80% багов в утих утилитках я отлавливаю с помощью трассировки (вывода отладочных сообщений) остальные 20% это стандартный отладчик codegear. Для трассировки я написал себе маленькую утилитку и не пользую метод аля ShowMessage. Я не представляю как можно отлаживать проги иначе.
Но вот в чем для меня парадокс, почему то серьезные программисты не используют трассировку ( или на крайняк используют метод аля ShowMessage), как им удается обходится одним отладчик я не понимаю. Поискав в инете я так же не нашел ни одного нормального трасировщика. Скажите трассировка это что то не нужное и мало эффективное, и есть какие то более удобные инструменты?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2012, 06:07
Ответы с готовыми решениями:

Удобные инструменты e-mail рассылки
Посоветуйте, как лучше сделать e-mail рассылку? Какие могут возникнуть проблемы и ошибки? Что касается базы, её формирую с помощью...

Удобные решения на C# для разработчиков БД
Эта статья посвящена маленькой, но очень частой проблеме разработчиков приложений БД. Вспомните, как часто у Вас по какой-то неведомой...

Удобные сокращения программного кода
Делаем код удобнее, красивее и короче:) Сложение: переменная += значение (i = 1 i += 1 i будет равно 2) ...

24
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
06.03.2012, 08:01
Цитата Сообщение от gumi250 Посмотреть сообщение
Поискав в инете я так же не нашел ни одного нормального трасировщика
Цитата Сообщение от gumi250 Посмотреть сообщение
Для трассировки я написал себе маленькую утилитку
Вы объясните, пожалуйста, что понимаете под трассировкой. Потому как для меня это обычное пошаговое выполнение программы, с которым успешно справляется сама среда разработки RAD/BCB .
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
06.03.2012, 08:35  [ТС]
Как я и написал в начале под трассировкой подразумевает вывод в ходе работы программы отладочных сообщений, что то вроде этого:
C++
1
ShowMessage("x="+IntToStr(x));
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
06.03.2012, 09:35
Зачем такие сложности в виде вывода отладочной информации, особенно в виде всплывающих окошек, когда самой средой предусмотрены такие функции как пошаговое выполнение, точки останова безусловные/условные, просмотр/изменение значений переменных?
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
06.03.2012, 09:41
Цитата Сообщение от gumi250 Посмотреть сообщение
под трассировкой подразумевает вывод в ходе работы
Вот поэтому и спросил. Вывод сообщений к трассировке никакого отношения не имеет. Как уже упомянул kazak, всевозможные полезные вещи для отладки реализованы в среде, всё остальное велосипед.
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
06.03.2012, 10:31  [ТС]
Ок, может слово трасировка, не совсем то, слово логирование хода работы программы будет более однозначно. Конечно ShowMessage приведен как крайний случай, но можно выводить например в файл или мемо или консоль, это не столь важно.
Вот такая реакция программистов меня и удивляет. Как можно обходится без логирования? Лично я почти не использую средства отладки среды. Вот как вы решите нижеописанные проблемы:
- Если ошибка возникает в середине часто используемого куска кода, например внутри цикла, или onMouseMove(), onDraw(), или внутри ф-ции которая вызывается из разных мест и вас интерисует только тогда когда она вызвана из определенного места.
- При закрытии проекта положения брекпоинтов не сохраняется. Большое кол-во брекпоинтов утомляет. Т.е. не всегда они спасают.
- Окошечко текущего значения переменных (Wath List) не всегда выводит нужную переменную, список переменных не сохраняется при закрытии проекта, запихнуть в него просмотр массива тоже нереально (А как глянуть содержимое массива).
Конечно пошаговое выполнение вещь очень нужная но не всегда ее достаточно, и вот что делать тогда?
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
06.03.2012, 11:50
Цитата Сообщение от gumi250 Посмотреть сообщение
и вас интерисует только тогда когда она вызвана из определенного места.
Ставить бряк в интересующем месте вызова, а не в самой функции
Цитата Сообщение от gumi250 Посмотреть сообщение
Окошечко текущего значения переменных (Wath List) не всегда выводит нужную переменную
Это как? Приведите пример
Цитата Сообщение от gumi250 Посмотреть сообщение
запихнуть в него просмотр массива тоже нереально (А как глянуть содержимое массива).
Для массивов вместо watch есть inspect (alt+f5)
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
06.03.2012, 15:17
Цитата Сообщение от gumi250 Посмотреть сообщение
и вас интерисует только тогда когда она вызвана из определенного места.
уже ответили

Цитата Сообщение от gumi250 Посмотреть сообщение
Если ошибка возникает в середине часто используемого куска кода, например внутри цикла
точкам останова можно задавать условия срабатывания, количество пропусков срабатывания

Цитата Сообщение от gumi250 Посмотреть сообщение
Как можно обходится без логирования?
для точек останова можно также задать запись в лог при срабатывании и вывод в лог результата вычисления выражения, задаваемого программистом, или просто содержимое некоторой переменной. И это все может происходить без останова программы

Цитата Сообщение от gumi250 Посмотреть сообщение
При закрытии проекта положения брекпоинтов не сохраняется.
Никогда раньше не задавался этим вопросом. На данный момент у меня этим грешит билдер, и то я пока точно не скажу - это фича такая, или надо просто в настройках полазить. А вот студия все сохраняет, и бряки, и контрольные значения.

Цитата Сообщение от gumi250 Посмотреть сообщение
Окошечко текущего значения переменных (Wath List) не всегда выводит нужную переменную
во первых, смотреть значения можно только на паузе, во вторых, для просмотра доступны только те переменные, которые находятся в памяти в момент останова

Цитата Сообщение от gumi250 Посмотреть сообщение
запихнуть в него просмотр массива тоже нереально
в билдере, как уже сказали, есть Inspect и Local Variables, студия и так массивы выводит. Кроме того в качестве контрольных значений можно задавать выражения: разыменование указателя (*ptr), получение адреса переменной (&var), сумма переменных, логические операции и т.д.
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
06.03.2012, 16:28  [ТС]
Про Wath List: специально выкристализовал маленький кусочек кода из проекта побольше
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/// Unit1.h
class MList
{
protected:
     long FCount;
    inline int GetCount()
    { return FCount;
    }
public:
    __property int Count = {read=GetCount};
    MList()
    { FCount=3;
    }
};
//---------------------------------------------------------------------------
class TSetka
{public:
    MList Point;
};
//---------------------------------------------------------------------------
 
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    TSetka* Setka;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
 
/// Unit.cpp
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{ Setka=new TSetka;
    ShowMessage(Setka->Point.Count);
    int a=0; //// !!!! здесь ставим точку останова и смотрим в Wath List переменную Setka->Point.Count
}
Здесь ShowMessage показывает "3", а Wath List какую то ерунду (Версия XE).

Про вызов ф-ции из других ф-ций пример не оч удачный, а вот onMouseMove() и onDraw() вполне хороший.
Про цикл: если цикл от 1 до 10000, и где то в середине есть ошибка на каком конкретно шаге неизвесно, на что ставить условие срабатывания? Как узнать на каком шаге цикла ошибка (пусть для простоты шаг от запуска к запуску не меняется)? А если шаг плавает?
А еще, если у вас несколько потоков выполняют одну ф-цию одновременно, и пошаговую отладку кидает из потока в поток (понятно, что сначала отлаживается один поток, но ошибка может появляется именно при многопоточности) и как тогда отлаживать?

про Inspect: как с помощью него посмотреть содержимое массива "с" в этом коде:
C++
1
int *c=new int[10];
для точек останова можно также задать запись в лог при срабатывании и вывод в лог результата вычисления выражения, задаваемого программистом, или просто содержимое некоторой переменной. И это все может происходить без останова программы
И как это сделать?
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
06.03.2012, 17:10
Цитата Сообщение от gumi250 Посмотреть сообщение
Здесь ShowMessage показывает "3", а Wath List какую то ерунду (Версия XE).
Попробуйте способ интерпритации поменять, правый клик на контрольном значении - Edit Watch...


Цитата Сообщение от gumi250 Посмотреть сообщение
Про цикл: если цикл от 1 до 10000, и где то в середине есть ошибка на каком конкретно шаге неизвесно, на что ставить условие срабатывания? Как узнать на каком шаге цикла ошибка (пусть для простоты шаг от запуска к запуску не меняется)? А если шаг плавает?
Тут нужно подбирать в каждом конкретном случае, смотря где ожидается ошибка.

Цитата Сообщение от gumi250 Посмотреть сообщение
про Inspect: как с помощью него посмотреть содержимое массива "с" в этом коде:
Видимо ручками

Цитата Сообщение от gumi250 Посмотреть сообщение
И как это сделать?
правый клик на бряке - Breakpoint Properties...
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
06.03.2012, 17:17

Не по теме:

может, и не в тему :pardon:


Function to write messages to the Event Log.
C++
1
2
OutputDebugString("Now starting dangerous function");
OutputDebugString(__FUNC__);
Протокол событий, функция OutputDebugString

В C++Builder предусмотрена возможность просматривать протокол сообщений о событиях, происходящих в процессе выполнения приложения в режиме отлад ки. Протокол этих сообщений вы можете посмотреть в процессе выполнения или после его окончания, выполнив команду View | Debug Windows | Event Log или нажав клавиши Ctrl-Alt-E. В открывшемся окне Event Log (его пример приведен на рис. 2.49) вы увидите протокол событий. На рис. 2.49 вы можете видеть, в частно сти, сообщения точек прерывания, введенных ранее в разд. 2.8.7: три последние строки относятся к точке прерывания по i = 26, строки с 3 по 8 — к точке прерывания по А > 10299. Щелкнув в окне правой кнопкой мыши, вы можете сохранить протокол в файле, прокомментировать его, очистить.

Какие именно сообщения отображаются в этом окне определяется настройкой отладчика, которая рассмотрена в разд. 15.8. Для пользователей, не слишком сведущих в системном программировании, можно рекомендовать ограничиться сообщениями о точках прерывания и сообщениями, генерируемыми функцией OutputDebugString. Об этой функции надо сказать особо. Это функция API Windows, определенная следующим образом:
C++
1
VOID OutputDebugString(LPCTSTR IpOutputString);
Ее параметр IpOutputString является указателем на строку текста с нулевым символом в конце.

Функция OutputDebugString в процессе отладки выдает сообщение, которое вы можете наблюдать в окне протокола сообщений о событиях Event Log. Но если отладчик отключен или если выполняемый модуль вашего приложения запускается непосредственно, а не из среды C++Builder, то функция OutputDebugString ничего не делает. Таким образом, вы можете внести в разных местах своего приложения вызовы OutputDebugString с соответствующими сообщениями, которые покажут вам ход выполнения приложения в режиме отладки. А когда вы или другие пользователи впоследствии запустят приложение в обычном режиме, наличие в нем вызовов ничем не помешает, кроме очень незначительных затрат времени и незначительного увеличения объема модуля.

Можете опробовать этот инструмент в тестовом приложении, рассмотренном ранее, вставив, например, в конце функции
C++
1
2
TForml::ButtonlClick оператор
OutputDebugString( ("Окончание цикла: А = " + FloatToStr(А) ) . c _ s t r ( ) ) ;
Результат выполнения тестового приложения с этим оператором и приведен на рис. 2.49 (см. вторую строку окна). Только прежде, чем запускать ваше приложение, посмотрите в разд. 15.8, как отключить системные сообщения. В противном случае вы с трудом найдете свои сообщения среди множества системных.
1
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
06.03.2012, 18:07  [ТС]
Попробуйте способ интерпритации поменять, правый клик на контрольном значении - Edit Watch...
Пробовал не помогает, и что делать?

- про Inspect: как с помощью него посмотреть содержимое массива "с" в этом коде:
C++
1
int *c=new int[10];
-Видимо ручками
т.е. можно только по одному элементу? Ну это конечно оч удобно.

правый клик на бряке - Breakpoint Properties...
Ну это конечно тоже очень удобный инструмент при учете того что все эти брекпоинты пропадут при закрытии проекта.

OutputDebugString( ("Окончание цикла: А = " + FloatToStr(А) ) . c _ s t r ( ) ) ;
Вы реально полагаете, что это удобно?

Я думал, что у профессионалов есть какие то более удобные и мощные инструменты заменяющие хорошее логирование, но я не ожидал, что все так грусно . Неужели вы отлаживаете проги используя только это, но это же мазахизм чистой воды? Логер с легкостью решит большинство из описаных мной проблем. Но почему то большинство не пользуется логерами, а использует, на мой взгляд какие то извращения в виде OutputDebugString и Breakpoint Properties.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
06.03.2012, 18:20
1.
C++
1
#pragma message ("Свой текст")
2.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef TFastLogerH
#define TFastLogerH
//---------------------------------------------------------------------------
#include <windows.h>
#define ENDL "\n"
class TFastLoger
{
  HANDLE hConsole;
  public:
  TFastLoger();
  TFastLoger &operator << (char *cMessage);
};
extern TFastLoger Log;
#endif
 
//---------------------------------------------------------------------------
#pragma hdrstop
#include "TFastLoger.h"
 
//---------------------------------------------------------------------------
TFastLoger::TFastLoger()
{
  AllocConsole();
  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  char hello[] = "<------------ FAST LOGER WINDOW ------------>\n";
  WriteConsole(hConsole, hello, strlen(hello), 0, 0);
}
 
TFastLoger &TFastLoger::operator << (char *cMessage)
{
  #ifndef NDEBUG
    DWORD written;
    WriteConsole (hConsole, cMessage, strlen(cMessage), &written, NULL);
  #endif
  return *this;
}
 
#pragma package(smart_init)

Не по теме:

не майо

0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
06.03.2012, 18:52  [ТС]
Во первых хочется всех поблагодарить за проявленный интерес к данной теме.

Все же предложенные вами средства, в описаных мной задачах, на мой взгляд являются не удобными и мало эффективными. Вот к примеру простой логер (файл прилагается) , он написан под дельфи (не мной, давно где то скачал). Но все же он показывает хоть какое то удобство работы. Есть что то подобное под С++ builder? Или вы скажите, что предложенные вами методы удобнее?
Вложения
Тип файла: rar overseer_2.rar (404.2 Кб, 11 просмотров)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
06.03.2012, 19:10
gumi250, я не говорил, что удобнее, я говорил про варианты. А лично мне удобнее всего что-нибудь типа этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//---------------------------------------------------------------------------
#include <fstream>
//...
void LogWriteString(AnsiString LogMessage,AnsiString Note)
{
  AnsiString DATE_TIME = FormatDateTime("YYYY-MM-DD",Date())+
                         "/"
                         +FormatDateTime("HH:NN:SS:ZZZ",Time());
  FILE *f = fopen("log.txt", "a");
  if (f) {
    fprintf (f, "%s - %s, %s\n", DATE_TIME, LogMessage,Note); // получение currentTime описывать не стал, оно тут просто для примера
    fclose(f);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  LogWriteString(Button1->Caption,"\"Примітка\"");
}
//---------------------------------------------------------------------------
1
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
07.03.2012, 06:53  [ТС]
Вы серьезно рассматриваете предложенные здесь варианты как удобные и допустимые?
У меня есть самописный логер. 80% багов я ловлю в нем. Периодически накапливаются мои хотелки, которые я в нем реализую. И вот перед очередной такой реализацией мне тут подумалось, а может зря я велосипед придумываю и время трачу, наверняка у профессионалов что то подобное уже реализованно и наверняка даже лучше.
Приведу маленький пример моего лога. Это мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "MTrace.hpp" ////мой логер
int Func( int X)
{ _TFB_; /// начало ф-ции
  _TFl(X); /// значение переменной
  _TFE_; /// конец ф-ции
}
void __fastcall TForm2::Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{ _TFB_
  _TT(this); /// тип переменной
  Func(X);
  _TV(Sender); /// адрес
  _TFl(Panel1->Caption); /// значение переменной
  _TFE_;
}
Отладочного кода я написал тут куда меньше вашего, а полезной инфы в логе (скриншот лога прилагаю) куда больше. Естественно это все реал-тайм и есть фильтры, а при дабл клике на строке в логе, codegear перебрасывает меня на соответствующее место в исходнике. Подобного отладочного кода я пишу много и редко удаляю (лень и потом пригождается), поэтому лог может достигать несколько десятков тысяч строк! И темне-менее зачастую я почти реал-тайм нахожу нужный мне кусок в логе. И это я считаю почти удобным (хотелки опять накопились).
Я ожидал услышать, что у профессионалов есть столь же удобные инструменты отладки, а услышанный ответ поставил меня в недоумение. Я искренне не понимаю КАК вы ловите баги.
Миниатюры
Об отладке. Трассировка и более удобные инструменты.  
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
07.03.2012, 10:24
Цитата Сообщение от gumi250 Посмотреть сообщение
Вы серьезно рассматриваете предложенные здесь варианты как удобные и допустимые?
gumi250, ваша позиция на протяжении всего обсуждения - "ну и дураки же вы все" - вызывает, по крайней мере, удивление, тем более, что вы же являетесь и автором темы. Считая, что этот вопрос вас интересует, вам ответили и рассказали о разных вариантах, своих, чужих, стандартных, ни в чем вас не убеждая и ни к чему вас не принуждая. Как делать - решать вам, остальным ваши решения глубоко безразличны, каждый работает так, как ему удобнее. Будьте более благосклонны к людям, чьим мнением вы интересуетесь, имхо.
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
07.03.2012, 10:25
Я вас огорчу, у большинства программистов отсутствует необходимость в таком подробном логгировании. Вот что не хватает билдеру, так это хорошой системы отлова уязвимостей и ошибок типа PVS-Studio или ReSharper, которые есть для Visual Studio.
Цитата Сообщение от gumi250 Посмотреть сообщение
Я искренне не понимаю КАК вы ловите баги.
Мы их не создаём
2
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
07.03.2012, 11:12  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
gumi250, ваша позиция на протяжении всего обсуждения - "ну и дураки же вы все" - вызывает, по крайней мере, удивление...
Я этого не хотел. Точки останова и Wath List не сохраняются при закрытии проекта и Wath List не всегда срабатывает, поэтому их применение довольно ограничено. Поэтому я хотел узнать о наличии удобных способах отладки для билдера. Я описал некоторые возможные баги которые довольно сложно решить с помощью стандартных методов. Попросил привести возможные варианты их решинеия, но предложенные вами варианты на мой взгляд если и способны отловить описанные баги, то потратят огромное кол-во времени и сил программиста. Конечно, если вам будет приятно, я могу сказать что предложенные вами варианты это супер варианты профессионального уровня и я в восхищении, но я так не считаю. Я ожидал большего.

Вот что не хватает билдеру, так это хорошой системы отлова уязвимостей и ошибок типа PVS-Studio или ReSharper, которые есть для Visual Studio.
Спасибо! Не знаю пока что это, но я посмотрю. Вот примерно это я и хотел услышать! Пусть это для студии (хотя бы идею посмотрю), но судя по всему это какой то серьезный дополнительный инструмент профессионального уровня.

Я вас огорчу, у большинства программистов отсутствует необходимость в таком подробном логгировании.
А может у них отсуствует не необходимость а возможность?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
07.03.2012, 11:28
Цитата Сообщение от gumi250 Посмотреть сообщение
А может у них отсуствует не необходимость а возможность?
И что не так с возможностью? Реализовать класс для логирования достаточно просто.
Только чтобы отловить баги, которые ты выше описал, такие инструменты не нужны, стандартных легко хватит без извращений.
Цитата Сообщение от gumi250 Посмотреть сообщение
но предложенные вами варианты на мой взгляд если и способны отловить описанные баги, то потратят огромное кол-во времени и сил программиста
На мой взгляд, это уже проблема программиста, что он не может с использованием вполне себе хорошего инструментария найти багу, а не инструментария.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.03.2012, 11:28
Помогаю со студенческими работами здесь

Удобные вкладки для контактов
помогите создать вот такую систему вкладок или дайте ссылку может есть готовый вариант. пробовал делать чисто на css то при...

Быстрые и удобные способы создания элементов
Много вложенных объектов, создаю блок, чтоб его потом заполнить циклом данными. Подскажите способы, как можно оптимизировать эти три...

Каким образом можно сделать удобные окошки?
Добрый вечер, господа форумчане. Интересно узнать, с помощью каких средств можно сделать удобные окошки (как в Visual Studio, или VMware,...

WPF: готовые удобные решения для MVVM
По мотивам последних рекомендаций, посоветуйте готовые решения под следующие критерии. * только 'PostSharp' и аналоги не советуйте,...

Какие самые удобные графический библиотеки вы используете?
Работая на python приходится встречаться с GUI библиотеками. Мне вдруг стало интересно, какие графические библиотеки самые хорошие,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru