Lỗi về lệnh return của hàm trong C#

Em hiện nay đang port 1 chương trình từ C sang C# thì gặp lỗi sau ạ , đây là phần Code

Tree Search(Tree root, char str[]) {
   if (root == NULL) return NULL;
   //Tim tham tu thi tra ve tu
   if (strcmp(root->Word, str) == 0) return root;
   //Tim Node ben trai
   Tree p = Search(root->Left, str);
   if (p != NULL) return p;
   //Tim Node ben phai
   Tree q = Search(root->Right, str);
   if (q != NULL) return q;
}

Còn đây là phần code bên C# và lỗi (theo em hiểu thì phải thêm 1 câu return khác vào cuối thì mới hết lỗi nhưng làm vậy thì kết quả chương trình sẽ sai)

static Tree Search(Tree root, string Word)
{
    if (root == null) return null;
    if (String.Compare(root.Word, Word) == 0) return root;
    Tree p = Search(root.Left, Word);
    if (p != null) return p;
    Tree q = Search(root.Right, Word);
    if (q != null) return q;
}

Thông báo lỗi:

CS0161  'Program.Search(Tree, string)': not all code paths return a value

Làm sao để fix lỗi này ạ ? Em xin cảm ơn

Vậy bạn return Tree để làm gì?

1 Like

Hàm này dùng để tìm kiếm 1 Node nào đó trong cây ạ , bên C thì chạy bình thường còn bên C# có vẻ vướng lỗi ở chỗ return cho ở trên return nằm trong if

Không tìm thấy thì return null;. Thế thì có gì sai?

Chính xác là lệnh if cuối cùng không cần. Chỉ cần return p; chỗ đó là xong.

2 Likes

em cũng thấy thêm dòng return null nó có lý , mà kết quả vẫn sai , chắc phải dò lại toàn bộ code , thank bro ạ

Cả 2 hàm đều có lỗ hổng về return.
Tức là có những trường hợp nó không return hoặc không xác định return cái gì.

Bên C/C++ nó “làm ngơ” cho qua hoặc chỉ ném warning còn bên C# thì ếch có mùa xuân ấy nhé :))

3 Likes

Em cũng thấy vậy bác ạ , nhưng giờ return cái gì kể cả null cho lỗ hổng đó kết quả đều sai @@

Là nó vẫn báo lỗi hay nó chạy sai ?

3 Likes

Nó báo lỗi thiếu câu return, nhưng giờ thêm câu return null vào cuối thì nó chạy sai kết quả ấy ạ , code bên C chạy đúng , cũng có thể là do em port sai ở đâu đó , đang kiểm tra ạ

Do bên C nó sai nên bạn cảm thấy đúng. Chứ bạn thử nghĩ xem, đoạn mã trên mà không tìm thấy gì hết thì bên C nó trả về cái gì?

3 Likes

nên em mới thử thêm 1 dòng return null đó ạ :3 ,chương trình chạy nhưng kết quả sai , mà công nhận bên C nhiều cái sai quy chuẩn thật

C sai quy chuẩn của C# thôi. Cái gì ra cái đó.
Khả năng là bạn port sai, nếu chương trình không có gì bí mật thì bạn up full code lên xem nào :))

3 Likes

Port sang có 1 điểm không biết em làm đúng không là thay struct và con trỏ của struct thành class hết đó ạ , không biết vì thế mà nó có làm việc đúng không nữa ,
image
image
Chương trình em sai chỗ biến Count , còn Word thì Console xuất ra vẫn đúng

nếu Count là kích thước của Word thì trong C# không cần đâu bạn.

3 Likes

Nó không phải kích thước mà là biến để lưu số lần xuất hiện của từ đó á Bác

image

image
lúc Port em đã thay fscanf bằng StreamReader như trên , không biết có phải sai từ đây không ạ :3
Em làm theo hướng dẫn trên Tutorial của Microsoft

Chuỗi định dạng %s của fscanf() chỉ đọc 1 từ (không có khoảng trắng).
Còn ReadLine() thì đọc cả dòng.
Tập tin dữ liệu nội dung thế nào?

2 Likes

Tập tin văn bản là 1 văn bản bình thường em cop từ trang báo thôi ạ , ở đây em muốn đọc nội dung cả dòng vào Line , còn phần khoảng trắng để phân tách các từ với nhau thì đã có hàm riêng để xử lý :3,
Vậy giờ muốn đọc văn bản cách nhau bởi khoảng trắng như fscanf thì bên C# có hàm nào để thay thế không ạ , vậy cho nó đơn giản

google: C# split string. Cả bài báo là 1 string rồi mình split ra thôi.

3 Likes

Thế xem lúc tách từ trong C# đã đúng chưa. Giá trị của Count chưa đúng có nghĩa là lúc tách chưa ổn rồi.

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