Вопросы С#, NET



Charismatic
01.03.2009, 16:45

Тему решил создать, т.к. каждый отдельно для каждого вопроса по С# тему создает, хотя есть отдельные темы по PHP и т.д.

У меня первый вопрос, кручу мучу сделать не получается. Работа со временем.

Надо расчитать время выполнения каждой из нескольки последовательностей команд. Результат нужно получить в секундах с большой точностью.

Например расчитать время выполнения цикла:

for ( int i = 0; i < 1000000000; i++ ) b = 1 * i;

С помощью DateTime.Now.Second получилось грубо в секундах вычислить, но мне нужно видеть и десятитысячные доли секунды и т.д.

Я так понял нужно использовать DateTime.Now.Ticks, но не могу понять как конвертировать время в Ticks во время в секундах.

Может можно решить с помощью Thread-ов, но я C# как пару дней учу, тоже не знаю как, в любом случае без типов времени не обойтись.

P.S. С# 3.0.



.DeV!L
01.03.2009, 19:32

long start = DateTime.Now.Ticks;

int b = 0;

for (int i = 0; i < 1900000000; i++) b = 1 * i;

double end = (double)(DateTime.Now.Ticks – start) / 10000000;

Console.WriteLine(«{0} Seconds», end.ToString(«0.00″));

где-то так?



Berkut
01.03.2009, 20:09

Надо расчитать время выполнения каждой из нескольки последовательностей команд. Результат нужно получить в секундах с большой точностью.

Например расчитать время выполнения цикла:

for ( int i = 0; i < 1000000000; i++ ) b = 1 * i;



Не стоит этого делать на C#. Думаю, что в программисты в Microsoft достаточно умны, чтоб сообразить, что такой цикл даст «на выходе» и вставить в «итоговый код» фрагмент, оптимизированный до предела, т.е. тут не будет выполняться цикл ВООБЩЕ…

А если будет – моя рекомендация – НИКОГДА НЕ ИСПОЛЬЗОВАТЬ такой компилятор…



Charismatic
01.03.2009, 22:54

.DeV!L, спасибо помог. Написал так:

int b = 0;

long start = DateTime.Now.Ticks;

for (int i = 0; i < 2000000000; i++) b = 1 * i;

long stop = DateTime.Now.Ticks;

long time = stop – start;

Console.WriteLine(TimeSpan.FromTicks(time));

Console.WriteLine((double)time/10000000);

Результат одинаковый, только TimeSpan.FromTicks дает форматированный вывод:

00:00:10.0156250

10,015625

Berkut, дело не в цикле было.



VitZ
02.03.2009, 09:59

System.Diagnostics.Stopwatch – именно для замера времени выполнения участка кода



cleg
02.03.2009, 10:41

использовать Now.Ticks – неправильно.

или использовать Stopwatch как сказал VitZ, или в крайнем случае System.Environment.TickCount



Charismatic
02.03.2009, 16:34

VitZ, cleg Спасибо, так?

System.Diagnostics.Stopwatch time = new System.Diagnostics.Stopwatch();

time.Start();

for (int i = 0; i < 2000000000; i++) b = 1 * i;

Console.WriteLine(time.Elapsed);

00:00:11.3832475

Результат чуть другой, с Now.Ticks у меня было 10 секунд, а тут 11.



VitZ
02.03.2009, 17:32

ащето

System.Diagnostics.Stopwatch time = new System.Diagnostics.Stopwatch();

time.Start();

for (int i = 0; i < 2000000000; i++) b = 1 * i;

time.Stop();

Console.WriteLine(time.Elapsed);

time.Reset();// если дальше меряешь и замер не зависимый

а никто не грил что буит меньше :)



Charismatic
12.03.2009, 10:25

Еще вопрос возник, хочу получить бит-код любого файла, тут даже не важно на каком языке программирования.

Суть в чем:

1. Любая информация представляется последовательностью 0 и 1, независимо от структуры файла и прочих факторов.

2. Я хочу взять произвольный файл, получить эту последовательность 0 и 1, а затем воссоздать файл из этой последовательности.

Одни говорят мол эта задача нерешаема, другие тоже веруют, что это возможно, ибо любая информация в конечном итоге представляется в виде 0 и 1 (не будем считать значения напряжений и т.п., т.к. это уже не цифровое представление информации).

Пример, который мне нравиться, чтобы доказать возможность сказанного(может и не правильный, придумал сам):

