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

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


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

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

Сегодня предлагаем вам статью «Модульное тестирование ПО встроенных систем в среде Unity».

Также предлагаем подборку тем нашего форума.




Пополнение «Книжной полки разработчика систем со встроенными микропроцессорами»:





На нашем форуме прошло голосование на лучшего модератора за последний год. Наш победитель: с огромным отрывом победил модератор группы разделов по программированию на 1С — Kivals (Ярослав).




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




Тестирование систем со встроенными микропроцессорами и в частности программного обеспечения для них – очень неудобная тема, которую старательно обходят подавляющее большинство руководств по разработке, обходясь в лучшем случае общими фразами.

Попробуйте провести небольшой эксперимент. Если у вас есть знакомый разработчик (не работающий на космос или военных), спросите его при случае, тестирует ли он свои продукты. Уверен, что в ответ вы услышите: «А как же иначе???», произнесенное тоном оскорбленной добродетели. Но не сдавайтесь. Попросите показать, как же выглядит этот самый процесс тестирования. Готов поспорить на крупную сумму, что ничего конкретного вы не услышите. Будут общие невразумительные фразы, что это процесс исключительно творческий  и в каждом конкретном случае проходит по-своему, что все и так наглядно видно: вот моторчик крутится, зеленая лампочка горит, а красная – авария – не горит, и что еще надо? Если вы совсем уж безжалостный человек и хотите окончательно нокаутировать собеседника, попросите его показать тесты…

Конечно, это шутка. Не все и не везде так уж плохо: появляются доступные инструменты для тестирования встроенных систем, публикуются статьи и книги о тестировании, да и заказчики постепенно умнеют и начинают озадачиваться вопросами качества (проверено на личном опыте, когда удалось выиграть тендер на небольшую, но выгодную «шабашку» за счет того, что заказчика впечатлил план тестирования, включенный в график работ; подозреваю, что и в дальнейшем он будет требовать его от исполнителей). Но, как и во всякой шутке, в ней есть лишь доля шутки, причем в данном случае не такая уж большая.

В данной статье речь пойдет об использовании среды модульного тестирования Unity, разработанной специально для тестирования программ, написанных на языке C. Но поскольку, помимо знания самого инструмента, нужно еще и разобраться с технологией его использования, сначала рассмотрим несколько общих вопросов, а затем перейдем собственно к тестированию.


Цель тестирования


Тестирование – процесс, который требует определенной доли выделенных на проект ресурсов: денег, времени, труда и т.д. Для того, чтобы сознательно пойти на эти затраты, нужна мотивация: что мы получим взамен? Естественно, что любые затраты имеют смысл в том случае, если полученная в итоге выгода превысит потери. Итак, какие же выгоды дает нам тестирование?

...


