将C代码转换为c#,无法理解C中的某一行

本文关键字:一行 转换 代码 | 更新日期: 2023-09-27 18:03:19

所以,我有一些C代码的bitonic排序,我正试图将该代码转换为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);
    }

调用merge_down((arr+i+s), s);

具体来说,是arr+i+s。Arr是数组,但是+i+s在做什么呢?我真的很感激你的帮助。

-编辑:我应该加上我在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;
            }
        }

将C代码转换为c#,无法理解C中的某一行

指针运算。arr是指向数组开头的指针,因此它基本上与创建指向arr[i+s]的指针相同。

c#中不支持

指针运算(unsafe代码除外)。要将此代码转换为c#,您必须创建一个新数组以传递给mergeDown或更改mergeDown的签名以接受startIndex参数。或者,您可以让mergeDown接受IEnumerable<T>ArraySegment<T>,并使用@JimBalter的答案。

我应该加上我在c#中所做的那部分。这是我得到的:

   ...
   mergeUp(arr, s);
   mergeDown(arr, s);

你想要的是

   mergeUp(arr.Take(i), s);
   mergeDown(arr.Take(i+s), s);

或者最好使用ArraySegment<T>。参见c#中的数组切片