![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| magesi |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: нет Всего: -4 |
Привет всем!
Я пытаюсь имплементировать алгоритм Кнута-Морриса-Пратта ( далее КМП ) на C# по аналогии с реализацией на чистом Си. Про RegEx, ручную работу памяти и прочее не рассказывать мне , пожалуйста а в понимании работы с указателями именно на Шарпе, а также работы с памятью с изучением именно этих особенностей. Привожу код на Шарпе и Си с реализацией КМП: C#
C++
На Си все идеально работает и без проблем. На шарпе я получаю: NullReferenceException was handled. В строке:
С английского NullReferenceException я перевел, как исключение нулевой ссылки. Почитал в msdn про это: http://msdn.microsoft.com/ru-ru/library/sy...eexception.aspx Исключение, возникающее при попытке разыменования указателя NULL на объект. Только не пойму... Разыменовал указатель *d, но почему NULL на объект? Я же выделил память оператором new[] для указателя *d на массив int. Память выделена, то почему NULL? Потом, чтобы принудительно чистить на C#, насколько я помню, нужно вызвать метод Dispose() ( его нет для *d ), приравнять к null и вызвать GC.Collect() правильно? PS Хотя, понимаю свою ошибку... В Шарпе int*[] - я создаю массив указателей, чьи члены CLR прировняет к 0. Это сообщение отредактировал(а) magesi - 8.6.2012, 12:20 |
||||||
|
|||||||
| erm0l0v |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 11.1.2011 Репутация: 1 Всего: 1 |
Правильнее было бы работать с указателями через Marshal. Но правда есть один минус код станет менее читабельным, но тогда не будет необходимости в использовании ключевого слова unsafe
Для работы ключевого слова unsafe необходимо указать компилятору что в проекте содержится неуправляемый код. Properties->Build->Allow unsafe code
по моему M * sizeof(int) это лишнее, можно просто M. И мне не совсем понятно зачем в этой задаче использовать указатели? Dispose() - это просто функция, которая используется для освобождения ресурсов. Она автоматически вызывается в конце блока using что повышает читабельность кода. По поводу GC.Collect() я точно не уверен, но по моему он не должен удалить ваши указатели. Все таки это неуправляемый код. По всей видимости, необходимо выделить память для каждого элемента массива.
не уверен но наверно как то так. а освобождать память примерно так:
|
||||||
|
|||||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: нет Всего: -4 |
erm0l0v, спасибо за качественный и развернутый ответ
|
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
а для чего, если не секрет? переписал бы уже полностью на шарп. без красивых плюшек но и без "указателей". они все равно будут, так как ссылочные типы никуда не деваются, но будет уже именно шарп и будут именно шарповые ссылочные типы, а не кусок си завернутый в шарп. |
|||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: нет Всего: -4 |
типичный русский вопрос "для чего" для более лучшего понимания всех тонкостей Шарпа, включая и unmanaged часть и не надо мне там про "переписал на Шарп", что среди шарпистов указатели и полное избежение unmanaged культируется, я знаю ссылки в шарпе, совсем не ссылки, на самом деле ( в отличии от тех же С/С++ ) там нет такого понятия, как независимая ссылка в Шарпе уровней абстракций уже столько, что понятие "ссылка" в С# уже выглядит не то, как нечто экономичное в плане ресурсов/удобств по обращению по этой ссылке... скорее правильнее "унарным оператором" назвать, а не ссылкой Это сообщение отредактировал(а) magesi - 28.6.2012, 23:33 |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
есть такой вопрос/поговорка: почему собака лижет свои яйца? потому что может! вопрос о том ссылка там или еще чего это риторика. сути это не меняет. большинство моих знакомых, категорически против использования unmanaged вставок. как то у них не сложилось. не шарповое это, больше проблем получаешь из-за него в проекте. хотя конечно все это имхо, но мне кажется уже лучше делать отдельную библиотеку на С++ и подключать. я просто пытаюсь сказать что логичнее было бы писать используя то что предоставляет платформа, не смешивая разные платформы в одном месте. а то будут появляться вопросы типа: а как мне ввернуть лампочку используя лопату? |
|||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: нет Всего: -4 |
лучше вообще шарп, джаву и всякое "не прикладное" ну да, более ручное управление тяжелее сразу
нерелевантно в данном случае, чтобы нормально тот же КМП реализовать ( в плане оптимизации ) нужно память вручную контроллировать ( в целом, как и другие классические алгоритмы, у которых есть четкая асиптота по скорости выполнения, а Шарп всю эту асиптоту сильно кривит , что любое O(n log n) станет O(n^3) вот Вам и ответ для чего, когда берешься реализовать нормально алгоритм, нужно все факторы учитывать, как: когерентность процессов, работу с потоками, памятью, а также др. оценок в шарпе с набором слоя абстракции на другой абстракции все сильно ухудиштся в плане и оптимизации и производительности, а для ряда алгоритмов это критично, если очень много данных, как несколько милионов и тут лошади яица, как Вы выразились, не лижут, скорее стрижку лобка устраивают Это сообщение отредактировал(а) magesi - 28.6.2012, 23:56 |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
))) так я ж об этом же и говорю! все совершенно верно! если нужно все это и шарп для этого не подходит то... нужно сразу взять то что подходит!!! это же очевидное решение. не нужно смешивать. я именно это и имел ввиду! |
|||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: нет Всего: -4 |
Экскалупатор, почему? И на Шарпе можно реализовать такое , если знать как управлять всем вручную и сколько требуется ресурсов на то или иное действие и что под капотом шарпа происходит, поэтому я как раз и спросил такой вопрос про unmanaged часть, такой тип указателей и прочее
Это сообщение отредактировал(а) magesi - 29.6.2012, 09:53 |
|||
|
||||
| erm0l0v |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 11.1.2011 Репутация: 1 Всего: 1 |
Да действительно на C# можно использовать неуправляемый код, но выглядит это немого коряво. Просто в действительности мест где мы можем использовать неуправляемый код не так много, например нужно вызвать какую нибудь WinAPI функцию с хитрой структурой, или написать эффективный алгоритм. И переходить ради этих мелочей на другой язык мне кажется не очень оправданно. И создать в солюшене проекты на разных языках мне кажется не лучшей идеей, особенно в корпоративных проектах.
Кстати вот неплохая статья про работу с указателями. И полезная wiki про использование WinAPI в C# и VB возможно пригодится. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |