Вниз  C / C++
- 5.09.2012 / 13:36
ScRoLiS
  Пользователь

ScRoLiS 
Сейчас: Offline
gtasase, С каких пор ты решаешь что я знаю а что не знаю?
Бан от aNNiMON:
Причина: оффтоп
__________________
 Чпок... Добрый вечер!
- 5.09.2012 / 19:22
beginner
  Пользователь

beginner 
Сейчас: Offline
Как в MessageBox во второй или третий параметр вставить цыферку (int или float без разницы) ???
p.s. Я имею ввиду переменную со значением каким небдь.

Изменено beginner (5.09 / 19:25) (всего 4 раза)
- 5.09.2012 / 20:34
Freddy
  Пользователь

Freddy 
Сейчас: Offline
beginner, язык какой и какой метод имеешь в виду?
- 5.09.2012 / 21:17
beginner
  Пользователь

beginner 
Сейчас: Offline
Freddy, C++ MessageBox(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
- 5.09.2012 / 23:10
Freddy
  Пользователь

Freddy 
Сейчас: Offline
beginner, во втором и в третьем параметрах требуется строка, целое число переводится в строку функцией itoa.
- 7.09.2012 / 20:56
beginner
  Пользователь

beginner 
Сейчас: Offline
Freddy, А по другому никак ?
- 7.09.2012 / 21:35
Freddy
  Пользователь

Freddy 
Сейчас: Offline
beginner, там ведь требуются строки.
- 18.09.2012 / 19:15
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Указатели в C#

Автор: Александр Игнатьев
Источник: http://www.daoto.net/, http://docs.com.ru/

Одним из преимуществ старого (неуправляемого) C++ - был прямой доступ к памяти, обеспечиваемый механизмом указателей. Это позволяло создавать высокпроизводительные приложения и являлось головной болью многих программистов. По себе знаю насколько было проблемно работать с ними. Многие программисты считают, что в C# не поддерживаются указатели. И называют это одним из его достоинств, позволяющим создавать безопасный, легко сопровождаемый код. На самом деле в C# есть указатели, просто работа с ними несколько затруднена и ограничена по сравнению с C++.

Код, использующий указатели, должен компилироваться с указанием ключа /unsafe:
  1. csc /unsafe CodeFile.cs

В Visual Studio .NET этот параметр задается в Properties проекта. На закладке Build следует установить в true параметр Allow unsafe code blocks. Кроме того, метод в котором используются указатели должен быть помечен ключевым словом unsafe.

Указатели могут объявлятся только на следующие типы:
   • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool.
   • Перичисление.
   • Определенная пользователем структура, содержащая только вышеперечисленные типы.

Указатель объявляется с помощью маркера *:
  1. int* p;
Указатель в C#, так же как и в С++ представляет собой адрес в памяти. Получить адрес переменной можно с помощью маркера &:
  1. int  i = 5;
  2. int* p = &i;[/c]
  3.  
  4. В C# также поддерживается арифметика указателей, операторы инкремента и дикремента, оператор [b][][/b]:
  5. [code]public unsafe static void Main(string[] args)
  6. {
  7.     int i = 5;
  8.     int* p1 = &i;
  9.     Console.WriteLine("{0} {1} {2}", i, *p1, p1[0]);
  10.     //Out: 5, 5, 5
  11.  
  12.     //следующие два присваивания равносильны
  13.     p1[1] = 6;
  14.     *(p1+1) = 6;
  15.  
  16.     int* p2 = p1+1;
  17.     Console.Write("{0} {1}", *p2, p2[0]);
  18.     Console.WriteLine("{0} {1}", *(p1+1), p1[1]);
  19.     //Out: 6 6 6 6
  20.  
  21.     p1++;
  22.     Console.Write("{0} {1} {2}", *p1, *p2, p1[-1]);
  23.     //Out: 6 6 5
  24. }
Я думаю, понятно почему этот код называется опасным (unsafe). Где гарантия, что по измененному нами адресу p1+1 не содержалась важная информация?

Для выделения памяти используется конструкция stackalloc T[E] (правда, напоминает malloc в С?), где T - один из вышеперечисленных типов. Эта конструкция резервирует память размером E*sizeof(E):
  1. int* pArr = stackalloc int[10];

Кроме того, указатели могут быть в качестве принимаемых и возвращаемых значаний функции:
  1. public unsafe int* func(int* p, int i)
  2. {
  3.     *p = i;
  4.     return p;
  5. }

Конструкция fixed

При обращении к массиву в .NET проводится проверка индексов, что может привести к значительно снижению производительности. К примеру время рассчета одной механической модели методом Либмана:

  1. C++     (VC++ 6.0)    1410 мс
  2. C#       (safe)          2910 мс
  3. C#       (unsafe)       1560 мс
  4. Java                       3100 мс

Как видите, отказ от проверки допустимости значений индекс дал выигрыш практически в 2 раза. И C# практически догнал по производительности C++. И это в реализации численного метода! Это говорит о высокой производительности C#.

Быстрый доступ к элементам массива (без проверки допустимости индексов) осуществляется следующим образом:
  1. int[] narr = new int[100];
  2. //объявляем указатель на первый элемент массива
  3. int* p = &narr[0];
  4. //и так можно:
  5. //int* p = narr;
  6. //теперь мы можем обратиться к любому элементу массива вот так
  7. p[10]=p[9]+1;
  8. //и без проверки границ!
  9. //так что за последствия следующего кода будете отвечать сами:
  10. p[200]=100;

А теперь представьте, объявили вы указатель на массив, работаете с ним. И тут запускается сборщик мусора, очищает память, деврагметирует ее. Интересно, а где теперь находится ваш массив? А кто его знает... Зато указатель указвает туда же. И все... Приехали. Дальше вы будете долбать данные своей проги, пока не нарветесь на исключение, а то вообще не нарветесь. Просто получите неверный результат, что гораздо хуже.

Вот для таких ситуаций и создана конструкция fixed:
  1. fixed(int* p = narr)
  2. {
  3.     //а тут мы спокойно работаем с нашм указателем
  4.     //сборщик мусора шаш массив не тронет...
  5. }

А как же быть с многомерыми массивами? А только так:
  1. int Nx = 10, Ny = 15;
  2. double[,] darr = new dpuble[Nx, Ny];
  3. fixed(double* p = &darr[,])
  4. {
  5.     //обращаемся к элементу darr[5,4]
  6.     double d = p[5*Ny + 4];
  7. }
К сожалению именно так. А с jagged-массивами (double[][]) даже так не проходит...

Как видите, C# не очень хорошо приспособлен для работы с указателями. Да и в большинстве случаев можно обойтись без них, но если уж приспичит... Мне вот они понадобились...

Изменено XakepPRO (18.09 / 19:17) (всего 1 раз)
- 18.09.2012 / 19:25
Oak
  Пользователь

Oak 
Сейчас: Offline
XakepPRO, ну нафига ты всё это сюда скопировал?

Если тебе понадобились указатели, то значит, ты использовал До-Диез не по назначению)
__________________
 Эль Презеденте

Изменено Oak (18.09 / 19:25) (всего 1 раз)
- 18.09.2012 / 19:59
XakepPRO
  Модератор форума

XakepPRO 
Сейчас: Offline
Oak, необходима работа со структурами (библиотеки), заодно заховал и указатели.
Наверх  Всего сообщений: 2777
Фильтровать сообщения
Поиск по теме
Файлы топика (111)