Если взять оптоволокно, то данные в нем передаются с помощью световых импульсов, есть сигнал – 1, нет – 0. И если на выходе из кабеля поставить какую-то движущуюся поверхность со скоростью, равной частоте изменения сигнала, то можно будет получить эту последовательность импульсов, 0 и 1. Далее эти данные преобразуются, проходя дальнейшие уровни передачи данных.

То есть теоретически я думаю это возможно, ну и соответственно практически.



cleg
12.03.2009, 11:04

Charismatic,

прости, но это какой-то поток вольного сознания!!! доступ к файлам – как минимум побайтовый. побитово с ним работает только контроллер жесткого диска, дальше уже идут байты.

можно конечно читать файл побайтово и раскладывать его на биты, но зачем???



Charismatic
12.03.2009, 11:44

Charismatic,

прости, но это какой-то поток вольного сознания!!! доступ к файлам – как минимум побайтовый. побитово с ним работает только контроллер жесткого диска, дальше уже идут байты.

можно конечно читать файл побайтово и раскладывать его на биты, но зачем???

Вопрос стоит в том, решаема эта задача или нет, а не в том зачем это нужно, а сознание у меня как раз вольное. Я поставил конкретную задачу, не надо воду лить.

можно конечно читать файл побайтово и раскладывать его на биты

Операция обратимая? могу потом исходный файл получить? На С# можно написать? какие методы позволяют это сделать? можно как-то отделить информацию о структуре файла от области данных? меня по сути интересует область данных.



VitZ
12.03.2009, 12:09

FileStream & BitArray в руки и вперед, но изврат IMHO

На платформе 1байт=8бит – получишь 8 раз больше размер ибо минимальная единица данных всеже байт



merlin
12.03.2009, 13:41

Операция обратимая? могу потом исходный файл получить? На С# можно написать? какие методы позволяют это сделать? можно как-то отделить информацию о структуре файла от области данных? меня по сути интересует область данных.

Какая-то каша …

Ты можешь прочитать содержимое файла в память и получить и вывести куда-нибудь представление любого (или всех) байтов в двоичном виде.



Charismatic
12.03.2009, 14:22

Какая-то каша …

Ты можешь прочитать содержимое файла в память и получить и вывести куда-нибудь представление любого (или всех) байтов в двоичном виде.

1. Я получаю последовательность бит файла. Сохраняю где-то.

2. Удаляю файл. Или просто иду за другой компьютер.

3. Воссоздаю файл из последовательности бит.

Возможно? Меня интересует самый низкий уровень двоичного представления, тобишь только 0 и 1, а не куча возможных иероглифов.

Да и повторюсь, речь не идет о реализации на C# под .NET, важен только результат, вплоть до того, что писать на ассемблере прийдеться, а так не важно, С, С++, Pascal, вобще значения никакого не имеет какой язык.



merlin
12.03.2009, 14:31

1. Я получаю последовательность бит файла. Сохраняю где-то.

2. Удаляю файл. Или просто иду за другой компьютер.

3. Воссоздаю файл из последовательности бит.

Возможно?

Конечно. Берешь любым файловым менеджером копируешь файл на флешку, идешь на другой комьютер и копируешь его там.

Меня интересует самый низкий уровень двоичного представления, тобишь только 0 и 1, а не куча возможных иероглифов.

Что значит иероглифы ?



cleg
12.03.2009, 15:09

в минимальной, тупейшей конфигурации для передачи бинарного сигнала нужны:

1. генератор опорной частоты (секвенсер), создающий пики с частотой, заведомо большей частоты источника.

2. генератор периодических импульсов – неважно, прямоугольных, треугольных или синусоидальных (источник)

3. устройство, способное гасить пики секвенсера, тем самым создавая бинарную картинку (модулятор)

4. простая ерунда, способная при получении пика опорной частоты некоторое время (длину периода источника) передавать сигнал источника в линию.

для приема нужны:

1. секвенсер, более-менее точно синхронизированный с передающей стороной.

2. конденсатор, разряжающийся каждый раз при получении пика секвенсера в течении длины периода источника

3. ацп, преобразующий разряды конденсатора в 1 и его молчание в 0, с опорной частотой, получаемой от секвенсера

в принципе так то



VitZ
12.03.2009, 15:46

Возможно? Меня интересует самый низкий уровень двоичного представления, тобишь только 0 и 1, а не куча возможных иероглифов.

Самый низкий уровень это байт – мин. адресуемая ячейка памяти

тоесть как не крути не верти ты 1 бит не получишь в чистом виде.

Как вариант 1 байт со значением 0 или 1

