Форум программистов, компьютерный форум CyberForum.ru

Перевести код программы из Delphi в C++ - C++

Войти
Регистрация
Восстановить пароль
 
mibin
49 / 49 / 4
Регистрация: 21.10.2009
Сообщений: 272
13.10.2011, 14:23     Перевести код программы из Delphi в C++ #1
Добрый день!
Стоит задача транслировать код из Delphi в C++. Среда Embarcodero.
Вроде бы ничего сложного, точки на стрелки меняй себе и меняй. НО!
Появляются участки когда которые ставят в тупик в силу слабого знания С++ наверное. Помоги верно интерпретировать эти части когда из одного языка в другой.

Есть несколько вопросов: начнем с массивов:
Delphi
1
2
3
Palette: array of RGBQUAD;
...
SetLength(Palette, PaletteLength);
Это как видно простой способ указания размера динамического массива в Delphi как без лишнего гемороя мне сделать это в С++. Я конечно обошел ситуацию с помощью позднего объявления переменной, но все-таки это не верно нужная максимально точная копия текста.

Delphi
1
2
GetMem(pData, BitmapLength);
ReadFile(BitmapFile, pData^, BitmapLength, ReadBytes, nil);
Здесь я использовал функцию malloc
C++
1
2
pData = malloc(BitmapLength);
ResStream->ReadBuffer(&pData, BitmapLength);
Верно ли я поступил, равнозначные ли это замены?

И пока последний вопрос который меня тут мучает
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
Line : ^LongWord;
....
  For H:=0 to Height-1 do
  Begin
    Line :=BMP.scanline[Height-H-1];   // flip JPEG
    For W:=0 to Width-1 do
    Begin
      c:=Line^ and $FFFFFF; // Need to do a color swap
      Data[W+(H*Width)] :=(((c and $FF) shl 16)+(c shr 16)+(c and $FF00)) or $FF000000;  // 4 channel.
      inc(Line);
    End;
  End;
Здесь как поступить? просто создать переменную типа LongWord * line? Или как-то иначе?

Ну и за одно, верно ли я интерпретировал функции
Delphi
1
function LoadBMPTexture(Filename: String; var Texture : GLuint; LoadFromResource : Boolean) : Boolean;
и
C++
1
bool LoadBMPTexture(wchar_t Filename[], GLuint Texture, bool LoadFromResource)
----------------------------------------------------------------------------------------------------
Delphi
1
function LoadJPGTexture(Filename: String; var Texture: GLuint; LoadFromResource : Boolean): Boolean;
и
C++
1
bool LoadBMPTexture(wchar_t Filename[], GLuint Texture, bool LoadFromResource)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 14:23     Перевести код программы из Delphi в C++
Посмотрите здесь:

Перевести код из С++ в Си C++
C++ Перевести код с С
Перевести с Delphi на C/C++. C++
Перевести простую программку с Delphi C++
Перевести с DELPHI в С++ C++
C++ Перевести код с C
C++ Перевести код на С++
Перевести синтаксис программы с Delphi в C++, очень нужно C++
Перевести код программы С на С++ C++
C++ Перевести код с C# на C++
Перевести функцию с Delphi на C++ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 15:30     Перевести код программы из Delphi в C++ #2
Цитата Сообщение от mibin Посмотреть сообщение
Palette: array of RGBQUAD;
...
SetLength(Palette, PaletteLength);
C++
1
RGBQUAD * Pallete = (RGBQUAD *)malloc(PaletteLength);
Добавлено через 2 минуты
Цитата Сообщение от mibin Посмотреть сообщение
GetMem(pData, BitmapLength);
ReadFile(BitmapFile, pData^, BitmapLength, ReadBytes, nil);
C++
1
BITMAPINFOHEADER * pData = (BITMAPINFOHEADER *)malloc(BitmapLength);
В типе BITMAPINFOHEADER сомневаюсь возможно и BITMAPINFO

Добавлено через 3 минуты
Цитата Сообщение от mibin Посмотреть сообщение
Line : ^LongWord;
....
* For H:=0 to Height-1 do
* Begin
* * Line :=BMP.scanline[Height-H-1]; * // flip JPEG
* * For W:=0 to Width-1 do
* * Begin
* * * c:=Line^ and $FFFFFF; // Need to do a color swap
* * * Data[W+(H*Width)] :=(((c and $FF) shl 16)+(c shr 16)+(c and $FF00)) or $FF000000; *// 4 channel.
* * * inc(Line);
* * End;
* End;
- думается читаем BmpDib

