Hỏi về xác định số phần tử trong 1 mảng 3-4 chiều

Chào m.n, mình đang làm 1 bài tập về con trỏ. Phần hàm của mình là copy chuỗi và return chuỗi đó.

char*** kth_paragraph(char**** document, int k) {
        char ***para = (char***)malloc(sizeof(document[k-1])*sizeof(char***));
        for(int i=0;i<sizeof(document[k-1]);i++)
        {
            para[i] = (char**)malloc( sizeof(document[k-1][i]) * sizeof(char**) );
            for(int j=0;j< sizeof(document[k-1][i]);j++){
            	para[i][j] = (char*)malloc(sizeof(document[k-1][i][j]) * sizeof(char*));
                strcpy(para[i][j],document[k-1][i][j]);
			}
        }
        return para;
}

Hàm báo lỗi segment fault. Mình debug báo tại phần dynamic allocation. Mình nghĩ sai ở phần sizeof(…), và không biết có các nào khác để cấp phát cho con trỏ mới theo size của con trỏ cũ không?. Ai biết gợi ý giúp mình với.
Thanks.

Hi Harry Stormborn.
Mình chưa thấy ai lấy kích thước mảng bằng con trỏ bao giờ cõ lẽ là do mình ít code C.

1 Like

Code c xài malloc lại còn mảng 4 chiều… Thầy giáo chơi khó nhau thế

1 Like

Hi, thực ra cái mảng 3 chiều là để lưu 1 đoạn văn tương ứng: đoạn - [k], câu - [i], từ - [j].
và cái document mình truyền vào kia nó đã chia sẵn rồi. Mình muốn copy từ ****document sang ***para.
Nhưng khổ mỗi chỗ malloc kia có vẻ như dùng sizeof sẽ bị sai kết quả và vào vòng for chạy 1 hồi thì báo Segment fault @@.

Tiếc là không có cách nào để lấy size của dynamic array trong C/C++. : (
Mình nghĩ nên gán cho para trỏ trực tiếp đến document pragraph kiểu này
char ***para = document[k-1];
… mà vậy còn gọi gì là copy.
P/s: cho mình xin full đề bài, full input với :v

2 Likes

Link đề đây bạn ơi:https://www.hackerrank.com/challenges/querying-the-document/problem

Trỏ tới luôn hả. Để mình thử lại coi @@, có lẽ làm vậy nhanh hơn =))

Oh, đề có quy ước rõ ràng mà, ví dụ: “The paragraphs in the document are separated by one newline("\n")”
Thế là doable rồi

2 Likes

Ừm. Mình nghĩ gán luôn sẽ đúng. Chỉ cần hàm separated document chạy đúng là sẽ ok.

Trời @@ input format có đủ hết số paragraph, số sentence, words rồi mà @@. Bạn phải làm đúng y như input mô tả chứ

K, ý mình là như thế này

char* kth_word_in_mth_sentence_of_nth_paragraph(char**** document, int k, int m, int n) {
    return document[n-1][m-1][k-1];
}

char** kth_sentence_in_mth_paragraph(char**** document, int k, int m) {
    return document[m-1][k-1];
}

char*** kth_paragraph(char**** document, int k) {
    return document[k-1];
}

Nghĩa là k cần copy nữa, trỏ luôn tới document rồi in ra là đc.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?