我正在尝试对结构数组进行合并排序,我遇到了许多不同的段错误,但目前它发生在 arrayCopy 函数中:
void arrayCopy(item10array dest[], item10array src[], const int lenght, const int leftShift) {
for(int i = 0; i < lenght; i++) {
structCopy(dest[i], src[leftShift + i]);
}
}
我改变了一些小事情,直到我将段错误推入函数 arrayCopy 中,我不明白是什么导致了错误。
typedef struct
{
char Nome[50]; //vem do ficheiro ruas.txt
unsigned int int_arr[6];
char char_arr[6];
}Arteria;
typedef struct
{
Arteria arteria;
int cont;
}item10array;
void structCopy(item10array dest, item10array src) {
strcpy(dest.arteria.Nome, src.arteria.Nome);
for(int j = 0; j < 6; j++) {
dest.arteria.int_arr[j] = src.arteria.int_arr[j];
dest.arteria.char_arr[j] = src.arteria.char_arr[j];
}
dest.cont = src.cont;
}
void arrayCopy(item10array dest[], item10array src[], const int lenght, const int leftShift) {
for(int i = 0; i < lenght; i++) {
structCopy(dest[i], src[leftShift + i]);
}
}
void mergeSorted(item10array *array, const int l, const int m, const int r) {
int left_lenght = m - l + 1;
int right_lenght = r - m;
item10array temp_left[left_lenght];
item10array temp_right[right_lenght];
int i, j, k;
arrayCopy(temp_left, array, left_lenght, l);
arrayCopy(temp_right, array, right_lenght, m + 1);
for (i = 0, j = 0, k = l; k <= r; k++) {
if ((i < left_lenght) && (j >= right_lenght || temp_left[i].cont <= temp_right[j].cont)) {
structCopy(array[k], temp_left[i]);
i++;
}
else {
structCopy(array[k], temp_right[j]);
j++;
}
}
}
void sortRecursion(item10array *arrray, int l, int r) {
//isto é desnecessario mas dá me paz de alma
if(r <= 1)
return;
if(l < r) {
//encontrar o meio do array
int m = l + (r - l) / 2;
sortRecursion(arrray, l, m);
sortRecursion(arrray, m + 1, r);
mergeSorted(arrray, l, m, r);
}
}
void sortItem10(item10array *rua, int lenght) {
sortRecursion(rua, 0, lenght - 1);
}
void item10letra(Arteria* origin_ptr) {
item10array rua[345] = {{"0", 0, 0, 0}};
for (int i = 0; i < 345; i++) {
rua[i].arteria = origin_ptr[i];
}
char letra;
int cont = 0;
int lenght = sizeof(item10array) * 345;
for(int i = 0; i < 345; i++) {
rua[i].arteria = origin_ptr[i];
}
for(int i = 0; i < 345; i++) {
for(int j = 0; j < 6 && rua[i].arteria.char_arr[j] != 0; j++) {
if(rua[i].arteria.char_arr[j] == letra) {
cont++;
}
}
rua[i].cont = cont;
}
sortItem10(rua, lenght);
}
有些东西没有英文名字,那是因为我也没有英文名字。
谢谢。
这不是一个解决方案,但您根本不需要迭代数组结构成员。您可以分配结构。 (我还建议使用
size_t
类型而不是 int
)
void arrayCopy(item10array *dest, const item10array *src, const size_t lenght, const size_t leftShift)
{
for(size_t i = 0; i < lenght; i++)
{
dest[i] = src[leftShift + i];
}
}