You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改代码解决C语言隐式声明错误及语法错误?

C语言矩阵操作代码编译错误修复方案

问题描述

我编写了一段实现矩阵操作的C语言代码,编译时遇到以下错误和警告:

  1. 隐式函数声明警告:sortare_bubble、sortare_selection、sortare_insertion函数未声明;
  2. 语法错误:第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:45:34