Чтение C ++ кода функции CreateFrame (с точки зрения C #) - PullRequest
1 голос
/ 18 августа 2010
// Create test video frame
void CreateFrame(char * buffer, int w, int h, int bytespan)
{
  int wxh = w * h;
  static float seed = 1.0;
  for (int i = 0; i < h; i ++)
  {
    char* line = buffer + i * bytespan;
    for (int j = 0; j < w; j ++)
    {
      // RGB
      line[0] = 255 * sin(((float)i / wxh * seed) * 3.14);
      line[1] = 255 * cos(((float)j / wxh * seed) * 3.14);
      line[2] = 255 * sin(((float)(i + j) / wxh * seed) * 3.14);
      line += 3;
    }
  }
  seed = seed + 2.2;
}

Может ли кто-нибудь высказать мне, что такое line += 3; для?

и как создать аналог функции в C #?

Ответы [ 5 ]

5 голосов
/ 18 августа 2010

line += 3 увеличивает указатель line на 3 байта, чтобы он указывал на следующий пиксель.line здесь указатель на 3-байтовый пиксель, поэтому его действительно следует называть как-нибудь еще, например pPixel.

3 голосов
/ 18 августа 2010

Линия - указатель на позицию в буфере.Инкрементная строка ускоряет обработку вниз по буферу.

Аналог AC # может быть:

static float seed = 1.0f;
static void CreateFrame(byte[] buffer, int w, int h, int bytespan)
{
  int wxh = w * h;
  for (int i = 0; i < h; i ++)
  {
    int line = i * bytespan;
    for (int j = 0; j < w; j ++)
    {
      // RGB
      buffer[line + 0] = (byte)(255 * Math.Sin(((float)i / wxh * seed) * 3.14));
      buffer[line + 1] = (byte)(255 * Math.Cos(((float)j / wxh * seed) * 3.14));
      buffer[line + 2] = (byte)(255 * Math.Sin(((float)(i + j) / wxh * seed) * 3.14));
      line += 3;
    }
  }
  seed = seed + 2.2f;
}
1 голос
/ 18 августа 2010

Вы должны заменить указатель байтовым массивом и индексировать его целым числом следующим образом:

// Create test video frame
void CreateFrame(byte[] buffer, int w, int h, int bytespan)
{
  int wxh = w * h;
  static float seed = 1.0;
  for (int i = 0; i < h; i ++)
  {
    int line = i * bytespan;
    for (int j = 0; j < w; j ++)
    {
      // RGB
      buffer[line + 0] = 255 * sin(((float)i / wxh * seed) * 3.14);
      buffer[line + 1] = 255 * cos(((float)j / wxh * seed) * 3.14);
      buffer[line + 2] = 255 * sin(((float)(i + j) / wxh * seed) * 3.14);
      line += 3;
    }
  }
  seed = seed + 2.2;
}

Я просто оставил имя переменной как line, даже если из того, что я понимаю, на самом деле это не строка.

1 голос
/ 18 августа 2010

В C / C ++ значение line в строке фактически является адресом памяти массива, а line[1] фактически представляет значение по адресу переменной line плюс смещение на 1 элемент.(Если тип элементов в line является int, то это означает адрес line плюс четыре байта; поскольку это char, это означает адрес line плюс один байт.)

Итак, line += 3 означает, что line[1] теперь эквивалентно [old "line" value][4].Кодировщик мог написать код как:

for (int j = 0; j < w; j ++)
{
  // RGB
  line[(3 * j)] = 255 * sin(((float)i / wxh * seed) * 3.14);
  line[(3 * j) + 1] = 255 * cos(((float)j / wxh * seed) * 3.14);
  line[(3 * j) + 2] = 255 * sin(((float)(i + j) / wxh * seed) * 3.14);
}
1 голос
/ 18 августа 2010

Это арифметика указателя.Поскольку вы имеете дело с 3 элементами массива за один раз, вам необходимо соответствующим образом обновить указатель, иначе вы будете читать одно и то же местоположение дважды и, конечно, ошибочно.

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