Seaward.ru

Здравствуйте, гость ( Вход | Регистрация )

> Программирование, На каком языке кодим, делимся опытом...
Командор Норрингтон
сообщение Dec 5 2006, 20:48
Сообщение #1


Madman
*****


Группа: форумчанин
Сообщений: 477
Регистрация: 28-August 06
Из: Planet Earth
Пользователь №: 4,052



Я на VB6, и Delphi...
А вы на чём?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
Warship
сообщение Jun 24 2010, 12:42
Сообщение #2


Гроза морей
*****

Ветеран ФорумаЗаслуженный КорсарСоздатель Модов к ГПК
Создатель Модов к КВЛ
Группа: бета-тестер
Сообщений: 441
Регистрация: 29-April 07
Из: Прим. край г. Находка
Пользователь №: 9,103



smile.gif

У меня глобальных задач не было smile.gif Для того, чтобы опробовать свои силы, захотелось перетащить реализацию алгоритма кодирования длин серий (RLE smile.gif) с C# на C++ в ДЛЛку. Ну вот и упражняюсь smile.gif

Если интересно, что получилось:
ДЛЛка:
Заголовок:
Код
#ifndef COMPRESS_H
#define COMPRESS_H

#define EXPORT extern "C" __declspec (dllexport)

EXPORT void* RLEEncode(const void* _data, const unsigned long _length);
EXPORT void* RLEDecode(const void* _data, const unsigned long _length);
void* BufferSet(void* _buff, unsigned char _byte, unsigned long _pos);

#endif


Реализация:
Код
#include <windows.h>
#include "Compress.h"

/// Точка входа в DLL.
bool APIENTRY DllMain(HINSTANCE _instance, DWORD _reason, LPVOID _reserved)
{
    return true;
}

/// Функция производит сжатие указанных данных на основе алгоритма кодирования повторов.
EXPORT void* RLEEncode(const void* _data, const unsigned long _length)
{
    unsigned long curDataPos;
    unsigned long bufPos = 0;
    unsigned char count = 1;
    unsigned char curByte;
    unsigned char nextByte;
    void* retData = NULL;
    
    for(curDataPos = 0; curDataPos < _length; curDataPos++)
    {
        curByte = ((unsigned char*) _data)[curDataPos];
        nextByte = (curDataPos == _length - 1 ? ((unsigned char*) _data)[curDataPos - 1] : ((unsigned char*) _data)[curDataPos + 1]); // Если уже на границе массива, сравниваем с предыдущим
        
        if(curByte == nextByte && count < 255 && curDataPos < _length - 1)
        {
            count++;
        }
        else
        {
            retData = BufferSet(retData, count, bufPos++); // Длина повтора
            retData = BufferSet(retData, curByte, bufPos++); // Байт повтора
            count = 1;
        }
    }
    
    return retData;
}

/// Функция производит восстановление данных, сжатых на основе алгоритма кодирования повторов.
EXPORT void* RLEDecode(const void* _data, const unsigned long _length)
{
    unsigned long curDataPos;
    unsigned long bufPos = 0;
    unsigned char count;
    unsigned char curByte;
    void* retData = NULL;
    
    for(curDataPos = 0; curDataPos < _length; curDataPos += 2)
    {
        count = ((unsigned char*) _data)[curDataPos];
        curByte = ((unsigned char*) _data)[curDataPos + 1];
        
        while(count-- > 0)
        {
            retData = BufferSet(retData, curByte, bufPos++);
        }
    }
    
    return retData;
}

/// Функция записывает в буфер указанный байт на указанную позицию.
void* BufferSet(void* _buff, unsigned char _byte, unsigned long _pos)
{
    _buff = realloc(_buff, _pos + 2);
    
    //if(_buff != NULL)
    //{
        ((unsigned char*) (_buff))[_pos] = _byte;
        ((unsigned char*) (_buff))[_pos + 1] = '\0';
    //}
    
    return _buff;
}


Приложение:
Реализация:
Код
#include <stdio.h>
#include <windows.h>

typedef void* (*RLEEncode)(const void* _data, const unsigned long _length);
typedef void* (*RLEDecode)(const void* _data, const unsigned long _length);

