01/10/2018, 08:20

Lỗi khi thêm 1 column vào trong ma trận

E có đoạn code sau dùng để thêm dòng/cột vào ma trận cho trước:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void FillOut(int **, int, int); // File out matrix automatically
void Output(int **, int, int); // Show matrix on screen
void SwapRows(int *, int *, int); // Swap two rows
void ValueSwap(int *, int *); // Swap two values
void AddRows(int ***, int *, int, int *, int); // Insert a row in the matrix
void AddColumns(int ***, int, int *, int *, int); // Insert a column in the matrix

void FillOut(int **arr, int rows, int columns)
{
    for (int i = 0; i < rows * columns; ++i) {
        *(*(arr + i / columns) + i % columns) = 1 + rand() % 100;
    }
}

void Output(int **arr, int rows, int columns)
{
    for (int i = 0; i < rows * columns; ++i) {
        printf("%5d", *(*(arr + i / columns) + i % columns));
        if ((i + 1) % columns == 0)
            printf("
");
    }
}

void SwapRows(int *arr1, int *arr2, int size)
{
    for (int i = 0; i < size; ++i) {
        int Temp = arr1[i];
        arr1[i] = arr2[i];
        arr2[i] = Temp;
    }
}

void ValueSwap(int *a, int *b)
{
    int Temp = *a;
    *a = *b;
    *b = Temp;
}

void AddRows(int ***arr, int *rows, int columns, int *insert_array, int rows_index)
{
    *arr = (int **)realloc(*arr, (*rows + 1) * sizeof(int *));
    (*arr)[*rows] = (int *)calloc(columns, sizeof(int));
    for (int i = 0; i < columns; ++i)
        *(*(*arr + *rows) + i) = *(insert_array + i);
    for (int i = *rows; i > rows_index; --i) {
        SwapRows((*arr)[i], (*arr)[i - 1], columns);
    }
    ++(*rows);
}

void AddColumns(int ***arr, int rows, int *columns, int *insert_array, int columns_index)
{
    for (int i = 0; i < rows; ++i) {
        (*arr)[i] = (int *)realloc((*arr)[i], (*columns + 1) * sizeof(int));
        (*arr)[*columns] = insert_array[i];
    }
    for (int i = 0; i < rows; ++i) {
        for (int j = *columns; j > columns_index; --j) {
            ValueSwap(&(*arr)[i][j], &(*arr)[i][j - 1]);
        }
    }
    ++(*columns);
}

int main()
{
    srand(time(NULL));
    int rows, columns;
    printf("Type the number of row and column: ");
    scanf("%d %d", &rows, &columns);
    // allocate 2D array (level 2-pointer)
    int **arr = (int **)calloc(rows, sizeof(int *));
    for (int i = 0; i < rows; ++i) {
        arr[i] = (int *)calloc(columns, sizeof(int));
    }
    printf("Current matrix:
");

    FillOut(arr, rows, columns);
    Output(arr, rows, columns);

    int *insert_array = (int *)calloc(columns, sizeof(int)); // This array contains "rows" integer elements to add to the matrix
    for (int i = 0; i < columns; ++i)
        *(insert_array + i) = 1 + rand() % 100;
    int rows_index; // Denoting the position of row to add
    // Checking if row index is not valid
    do {
        printf("Type the number of row's index: ");
        scanf("%d", &rows_index);
        if (rows_index > rows)
            printf("Row's index is invalid. Please check again!
");
    } while (rows_index > rows);

    AddRows(&arr, &rows, columns, insert_array, rows_index);
    printf("New matrix:
");
    Output(arr, rows, columns);

    int *insert_array2 = (int *)calloc(rows, sizeof(int)); // This array contains "columns" integer elements to add to the matrix
    for (int i = 0; i < rows; ++i) {
        *(insert_array2 + i) = 1 + rand() % 100;
    }
    int columns_index; // Denoting the position of column to add
    // Checking if column index is not valid
    do {
        printf("Type the number of column's index: ");
        scanf("%d", &columns_index);
        if (columns_index > columns)
            printf("Column'index is invalid. Please check again!
");
    } while (columns_index > columns);

    AddColumns(&arr, rows, &columns, insert_array2, columns_index);
    printf("New matrix:
");
    Output(arr, rows, columns);
    // Free pointer
    free(insert_array);
    free(insert_array2);
    for (int i = 0; i < rows; ++i) {
        free(arr[i]);
    }
    free(arr);
    return 0;
}

Khi thêm 1 cột vào thì vẫn được nhưng các giá trị của cột đó đều bằng 0 hết !!!

Ai tìm giúp e cái lỗi với ạ, em cảm ơn nhiều

Nguyễn Duy Hùng viết 10:22 ngày 01/10/2018

nhìn Code bạn mình muốn khóc luôn ấy T.T. Hy vọng sau này bạn chuyển sang dùng vector cho gọn.

Long Dragon viết 10:33 ngày 01/10/2018

Dạ C++ em biết sơ sơ vài cái như nhập xuất, vòng lặp đồ thôi chứ ko rành, em chủ yếu code C thôi anh
Anh rảnh giúp e với ạ

rogp10 viết 10:33 ngày 01/10/2018

Góp ý: vòng lặp thứ 2 của AddRows thì chỉ cần sửa mảng con trỏ 1D là được.
Vòng lặp thứ 2 của AddCols thay vì chạy theo cột thì nên chạy theo dòng.

Lỗi này bạn chạy debug vậy nhé (đặt bp ngay chỗ ValueSwap)

Long Dragon viết 10:31 ngày 01/10/2018

Góp ý: vòng lặp thứ 2 của AddRows thì chỉ cần sửa mảng con trỏ 1D là được.

Là sao anh ? Hàm AddRows em thấy chạy bình thường mà ?

Vòng lặp thứ 2 của AddCols thay vì chạy theo cột thì nên chạy theo dòng.

Em chưa hiểu ý anh lắm

Lỗi này bạn chạy debug vậy nhé (đặt bp ngay chỗ ValueSwap

Cái trình debug của CB nó dở nên em debug cỡ nào cũng ko phát hiện lỗi anh ơi, còn VS thì mỗi lần bật lên là 100% CPU, RAM gần 90% máy lag luôn

viết 10:29 ngày 01/10/2018

bỏ vô C++ compiler nó báo lỗi ngay lúc biên dịch mà:

(*arr)[*columns] = insert_array[i];
invalid conversion from ‘int’ to ‘int*’ [-fpermissive]

Long Dragon viết 10:23 ngày 01/10/2018

Thay bằng (*arr)[i][*columns] đúng ko anh ?
Thế mà CB nó ko báo lỗi mới đau

viết 10:31 ngày 01/10/2018

đúng rồi, thêm có 3 ký tự =) Chắc xài trình dịch C nó cho phép…

biên dịch bằng gcc nó cho có 1 dòng warning:
warning: assignment makes pointer from integer without a cast [-Wint-conversion]|

rogp10 viết 10:32 ngày 01/10/2018

Câu này (tức là không nên duyệt theo cột ah’). Giải thích ra nữa thì thành ra nói trật nên thôi.

Long Dragon viết 10:29 ngày 01/10/2018

(tức là không nên duyệt theo cột ah’)

Nếu ko duyệt theo cột thì duyệt ntn anh ? E chưa hiểu lém @@

Bài liên quan
0