2014-10-19 75 views
0

这里排序是我的(不完全的)代码2维数组在C

int rows(int board[][9]){ 
    int badUnits = 0, i = 0, n = 9, j, z = 0; 
    int (*temp)[9]; 

    //Sort each row of 2d array 
    for (z; z < n; z++){ 
     for (i; i < n; i++){ 
      for (j = i; j < n; j++){ 
       if (board[z][i] > board[z][j]){ 
        temp = board[z][i]; 
        board[z][i] = board[z][j]; 
        board[z][j] = temp; 
       } 
      } 
     } 
    } 

    printf ("%d\n", temp[1][0]); 
    printf ("%d\n", temp[1][1]); 

    return badUnits; 
} 

该函数采用一个9×9阵列的段。

执行打印语句时出现分段错误。 我相信我的排序代码是正确的,因为它与我用于1d阵列的类似,并且我认为其他所有内容都正确分配了。

所以罪魁祸首是我的临时变量。我已经完成并试图给它赋值,尝试改变类型,并考虑到二维数组衰减成一个指针,但实际上并不是一个指针。

我留下的结论是,这是一个动态分配问题。有人可以请帮助我解决这个问题吗?我已经用尽了我的知识库,并且陷入困境。

澄清:我决定打印temp变量,因为我认为它会提供一些信息。主要问题是交换不能正常工作,当我最初尝试打印板[] []时,我仍然留下未排序的数组。我知道那个纸板就是我所支持的印刷品。

谢谢你的帮助!

+1

如果发生交换(对于排序后的输入,情况并非如此),那么'temp'将只被赋值。如果你的棋盘是9x9,你为什么要在_less_' n = 8'(即.max'z,i,j'将是7)处停止循环? – SleuthEye 2014-10-19 23:16:10

+0

将n设置为9,非常感谢。 – mrybak834 2014-10-19 23:23:31

+1

此外,为什么你不声明'temp'作为'int temp',因为你在交换过程中存储'int's在这个变量中(这与printf不一致)? – SleuthEye 2014-10-19 23:26:51

回答

0

需要注意的一件事是,如果排序算法正确,那么变量temp只会在交换发生时才会被分配,而排序算法仍然是对应于已排序板子的输入可能发生的情况。

但更重要的是,变量temp在交换过程中用作int。稍后,该整数值将被解释为表达式temp[1][0]temp[1][1]中的指针,该表达式在所有可能情况下均不是有效地址。您可能要更改temp声明为:

int temp; 

,并找出你想打印什么。如果是任何两个交换价值之一是(在循环的最后交换对),那么你将打印为:

printf("%d", temp); 

否则,你就必须根据你真的想添加什么逻辑去做。

请注意,此算法的单个传递不会执行完整的排序,但我想这就是您说所提供的代码不完整的原因之一。

1

您的int值分配给临时

temp = board[z][i]; // Temp now is a what ever value was at 
        // That location in the array e.g. 42 

然后,您可以把温度,就好像它是一个整数数组

temp[1][1] // treat temp as a pointer and find the integer 
      // 10 integers further along then temp. 

而且有时气温会不会被初始化的内存地址(从来没有分配给)在这种情况下,你会得到意想不到的行为取决于最新的值存储在什么温度现在(让我们称之为随机数)。

您是否想要输出板上的值?

printf ("%d\n", board[1][0]); 
printf ("%d\n", board[1][1]); 
0

是这样的吗?

#include <stdio.h> 
#include <stdlib.h> 


void printArray(int** arr, int w, int h) { 
    for (int i = 0; i < w; ++i) { 
    for (int j = 0; j < h; ++j) { 
     printf("%d ", arr[i][j]); 
    } 

    printf("\n"); 
    } 
} 

void sortArray(int** arr, int w, int h) { 
    for (int row = 0; row < h; ++row) { 
    for (int col = 0; col < w; ++col) { 

     for (int i = 0; i < w; ++i) { 
     if (arr[row][i] > arr[row][col]) { 
      int tmp = arr[row][col]; 

      arr[row][col] = arr[row][i]; 
      arr[row][i] = tmp; 
     } 
     } 
    } 
    } 
} 

int main() { 
    int w = 9, h = 9; 
    int** arr = (int**)malloc(sizeof(int*) * w); 
    for (int i = 0; i < w; ++i) { 
    arr[i] = (int*)malloc(sizeof(int) * h); 

    for (int j = 0; j < h; ++j) { 
     arr[i][j] = rand() % 10; 
    } 
    } 

    printf("Unsorted:\n"); 
    printArray(arr, w, h); 

    sortArray(arr, w, h); 

    printf("Sorted:\n"); 
    printArray(arr, w, h); 

    for (int j = 0; j < h; ++j) { 
    free(arr[j]); 
    } 
    free(arr); 

    return 0; 
}