/// Точка входа в приложение.
int main(int argc, char* argv[])
{
    char* sTextToEncode = "AAABBCC";
    void* buffer;
    RLEEncode Encode;
    RLEDecode Decode;
    HINSTANCE compressDll = LoadLibrary("Compress.dll");
    
    if(compressDll == NULL)
    {
        printf("ERROR: unable to load DLL!\n");
        system("pause");
        return 1;
    }
    
    Encode = (RLEEncode) GetProcAddress(compressDll, "RLEEncode");
    Decode = (RLEDecode) GetProcAddress(compressDll, "RLEDecode");
    
    if(Encode == NULL || Decode == NULL)
    {
        printf("ERROR: unable to find DLL functions!\n");
        system("pause");
        return 1;
    }
    
    buffer = Encode(sTextToEncode, 7);
    printf("Encoded data: %s\n", (char*) buffer);
    
    buffer = Decode(buffer, 6);
    printf("Decoded data: %s\n", (char*) buffer);
    
    free(buffer);
    delete[] sTextToEncode;
    FreeLibrary(compressDll);
    
    system("pause");
    
    return 0;
}


Вот сейчас хочется переделать фукнции в ДЛЛке, чтобы они сразу писали в указанный буфер, а не возвращали указатель на новый, ибо память утекает при вызове buffer = Encode(buffer, ...); - указатель на прежний ведь теряется smile.gif

А как тут будет проще байт запихнуть-то? Можно, конечно, юзать STL класс vector (или stack smile.gif), но хотелось сделать это максимально "ручками" smile.gif