Да и повторюсь, речь не идет о реализации на C# под .NET, важен только результат, вплоть до того, что писать на ассемблере прийдеться, а так не важно, С, С++, Pascal, вобще значения никакого не имеет какой язык.

а собсно посему тогда именно сюда



«igoriok»
12.03.2009, 20:02

можно как-то отделить информацию о структуре файла от области данных? меня по сути интересует область данных.

Меня интересует самый низкий уровень двоичного представления, тобишь только 0 и 1, а не куча возможных иероглифов.

:upset: Меня терзают смутные сомнения что вы понятия не имеете как информация хранится на носителях. Иероглифы – это следствие того чтобы вы пытаетесь прочитать бинарный (двоичный) файл как тест. В любом случае любой файл сохраняется как последовательность двоичных данных. Только после того, как Операционная система опознала тип файла (по расширению в Windows), она либо запускает на исполнение (если файл содержит команды процессора), либо открывает связанную с типом файла программу, которая знает как представить данные, сохранённые в файле. И поэтому все файлы .exe, .bmp

, .txt, .doc и тд. – это двоичные файлы со своей структурой.

Элементарный пример на С# по чтения из файла:

using System;

using System.IO;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

FileStream fs = File.Open(«some_file.bmp

«, FileMode.Open);

byte[] file = new byte[fs.Length];

for (int i = 0; i < fs.Length; ++i)

file[i] = (byte)fs.ReadByte();

fs.Close();

}

}

}



Charismatic
12.03.2009, 21:46

Меня терзают смутные сомнения что вы понятия не имеете как информация хранится на носителях

Догадываюсь, но может чего и подзабыл, кто это хорошо понимает, так это тот, кто на асме на низком уровне программил, я чуть писал пару лет назад. А потом я на бокс пошел, так флаги видать посбивались, регистры начала задачи путать, а теневые регистры совсем в тень ушли :)))) та я и не жалею.

Что значит иероглифы ? видимо это я имел ввиду:

Иероглифы – это следствие того чтобы вы пытаетесь прочитать бинарный (двоичный) файл как тест

доступ к файлам – как минимум побайтовый. побитово с ним работает только контроллер жесткого диска, дальше уже идут байты.

На ассемблере я тоже не могу туда доступ получить? К контроллеру жесткого диска.

Самый низкий уровень это байт – мин. адресуемая ячейка памяти

тоесть как не крути не верти ты 1 бит не получишь в чистом виде.

Как вариант 1 байт со значением 0 или 1

То есть задача в .NET нерешаема. Вот как заметил товаришь, мне нужно получить 1 бит в чистом виде так, чтобы я увидел его значение в текстовом виде как 0 или 1, пускай даже на самом деле это будет байт, но потом я его должен преобразовать в соответствующий ему бит бинарного кода.

а собсно посему тогда именно сюда

Программист везде найдет :)

Так надо перерыв в дискуссии сделать, а то вон Cleg уже про конденсаторы, модуляторы, демодуляторы начал. Мне вообще хочется послать файл на сетевую карту и вылавливать эти биты на определенному этапе модели OSI передачи данных(где-то слышал про нее)…

К примеру давайте такую задачу решим:

1. Создаем простой текстовый файл, пишем там что хотим.

2. Затем нам нужно получить наглядное битовое представление файла(пускай даже это будут байты на самом деле, мне главное увидеть и записать эту последовательность).

3. Эти же биты(байты) мне нужно увидеть в новом текстовом файле. Собственно вопрос, могу ли я увидеть этот бинарный файл без иероглифов в виде 0 и 1 (типо битов, которые на самом деле байты, но не важно).

Вот мы например взяли файл test.txt, записали в нем слова «мама помыла, а я потом купил новый монитор», и получили что-то типо большой такой последовательности:

1010101111111111001……..10100101111111000000101 01010

Вот она мне нужна :)



Synther
12.03.2009, 22:39

Вот она мне нужна :)

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



merlin
12.03.2009, 22:40

1. Создаем простой текстовый файл, пишем там что хотим.

2. Затем нам нужно получить наглядное битовое представление файла(пускай даже это будут байты на самом деле, мне главное увидеть и записать эту последовательность).

3. Эти же биты(байты) мне нужно увидеть в новом текстовом файле. Собственно вопрос, могу ли я увидеть этот бинарный файл без иероглифов в виде 0 и 1 (типо битов, которые на самом деле байты, но не важно).

А чем проблемма ? Не умеешь в двоичную систему переводить ?



«igoriok»
12.03.2009, 22:57

Правильнее это назвать конвертированием бинарных данных в строку.

Вот простой пример, который выводит в консоли содержимое файла в бинарном виде:

