Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2016, 00:03   #41
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Два знака равно не в выражении, а по коду: первый в выражении, второй внутри свойства.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 00:04   #42
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Два знака равно не в выражении, а по коду: первый в выражении, второй в свойстве.
так а откуда выполнится второй?
его никто не вызывает.
где в коде
Код:
myClass.Data=new int[0];
?
вы читайте пожалуйста мои сообщения полностью.

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

не разбивайте выражение на части, выражение делает ровно то что написано.

то что вы описываете выглядит вот так:
Код:
var data=myClass.Data;
data[i]=data[j];
myClass.Data=data;
но разве вы это написали?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 00:11.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 00:18   #43
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса
то что вы описываете выглядит вот так
А разве так не проще ?
Суть одна и та же (результат), только в случае со свойством происходит вложение.
Мне даже стало это интересно на уровне ассемблера. Ща напишу програмулину, и буду ковырять процесс в отладчике CheatEngine.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 00:27   #44
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А разве так не проще ?
нет, не проще.
у нас не копия массива.
это в принципе бессмысленно.

это совсем иной код.
Цитата:
Суть одна и так же (результат), только в случае со свойством происходит вложение.
результат то будет тот же, только мы делаем еще бессмысленное действие.
Код:
int a=1;
a=a;
вот что мы делаем.

Цитата:
Мне даже стало это интересно на уровне ассемблера. Ща напишу програмулину, и буду ковырять процесс в отладчике CheatEngine
а вы не в курсе что в студии отладчик есть?
плюс не думаю что вам будет весело отлаживать IL-код
в асме это масло масленное выглядит примерно так:
Код:
mov ecx, myClass
call myClass.get_Data//вернулся указатель на массив
mov ecx,eax
mov eax,j
lea eax,[ecx+eax*4]
mov ebx,[eax]
mov eax,i
lea eax,[ecx+eax*4]
mov [eax],ebx//у нас значение уже в том самом массиве
push ecx
call myClass.set_Data//и мы перезаписываем указатель на массив, тем же указателем, зачем?
последние две строки не имеют смысла.
Цитата:
Суть одна и та же (результат), только в случае со свойством происходит вложение.
со свойством нет никакого вложения.
будет выполнено ровно то что написано.
вы перечитайте примеры кода что я вам присылал.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 00:42.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 00:33   #45
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

запомните одну вещь, код делает то что написано, а не то что вы выдумали.
myClass.Data[i]=myClass.Data[j]
присвоит rvalue в lvalue.
будет выполнено ровно одно присвоение, ровно один set.
int[]=this[int]=>set, что и написано.

не фантазируйте того, чего нет.
не усложняйте код на пустом месте.
Цитата:
А разве так не проще ?
да и чем проще вместо простого действия городить кучу, в том числе еще и присваивать значение самом себе
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 00:39.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 02:00   #46
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Только на верхнем уровне данных кода (без учёта перехода по стеку внутри класса) при трассировке происходит три вызова call. Что по приведённому мною порядку действий
Цитата:
Сообщение от Omega Berkut
1) запросить ссылку на массив data (явный возврат значения поля data);
2) извлечь значение элемента по индексу j;
3) запросить запись ссылки
4) записать извлечённое значение (п.2) в массив по запрошенной ссылке (п.3) по индексу i
5) записать ссылку в свойстве
1, 3 и 5 по порядку - переходы по стеку (уровни кода). При этом
операция 2 происходит наверху после 1
операция 4 - так же наверху после операции 3
операция 5 - переход по стеку и запись ссылки.

В вашем коде есть только два перехода. Трассировка скриншотом во вложении. К тому же, студийный отладчик не даст мне таких данных (или я чего то не знаю).
P. S. Возможно я неправильно оперирую терминологией, но переход по стеку = вызов функции. В нашем случае функция = свойство.
Изображения
Тип файла: jpeg trace.jpeg (79.3 Кб, 38 просмотров)
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 02:05   #47
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса
будет выполнено ровно то что написано
Прошу учесть тот факт, что понимание кода верхнего уровня неравнозначно коду уровня ассемблера (аля максимальное общедоступное приближение к машинным кодам).

