Арифметика указателей и компилятор C#C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Арифметика указателей и компилятор C#

Сообщение Anonymous »

В целях обучения я недавно рассмотрел существующую сборку (с использованием Reflector), которая использует Win32 WriteFile. Реализация:

Код: Выделить всё

Write(IntPtr handleFile, void* bufferData, uint length){
void* buffer = bufferData
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
// This does not compile, because of the cast but also simply because void* does not have += operators (it is unknown size).
buffer += (void*)wrtn;
len -= wrtn;
}


На самом деле проблема в последних двух строках... Во-первых, компилятор жалуется что вы не можете привести uint к void*. Кроме того, просто невозможно использовать += или даже + для void*, поскольку его размер неизвестен.

Код: Выделить всё

Write(IntPtr handleFile, void* bufferData, uint length){
byte* buffer = (byte*)bufferData
while (length > 0)
{
uint wrtn;
if (!WriteFile(handle, (void*)buffer, len, out wrtn, IntPtr.Zero))
{
// Do some error handling
}
// This works! I can add to a byte*
buffer = buffer + wrtn; // I could also have used buffer += wrtn
len -= wrtn;
}
}
Приведенный выше код работает, но последние несколько строк все равно скомпилируются в:

Код: Выделить всё

buffer += (byte*)wrtn;
Я не понимаю почему и очень хотелось бы знать, почему компилятор ведет себя таким образом:
  • Почему он генерирует такое приведение (и почему не принято делать это в коде, написанном пользователем)?
  • Что случилось с операторами += на void* в первом примере? Какой исходный код сгенерировал buffer += (void*)wrtn, где buffer также void* ????


Подробнее здесь: https://stackoverflow.com/questions/166 ... p-compiler
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Арифметика указателей с указателем на член
    Anonymous » » в форуме C++
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Spoj: Простая арифметика (арита), давая неправильный ответ
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Арифметика с фиксированной точкой
    Anonymous » » в форуме Python
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • C/C ++: Арифметика указателя
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Динамические массивы и арифметика указателя
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»