using System;

using System.IO;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

FileStream fs = File.Open(«some_file.bmp

«, FileMode.Open);

for (int i = 0; i < fs.Length; ++i)

{

Console.Write(int.Parse(Convert.ToString(fs.ReadBy te(), 2)).ToString(«00000000″));

}

fs.Close();

Console.ReadKey();

}

}

}



Charismatic
12.03.2009, 23:05

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

Мы это уже обсудили, покажешь реализацию? так чтобы я эти биты в текстовом файле мог увидеть.

А чем проблемма ? Не умеешь в двоичную систему переводить ?

Я вот думаю, потом назад из битов в байты надо перевести, оно мне не испортит байты? Я ж буду по 8 позиций считывать, а если до этого оно мне байт не 8 битами запишет скажем 00001010, а просто 1010, в итоге «все пропало».

Сегодня приснится алгоритм, завтра буду пробовать.

«igoriok» спасибо, попробую.



VitZ
13.03.2009, 10:25

В твоей постановке, задача не решаема ни на одном языке :)

Минимальная ячейка памяти (повторюсь) 1 байт, шо в .NET, шо в ASM.

Задача решаема следующим образом (уж извени, мож че не допонял):

1. читаем 1 байт из файла;

2.битовыми операциями (&, <<, >>) вычленяем значения битов. В результате получаем масиив переменных со значениями битов в исходном байте.

3. катаем это все дело в файл.

тоесть на каждый байт исходного файла, мы получаем минимум 8 байт результирующего, каждый из которых может содержать либо 0, либо 1

Восстановление

1. читаем 8 байт из файла

2. битовыми операциями (| <<) сливаем значения битов в байт

3. пишем байт в файл.

кстати число 8 (как кол-во бит в байте) не на всех платформах, могет быть и 7 (но уж точно не на IBM PC, тут точна 8 :) )

Вуаля :) но вопрос нафига оно надо остается :)



cleg
13.03.2009, 11:04

кстати, следует еще учесть что на самом деле чтение с винта происходит покластерно, то есть по 512 байт обычно

а получить побитовый доступ – это надо как минимум свою прошивку для фирмвари винта написать.



VitZ
13.03.2009, 11:12

cleg +1

Поправочка, посекторно (1 кластер = n секторов, где n сильно зависит от FS и размера лог диска)



Synther
17.03.2009, 19:01

C#

С ужасом осознал такой факт. Вот допустим в таком коде

for (int j = 2; j <= (int)Math.Sqrt(i); j++)

{



}

корень считается на каждой итерации. Вопрос, где логика? Так и нужно? :mad:

Компилил под релизом, всяческие оптимизации включены.



Добрый Фей
17.03.2009, 19:09

Так и нужно?

- не знаю, что там в шарпе, но в си так было всю жизнь вроде.



Synther
17.03.2009, 19:15

Analyzator, C++ под релизом соптимизировал это счастье, и каждый раз корень не считал :no:



cleg
18.03.2009, 09:01

С ужасом осознал такой факт.

дык это описанон в стандарте, и так и должно себя вести.

в любой книжке даже уровня для чайников описан совет типа «вынесите вычисления за заголовок цикла, если вам не нужен пересчет на каждом шаге»



Synther
18.03.2009, 15:51

дык это описанон в стандарте, и так и должно себя вести.

в любой книжке даже уровня для чайников описан совет типа «вынесите вычисления за заголовок цикла, если вам не нужен пересчет на каждом шаге»

то что вынести это понятно ))

спасибо за ответ!



Charismatic
11.07.2009, 21:55

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

Никак не получается организовать эту связь, что ни делаю, получается, что форма панели инструментов «гуляет» сама по себе и не зависит от положения главной формы.

В MSDN нашел такое:

Form.AddOwnedForm – метод Добавляет в эту форму собственную форму.

Синтаксис:

C#

public void AddOwnedForm(

Form ownedForm

)

Пример:

В следующем примере кода показан способ использования метода AddOwnedForm для отображения формы как собственной формы другой формы. При отображении собственной формы имеется возможность свернуть ее форму-владельца, а вместе с ней и собственную форму. В этом примере предполагается, что определенный в примере код вызывается из другого события или метода формы.

private void ShowMyOwnedForm()

{

// Create an instance of the form to be owned.

Form ownedForm = new Form();

// Set the text of the form to identify it is an owned form.

ownedForm.Text = «Owned Form»;

// Add ownedForm to array of owned forms.

this.AddOwnedForm(ownedForm);

// Show the owned form.

ownedForm.Show();

}



