вторник, 29 января 2013 г.

Глючит wxARG 1.2.0-rc3

1. Не создается новая запись
- нужно в с генерированных файлах
"bool newRow=true;"
заменить на
"newRow=true;"
Альтернативное решение, более универсальное, изменить шаблон для этого
- нужно в файле wxActiveRecord.ctmp
"bool newRow=true;"
заменить на
"newRow=true;"
2. Не получается изменять и вставлять новые записи
- нужно в с генерированных файлах
"(,"
заменить на
"("
- нужно в с генерированных файлах
"UPDATE %s SET ,"
заменить на
"UPDATE %s SET "
3.
BUG: Глюк wxARG 1.2.0-rc3 & Firebird

четверг, 17 мая 2012 г.

Решение задачки на Си


Решил задачку для студента Пермского политеха, вот ниже решение без матчасти и в упрощенной постановке (чтоб не показывать как нашел точку пересечения эллипса с окружностью, в этом соль решения). Определяем принадлежность точки областям А или B.

#include <stdlib.h>
#include <stdio.h>    // чтоб обеспечить ввод/вывод
#include <math.h>     // чтоб использовать стандартные математические функции
#include <windows.h> // Чтоб русифицировать вывод в консоль, в окне консоли шрифт поменять

int blnCircle(double x,double  y,double R,double xo,double yo );
int blnEllips(double x,double  y,double a,double b,double xe,double ye);

int main()
{
    //Чтоб русифицировать вывод в консоль, в окне Свойства консоли шрифт поменять на TT
    // в аргументах кодировка файла для UTF-8 ~ 65001, а для cp1251 ~ 1251
    SetConsoleCP(65001);
    SetConsoleOutputCP(65001);

    double R,x,y,a,b,xo,yo,xe,ye;
    double t1,t2,c;     // Промежут. данные для расчета центра эллипса

    do
    {
        printf("Введите радиус окружности (R>=15):\n");
        scanf("%lf",&R);
    }
    while(R<15);

    do
    {
        printf("Введите значения полуосей эллипса a и b (b>a, 2b>=40 ):\n");
        scanf("%lf%lf",&a ,&b) ;
    }
    while(b<=a || 2.0*b<40);

    printf("Введите координаты точки для проверки, принадлежности её областям A или B\n");
    scanf("%lf%lf",&x ,&y) ;

    /// Определим центр окружности
    xo=(38-sqrtf(-900+60*R));
    yo=(R-30);

    /// Определим центр эллипса
    c=sqrt(pow(b,2)-pow(a,2));
    t1=pow(40.0-b+c,2);
    t2=pow(c-40+b,2);
    xe=9.0 - sqrt((4.0*t1*t2-pow(t1+t2-4*b*b,2))/(-16.0*pow(b,2)));
    ye=40.0-b;




    if( blnEllips(x,y,a,b,xe,ye) && x<=0 && y>=9 && !blnCircle(x,y,R,xo,yo))
        printf ("Точка принадлежит области A\n");
    else if(!blnEllips(x,y,a,b,xe,ye) && blnCircle(x,y,R,xo,yo) && y>=0 && x>=0 && y<=9)
        printf("Точка принадлежит области B\n");
    else
        printf("Точка не принадлежит областям A и B\n");

    system("pause"); // Останов программы под Windows, чтоб успеть результат посмотреть
    return 0;
}


/// Проверка принадлежности точки области ограниченой окружностью и получения её цнтра
int blnCircle(double x,double  y,double R,double xo,double yo)
{
    return (pow((x-xo),2)+pow(y-yo,2)<=pow(R,2));
}

/// Проверка принадлежности точки области внутри эллипса и его центр
int blnEllips(double x,double y,double a,double b,double xe,double ye)
{
    return ( pow(x-xe,2)/pow(a,2)+pow(y-ye,2)/pow(b,2)<=1 );
}


среда, 22 февраля 2012 г.

Эллипсис в C/C++

Эллипсис (многоточие в описании функции, там где аргументы) может приводить к ошибкам сегментации памяти. Если, например,


//Функция, просто выводит один аргумент за другим
void f(char *s1, ...)
{
char **cp = &s1; //--адрес первого указателя
while (*cp)
{ std::cout << (*cp) << std::endl;
cp++; //-- перемещаемся на следующий аргумент
}
}

// ...
f("First ","Two ","Three ", 0); // - это правильный вызов, 0 - признак конца списка аргументов
// ...
f("First ","Two ","Three "); // - это ошибочный вызов, дающий ошибку сегментации
// ...


Вот значит, что VB с людьми делает - появляются вредные привычки в программировании.

среда, 7 декабря 2011 г.

Алгоритмическое мышление (заповеди программиста)

