Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
1

Операция наследования с записями

05.02.2014, 16:15. Показов 1539. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите пожалуйста можно ли так?
допустим
Pascal
1
2
3
4
5
6
7
8
9
10
recBoxBeginEndX= record
    labelX:boolean;
    minX,maxX: extended; // кординаты контейнера по оси X, упорядочены по возрастанию значения начала контейнера
    IDsurface: Word;//начало треугольника в контейнере и позиция в RpovrhnostiPoZed
  end;
 
  recPartBoxBeginEndX =record
    minX,maxX: extended; // кординаты контейнера по оси X, упорядочены по возрастанию значения начала контейнера
    IDsurface: LongWord;
  end;
ив от мне нужно взять значения соответственных полей из recBoxBeginEndX в recPartBoxBeginEndX
можно ли так:
Pascal
1
2
3
4
5
6
7
var
BoxBeginEndX : recBoxBeginEndX; 
PartBoxBeginEndX : recPartBoxBeginEndX; 
....
begin
PartBoxBeginEndX := BoxBeginEndX;
...
ну или почти как-то так. можно?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2014, 16:15
Ответы с готовыми решениями:

Чем отличаются структуры для наследования интерфейса от структур для наследования реализаций?
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом! Я к вам обращаюсь с...

Наследования
Прошу помочь разобраться. Есть класс: class Controller { public function...

Наследования
#include <iostream> #include <string> using namespace std; class student { protected: int...

Наследования
Что именно наследует класс-потомок при наследовании? А что не наследует? Чем отличаются private,...

22
Native x86
Эксперт Hardware
5594 / 3338 / 951
Регистрация: 13.02.2013
Сообщений: 10,587
05.02.2014, 16:31 2
Нет конечно. У вас разные наборы полей разного типа. Такое ни с классами, ни со структурами делать нельзя. Чем вас не устраивает присвоение по отдельным полям?
1
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
05.02.2014, 16:36  [ТС] 3
долго, потом может и сделаю, а пока просто оставлю запись ту-же на две переменных.
0
Native x86
Эксперт Hardware
5594 / 3338 / 951
Регистрация: 13.02.2013
Сообщений: 10,587
05.02.2014, 17:14 4
Ну, если по-уму, то зачем плодить однотипные структуры? Тогда лучше так:
Pascal
1
2
3
4
5
6
7
8
9
  recPartBoxBeginEndX =record
    minX,maxX: extended; // кординаты контейнера по оси X, упорядочены по возрастанию значения начала контейнера
    IDsurface: LongWord;
  end;
 
  recBoxBeginEndX= record
    labelX:boolean;
    PartBoxBeginEndX: recPartBoxBeginEndX;
  end;
В этом случае присваивать можно и так:
Pascal
1
Move(BoxBeginEndX.PartBoxBeginEndX, PartBoxBeginEndX, SizeOf(PartBoxBeginEndX));
Хотя без полного понимания подковерных процессов, лучше все равно по одному полю это делать, Move() для сложных данных бывает очень опасен.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
05.02.2014, 17:20 5
Лучший ответ Сообщение было отмечено Hretgir как решение

Решение

Hretgir, перегрузи оператор присваивания для нужных записей. Скажем, для того, чтобы делать то, что показано в твоем посте:

Pascal
1
2
3
4
5
6
7
8
9
operator := (rhs : recBoxBeginEndX) : recPartBoxBeginEndX;
begin
  with result do
  begin
    minX := rhs.minX;
    maxX := rhs.maxX;
    IDsurface := rhs.IDsurface;
  end;
end;
, после этого код будет прекрасно компилироваться и работать...

Добавлено через 1 минуту
Цитата Сообщение от quwy Посмотреть сообщение
В этом случае присваивать можно и так:
Не нужно этого делать. Даже при понимании подковерных процессов. Специально для того, чтобы этого НЕ делали, была изобретена перегрузка операций.
1
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
05.02.2014, 21:23  [ТС] 6
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
procedure TForm1.partFormation;
var
count:word;
part:integer;
begin
part:=counterTimeABoxBeginEndY;
counterBoxBeginEndX:=0;
counterApartBoxBeginEndX:=0;
count:=0;
while count<part-1 do
begin
 BoxBeginEndX:=ABoxBeginEndX[counterBoxBeginEndX];
if BoxBeginEndX.labelX=true then
begin
 
  //ApartBoxBeginEndX[counterApartBoxBeginEndX]:=BoxBeginEndX;
  operator := (rhs : recBoxBeginEndX) : recPartBoxBeginEndX;
  begin
  with result do
  begin
    minX := rhs.minX;
    maxX := rhs.maxX;
    IDsurface := rhs.IDsurface;
  end;
  end;
  inc(counterApartBoxBeginEndX);
  dec(part);
end;
else
inc(part);
end;
end;
unit1.pas(220,3) Error: Illegal expression
unit1.pas(220,20) Error: Identifier not found "rhs"
unit1.pas(220,20) Fatal: Syntax error, ")" expected but ":" found
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
05.02.2014, 21:34 7
Перегрузка оператора присваивания должна описываться как обычная глобальная функция, иначе смысла в ней нет. Вынеси реализацию изнутри метода наружу...

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
  operator := (rhs : recBoxBeginEndX) : recPartBoxBeginEndX;
  begin
  with result do
  begin
    minX := rhs.minX;
    maxX := rhs.maxX;
    IDsurface := rhs.IDsurface;
  end;
  end;
 
procedure TForm1.partFormation;
var
count:word;
part:integer;
begin
part:=counterTimeABoxBeginEndY;
counterBoxBeginEndX:=0;
counterApartBoxBeginEndX:=0;
count:=0;
while count<part-1 do
begin
 BoxBeginEndX:=ABoxBeginEndX[counterBoxBeginEndX];
if BoxBeginEndX.labelX=true then
begin
 
  ApartBoxBeginEndX[counterApartBoxBeginEndX]:=BoxBeginEndX; // Будет вызвана перегрузка
  inc(counterApartBoxBeginEndX);
  dec(part);
end;
else
inc(part);
end;
end;
1
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
05.02.2014, 21:38  [ТС] 8
всё, вообще компилятор теперь не работает
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
procedure TForm1.partFormation;
var
count:word;
part:integer;
begin
part:=counterTimeABoxBeginEndY;
counterBoxBeginEndX:=0;
counterApartBoxBeginEndX:=0;
count:=0;
while count<part-1 do
begin
 BoxBeginEndX:=ABoxBeginEndX[counterBoxBeginEndX];
if BoxBeginEndX.labelX=true then
begin
  ApartBoxBeginEndX[counterApartBoxBeginEndX]:=BoxBeginEndX;
  //operator := (rhs : recBoxBeginEndX) : recPartBoxBeginEndX;
  //begin
  //with result do
  //begin
  //  minX := rhs.minX;
  //  maxX := rhs.maxX;
  //  IDsurface := rhs.IDsurface;
  //end;
  //end;
  inc(counterApartBoxBeginEndX);
  dec(part);
end;
else
inc(part);
end;
end;
unit1.pas(231,1) Fatal: Syntax error, ";" expected but "ELSE" found
Добавлено через 2 минуты
выносил я его уже и так и так, у меня теперь компилятор не работает кажется
0
561 / 484 / 168
Регистрация: 14.02.2012
Сообщений: 1,561
05.02.2014, 21:39 9
Цитата Сообщение от Hretgir Посмотреть сообщение
Pascal
1
2
end;
else
";" перед else не ставится.
1
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
05.02.2014, 21:53  [ТС] 10
Цитата Сообщение от UI Посмотреть сообщение
Перегрузка оператора присваивания должна описываться как обычная глобальная функция, иначе смысла в ней нет. Вынеси реализацию изнутри метода наружу...
а я его куда не выношу везде ошибка, я лично не представляю куда его вынести. я его уже даже в описания переменных вставлял и типов. кажется понял, сек
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
05.02.2014, 21:59 11
Цитата Сообщение от Hretgir Посмотреть сообщение
у меня теперь компилятор не работает кажется
Нормально все работает. Компиляцию, по крайней мере, проходит:
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
// В самом начале блока Implementation, или в любом месте, но тогда
// в Interface должен быть прототип...
operator := (rhs: recBoxBeginEndX): recPartBoxBeginEndX;
begin
  with Result do
  begin
    minX := rhs.minX;
    maxX := rhs.maxX;
    IDsurface := rhs.IDsurface;
  end;
end;
 
procedure TForm1.partFormation;
var
  Count: word;
  part: integer;
begin
  part := counterTimeABoxBeginEndY;
  counterBoxBeginEndX := 0;
  counterApartBoxBeginEndX := 0;
  Count := 0;
  while Count < part - 1 do
  begin
    BoxBeginEndX := ABoxBeginEndX[counterBoxBeginEndX];
    if BoxBeginEndX.labelX = True then
    begin
      ApartBoxBeginEndX[counterApartBoxBeginEndX] := BoxBeginEndX;
      // Будет вызвана перегрузка
      Inc(counterApartBoxBeginEndX);
      Dec(part);
    end
    else
      Inc(part);
  end;
end;
1
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
05.02.2014, 22:06  [ТС] 12
всё, разобрался, не раскомментил фрагмент. да всё, спс, запутался чутка , фрагмент в описаниях типов не раскомментил

Добавлено через 7 минут
Цитата Сообщение от ВАСИЛЕВС Посмотреть сообщение
";" перед else не ставится.
учту раз и на всегда, я то его правильно писал как-то было, а потом что-то поставил снова
0
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
06.02.2014, 11:02  [ТС] 13
UI, не сходится почему-то решил переименовать так, чтобы использовать те-же процедуры, что и для Y, чтобы убрать вот эт Part и названия переменных и процедур. и вобщем в перегрузке выдаёт ошибку. и вчерашний недостаток исправил, надо было компилить сразу, я после двух операций, не пойму в чём дело, вроде правильно переименовал всё. смотрю, ищу, но вроде просто оператор не туда вынес. а куда надо не знаю. но на всякий случай ищу свою ошибку
Вложения
Тип файла: zip генератор карты высот.zip (8.32 Мб, 7 просмотров)
0
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
06.02.2014, 12:23  [ТС] 14
или запись должна быть та-же, просто присваиваются значения не все? да вроде не должно так быть. и ошибку я не найду у себя никак . похоже я всё переименовал правильно

Добавлено через 18 минут
собрал, просто я оператор вначале вставил а не в конце всей программы, и тогда всё заработало.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
06.02.2014, 12:24 15
Я же написал:
Цитата Сообщение от UI Посмотреть сообщение
В самом начале блока Implementation
, а не где попало. Если у меня процедура A описана ниже процедуры B, то на момент компиляции B компилятор об A ничего не знает, и попытка вызывать оттуда процедуру A завершится неудачей. Но вот если перенести реализацию A выше реализации B, то все сразу станет нормально. Проект в аттаче прекрасно компилируется (который generationHighMap).

И используй Ctrl+D для форматирования исходника, на него же смотреть страшно...
Вложения
Тип файла: 7z height_map.7z (61.4 Кб, 12 просмотров)
1
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
08.02.2014, 13:45  [ТС] 16
UI, а можно сделать несколько операторов, к разным записям? думаю можно, сейчас созрела необходимость, буду пробовать. последний фильтр делаю, по оси Z, правда он урезаный и несколько отличается от фильтров по X и Z.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
08.02.2014, 14:06 17
Цитата Сообщение от Hretgir Посмотреть сообщение
а можно сделать несколько операторов, к разным записям?
Да. Сколько нужно, столько и делается. Параметр перегруженного оператора должен быть того типа, из которого производится присваивание, а результат - того типа, в который нужно присвоить значение. Ограничений на количество операций присваивания нет.
1
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
25.03.2014, 22:55  [ТС] 18
UI, а получается так-же можно добавить и поля в запись, если они описаны в другой записи? просто нет смысла все поля перезагружать по ходу обработки, а добавлять их по мере уменьшения размеров, допустим массива, когда лишние данные откидываются из обработки, то разумеется можно и уточнить информацию добавлением полей. можно точно так-же?

Добавлено через 13 минут
просто мне до тестовых прогонов программы ещё неделя-три, а как-то делать надо, и хочется чтобы без переделок

Добавлено через 22 часа 24 минуты
буду считать что нельзя, иначе массив не сможет быть динамическим. но попробую.

Добавлено через 2 часа 12 минут
не понимаю:
unit1.pas(252,50) Error: Incompatible types: got "recSurfaceList" expected "recBoxBeginEndY"
последняя строка в коде 252
Pascal
1
2
3
TimeABoxBeginEndY[counterTimeABoxBeginEndY] := BoxBeginEndY;//-----------------записывается значение массива контейнеров по икс
  SurfaceList := ASurfaceList[BoxBeginEndY.IDsurface];
  TimeABoxBeginEndY[counterTimeABoxBeginEndY] := SurfaceList;
есть операторы
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
operator := (rhs2: recSurfaceList): recTimeBoxBeginEndY;
begin
  with Result do
  begin
  px1 :=rhs2.px1;
  py1 :=rhs2.py1;
  pz1 :=rhs2.pz1;
  px2 :=rhs2.px2;
  py2 :=rhs2.py2;
  pz2 :=rhs2.pz2;
  px3 :=rhs2.px3;
  py3 :=rhs2.py3;
  pz3 :=rhs2.pz3;
  //px1, py1, pz1, px2, py2, pz2, px3, py3, pz3: extended;
  end;
  end;
operator:=(rhs3: recBoxBeginEndY):recTimeBoxBeginEndY;
begin
  with Result do
  begin
   minY :=rhs3.minY;
   maxY :=rhs3.maxY;
   IDsurface := rhs3.IDsurface;
  end;
end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32955 / 21273 / 8168
Регистрация: 22.10.2011
Сообщений: 36,542
Записей в блоге: 8
26.03.2014, 02:45 19
Во-первых, вопрос уже был задан в другой теме, а во-вторых - я не телепат, чтобы догадываться, как описаны переменные.
0
399 / 137 / 3
Регистрация: 25.01.2012
Сообщений: 5,777
Записей в блоге: 141
26.03.2014, 21:31  [ТС] 20
да можно, там ошибка другая была, если кому-то интересно, ссылка на этот-же форум, надеюсь это не будет ещё одним нарушением

Добавлено через 31 минуту
и даже напрямую работает, точнее компилируется без ошибок, жаль я раньше не знал
Pascal
1
TimeABoxBeginEndY[counterTimeABoxBeginEndY] := ASurfaceList[BoxBeginEndY.IDsurface];
это вот при этом
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
operator:=(rhs3: recBoxBeginEndY):recTimeBoxBeginEndY;
begin
  with Result do
  begin
   minY :=rhs3.minY;
   maxY :=rhs3.maxY;
   IDsurface := rhs3.IDsurface;
  end;
end;
operator := (rhs2: recSurfaceList): recTimeBoxBeginEndY;
begin
  with Result do
  begin
  px1 :=rhs2.px1;
  py1 :=rhs2.py1;
  pz1 :=rhs2.pz1;
  px2 :=rhs2.px2;
  py2 :=rhs2.py2;
  pz2 :=rhs2.pz2;
  px3 :=rhs2.px3;
  py3 :=rhs2.py3;
  pz3 :=rhs2.pz3;
  //px1, py1, pz1, px2, py2, pz2, px3, py3, pz3: extended;
  end;
с двумя, как-бы наследованиями. а я тут переменным сначала присваивал, а всё намного круче.
на самом деле это-очень круто: любая здравая логика построена на уточнении информации при вычленении излишней. не знаю сколько языков программирования, ориентированные на AI элементы, основаны на этой концепции, но если мне повезёт, я займусь и этим предметом в программировании, именно на этом трюке. не зря-же я вьюсь столько около записей и массивов, испытывая на прочность компилятор.
0
26.03.2014, 21:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2014, 21:31
Помогаю со студенческими работами здесь

наследования
Приведите пожалуйста пару примеров наследования.

Наследования конструктора
Привет всем, подскажите , а то я не могу сформулировать вопрос для гугла. Суть такое есть класс...

Множественное наследования
Приветстсвую всех, за что я любил плюсы, да за то что по сравнению с шарпом там есть множественное...

Наследования QGraphicsRectItem
Решил создать свой Item на базе QGraphicsRectItem (так как не хватает некоторого функционала)....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru