[英]2 Dimensional Array sorting in 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数组。
执行打印语句时出现分段错误。 我认为我的排序代码是正确的,因为它与我用于一维数组的代码相似,并且我认为其他所有内容均已正确分配。
因此,罪魁祸首将是我的临时变量。 我经历了尝试为它赋值,尝试更改类型,并考虑到2d数组会衰减为指针,但实际上并不是指针。
我得出的结论是,这是一个动态分配问题。 有人可以帮忙解决这个问题吗? 我已经用尽了我的知识并陷入困境。
澄清一下:我决定打印temp变量,因为我认为它会提供一些信息。 主要问题是交换不起作用,当我最初尝试打印出board [] []时,我仍然留下未排序的数组。 我知道该董事会是我应该打印的。
感谢您的任何帮助!
您将一个int值分配给temp
temp = board[z][i]; // Temp now is a what ever value was at
// That location in the array e.g. 42
然后,将temp视为整数数组内存中的地址
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]);
需要注意的一件事是,如果排序算法正确,那么只有在发生交换的情况temp
才将变量temp
赋给该变量,而这仍然是对应于分类板的输入可能发生的情况。
但更重要的是,变量temp
在交换期间用作int
。 后来,该整数值在表达式temp[1][0]
和temp[1][1]
解释为指针,这在所有情况下都不是有效地址。 您可能需要将temp
更改为:
int temp;
并弄清楚您要打印什么。 如果它是两个交换值之一(对于循环中的最后一个交换对),则将其打印为:
printf("%d", temp);
否则,您将不得不根据您真正想做的事情添加逻辑。
请注意,此算法的单次传递不会执行完整的排序,但是我想这就是您说所提供的代码不完整的原因之一。
像这样吗
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.