【发布时间】:2018-08-26 14:06:01
【问题描述】:
我尝试从 Codewars 解决这个问题,并通过编译器运行我的代码。它表明存在分段错误,但我不知道哪里出错了。问题集如下:
下图展示了如何将给定的“真实”矩形切割成正方形(“真实”矩形意味着两个维度不同)。
你能把这张图翻译成算法吗?
您将获得两个维度 - 一个正整数长度(名为 lng 的参数) 一个正整数宽度(名为 wdth 的参数)。 您将返回一个数组。
我的代码如下:
typedef struct Data Data;
struct Data {
int *array;
int sz;
};
Data* sqInRect(int lng, int wdth) {
Data* ptr = (Data*) malloc(sizeof(Data));
// if square length == square width
if(lng == wdth){
ptr->array = NULL;
ptr->sz = 0;
return 1;
}
//initialise variables
int rmdLength,rmdWidth,rmdSmallSquares,rmdLengthTimes,rmdWidthTimes,SIZE,temp=0;
//assign length to temporary rmd variable
rmdLength = lng;
//calc how many squares of side *wdth* inside rect
while((lng-wdth)>wdth){
rmdLength -= wdth;
rmdLengthTimes++;
}
rmdLength -= wdth;
rmdLengthTimes++;
//assign width to temporary rmdWidth variable
rmdWidth = wdth;
//calc how many squares of side *rmdWidth* inside rect (remaining area)
while(rmdWidth>rmdLength){
rmdWidth -= rmdLength;
rmdWidthTimes++;
}
rmdWidth -= rmdLength;
rmdWidthTimes++;
//calculate final number of remaining squares
rmdSmallSquares = rmdLength/rmdWidth;
//calculate SIZE
SIZE = rmdLengthTimes + rmdWidthTimes + rmdSmallSquares;
//declaration of array
int arr[SIZE];
//for loop to put square values in array
temp = rmdLengthTimes + rmdWidthTimes;
for(int i=0;i<rmdLengthTimes;i++){
arr[i] = wdth;
}
for(int j=rmdLengthTimes;j<temp;j++){
arr[j] = rmdLength;
}
for(int k=temp;k<SIZE;k++){
arr[k]= rmdWidth;
}
//get Data* ptr to store array AND size of that array
ptr->array = arr;
ptr->sz = SIZE;
return ptr;
}
如果有人能与我澄清我哪里出错了,我将不胜感激。我在这个问题上被困了太久了。谢谢。
【问题讨论】:
-
对于分段错误,在调试器中运行代码总是一个好的开始。它会告诉你问题发生了。
-
你的数据结构应该包含什么?您只能用 3 个不同的值填充它。
-
不会导致 SEGFAULT,陷入无限循环:
while((lng-wdth)>wdth){rmdLength -= wdth; rmdLengthTimes++;}。您永远不会更改循环条件中的变量。
标签: c arrays pointers segmentation-fault