Сейчас на форуме: Kybyx, Rio (+3 невидимых)

 eXeL@B —› Оффтоп —› сложная конструкция из С в PAS
Посл.ответ Сообщение


Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 15 апреля 2009 00:21
· Личное сообщение · #1

Перевожу одну программку с С на паскаль(в делфи пишу).
Есть там такой класс

Code:
  1. class Ellipsoid
  2. {
  3. public:
  4.          Ellipsoid(){};
  5.          Ellipsoid(int Id, char* name, double radius, double ecc)
  6.          {
  7.                  id = Id; ellipsoidName = name;
  8.                  EquatorialRadius = radius; eccentricitySquared = ecc;
  9.          }
  10.          int id;
  11.          char* ellipsoidName;
  12.          double EquatorialRadius;
  13.          double eccentricitySquared;
  14. };


Вроде перевел его так

Code:
  1. type
  2. TEllipsoid = class
  3.  id:integer;
  4.  ellipsoidName:ppchar;
  5.  EquatorialRadius:double;
  6.  eccentricitySquared:double;
  7.  constructor Ellipsoid();overload;
  8.  constructor Ellipsoid(Id:integer; name:ppchar; radius:double ; ecc:double);overload;
  9. end;
  10. constructor TEllipsoid.Ellipsoid();
  11. begin
  12.  inherited Create();
  13. end;
  14. constructor TEllipsoid.Ellipsoid(Id:integer; name:ppchar; radius:double ; ecc:double);
  15. begin
  16.  inherited Create();
  17.  id:=Ellipsoid.id;
  18.  name:=Ellipsoid.ellipsoidName;
  19.  radius:=Ellipsoid.EquatorialRadius;
  20.  ecc:=Ellipsoid.eccentricitySquared;
  21. end;


Но далее мдет статический массив объектов этого класса:

Code:
  1. static Ellipsoid ellipsoid[] = 
  2. {
  3. Ellipsoid( -1, "Placeholder", 0, 0),
  4. Ellipsoid( 1, "Airy", 6377563, 0.00667054),
  5. .....
  6. Ellipsoid( 23, "WGS-84", 6378137, 0.00669438)
  7. }


Пробую так:

Code:
  1. const Static_Ellipsoid:array[1..1] of TEllipsoid=
  2.   TEllipsoid.Ellipsoid( -1, 'Placeholder', 0, 0),


Но ошибка появляется :
This is no overloaded version of Ellipsoid that can be called with this atgument.

Пробовал еще переводить тот класс на паскаль без конструктора, но все равно в этом же месте была ошибка. Но другая:
This form of method call only allowed for class methods.

Я пока что не придумал, как это грамотно обойти.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 15 апреля 2009 01:10
· Личное сообщение · #2

во-первых, это твои типы PPChar, это не правильно
Code:
  1. char* - C++
  2. PChar - Delphi


сдедующее, твое:
Code:
  1. id:=Ellipsoid.id;
  2. name:=Ellipsoid.ellipsoidName;
  3. radius:=Ellipsoid.EquatorialRadius;
  4. ecc:=Ellipsoid.eccentricitySquared;

а нужно было так:
Code:
  1. Ellipsoid.id:=id;
  2. Ellipsoid.ellipsoidName:=name;
  3. Ellipsoid.EquatorialRadius:=radius;
  4. Ellipsoid.eccentricitySquared:=ecc;

и всеравно мне кажетсо это все сомнительно, потому как не все можно перевести, си++ беспорно мощнее делфей, потому у него есть свои приколы, не переводимые на другие языки, потому нужно искать другой выход вместо того чтоб слово в слово переводить
Я так понял тебе клас нужен только для хранения тех 4-ех переменых, потому могу предложить свой вариант:
Code:
  1. type
  2.   TEllipsoid = packed record
  3.     id:integer;
  4.     ellipsoidName:pchar;
  5.     EquatorialRadius:double;
  6.     eccentricitySquared:double;
  7.   end;
  8. ...
  9. var
  10.   Static_Ellipsoid: array[1..1] of TEllipsoid;
  11. ...
  12. procedure Init(id: integer; name: pchar; radius: double; ecc: double);
  13. var
  14.   Ellipsoid: TEllipsoid;
  15. begin
  16.   Ellipsoid.id := id;
  17.   Ellipsoid.ellipsoidName := name;
  18.   Ellipsoid.EquatorialRadius := radius;
  19.   Ellipsoid.eccentricitySquared := ecc;
  20.   Static_Ellipsoid[1] := Ellipsoid;
  21. end;


-----
Лучше быть одиноким, но свободным © $me





Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 15 апреля 2009 09:18
· Личное сообщение · #3

BoRoV пишет:
Я так понял тебе клас нужен только для хранения тех 4-ех переменых, потому могу предложить свой вариант:

Не только. Там еще процедура есть. Ее бы тоже передать как-то через массив объектов.

Code:
  1. static Ellipsoid ellipsoid[] =  
  2. Ellipsoid( -1, "Placeholder", 0, 0), 
  3. Ellipsoid( 1, "Airy", 6377563, 0.00667054), 
  4. ..... 
  5. Ellipsoid( 23, "WGS-84", 6378137, 0.00669438) 


Собственно, это и есть основная проблема



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 16 апреля 2009 17:09
· Личное сообщение · #4

Важное замечание чтобы в будущем проблем не было - как у не грамотных проектов под 2009 делфю.

Code:
  1. char*; //c++
  2. PAnsiChar; //delphi
  3. ---
  4. wchar_t*; // c++
  5. PWideChar; //delphi


-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 16 апреля 2009 20:33
· Личное сообщение · #5

BoRoV пишет:
потому у него есть свои приколы, не переводимые на другие языки,

перевести можно всё... только не дословно, а если смысл понял, переписать не сложно
а нужно ли в дельфи default-конструктор вообще? наверное его просто опустить можно, т.к. и там и там у тебя inherited Create(); стоит

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 16 апреля 2009 22:28 · Поправил: Mavlyudov
· Личное сообщение · #6

Isaev
Я не про это спрашиваю.

Code:
  1. type
  2. TEllipsoid = class
  3.  id:integer;
  4.  ellipsoidName:pchar;
  5.  EquatorialRadius:double;
  6.  eccentricitySquared:double;
  7.  constructor Create;
  8.  procedure Ellipsoid();overload;
  9.  procedure Ellipsoid(Id:integer; name:pchar; radius:double ; ecc:double);overload;
  10. end;
  11. const Static_Ellipsoid:array[1..1] of TEllipsoid=
  12.   TEllipsoid( -1, pchar('Placeholder'), 0, 0);


У меня вопрос в том, как объявить массив типа класса, в котором содержатся процедуры этого класса.
Код, приведенный выше не компилируется.

Получилось через переменную, но это не то, что нужно:
Code:
  1. type
  2. TEllipsoid = class
  3. .........................
  4. constructor Create(Id:integer; name:pchar; radius:double; ecc:double);
  5. end;
  6. var Static_Ellipsoid:array[1..1] of TEllipsoid;
  7. ............
  8. begin
  9.   Static_Ellipsoid[1] := TEllipsoid.Create(1,'name',1,0);
  10. ....





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 17 апреля 2009 02:39
· Личное сообщение · #7

Mavlyudov пишет:
Я не про это спрашиваю.

а я и не отвечал... я тоже спросил
Mavlyudov пишет:
Получилось через переменную, но это не то, что нужно:

А по другому вроде нельзя в Delphi присвоить... только так... по одному элементу

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 17 апреля 2009 10:18
· Личное сообщение · #8

Isaev
Можно же написать так:

const
a:array[1..2] of integer=(1,2);



Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 22 апреля 2009 12:11
· Личное сообщение · #9

Mavlyudov
оффтоп:
Можно ли полностью увидеть сорс? Мне тоже эллипсойды нужны.
В гугле сей код видел, но в довольно неожиданных местах.




Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 23 апреля 2009 19:57
· Личное сообщение · #10

bad_boy
кто тебе сказал, что это эллипсоиды? Это программа пересчета
географических координат из формата UTM в Lat/Long и наоборот.


 eXeL@B —› Оффтоп —› сложная конструкция из С в PAS

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

   Для печати Для печати