Добавлено через 2 минуты
Вобщем думаю нужно считать BMP ниже приведу свой класс для чтения битмапов с разными BITMAPINFOHEADER::biBitCount
c_bmp.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef C_BMP_H
#define C_BMP_H
 
class c_bmp
{
public:
    FILE *f;
    char *chBuf;
    char *chClrTbl;
    DWORD dwLength;
    LPCTSTR fPath;
    BITMAPFILEHEADER pBMPfh;
    BITMAPINFOHEADER pBMPih;
 
    bool LOAD_OK;
    bool SAVE_OK;
    c_bmp();
    ~c_bmp();
    DWORD LoadBMP(LPCTSTR sPath);
    DWORD SaveBMP(LPCTSTR sPath);
};
typedef c_bmp *LPCBMP;
 
#endif


c_bmp.cpp
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include "stdafx.h"
#include "c_bmp.h"
 
c_bmp::c_bmp()
{
    fPath    =  "";
    dwLength = -1;
    chBuf    =  NULL;
    LOAD_OK  = false;
    SAVE_OK  = false;
}
 
c_bmp::~c_bmp()
{
    if(0 < dwLength)
        delete chBuf;
}
 
DWORD c_bmp::LoadBMP(LPCTSTR sPath)
{
    LOAD_OK = false;
    if((f = fopen(sPath,"rb+")) != 0)
    {
        fPath = sPath;
        fseek(f,0,SEEK_END);
        dwLength = ftell(f);
        fseek(f,0,SEEK_SET);
        if(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) < dwLength)
        {
            fread(&pBMPfh,1,sizeof(BITMAPFILEHEADER),f);
            fread(&pBMPih,1,sizeof(BITMAPINFOHEADER),f);
            if(pBMPfh.bfType == 0x4D42
                &&
                pBMPfh.bfSize == dwLength
                &&
                pBMPih.biPlanes == 1)
            {
                int nClrs = 8,nEmpty = 0;
                switch(pBMPih.biBitCount)
                {
                case 24:
                    nEmpty = 4 - (pBMPih.biWidth*3)%4;
                    break;
                case 8:
                    nEmpty = 4 - (pBMPih.biWidth)%4;
                    nClrs = 1024;
                    break;
                case 4:
                    nEmpty = 4 - ((pBMPih.biWidth+1)/2)%4;
                    nClrs = 64;
                    break;
                }
                if(nEmpty == 4)
                    nEmpty = 0;
                chClrTbl = new char[nClrs];
                if(pBMPih.biBitCount <= 8)
                    fread(chClrTbl,1,nClrs,f);
 
                char ch;
                chBuf = new char[3*pBMPih.biWidth*pBMPih.biHeight];
                for(int i = 0,j = 0,k = 0; i< pBMPih.biHeight; i++)
                {
                    for(j = 0; j < pBMPih.biWidth; j++)
                    {
                        switch(pBMPih.biBitCount)
                        {
                        case 24:
                            fread(&chBuf[k],1,1,f);k++;
                            fread(&chBuf[k],1,1,f);k++;
                            fread(&chBuf[k],1,1,f);k++;
                            break;
                        case 8:
                            nClrs = 0;
                            fread(&nClrs,1,1,f);
                            nClrs*=4;
                            chBuf[k]  = chClrTbl[nClrs];
                            chBuf[k+1]= chClrTbl[nClrs+1];
                            chBuf[k+2]= chClrTbl[nClrs+2];
                            k+=3;
                        break;
                        case 4:
                            fread(&nClrs,1,1,f);
                            ch = (char)(nClrs & 0x0F);
                            nClrs = nClrs & 0xF0;
                            nClrs>>=4;
                            nClrs*=4;
                            chBuf[k]  = chClrTbl[nClrs];
                            chBuf[k+1]= chClrTbl[nClrs+1];
                            chBuf[k+2]= chClrTbl[nClrs+2];
                            k+=3;
                            if(j+1 < pBMPih.biWidth)
                            {
                                nClrs = 4*(int)ch;
                                chBuf[k]  = chClrTbl[nClrs];
                                chBuf[k+1]= chClrTbl[nClrs+1];
                                chBuf[k+2]= chClrTbl[nClrs+2];
                                k+=3;
                                j++;
                            }
                            break;
                        }
                    }
                    fseek(f,ftell(f) + nEmpty,SEEK_SET);
                }
                LOAD_OK = true;
                fPath = sPath;
            }
            else
                dwLength = -1;
        }
        else
            dwLength = -1;
        fclose(f);
    }
    return dwLength;
}
 
