将C代码转换为C#,无法理解C中的某一行
所以,我有一些双音排序的C代码,我正在尝试将这些代码转换成C。C代码中的一行让我很困惑。我以前从未使用过C将C代码转换为C#,无法理解C中的某一行,c#,c,C#,C,所以,我有一些双音排序的C代码,我正在尝试将这些代码转换成C。C代码中的一行让我很困惑。我以前从未使用过C void merge_up(int *arr, int n) { int step=n/2,i,j,k,temp; while (step > 0) { for (i=0; i < n; i+=step*2) { for (j=i,k=0;k < step;j++,k++) { i
void merge_up(int *arr, int n) {
int step=n/2,i,j,k,temp;
while (step > 0) {
for (i=0; i < n; i+=step*2) {
for (j=i,k=0;k < step;j++,k++) {
if (arr[j] > arr[j+step]) {
// swap
temp = arr[j];
arr[j]=arr[j+step];
arr[j+step]=temp;
}
}
}
step /= 2;
}
}
void merge_down(int *arr, int n) {
int step=n/2,i,j,k,temp;
while (step > 0) {
for (i=0; i < n; i+=step*2) {
for (j=i,k=0;k < step;j++,k++) {
if (arr[j] < arr[j+step]) {
// swap
temp = arr[j];
arr[j]=arr[j+step];
arr[j+step]=temp;
}
}
}
step /= 2;
}
}
void printArray(int *arr, int n) {
int i;
printf("[%d",arr[0]);
for (i=1; i < n;i++) {
printf(",%d",arr[i]);
}
printf("]\n");
}
int main(int argc, char **argv) {
int n, *arr, i,s;
FILE *fp = fopen(argv[1],"r");
if (fp == NULL) {
fprintf(stderr,"file not found\n");
exit(1);
}
// first line gives number of numbers to be sorted
fscanf(fp,"%d",&n);
// allocate space and read all the numbers
arr = (int *)malloc(n*sizeof(int));
for (i=0; i < n; i++) {
fscanf(fp,"%d",(arr+i));
}
// print array before
printArray(arr,n);
// do merges
for (s=2; s <= n; s*=2) {
for (i=0; i < n;) {
merge_up((arr+i),s);
merge_down((arr+i+s),s); //Having trouble with this line here.
i += s*2;
}
}
printArray(arr,n);
}
void merge\u up(int*arr,int n){
内台阶=n/2,i,j,k,温度;
同时(步骤>0){
对于(i=0;iarr[j+步长]){
//交换
温度=arr[j];
arr[j]=arr[j+步长];
arr[j+步进]=温度;
}
}
}
步骤/=2;
}
}
无效合并向下(int*arr,int n){
内台阶=n/2,i,j,k,温度;
同时(步骤>0){
对于(i=0;i 对于(s=2;s指针算术。arr
是指向数组开头的指针,因此它基本上与创建指向arr[i+s]
的指针相同
C#中不支持指针算法(在unsafe
code中除外)。要将此代码转换为C#,您必须创建一个新数组以传递到mergeDown
或更改mergeDown
的签名以获取startIndex
参数。或者,您可以使mergeDown
接受IEnumerable
或ArraySegment
并使用@JimBalter的答案。算术。arr
是指向数组开头的指针,因此它基本上与创建指向arr[i+s]
的指针相同
C#中不支持指针算法(在unsafe
code中除外)。要将此代码转换为C#,您必须创建一个新数组以传递到mergeDown
或更改mergeDown
的签名以获取startIndex
参数。或者,您可以使mergeDown
接受IEnumerable
或ArraySegment
并使用@JimBalter的答案
我应该加上我在C#中为这一部分所做的工作。这就是我得到的:
//Do merges
for (int s = 2; 2 <= n; s = s * 2)
{
for(int i = 0; i < n;){
mergeUp(arr, s);
mergeDown(arr, s);
i += s * 2;
}
}
你想要的是
mergeUp(arr.Take(i), s);
mergeDown(arr.Take(i+s), s);
或者最好使用ArraySegment
。请参阅
我应该加上我在C#中为这一部分所做的工作。这就是我得到的:
//Do merges
for (int s = 2; 2 <= n; s = s * 2)
{
for(int i = 0; i < n;){
mergeUp(arr, s);
mergeDown(arr, s);
i += s * 2;
}
}
你想要的是
mergeUp(arr.Take(i), s);
mergeDown(arr.Take(i+s), s);
或者最好使用ArraySegment
。请参见我确信这是一个重复。arr是指向内存中某个位置的指针,而在C中,数组是连续存储的。arr+I+s也是指向某个位置的指针,+运算符根据数组的类型神奇地计算位置。它本质上是从(I+s)开始的子数组th元素。arr+i+s
相当于&arr[i+s]
我确信这是重复的。arr是指向内存中某个位置的指针,在C中,数组是连续存储的。arr+I+s也是指向某个位置的指针,+运算符根据数组的类型神奇地计算位置。它本质上是从(I+s)开始的子数组th元素。arr+i+s
相当于&arr[i+s]
“基本上是一样的”--事实上arr+i+s
与&arr[i+s]
完全相同。“从技术上讲,它并不完全相同,因为每个数组元素的大小都有一些微妙之处。”--这是不正确的;这两种形式都考虑了sizeof(*arr)
“指针算法在C#中受支持”-它只在不安全的代码中受支持,这在这里肯定是不需要的,不应该被推荐。“要将此代码转换为C#,您必须创建一个新数组以传递到merge#down”--不,只有一个新的IEnumerable。一个新的数组会失败,因为它被修改了。@JimBalter谢谢。我已经很久没有做C了,我忘记了一点。我会更新我的答案。“基本上是一样的”--事实上arr+I+s
与&arr[I+s]
“从技术上讲,这并不完全相同,因为每个数组元素的大小都有一些微妙之处”——这是不正确的;这两种形式都考虑了sizeof(*arr)
“C语言支持指针算法#--它仅在不安全代码中受支持,这里肯定不需要,也不建议使用。若要将此代码转换为C#,您必须创建一个新数组以传递到merge#down中--不,只有一个新的IEnumerable。一个新的数组会失败,因为它被修改到位。@JimBalter谢谢。我已经很久没有做C了,我忘记了一点。我会更新我的答案。你必须做arr.Take(I.ToArray()
或更改mergeUp
/mergeDown
的签名以获取IEnumerable
@p.s.w.g什么签名?OP没有发布这些函数。您必须执行arr.take(i).ToArray()
或更改mergeUp
/mergeDown
的签名以获取IEnumerable
@p.s.w.g什么签名?OP没有发布这些函数。