Преобразование кода C в C # - массивы в качестве параметров - PullRequest
1 голос
/ 30 декабря 2010

Я застрял на рекурсивной функции в коде C (я не писал код C).Вот фрагмент, который я конвертирую:

int makeroad(float x1, float y1, float x2, float y2, float var, float X[], float Y[], float prec)
{
//stuff
k+=makeroad(x,y,x2,y2,var,X+k,Y+k,prec);
}

Я не совсем уверен, что это делает.Это единственная функция в коде C с таким именем, так что это не проблема перегрузки.Когда он рекурсивно вызывает себя, он добавляет k в массивы X и Y.Помещение в C # выглядит следующим образом:

int makeroad (float x1, float y1, float x2, float y2, float var, float[] X, float[] Y, float prec)
    {
      //stuff
      k += makeroad(x, y, x2, y2, var, X + k, Y + k, prec);
    }

И Visual Studio сообщает мне, что X + k и Y + k недопустимы.Исходный код C компилируется и отлично работает в Visual C ++ Express 2010. Я не думаю, что была путаница между переменными x и y верхнего и нижнего регистра соответственно.Если так и было, код работает по счастливой случайности.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 30 декабря 2010

В C вы можете «сделать» массив без первых k элементов из существующего, просто передав указатель на k-й элемент (т. Е. array+k), поскольку массивы в C передаются, передавая местоположениеих первый элемент (такой «новый» массив вообще не будет новым, поскольку он будет ссылаться на те же элементы «оригинального»).

В C # это не работает, так как массив не являетсяне обрабатывается просто как указатель на непрерывную память;если вам нужно быстрое исправление, вы можете создать новый массив, скопировать элементы из k-го в конец с помощью Array.Copy, а затем передать этот новый массив в рекурсивную функцию, но это медленно и не работает, еслиалгоритм модифицирует элементы массива (изменения не будут отражены в других массивах, поскольку теперь они являются копиями).

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

0 голосов
/ 30 декабря 2010

X + k и Y + k - указатели на массив. Это позволяет вам «пропустить» части начала массива в вызываемой функции.

Вы можете смешивать код C с другим кодом CLR, так что вам не нужно его преобразовывать.

Если вы действительно чувствуете, что вам нужно, вы можете просто передать X, Y и k и переписать «материал», чтобы использовать k в качестве начального смещения в X и Y. Автор в этом случае очень эффективно использует C, и это затрудняет перенос на другой язык.

0 голосов
/ 30 декабря 2010

Массивы передаются по ссылке в C, поэтому фактической передачей является указатель на начало массива.Когда вы передаете, например, «X + k», вы передаете указатель на подмассив, начинающийся с k.

Я понятия не имею, что C # делает с параметрами массива, и я не хочу.

...