Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #121


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 121.  11 октября 2011 г.

Здравствуйте, уважаемые читатели!

Сегодня предлагаем вам фрагмент статьи «SQLite. View и триггеры» и подборку свежих тем нашего форума.




Пополнение «Книжной полки разработчика систем со встроенными микропроцессорами». За прошедший с прошлого выпуска период добавлена только одна книга: Мартин Фаулер. «Рефакторинг. Улучшение существующего кода». Символ-Плюс, 2008. ISBN 5-93286-045-6, 978-5-93286-045-8, 0-201-48567-2. Здесь ее обсуждение.




Приятного чтения!





Вводная


Некоторое время назад я заинтересовался SQLite. Это очень легкая встраиваемая реляционная база данных. Многие пользуются базами данных SQLite и даже не догадываются об этом. Примеры широко распространенных приложений, использующих SQLite — Mozilla Firefox (и другие продукты на платформе XUL), фремворк Qt и Skype. Также SQLite используется в API платформы Android.

Раньше мне вполне хватало MySQL для web-проектов и приложений небольшого масштаба (для больших приложений хорошо подходит Oracle). Но для малых приложений, работающих на одном хосте с базой данных, это не всегда удобно, так как, во-первых, СУБД MySQL нужно устанавливать и настраивать (от правильной настройки зависит производительность), во-вторых, нужны административные действия по управлению базами и пользователями. В таких случаях применяют встраиваемые базы данных. SQLite — одна из них.


Вкратце распишу достоинства SQLite:


  • Открытый исходный код и лицензия LGPL, позволяющая использовать библиотеки SQLite даже с коммерческими программами.
  • Стандартный язык SQL.
  • Поддержка весьма больших для встраиваемых баз объемов (теоретически, до 32 ТБ).
  • Очень приличные лимиты (SQLite — Ограничения). Самым жестким из них является ограничение на 10 баз данных на одно подключение к библиотеке.
  • Поддержка доступа к файлу базы данных от нескольких потоков и процессов.
  • Поддержка транзакций и точек сохранения, два варианта логов отката и автоматическое управление им.
  • Поддержка расширений (доступен API).
  • Поддержка UDF-функций, находящихся в самом приложении.
  • Поддержка индексов — уникальных и не уникальных, с прямой и обратной сортировкой. Через расширение можно создать индекс полнотекстового поиска.
  • Поддержка вложенных запросов, представлений, триггеров, внешних ключей и автоматической нумерации новых строк (autoincrement).
  • Хранение строк таблицы в двоичном дереве. Каждая строка имеет идентификатор, по которому она находится в дереве быстрее, чем по индексам. В определенных условиях rowid совпадает с первичным ключом.
  • Поддержка таблиц статистики.
  • Поддержка баз только для чтения.
  • Поддержка UTF-8 и UTF-16.
  • Поддержка баз данных в файлах и в памяти.
  • Простота создания копий (что весьма часто приходится делать при тестировании приложения): просто скопировать файл.
  • Имеет поддержку для различных популярных языков программирования.
  • Есть механизм подготовленных запросов с поддержкой именованных и неименованных параметров.

Но самое главное достоинство SQLite — скорость работы. А если отключить поддержку логов отката (и транзакций, соответственно), то скорость работы возрастет еще на 1-2 порядка. Конечно, на больших объемах и нагрузках серьезные СУБД будут намного быстрее и эффективнее. На их нишу SQLite не претендует.


Конечно, есть у SQLite и минусы:


  • Система блокировок: shared или exclusive блокировка ставится на весь файл базы данных. Штатный режим работы транзакций — SERIALIZABLE. Хотя поддерживается и READ UNCOMMITED (соответственно, без блокировок).
  • Ограниченный набор типов столбцов: INTEGER, REAL, TEXT и BLOB. Дату и время хранят в одном из первых трех перечисленных типов.
  • Скудный набор встроенных функций.
  • Нет пользовательских процедур и функций — только через UDF.
  • ALTER TABLE допускает только добавление столбцов.
  • Нет пользовательских переменных.

Создается база данных просто: если файла, указанного как база, не существует, то SQLite автоматически создает пустой и при любой DDL-операции заполняет его заголовок.

Рекомендую использовать SQLite не ниже версии 3.7.0. У меня в тестах использовалась именно эта версия.


Объект с историей


