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

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Профессор
Рейтинг: 6009
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2587
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2207
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1612
Дата выхода:18.12.2010, 16:30
Администратор рассылки:Verena (Профессор)
Подписчиков / экспертов:328 / 178
Вопросов / ответов:4 / 5

Вопрос № 181266: Здравствуйте, уважаемые эксперты! У меня стоит задача: некоторые функции написанные на Си надо включить в программу на Паскале. Для программы используется Borland Pascal 7 (Delphi пока нельзя). Для функций -- Borland C++ 3.1 (можно другой, но...


Вопрос № 181267: Здравствуйте, уважаемые эксперты! Прошу Вас помочь написать программу вставки и удаления элементов списка, используя для реализации списка двусвязный список. ...
Вопрос № 181270: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: вычислить скалярное произведение двух векторов размером 10000000 с помощью MMX комманд. Среда: Microsoft Visual Studio 2008. ...
Вопрос № 181290: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: как можно добавить в стандартный калькулятор (Windows) еще 1 кнопку с определенной функцией, не используя декомпилятор? ...

Вопрос № 181266:

Здравствуйте, уважаемые эксперты!

У меня стоит задача: некоторые функции написанные на Си надо включить в программу на Паскале. Для программы используется Borland Pascal 7 (Delphi пока нельзя). Для функций -- Borland C++ 3.1 (можно другой, но что есть для DOS?)

Проблема 1. Компилятор Паскаля успешно линкует obj файл, но не находит функции. При включении в Си опции "Generate assembler code" обнаружил, что функциям даются чудные имена. Например, функция int qwe(int i) там называется qwe$qi. Я поменял вручную имена на qwe, скопилировал obj в tasm и в Паскале всё правильно заработало. Откуда такое название? Как это отключить?

Проблема 2. Эти функции на Си -- математические; там используются abs, sin и прочее из math.h. Когда я их добавил, Паскаль сказал, что не находит _abs, _sin. Как можно справиться с этим затруднением?

Отправлен: 12.12.2010, 23:47
Вопрос задал: Сергей Бендер (Практикант)
Всего ответов: 1
Страница вопроса »


Отвечает Павел Юрьевич (6-й класс) :
Здравствуйте, Сергей Бендер!

Средствами Borland C++ 3.1 создайте DLL со всеми необходимыми функциями, а затем подключите этот DLL в Borland Pascal.

Решение проблемы №1: Для того, чтобы имена собственных функций экспортировались в объектный файл в том виде, в каком они присутствуют в исходном коде программы, необходимо добавлять в определении функции ключевое слово pascal, например:
Код:
double pascal qwe(double d)

Решение проблемы №2: Для передачи в программу на Паскале функционала математических функций, таких как sin, cos, log, exp и т.д. при невысоких требованиях к производительности, данные функции проще всего реализовать в исходной программе на C путем вычисления суммы N членов ряда Тейлора, в который можно разложить указанные функции. На практике достаточно 3-4 членов ряда.
Разложение в ряд с примерами описано здесь: http://ru.wikipedia.org/wiki/Ряд_Тейлора
Ответ дополнен по просьбе автора.
-----
∙ Отредактировал: Николай Владимирович / Н.В. (Администратор)
∙ Дата редактирования: 15.12.2010, 19:41 (время московское)

Ответ отправил: Павел Юрьевич (6-й класс)
Ответ отправлен: 13.12.2010, 06:52
Номер ответа: 264699

Оценка ответа: 5
Комментарий к оценке:
В первую очередь за то, что долго обсуждали и перебирали варианты.

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264699 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 181267:

    Здравствуйте, уважаемые эксперты! Прошу Вас помочь написать программу вставки и удаления элементов списка, используя для реализации списка двусвязный список.

    Отправлен: 13.12.2010, 00:37
    Вопрос задал: Шаталов Виктор Олегович (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Хватов Сергей (Профессионал) :
    Здравствуйте, Шаталов Виктор Олегович!
    Слегка упрощённая реализация списка из ядра linux. Я её использовал в нескольких проектах на plain c. Компилятор - gcc.

    Приложение:

    Ответ отправил: Хватов Сергей (Профессионал)
    Ответ отправлен: 13.12.2010, 08:24
    Номер ответа: 264701

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264701 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 181270:

    Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: вычислить скалярное произведение двух векторов размером 10000000 с помощью MMX комманд. Среда: Microsoft Visual Studio 2008.

    Отправлен: 13.12.2010, 01:35
    Вопрос задал: Alexkharkov (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Alexkharkov!
    Вот Вам примерчик
    Код:
    #include <time.h>
    #include <iostream>

    int Scalar(short* Vector1, short* Vector2, int count)
    {
    int iSum;
    __asm
    {
    mov ecx, Vector1 //адрес первого вектора
    mov edx, Vector2 //адрес второго вектора
    psrlq mm7, 64 //очищаем mm7 сдвигом вправо на все 64 бита
    cycle:
    movq mm0, [ecx] //читаем по 4 слова
    movq mm1, [edx]
    pmaddwd mm0, mm1 //складываем
    //mm0:a3 a2 a1 a0
    //mm1:b3 b2 b1 b0
    //mm0:a3*b3+a2*b2 a1*b1+a0*b0
    paddd mm7, mm0 //и одновременно накапливаем в mm7
    //( отдельно ст и мл двойные слова)
    add ecx, 8 //на следующие 4 слова
    add edx, 8
    sub count, 4 //счетчик слов
    jnz cycle
    movq mm0, mm7 //сложим старшее и младшее двойное слово
    psrlq mm7, 32 //старшее в младшее
    paddd mm7, mm0 //сложим два младших двойных слова
    movd iSum, mm7 //результат - в двойное слово iSum
    emms //сброс
    }
    return iSum;
    }

    int main()
    {
    const int n = 10000000;
    short *Vector1 = new short[n];
    short *Vector2 = new short[n];
    int i;

    srand((unsigned int)time(0));
    for(i=0;i<n;i++)
    {
    Vector1[i] = rand()%2000 - 1000;
    Vector2[i] = rand()%2000 - 1000;
    }

    int iSum=Scalar(Vector1, Vector2, n);

    delete []Vector1;
    delete []Vector2;
    return 0;
    }

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 14.12.2010, 14:08
    Номер ответа: 264767
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264767 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 181290:

    Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: как можно добавить в стандартный калькулятор (Windows) еще 1 кнопку с определенной функцией, не используя декомпилятор?

    Отправлен: 13.12.2010, 09:34
    Вопрос задал: Шаталов Виктор Олегович (Посетитель)
    Всего ответов: 2
    Страница вопроса »


    Отвечает Павел Юрьевич (6-й класс) :
    Здравствуйте, Шаталов Виктор Олегович!

    Пишете программу, у которой будет отображаться стандартный калькулятор и рядом своя панель с кнопками. При этом Вам необходимо внедриться в процесс calc.exe и перехватывать и обрабатывать все действия самому, в том числе и обрабатывая свои кнопки.

    Ответ отправил: Павел Юрьевич (6-й класс)
    Ответ отправлен: 13.12.2010, 09:44
    Номер ответа: 264705

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264705 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Сандров Алекс (Студент) :
    Здравствуйте, Шаталов Виктор Олегович!

    Легко! Для этого надо:
    1. Создать кнопку, с нулемым ID, положить её на калькулятор(опционально);
    2. Сделать сабклассинг кнопки, и ловить WM_LBUTTONUP, т.е. момент, когда её отжали. По умолчанию, кнопка пошлёт WM_COMMAND своему родителю, но родитель у неё будет калькулятор, и мы ничего не узнаем. Кроме того, ID = 0 как раз для того, чтобы калькулятор никак не прореагировал на кнопку, как на свою собственную. К примеру, если разместить свою кнопку на калькуляторе, с ID = 131, то она будет работать подобно кнопке [7], даже без сабклассинга (см. аттач).
    3. При отжатии кнопки(то самое WM_LBUTTONUP), вычитать содержимое EditBox-а с калькулятора, он там один, ищется просто. Самый простой вариант - послать окну Ctrl+C и вычитать clipboard.
    4. Сделать нужные действия и положить данные обратно в EditBox. Самый простой вариант - записать в clipboard и послать окну Ctrl+V.

    Все эти действия можно делать 2 путями.
    1. С оздать "невидимое" приложение, которое будет следить за калькуляторами, за их появлением. Это просто, exe-файл калькулятора постоянных во всех системах, класс окна - SciCalc. Следить можно, например, через SetWinEventHook, на открытие окна, это просто и можно делать в одном приложении всё.
    2. Непосредственно запускать программу и указывать ей окно калькулятора(hwnd окна) и делать тоже самое, что и в п. 1. Прикрепленный файл: загрузить »

    Ответ отправил: Сандров Алекс (Студент)
    Ответ отправлен: 13.12.2010, 10:39
    Номер ответа: 264708

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264708 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010

    В избранное