2013-10-22 17 views
6

tôi đã phát triển một mã Fortran trong đó có các đặc điểm sau:Professional phát triển mã Fortran: Đăng nhập tạo tập tin

  1. biến toàn cầu
  2. 13 module với nhiều thủ tục con
  3. thủ tục con độc lập
  4. Sử dụng Intel MKL thư viện cho các thư viện LAPACK (Đại số Tuyến tính)
  5. Đọc và viết các tệp văn bản

Mã đã trở nên khá lớn. Mặc dù ở giai đoạn này tôi đang cố gắng để có được câu trả lời đúng, tốc độ thực thi mã là mong muốn.

Tôi đã viết tệp nhật ký văn bản có các thẻ như ERROR: message hoặc INFO: message cho đến thời điểm này. Nhưng viết quá nhiều thông tin sẽ làm chậm mã. Tôi biết trong phát triển Java, chúng tôi sử dụng thư viện log4j để ghi các tệp nhật ký một cách hiệu quả nơi chúng tôi có thể bật hoặc tắt các cấp đăng nhập khác nhau. Vì vậy, sau khi mã được làm sạch, chúng tôi có thể tắt nhật ký cấp độ thấp và chỉ giữ các nhật ký mức cao.

Tôi muốn biết từ các lập trình viên khác cách tốt nhất để xử lý điều này trong Fortran 90+ là gì.

+2

Bạn có thể muốn có một cái nhìn tại [XERROR] (http://people.sc.fsu.edu/~jburkardt /f_src/xerror/xerror.html) thư viện. –

+0

Bạn không nói bạn có muốn tắt chúng lúc chạy hay lúc biên dịch không. Điều đó tạo ra rất nhiều sự khác biệt khi bạn đang mã hóa. – cup

Trả lời

2

Cách dễ nhất là tạo biến số nguyên verbose và đọc giá trị của nó khi thực thi (từ tệp hoặc qua dòng lệnh). Bằng cách này, bạn có thể tạo ra mức độ khác nhau:

  • tiết = 0 => không có đầu ra
  • tiết = 1 => lỗi chỉ
  • tiết> = 2 => lỗi & thông tin

Thật đơn giản để triển khai:

IF(verbose >= 1) CALL OutputError(message) 
IF(verbose >= 2) CALL OutputInfo(message) 

v.v.

+0

Cảm ơn @Kyle cho các đề xuất của bạn.Tôi hiểu tôi nên tạo một chương trình con như write_log (tiết, thông điệp) và sử dụng nó trong suốt mã của tôi để viết nhật ký. Tôi chỉ muốn biết nếu có bất kỳ thủ tục tiêu chuẩn nào mà tôi có thể yêu cầu các đồng phát triển của tôi tuân theo sau đó đã yêu cầu họ làm theo phương pháp đăng nhập của tôi. – Amitava

+0

@Amitava: Không có cách nào * chuẩn * cho bất kỳ thứ gì như thế này. Điều tốt nhất bạn có thể làm là viết chương trình con 'write_log' như bạn có trong đầu và thông báo cho các đồng nghiệp của bạn rằng việc sử dụng' write_log' là phương thức ghi * ưa thích * cho chương trình cụ thể của bạn. –

0

Tôi đã thấy mọi người triển khai ghi nhật ký ở cấp trình biên dịch theo cách tương tự như phương pháp của Kyle Kanos với chỉ thị tiền xử lý. Không fortran tiêu chuẩn, nhưng tôi biết nó có thể được thực hiện với một số trình biên dịch fortran.

2

Tôi đang sử dụng các macro sau tiền xử lý cho chính xác nhiệm vụ này (bên MACROS.h):

#ifdef DEBUG 
#define DWRITE write(*,*) __FILE__,__LINE__, 
#define dwrite write(*,*) __FILE__,__LINE__, 
#else 
#define DWRITE ! 
#define dwrite ! 
#endif 

Trong mã của tôi sau đó tôi có tiêu đề sau đây:

#define DEBUG 
#include "MACROS.h" 

... 

dwrite 'An error occurred!' 

này cung cấp cho các tập tin của tôi và dòng nơi xảy ra lỗi và bằng cách nhận xét dòng đầu tiên tôi có thể dễ dàng bật/tắt thông báo.

Bạn có thể dễ dàng mở rộng này đến mức debug khác nhau và ghi vào tập tin ...

+0

Tại sao bạn có khối #else? – BHF

+0

Nếu không, 'dwrite' sẽ không được xác định và trình biên dịch sẽ phát ra lỗi. Nếu 'DEBUG' không được định nghĩa, bộ tiền xử lý sẽ đơn giản nhận xét mọi dòng bắt đầu bằng' dwrite'. Tôi có thể làm nhiều thứ hơn theo cách này: nếu 'DEBUG' được thiết lập, tôi có thể thực hiện các hàm' thuần túy' * không tinh khiết *, và 'các hàm nguyên tố' 'nguyên tố' và' không xác định', v.v. –

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