powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сравнение двух глобалов
12 сообщений из 12, страница 1 из 1
Сравнение двух глобалов
    #39271414
Шваров Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная тема снова на Community .
У каждого есть в запасе похожая утилита? )
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39271563
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шваров ЕвгенийУ каждого есть в запасе похожая утилита? )
Код: plaintext
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.
ClassMethod DiffTree() [ PublicList = (a, b) ]
{
  n a,b
  s rep=##class(%Stream.TmpCharacter).%New()

  s a=4, b=4
  w !,"1) ",##class(%CPT.Util.TreeDiff).Diff("a","b",rep)," "
  d rep.OutputToDevice()

  k a,b s a=4, b=5
  d rep.Clear()
  w !,"2) ",##class(%CPT.Util.TreeDiff).Diff("a","b",rep)," "
  d rep.OutputToDevice()

  k a,b s a=4, b(5)=5
  d rep.Clear()
  w !,"3) ",##class(%CPT.Util.TreeDiff).Diff("a","b",rep)," "
  d rep.OutputToDevice()

  k ^a,^b s ^a(1,1,1)=4, ^b(1,1)=5
  d rep.Clear()
  w !,"4) ",##class(%CPT.Util.TreeDiff).Diff("^a","^b",rep)," "
  d rep.OutputToDevice()
  k ^a,^b
}

USER>d ##class(sqlru.test).DiffTree()
 
1) 1
2) 0 Data mismatch at a ~ b
 
3) 0 Data present in a but not in b
No entry for a(5) or any following keys
 
4) 0 Data present in ^b(1,1) but not in ^a(1,1)
No entry for ^b(1,1,1) or any following keys
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39271598
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit ,

как, конечно, всем хорошо известно, класса %CPT.Util.TreeDiff нет даже в 2016.1. Не все бегут "впереди планеты всей", хотя к этому стоит стремиться.

У меня тоже есть функция сравнения глобалов на чистом M/COS. Ничего принципиально отличного от ранее опубликованного, те же $Query с @. Мне общее решение задачи оказалось не нужно: используя утилиту для тестирования кода экспорта-импорта глобалов в различных форматах, и 1-ого расхождения глобалов мне всегда оказывается достаточно, чтобы выправить дефект.

...Несколько лет назад, когда писал функцию, потратил определённые усилия на поиск разумного поведения после обнаружения 1-го расхождения с тем, чтобы найти их все до достижения некоторого верхнего предела - типичный случай "перепрограммирования".
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39271623
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslovкак, конечно, всем хорошо известно, класса %CPT.Util.TreeDiff нет даже в 2016.1.$zv указан не был, поэтому 10031109 .
Что касается более старых версий, то есть готовая утилита %GCMP , сравнивающая глобалы и которая присутствует даже в 5.0.x.
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39271893
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitЧто касается более старых версий, то есть готовая утилита %GCMP ...А мужики и не знают :)
Меня, например, она бы не устроила, т.к.:
- не умеет сравнивать подмассивы
- не имеет API (чистый интерактив).

Понятно, что всё это можно пофиксить, но для столь простых задач быстрее и проще написать заново. А про %GCMP, если честно, я просто забыл - а она ведь была даже в MSM.
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39271908
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslovне умеет сравнивать подмассивыНе могли бы Вы уточнить, что здесь подразумевалось?
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39271928
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

опубликовал всё же свою функцию, там в комментариях вроде всё есть. Подмассив: a(1), ^G(1,"aaa").
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39272171
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey MaslovПодмассив: a(1), ^G(1,"aaa").Т.е. я изначально правильно Вас понял.
Почему же в %GCMP нельзя их использовать, когда - можно?
Код: plaintext
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.
USER>k ^a,^b s ^a=1,^b=2,^a(1)=3,^b(1,1)=4 zw ^a,^b
^a=1
^a(1)=3
^b=2
^b(1,1)=3
 
USER>d ^%GCMP
 
Compare global ^a(1)
  on directory set: (this system)
    in namespace: USER =>
 with global ^a(1)=> b(1,1)
  on directory set: (this system)
    in namespace: USER =>
Output differences on
Device:
Right margin: 80 =>

Compare global ^a(1) in USER
 with global ^b(1,1) in USER
 
No differences

USER>k ^a,^b s ^a=1,^b=2,^a(1)=3,^b(1,1)=4 zw ^a,^b
^a=1
^a(1)=3
^b=2
^b(1,1)=4
 
USER>d ^%GCMP
 
Compare global ^a(1)
  on directory set: (this system)
    in namespace: USER =>
 with global ^a(1)=> b(1,1)
  on directory set: (this system)
    in namespace: USER =>
Output differences on
Device:
Right margin: 80 =>

Compare global ^a(1) in USER
 with global ^b(1,1) in USER
 
Data in ^a(1): 3
Data in ^b(1,1): 4

USER>k ^a,^b s ^a=1,^b=2,^a(1,"Data")=3,^b("Data","Data")=3 zw ^a,^b
^a=1
^a(1,"Data")=3
^b=2
^b("Data","Data")=3
 
USER>d ^%GCMP
 
Compare global ^a(1)
  on directory set: (this system)
    in namespace: USER =>
 with global ^a(1)=> b("Data")
  on directory set: (this system)
    in namespace: USER =>
Output differences on
Device:
Right margin: 80 =>

Compare global ^a(1) in USER
 with global ^b("Data") in USER
 
No differences
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39272225
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и отлично.

Моё (несмелое :) предположение было основано на опыте работы с другими утилитами Cache, ориентированными на глобалы: чтобы понять, работают ли они с поддеревьями, как правило, надо пробовать: это не всегда очевидно, и синтаксис разный: где-то надо закрывать скобку (%GSIZE), где-то нет (%GOGEN).

В качестве бонуса: моя функция позволяет сравнивать и локальные [под]массивы. Так вышло само собой, хоть и ни разу не пригодилось. Справедливости ради, "всеядны" и некоторые другие решения на community, хотя по условию задачи требовалось сравнить локальные массивы: народ просто прислал готовые функции, вряд ли кто-то писал "к случаю".
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39272297
Timur Safin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslov,

Почему же, я написал к случаю. Чего там писать то?

P.S.
Решения (кроме моего :) ), конечно, поражают большим объемом over-design-а.
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39272354
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timur SafinРешения (кроме моего :) ), конечно, поражают большим объемом over-design-а.Если считать расширение исходной постановки "сравнить два локальных массива" на глобалы, соглашусь, хотя и ваш код работает с глобалами. А в остальном... ну, наверное, тем, кто писал "не к случаю", это было для чего-то нужно.

Если уж зашёл разговор: считать ли равными массивы m(1) и n(2), где:

m(1, 1,1)=11
m(1, 2)=12

n(2, 1,1)=11
n(2, 2)=12

Я считаю, что да, а вы, как видно, нет.
...
Рейтинг: 0 / 0
Сравнение двух глобалов
    #39272365
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже если принять вашу точку зрения, всё равно у вас ошибка.
См.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DebugArrayCompare()
    new
    set m(1,1,1)=11,m(1,2)=12,m(2,1)=133
    set n(1,1,1)=11,n(1,2)=12,n(2,1)=133
    write $$CompareArrays($name(m),$name(n)),!
    set n(3,1)=0
    write $$CompareArrays($name(m),$name(n)),!
    kill n merge n(1)=m(1) set n(2)="extra2"
    set b=$$CompareArrays($name(m(1)),$name(n(1))) w b,!
    if 'b zw m(1) w ! zw n(1)
    quit

USER>d DebugArrayCompare^%ztest
1
0
0
m(1,1,1)=11
m(1,2)=12
 
n(1,1,1)=11
n(1,2)=12
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сравнение двух глобалов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]