По поводу уровня кода есть уточнение: на предмете "архитектура компьютеров" рассказывается про 5 уровней программирования, где
0 - физические сигналы - то, что происходит на самом деле (аппаратная инженерия)
1 - машинные коды (бинарь)
2 - команды микро-архитектуры (биос, ОЗУ, и всё рядом находящееся)
3 - ассемблер
4 - API
5 - код высокого уровня
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 15.09.2016 в 02:10.
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 02:32   #48
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
при трассировке происходит три вызова call. Что по приведённому мною порядку действий
вы изучали код внутри?
вы хоть знаете что за код вы показываете?
вы хоть знаете что он делает? вы знаете структуру управляемых классов?
нет, вы увидели три call, и считаете что правы, охренеть анализ.
call dword ptr[eax] явно вызов из таблицы методов, значит уже не все так просто.

вы не можете сопоставить call, с кодом источника, так что не страдали бы ерундой.

если код работает как вы на фантазировали, то это бы не работало.
Код:
class MyClass
{
  int[] _data=new int[]{1,2,3};
  public int[] Data{get{return _data;}}
}
var myClass=new MyClass();
myClass.Data[0]=5;
myClass.Data[0]=myClass.Data[1];
Цитата:
По поводу уровня кода есть уточнение: на предмете "архитектура компьютеров" рассказывается про 5 уровней программирования, где
0 - физические сигналы - то, что происходит на самом деле (аппаратная инженерия)
1 - машинные коды (бинарь)
2 - команды микро-архитектуры (биос, ОЗУ, и всё рядом находящееся
и прочее бла бла бла, это не важно все.
вы нашли кусок код, но не смогли проанализировать его.
напоминает ситуацию с тестированием, не так ли?

Цитата:
К тому же, студийный отладчик не даст мне таких данных (или я чего то не знаю).
смотря на всю чушь рядом, я вам скажу одно, Ты ничего не знаешь, Джон Сноу.
студия покажет полный асм с подписью что и где.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 02:37.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 02:41   #49
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
        static void Test()
        {
            var myClass = new MyClass();
            myClass.Data[0] = 5;
            myClass.Data[0] = myClass.Data[1];
        }
Код:
            Test();
00007FFF0340381C  call        00007FFF032CC870
ничего странного.
Код:
        {
00007FFF03403850  sub         rsp,78h  
00007FFF03403854  mov         qword ptr [rsp+20h],0  
00007FFF0340385D  mov         rax,7FFF03461DB0h  
00007FFF03403867  mov         eax,dword ptr [rax]  
00007FFF03403869  test        eax,eax  
00007FFF0340386B  je          00007FFF03403872  
00007FFF0340386D  call        00007FFF62F37410  //пропускает
00007FFF03403872  nop  
            var myClass = new MyClass();
00007FFF03403873  mov         rcx,7FFF03463A20h  
00007FFF0340387D  call        00007FFF62CD74A0  //создание объекта
00007FFF03403882  mov         qword ptr [rsp+28h],rax  
00007FFF03403887  mov         rcx,qword ptr [rsp+28h]  
00007FFF0340388C  call        00007FFF032CC968  // инициализация объекта
00007FFF03403891  mov         r11,qword ptr [rsp+28h]  
00007FFF03403896  mov         qword ptr [rsp+20h],r11  
            myClass.Data[0] = 5;
00007FFF0340389B  mov         rax,qword ptr [rsp+20h]  
00007FFF034038A0  cmp         byte ptr [rax],0  
00007FFF034038A3  mov         rcx,qword ptr [rsp+20h]  
00007FFF034038A8  call        00007FFF032CC960  // myClass.Data.get
00007FFF034038AD  mov         qword ptr [rsp+30h],rax  
00007FFF034038B2  mov         rax,qword ptr [rsp+30h]  
00007FFF034038B7  mov         rax,qword ptr [rax+8]  
00007FFF034038BB  mov         qword ptr [rsp+38h],0  
00007FFF034038C4  cmp         qword ptr [rsp+38h],rax  
00007FFF034038C9  jae         00007FFF034038D7  
00007FFF034038CB  mov         rax,qword ptr [rsp+38h]  
00007FFF034038D0  mov         qword ptr [rsp+38h],rax  
00007FFF034038D5  jmp         00007FFF034038DC  
00007FFF034038D7  call        00007FFF630765A0 //пропускает
00007FFF034038DC  mov         rcx,qword ptr [rsp+30h]  
00007FFF034038E1  mov         rax,qword ptr [rsp+38h]  
00007FFF034038E6  mov         dword ptr [rcx+rax*4+10h],5  
            myClass.Data[0] = myClass.Data[1];
00007FFF034038EE  mov         rax,qword ptr [rsp+20h]  
00007FFF034038F3  cmp         byte ptr [rax],0  
00007FFF034038F6  mov         rcx,qword ptr [rsp+20h]  
00007FFF034038FB  call        00007FFF032CC960  // myClass.Data.get
00007FFF03403900  mov         qword ptr [rsp+40h],rax  
00007FFF03403905  mov         rax,qword ptr [rsp+20h]  
00007FFF0340390A  cmp         byte ptr [rax],0  
00007FFF0340390D  mov         rcx,qword ptr [rsp+20h]  
00007FFF03403912  call        00007FFF032CC960  // myClass.Data.get
00007FFF03403917  mov         qword ptr [rsp+48h],rax  
00007FFF0340391C  mov         rax,qword ptr [rsp+48h]  
00007FFF03403921  mov         rax,qword ptr [rax+8]  
00007FFF03403925  mov         qword ptr [rsp+50h],1  
00007FFF0340392E  cmp         qword ptr [rsp+50h],rax  
00007FFF03403933  jae         00007FFF03403941  
00007FFF03403935  mov         rax,qword ptr [rsp+50h]  
00007FFF0340393A  mov         qword ptr [rsp+50h],rax  
00007FFF0340393F  jmp         00007FFF03403946  
00007FFF03403941  call        00007FFF630765A0  //пропуск
00007FFF03403946  mov         rcx,qword ptr [rsp+48h]  
00007FFF0340394B  mov         rax,qword ptr [rsp+50h]  
00007FFF03403950  mov         eax,dword ptr [rcx+rax*4+10h]  
00007FFF03403954  mov         dword ptr [rsp+58h],eax  
00007FFF03403958  mov         rax,qword ptr [rsp+40h]  
00007FFF0340395D  mov         rax,qword ptr [rax+8]  
00007FFF03403961  mov         qword ptr [rsp+60h],0  
00007FFF0340396A  cmp         qword ptr [rsp+60h],rax  
00007FFF0340396F  jae         00007FFF0340397D  
00007FFF03403971  mov         rax,qword ptr [rsp+60h]  
00007FFF03403976  mov         qword ptr [rsp+60h],rax  
00007FFF0340397B  jmp         00007FFF03403982  
00007FFF0340397D  call        00007FFF630765A0  //пропуск
00007FFF03403982  mov         rdx,qword ptr [rsp+40h]  
00007FFF03403987  mov         rcx,qword ptr [rsp+60h]  
00007FFF0340398C  mov         eax,dword ptr [rsp+58h]  
00007FFF03403990  mov         dword ptr [rdx+rcx*4+10h],eax  
        }
00007FFF03403994  jmp         00007FFF03403996  
00007FFF03403996  add         rsp,78h  
00007FFF0340399A  rep ret
ну как, нашли вызов set?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 02:47.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 02:46   #50
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Уже переходим на ты ? Нет, такого я себе не позволю.
Вопрос в другом. Я знаю, что у ассемблера не существует понятия "свойство", а значит шарповские свойства - это кастрированные функции - вот вам и переходы по стеку (вызов функции). Этого достаточно для того, что бы не вдаваться в детали кода.
К тому же - приведённый скриншот описывает запись в массив (в ячейку памяти). Я забыл оттрассировать чтение из памяти.
Цитата:
Сообщение от Пепел Феникса
и прочее бла бла бла, это не важно все
Сразу видно ваше отношение к понятию "программист". Меня учили системному программированию.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Wordpress, как создавать отдельные рубрики для страниц? AlienNation WordPress и другие CMS 0 09.10.2012 11:42
Именованные таблицы DiemonStar Microsoft Office Excel 4 02.10.2012 18:02
Операции класса, индексаторы Rectangle 6666 Общие вопросы .NET 4 08.05.2012 11:31
Именованные ячейки Foxx Microsoft Office Excel 1 20.02.2012 00:33
Как в Delphi создавать и использовать скины для програм SeRhy Помощь студентам 3 20.12.2007 20:59