我正在做一个函数,给定一个包含Struct Code类型元素的数组,大小和两个指针 min_index1和min_index 2,应该给出我们可以找到的数组的索引 Code类型的两个元素,其最小出现次数优于0.这是 我用于霍夫曼编码的函数之一。
如果至少有两个元素优于0,则函数返回1。 否则,它返回0.我认为该功能不起作用,但我不知道为什么!
struct Code {
struct Code* parent; // noeud du niveau du dessus
struct Code* gauche; // noeud à gauche sur le niveau du dessous
struct Code* droit; // noeud à droite sur le niveau du dessous
char caractere; // le caractère stocké dans le noeud
int nb_occurrences; // le nombre d’occurrences du caractère
int code; // le bit 0 ou 1 pour aller du parent au noeud
};
int get2Min(struct Code code[], int taille, int *min_index1, int *min_index2) {
char car_a_pas_regarder; /* Allows me to avoid some elements of the array if I want to */
int occurence_min = 0, i = 0, j;
while ((occurence_min == 0) && (i < taille) ) {
if (code[i].nb_occurrences > 0) {
occurence_min = code[i].nb_occurrences;
min_index1 = &i;
car_a_pas_regarder = code[i].caractere;
i++;
}
else {
i++;
}
}
for (j = i; j < taille; j++) {
if (code[j].nb_occurrences < occurence_min && code[j].nb_occurrences > 0) {
occurence_min = code[j].nb_occurrences;
min_index1 = &j;
car_a_pas_regarder = code[j].caractere;
}
}
occurence_min = 0, i = 0;
while ((occurence_min == 0) && (i < taille) ) {
if (code[i].nb_occurrences > 0 && code[i].caractere != car_a_pas_regarder) {
occurence_min = code[i].nb_occurrences;
min_index2 = &i;
car_a_pas_regarder = code[i].caractere;
i++;
}
else {
i++;
}
}
for (j = i; j < taille; j++) {
if (code[j].nb_occurrences < occurence_min && code[j].caractere != car_a_pas_regarder && code[j].nb_occurrences > 0) {
occurence_min = code[j].nb_occurrences;
min_index2 = &j;
}
}
if (occurence_min > 0) {
return 1;
}
else {
return 0;
}
}
答案 0 :(得分:0)
使用min_index1 = &i;
和其他人,你正在覆盖函数参数。我认为你的意思是*min_index1 = i;
等等,将值传递给调用者。
我无法测试这个,因为问题的代码是一个不完整的例子,但我在下面评论过。
我还将代码简化为不必要复杂的代码。
struct Code {
struct Code* parent; // noeud du niveau du dessus
struct Code* gauche; // noeud à gauche sur le niveau du dessous
struct Code* droit; // noeud à droite sur le niveau du dessous
char caractere; // le caractère stocké dans le noeud
int nb_occurrences; // le nombre d’occurrences du caractère
int code; // le bit 0 ou 1 pour aller du parent au noeud
};
int get2Min(struct Code code[], int taille, int *min_index1, int *min_index2) {
char car_a_pas_regarder; /* Allows me to avoid some elements of the array if I want to */
int occurence_min = 0, i = 0, j;
while ((occurence_min == 0) && (i < taille) ) {
if (code[i].nb_occurrences > 0) {
occurence_min = code[i].nb_occurrences;
*min_index1 = i; // **corrected
car_a_pas_regarder = code[i].caractere;
}
i++; // **simplified
}
for (j = i; j < taille; j++) {
if (code[j].nb_occurrences < occurence_min && code[j].nb_occurrences > 0) {
occurence_min = code[j].nb_occurrences;
*min_index1 = j; // **corrected
car_a_pas_regarder = code[j].caractere;
}
}
occurence_min = 0, i = 0;
while ((occurence_min == 0) && (i < taille) ) {
if (code[i].nb_occurrences > 0 && code[i].caractere != car_a_pas_regarder) {
occurence_min = code[i].nb_occurrences;
*min_index2 = i; // **corrected
car_a_pas_regarder = code[i].caractere;
}
i++; // **simplified
}
for (j = i; j < taille; j++) {
if (code[j].nb_occurrences < occurence_min && code[j].caractere != car_a_pas_regarder && code[j].nb_occurrences > 0) {
occurence_min = code[j].nb_occurrences;
*min_index2 = j;
}
}
return occurence_min > 0; // **simplified
}