Трансляція коду Delphi в код C + + Builder, Різне, Програмування, статті

Мета цієї статті полягає в тому, щоб допомогти вам зрозуміти основні відмінності і подібності між C + + і Object Pascal (мова, що використовується в Delphi від Borland), і допомогти вам в перетворенні проекту написаного на Delphi в проект написаний на C + + (С + + Builder від Borland). В жалбнейшем в цій статті замість термінів Object Pascal і Delphi буде вживатися абревіатура “OP”.


Типи даних




















































































































Op

Розмір або значення

С + +

Shortlnt ціле 8 біт signed char
Smalllnt ціле 16 біт short
Longlnt ціле 32 біта int
Byte ціле без знака 8 біт unsigned char
Word ціле без знака 16 біт unsigned short
Integer ціле 32 біта int
Cardinal ціле без знака 32 біта unsigned int
Boolean true, false або bool
ByteBool true, false або ціле без знака 8 біт unsigned char
WordBool true, false або ціле без знака 16 біт unsigned short
LongBool true, false або ціле без знака 32 біта BOOL (WinAPI)
AnsiChar символ без знаку 8 біт char
WideChar символ UNICODE розміром в слово wchar_t
Char символ без знаку 8 біт char
AnsiString AnsiString Delphi AnsiString
String[n] колишній стиль рядків Delphi, n = 1 .. 255 біт SmallString<n>
ShortString колишній стиль рядків Delphi, 255 біт SmallString<255>
String AnsiString Delphi AnsiString
Single число з плаваючою комою 32 біта float
Double число з плаваючою комою 64 біта double
Extended число з плаваючою комою 80 біт long double
Real число з плаваючою комою 32 біта double
Pointer родової покажчик 32 біта void *
PChar покажчик на символи 32 біта unsigned char *
PAnsiChar покажчик на символи ANSI 32 біта unsigned char *
Comp число з плаваючою комою 64 біта Comp
OleVariant значення variant OLE OleVariant


Ключові слова


Слід зазначити, що мова С + + є регістро залежним, на відміну від OP, який таким не є.












C++
#define #elif #else #endif #error #if #ifdef #ifndef #include #line #pragma #printf #undef auto break case catch char class const const_cast continue default delete do double dynamic_cast else enum except extern false finally float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid union unsigned using virtual void volatile while xalloc new delete
OP
ABSOLUTE AND ARRAY ASM ASSEMBLER BOOLEAN BYTE CASE CHAR COMP CONST CONSTRUCTOR DESTRUCTOR DIV DO DOUBLE DOWNTO ELSE EXTENDED EXTERNAL FALSE FAR FILE FOR FORWARD FUNCTION GOTO IF IMPLEMENTATION IN INLINE INTEGER INTERFACE INTERRUPT LABEL LONGINT MOD NEAR NIL NOT OBJECT OF OPERATOR OR PACKED PRIVATE PROCEDURE PROGRAM REAL RECORD REPEAT SET SHL SHORTINT SHR SINGLE STRING TEXT THEN TO TRUE TYPE UNIT UNTIL USES VAR VIRTUAL WHILE WITH WORD XOR

Операторні ознаки кінця


C++
Багато вираження закінчуються крапкою з комою;
Хоча є парочка винятків. Наприклад при підключенні заголовків файлів крапка з комою не потрібно
# Include “foo.h” / / не закінчується крапкою з комою;
# Define MAXNAMELENGTH 35 / / також не закінчується крапкою з комою;
OP
Всі висловлювання закінчуються крапкою з комою;

Оголошення змінних
C++
Максимальна довжина змінної 32 символу – може бути і більше але будуть розпізнані лише перші 32 символу.
Змінні можуть бути оголошені в будь-якому місці коду, ну і відповідно змінні повинні бути обявлени до того місця де вони будуть використовуватися.
/ / … какойто код …
char sName[10];
int iCount, iLoop, iValToReach;
double dMaxLoan, dTotal;
float fMaxRate = 123.875;

