如何修改代码解决C语言隐式声明错误及语法错误?
C语言矩阵操作代码编译错误修复方案
问题描述
我编写了一段实现矩阵操作的C语言代码,编译时遇到以下错误和警告:
- 隐式函数声明警告:
sortare_bubble、sortare_selection、sortare_insertion函数未声明; - 语法错误:第186行预期
while在void前,第325行末尾预期声明或语句。
原代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <time.h> void alocare(int ***a, int n); void citire(int **a, int n); void afisare_matrice(int**a, int n); void completare_random(int **a, int n); void sortare_bubble_crescator(int *v, int n); void sortare_selection_crescator(int *v, int n); void sortare_insertion_crescator(int *v, int n); void sortare_bubble_descrescator(int *v, int n); void sortare_selection_descrescator(int *v, int n); void sortare_insertion_descrescator(int *v, int n); void eliberare_memorie(int **a, int n); void sortare_vector(int *v, int n, bool crescator); void inverseaza_elemente_col_div_trei(int **a, int n, int *v); void meniu(int ***a, int *n); int main() { int **A = NULL, n; meniu(&A, &n); int *vector = malloc(n * sizeof(int)); if (vector == NULL) { printf("Eroare la alocarea vectorului!\n"); return 1; } inverseaza_elemente_col_div_trei(A, n, vector); sortare_vector(vector, n, false); // Sortare descrescatoare printf("Vectorul sortat descrescator este: "); for (int i = 0; i < n; i++) { printf("%d ", vector[i]); } printf("\n"); eliberare_memorie(A, n); free(vector); return 0; } void meniu(int ***a, int *n) { printf("Introduceti dimensiunea matricei patratice: "); scanf("%d", n); alocare(a, *n); int option; do { printf("\n----------Meniu----------\n"); printf("1. Crearea matricii de la tastatura\n"); printf("2. Afisarea matricii\n"); printf("3. Completare matrice cu valori aleatorii\n"); printf("4. Sortare si afisare (Bubble Sort crescator)\n"); printf("5. Sortare si afisare (Selection Sort crescator)\n"); printf("6. Sortare si afisare (Insertion Sort crescator)\n"); printf("7. Sortare si afisare (Bubble Sort descrescator)\n"); printf("8. Sortare si afisare (Selection Sort descrescator)\n"); printf("9. Sortare si afisare (Insertion Sort descrescator)\n"); printf("0. Iesire\n"); printf("Selectati o optiune: "); scanf("%d", &option); switch (option) { case 1: citire(*a, *n); break; case 2: afisare_matrice(*a, *n); break; case 3: completare_random(*a, *n); break; case 4: { int *vector = malloc(*n * sizeof(int)); if (vector == NULL) { printf("Eroare la alocarea vectorului!\n"); exit(1); } inverseaza_elemente_col_div_trei(*a, *n, vector); sortare_bubble(vector, *n, true); printf("Vectorul sortat cu Bubble Sort este: "); for (int i = 0; i < *n; i++) { printf("%d ", vector[i]); } printf("\n"); free(vector); break; } case 5: { int *vector = malloc(*n * sizeof(int)); if (vector == NULL) { printf("Eroare la alocarea vectorului!\n"); exit(1); } inverseaza_elemente_col_div_trei(*a, *n, vector); sortare_selection(vector, *n, true); printf("Vectorul sortat cu Selection Sort este: "); for (int i = 0; i < *n; i++) { printf("%d ", vector[i]); } printf("\n"); free(vector); break; } case 6: { int *vector = malloc(*n * sizeof(int)); if (vector == NULL) { printf("Eroare la alocarea vectorului!\n"); exit(1); } inverseaza_elemente_col_div_trei(*a, *n, vector); sortare_insertion(vector, *n, true); printf("Vectorul sortat cu Insertion Sort este: "); for (int i = 0; i < *n; i++) { printf("%d ", vector[i]); } printf("\n"); free(vector); break; case 7: { int *vector = malloc(*n * sizeof(int)); if (vector == NULL) { printf("Eroare la alocarea vectorului!\n"); exit(1); } inverseaza_elemente_col_div_trei(*a, *n, vector); sortare_vector(vector, *n, false); // Sortare descrescatoare printf("Vectorul sortat cu Bubble Sort descrescator este: "); for (int i = 0; i < *n; i++) { printf("%d ", vector[i]); } printf("\n"); free(vector); break; } case 8: { int *vector = malloc(*n * sizeof(int)); if (vector == NULL) { printf("Eroare la alocarea vectorului!\n"); exit(1); } inverseaza_elemente_col_div_trei(*a, *n, vector); sortare_vector(vector, *n, false); // Sortare descrescatoare printf("Vectorul sortat cu Selection Sort descrescator este: "); for (int i = 0; i < *n; i++) { printf("%d ", vector[i]); } printf("\n"); free(vector); break; } case 9: { int *vector = malloc(*n * sizeof(int)); if (vector == NULL) { printf("Eroare la alocarea vectorului!\n"); exit(1); } inverseaza_elemente_col_div_trei(*a, *n, vector); sortare_vector(vector, *n, false); // Sortare descrescatoare printf("Vectorul sortat cu Insertion Sort descrescator este: "); for (int i = 0; i < *n; i++) { printf("%d ", vector[i]); } printf("\n"); free(vector); break; } case 0: printf("Iesire din program...\n"); break; default: printf("Optiune invalida! Va rugam sa alegeti din nou.\n"); } } while (option != 0); } void alocare(int ***a, int n) { *a = malloc(n * sizeof(int *)); if (*a == NULL) { printf("Eroare la alocarea matricei!\n"); exit(1);} for (int i = 0; i < n; i++) { (*a)[i] = malloc(n * sizeof(int)); if ((*a)[i] == NULL) { printf("Eroare la alocarea matricei!\n"); exit(1); } } } void citire(int **a, int n) { printf("Introduceti elementele matricei:\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &a[i][j]); } } } void afisare_matrice(int**a, int n){ for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%i\t", a[i][j]); } printf("\n"); } } void completare_random(int **a, int n) { srand(time(NULL)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = rand() % 100; } } } void sortare_bubble_crescator(int *v, int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (v[j] > v[j + 1]) { int temp = v[j]; v[j] = v[j + 1]; v[j + 1] = temp; } } } } void sortare_selection_crescator(int *v, int n) { for (int i = 0; i < n - 1; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (v[j] < v[min_index]) { min_index = j; } } int temp = v[i]; v[i] = v[min_index]; v[min_index] = temp; } } void sortare_insertion_crescator(int *v, int n) { for (int i = 1; i < n; i++) { int key = v[i]; int j = i - 1; while (j >= 0 && v[j] > key) { v[j + 1] = v[j]; j = j - 1; } v[j + 1] = key; } } void sortare_bubble_descrescator(int *v, int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (v[j] < v[j + 1]) { int temp = v[j]; v[j] = v[j + 1]; v[j + 1] = temp; } } } } void sortare_selection_descrescator(int *v, int n) { for (int i = 0; i < n - 1; i++) { int max_index = i; for (int j = i + 1; j < n; j++) { if (v[j] > v[max_index]) { max_index = j; } } int temp = v[i]; v[i] = v[max_index]; v[max_index] = temp; } } void sortare_insertion_descrescator(int *v, int n) { for (int i = 1; i < n; i++) { int key = v[i]; int j = i - 1; while (j >= 0 && v[j] < key) { v[j + 1] = v[j]; j = j - 1; } v[j + 1] = key; } } void sortare_vector(int *v, int n, bool crescator) { if (crescator) { sortare_bubble_crescator(v, n); } else { sortare_bubble_descrescator(v, n); } } void inverseaza_elemente_col_div_trei(int **a, int n, int *v) { for (int j = 1; j < n; j++) { if ((j + 1) % 3 == 0) { for (int i = n - 1; i >= 0; i--) { v[n - 1 - i] = a[i][j]; } } } } void eliberare_memorie(int **a, int n) { for (int i = 0; i < n; i++) { free(a[i]); } free(a); }
编译错误信息
gcc /tmp/j7dLWqPHfH.c -lm /tmp/j7dLWqPHfH.c: In function 'meniu': /tmp/j7dLWqPHfH.c:76:17: warning: implicit declaration of function 'sortare_bubble' [-Wimplicit-function-declaration] 76 | sortare_bubble(vector, *n, true); | ^~~~~~~~~~~~~~ /tmp/j7dLWqPHfH.c:94:17: warning: implicit declaration of function 'sortare_selection'; did you mean 'sortare_vector'? [-Wimplicit-function-declaration] 94 | sortare_selection(vector, *n, true); | ^~~~~~~~~~~~~~~~~ | sortare_vector /tmp/j7dLWqPHfH.c:112:17: warning: implicit declaration of function 'sortare_insertion'; did you mean 'sortare_vector'? [-Wimplicit-function-declaration] 112 | sortare_insertion(vector, *n, true); | ^~~~~~~~~~~~~~~~~ | sortare_vector /tmp/j7dLWqPHfH.c:186:1: error: expected 'while' before 'void' 186 | void alocare(int ***a, int n) { | ^~~~ /tmp/j7dLWqPHfH.c:325:1: error: expected declaration or statement at end of input 325 | } | ^
错误修复步骤
1. 修复语法错误(缺失大括号)
meniu函数的case 6分支末尾缺失闭合大括号},导致代码结构完全错乱,触发第186行和第325行的语法错误。
- 找到
case 6中的break;语句后,添加一个}:
case 6: { // 原有代码 free(vector); break; } // 新增此闭合大括号
2. 修复隐式函数声明警告
代码中调用的sortare_bubble、sortare_selection、sortare_insertion三个函数并未定义,现有可用的是带_crescator/_descrescator后缀的排序函数,有两种修复方案:
方案一:直接替换调用的函数名
将meniu函数中的调用替换为已定义的升序排序函数:
- 第76行:
sortare_bubble(vector, *n, true);→sortare_bubble_crescator(vector, *n); - 第94行:
sortare_selection(vector, *n, true);→sortare_selection_crescator(vector, *n); - 第112行:
sortare_insertion(vector, *n, true);→sortare_insertion_crescator(vector, *n);
方案二:新增带方向参数的排序函数
如果想保留原调用方式,可以复用现有排序逻辑,新增以下内容:
- 在头部添加函数声明:
void sortare_bubble(int *v, int n, bool crescator); void sortare_selection(int *v, int n, bool crescator); void sortare_insertion(int *v, int n, bool crescator);
- 在代码末尾添加函数定义:
void sortare_bubble(int *v, int n, bool crescator) { crescator ? sortare_bubble_crescator(v, n) : sortare_bubble_descrescator(v, n); } void sortare_selection(int *v, int n, bool crescator) { crescator ? sortare_selection_crescator(v, n) : sortare_selection_descrescator(v, n); } void sortare_insertion(int *v, int n, bool crescator) { crescator ? sortare_insertion_crescator(v, n) : sortare_insertion_descrescator(v, n); }
内容的提问来源于stack exchange,提问作者Dan Capatina
相关产品推荐
相关产品推荐

