Рейтинг:
6
OriginalGriff
Во-первых, это не будет компилироваться: и C, и C# чувствительны к регистру, так что Void
это не то же самое, что void
- вы хотите второе, а не первое.
Во-вторых, вы не хотите конвертировать этот код в C#, даже немного. Это использование указателей, а указатели в C# очень, очень сложны в использовании - и это преднамеренно. Как новичок, вы не должны приближаться к указателям в C#!
И без указателей, есть прямой эквивалент в C код в C#, так что wsave + n
возвращает ли это указатель на двойное n мест в массиве или удваивает его wsave
ссылается на, и без указателей нет прямого способа сделать это: вы не можете ссылаться на массив в C# из любой точки, кроме начала, не копируя его, и это совсем не то же самое.
Мне очень жаль, но вам придется вернуться ко всему коду C, точно определить, что он делает в деталях, и разработать новое приложение C#, чтобы сделать то же самое с использованием структур данных C#. перевод его не приведет к созданию "хорошей программы на C#" - если это вообще возможно без использования небезопасного кода.
Member 14718560
Сэр, если я заменю этот массив обычным массивом (double[] wsave), можете ли вы сказать мне, каков будет результат этого утверждения (wsave+n), учитывая n=10 и размер массива =3?
Правда ли это:
wsave[0]=3
wsave[1]=3
wsave[2]=3
OriginalGriff
Ошибка компиляции в C#.
Перестаньте предполагать, что C# - это надмножество C или что "они в основном одинаковы". Это не так, и особенно когда вы начинаете с указателей C, вы не можете просто перевести код - он должен быть переработан, чтобы работать вообще, не говоря уже о том, чтобы хорошо.
You can think of C# References as "pointers on steroids" but they aren't - they are a very different thing, and some of the thinks you can do with pointers just won't work in C# because if they did they could cause real problems. In C, wsave + n is legal, because C supports pointer arithmetic and returns a pointer to a "new array" which happens to be a portion of the original. You cannot do that with references in C# because if the original reference to the start of the array is discarded, the whole array can be released and destroyed at any time without warning - and then your new reference would be "hanging in midair" pointing at nowhere. This is analogous to the C problem of returning a pointer to a local variable in a function. Since local variables are created on the stack, they are deallocated when the function returns, so the pointer is referencing memory that is no longer assigned and which can be reused.
Перестаньте думать о них как об одном и том же языке и примите тот факт, что перевод не будет работать: вам нужно разработать новое приложение, основанное на функциональности старого, а не на его кодовой базе.