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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mibin
49 / 49 / 4
Регистрация: 21.10.2009
Сообщений: 272
#1

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

13.10.2011, 14:23. Просмотров 747. Ответов 4
Метки нет (Все метки)

Добрый день!
Стоит задача транслировать код из 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)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 14:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевести код программы из Delphi в C++ (C++):

Перевести код программы Паскаля в код С++ - C++
В массиве Х (15) найти произведение и количество элементов расположенных между наибольшими и наименьшими элементами кто может перевести...

Перевести код программы С на С++ - C++
Даны координаты вершин 2 треугольников определить какой из них имеет большую площадь? Код на С #include <math.h> #include...

Перевести синтаксис программы с Delphi в C++, очень нужно - C++
Даны два текстовых файла f1 и f2. Файл f1 содержит произвольный текст. Слова в тексте разделены пробелами и знаками препинания. Файл f2...

Visual c++ код перевести в gcc linux код - C++
Ниже есть код. Нужно сделать так, что бы он компилировался и работал в линуксе(компиляция с помощью gcc). #include "stdio.h" #pragma...

перевести код на С++ или написать свой код - C++
Задано предложение. Составить программу вывода на экран слов, в которых первая и последняя буквы совпадают. program Project1; ...

Перевести с Delphi на C/C++. - C++
program zadacha5; {$APPTYPE CONSOLE} uses SysUtils; var a,b,s,k,v :real ; begin

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 15:30 #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;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 15:33 #3
Как пример выкладываю MFC проект для чтения и отображения BMP файлов
0
Вложения
Тип файла: rar bmp_viewer.rar (31.8 Кб, 10 просмотров)
mibin
49 / 49 / 4
Регистрация: 21.10.2009
Сообщений: 272
14.10.2011, 09:37  [ТС] #4
Спасибо за советы! Скоро отпишусь о результате!
0
HighPredator
5534 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,455
Записей в блоге: 2
14.10.2011, 23:15 #5
-=ЮрА=-, malloc принимает количество байт для выделения памяти. Поэтому:
C++
1
RGBQUAD * Pallete = (RGBQUAD *)malloc(PaletteLength*sizeof(RGBQUAD));
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 23:15
Привет! Вот еще темы с ответами:

Перевести с DELPHI в С++ - C++
Кто-нибудь сможет помочь переписать код с delphi на с++? И вообще возможно ли это?

Перевести функцию с Delphi на C++ - C++
Ребята, может кто знает хотя бы примерно C или C++ , не понимаю код делфи, а функция на нём. type TSingleArray = Array of Single; ...

Перевести простую программку с Delphi - C++
Имеется программа на Delphi. Нужно перевести на C++ procedure TForm1.Button1Click(Sender: TObject); var s, sum, i, j, n: integer; p:...

Перевести код на С++ с C# - C++
Помогите написать курсач. Надо игру написать на с++, а написал на с#. Переведите код


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.10.2011, 23:15
Ответ Создать тему
Опции темы

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