В приложениях нередко требуется хранение полной истории объектов (таблиц). С увеличением количества объектов работа с ними становится сложнее, а запросы к базе данных становятся громоздкими и медленными. Приведу пример объекта jobcards (можно понимать как «заявки на выполнение работ» или «заявка-наряд»). В примерах я показываю два столбца «полезной нагрузки» только для наглядности.


Код: (sql)
CREATE TABLE jobcards
(
    jobcard_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    ctime REAL NOT NULL,
    data1 TEXT,
    data2 TEXT
);

Запрос выборки:


Код: (sql)
SELECT *
  FROM jobcards
  WHERE jobcard_id = :JOBCARD_ID

Данный пример не поддерживает истории — возможна только одна строка на один идентификатор. Изменим таблицу:

...


Полностью прочитать статью можно на нашем сайте, в разделе «Базы данных».

  • Программирование :: Неотложка
  • Добрый день.Пытаюсь разобраться с блокированием нажатия определенных клавиш на клавиатуре.К примеру,пытаюсь заблокировать нажатие клавиши g.
    Поискал в интернете+сам кое-что додумал и получил следующий код
    Код:
    #include <dos.h>
    #include <stdio.h>
    #include <conio.h>

    void _interrupt _far On_Or_Off(void);
    void (_interrupt _far *oldvect)(void);
    char Mode = 0, Exit=0;
    char string[10];
    void _interrupt _far On_Or_Off(void)
    {
      unsigned char value,Shift=0x02,Alt=0x08,c;
      value=peekb(0x40,0x17);

      if( (inportb(0x60)== 0x41 )&& (value&Shift)&& (value&Alt) )
      {
       if(Mode==0)
       {
        Mode=1;
        cprintf("The g button is LOCKED\n\r");
       }
       else
       {
        Mode=0;
        cprintf("The g button is UNLOCKED\n\r");
       }
      }

      if( (Mode==1) && (inportb(0x60)== 0x22 ) )
       {
        c=inportb(0x61);
        outportb(0x61,c|0x80);
        outportb(0x61,c);
        outportb(0x20,0x20);

       }

      if( (inportb(0x60)== 0x1 ) )
        Exit=1;

      _chain_intr(oldvect);
    }

    int main ()
    {
    clrscr();
    oldvect = _dos_getvect(0x9);
    _dos_setvect(0x9, On_Or_Off);
    printf("Press Alt+Shift+F7 to block/unlock g button on keyboard\n");
       printf("Enter A Char String\n");
       scanf("%s",string);
    for(;!Exit;)
        sleep(1);
    _dos_setvect(0x9,oldvect);
    getch();
    return 0;
    }


    Включение нового обработчика после нажатия Alt+Shift+F7 происходит успешно,однако сама клавиша не блокируется при нажатии и преспокойно отображается на экране.
  • Возникли трудности с рабором работы мыши.
    Конкретно по делу:
    Код:
    #include<conio.h>
    #include<stdio.h>
    int main()
    {   int X,Y;
    int i=0;
    unsigned char mask=1;
    unsigned char SCAN;
    int BUT;
    int IS_ON;
    clrscr();
    asm {
         mov AX,3;
         int 0x33;
         mov X,CX;
         mov Y,DX;
         mov BUT,BX;
         mov AX,0;
         int 0x33;
         mov IS_ON,AX;
         }
    printf ("%d,%d.\n",X,Y);

    if (IS_ON==0x0FFFF)
    printf ("Mouse Is On\n");
    else
    if (IS_ON==0x0000)
    printf ("Mouse Is Off\n");

    for(i=0;i<3;i++) {
    if (mask & BUT)
    {
      if (i==0)
      printf ("Left Mouse Button\n");
      if (i==1)
      printf ("Right Mouse Button\n");
      if (i==2)
      printf ("Middle Mouse Button\n");
    }
    mask=mask<<1;
    }

    asm { mov AH,0;
          int 0x16;
          mov SCAN,AH;
          }
    if (SCAN==16)
    asm { mov AX,2;
          int 0x33;
          }
    getch();
    return 0;
    }

    1)Вывод на экран координат X,Y
    Код:
    mov AX,3;
          int 0x33;
          mov X,CX;
          mov Y,DX;
          printf ("%d,%d.\n",X,Y);
    Результат - координаты выводит.Но только почему-то они не всегда обновляются.Могу получить координаты,выйти из программы,переместить курсор мыши,снова запустить программу,но координаты останутся те же.А иногда меняются на другие.Не понятна причина.

    2)Инициализация мыши IS_ON
    Код:
    mov AX,0;
          int 0x33;
          mov IS_ON,AX;
          if (IS_ON==0x0FFFF)
          printf ("Mouse Is On\n");
          else
          if (IS_ON==0x0000)
          printf ("Mouse Is Off\n");
    Результат - работает корректно.Вроде бы.По крайней мере при подключенной к компьютеру мышке выдает Mouse Is On

    3)Проверка на нажатие кнопки мыши BUT
    Код:
    mov BUT,BX;
          for(i=0;i<3;i++) {
          if (mask & BUT)
          {
          if (i==0)
          printf ("Left Mouse Button\n");
          if (i==1)
          printf ("Right Mouse Button\n");
          if (i==2)
          printf ("Middle Mouse Button\n");
          }
          mask=mask<<1;
          }
    Результат - программа запущена,нажимаю кнопку мыши(правую/левую),сообщение не появлется.Подозреваю,что нужно,чтоб кнопка была нажата во время запуска программы,но с зажатой кнопкой мыши CTRL+F9 упорно не хочет запускать программу.Вопрос.Как сделать так,чтоб программа ожидала нажатия кнопки мыши,а затем выводила соответствующее сообщение о нажатой клавише?

    4)Ну и последнее - при нажатии клавиши скрыть курсор мыши
    Код:
    asm { mov AH,0;
          int 0x16;
          mov SCAN,AH;
          }
          if (SCAN==16)
          asm { mov AX,2;
          int 0x33;
          }
    Нажимаю q после запуска программы - ничего не происходит,а по-идее должен пропадать курсор.Что не так?
    Кто может и захочет - хоть по какому-то вопросу дайте пояснения.Благодарю.
  • Здравствуйте.
    Работаю системным администратором в вузе, периодически появляются проблемы с программой - интерфейс+функции к базе данных Access, разработчику которой давно не платят, поэтому он (справедливо, на мой взгляд) ее не поддерживает (только если долго и слезно умолять). В общем то, это и не мое дело тоже, но уж раз что-то могу...-решаю вопросы по мере возникновения написанием макросов Microsoft Visual Basic для Office 2003.

    Имеется шаблон Microsoft Word с таблицей, которая заполняется  с помощью программы см. выше. В базе есть два типа заполненных полей - кредиты Барда и кредиты ECTS. В 2008 году в шаблон выводились кредиты Барда, а в прошлом году потребовалось выводить туда же кредиты ECTS, которые в большинстве случаев кредиты Барда*2.

    Я попыталась решить вопрос написаниемм следующего макроса:
    Код: (vb)
    Sub Person_Credits()
    Dim Cred As Integer
    Dim Cred_EC As Integer
    Dim Tbl As Table
    Dim i As Integer
    Dim Course_Type, Course_name As String
    Set Tbl = ThisDocument.Tables.Item(1)
    For i = 2 To Tbl.Rows.Count
     Course_Type = Tbl.Cell(i, 2).Range.Text
     If Course_Type = "Экзамен" Then
      Cred = Val(Tbl.Cell(i, 5).Range.Text)
      Cred_EC = Cred * 2
      Tbl.Cell(i, 5).Range.Text = Str(Cred_EC)
     Else:
         Course_name = Tbl.Cell(i, 1).Range.Words(1).Text
        If Course_name = "физра" Or "Обж" Then
          Tbl.Cell(i, 5).Range.Text = Str(0)
        Else:
         Cred = Val(Tbl.Cell(i, 5).Range.Text)
         If Cred = 2 Then
         Tbl.Cell(i, 5).Range.Text = Str(3)
         Else: Tbl.Cell(i, 5).Range.Text = Str(2)
         End If
        End If
     End If
     Next
    End Sub
    Столкнулась со следующим вопросом - так как шаблон заполняетя из базы, там стоят непечатаемые символы типа бублика с рожками - видимо, они отвечают за подстановку данных из базы. В результате мой код не кушает текст, так как текст воспринимается как переменная.
    Понимаю, что скорее всего, ничего у меня в этом случае не получится, но если кто-то может подсказать - буду благодарна. Срок до завтра.
  • Программирование :: Общий
  • Проблема наблюдается в компиляторах как C++, так и C#, и, возможно, других языков со статической типизацией и параметризированными классами.

    Есть классы:
    Код: (c++)
    template<class A, class B> class Z {};
    template<class C, class D> class Y {};
    template<class E, class F> class X: public Z<Y<E, F>, F> {};
    template<class G, class H> class W: public Y<G, H> {};
    class V {};
    class U {};
    class T: public X<W<V, U>, U> {};

    Z<W<V, U>, U> *a = new T();
    Чисто логически и теоретически последняя строчка должна выполняться, поскольку T - потомок Z, несмотря на параметры. На уровне байтов памяти (в случае reinterpret_cast) совместимость будет. Однако компиляторы заявляют, что приведение типов невозможно.

    Компилятор работает последовательно: сначала он подставляет параметры шаблонов, и только потом полученный код обрабатывается на предмет сочетаемости типов в силу наследования.

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

    В случае перебора по аналогии с тем, как работает среда исполнения Prolog, дерево поиска выглядело бы следующим образом:
    Код:
    T
      :
        [
         E = W<V, U>
         F = U
        ]
        X<W<V,U>,U>
          = [
             W<V,U>
              : [
                 C = G = V
                 D = H = U
                ]
                Y<V,U>
            ]
            X<Y<V,U>,U>
             : [
                A = E = Y<U, V>
                B = F = U
               ]
               Z<Y<Y<V,U>,U>,U> !
             : [
                A = Y<E,F>
                     = [
                        E = V
                        F = U
                       ]
                       Y<V,U>
                B = F = U
               ]
               Z<Y<V,U>,U> !
          : [
             A = E = W<V,U>
             B = F = U
            ]
            Z<Y<W<V,U>,U>,U> !
             = [
                W<V,U>
                 : [
                    C = G = V
                    D = H = U
                   ]
                   Y<V,U>
               ]
               Z<Y<Y<V,U>,U>,U> !
          : [
             A = Y<E,F>
                  = [
                     E = V
                     F = U
                    ]
                    W<V,U>
                     : [
                        C = G = V
                        D = H = U
                       ]
                       Y<V,U>
             B = F = U
            ]
            Z<Y<V,U>,U> !
    : - наследование, = - подстановка, [] - предварительные вычисления, ! - результат

    Из этого следует: во-первых и главное, неопределённость результатов типизации, которая заставит компилятор хранить все варианты типов для согласования разных мест программы, каждый раз подбирая наиболее подходящее соответствие и умножая неопределённость типа в расчётных цепочках (особенно в свете новомодных деклараций с автоматической типизацией - auto и var); во-вторых, пример благополучно разрешился бы.

    Но... реальность грубее и примитивнее. У компиляторов лишь один вариант приведения:  Z<Y<Y<V,U>,U>,U>. С одной стороны, это хорошо, что один, с другой стороны, это следствие упрощённых алгоритмов анализа кода с минимумом отложенных решений.
  • Интервал между фреймами в modbus RTU должен быть "длинной" не менее 3.5 единичной посылки. При скорости 115000 и 11 битах в единичной посылки интервал составит: 3.5 * 11 / 115000 = 0.335 мс. Вопрос: как его сфoрмировать при передаче  (подсчитать при приеме) при программировании под windows (обычные таймеры имеют разрешение 1 мс)?
  • Программирование :: Технологии разработки программных систем
  • Все доброго времени суток. В общем есть такое задание: сформировать набор предложений клиенту по целевым кредитам различных банков для оптимального выбора. Учитывать возможность досрочного погашения и/или продления кредитной линии. Реализовать выбор и поиск кредита.

    В общем, как я понял это задание: я (пользователь программы) - клиент банка, т.е. банк - кредитор а я - заемщик.
    Банки могут предоставлять кредиты различных видов. Мне (как клиенту) требуется из множества банков выбрать подходящий кредит с помощью поиска. Т.е. я ввожу параметры поиска (возможность продления, возможность досрочного погашения, процент кредитования, сумма кредита, кредит сроком до..., еще может что-нибудь посоветуете) , а программа выбирает мне по моим запросам подходящие кредиты различных банков.
    Задача должна решаться с помощью ООП.
    Поделитесь пожалуйста идеями, как можно решить данную задачу.
    Я не прошу написать техническое решение данной задачи, с помощью какого либо языка. Просто было бы здорово, если бы подкинули UML диаграмму решения данной проблемы.

    P.S. Возможно я не очень подробно изложил то чего хочу, т.к. сам еще не сильно понимаю, но думаю суть ясна.
    Спасибо.
  • Программирование :: .NET технология от и до
  • Доброго времени суток.
    Не может ли кто-нибудь подсказать, есть ли созданные на C# в последние года 2-3 проекты, сочетающие в себе большое количество вычислений и достаточно сложный интерфейс.
  • Программирование :: С/С++
  • Пытаюсь ответить на запрос браузера Received string "GET /blabla.png HTTP/1.1

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

    bytecount = send(*csock, buffer, buffer_len, 0)
    передать в buffer , заголовок http ответа + код картинки

    пробовал
                    FileHandle = CreateFileA("C:\\blabla.bmp",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
                   Size = GetFileSize(FileHandle, &Size);
                    if(Size>255) Size=255;
                    ReadFile(FileHandle, Line, Size, &R, NULL);
              *(Line+R)=0;
                   CloseHandle(FileHandle);
    через sprintf потом обьеденял заголовок и код картинки прочтенный.. проблема что идет преобразования в чар? избежать можно используя DWORD? затем в чар через static_cast,dynamic_cast?
    Цитата
    Server is listening on socket... 127.0.0.1:1101б
    waiting for a connection
    Received connection from 127.0.0.1waiting for a connection
    Received bytes 376
    Received string "GET / HTTP/1.1
    Host: 127.0.0.1:1101
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
    Connection: keep-alive
    Cache-Control: max-age=0

    "
    Sent bytes 187
    Send string "HTTP/1.1 200 OK
    Proxy-Connection: close
    Content-Language: ru
    Content-Length: 100

    <html><head></head><body>It Works!<br><img src="http://127.0.0.1:1101/blabla.png
    "</img>/body></html>"
    Received connection from 127.0.0.1waiting for a connection
    Received bytes 389
    Received string "GET /blabla.png HTTP/1.1
    Host: 127.0.0.1:1101
    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0
    Accept: image/png,image/*;q=0.8,*/*;q=0.5
    Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
    Connection: keep-alive
    Referer: http://127.0.0.1:1101/
    Cache-Control: max-age=0

    "
    Sent bytes 290
    Send string "HTTP/1.1 200 OK
    Proxy-Connection: close
    Content-Length: 116

    13780787113102610000137372688200030003820002177434 232000911272891150011180011181
    21022112625200038736865841202189911279178116774855 112129616815415029952996171621
    97144802724812349718168201301768181249255970000736 978681746696130"
  • Имеется код.
    Код: (cpp)
    #include <stdio>
    #include <iostream.h>
    #include <wtypes.h>
    #include <winsmcrd.h>
    #include <winscard.h>
    #include <ok.h>
    #include <scardcl.h>

    using namespace std;
    int main(int argc, char* argv[])
    {

    cout << "Start work\n";
    cin >> Z;
    LPSCARDCONTEXT hContext;
    SCARDCONTEXT    hSC;
    LONG            lReturn;

    [b]lReturn = SCardEstablishContext(SCARD_SCOPE_USER,
    NULL,
    NULL,
       &hSC);[/b]
    cout << "hSC =   " << hSC << "\n";
    cout << "lReturn =   " << lReturn << "\n";
    cin >> Z;
    if ( SCARD_S_SUCCESS != lReturn )
       {
       cout << "Failed SCardEstablishContext\n";
    cin >> Z;
    }
    else
    {
    LPTSTR          pmszReaders = NULL;
    LPTSTR          pReader;
    cout << "pmszReaders =    " << &pmszReaders << "\n";
    cout << "pReader =    " << &pReader << "\n";

    DWORD           cch = SCARD_AUTOALLOCATE;
    cin >> Z;


    lReturn = SCardListReaders(hSC,
       NULL,
       (LPTSTR)&pmszReaders,
       &cch );
    cout << "pmszReaders =    " << &pmszReaders << "\n";
    cout << "cch =    " << &cch << "\n";
    cin >> Z;

    }
    return 0;
    }
    Выделенная функция почему-то упрямо возвращает ноль, хотя в справке такой вариант не предусмотрен (сама функция просто скопированна из соотв раздела в help-е), и похоже вообще не работает.
    Подскажите пожалуста, с чем это может быть связано? Что я пропустил/сделал не так?
  • Есть архив, внутри лежит файлик (XML),  нужно считать с него данные о текущей версии ну и дальше делать то что мне нужно.... Не хочется разархивировать весь архив (хоть он и не большой, но ведь может разрастись!) ради одного файлика, как вы все понимаете это негативно сказывается на быстродействии.  Отсюда вопрос - какие есть стандартные (и не очень) средства что бы достучаться к этому файлику в архиве?
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Добрый день!

    Есть класс:
    Код: (cpp)
    class CBytes : public std::vector<BYTE>
      {
      public:
        CBytes()
          {}

        CBytes(const CBytes& str)
          :std::vector<BYTE>(str.begin(), str.end())
          {
          }
        CBytes& operator= (const CBytes& str)
          {
          if (this != &str)
            {
            clear();
            insert(end(), str.begin(), str.end());
            }
          return *this;
          }
      };

    И есть вот этот код:

    Код: (cpp)
    CArray<CBytes , CBytes> testArray;
    CBytes killme;
    testArray.Add (CBytes ());
    killme = testArray[0];
    testArray.Add (CBytes ());
    killme = testArray[0];
       

    если запустить этот код в дебаговой конфигурации – программа падает на последней строчке этого кода killme = testArray[0]

    Если конкретнее - падает внутри operator= на строке insert(end(), str.begin(), str.end());


    кто может объяснить данный феномен?

    У меня Visual Studio 2010, Windows 7 Pro 64

    Пробовал в проекте MFC Dialog-based, Unicode
  • Доброго времени суток. Суть проблемы такова:
    Выполняю все установки по инструкции http://www.sql.ru/forum/actualthread.aspx?tid=568906, прописываю пути в студии к хедерам и т.д. Дополнительно качаю PSDK 2003, устанавливаю, провожу операции с atlbase.h и atlwin.h, объясняю студии где брать файлы. Создаю проект wtl из визарда. Компилируется без проблем, но приложение вылетает с ошибкой, ссылаясь на atlwin.h в дебагере.
    (http://s52.radikal.ru/i136/1110/7b/6e2b1dad01d8.jpg)
    Поиск юзал, гугл тоже, но увы  :dontknow:
    Студия 2008 С++ эксп., WTL 8.0, файлы ATL из PSDK.
    Очень прошу помочь и объяснить доходчиво) Ибо мой мозг уже расплавлен. Спасибо.
  • Имеется проект VC6, wizard-Dialog, MFC, компиляция "Debug"
    Затирается переменная в классе Dialog.
    (вылечилось установкой опций компилятора выравнивания на 1 байт. Но это устранение последствий,
    причину понять не могу. Отладчик слабоват по информативности-не дает физ.адресов , начал уже просматривать листинги на asm)
    Кто глючит, я или компилятор ?  Как отловить супостата ?
    -------
    После долгих процедур с отладчиком, лог. поиском, установкой отладочных if(1) return(1)
    и методов "половинного деления" источник затирания нашелся.
    Это работа класса, входящего public в Dialog.
    при работе   MyClass::cMc.parse() меняется Dialg::f_arch    (!)
    Код: (cpp)
    class Dialog : public CDialog {
    .....
    public:
      MyClass cMc;    // конструктор-деструктор пустые.
      int f_arch;
    }

    при работе MyClass::cMc.parse():
    Код: (cpp)
    MyClass::parce(...) {
    . . . .
      n_elem = 0;  //  <--- оно меняет Dialg::f_arch  (вместо 0 подставлял различные значения)
    . . . .
    }

    Может из-за динамического выделения памяти ?
    Помогите советом, долбусь уже 2 дня  :(
  • забавная проблема напала: получается, что функция FindNextFile нереентерабельна, из-за чего рекурсивный поиск содержимого папки происходит неверно

    (слева - моё дерево, справа - проводниковое)
    содержимое папки C:\1111111111\2\3\  показано верно (она первая была просмотрена) , а вот папка C:\1111111111\3  показывает то же самое, что в предыдущей, хотя там совсем не то

    (http://forum.shelek.ru/index.php?action=dlattach;attach=6186;image)

    И как же этот рекурсивный поиск сделать, неужели вытаскивать содержимое по одной папке, затем по этим файлам пробегаться снова и заходить в каждую папку ?
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Доброго дня!
    Прошу помощи, не могу объяснить VB что в моей таблице cash  в первом столбце из 10 значений
    необходимо оставить 2 "ваучер" и "льгота"
    Я попробовала(см ниже), но тут же запустила бесконечный процесс
    ох, даже не знаю
    Код: (vb)
    ActiveSheet.ListObjects("cash").Range.AutoFilter Field:=1, Criteria1:=Array _
            ("_Неизвестная_", "взаимозачет", "Комиссия", _
            "предоплата", "Кредиты", "Проценты", "Таможня", "Хозрасходы"), _
            Operator:=xlFilterValues
     
    cashList.DataBodyRange.SpecialCells(xlCellTypeVisible).Select
    Selection.Delete
    ActiveSheet.ListObjects("cash").Range.AutoFilter Field:=1

  • Приветствую уважаемые коллеги! Подскажите пожалуйста, как сделать так что бы при загрузке формы, на ней создавалось поле с заранее известным именем, размерами и т.п.
    Дело в том что хочу забатцать программку бронирования мест в небольшой гостинице (Hostel) в виде интерактивной таблицы, т.е. строки: Комната 1, Комната 2 и т.д. а столбцы - это даты (интервал задается заранее). А на пересечении как раз таки и должны создаваться автоматически ячейки (двумя циклами например). Выглядеть это будет примерно так (картинка)...
    (http://forum.shelek.ru/index.php?action=dlattach;attach=6187;image)
     Цвет ячейки (поля) означает определенный тип брони. Присвоение цвета ячейкам проблем не вызывает, просто подскажите как автоматически добавлять поле при загрузке формы, достаточно на примере одного поля.
    Спасибо!
  • Программирование :: Программирование 1С :: 1С 8.x
  • Здраствуйте. Как можна решить следующую задачу. Есть документ путевой лист в нём две табличных части путевой лист и реестр накладных, каждая строка тч путевой лист имеет информацию о маршруте количестве ездок, растоянии с грузом и без, и тонаже по путевом листе; каждой строке. Как сделать привязку даных из таблицы реестр накладных к каждой строке ТЧ путевой лист. Тоесть необходимо чтобы при изменении строки тч путевой лист отображались только те накладные которые вводились во время редактирования этой строки какой то отбор по строке чтоли, и чтобы при редактировании в табличной части реестр накладных изменялось поле ввода тонаж, который равен суме всех строк которые выбраные отбором. Также есть необходимость из тч реестр накладных извлекать информацию для отчётов.
  • Добрый день

    есть документ НаработкаОборудованя, необходимо получить время работы оборудования (часы) из расчета введенных данных ДатаРаботыС  -  ДатаРаботыПо, вывод данных должен производиться автоматически в Наработка.ПолеВвода.
  • Операционные системы :: Windows
  • Изменить содержание  выпадающего меню Адресной строки  (проводник WIN+E)
    в вин хп содержит
    ........................
    Рабочий стол
    Мои документы
    Мой компьютер
    и тд.................

    Реестр?

    Добавлено через 3 дня, 22 часа, 58 минут и 56 секунд:
    (http://forum.shelek.ru/index.php?action=dlattach;attach=6195;image)
  • Направления программирования :: Drivers
  • Какой существует наиболее "низкий" с архитектурной точки зрения способ получить информацию о нажатых клавишах клавиатуры?
    Вот работаю в направлении перехвата процедуры обработки прерываний от клавиатуры(ISR Routine),но здесь куча проблем с реализацией на х64....
  • Решаю всю ту же проблему, что была обозначена в конце темы http://forum.shelek.ru/index.php/topic,24622.0.html. А именно, мой USB-девайс при работе с драйвером, созданным в DS 3.2 пропускает данные на медленных машинах (PIV) и не пропускает данные на машине Core 2 Duo, при условии, если не запущены приложения, требующие значительных ресурсов (Opera). Отсюда сделал вывод, что пропуски могут проходить на уровне драйвера. Девайс работает следующим образом: подготовив данные для передачи по USB (заполнив FIFO UDP-модуля контроллера, отвечающего за работу с USB), ставит флаг готовности для передачи пакета данных размером 60 байт по USB. Далее ожидает, пока придет запрос от Хоста и уже после этого начинает передачу данных. Запросы формирует драйвер, который в свою очередь принимает их от приложения. Если я правильно понял, то в медленных или загруженных другими приложениями эти запросы могут задерживаться и в случае маленького буфера для запросов - теряться. Таким образом, какой смысл делать большой буфер для принимаемых драйвером от девайса данных, если при этом запросы на считывание этих данных приложением будут поступать с той же  частотой или реже?
    Что вы посоветуете для решения подобной проблемы?
    Заранее благодарен!
  • Направления программирования :: Web :: Серверные скрипты
  • Вообщем, на сайте делается онлайн запись на консультацию, сайт управляется на WorldPress.

    Загвостка в том, что форма записи разработана, но есть пара вопросов.

    Как сделать, если клиент занял определенное время, оно больше не выводилось в списке?
    И как сделать, чтобы тело сообщения которое будет направлено на e-mail, содержало выбранные даты и время?

    Вот код:
    Код:
    <p>Ваши Ф.И.О (обязательно).<br />
        [text* your-name] </p>
    <p>Ваш E-Mail (обязательно)<br />
        [email* your-email] </p>
    <form action="" method="post">
    <label>Выберите день</label>
    <select name="data" id="data">
    <option></option>
    <option>17 октября</option>
    <option>18 октября</option>
    <option>19 октября</option>
    <option>20 октября</option>
    <option>21 октября</option>
    <option>22 октября</option>
    <option>23 октября</option>
    <option>24 октября</option>
    <option>25 октября</option>
    <option>26 октября</option>
    <option>27 октября</option>
    <option>28 октября</option>
    <option>29 октября</option>
    <option>30 октября</option>
    <option>31 октября</option>
    </select>
    <br />
    <label>Выберите время</label>
    <select>
    <option></option>
    <option>09:00</option>
    <option>09:30</option>
    <option>10:00</option>
    <option>10:30</option>
    <option>11:00</option>
    <option>11:30</option>
    <option>12:00</option>
    <option>12:30</option>
    <option>14:00</option>
    <option>14:30</option>
    <option>15:00</option>
    <option>15:30</option>
    <option>16:00</option>
    <option>16:30</option>
    <option>17:00</option>
    <option>17:30</option>
    </select>
    <br/>
    <input type="submit" value="Отправить"><INPUT type="reset" value="Сбросить">
    </form>

    Вот скрин со страницы управления сайта:

    (http://content.foto.mail.ru/mail/zavrazhinkirill/_myphoto/i-2.jpg)
  • Практические разделы :: Железо
  • Привет.

    А подскажите, какие вы знаете магазины в Москве или, быть может, людей конкретных, у которых можно затариться самым современным железом, таким как 3D-мониторы, видеокарты типа GTX 580M, внешние диски на 4 ТБ и скоростью 15000 об/мин, процессоры типа i7 2960XM, ну или там планки памяти по 16 ГБ каждая. Ну, общем, полный и безоговорочный hi-end. Интересует, в основном, железо для ноутов, конечно же.

    Спасибо.
  • Практические разделы :: Программы
  • В MATLAB search path добавил путь к своей директории (d:/project1). Когда я пишу
    Код:
    save 'xxx.dat' x -ascii
    то файл xxx.dat записывает в .../MATLAB701/work. А что мне нужно сделать, чтоб файл писало именно в папку с моим проектом d:/project1?

    Например, с помощью команд
    Код: (matlab)
    searchpath = matlabpath;
    re = '\w:\\[\w\\]*project1';
    localpath = regexp(searchpath, re, 'match');
    localpath = strcat(localpath, '\');
    clear searchpath;
    clear re;
    можно получить путь к директории с моим проектом. А попроще как-то можно? :spy:

    Добавлено через 20 минут и 14 секунд:
    В принципе, решение предыдущей проблемы меня устраивает. Но вот столкнулся с более интересной. Команда
    Код: (matlab)
    save(strcat(ansd, 'x.dat'), 'X', '-ascii')
    в командной строке MATLAB выполняется корректно, но когда я вызываю эту же команду в M-файле, то получаю следующую ошибку
    Цитата
    ??? Error using ==> save
    Argument must contain a string.

    Error in ==> phase1 at 36
    save(strcat(ansd, 'x.dat'), 'X', '-ascii')
    Цитата
    ansd =
        'D:\Project\project1\ans\'

    Помогите, пожалуйста, решить эту проблему.

    Добавлено
    Код определения пути к папке проекта в начале поста не работает: хоть MATLAB и отображает переменную как строку (localpath/ansd), но она на самом деле не совсем строка.
    Цитата
    regexp('str', 'expr', 'match') returns cell array containing the text of each substring of STR that matches EXPR
    Но использовать localpath(1) тоже не получилось. Что оно такое и как с ним работать - я пока не знаю. Да и, в данный момент - в полвторого ночи, разбираться как-то не хочеться. :mrgreen: Обойдусь без подобной автоматизации. :yes:

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное