Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Scaper
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 49
#1

Структуры в лазарус

28.06.2017, 17:58. Просмотров 970. Ответов 7
Метки нет (Все метки)

Код на С++, как можно тоже самое написать в лазарус ?
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
struct coordinate{
        float x,y,z;
        coordinate(float a,float b,float c) : x(a),y(b),z(c) {};
};
 
//for faces, it can contain triangles and quads as well, the four variable contain which is that
struct face{
        int facenum;
        bool four;
        int faces[4];
        face(int facen,int f1,int f2,int f3) : facenum(facen){  //constructor for triangle
                faces[0]=f1;
                faces[1]=f2;
                faces[2]=f3;
                four=false;
        }
        face(int facen,int f1,int f2,int f3,int f4) : facenum(facen){ //overloaded constructor for quad
                faces[0]=f1;
                faces[1]=f2;
                faces[2]=f3;
                faces[3]=f4;
                four=true;
        }
};
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2017, 17:58
Ответы с готовыми решениями:

Лазарус и БД
Здравствуйте, уважаемые форумчане, есть такая тема, Lazarus подключается к БД...

лазарус
Объясните блок схему программы Лазарус

БД в Лазарус
Доброго времени суток уважаемые форумчане. Есть задачка выполнить БД в лазарус....

Обновление Лазарус
Добрый день, подскажите плииииз. Есть ли в Лазарус механизм...

Перспективы Лазарус
Добрый день, проконсультируйте плиииз! Хочу понять перспективность...

7
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
28.06.2017, 18:39 #2
Лучший ответ Сообщение было отмечено Scaper как решение

Решение

Либо используя Advanced records:

Pascal
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
{$modeswitch ADVANCEDRECORDS}   
// ...
type
  coordinate = record
    x, y, z: double;
    constructor Create(a, b, c: double);
  end;
 
constructor coordinate.Create(a, b, c: double);
begin
  x := a;
  y := b;
  z := c;
end;
 
//for faces, it can contain triangles and quads as well, the four variable contain which is that
type
  face = record
    facenum: integer;
    four: boolean;
    faces: array[0 .. 3] of integer;
    constructor Create(facen, f1, f2, f3: integer);
    constructor Create(facen, f1, f2, f3, f4: integer);
  end;
 
constructor face.Create(facen, f1, f2, f3: integer);
begin
  facenum := facen;
  faces[0] := f1;
  faces[1] := f2;
  faces[2] := f3;
  four := False;
end;
 
constructor face.Create(facen, f1, f2, f3, f4: integer);
begin
  facenum := facen;
  faces[0] := f1;
  faces[1] := f2;
  faces[2] := f3;
  faces[3] := f4;
  four := True;
end;
 
 
var
  f1, f2: face;
// ...
  f1 := face.Create(1, 1, 2, 3);
  f2 := face.Create(2, 1, 2, 3, 4);
