Log4tran:一个功能强大的开源Fortran日志记录库

需积分: 5 0 下载量 56 浏览量 更新于2025-01-03 收藏 2KB TGZ 举报
资源摘要信息:"Log4tran是一个开源的日志记录库,专门为Fortran 90/95语言设计。它的主要功能是让程序员能够将程序中的日志信息记录到文件、控制台以及其他支持的输出媒体。Log4tran支持按级别、日期和时间进行日志过滤,并且可以通过XML配置文件来灵活配置日志记录的行为。" 在探讨Log4tran的细节之前,需要明确日志记录的重要性。日志记录是软件开发中不可或缺的一部分,它帮助开发人员追踪程序的执行过程、调试程序中的错误以及监控程序的运行状态。一个成熟的日志库往往能够提供丰富的功能,包括但不限于日志级别设置、日志格式化、多输出目标、性能优化等。 Fortran语言作为科学计算和工程领域中的重要工具,虽然不常用于常规的软件开发,但在特定的领域仍然有广泛的应用。Log4tran正是为了满足Fortran开发者在日志记录方面的需求而生。 Log4tran支持的功能点如下: 1. **日志级别**:Log4tran允许开发者设置不同的日志级别,如DEBUG、INFO、WARN、ERROR和FATAL等。每个级别的日志信息都可以根据需求被记录或忽略,这样可以有效地控制日志的详细程度。 2. **时间与日期**:日志条目可以包含时间戳和日期,这有助于追踪日志事件发生的具体时间,便于日后的查询和分析。 3. **XML配置文件**:通过XML文件配置日志记录是一种灵活性很高的方式。开发者可以轻松地通过编辑一个外部的配置文件来改变日志的行为,而无需修改程序代码。这包括但不限于设置日志级别、定义输出目标以及调整日志格式等。 4. **过滤功能**:过滤是日志库中非常实用的功能,它可以帮助开发者根据自定义的规则来控制日志的记录与否。Log4tran支持按级别过滤,也就是说,开发者可以设置在特定的级别下才记录日志,比如只有ERROR和FATAL级别的日志才会被记录,而DEBUG和INFO级别的日志则被忽略。 5. **多输出目标**:除了基本的文件和控制台输出之外,Log4tran可能还支持将日志输出到其他目的地,如网络服务器、数据库或其他自定义输出端。这样可以根据不同的需求和环境来灵活地管理日志数据。 使用开源软件的好处是多方面的,除了免费和透明之外,开源项目通常拥有活跃的社区,这些社区可以提供技术支持和持续的维护。开源日志库如Log4tran,使得Fortran开发者能够在不牺牲功能性和灵活性的情况下,快速地实现复杂的日志记录策略。 压缩包文件中的"README"文件会提供关于如何安装和配置Log4tran的详细说明。"Makefile"文件则包含了用于编译Log4tran库的必要步骤和指令。"log4tran.f95"文件则是Log4tran库的核心源代码文件,它负责实现上述所有功能。 总结来说,Log4tran作为一个为Fortran 90/95设计的开源日志库,它的出现填补了Fortran开发在日志管理上的空白。通过提供灵活的配置选项、多级别的日志记录以及多种输出目标,Log4tran让Fortran程序的日志管理变得更加高效和专业。

#include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 150 struct ENode { int V1,V2; }; typedef struct ENode *bian; struct AdjVNode { int subscript; struct AdjVNode *next_subscript; }; typedef struct AdjVNode *spot; typedef struct headAdjVNode { int head_spot; spot next_spot; } H[MAX]; struct GNode { int Nv; int Ne; H G; }; typedef struct GNode *list; struct ey { int x,y; }; typedef struct ey eryu; eryu zoubiao[MAX]; int visit[MAX]; list creat(int sum); void gojian(list head,int num,int sum); void charu(list head,int left,int right); void bianli(list head,int now_spot,int num); int main() { int sum,num; scanf("%d%d",&sum,&num); list tu; tu=creat(sum); gojian(tu,num,sum); // for(int i=0;i<=sum;i++){ // printf("%d:",i); // for(spot tran=tu->G[i].next_spot;tran;tran=tran->next_subscript) // printf(" %d",tran->subscript); // printf("\n"); // } if(tu->G[0].next_spot==NULL) { printf("No\n"); }else if(num+7.5>=50){ printf("Yes\n"); } else { bianli(tu,0,num); printf("No\n"); } return 0; } list creat(int sum) { list head; head=(list)malloc(sizeof(struct GNode)); head->Nv=sum; head->Ne=0; for(int i=0; i<=sum; i++) { head->G[i].head_spot=i; visit[i]=0; head->G[i].next_spot=NULL; } return head; } void gojian(list head,int num,int sum) { zoubiao[0].x=0,zoubiao[0].y=0; for(int i=1; i<=sum; i++) scanf("%d%d",&zoubiao[i].x,&zoubiao[i].y); for(int i=1; i<=sum; i++) { int goudu=sqrt(pow(zoubiao[i].x,2)+pow(zoubiao[i].y,2)); if(goudu<=(7.5+num)) charu(head,0,i); } for(int i=1; i<sum; i++) { for(int j=i+1; j<=sum; j++) { if(sqrt(pow((zoubiao[i].x-zoubiao[j].x),2)+pow((zoubiao[i].y-zoubiao[j].y),2))<=num) charu(head,i,j); } } } //创建边 void charu(list head,int left,int right) { bian tran; spot spot_tran; spot_tran=(spot)malloc(sizeof(struct AdjVNode)); tran=(bian)malloc(sizeof(struct ENode)); tran->V1=left; tran->V2=right; spot_tran->subscript=right; spot_tran->next_subscript=head->G[left].next_spot; head->G[left].next_spot=spot_tran; spot_tran=(spot)malloc(sizeof(struct AdjVNode)); spot_tran->subscript=left; spot_tran->next_subscript=head->G[right].next_spot; head->G[right].next_spot=spot_tran; } void bianli(list head,int now_spot,int num) { if(50-abs(zoubiao[now_spot].x)<=num || 50-abs(zoubiao[now_spot].y)<=num){ printf("Yes\n"); exit(0); } visit[now_spot]=1; for(spot tran=head->G[now_spot].next_spot;tran;tran=tran->next_subscript){ if(visit[tran->subscript]==0) bianli(head,tran->subscript,num); } }

139 浏览量