Делаю по аналогии в конструкторе главной формы:

public Form1()

{

InitializeComponent();

Form2 FormPanel;

FormPanel = new Form2();

this.AddOwnedForm(FormPanel);

FormPanel.Show();

}

Хочу чтобы 2я форма была внутри 1й, в итоге окна все равно независимые в плане передвижения. Может я не правильно понял суть метода Form.AddOwnedForm…

Также пробовал и без этого метода, такой же эффект, вот как работать с MDI не знаю, использовать Parent не получилось, и т.п., если оно вообще все надо и возможна ли такая привязка впринципе…

Просьба задачу не менять, важна сама суть «форма в форме», чтобы внутренняя форма ориентировалась от главной формы, а не от края дисплея, чтобы можно было ее привязать к главной форме с помощью Anchor к примеру или использовать Dock.

Разъясните, если кто знает, буду очень признателен.



«igoriok»
11.07.2009, 22:53

Charismatic, основная задача функции AddOwnedForm установить себя как owner (владелец) указанной формы. Смысл owner’а в том, что когда главное окно уничтожается, вместе с ним уничтожаются и все пренадлежащие ему другие окна и контролы.

Есть два варианта решения задачи:

1. Использовать свой контрол (наследовать от UserControl), при этом он будет вести себя как и любой другой контрол на форме, т.е. будет размещаться на форме по заданных координатам или в других контейнерах типа Panel, Dock итд…

2. Использовать MDI-интерфейс – когда в главной форме размещаются независимые друг от друга другие окна:



для этого установить свойство главной формы

Form.IsMdiContainer = true;

, а для всех дочерних окон

Form.MdiParent = <parent_window>; // если создавать из главной формы, то просто указать this

// Create a new form.

Form mdiChildForm = new Form();

private void Form1_Load(object sender, System.EventArgs e)

{

// Set the IsMdiContainer property to true.

IsMdiContainer = true;

// Set the child form’s MdiParent property to

// the current form.

mdiChildForm.MdiParent = this;

}



Charismatic
12.07.2009, 13:38

«igoriok», большое спасибо, что-то получилось с MDI, но не получается ограничить форму панели в перемещении, лучше всего вообще запретить ее перемещать, должно упираться в главную форму, чтобы выглядело так:







Но вот что получается:







Все свойства форм, связанных с изменением размеров и скроллами поотключал, откуда появляются эти полосы прокрутки не могу понять.

Код написал такой:

this.IsMdiContainer = true;

Form2 FormPanel = new Form2();

FormPanel.MdiParent = this;

FormPanel.Anchor = (AnchorStyles.Bottom | AnchorStyles.Left);

FormPanel.Location = new Point(0, 275);

FormPanel.Show();

Если можешь, – дай пример кода использования UserControl для этой цели, пробовал, но что-то совсем не то получается.



«igoriok»
12.07.2009, 14:51

Charismatic, скроллы появляются когда ты пытаешься перемещать внутренне окно за пределы главного окна. Не совсем понятно что ты хочешь сделать. Если ты хочешь добавлять другие контролы на форму, лучше поместить их в какой-нибудь контейнер типа Panel и прикрепить этот контейнер к какой нибудь стенке (свойство Dock).





Если хочешь ограничить перемещение дочерних окон, придётся это сделать руками в коде.



Charismatic
12.07.2009, 21:15

скроллы появляются когда ты пытаешься перемещать внутренне окно за пределы главного окна.

Я почему-то думал, что появление скролов можно отключить.

Если хочешь ограничить перемещение дочерних окон, придётся это сделать руками в коде.

Это тоже думал не требует ручных манипуляций. Сильно уж задача тривиальная.

В общем понятно, контейнера то такое, важно было с формами разобраться… сенк за помощь.



«igoriok»
07.10.2009, 10:12

Никто случайно не знает как сделать Binding в XAML к методу другого контрола? Гугл и мсдн говорят только про объект из ресурсов или статический метод класса через ObjectDataProvider :sad:



Unknown_2
14.01.2010, 08:32

Гугл и мсдн говорят…..

не верить гуглу и мсдн’у – смертный грех! ;)

(на правах up’a)



mmx
14.01.2010, 17:34

Кто какой ORM пользуется на работе ? (или не пользуется вообще)



Найти информацию?

Используйте форму ниже, чтобы начать поиск по сайту:

Не нашли то что искали? Напишите мне на почту, возможно я помогу найти Вам необходимую информацию!

Сыылки на полезные сайты!

Тут будут публиковаться ссылки на интересные ресурсы по теме...