DWORD c_bmp::SaveBMP(LPCTSTR sPath)
{
 
    BITMAPFILEHEADER *lpBMPfh = new BITMAPFILEHEADER[1];
    pBMPfh = lpBMPfh[0];
 
    pBMPfh.bfType       = 0x4D42;
    pBMPfh.bfReserved1  = 0;
    pBMPfh.bfReserved2  = 0;
    pBMPfh.bfOffBits    = 54;
 
    LONG biWidth  = pBMPih.biWidth;
    LONG biHeight = pBMPih.biHeight;
 
    BITMAPINFOHEADER *lpBMPih = new BITMAPINFOHEADER[1];
    pBMPih = lpBMPih[0];
    pBMPih.biSize       = 40;
    pBMPih.biPlanes     = 1;
    pBMPih.biBitCount   = 24;
    pBMPih.biWidth      = biWidth;
    pBMPih.biHeight     = biHeight;
    pBMPih.biCompression= 0;
    pBMPih.biXPelsPerMeter  = 0;
    pBMPih.biYPelsPerMeter  = 0;
    pBMPih.biClrUsed    = 0;
    pBMPih.biClrImportant= 0;
 
    int nEmpty = 4 - (pBMPih.biWidth*3)%4;
    if(nEmpty == 4)
        nEmpty = 0;
    if(pBMPih.biWidth == 0||pBMPih.biHeight == 0)
        pBMPfh.bfSize = -1;
    else
    {
        if((f = fopen(sPath,"wb+")) != 0)
        {
            pBMPih.biSizeImage = /*sizeof(chBuf)*/ 3*pBMPih.biWidth*pBMPih.biHeight + 
                pBMPih.biHeight*nEmpty;
            pBMPfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 
                pBMPih.biSizeImage;
            char *ch = new char[nEmpty];
            fwrite(&pBMPfh,1,sizeof(BITMAPFILEHEADER),f);
            fwrite(&pBMPih,1,sizeof(BITMAPINFOHEADER),f);
            for(int i = 0,j = 0,k = 0; i< pBMPih.biHeight; i++)
            {
                for(j = 0; j < pBMPih.biWidth; j++)
                {
                    fwrite(&chBuf[k],1,1,f);k++;
                    fwrite(&chBuf[k],1,1,f);k++;
                    fwrite(&chBuf[k],1,1,f);k++;
                }
                fwrite(ch,1,nEmpty,f);
            }
            SAVE_OK = true;
            fclose(f);
        }
    }
    return pBMPfh.bfSize;
}
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 15:33     Перевести код программы из Delphi в C++ #3
Как пример выкладываю MFC проект для чтения и отображения BMP файлов
Вложения
Тип файла: rar bmp_viewer.rar (31.8 Кб, 10 просмотров)
mibin
49 / 49 / 4
Регистрация: 21.10.2009
Сообщений: 272
14.10.2011, 09:37  [ТС]     Перевести код программы из Delphi в C++ #4
Спасибо за советы! Скоро отпишусь о результате!
HighPredator
 Аватар для HighPredator
5385 / 1768 / 323
Регистрация: 10.12.2010
Сообщений: 5,234
Записей в блоге: 3
14.10.2011, 23:15     Перевести код программы из Delphi в C++ #5
-=ЮрА=-, malloc принимает количество байт для выделения памяти. Поэтому:
C++
1
RGBQUAD * Pallete = (RGBQUAD *)malloc(PaletteLength*sizeof(RGBQUAD));
Yandex
Объявления
14.10.2011, 23:15     Перевести код программы из Delphi в C++
Ответ Создать тему
Опции темы

Текущее время: 13:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru