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++) {
        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;
            }
        }

最佳答案

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

C# 不支持指针算法(unsafe 代码除外)。要将此代码转换为 C#,您必须创建一个新数组以传递给 mergeDown或更改 mergeDown 的签名采取startIndex范围。或者,您可以制作 mergeDown接受 IEnumerable<T>ArraySegment<T>并使用@JimBalter 的回答。

关于c# - 将C代码转换为C#,无法理解C中的某一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15330181/

相关文章:

c++ - 复杂的 C 声明

java - 使用 C/C++ 或 Java 打开现金抽屉

c - C中的反射支持

c# - 将 ssh-keys 转换为 c# 格式以在 Windows (c#) 中加密并在 Linux (python/shell) 中解密

c# - 通过禁止的 IP 地址阻止对站点的访问

c# - 无法识别的标记前缀或设备筛选器 (Visual Studio 2010)

c# - ASP.NET 5 控制台应用程序 dnxcore50 缺少 `System.Net.Http' 程序集引用?

c - 将结果存储在变量中会产生奇怪的结果

c - 程序执行未按预期顺序发生

c# - 如何解决 Autofac InstancePerHttpRequest