Собственно, тут есть еще одна проблема:
Как можно определить размер этого буффера? Сейчас у меня размер, который передается в функции кодирования, захардкоден, но этож не дело smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщений в этой теме
Командор Норрингтон   Программирование   Dec 5 2006, 20:48
Destynar   Ни на чем :) Все никак не выкрою время и деньгу ч...   Dec 5 2006, 23:24
Avdenago   По работе - web-progrmming - в основном ПХП. Но с...   Dec 6 2006, 11:14
navy   VB, VBA, VB.NET (это забыл почти уже все) Активно ...   Dec 6 2006, 12:04
Командор Норрингтон   А мне VB.NET не нравиццо, там много наворотов не н...   Dec 6 2006, 20:55
navy   можно не пользоваться не нужным, но VB.NET это пе...   Dec 8 2006, 10:11
Командор Норрингтон   У меня стоят оба но VB6 для меня приемлемей   Dec 8 2006, 13:52
navy   Мне все равно, я одинаково хорошо забыл оба уже :)   Dec 8 2006, 13:55
Командор Норрингтон   Не VB6 не забуду... Ну хотя пока в школе учат, я т...   Dec 9 2006, 18:06
Dreyk   Привет,хотел задать вапрос по програмированию...не...   Dec 21 2006, 03:47
Командор Норрингтон   ЭЭЭ онлайн игры, как и другие щас наверно на Си А ...   Dec 21 2006, 13:13
Bogdan   А кто знает, как в Паскале сделать вот такую задач...   Dec 21 2006, 14:39
BooDoo   А кто знает, как в Паскале сделать вот такую зада...   Dec 21 2006, 15:45
__Морган__   А кто знает, как в Паскале сделать вот такую зада...   Dec 21 2006, 16:03
Bogdan   Спасибо BooDoo за разъяснения. Думаю, что теперь н...   Dec 21 2006, 16:36
__Морган__   Спасибо BooDoo за разъяснения. Думаю, что теперь ...   Dec 21 2006, 16:39
BooDoo   Спасибо BooDoo за разъяснения. Думаю, что теперь ...   Dec 21 2006, 16:49
Bogdan   Буду очень признателен!   Dec 21 2006, 16:42
Командор Норрингтон   А я Паскаля не знаю - устаревший язык... из старых...   Dec 22 2006, 16:32
__Морган__   Всё сделал сейчас на личку вышлю! ;)   Dec 22 2006, 18:15
Bogdan   Ребят, кажется Морган забыл файл к сообщению приле...   Dec 23 2006, 22:51
Piroman   Судя по всему он и не собирался... Он жишь хотел ...   Dec 24 2006, 03:05
Bogdan   А бывает проще? Чет я такого о Паскале и не знаю....   Dec 24 2006, 18:09
Piroman   А бывает проще? Сматря ф каком смысле и о чём :P :...   Dec 24 2006, 19:08
Bogdan   неа. А нельзя это сделать на колхозном уровне?   Dec 24 2006, 19:26
Piroman   неа. Вот этот должин кампилиццо: Пропустил пару с...   Dec 24 2006, 19:40
Bogdan   Спасибо за помощь, Piroman! Колхоз в топку...   Dec 24 2006, 19:51
Piroman   Спасибо за помощь, Piroman! Колхоз в топку...   Dec 24 2006, 19:57
Bogdan   Обращаюсь "ешшо" :) : А в Басике забабах...   Dec 25 2006, 15:09
Piroman   Обращаюсь "ешшо" :) : А в Басике забабах...   Dec 25 2006, 15:18
Bogdan   Готов! С меня еще 1.000.000.000 копеек ))   Dec 25 2006, 16:02
Piroman   Готов! С меня еще 1.000.000.000 копеек )) Ла...   Dec 25 2006, 20:23
Bogdan   Piroman'ищще! А вот такой вариант работать...   Dec 25 2006, 22:15
Piroman   Дык вапрос то какой? Зачем тебе количество?.. И ...   Dec 26 2006, 00:07
Bogdan   в 11. Только у нас информатика походу так, для гал...   Dec 26 2006, 00:19
Piroman   Блин, Пироман, чтоо бы я без тебя делал??!...   Dec 26 2006, 00:32
Bogdan   А откуда такие познания? На собственном энтузиазме...   Dec 26 2006, 00:34
Piroman   А откуда такие познания? На собственном энтузиазме...   Dec 26 2006, 00:41
Karharov   Мля, человеки, не у кого случаем не завалялся руси...   Feb 2 2007, 14:56
Минтай   ЗЫ А че из них лучше:Borland C++ Bulder, Enterpri...   Feb 2 2007, 15:18
Черный Корсар   Потихоньку разбираю Паскаль 7.0   Sep 15 2007, 19:55
Dark Crusader   C++, C#, Java. B) Немного Pascal помню.   Oct 3 2007, 00:52
Черный Корсар   Посоветуйте стоит самому браться за изучение Ассам...   Oct 30 2007, 22:46
zorx007   Всем привет у меня образовался вопрос к программер...   Dec 24 2007, 17:56
Командор Норрингтон   Скорее тебе сюда http://legend.seaward.ru/forum/in...   Dec 24 2007, 19:52
Командор Норрингтон   Хлопцы, рятуйте, сорри за второй пост, просто дума...   Dec 26 2007, 19:20
BooDoo   1) Какое минимальное количество разрядов двоично...   Dec 27 2007, 20:28
Командор Норрингтон   Спс! А как насчёт третьего? Я второе сам сдела...   Dec 28 2007, 17:43
ATILA   Где можно скачать Паскаль или Дельфи, очень надо...   Jan 12 2008, 22:50
TAHAT   дельфи можно скачать с сайта производителя (www.bo...   Jan 12 2008, 23:06
ALexusB   Вопрос к студентам Каким языкам сча в ВУЗе учат? Н...   Feb 11 2010, 00:38
Warship   У нас сча дела на первом курсе обстоят вот так: П...   Feb 11 2010, 11:15
Dir   У нас сча дела на первом курсе обстоят вот так: ...   Feb 11 2010, 11:37
RIZIY   Ещё в 1987-88 у нас в школе был бэйсик.... :)   Feb 11 2010, 12:30
ALexusB   Ага и слово "она" тоже характерно. Я пок...   Feb 11 2010, 12:58
Черный Корсар   На первом курсе учили C++. Сейчас конкретной привя...   Feb 11 2010, 17:10
Warship   Нужна помощь по простому вопросу. У меня есть дина...   Jun 19 2010, 14:05
navy   посмотри тут http://www.firststeps.ru/mfc/winapi/r...   Jun 19 2010, 16:55
Warship   Там я смотрел. :) Как и на википедии в статье о Dl...   Jun 20 2010, 06:39
navy   естественно разные :) Т.к. длл смотрит относитель...   Jun 21 2010, 11:57
Warship   С# нормальный язык, но для своей области. Хотя он...   Jun 21 2010, 13:30
navy   DLL extern "C" __declspec(dllexport...   Jun 22 2010, 06:58
Warship   Нави, спасибо. :) Благодаря твоему примеру разобр...   Jun 22 2010, 09:07
navy   этот ворнинг показывает, что произошло неявное пр...   Jun 22 2010, 11:58
Warship   Хотя, по идее, твой вариант должен работать как н...   Jun 23 2010, 13:11
navy   естественно :) ты же его релокейтишь как т.е. д...   Jun 23 2010, 18:02
Warship   естественно :) ты же его релокейтишь как Ну да,...   Jun 24 2010, 00:17
navy   В общем, ты лучше озвучивай конкретный пример, пот...   Jun 24 2010, 11:59
Warship   :) У меня глобальных задач не было :) Для того, ч...   Jun 24 2010, 12:42
navy   Вообще использование стандартных классов это норма...   Jun 25 2010, 06:53
Warship   Вообще использование стандартных классов это норм...   Jun 25 2010, 08:54
navy   Вообще, лучший способ изучить язык, это написать н...   Jun 25 2010, 19:15
Диман   Может посоветуйте книжку хорошую по C++. Желательн...   Sep 19 2010, 15:38
Warship   Можно попробовать курнуть книжку Бьерна Страуструп...   Sep 20 2010, 04:11
ALexusB   Книга "Совершенный код" С. Макконнелл -...   Sep 20 2010, 11:22
Диман   O'Reilly ни в ozon ни на торрентах не нашел, п...   Sep 20 2010, 15:16
ALexusB   Книжку "Совершенный код" никогда не быва...   Sep 20 2010, 15:25
Диман   Книжку "Совершенный код" никогда не быв...   Sep 20 2010, 20:20
navy   Разницы на каком языке писать нет вообще. На языка...   Sep 21 2010, 06:41
Диман   Разницы на каком языке писать нет вообще. На язык...   Sep 21 2010, 11:12
Warship   На деле кстати да, книга и не нужна вообще по конк...   Sep 21 2010, 08:39
navy   Ну для примера можешь взять уроки тут http://progs...   Sep 21 2010, 11:53
Диман   Ну для примера можешь взять уроки тут http://prog...   Sep 21 2010, 12:10
Warship   Конструктуры вызываются при создании экземпляра кл...   Sep 21 2010, 12:16
Диман   Для построения интерфейса (причем, кросс-платфор...   Sep 21 2010, 13:10
Warship   Да не в книгах счастье ;) Есть море документации о...   Sep 21 2010, 13:20
ugeen   Для построения интерфейса (причем, кросс-платформ...   Sep 21 2010, 13:50
Warship   Нувот :) Значит либа и вправду крута, если использ...   Sep 21 2010, 14:01
ALexusB   По изучению со сквозным примером - пиши мини-игру ...   Sep 21 2010, 15:37
navy   Qt библиотека хороша конечно.... но реально там то...   Sep 21 2010, 15:42
Serginio   Назрел вопрос специалистам 1С. В пятницу пытался ...   May 19 2013, 12:31
ALexusB   Лучше серчить на спец форумах, где могут гулять ка...   May 19 2013, 21:43
Serginio   Лучше серчить на спец форумах, где могут гулять ка...   May 19 2013, 21:57
ALexusB   Та по реализации отчета могут быть проблемы - не в...   May 19 2013, 22:16
Serginio   Мужики, ещё вопрос возник по знатокам Экселя. Зна...   May 29 2013, 16:33
ALexusB   функция ВПР там натравливаешь ячейку ключ первой ...   May 29 2013, 21:59
Serginio   прям как в примере не получилось, получилось в две...   May 30 2013, 10:00


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 13th September 2025 - 01:39

Блок рекламы
Яндекс цитирования Rambler's Top100
Rambler's Top100