, либо - предпочтительно - классы (то же самое, только заменить record на class и убрать первую строку, либо (что уже не рекомендуется) старыми Object-ами.
0
GoodWeather
142 / 141 / 59
Регистрация: 28.02.2017
Сообщений: 858
28.06.2017, 18:48 #3
Либо описать все функции с первым параметром-структурой. Надо по ситуации, один к одному всё равно не выйдет.
Цитата Сообщение от volvo Посмотреть сообщение
(что уже не рекомендуется) старыми Object-ами.
А можно немного конкретнее причины? Вроде нормальные строгие штуки.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
28.06.2017, 19:17 #4
Первое - обычно "куча" больше стека, а, поскольку Object-ы создаются на стеке - то и на фиг они не нужны

Второе - привычка. Все время вижу использование классов везде.

К тому же, я использую generic-и, а вот у них с объектами большие проблемы (один раз уже нарвался на это, пришлось код переписывать). С классами проблем гораздо меньше. И зачем использовать то, что приведет к проблемам? У ТС-а С++, там шаблонные алгоритмы - далеко не редкость, захочет реализовать такие же в FPC, чтобы было удобно - поимеет при использовании object-ов проблемы. А с class-ами будет все проще гораздо.
1
GoodWeather
142 / 141 / 59
Регистрация: 28.02.2017
Сообщений: 858
28.06.2017, 19:28 #5
гм? На стеке? Всегда? Это где-то явно задокументировано? А научите как рантайм лично проверить где именно оно создалось?

И было бы любопытно подробнее узнать что за проблемы могут быть с generic-ми, на примере. Вы не делали общедоступных баг-репортов по этому поводу?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
28.06.2017, 20:20 #6
Цитата Сообщение от GoodWeather Посмотреть сообщение
Это где-то явно задокументировано?
https://www.freepascal.org/docs-html/ref/refch6.html#x67-750006
The difference between objects and classes is mainly that an object is allocated on the stack, as an ordinary record would be, and that classes are always allocated on the heap
Цитата Сообщение от GoodWeather Посмотреть сообщение
И было бы любопытно подробнее узнать что за проблемы могут быть с generic-ми, на примере
Чуть позже, надо проект найти, он у меня где-то на другой машине. Ну. или восстановить, если найти не удастся. Нет, багрепортов не делал.
1
abit
272 / 271 / 83
Регистрация: 03.02.2013
Сообщений: 772
29.06.2017, 00:31 #7
Цитата Сообщение от GoodWeather Посмотреть сообщение
А научите как рантайм лично проверить где именно оно создалось?
лично не пользуюсь object, для меня понятие объект это "экземпляр класса", но из логики происходящего стек должен вычищаться, если создан не глобально, т.е. по поведению отличить можно как-то так думаю:
Pascal
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
Type
   TMyClass = class
       i:dword;
     constructor Create(const a:byte);
   end;
 
   TMyObject = object
       i:dword;
     constructor Create(const a:byte);
   end;
 
   constructor TMyClass.Create(const a:byte);
   begin
        i:=a;
   end;
 
   constructor TMyObject.Create(const a:byte);
   begin
        i:=a;
   end;
 
procedure createobjects(const i:byte; var p1,p2:pointer);
var
   Obj1 : TMyClass;
   Obj2 : TMyObject;
begin
   Obj1:=TMyClass.Create(i);
   Obj2.Create(i);
   p1:=@Obj1.i;
   p2:=@Obj2.i;
end;
 
var
   p1,p2:pointer;
   i:byte;
 
begin
   for i:=1 to 5 do
   begin
     createobjects(i,p1,p2);
     Writeln('Class field  ',integer(p1^));
     Writeln('Object filed ',integer(p2^));
   end;
end.
это на примере простого поля, оно кстати у object не обнуляется автоматом, на случай динамических данных результат может быть фатальным, поэтому объект требует глобальности, а классу достаточно контекста
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25968 / 17412 / 6906
Регистрация: 22.10.2011
Сообщений: 30,656
Записей в блоге: 6
29.06.2017, 01:43 #8
Цитата Сообщение от GoodWeather Посмотреть сообщение
что за проблемы могут быть с generic-ми, на примере
Смотри.

Сначала используем классы:

Pascal
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
uses fgl;
 
{$R *.lfm}
 
type
 
  { TMyClass }
 
  TMyClass = class
    A, B : integer;
    s : string;
 
    constructor Create(vA, vB : integer; vS : string);
    function ToString : string; override;
  end;
 
  TMyClassList = specialize TFPGList<TMyClass>;
 
{ TMyClass }
 
constructor TMyClass.Create(vA, vB: integer; vS: string);
begin
  A := vA; B := vB; s := vS;
end;
 
function TMyClass.ToString: string;
begin
  result := Format('(%d, %d) -> %s', [A, B, s]);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  L_Class : TMyClassList;
  C : TMyClass;
begin
  L_Class := TMyClassList.Create;
  L_Class.Add(TMyClass.Create(1, 2, 'first'));
  L_Class.Add(TMyClass.Create(10, 20, 'second'));
  L_Class.Add(TMyClass.Create(50, 75, 'third'));
 
  for C in L_Class do
    Memo1.Lines.Add(C.ToString);
  L_Class.Free;
end;
Запускаем программу, жмем на кнопку, получаем в Memo
Код
(1, 2) -> first
(10, 20) -> second
(50, 75) -> third
, как и ожидалось.

Теперь пробуем заменить class на object. Пишем:
Pascal
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
type
  TMyObject = object
    A, B : Integer;
    s : string;
    constructor Create(vA, vB : integer; vS : string);
    function ToString : string;
  end;
 
  TMyObjectList = specialize TFPGList<TMyObject>;
 
{ TMyObject}
constructor TMyObject.Create(vA, vB: integer; vS: string);
begin
  A := vA; B := vB; s := vS;
end;
 
function TMyObject.ToString: string;
begin
  result := Format('(%d, %d) -> %s', [A, B, s]);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  L_Object : TMyObjectList;
  O : TMyObject;
begin
  L_Object := TMyObjectList.Create;
  O.Create(1, 2, 'first');
  L_Object.Add(O);
  O.Create(10, 20, 'second');
  L_Object.Add(O);
  O.Create(50, 75, 'third');
  L_Object.Add(O);
 
  for O in L_Object do
    Memo1.Lines.Add(O.ToString);
  L_Object.Free;
end;
и пытаемся скомпилировать. Однако: Error: Operator is not overloaded: "TMyObject" = "TMyObject"Пробуем перегрузить оператор сравнения:
Pascal
1
2
3
4
operator = (Left, Right : TMyObject) : Boolean;
begin
  result := (Left.A = Right.A) and (Left.B = Right.B);
end;
Ан нет, компилятору по барабану, все равно та же ошибка, хотя оператор перегружен по всем правилам.

Что же нужно, чтобы заставить дженерик-список работать с Object-ами? А оказывается, нужно создать новый модуль, переключить в нем режим совместимости в {$mode delphi}, потом по Дельфийским правилам перегрузить оператор сравнения через классовый метод
Pascal
1
class operator TMyObject.Equal(Left, Right : TMyObject) : boolean;
, и вот только потом можно будет откомпилировать приложение, которое будет использовать тип, описанный как:
Pascal
1
2
type
  TMyObjectList = specialize TFPGList<TMyObject>;
, а потом еще надо будет извратиться, как создать эти Object-ы перед заталкиванием в список. Так же, как классы, создать не получится. они ж не в куче, а на стеке, блин, создаются...

А теперь внимание, вопрос: на кой это все мне сдалось, если с классами оно и так прекрасно отработало?
0
29.06.2017, 01:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2017, 01:43

Скины в лазарус
Лазарус не поддерживает скины как делфи7 ? Если поддерживает то как установить...

Звук в Лазарус
В Delphi в библиотеке System есть компонент MediaPlayer. В Лазарус я этот...

OpenGl и лазарус
Что добавлять в uses?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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