OP
Максимальна довжина змінної 63 символу-може бути і більше але будуть розпізнані тільки перші 63 символи.
Змінні повинні оголошуватися в блоці “var“Спочатку процедури або функції або у визначенні об’єкта до оголошення функцій і процедур.Значенія змінних не можуть бути призначені всередині блоку var .

/ / … какойто код …
function PayBack_d(var dAmount: double): double ;
var
iCount, iLoop, iValToReach: integer ;
dMaxLoan, dTotal, dMaxRate: double ;
begin
dMaxRate := 123.875;

Рядки


C++
В C + + відсутня спеціальний тип рядків. Рядки розглядаються як масиви символів, що закінчуються нульовим символом (” доступна через покажчик на перший символ в рядку. Значенням рядки є адреса її першого символу. Таким чином можна сказати, що в C + + рядок є покажчиком – покажчиком на перший символ рядка. У цьому сенсі рядка подібні до масивів, бо масив теж є покажчиком на свій перший елемент.Строка може бути оголошена або як масив символів, або як змінна типу char *. Кожне з наведених нижче оголошень вірні:
char sName [26]; / / 25 символів плюс NULL
char psDemo[] = “Hello, there!”;
char * psDemo = new char[26];


Для обробки рядків є ряд бібліотечних функцій. Основні з них strcat – конкатенація (склеювання) двох рядків, strcmp – порівняння двох рядків, strcpy – копіювання одного рядка в іншу, strstr – пошук в рядку заданої підрядка, strlen – визначення довжини рядка, strupr – перетворення символів рядка до верхнього регістру, sprintf – побудова рядки по заданій рядку форматування і списку аргументів та ряд інших функцій.


OP


Delphi підтримує рядки практично необмеженої довжини (до 2 Гб), на додаток до 255-символьним рядках, відомим як pascal-рядка. Нова директива компілятора $ Н дозволяє контролювати зміст використання зарезервованого слова string. Стан цієї директиви за замовчуванням ($ Н +) передбачає використання в якості типу string довгих рядків. $ Н-увазі використання коротких 255-символьних pascal-рядків. Всі компоненти Delphi використовують довгі строкі.Следует зазначити, що, незалежно від стану директиви $ Н, якщо спеціфірована максимальна довжина рядка, менша 255, то мається на увазі коротка рядок (ShortString). Призначення довжини рядка з використанням квадратних дужок завжди має на увазі підтип ShortString. Довгі рядки, введені в Delphi 2.0, в більшості випадків сумісні з рядками старого типу. При цьому необхідно брати до уваги такі особливості їх використання:



Оскільки реально довгі рядки не дублюються, а для них підтримуються лічильники використань, то присвоювання довгих рядків відбувається набагато швидше в порівнянні з короткими строкамі.Несмотря на те, що більша частина коду, що використовується при роботі з рядками інтероперабельні для коротких і довгих рядків (тобто застосувати до обох видів рядків), тим не менш, деякі операції над короткими рядками не застосовні до довгих рядках. Довгі рядки не можуть передаватися в параметри типу OpenString або як var-параметри, відповідні коротким рядках.


Масиви


Масиви – впорядковані послідовності одного типу даних (можуть включати також і об’єкти). Методи для оголошення масиву в C + + і OP – різні.


С + +
Масиви “засновані на нулі” – перший елемент – елемент [0], другий елемент елемент [1], третій – [2], і т.д. Це завжди заплутує новачків.
Оголошення масиву:
double Array[31];
Використання:
for(int i = 30, j = 29; i > 0; i–,j–)
      Array[i] = Array[j];


OP
Початок масиву в елементі 1 … але не всегда.В Delphi зустрічаються компоненти та об’єкти “підстава на нулі” на зразок С + +. Наприклад TList елементи якого починаються з нуля. Будь масив який ви оголосите буде заснований на одиниці


var  ArrayS: array[1..31] of double;
i,j: integer;
 
begin
    j := 30;
       for i := 31 downto 2 do
          begin
              ArrayS[i] = ArrayS[j];
Dec (j); {або j: = j-1;}
         end; 
……


Обидві мови підтримують багатовимірні масиви


С + +


double dMatrix[50] [20];


OP


dMatrix: array[1..50, 1..20] of double;


Прирівнювання і порівняння змінних


C++


Порівняння проізводіттся оператором “подвійне одно” (==), прирівнювання одним одно (=)


int i,j;
if (i == j) / / порівняння
…..
i = j ;/ / прирівнювання
….


OP


Порівняння проізводіттся оператором “дорівнює” (=), прирівнювання двокрапка + одне одно (: =)



if dMaxRate = 15.75 then
     begin …
            dMaxRate := 12.5;  
               … 
     end;
виключенням з правил в OP є прирівнювання змінної до константи. В цьому випадку застосовується одиночне одно (=)


Оголошення констант


Константи – значення, які не змінюються. Ідентифікатор може бути оголошений як константа, і в C + + і OP. І C + + і OP константам повинні бути призначені значення при їх оголошенні.


С + +


При оголошенні константи перед типом даних використовується ключове слово const
const int
iMax = 2000;
const double dMaxValue = 1234.75;


В С + + константи також можна визначати через директиву препроцесора # define
#define MAXA 1000


але на практиці це застаріло. Так як компілятор не може виконати контролю відповідності типів (він не може визначити що це ini або double)


OP


Константи, подібно змінним, повинні бути оголошені в блоці коду “const” на початку визначення процедури або функції, ухвали або в декларації об’єкта.


function PayBack_d(var dAmount: double): double;
    const iMAX = 2000;  dMAXVALUE = 1234.75;
    var iCount, iLoop, iValToReach: integer;
           dMaxLoan, dTotal, dMaxRate: double;
   begin
            dMaxRate := dMAXVALUE;
{…}


Функції та процедури


Блоки Коду, які виконують певне завдання в C + +, називаються “функціями” незалежно від того, чи дійсно вони повертають значення. В OP, функції повинні повертати значення, процедури не повертають значення. В C + +, всі функції повинні мати прототип, оголошений перед застосуванням (так що транслятор може порівнювати обидві функції, щоб гарантувати відповідність). В OP, однак, функція або визначення процедури можуть опустити (але це не бажано) параметри і опускати тип возвращенія.Декларація функції в C + + і визначень вимагає фігурних дужок () незалежно від того, чи дійсно передаються будь параметри. OP функції та процедури не потребують фігурних дужках () при їх оголошенні або визначенні, якщо не передається ніяких параметрів, для виклику функції або процедури.


С + +
Декларації
void Foo(double X);
int Foo2();


Реалізація
void Foo(double X)
{
   int Y=X;
}
int Foo2()
{
    return 0;
}


OP


Кожна функція і процедура повинні бути ідентифіковані включенням ключового слова “function” або “procedure” на початку кожного визначення.
function IntSinceLastAddDate_d(var dAvailCash: double): double;
procedure SetNewIntRate; {немає параметрів і значення, що повертається}

function LoanC.IntSinceLastAddDate_d(var dAvailCash: double): double;
    var dSomething: double;
begin

result: = dSomething; {глобальна змінна “result” назанчается повертається значенням!}
end;

procedure LoanC.SetNewIntRate;
begin

end;


І C + + і OP можуть передавати параметри за значенням або за посиланням або передавати константи …

C + + за значенням … double IntSinceLastAddDate_d (double dAvailCash);
OP за значенням … function IntSinceLastAddDate_d (dAvailCash: double): double;

C + + за посиланням … double IntSinceLastAddDate_d (double & dAvailCash);
OP за посиланням … function IntSinceLastAddDate_d (var dAvailCash: double): double;

C + + константи … double IntSinceLastAddDate_d (const double dAvailCash);
OP константи … function IntSinceLastAddDate_d (const dAvailCash: double): double;


Конструкція with … do


Взагалі, C + + більш компактний ніж OP. Але, C + + не має інструкцію with … do з … Це невдало, тому що це дійсно – велика особливість OP. C + + код буде більш докладним в порівнянні з OP.


В C + +, коли Ви повинні звернутися до членів даних, ви закінчуєте оператор подібно цьому …
poC.oStock.aoTradesLast130Days[0].lVol = 0;
poC.oStock.aoTradesLast130Days[0].dHigh = 0;
poC.oStock.aoTradesLast130Days[0].dLow = 0;
poC.oStock.aoTradesLast130Days[0].dClose = 0;


Але в OP, Ви можете робити це набагато менш читабельним, роблячи так …
with poC.oStock.aoTradesLast130Days[0] do begin
        lVol := 0;
       dHigh := 0;
       dLow := 0;
       dClose := 0;
end;
В принципі в даний момент це виглядає досить коротко і ясно по стравненію з С + +. Але у випадку численних вкладених операторів деколи виникає плутанина що з чим взаємодіє. Хоча … як кажуть програмісти, які пишуть на OP, їм набагато легше орієнтуватися саме в такому типі запису (OP) ніж в типі С + +.


Коментарі
C + + підтримує 2 види коментарів:
Однорядковий коментар
/ / Це коментар
І багаторядковий коментар
/*
А я багаторядковий коментар, хоча й перебуваю всього на одному рядку. Зате зайняв місця на 3 рядки.
*/


OP на відміну від С + + підтримує 3 види коментарів. Це пов’язано з тим, що Borland при написанні Delphi вніс у мову Pascal дуже багато елементів з C + +. В часности додався однорядковий коментар як в С + +
Однорядковий коментар
/ / Це коментар
І багаторядковий коментар
(*
А я багаторядковий коментар, хоча й перебуваю всього на одному рядку. Зате зайняв місця на 3 рядки.
*)
{
І я багаторядковий коментар, але працюю тільки в OP
}


Керуючі конструкції (if, else, switch …)


Існує п’ять структур управління на обох мовах, і вони дуже подібні. Цей огляд займе багато місця.


1. Конструкція if … else

	C++

if(<Логічний вираз>) / / в дужках єдине вираження
{

}
else if(<Логічний вираз>)
{

}
else
{

}

OP

if <Логічний вираз> then
begin {Єдине вираження не повинно знаходитися в дужках}

end
else if <Логічний вираз> then
begin
….
end
else
begin


end; {Тільки самий останній “end” у виразі терминируются крапкою з комою}


2. Конструкція switch / case


	C++

switch(<Целочисленная константа>)
{
case iX: … break;
case iY: … break;
default: …
}

OP

case <Целочисленная вираз змінна або константа> of {Тут “begin” не потрібен}
iX:
begin

end; {Крапка з комою після кожного “end”;}
iY:
begin

end;
else {Двокрапка не потрібно}
begin

end;
end;{Ось тут “end;”}


3. Цикл for  


	C++

for(iCount = 0; iCount <= 10; iCount++)
{ / / Інкреметн потрібен для циклу, iCount + +, може бути збільшений / / На будь значніє не тільки на 1

break; / / Для виходу з циклу
continue; / / Для продовження циклу

}

OP

for iCount := 1 to 10 do
begin … {Цикл for може збільшувати лічильник тільки на 1}
break; {Для виходу з циклу}
continue; {Для продовження циклу}

end ; Є одна різниця між виконанням “break” і “continue” в мовах. В C + +, break, і continue – ключові слова – частина мови; В OP це бібліотечні процедури.Хотя використовуються також.


4. Цикл while


	C++

while(<Логічний вираз>)
{ / / Вираз перевіряється на самому початку циклу, так що код може ніколи не використовуватися / / Якщо вираз поверне false

break; / / Для виходу з циклу
continue; / / Для продовження циклу

}

OP

while <Логічний вираз> do
begin {Вираз перевіряється на самому початку циклу, так що код може ніколи не використовуватися якщо вираз поверне false}

break; {Для виходу з циклу}
continue; {Для продовження циклу}

end;


5. Цикл do … while


5) The do/repeat … loop construct:
C++

do
{ / / Виконується якийсь код, потім перевіряється вираз. В цьому випадку код виконається хоча б один раз

break; / / Для виходу з циклу
continue; / / Для продовження циклу

}while(<Логічний вираз>);

OP

repeat {Eвиполняется якийсь код, потім перевіряється вираз. В цьому випадку код виконається хоча б один раз зауважте що в циклі немає ключових слів begin … end}

break; {Для виходу з циклу}
continue; {Для продовження циклу}

until <Логічний вираз>;

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*