2009-04-07 35 views
7

Tôi có câu hỏi về Fortran 77 và tôi không thể tìm ra giải pháp.Mảng dây ở Fortran 77

Tôi đang cố gắng để lưu trữ một mảng các chuỗi được định nghĩa như sau:

character matname(255)*255 

Mà là một mảng của 255 chuỗi có độ dài 255.

Sau đó tôi đọc danh sách các tên từ một nộp và tôi đặt nội dung của mảng như thế này:

matname(matcount) = mname 

EDIT: Trên thực tế mname giá trị được harcoded như mname = 'AIR' loại character*255, là tham số của hàm matadd() thực thi dòng trước đó. Nhưng đây chỉ là để thử nghiệm, trong tương lai nó sẽ được đọc từ một tập tin.

Sau đó tôi muốn in nó với:

write(*,*) matname(matidx) 

Nhưng có vẻ như in tất cả các 255 ký tự, nó in chuỗi Tôi được phân công và rất nhiều rác.

  • Vì vậy, đó là câu hỏi của tôi, làm thế nào tôi có thể biết độ dài của chuỗi được lưu trữ?
  • Tôi có nên có một mảng khác với tất cả độ dài không?
  • Và làm cách nào để biết độ dài của chuỗi được đọc?

Cảm ơn.

+1

+1 - Fortran? bạn nghiêm túc chứ? –

+1

@Ian - Tại sao không? – Rook

Trả lời

4

Chức năng Timotei được đăng sẽ cho bạn độ dài của chuỗi miễn là phần của chuỗi bạn quan tâm chỉ chứa dấu cách, nếu bạn đang gán các giá trị trong chương trình shou ld là đúng như FORTRAN là nghĩa vụ phải khởi tạo các biến được để trống và cho các ký tự có nghĩa là một không gian.

Tuy nhiên, nếu bạn đang đọc từ một tệp, bạn có thể nhận các ký tự điều khiển khác ở cuối dòng (đặc biệt là ký tự chuyển dòng và/hoặc ký tự dòng, \ r và/hoặc \ n tùy thuộc vào hệ điều hành của bạn) . Bạn cũng nên quăng chúng ra trong hàm để có độ dài chuỗi chính xác. Nếu không, bạn có thể nhận được một số báo cáo in vui như những nhân vật được in là tốt.

Đây là phiên bản chức năng kiểm tra các ký tự khoảng trống trắng thay thế ở cuối không gian.

function strlen(st) 
    integer   i,strlen 
    character   st*(*) 
    i = len(st) 
    do while ((st(i:i).eq.' ').or.(st(i:i).eq.'\r').or. 
+ (st(i:i).eq.'\n').or.(st(i:i).eq.'\t')) 
    i = i - 1 
    enddo 
    strlen = i 
    return 
    end 

Nếu có các ký tự khác trong phần "rác" này vẫn không hoạt động hoàn toàn.

Giả sử rằng nó làm việc cho dữ liệu của bạn, tuy nhiên, bạn có thể thay đổi sau đó tuyên bố viết của bạn trông như thế này:

write(*,*) matname(matidx)(1:strlen(matname(matidx))) 

và nó sẽ in ra chỉ là chuỗi thực tế.

Bạn có nên sử dụng mảng khác để giữ độ dài của chuỗi không, tùy thuộc vào bạn. hàm strlen() là O (n) trong khi tìm kiếm chiều dài trong bảng là O (1). Nếu bạn thấy mình tính toán độ dài của các chuỗi tĩnh này thường xuyên, nó có thể cải thiện hiệu suất để tính toán độ dài khi chúng được đọc, lưu trữ chúng trong một mảng và tìm kiếm chúng nếu bạn cần chúng. Tuy nhiên, nếu bạn không nhận thấy sự chậm lại, tôi sẽ không lo lắng về nó.

+0

Tôi đã phải sửa đổi định nghĩa kiểu của hàm nhận chuỗi như tham số thành: 'character mname * (*)'. Trước đó, kết thúc của biến đó là rác ngẫu nhiên, bây giờ nó được đệm với không gian. Cảm ơn lời giải thích, đã được làm rõ. Ngoài ra tôi không biết về ký hiệu *. – Siu

5

Bạn có thể sử dụng chức năng này để có được chiều dài (không có đuôi trống)

integer function strlen(st) 
     integer  i 
     character  st*(*) 
     i = len(st) 
     do while (st(i:i) .eq. ' ') 
     i = i - 1 
     enddo 
     strlen = i 
     return 
     end 

Got từ đây: http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS: Khi bạn nói: matname (matidx) nó được toàn bộ chuỗi (256) chars ... do đó, đó là chuỗi của bạn cộng với khoảng trống hoặc rác

+0

+1 nhưng muốn nó có thể nhiều hơn. –

+0

Cảm ơn bạn quá, tôi muốn bỏ phiếu cho bạn nhưng tôi vẫn không có đủ danh tiếng. – Siu

1

Tùy thuộc vào trình biên dịch mà bạn đang sử dụng, bạn có thể sử dụng trim() chức năng nội tại để loại bỏ bất kỳ hàng đầu/đuôi không gian từ một chuỗi, sau đó xử lý nó như bình thường, tức là

character(len=25) :: my_string 
my_string = 'AIR' 
write (*,*) ':', trim(my_string), ':' 

nên in :AIR:.

Chỉnh sửa: Tốt hơn, có vẻ như có hàm len_trim() trả về độ dài của chuỗi sau khi đã được cắt.

0

intel và Compaq Visual Fortran có hàm nội tại LEN_TRIM (STRING) trả về độ dài mà không có dấu trống hoặc dấu cách.

Nếu bạn muốn ngăn chặn khoảng trống hoặc các không gian hàng đầu, sử dụng "Điều chỉnh Left" tức là ADJUSTF (STRING)

Trong những FORTRANs Tôi cũng lưu ý một tính năng hữu ích: Nếu bạn vượt qua một chuỗi trong một chức năng hoặc chương trình con như một đối số, và bên trong chương trình con, nó được khai báo là CHARACTER * (*), sau đó bằng cách sử dụng hàm LEN (STRING) trong chương trình con truyền lại độ dài chuỗi thực tế được truyền vào và không phải là chuỗi của chuỗi được khai báo trong chương trình gọi .

Ví dụ: CHARACTER * 1000 STRING

 . 
     . 

    CALL SUBNAM(STRING(1:72) 

    SUBROUTINE SYBNAM(STRING) 
    CHARACTER*(*) STRING 
    LEN(STRING) will be 72, not 1000 
+0

Sử dụng cấu trúc cho chuỗi và Độ dài của chuỗi, đôi khi có ý nghĩa. – Holmz

Các vấn đề liên quan