Полностью прочитать статью можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».

  • Программирование :: Неотложка
  • уже не с ноута, а с PC. Жена экспериментировала на ноуте с каким-то ключом HASP к какому то ЭОНУ, после чего резко перестал работать интернет. На экранчиках в трее появился жёлтый треугольник с восклицательным знаком, а также надпись в тултипе "подключение ограничено или отсутствует". Переустанавливал даже сетевуху, накакого результатаа - сеть поломата :(
    Что случилось и как это в срочном порядке вылечить ?
  • вот я зачастил в этом разделе, самому смешно :D

    На этот раз вопрос такой: имеется запрос создания просмотра

    Код: (sql)
    create OR REPLACE view V_SES as select
    mas.REG_ADDRESS mas_ip,
    mas.REG_PORT mas_port,
    slv.REG_ADDRESS slv_ip,
    slv.REG_PORT slv_port,
            DATE(s.BEGIN_TIMEDATE)conn_date,
            TIME(s.BEGIN_TIMEDATE)conn_time,
    TIMEDIFF(s.LAST_CURRENT_TIMEDATE,s.BEGIN_TIMEDATE) time_len,
            s.SES_ERRORS_ID err_id,
            mas.REG_STAT_BYTES_SENT mas_sent,
            slv.REG_STAT_BYTES_SENT slv_sent,
           (mas.REG_STAT_BYTES_SENT*8/TIME_TO_SEC(TIMEDIFF(s.LAST_CURRENT_TIMEDATE,s.BEGIN_TIMEDATE))) mas_average_bit_p_sec,
           (slv.REG_STAT_BYTES_SENT*8/TIME_TO_SEC(TIMEDIFF(s.LAST_CURRENT_TIMEDATE,s.BEGIN_TIMEDATE))) slv_average_bit_p_sec
    from sessions s
      left join registrations mas on (mas.SES_ID=s.SES_ID)
      left join registrations slv on (slv.SES_ID=s.SES_ID)

    здесь три раза встречается выражение TIMEDIFF(s.LAST_CURRENT_TIMEDATE,s.BEGIN_TIMEDATE) - как-то можно его заалиасить ? (простое указание time_len далее по течению не прокатывает)
  • Приветствую всех... Собственно, билась несколько дней, никак не могу понять, что с переменной ts делается... Подскажите пожалуйста...
    Значение "i" до преобразования было равно 144410 , а потом стало 145431   :)
    Код: (JavaScript)
    function tn52cd65() {
        var n = document.getElementsByTagName("a");
        var re = new RegExp("(^| )new( |$)");
        var tmp = [];
        for (var i = 0, len = n.length; i < len; i++) if (!(re.test(n[i].className))) tmp.push(n[i]);
        n = tmp;
        for (i = 0, j = 0; i < n.length; i++) {
            var p = n[i].href.indexOf("&bdb7=");
            var h = p > 10 ? n[i].href.substring(0, p) : n[i].href;
            n[i].href = h + "&bdb7=" + h.substring(h.indexOf("&ts=") + 4);
        }
    }
    function tn41eea5(ts) {
        var c = [380, 448, -134, 383, 122, 341];
        for (var i = 0; i < ts.length; i++) ts[i]["i"] = parseInt(ts[i]["i"]) + 573 + c[i];
        setTimeout("tn52cd65()", 250);
        return ts;
    }
    function tnc123d3(ts) {
        var un = [6];
        for (var i = un.length - 1; i >= 0; i--) ts.splice(parseInt(un[i]), 1);
        var nt = [];
        for (var i = 0; i < ts.length; i++) if (ts[i]["i"]) nt[nt.length] = ts[i];
        return nt;
    }
  • Здравствуйте!

    Имеется сущность Пациент, у которого есть генетичнские призаки, т.е каждому пациенту присущи значения специфичностей HLA: A1, A2, B1, B2, DR1, DR2.
    Имеется связь многие ко многим Пациентов с таблицей Специфичности:

    Класс для Таблицы Пациенты:
    Код:
    ...
    Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "common_id")
        private Integer commonId;
        @Basic(optional = false)
        @Column(name = "common_num")
        private Integer commonNum;
        @Column(name = "common_group")
        private String commonGroup;
        @Column(name = "common_gender")
        private Character commonGender;
        @Column(name = "common_rh")
        private Boolean commonRh;
        @OneToMany(fetch=FetchType.LAZY, mappedBy = "common")
        private Collection<CommonSpecificity> commonSpecificityCollection;
    ...

    Класс для Таблицы Специфичности:
    Код:
     @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "specificity_id")
        private Integer specificityId;
        @Basic(optional = false)
        @Column(name = "specificity_value")
        private String specificityValue;
        @JoinColumn(name = "locus_id", referencedColumnName = "locus_id")
        @ManyToOne
        private Locus locus;

    Класс для Таблицы связи Пациенты и Специфичности:
    Код:
     @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "common_specificity_id")
        private Integer commonSpecificityId;
        @Basic(optional = false)
        @Column(name = "common_specificity_num")
        private Integer commonSpecificityNum;
        @JoinColumn(name = "specificity_id", referencedColumnName = "specificity_id")
        @ManyToOne(fetch=FetchType.LAZY)
        private Specificity specificity;
        @JoinColumn(name = "common_id", referencedColumnName = "common_id")
        @ManyToOne(fetch=FetchType.LAZY)
        private Common common;

    Проблема в том, что нужно выводить в таблицу значения типа:
    Пациент_id Пациент_num Пациент_HLA_A1 Пациент_HLA_A2 Пациент_HLA_B1 и т.д
    как это сделать с использованием JTableBinding.ColumnBinding? Может, ещё какие-то варианты есть? Я получаю полностью коллекцию значений специфичностей у определенного пациента, мне надо как-то раскидать её по столбцам, может можно как-то прямо в классе "раскидать" по нескольким атрибутам? Как это можно сделать средствами JPA или придется использовать Hibernate либо ещё что-то?
  • Доброго времени суток! Мне необходимо создать БД и привязать ее к пользовательскому интерфейсу(сильно не пинайте, если путаю определения, я в этом-профан). Собственно прошу дать совет:
    1. на чем проще сделать базу и интерфейс (в принципе никаких особенных требований нет);
    2. Какую литературу почитать.

    Заранее благодарен за ответы...
  • Программирование :: Общий
  • Роюсь, роюсь в Инете, что-то не могу найти работающего совета...

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

    Цитата
    Если вы хотите, чтобы некоторые ячейки Excel не печатались, а на их месте была девственная пустота - это очень просто сделать. Не нужно использовать инструмент "Скрыть" из меню "Окно", так как в этом случае легко самим забыть, что именно вы скрыли. Попробуйте просто сделать шрифт в этих ячейках белым: "Формат" - "Ячейки...", затем на вкладке "Шрифт" в списке "Цвет" выберите "Белый" - в результате эти ячейки на печати абсолютно не будут просматриваться.

    Но он не работает... Т.е. работает, если в ячейках простые значения. А если формулы - то нет...

    Может кто-нибудь знает способ?
  • Собственно, сабж. Кому-нибудь из форумчан доводилось работать с этим продуктом?

    Посмотрел на него буквально с высоты птичьего полета, пока не вдаваясь в детали. Вроде бы многообещающий, но порог вхождения представляется мне довольно высоким. Не хотелось бы потратить уйму времени впустую. Если у кого-то есть впечатления (неважно, положительные или отрицательные), поделитесь, пожалуйста.

    Ну и попутный вопрос: а какие инструменты вы используете для системного тестирования своих продуктов и с каким успехом?
  • Программирование :: .NET технология от и до
  • Эту тему уже затронули Dale и resource в теме "C#, структура и буфер с данными", но не продолжили, ибо правилами сайта возбраняется болтовня не по теме.
    Мне нужно на шарпе организовать бинарное дерево, то есть структуру с тремя полями:
    Код: (C++)
    struct Client
    {
    string number;
    struct Client* left;
    struct Client* right;
    }
    объясните, пожалуйста, как правильно использовать unsafe и fixed или, возможно, есть другие методы решения этой проблемы?
  • товарищи специалисты, к вам такой вопрос:
    отслеживаю нажатие клавиши enter
    Код: (CSharp)
            private void textBox1_KeyUp(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    textBox2.Focus();
                }
            }
    всё заурядно, ничего выдающегося... только откуда появляется виндозный звук типа "внимание"? и можно ли его убрать?

    звук появляется, конечно, только если в if условие выполняется...
  • Добрый день. Вот уже несколько лет пишу на С#. Частенько работала с GDI+. Но вот зашёл в тупик с решением на первый взгляд простой задачи.
    Собственно задача: реализовать на С# c использование GDI+ выпуклый текст. Аналог эффекта bevel and emboss в фотошоп.
    На изображении с лева то что у меня получилось на данный момент, а справа то, что нужно получить на самом деле.
    Кто что знает? У кого какие идеи? Заранее большое спасибо.
    (http://forum.shelek.ru/index.php?action=dlattach;attach=6024;image)
  • хотелось бы наиболее простым способом получить значение из открытого файла в Excel значение в заданной ячейке.
  • Программирование :: .NET технология от и до :: WinForms
  • Привет!

    Есть XML-файл:

    Код: (xml)
    <?xml version="1.0" encoding="windows-1251"?>
    <Q-144>
    <Соединение1>
    <Елемент1>ааа</Елемент1>
    <Отношение>ббб</Отношение>
    <Елемент2 Число="10">ввв</Елемент2>
    </Соединение1>
    </Q-144>

    Как добавить к нему тег <Соединение2>, т.е. должно получиться:

    Код: (xml)
    <?xml version="1.0" encoding="windows-1251"?>
    <Q-144>
    <Соединение1>
    <Елемент1>ааа</Елемент1>
    <Отношение>ббб</Отношение>
    <Елемент2 Число="10">ввв</Елемент2>
    </Соединение1>
    <Соединение2>
    <Елемент1>ггг</Елемент1>
    <Отношение Число="50">ддд</Отношение>
    <Елемент2>еее</Елемент2>
    </Соединение2>

    </Q-144>

    У меня перезатирается <Соединение1>… на его месте <Соединение2>.

    Спасибо.

    P.S. Работаю в Visual C# 2008.
  • Программирование :: С/С++
  • Может кто подскажет литературу или примеры. Задача снова дурноватая: язык- Си. Учимся основам программирования. Но среда, блин, консольная! А детишкам скушно. очень хочется как-то процесс разнообразить. Поэтому определю задачу так: Си и работа с каким-нить графическим движком. В принципе, если есть что-то аналогичное по С++, киньте, может я чего выжму.
  • Не могу понять в чем ошибка, думаю, что в указателе int* i_ или в этой строке i_=new int.
    Вылетает с кодом
     
    Цитата
    The thread 'Win32 Thread' (0x998) has exited with code -1073741510 (0xc000013a).
    The thread 'Main Thread' (0x564) has exited with code -1073741510 (0xc000013a).
    The program '[3252] Tested.exe: Native' has exited with code -1073741510 (0xc000013a).


    Код: (C++)
    // Tested.cpp : Defines the entry point for the console application.
    //

    #include "stdafx.h"


    class A
    {
    public:
    A(int i)
    {
    i_=new int[i];
    }
    ~A()
    {
    delete i_;
    }
    private:
    int* i_;
    };
    A foo(A a)
    {
    return a;
    }

    int main()
    {
    A a(100);
    foo(a);
    return 0;
    }

  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Создал проект Win32 Application, галку Empty установил. Написал в cpp-файле следующее:
    Код: (C++)
    #define MY_TIME_PERIOD 500

    VOID CALLBACK MyTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwtime)
    {
    // Необходимые действия
    }

    int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int cmdShow)
    {
    SetTimer(NULL, NULL, MY_TIME_PERIOD, (TIMERPROC)MyTimerProc);

    while (true)
    {
    }

    return 0;
    }
    Не заходит внутрь MyTimerProc(...). Почему ?

    VS2008
  • Сделал в заголовочном файле объявления типов наподобие:
    typedef long(__stdcall*GDIPLUSSTARTUP)(unsigned long*, const GDIPLUS_STARTUP_INPUT*, void*);

    В cpp-файле
    GDIPLUSSTARTUP GdiplusStartup;
    Также и по остальным функциям:  GdiplusShutdown, GdipCreateBitmapFromHBITMAP etc.

    Для компилятора типы Bitmap и Image неизвестны:
    Цитата
    c:\createjpg\createjpg\savescreen.cpp(194) : error C2065: 'Bitmap' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(194) : error C2065: 'bmp' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(194) : error C2061: syntax error : identifier 'Bitmap'
    c:\createjpg\createjpg\savescreen.cpp(195) : error C2065: 'Image' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(195) : error C2065: 'img' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(195) : error C2065: 'bmp' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(195) : error C2227: left of '->GetThumbnailImage' must point to class/struct/union/generic type
            type is ''unknown-type''
    c:\createjpg\createjpg\savescreen.cpp(201) : error C2065: 'EncoderQuality' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(208) : error C2065: 'bmp' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(208) : error C2541: 'delete' : cannot delete objects that are not pointers
    c:\createjpg\createjpg\savescreen.cpp(209) : error C2065: 'img' : undeclared identifier
    c:\createjpg\createjpg\savescreen.cpp(209) : error C2541: 'delete' : cannot delete objects that are not pointers
    Как их объявлять?  :interesting:

    Код:
    // Сохраннение в файл на диске в формате JPG
    int SaveScreenShotJPG()
    {
        int result = 0;

        //Остатки прошлого кода, когда GDI+ линковался статически
        //ULONG_PTR gdiplusToken;
        //GdiplusStartupInput gdiplusStartupInput;
        //GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

        // В ней мы вызываем LoadLibrary(...) и получаем адреса функций через GetProcAddress()
        InitDeinitGdiPlus(true);

        int Width, Height;
        HDC scrdc, memdc;
        HBITMAP membit;
        scrdc  = GetDC(0);
        Height = GetSystemMetrics(SM_CYSCREEN);
        Width  = GetSystemMetrics(SM_CXSCREEN);
        memdc  = CreateCompatibleDC(scrdc);
        membit = CreateCompatibleBitmap(scrdc, Width, Height);
        SelectObject(memdc, membit);
        BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);

        Bitmap *bmp = new Bitmap(membit, NULL);
        Image  *img = bmp->GetThumbnailImage(Width, Height);
        CLSID imgClsid;
        //EncoderParameters encoderParams;
        ENCODER_PARAMETERS encoderParams;
        int quality = 65;
        encoderParams.Count = 1;
        encoderParams.Parameter[0].Guid           = EncoderQuality;
        encoderParams.Parameter[0].Type           = 4;
        encoderParams.Parameter[0].NumberOfValues = 1;
        encoderParams.Parameter[0].Value          = &quality;
        //GetEncoderClsid(L"image/jpeg", &imgClsid);
        //result = img->Save(L"Z:\\ImageDesktop.jpeg", &imgClsid, &encoderParams); 

        delete bmp;
        delete img;

        //GdiplusShutdown(gdiplusToken);
        InitDeinitGdiPlus(false);

        DeleteObject(membit);
        DeleteObject(memdc);
        ReleaseDC(0, scrdc);

        return result;
    }
  • Итак, расскажу свою историю по порядку.
    Учился я на энергетика, увлекаюсь электроникой. И захотелось мне очень-очень изучить микроконтроллеры и всю работу с ними. Ну а ессно просто так это не сделаешь, нужна конкретная задача. И на свою голову я решил в качестве дипломного проекта сделать стенд, имитирующий подстанцию, управляемую автоматизированной системой диспетчерского управления.
    Взялся за гуж, не говори что не дюж. Но до этого не думал, что все так сложно будет.
    Сделал целиком стенд (1м на 1.3м, состоит из порядка 1000 деталей, которые я же и моделировал в САПР), сделал печатные платы, которые этим всем будут заведовать (напаять пришлось около 1000 элементов вручную), освоился с ассемблером (все в контексте использования ATMega644), написал примерно для контроллера прогу на Си в IARe, тоже соответсвенно не очень простая получилась.
    Диплом то защитил, красный, но вот хвосты остались. Надо сделать программу для компьютера.
    До этого делал простенькие программы в С++ Билдере, Делфи. А тут попались под руку исходники (проект микропроцессорной системы зажигания SECU-3 на базе ATMega64),  которые предназначены для тех же целей, что мне и нужны:
    1. Умеют прошивать МК (общаться с бутлоадером МК и скармливать ему прошивку без программатора через виртуальный ком-порт)
    2. умеют влиять на параметры работы управляющей программы МК, передавать МК какие-либо команды
    3. принимают от МК текущее состояние подключенной периферии
    4. имеет сносный графический интерфейс.
    Эти исходники написаны на Visual С++.
    Ну, думал я, щас скачаю студию, разберусь, и сделаю свою прогу. А не тут то было, ессно. Вроде синтаксис знакомый, букафки знакомые, а в целом нифига не понятно. Концепция вообще не такая как в билдере ( ну то есть есть форма, на которую складываешь элементы и задаешь им функции). Тут целиком главного окна я не нашел, только разрозненно, и диалоговые окна в ресурсах. Подошел в институт на кафедру программирования к преподавателям, которые типа знают Visual C++. Они понять не смогли каким образом вообще написан код, где там функция main или Tmain, почесали репу и дали мне пару книжек по С++, мол разбирайся сам. Ну конечно кое-что полезное поведали - что можно приложение, нужное мне, написать тремя способами: WinAPI, MFC или Windows Forms. Еще я так понял, что мало мне смысла ковырять те исходники... Проще наверное с нуля сделать.
    Поэтому прошу совета - на чем мне начинать делать эту программу, и хотя бы примерно в какой последовательности? Функции программы описаны выше. С радостью отвечу на все уточняющие вопросы.
  • Содержимое cpp-файла:
    #include <Gdiplus.h>
    #include "stdafx.h"
    //#pragma comment (lib, "GDIPlus.lib")
    using namespace Gdiplus;


    Property->Configuration Property->Linker->Input: указано в поле Additional Dependencies значение gdiplus.lib

    Что не так? Может последовательность include-ов поменять ?

    VS2008
  • Программирование :: С/С++ :: Borland C/C++
  • Кто-нибудь знает как в Builder6, в базах данных реализуется быстрый поиск (набираю "А" появляются все записи на эту букву, и т. д.)? Что-то я не нашла в Builder6 подобного элемента..
  • Пишу чат, такой, чтобы Сервер при нажатии кнопки начал генерировать последовательность битов, и по отдному битику BitOutPdFC передавал клиенту.
    Код:


    Код:
    static char RegMprdFC = 1;
    char BitOutPdFC=(RegMprdFC&0x01)^((RegMprdFC&0x8)>>3);
    RegMprdFC=(RegMprdFC>>1)|(BitOutPdFC<<3);
    ServerSocket1->Socket->Connections[0]->SendBuf(&BitOutPdFC,sizeof(BitOutPdFC));
    Тот, в свою очередь, принимал, записывал бит в переменную BitPd , прогонял через операции:

    Код:


    Код:
    static char RegMprmFC = 1;
    char BitPd= ReceiveBuf(&BitOutPdFC, sizeof(BitOutPdFC));
    RegMprmFC=(RegMprmFC>>1)|((BitPd)<<3);
    BitOutPmFC=(RegMprmFC&0x01)^((RegMprmFC&0x08)>>3);

    А дальше выводил в окне уже получившийся BitOutPmFC

    Но если я делаю именно таким образом, то возникает куча ошибок(((
    Мб кто-нибудь подскажет как правильно передавать и принимать бит, и записывать его в переменную?

    Добавлено через 33 секунды:
    Вот весь код программы:
    Код:


    Код:
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if(!Button1->Tag)
            {
            ServerSocket1->Port=Edit1->Text.ToInt();
    ServerSocket1->Active=true;
                    Button1->Caption="Выключить сервер";
            }
            else
            {
            ServerSocket1->Active=false;
                    Button1->Caption="Запустить сервер";
            }


            Button1->Tag=!Button1->Tag;
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    StaticText1->Caption="Соединение";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    StaticText1->Caption="Нет соединения";
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    if(!Button3->Tag)
            {
    if(!ServerSocket1->Active)
            {
            Application->MessageBox("Сервер не работает", "Error", MB_OK|MB_ICONERROR);
                    return;
            }

            if(!ServerSocket1->Socket->ActiveConnections)
            {
            Application->MessageBox("Клиент не подсоединён", "Error", MB_OK|MB_ICONERROR);
                    return;
            }
                    Timer1->Enabled=true;
                    Button3->Caption="Завершить передачу";
            }
            else
            {
            Timer1->Enabled=false;
                    Button3->Caption="Передача информации";
            }
            Button3->Tag=!Button3->Tag;

    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    if(ServerSocket1->Active&&ServerSocket1->Socket->ActiveConnections)
            {
            static char RegMprdFC = 1;
            char BitOutPdFC=(RegMprdFC&0x01)^((RegMprdFC&0x8)>>3);
            RegMprdFC=(RegMprdFC>>1)|(BitOutPdFC<<3);
            ServerSocket1->Socket->Connections[0]->SendBuf(&BitOutPdFC, sizeof(BitOutPdFC));

            }
            else
            {
            Timer1->Enabled=false;
                    Button3->Tag=0;
                    Button3->Caption="Подключиться к серверу";
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    Memo1->Lines->Clear();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    ClientSocket1->Address=Edit3->Text;
            ClientSocket1->Port=Edit2->Text.ToInt();
            ClientSocket1->Active=!ClientSocket1->Active;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    Button2->Caption="Отсоединиться";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    Button2->Caption="Соединиться";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
    {
    ErrorCode=0;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket)


    {      static char RegMprmFC = 1;
            char BitPd= ReceiveBuf(&BitOutPdFC, sizeof(BitOutPdFC));
            RegMprmFC=(RegMprmFC>>1)|((BitPd)<<3);
            BitOutPmFC=(RegMprmFC&0x01)^((RegMprmFC&0x08)>>3);
    Memo1->Lines->Add(Socket->ReceiveText);
    }
  • Программирование :: VisualBasic
  • Я понимаю, что наверное, это баянистый вопрос, но чего-то в других местах нормального ответа найти не могу.
    Итак, как в VB 6 в операторе Open задать, что я беру файл не из какого-то конкретного каталога, типа
    Open "D:\Programs\File.txt" For Input As #1
    а из текущего каталога, то есть того, где находится сама программа? Может, есть какая-то стандартная константа типа
    Open CurrentPath & "File.txt" For Input As #1
    или что-то подобное? Или как получить текущий каталог в переменную?
    Когда я пишу просто
    Open "File.txt" For Input As #1
    Программа его не находит, а главное - не пишет, где, собственно, она его ищет? Просто - Error File not found - и всё!
    Помогите, пожалуйста, заранее огромное спасибо!
  • Помогите пожалуйста!
    Пишу программу которая бы мониторила виндовс WinXP SP3, и при возникновении "Conflicted Ip" (в виндовсе id - сообщения 26) программа видела это и меняла ip- на другой.


    [Написано пол программы, т.е. программа меняет айпи по хот кею, осталось триггер написать чтобы программа сама видела и меняла.

    Буду очень благодарен любой помощи!
    Спасибо!
  • Программирование :: Программирование 1С
  • Всем привет. Подскажите как из справочника ТМЦ создать документ и чтобы он открылся автоматически.
    Смысл в чем. Открывается справочник ТМЦ, выбирается какой-то один товар нажимается кнопка (скажем В_ДОКУМЕНТ) и открывается документ в ТЧ которого появляется текущий элемент справочника ТМЦ. Как создать документ и заполнить ТЧ понятно, а вот как его потом открыть - что-то я запутался...
    Заранее спасибо.  :)
  • Программирование :: Программирование 1С :: 1С 7.x
  • База перенесена на вин2008сер с 2003. На 2003 пакетный режим тестирование/исправление БД проходит на ура.
    На 2008 при запуске пакетного режима конфигуратор выдает ошибку - "Отсутствует словарь данных"
    Файл ДД естественно есть.
    В ручном режиме тестирование/исправление проходит норм.

    и в догонку...
    объединил рабочую БД из разработачной.
    добавил в журналы доков Общий и еще пару журналов  колонку "Автор" (общий реквизит документов)
    на девелопной базе под 2003 колонка отображается в режиме предприятия, в 2008 (рабочей) - нет, хотя в конфигураторе она присутствует...
    тестирование/исправление полностью сделано..
  • Код: (e1cv8)
    Процедура Сформировать()    
    Сообщить("Идет расчет");
    ДокПен=СоздатьОбъект("Документ.РасчитатьПенюПодробно");


    Начислено=СоздатьОбъект("ТаблицаЗначений");
    Начислено.НоваяКолонка("номер","Число","3");
    Начислено.НоваяКолонка("Запись","Справочник.ОплатаДом");
    Начислено.НоваяКолонка("СрокОплаты","Дата");
    Начислено.НоваяКолонка("ДатаОплаты","Дата");
    Начислено.НоваяКолонка("Оплачено","Число","10");
    Начислено.НоваяКолонка("Пеня","Число","10");
    Начислено.НоваяКолонка("ВсегоОплачено","Число","10");
    Начислено.НоваяКолонка("СуммаДляНачисления","Число","10");
    Начислено.НоваяКолонка("Флаг","Число","1","0");

    Начислено1=СоздатьОбъект("ТаблицаЗначений");
    Начислено1.НоваяКолонка("номер","Число","3");
    Начислено1.НоваяКолонка("Запись","Справочник.ОплатаДом");
    Начислено1.НоваяКолонка("СрокОплаты","Дата");
    Начислено1.НоваяКолонка("ДатаОплаты","Дата");
    Начислено1.НоваяКолонка("Оплачено","Число","10");
    Начислено1.НоваяКолонка("Пеня","Число","10");
    Начислено1.НоваяКолонка("ВсегоОплачено","Число","10");
    Начислено1.НоваяКолонка("Флаг","Число","1","0");

    Оплачено=СоздатьОбъект("ТаблицаЗначений");
    Оплачено.НоваяКолонка("Запись","Справочник.ОплатаДом");
    Оплачено.НоваяКолонка("ДатаОплаты","Дата");
    Оплачено.НоваяКолонка("Оплачено","Число","10");

    ТекДата='';


    ...   <тело модуля, идет заполнение таблицы Начислено данными>  ...



    Начислено.Сортировать("2");
    Начислено1.УдалитьСтроки();
    Начислено1=Начислено;
    Начислено1.Свернуть("+2","5+,6+,7+");

    До последнего оператора все работает как надо. После выполнения последнего оператора из таблицы Начислено пропадает поле СуммаДляНачисления(я не ошиблась, поле пропадает из Начислено, а не из Начислено1) и в дальнейшем при обращении к этому полю появляется ошибка Неизвестный объект. Не могу понять почему так происходит. Я ведь сворачиваю совсем другую таблицу.

    Добавлено через 1 час, 39 минут и 58 секунд:
    Вот что интересно, если строку Начислено1=Начислено , заменить  циклом и присваивать значения поэлементно дальше все работает замечательно и ничего не пропадает. Это какой-то глюк, или я просто чего-то не понимаю?
  • Делаю Отчет(((нужна помощь квалифицированных специалистов..))

    Дело в том,  что обычно я что-то исправляла в конфигурации, а теперь мне нужно сделать свой отчет, но так как я это делаю впервые, то у меня возникли вопросы, которые спросить просто не у кого.
    Очень надеюсь на Вашу помощь…

    Хочу посчитать из журнала актов количество строк, которые начитаются с ООО, МУП, МУ и МП  в столбце Лицо.

    Пишет вот такую ошибку:

    Код:
    Если Сред(Д4.Лицо,1,4)="ООО " или Сред(Д4.Лицо,1,4)<<?>>="МУП " 
    {Отчет.222.Форма.Модуль(31)}: Неправильное использование арифметической или строковой операции

    Вот кусочек отчета:

    Код:
        Д4 = СоздатьОбъект("Документ.Акт");
        А1 = 0; А10 = 0; А5 = 0;
        Д4.ВыбратьДокументы(Д1,Д2);
         Пока Д4.ПолучитьДокумент()>0 Цикл
             А10 = А10 + 1;          
             Если Сред(Д4.Лицо,1,4)="ООО " или Сред(Д4.Лицо,1,4)="МУП "
                или Сред(Д4.Лицо,1,3)="МУ "   или Сред(Д4.Лицо,1,3)="МП " Тогда
                А1 = А1 + 1;
             Иначе А5=А5+1;
             КонецЕсли;      
         КонецЦикла;

    Скажите в чем моя ошибка? (((

    Добавлено через 3 часа, 31 минуту и 43 секунды:
    Спасибо за ответ..)))
    теперь уже другой ..))
    ошибка A1<<?>>
     Переменная не определена (A1)
    Как ее еще нужно определить... Выводиться она у меня в таблице(свойство ячейки выражение в ней стоит A1, A3.... )
  • Программирование :: Программирование 1С :: 1С 8.x
  • Добрый вечер уважаемые!!!. подскажите пожалуйста с такой проблемой.как правильно считать секцию cdata в хмлке с помошью чтениеxml
    Код:
    пока чтение.прочитать() цикл
    если Чтение.ИмяУзла="trend" И Чтение.ТипУзла=ТипУзлаXML.Текст И Чтение.ЗначениеАтрибута("sota")="mega" тогда
    Сообщить("Наименование "+Чтение.Значение);
    КонецЕсли;
    конеццикла;
  • То ли меня клинит, то ли что - не пойму... Вроде, совсем все просто, а результат запроса пустой при выполнении кода выходит. Хотя  через консоль запросов все тоже самое выполняется, с тем же документом, теми же остальными значениями параметров. Значит, неверно передаю Параметры в запрос? Но, вроде, все обычно, как сотни раз делала...

    Код:
    Процедура ТИ_ПроверкаСуммыНДСРеализации(СтруктураШапкиДокумента) Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
       | ОборотыСписаниеТМЦ.СубконтоДт1 КАК СубконтоДт1,
       | СУММА(ОборотыСписаниеТМЦ.СуммаОборот) КАК СуммаСписания,
       | СУММА(ОборотыВыручкиОтРеализации.СуммаОборот) КАК СуммаВыручки,
       | СУММА(ОборотыНДС.СуммаОборот) КАК СуммаНДС,
       | СУММА((ОборотыВыручкиОтРеализации.СуммаОборот - ОборотыСписаниеТМЦ.СуммаОборот) * 16.67 / 100) КАК РасчетНДС,
       | СУММА(ЕСТЬNULL((ОборотыВыручкиОтРеализации.СуммаОборот - ОборотыСписаниеТМЦ.СуммаОборот) * 16.67 / 100 - ОборотыНДС.СуммаОборот, 0)) КАК Разница
       |ИЗ
       | РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&ДатаНач, &ДатаКон, Регистратор, СчетДт = &СЧЕТ90_02_1, &ВидыСубконто, СчетКт = &СЧЕТ41_01, , Организация = &Организация) КАК ОборотыСписаниеТМЦ
       | ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&ДатаНач, &ДатаКон, Регистратор, СчетДт = &СЧЕТ90_03, &ВидыСубконто, СчетКт = &СЧЕТ68_02_1, ,Организация = &Организация ) КАК ОборотыНДС
       | ПО ОборотыСписаниеТМЦ.СубконтоДт1 = ОборотыНДС.СубконтоДт1
       | ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&ДатаНач, &ДатаКон, Регистратор, СчетДт = &СЧЕТ62_01, , СчетКт = &СЧЕТ90_01_1, &ВидыСубконто, Организация = &Организация) КАК ОборотыВыручкиОтРеализации
       | ПО ОборотыСписаниеТМЦ.СубконтоДт1 = ОборотыВыручкиОтРеализации.СубконтоКт1
       |ГДЕ
       | ОборотыВыручкиОтРеализации.Регистратор = &СсылкаДокРеализации
       | И ОборотыСписаниеТМЦ.Регистратор = &СсылкаДокРеализации
       | И ОборотыНДС.Регистратор = &СсылкаДокРеализации
       |
       |СГРУППИРОВАТЬ ПО
       | ОборотыСписаниеТМЦ.СубконтоДт1";

    МассивВидовСубконто = Новый Массив;
    МассивВидовСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.НоменклатурныеГруппы);

    Запрос.УстановитьПараметр("ДатаНач", Новый Граница(СтруктураШапкиДокумента.Дата, ВидГраницы.Включая));    
    Запрос.УстановитьПараметр("ДатаКон", Новый Граница(СтруктураШапкиДокумента.Дата, ВидГраницы.Включая));    
    Запрос.УстановитьПараметр("СЧЕТ90_02_1", Планысчетов.Хозрасчетный.СебестоимостьПродажНеЕНВД);    
    Запрос.УстановитьПараметр("СЧЕТ41_01",   Планысчетов.Хозрасчетный.ТоварыНаСкладах);    
    Запрос.УстановитьПараметр("СЧЕТ62_01",   Планысчетов.Хозрасчетный.РасчетыСПокупателями);    
    Запрос.УстановитьПараметр("СЧЕТ90_01_1", Планысчетов.Хозрасчетный.ВыручкаНеЕНВД);    
    Запрос.УстановитьПараметр("СЧЕТ90_03",   Планысчетов.Хозрасчетный.Продажи_НДС);    
    Запрос.УстановитьПараметр("СЧЕТ68_02_1", Планысчетов.Хозрасчетный.НДС);    
    Запрос.УстановитьПараметр("Организация", СтруктураШапкиДокумента.Организация);    
    Запрос.УстановитьПараметр("СсылкаДокРеализации", СтруктураШапкиДокумента.Ссылка);
    Запрос.УстановитьПараметр("ВидыСубконто", МассивВидовСубконто);

    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда

    ВыборкаЗапроса = Результат.Выбрать();

    Пока ВыборкаЗапроса.Следующий() Цикл
    //……………………………….
    КонецЦикла;
    КонецЕсли;

    КонецПроцедуры

    Пустой результат запроса получается, хоть ты тресни! Может, подскажет кто, где я не права?
  • Доброго времени суток и всех влюбленных с праздником, вот у меня любовь с 1С пока что 1-0 в её пользу... Есть неплохая книга с примерами Радченко, но вот выполнять, как мартышка, половину, не понимая значения выполненого, не очень интересно, когда-то очень давно программировал в Бейсике, помогает порой... Но большинство не совсем понятно: что в данный момент происходит, зачем и как! Естесственно, рыскаю в книгах, приходит какое-то понимание, но процесс такого самообразования происходит предельно медленно. Если есть кто терпеливый объяснить мне суть происходящего, прошу помочь в этом, от себя обещаю постараться быстро схватывать...
    Итак, есть такая функция в общем модуле:

    Код: (e1cv8)
    Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры) Экспорт 

    // Создать вспомогательный объект Отбор
    Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);
      
    // Получить актуальные значения ресурсов регистра
    ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(АктуальнаяДата, Отбор);

    Возврат ЗначенияРесурсов.Цена;

    КонецФункции
    С первой строчкой пока вопросов нет- ясно, а вот вторая:
    Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);

    Сразу за знаком = я теряю нить ясности, что означает и как работает: Новый, Структура, а также элементы в скобках, почему первый в кавычках (и что это дает)
    Пока остановимся на этом, добросердечные, помогите-разъясните :)
  • Создаю новый Word-документ:

    Код:
     WORD = Новый COMОбъект("Word.Application");
    НовДокум = WORD.Documents;
    Докум = НовДокум.Add("");
    WORD.Visible = 1;
    WORD.WindowState = 0;
    WORD.Activate();

    Пользователь его редактирует, сохраняет где-то под каким-то именем.

    Вопрос - как мне перехватить имя сохраненного файла, чтобы закатать его в ХранилищеЗначения?
  • Доброго времени суток.
    *ПК Сервер - комп к которому физически подключен фискальник;
    *ПК Клиент - обращается к ПК Серверу по сети;

    Люди может кто сталкивался с такой проблемой. Есть два компа и один фискальник. Необходимо организовать работу двух компов на этом фискальнике. С портами разобрался, теперь не выходит ошибка что порт занят, думал готово, не тут то было. При печати Х-отчета в функции обработки ТО:
    Код:
    Функция XОтчет(Объект, Пароль, НомерЧека, НомерСмены) Экспорт

    Результат = мНетОшибки;

    Если Не Объект.Драйвер.НапечататьОтчетБезГашения(Объект.ИДУстройства) Тогда
    Результат = мОшибкаНеизвестно;
    Объект.Драйвер.ПолучитьОшибку(Объект.ОписаниеОшибки);
    КонецЕсли;

    Возврат Результат;

    КонецФункции // XОтчет()

    возникает ошибка "Нет связи", хотя через драйвер, ПК Клиент замечательно его печатает.  Может кто сталкивался с такой проблемой???
  • Добрый день.
    Есть документ СчетНаОказаниеУслуг. В нем был один макет для печати с процедурой печати (Счет). понадобилось добавить еще пару макетов (ну и написать процедурки их заполнения), НО не могу сделать, чтобы в самом Предприятии при нажатии на "печать" они тоже отображались.

    внес вот какие изменения в модуль

    Код:
    Процедура Печать(ИмяМакета, КоличествоЭкземпляров = 1, НаПринтер = Ложь, НепосредственнаяПечать = Ложь) Экспорт

    // Получить экземпляр документа на печать
    Если ИмяМакета = "Счет" Тогда

    ТабДокумент = ПечатьСчетаЗаказа(ИмяМакета);

    ИначеЕсли ИмяМакета = "ДопСоглашение" Тогда

    ТабДокумент = ПечатьДопСоглашения();

    КонецЕсли;

    и в структуру печатных форм
    Код:
    Функция ПолучитьСтруктуруПечатныхФорм() Экспорт

    Возврат Новый Структура("Счет","Счет на оплату", "Доп. соглашение");

    КонецФункции // ПолучитьСтруктуруПечатныхФорм()


    в предприятии Доп. соглашение так и не отображается. может еще где-то нужно дописать?
    Спасибо за ответы.


    Добавлено через 21 секунду:
    Забыл написать. версия 8.2

    Добавлено через 1 час, 37 минут и 34 секунды:
    решил все же делать через внешнюю печатную форму.
    но на этот вопрос, если кто знает - ответьте все равно, для общего развития так сказать )
  • Программирование :: Программирование 1С :: 1С 8.2: Управляемое приложение
  • Kivals как-то писал про обработку напоминания:
    ----------------------------------------------------------------------------------------------------
    Я для подобных вещей делал периодический регистр сведений, в котором в принципе достаточно таких полей: Ответственный, Объект (любая ссылка), Сообщение (строка), Выполнено (булево)
    Период записи регистра определяет когда должно выскочить напоминание.
    После этого создал Регламентное задание (можно и отчетом, но я ориентировался на серверную версию) в методе которого:
    1. выполнял запрос, выбирая все записи из регистра сведений, у которых Период меньше текущего времени и Выполнено=Ложь
    2. по всем записям отправлял уведомления (по e-mail и смс) ответственным
    3. выставлял значение Выполнено=Истина

    P.S. в реальной задаче регистр сложнее, т.к. по одному событию позволяет добавлять несколько предварительных напоминаний. Но для понимания описанной схемы достаточно.

    ----------------------------------------------------------------------------------------------------

    Был бы очень признателен, если показал мне сам росписаный модуль в методике, который использует Регламентное задание.
  • Доброго всем утра !!!
    Имеется Управление торговлей 8.1_10.3.13.2 не типовая(в одном документе в табличной части добавлен реквизит
     с типом "строка").
    Открыл базу в конфигураторе 8.2 -> конвертировал базу.
    Далее пытаюсь обновить на 11.0.5.4 через сравнение и объединение с приоритетом основной конфигурации -> доходит до 20% и все без каких-либо сообщений(Как-будто процесс просто "сорвался"). Причем конфигурация изменена. При попытке обновиться выдает ошибку о несоответствии.

    Как правильно обновить УТ 10.3.13.2 после перехода на 8.2  ?
  • Программирование :: Общие проекты
  • у меня в последнее время появилась безумная идея поставить на вход электромеханический замок и завязать его на простенький контроллер. замок активный, т.е. ток в доме есть - замок заблокирован, тока нет - автоматически разблокируется. в любой момент можно открыть как майферовской карточкой, так и обычным ключом. в разблокированном состоянии дверь должна оставаться запертой, т.е. если в доме отключен ток - ее нельзя открыть картой, только ключом. карта прикладывается к считывателю, считыватель отсылает ее код контроллеру, контроллер, принимает решение на основе "карты доступа". "карту доступа" контроллер получает с сервера.

    контроллер - достаточно тупое реле с управлением по ethernet 485 и, желательно, wifi. должен иметь несколько портов (еще один предполагается заюзать на дверной геркон, остальные - потом подумаю), должен иметь буфер для внутренней памяти. также из железа потребуется считыватель (Mifire), десяток карточек, и ридер для бесконтактных карт. ну и витая пара, короба, и пр.

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

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

    в перспективе хотелось бы намутить что-то вроде смарт-хауса :) но это в очень далекой перспективе.

    есть у нас маньяки, разбирающиеся в микроконтролерах, плисках и пр? )
  • Операционные системы :: Встраиваемые системы :: Микроконтроллеры
  • Пишу для PIC10F20x небольшой алгоритм - на Си это 10 строчек. Но пишу на ассемблере и основательно задолбался с goto и и мельканием movwf/movf/movlw. Решил попробовать написать на Си и посмотреть, как с этим справится компилятор. В MPLAB Studio много инструментов. Я выбрал HI-TECH ANSI C Compiler.

    И так, исходный код на Си:

    Код: (c)
    ///*
    char test_func(void);

    int main(void)
    {
    char r;

    r = test_func();
    }
    //*/

    char test_func(void)
    {
    char v, z, d, s;

    v = 100;
    z = 0;

    if (v < z)
    {
    d = z - v;
    s = 0;
    }
    else
    {
    d = v - z;
    s = 1;
    }

    if (d < 2)
    return v;

    if (d > 25)
    d = 25;

    if (s == 0)
    {
    v = v + d;

    if (v > 100)
    return 100;

    return v;
    }
    else
    {
    if (v < d)
    return 0;

    return v - d;
    }
    }

    Так замучено писать заставил компилятор - он не понимает сравнений "d < 0", хотя char, вроде бы, тип знаковый. Возможно у него он по умолчанию бесзнаковый.



    Посмотрим, что наиндусил компилятор...
    (Ненужные директивы я убрал, а макросы развернул.)

    Код: (asm)
    ;_test.c: 14: char v, z, d, s;
    ;_test.c: 16: v = 100;
    movlw (064h)
    movwf (test_func@v)

    Логично.
       
    Код: (asm)
    l72: 
    ;_test.c: 17: z = 0;
    bcf status, c
    movlw 0
    btfsc status, с
    movlw 1
    movwf (test_func@z)

    А это что?  :o
    1. Сбрасываем флаг переноса.
    2. Загружаем в регистр W "0".
    3. Проверяем флаг переноса и есть он чист, то пропускаем след. команду (переход на п.5)
    4. Загружаем в регистр W "1".
    5. Записываем в переменную.

    А теперь сократим код (просто очистим переменную):

    Код: (asm)
     clrf test_func@z

    Или так (загрузим ноль в переменную):

    Код: (asm)
     movlw 0
    movwf test_func@z

    Аналогичный код:

    Код: (asm)
    ;_test.c: 22: s = 0;
    bcf status, c
    movlw 0
    btfsc status,0
    movlw 1
    movwf (test_func@s)



    Следующий перл:

    Код: (asm,,5-9)
    ;_test.c: 19: if (v < z)
    movf (test_func@z),w
    subwf (test_func@v),w
    btfsc status, c
    goto u71
    goto u70
    u71:
    goto l80
    u70:

    Зачем тут двойной переход (goto u71 / goto l80)?..  :dontknow:



    Еще "оптимизация":

    Код: (asm)
    ;_test.c: 21: d = z - v;
    movf (test_func@z),w
    movwf btemp+3
    decf (test_func@v),w
    xorlw 0ffh
    addwf btemp+3,w
    movwf (test_func@d)

    1. W = test_func@z
    2. (btemp+3) = W
    3. W = test_func@v - 1
    4. W ^= 0xff
    5. W += (btemp+3)
    6. test_func@d = W

    Замысловато...  :insane:

    Я бы сделал так:

    Код: (asm)
     movf test_func@v, w
    subwf test_func@z, w
    movwf test_func@d

    Неправда ли, это короче и понятнее?

    Аналогичный код:

    Код: (asm)
    ;_test.c: 26: d = v - z;
    movf (test_func@v),w
    movwf btemp+3
    decf (test_func@z),w
    xorlw 0ffh
    addwf btemp+3,w
    movwf (test_func@d)



    Еще пример расточительства:

    Код: (asm,,4-8)
    ;_test.c: 34: d = 25;
    movlw (019h)
    movwf (test_func@d)
    goto l94

    l12:

    l94:
    ;_test.c: 36: if (s == 0)



    Представляю, какой продукт будет на выходе с таким компилятором. У меня, замечу, оперативки всего 16 байт и программной памяти на 255 команд.
  • Направления программирования :: Drivers
  •  Здравствуйте. На работе поставили задачу: написать драйвер, создающий виртуальный COM порт, к которому сторонняя прога подключается как к реальному, но все отправляемые данные должны перенаправляться моему приложению. Также и наоборот: все данные от моей проги должны через драйвер уходить в этот виртуальный COM порт(и соответственно стороннему приложению).
     И вот вопрос: можно ли создать виртуальный COM порт, одновременный доступ к которому разрешён нескольким (двум) приложениям? Причём так, чтобы данные, приходящие от одного, перенаправлялись другому?
     Или нужно два драйвера: 1) драйвер виртуального COM порта 2)просто драйвер ядра. К первому подсоединяется стороннее приложение, ко второму моё приложение, между драйверами наладить обмен данными.
     Если что, сильно не пинать :), написанием драйверов никогда не занимался :(. Буду благодарен за любые советы, ссылки, исходники.
     
  • Направления программирования :: Web :: Серверные скрипты
  • Кто-нибудь уже озадачивался?

    Я прошелся по изменениям и новшествам.

    http://www.php.net/manual/en/migration53.php
    http://www.php.net/manual/en/migration53.changes.php
    Цитата
    Most improvements in PHP 5.3.x have no impact on existing code. There are a few incompatibilities and new features that should be considered, and code should be tested before switching PHP versions in production environments.
    http://www.php.net/manual/en/migration53.incompatible.php
    http://www.php.net/manual/en/migration53.new-features.php


    Существенные изменения:

    1.
    http://www.php.net/manual/en/function.call-user-func.php
    Цитата
    The interpretation of object oriented keywords like parent and self has changed. Previously, calling them using the double colon syntax would emit an E_STRICT warning because they were interpreted as static.

    2.
    Цитата
    The behaviour of functions with by-reference parameters called by value has changed. Where previously the function would accept the by-value argument, a fatal error is now emitted. Any previous code passing constants or literals to functions expecting references, will need altering to assign the value to a variable before calling the function.
    Если где кривой код - вылезет fatal error.

    3.
    Цитата
    The new mysqlnd library necessitates the use of MySQL 4.1's newer 41-byte password format. Continued use of the old 16-byte passwords will cause mysql_connect() and similar functions to emit the error, "mysqlnd cannot connect to MySQL 4.1+ using old authentication."
    Цитата
    The new mysqlnd library does not read mysql configuration files (my.cnf/my.ini), as the older libmysql library does. If your code relies on settings in the configuration file, you can load it explicitly with the mysqli_options() function. Note that this means the PDO specific constants PDO::MYSQL_ATTR_READ_DEFAULT_FILE and PDO::MYSQL_ATTR_READ_DEFAULT_GROUP are not defined if MySQL support in PDO is compiled with mysqlnd.
    Думаю, тут у нас все в порядке. Посмотрим.

    4.
    Цитата
    # The trailing / has been removed from the SplFileInfo class and other related directory classes.
    # The __toString magic method can no longer accept arguments.
    # The magic methods __get, __set, __isset, __unset, and __call must always be public and can no longer be static. Method signatures are now enforced.
    # The __call magic method is now invoked on access to private and protected methods.
    # func_get_arg(), func_get_args() and func_num_args() can no longer be called from the outermost scope of a file that has been included by calling include() or require() from within a function in the calling file.
    Ничего не могу сказать. Если где криво...


    Добавлено через 13 минут и 49 секунд:
    Бррр.... В 5.3 добавили оператор goto! :o
    Офигеть!

    Еще napespace внедрили, но на первый взгляд как-то сложно сделали.

    Добавлено через 24 минуты и 9 секунд:
    Из интересного хорошего:
    1. Support for Late Static Bindings has been added.
    2. There are two new magic methods, __callStatic and __invoke.
    3. Появились замыкания. Заждались.
    4. Новый heredoc - "nowdoc" - теперь без интерполяции.
    5. Сокращенный вариант "?:". Давно пора.
    6. Вложенные исключения. Хм... Разве раньше было нельзя?...
    7. A garbage collector for circular references has been added, and is enabled by default.
    8. The mail() function now supports logging of sent email. Интересно...

    Странно, что такой популярный язык так долго обзаводится элементарными вещами.
  • Направления программирования :: Web :: HTML/DHTML
  • Есть HTML форма:
    Код:
    <form action="/admin/catalog" method="GET">
        Выберите каталог
        <select name="cat">
            <option value="2154">AC </option>
            ....
        </select>
        <input type="submit" value="Выбрать"/>
    </form>

    При нажатии Выбрать откроется страница /admin/catalog?cat=2154
    Нужно чтоб открывалась /admin/catalog/2154

    Есть ли способы сделать это?
    Javascript не хочется использовать, т.к. у меня много подобных форм.
    Редиректы и реврайты не так плохо, но тоже хотелось бы без них.

    Такие формы у меня присутствуют на разных страницах в великом множестве, так что хотелось бы узнать наиболее элегантный способ.
  • Практические разделы :: Базы данных
  • Для хранения артиклей входящих в заказ использую таблицу (order_item)
    Код: (mysql)
    CREATE TABLE `order_item` (
      `id_order` int(11) NOT NULL,
      `id_item` int(11) NOT NULL,
      `item_type` varchar(15) NOT NULL,
      `item_index` tinyint(2) unsigned NOT NULL,
      `quantity` smallint(4) unsigned NOT NULL,
      PRIMARY KEY  (`id_order`,`id_item`,`item_type`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    `item_type` - содержит название таблицы в которой содержатсяя данные по артиклю (т.е. service, excursion или accomodation)

    Сами же артикли ввиду того что имеют разный характеристики я храну в разных таблицах (service, excursion, accomodation)
    Код: (mysql)
    CREATE TABLE `excursion` (
      `id_item` int(11) NOT NULL auto_increment,
      `name` varchar(255) default NULL
    ...
    параметры
    ...
      PRIMARY KEY  (`id_e`),
      UNIQUE KEY `NewIndex` (`name`)
    ) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
    таким же образом реалезованы и (service, accomodation)

    Вопрос такой: Как по id_order получить список артиклей входящих в заказ?
    учитывая что id_item уникален только для своей таблици
  • Есть ли у баз данных какое-то физическое расположение? Чтобы можно было взять вот этот, этот, этот файл и скопировать их в другое место, и они бы так же хорошо работали?

    Базы данных были созданы средствами пакета Apach php+mysql

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

    Если нельзя скопировать их физически, то какие хорошие понятные программы могут делать полный обзор баз данных на компе, подключать их, экспортировать?
  • Есть хранимая процедура (pPolsq) на SQL 2005 Express с одним, в процедуре же и инициализируемом, параметром (Inicials):
     
    Код:
    USE [tatApril11]
     Declare @Inicials nvarchar(35)
     Set @Inicials='ИВАНОВ В И'
     SELECT Distinct mibAPAC.FAM, mibAPAC.Mes  Where mibAPAC.FAM=@Inicials;
    return
    В SQL Server Management Studio Express процедура выполняется без проблем, когда же я пытаюсь в Builder6 из компонента  ADOQuery вызвать её сформировав строку запроса вот так:
    Код:
    select * from pPolsq()
    то выходит ошибка: "Недопустимое имя объекта "pPolsq"". Никакие переименования процедуры не помогают. А вот если вместо имени процедуры поставить имя любой таблицы той же SQL-базы, то всё выполняеься прекрасно. Мне кажется, что всё дело в синтаксисе вызова процедуры, но найти правильный не могу. Подскажите, пожалуйста, кто знает.
     

  • Практические разделы :: Программы
  • Доброго времени суток всем! У меня такая проблемма:
    На WinXP стоит VBox. 2 виртуальных машины. На одной FreeBSD 8.2 Release, на второй WinXP.
    На фре 2 сетевых адаптера №1-тип сетевой мост, №2-внутреняя сеть. На вирт.XP адаптер 1-внутренняя сеть.
    На фре :geteway_enable="YES", фаерволов нет, внутрення сеть по IP'шникам должна идти, в VirtualBox сеть-intnet2 на адаптерах обоих виртуальных машин.
    Проблемма в том что Winda  видит только интерфейс внутренней сети а №2 не видит !

    tcpdump -i em1 на free показывает что пакеты к em0 проходят из intnet, но не возвращаются.
    em0-external_if
    em1-internal_if

    Может статью какую посоветуете, не пойму ошибка во фре или в VirtBox'е.
  • Учимся программировать :: Начинающим
  • Имеется цикл в котором создаются потоки с одинаковой потоковой функцией find_in_path() :

    hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)find_in_path,NULL,0,NULL);

    Если я правильно понимаю,то все переменные,определённые внутри find_in_path(),будут локальными для каждого из создаваемых потоков и доступ к ним синхронизировать не нужно? - Но при таком ходе мысли у меня нарушается логика работы функции find_in_path() в каждом из потоков (попрасту говоря - неверно работает)...Если же код внутри find_in_path() обернуть в критическую секцию,то всё работает верно...
    Или я чего-то не понимаю?
  • Используя инди мультикаст сервер\клиент нужно передать\получить примерно каждую секунду одно значение имеющее тип Double. Как это делается, никак не могу понять?
    Заранее благодарю.
  • Начал осваивать шаблоны в с++, линковщик ругается следующим:
    Цитата
    error LNK2019: unresolved external symbol "public: __thiscall Array_Stack<char>::~Array_Stack<char>(void)" (??1?$Array_Stack@D@@QAE@XZ) referenced in function _wmain   
    MS VS 2010.

    Задним местом чую, что ошибка элементарная, но решить не могу. Гугль пишет
    Цитата
    Question: You have included the templates in every source file? (you should answer YES).
    Question: You are not using function prototypes for template funcitons? (You should answer YES).
    Как подключить шаблоны в сорц? Что значит "не используйте прототипы функций для шаблонных функций"... :-/

    Array_Stack.h
    Код:
    #pragma once
    template<class T> class Array_Stack //: public MyStack<T>
    {
    private:
    T* arr;
    int top;
    int maxSize;

    public:
    Array_Stack(int size);
    ~Array_Stack(void);

    T pop();
    void push(T ch);
    };



    Array_Stack.cpp
    Код:
    #pragma once

    #include "StdAfx.h"
    #include "Array_Stack.h"

    template<class T> Array_Stack<T>::Array_Stack(int size)
    {
    maxSize = size;
    arr = new T[maxSize];
    top = 0;
    }

    template<class T> T Array_Stack<T>::pop()
    {
    if(top == 0)
    {
    throw Overflow();
    }

    top--;
    return arr[top];
    }

    template<class T> void Array_Stack<T>::push(T ch)
    {
    if(top == maxSize)
    {
    throw Overflow();
    }

    arr[top] = ch;
    top++;
    }

    template<class T> Array_Stack<T>::~Array_Stack()
    {
    delete [] arr;
    }

    main
    Код:
    #pragma once

    #include "stdafx.h"
    #include <iostream>
    #include "Array_Stack.h"

    int _tmain(int argc, _TCHAR* argv[])
    {
    int size = 10;
    Array_Stack<char> myStack (size);

    int x;
    std::cin >> x;
    return 0;
    }

  • Приветы.

    Пытаюсь научиться работать с диаграммами, в одной процедуре формируется запрос, группируем количество доков в неделю, другая процедура по логике должна рисовать диаграмму. Трабл в том что незнаю как передать данные из процедуры запроса\подсчета в процедуру формирования диаграммы. Приходит на ум только выгрузить в файл или ТЗ.
    результат вывода: ошибки, слюни,  мат. Очень хочется понять принцип.

    Код:

    //*******************************************
    // Процедура генерации запроса Сформировать.
    //
    Перем КолДок, Интервал, ТЗ;
    Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Перем = Документ.Перемещение.ТекущийДокумент, Документ.ПриходнаяНакладная.ТекущийДокумент, Документ.РасходнаяНакладная.ТекущийДокумент;
    |Фирма = Документ.Перемещение.Фирма, Документ.ПриходнаяНакладная.Фирма, Документ.РасходнаяНакладная.Фирма;
    |Группировка Неделя все ВошедшиеВЗапрос;
    |Группировка Перем упорядочить по Перем.НомерДок, Перем.ДатаДок, Перем.Автор без групп все;
    |Условие(Фирма = ВыбФирма);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    Интервал=Запрос.Неделя;
    КолДок=0;
    Пока Запрос.Группировка(1) = 1 Цикл
    // Заполнение полей Неделя
    Таб.ВывестиСекцию("Неделя");
    Пока Запрос.Группировка(2) = 1 Цикл
    КолДок=КолДок+1;
    // Заполнение полей Перем
    Таб.ВывестиСекцию("Перем");
    КонецЦикла;
    Сообщить(КолДок);
    Сообщить(Интервал);
    Сообщить("Таблица");
    Сообщить(ТЗ);
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
    КонецПроцедуры

     

    //Конструкции <<...>> необходимо заменить на реальные логические условия и значения переменных
    Процедура Диаграма_Диаграмма(Диаграмма)
    Диаграмма.Обновление(0);
    Серия = 1;
    Точка = 1;
    // Пока Серия < 10 Цикл
    Диаграмма.УстановитьИмяСерии(1,Серия);
    Точка = 1;
    Пока Точка < 10 Цикл
    Диаграмма.УстановитьЗначение(Точка,Серия,Точка);
    Если Серия = 1 Тогда
    Диаграмма.УстановитьИмяТочки(Точка,Точка);
    КонецЕсли;
    Точка = Точка + 1;
    КонецЦикла;
    Серия = Серия + 1;
    // КонецЦикла;
    Диаграмма.Обновление(1);
    КонецПроцедуры

    Процедура Диаграма()
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Диаграма");
    Таб.ВывестиСекцию("Диаграмма");
    Таб.ВывестиСекцию("Шапка");
    Таб.Опции(0,0,0,0);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Диаграма","");
    КонецПроцедуры

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


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


В избранное