Алгоритмическое мышление - это слабое место, многих начинающих программировать людей. Тренировать его можно, просто решая задачки, головоломки, играя в шахматы и др. Математика помогает в этом, безусловно.
В общем-то арсенал конструкций для составления алгоритмов не велик:
- следование;
- ветвление;
- циклы (с предусловием, с постусловием и параметризованный).
Немного математики, знание функций и операций для конкретной среды программирования и на выходе получаем программки, при условии наличия и использования мозга.
Для языка Си основные моменты, необходимые для создания простых консольных программ, можно при желании разместить на одной странице.
Алгоритмическое мышление - это основной инструмент программиста. Этот аппарат, надо холить и лилееть, материальным носителем его является "серое вещество", следовательно мозги надо держать в тонусе и бережно к ним относится. В некотором смысле, мозг работает как мышца, ей нужна тренировка, отдых и питание. Пагубны для "серого вещества" алкоголь и табак, а так же их аналоги (наркотик, кальян, психотропные лекарства и др.).
В здоровом теле - здоровый дух.
Есть и другие факторы, мешающие раскрытию потенциала "серого вещества", например, СМИ (особенно если они выполняют, чей-то политический или др. заказ), развлекательные шоу и др., по сути, они создают информационный шум, будоража воображение, отвлекая и препятствуя ясности мышления.
Понятно, что для того, чтобы преуспеть в программировании, да и в других областях, где нужно мышление как основной инструмент, надо придерживаться некоторых правил, т. е. соответствующего образа жизни. Подозреваю, что эти правила будут иметь некоторое существенное сходство с уставом монастыря, в части, которая связана с духовным развитием.
Хорошо бы выработать десятку правил, которые оберегали бы тонкую нервную организацию программистов (типа заповедей программиста).

воскресенье, 27 ноября 2011 г.

Пример использования SQLite3

В примере используется функция wxLogMessage из библиотеки wxWidgets для вывода на экран, можно ее заменить printf, убрав wxT, суть не в этом, только надо помнить, что SQLite3 библиотека использует Unicode (UTF-8).


sqlite3 *db;
int rc;

rc = sqlite3_open("test.sqlite", &db);

if( rc )
{
wxLogMessage(wxT("Can't open database: %s"), sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}

sqlite3_stmt *pStmt;
char zSql[] = "SELECT * From tbl;";

do
{
/* Компилираем запрос SQL. Ожидаем успех.*/
sqlite3_prepare(db, zSql, -1, &pStmt, 0);

while( SQLITE_ROW==sqlite3_step(pStmt) )
{
/* Что-то делаем с записью */
wxString str = wxString((const char*)sqlite3_column_text(pStmt, 1), wxConvUTF8);

wxLogMessage(wxT("%d | %s"),sqlite3_column_int(pStmt,0),str.c_str());

}

/* Завершаем запрос. Если ошибка SQLITE_SCHEMA
** произошло, то вышестоящий вызов sqlite3_step()
** вернул SQLITE_ERROR. sqlite3_finalize() вернет
** SQLITE_SCHEMA. В этом случае повторяем цикл.
*/
rc = sqlite3_finalize(pStmt);
}
while( rc==SQLITE_SCHEMA );

wxString Sql;

Sql=wxT("Select * From tbl;");

do
{
/* Компилираем запрос SQL. Ожидаем успех. */
sqlite3_prepare(db, Sql.ToUTF8(), -1, &pStmt, 0);

while( SQLITE_ROW==sqlite3_step(pStmt) )
{
/* Что-то делаем с записью */
wxString str = wxString((const char*)sqlite3_column_text(pStmt, 1), wxConvUTF8);

wxLogMessage(wxT("%d | %s"), sqlite3_column_int(pStmt,0),str.c_str());
}

/* Завершаем запрос. Если ошибка SQLITE_SCHEMA
** произошло, то вышестоящий вызов sqlite3_step()
** вернул SQLITE_ERROR. sqlite3_finalize() вернет
** SQLITE_SCHEMA. В этом случае повторяем цикл.
*/
rc = sqlite3_finalize(pStmt);
}
while( rc==SQLITE_SCHEMA );

sqlite3_close(db);

среда, 16 ноября 2011 г.

Вирус - вымогатель

На одном из компов при входе под пользователем, появилось сообщение угрожающего содержания.
Что делать?
Уходим в спящий режим. Загружаемся.
Входим под другим пользователем с правами администратора.
Запускаем диспетчер задач.
Включаем галочку "Отображать процессы всех пользователей".
Находим подозрительную задачу нашего неосторожного пользователя и завершаем её.
Меняем пользователя, заходим под проблемным пользователем и запускаем диспетчер задач.
В меню диспетчера задач выбираем Выполнить и набираем "Мои документы" или explorer, чтоб панель задач появилась и другие сомнительные удобства Windows.

Лечим, ...

понедельник, 14 ноября 2011 г.

Создание базы sqlite3 из командного файла

Имею файл db.sql, сожержащий команды для консольного sqlite3-клиента.
В Windows делаю так:

type db.sql | sqlite3 database.db

Эти команды можно прописать в командном файле для cmd.

В ОС семейства Unix можно выполнить:

cat db.sql | sqlite3 database.db


Более универсально, делать так

sqlite3 database.db < db.sql


В db.sql можно запихнуть, в принципе, достаточно сложные команды, да и сам командный файл можно сделать не тривиалным, если знать команды оболочки и SQL.