Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C代码转换为C#,无法理解C中的某一行_C#_C - Fatal编程技术网

将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

所以,我有一些双音排序的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++) {
        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没有发布这些函数。