精华内容
下载资源
问答
  • OSPF定义了5种区域,不同类型区域对由自治系统外部传入的路由信息的处理方式不同

    OSPF定义了以下5种区域,不同类型的区域对由自治系统外部传入的路由信息的处理方式不同

    • 标准区域:标准区域可以接收任何链路更新信息和路由汇总信息。
    • 主干区域:主干区域是连接各个区域的传输网络,其他区域都通过主干区域交换路由信息。主干区域拥有标准区域的所有性质。
    • 存根区域:不接受本地自治系统以外的路由信息,对自治系统以外的目标采用默认路由 0.0.0.0。
    • 完全存根区域:不接受自治系统以外的路由信息,也不接受自治系统内其他区域的路由汇总信息,发送到本地区域外的报文使用默认路由0.0.0.0。完全存根区域是Cisco定义的,是非标准的。
    • 不完全存根区域(NSAA):类似于存根区域,但是允许接收以类型7的链路状态公告发送的外部路由信息。
    展开全文
  • OSPF区域类型及详解

    千次阅读 2021-01-10 13:24:43
    所有的OSPF区域缺省情况下都是常规区域,当然, Area 0是常规区域中比较特殊的一个。 OSPF要求所有的非骨干区域(非0常规区域)都必须与Area 0直接相连。常规区域中允许Type-1, Type-2. Type-3, Type-4以及Type-5 LSA泛...

    拓扑图
    在这里插入图片描述

    1,骨干区域( Backbone Area)

    骨干区域是Area 0,是整个OSPF域的中心枢纽。一个OSPF域有且只能拥有一个 Area 0,所有的区域间路由必须通过Area0中转。

    2,常规区域( Normal Area)

    所有的OSPF区域缺省情况下都是常规区域,当然, Area 0是常规区域中比较特殊的一个。

    OSPF要求所有的非骨干区域(非0常规区域)都必须与Area 0直接相连。常规区域中允许Type-1, Type-2. Type-3, Type-4以及Type-5 LSA泛洪, Type-7 LSA禁止出现在常规区域内。
    在这里插入图片描述

    3.末梢区域(Stub Area)

    末梢区域也被称为Stub区域,当一个非0常规区域只有单一的出口(例如该区域只有一个ABR),或者区域内的路由器不需要根据特定的外部路由来选择离开区域的出口时,该区域可以被配置为Stub区域。

    当一个区域被配置为Stub区域后,这个区域的ABR将阻挡Type-5 LSA进入该区域(禁止外部路由被发布到该区域),通过这种方式可减少区域内所泛洪的LSA数量,同时该区域的ABR自动下发一条使用Type-3 LSA描述的默认路由,使得区域内的路由器能够通过这条默认路由到达域外,因此既减小了区域内网络设备的路由表规模,又保证了其访问外部网络的数据可达性。

    在一个大量引入外部路由的OSPF网络中,将适当的区域配置为Stub区域可以极大地减小该区域内路由器的路由表规模,从而降低设备的资源消耗。另外,对于Stub区域而言,到达OSPF域内其他区域的路,由依然能够被注入,即ABR依然会将描述区域间路由的Type-3 LSA注入到Stub区域中。

    Area 1被配置为Stub区域,这样Area 1的ABR(CO-SW1及Co-sw2)便不能再将Type-5 LSA注入这个区域。由于Type-5 LSA无法进入该区域,因此Type-4LSA也就没有必要再在该区域内泛洪,所以Co-sw1及Co-sw2也就不会再向该区域内注入Type-4 LSA,进而, Router-X的路由表将不会再出现到达省公司(OSPF域外)的具体路由,路由表的规模减小了,设备的资源消耗也就降低了。当然, Router-X访问省公司的需求还是存在的,为了让Router-X发往省公司的流量能顺利到达目的地, ABR会自动向Areal中注入默认路由,该条默认路由使用Type-3 LSA描述, co-SW1及CO-Sw2都会下发默认路由,网络管理员可以通过把控默认路由的Cost从而控制Routerx选择的出口。Router-X发往省公司的流量能够通过该默认路由先到达co-sW1或co-sw2,再通过它们转发到省公司。
    在这里插入图片描述
    设置末梢区域后ASBR生成Type-5 LSA无法进入,ABR也没有必要生成描述ASBR位置的Type-4 LSA,取而代之的是ABR生成一条描述外部路由的默认路由Type-3 LSA,让stub里的路由器转发发往外部网络的数据时把数据都发给ABR,由ABR统一转发。减小stub区域里的路由器的路由表大小。

    所有连接到stub区域的路由器,对于该区域的stub属性要有一致的认知,否则OSPF邻居关系的建立将会出现问题。

    还可以在ABR上配置,进一步阻挡描述区域间路由的Type-3 LSA进入,区域内的路由器访问区域外的网络时,统一把数据发给ABR。这样,这个区域内只有Type-1 LSA、Type-2 LSA及描述默认路由的Type-3 LSA存在,这意味着区域内路由器的路由表都将只有到达区域内部的路由,以及指向ABR的默认路由,路由器的路由表被极大程度地精简了。这种特殊区域也被称为完全末梢区域(Totally Stub Area)

    4.非完全末梢区域(Not-So-Stubby Area)

    NSSA (Not-So-Stubby Area)即非完全末梢区域,可以理解为Stub区域的变种,它拥有Stub区域的特点—阻挡Type-4及Type-5 LSA进入,从而在一定程度上减少区域内泛洪的LSA数量,同时它还有另一个特点,那就是允许该区域的路由器将少量外部路由引入OSPF,被引入的外部路由,以Type-7 LSA描述,并且这些Type-7 LSA只能够在当前的NSSA内泛洪,不允许直接进入Area0,为了使这些被引入NSSA的外部路由能让OSPF域内的其他区域学习到, NSSA的ABR会将Type-7 LSA转换成Type-5 LSA然后注入Areao,从而泛洪到整个OSPF域。

    Area 1被配置成了NSSA。这样Area 1的ABR将阻挡Type-5 LSA进入这个区域。另一方面, Router-X连接到一个RIP网络,它将路由表中的RIP路由引入OSPF,这些被引入的外部路由以Type-7 LSA描述,这些LSA在Area 1内泛洪,并且禁止进入Area 0.co-sW1及CO-SW2作为NSSA的ABR, 自然也是能收到这些Type-7 LSA的,它们能够根据这些LSA计算出到达RIP网络的路由。

    另外它们也负责将Type-7 LSA转换成Type-5 LSA并将后者注入Area 0,这样这些外部路由便能够被整个OSPF域中的路由器学习到。另一方面, CO-SW1及CO-SW2会向NSSA内下发一条Type-7 LSA的默认路由,使得Router-X能够通过这条默认路由到达省公司。
    在这里插入图片描述
    RIP通过RX生成的Type-7 LSA来描述,生成的Type-7在NSSA区域内泛洪。ABR收到Type-7后生成Type-5 LSA注入到Area 0中,让其他区域的路由器可以知道这个RIP,同时ABR也会生成一条Type-7 LSA默认路由给RX可以访问省公司。

    我们还可以在NSSA的基础上进一步减少LSA的泛洪。在NSSA的ABR上,可以进一步将Type-3 LSA阻挡掉,从而将区域间的路由都过滤掉,而NSSA的ABR会自动,下发一条默认路由(使用Type-3 LSA描述)到该区域,使得区域内的路由器能够通过这条默认路由访问OSPF域内的其他区域,以及域外的网络。这种类型的特殊区域也被称为Totally NSSA。

    5.各种区域类型中允许出现的LSA

    表中列举出了在每种OSPF区域类型中,允许出现以及禁止出现的LSA.

    Type-1 Type-2 Type-3 Type-4 Type-5 Type-7
    常规区域 ×
    Stub区域 × × ×
    Totally Stub区域 ×1 × × ×
    NSSA × ×
    Totally NSSA x2 × ×

    (1) ABR会自动下发一条Type-3 LSA的默认路由,除此之外其他的Type-3 LSA都被禁止。
    (2) ABR会自动下发一条Type-3 LSA的默认路由,除此之外其他的Type-3 LSA都被禁止。

    6.判断LSA的新旧

    (1)首先,拥有更高链路状态序列号的LSA实例被认为更新,因为路由器每次在刷新LSA的时候,会将该LSA的链路状态序列号加1,链路状态序列号越大,则LSA越新。

    (2)如果LSA实例的链路状态序列号相同,那么拥有更大校验和的LSA实例被认为更新。

    (3)如果LSA实例的链路状态序列号相同、校验和也相同,且某个实例的老化时间被设置为MaxAge (最大老化时间,缺省3600s),则该实例被认为最新。

    (4)如果LSA实例的链路状态序列号相同、校验和也相同,且没有任何一个实例的老化时间被设置为MaxAge,那么当两个实例的老化时间相差超过MaxAgeDif (到达整个AS边界所需的最长时间,通常是15min)时,这两个实例被认为是不同的实例,且老化时间值越小的LSA被认为越新。

    (5)如果LSA实例的链路状态序列号相同、校验和也相同,另外,没有任何一个实例的老化时间被设置为MaxAge,并且,两个实例的老化时间相等,或相差不超过MaxAgeDiff,则它们被认为是相同的实例。

    展开全文
  • 结构体变量结构体类型定义

    万次阅读 多人点赞 2019-08-02 16:43:19
    结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2: struct LNode { int data; // 数据域 struct LNode *next; // 指针域 }; ...

     

    结构体类型定义
    定义方式1:
    
    Typedef struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    } *LinkList;
    定义方式2:
    
    struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    
    };
    Typedef struct  LNode  *LinkList;
    以上两个定义方式是等价的,是将 *LinkList 定 义为 struct LNode 类型,即 LinkList 被定义为一个类型名。这样就可以用 LinkList 来定义说明新的变量了,如:
    
    LinkList  L;
    即将 L 定义为 struct LNode 类型的指针变量。
    
    2.结构体类型变量定义
    定义方式1:
    
    struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    
    }LnodeA;
    定义方式2:
    
    struct  LNode {
       int  data;  // 数据域
       struct LNode   *next;  // 指针域
    
    };
    struct  LNode LnodeA;
    以上两个定义方式也是等价的,这样就将 LnodeA 定义为一个 struct LNode 类型的变量,即 LnodeA 为一个 struct LNode 类型的变量名。
    
    结构体内标的定义方式
    1.结构体,透明表区,DATA ELEMENT,DOMAIN
    透明表是对一个物理表的逻辑描述,透明表里有许多字段,并且定义某些字段为 PRIMARY KEY,字段里又包含 DATA ELEMENT,用来描述语言属性和技术属性。DATA ELEMENT 中又包含 DOMAIN,它是定义数据类型和字段长度。
    
    结构体一般是用来定义一个结构变量,有临时数据的储存,没有 PRIMARY KEY,结构体里包含 COMPONENT 而不是 FIELD
    
    2.Internal table 中的属性分为三种 LINE TYPE ,KEY,TABLE KIND。
    LINE TYPE 在 INTERNAL TABLE 里单独的一行叫 LINE TYPE,每一行的结构都一样。
    
    KEY:相当于数据库里的主键。在排序的时候有用,UNIQUE 或 NON-UNIQUE。
    
    TABLE KIND:分为 STANDARD,SORTED,HASHED。
    
    三种类型的内表的定义
    标准表:
    
    DATA itab1 TYPE STANDARD TABLE OF scarr WITH NON-UNIQUE KEY carrid.
    排序表:
    
    DATA itab2 TYPE SORTED TABLE OF scarr WITH NON-UNIQUE KEY carrid.
    哈希表:
    
    DATA itab3 TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.
    一般定义方法(标准表)
    根据数据库表定义标准表
    
    DATA itab4 TYPE TABLE OF scarr.
    根据自建的结构变量定义标准表(最常用)
    
    DATA: BEGIN OF wa,
        carrid TYPE scarr-carrid,
        carrnamen TYPE scarr-carrname,
        END OF wa.
    DATA itab5 LIKE TABLE OF wa.
    根据数据字典中的表类型定义标准表
    
    DATA itab6 TYPE ztabtype00_1.
    根据内表定义内表
    
    DATA itab7 LIKE itab6.
    根据内表定义结构
    
    DATA wa1 LIKE LINE OF itab7.
    3. 定义结构的方式
    
    根据数据字典中的表或者结构来定义程序的结构变量(或类型)
    
    types str1 type spfli.
    data str2 type  sflight.
    自定义程序中的结构变量(或类型)-最常见的
    
    data: begin of wa,
    carrid type spfli-carrid,
    com(10) type c,
    end of wa.
    根据内表定义结构
    
    data wa like line of itab.
    注:根据数据库表定义的一定是结构
    
    同名字段的赋值(重要)
    
    Move-corresponding A  to  B.
    read 是读取内表的一条数据
    
    read table itab like table of wa.
    读一内表的多条数据应用 loop
    
    loop at itab into wa.
    C/C++ 语言中的解释
    结构体定义
    
    结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
    
    结构体作用
    
    结构体和其他类型基础数据类型一样,例如 int 类型,char 类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。 
    
    在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。  
    
    结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
    
    结构体的大小与内存对齐
    
    结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是 32Bit 字长的 CPU,对这类型的 CPU 取 4 个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会相对更高效,这就是内存对齐的由来。
    
    每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数)。程序员可以通过预编译命令 #pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的n就是你要指定的"对齐系数"。  
    
    规则:
    
      
    1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。  
    2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照< span class="marked">#pragma pack 指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。  
    3、结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
    C++ 中的结构体
    在 C 语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在 C 语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C 语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在 C++ 中,考虑到 C 语言到 C++ 语言过渡的连续性,对结构体进行了扩展,C++ 的结构体可以包含函数,这样,C++ 的结构体也具有类的功能,与class 不同的是,结构体包含的函数默认为 public,而不是 private。  
    
    C++ 控制台输出例子:
    
     
    实例
    #include <cstdlib> 
    #include <iostream>  //定义结构体  
    using namespace std; 
     
    struct point 
    {  
        //包含两个变量成员 
        int x;  
        int y; 
    };  
     
     
    int main(int argc, char *argv[]) 
    {  
        struct point pt; 
        pt.x=1; 
        pt.y=2; 
        cout<<pt.x<<endl<<pt.y<<endl;
        return EXIT_SUCCESS;
    }
    C++中的结构体与类的区别
    
    类与结构体在 C++ 中只有两点区别,除此这外无任何区别。  
    
    (1)class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。  
    (2)从 class 继承默认是 private 继承,而从 struct 继承默认是 public 继承。
    这两种定义有什么区别?
    
    typedef struct student
    {
        int num;
        struct student *next;
    }student;
    
    struct student
    {
        int num;
        struct student *next;
    };
    第二个 struct student 是定义了一个 student 结构体,这个明白吧。
    
    第一个是用 typedef 把 struct student 这个结构体类型名字重新定义为 student,也就是说 struct student 和 student 表示同一个事物,都是一个类型的标识符,比如 typedef int zhengshu; 就是你把整型 int 重命名为 zhengshu,下面定义:int i; 和 zhengshu i; 两句就是等价的了。
    
    结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型。
    
    结构说明和结构变量定义
    在 Turbo C 中,结构也是一种数据类型,可以使用结构变量,因此,象其它类型的变量一样,在使用结构变量时要先对其定义。
    
    定义结构变量的一般格式为:
    
    struct 结构名
    { 
        类型 变量名;
        类型 变量名;
    ...
    } 结构变量;
    结构名是结构的标识符不是变量名。
    
    类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和无值型)。
    
    构成结构的每一个类型变量称为结构成员,它象数组的元素一样,但数组中元素是以下标来访问的,而结构是按变量名字来访问成员的。
    
    下面举一个例子来说明怎样定义结构变量。
    
    struct string 
    { 
        char name[8]; 
        int age; 
        char sex[4]; 
        char depart[20]; 
        float wage1,wage2,wage3; 
    }person; 
    这个例子定义了一个结构名为 string 的结构变量 person,如果省略变量名 person,则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上例变成:
    
    struct string 
    { 
        char name[8]; 
        int age; 
        char sex[4]; 
        char depart[20]; 
        float wage1,wage2,wage3; 
    }; 
    struct string person;
    如果需要定义多个具有相同形式的结构变量时用这种方法比较方便,它先作结构说明,再用结构名来定义变量。
    
    例如:
    
    struct string Tianyr, Liuqi, ...;
    如果省略结构名,则称之为无名结构,这种情况常常出现在函数内部,用这种结构时前面的例子变成:
    
    struct 
    { 
        char name[8]; 
        int age; 
        char sex[4]; 
        char depart[20]; 
        float wage1,wage2,wage3; 
    } Tianyr, Liuqi;
    结构变量的使用
    结构是一个新的数据类型,因此结构变量也可以象其它类型的变量一样赋值、运算,不同的是结构变量以成员作为基本变量。
    
    结构成员的表示方式为:
    
    结构变量.成员名
    如果将结构变量.成员名看成一个整体,则这个整体的数据类型与结构中该成员的数据类型相同,这样就可象前面所讲的变量那样使用。
    
    下面这个例子定义了一个结构变量,其中每个成员都从键盘接收数据,然后对结构中的浮点数求和,并显示运算结果。请注意这个例子中不同结构成员的访问。
    
    实例
    #include <stdio.h>
    #include <conio.h>  
     
    int main() 
    { 
        struct
        { 
            char name[8]; 
            int age; 
            char sex[4]; 
            char depart[20]; 
            float wage1,wage2,wage3; 
        }a; 
        float wage; 
        char c='Y'; 
        while(c=='Y'||c=='y') 
        { 
            printf(\nName:); 
            scanf(%s, a.name); 
            printf(Age:); 
            scanf(%d, &a.wage); 
            printf(Sex:); 
            scanf(%s, a.sex); 
            printf(Dept:); 
            scanf(%s, a.depart); 
            printf(Wage1:); 
            scanf(%f, &a.wage1); 
            printf(Wage2:); 
            scanf(%f, &a.wage2); 
            printf(Wage3:); 
            scanf(%f, &a.wage3); 
            wage=a.wage1+a.wage2+a.wage3; 
            printf(The sum of wage is %6.2f\n, wage);
            printf(Continue?); 
            c=getche(); 
        } 
    }
    结构数组和结构指针
    结构是一种新的数据类型, 同样可以有结构数组和结构指针。
    
    1.结构数组
    
    结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下所示:
    
    struct
    { 
        char name[8]; 
        char sex[4]; 
        int age; 
        char addr[40]; 
    }student[40];
    也可定义为:
    
    struct string
    { 
        char name[8]; 
        char sex[4]; 
        int age; 
        char addr[40]; 
    }; 
    struct string student[40];
    需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为:
    
    结构数组元素.成员名 
    例如:
    
    student[0].name 
    student[30].age 
    实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是一个结构变量, 第二维是结构成员。
    
    注意: 结构数组的成员也可以是数组变量。
    
    例如:
    
    struct a 
    { 
        int m[3][5]; 
        float f; 
        char s[20]; 
    }y[4];
    为了访问结构a中结构变量 y[2] 的这个变量, 可写成 y[2].m[1][4]
    
    2.结构指针
    
    结构指针是指向结构的指针。它由一个加在结构变量名前的* 操作符来定义, 例如用前面已说明的结构定义一个结构指针如下:
    
    struct string
    { 
        char name[8]; 
        char sex[4]; 
        int age; 
        char addr[40]; 
    }*student;
    也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。
    
    struct string *student; 
    使用结构指针对结构成员的访问,与结构变量对结构成员的访问在表达方式上有所不同。结构指针对结构成员的访问表示为:
    
    结构指针名->结构成员 
    其中 -> 是两个符号 - 和 > 的组合,好象一个箭头指向结构成员。例如要给上面定义的结构中 name 和 age 赋值,可以用下面语句:
    
    strcpy(student->name, Lu G.C); 
    student->age=18;
    实际上,student->name 就是 (*student).name 的缩写形式。
    
    需要指出的是结构指针是指向结构的一个指针,即结构中第一个成员的首地址,因此在使用之前应该对结构指针初始化,即分配整个结构长度的字节空间,这可用下面函数完成, 仍以上例来说明如下:
    
    student=(struct string*)malloc(size of (struct string));
    size of (struct string) 自动求取 string 结构的字节长度, malloc() 函数定义了一个大小为结构长度的内存区域,然后将其诈地址作为结构指针返回。
    
    注意:
    
    1. 结构作为一种数据类型,因此定义的结构变量或结构指针变量同样有局部变量和全程变量,视定义的位置而定。
    2. 结构变量名不是指向该结构的地址,这与数组名的含义不同,因此若需要求结构中第一个成员的首地址应该是 &[结构变量名]。
    3. 结构的复杂形式:嵌套结构
    嵌套结构是指在一个结构成员中可以包括其它一个结构,Turbo C 允许这种嵌套。
    
    例如: 下面是一个有嵌套的结构
    
    struct string
    { 
        char name[8]; 
        int age; 
        struct addr address; 
    } student; 
    其中: addr 为另一个结构的结构名, 必须要先进行, 说明, 即
    
    struct addr
    { 
        char city[20]; 
        unsigned lon zipcode; 
        char tel[14]; 
    }
    如果要给 student 结构中成员 address 结构中的 zipcode 赋值, 则可写成:
    
    student.address.zipcode=200001; 
    每个结构成员名从最外层直到最内层逐个被列出,即嵌套式结构成员的表达方式是:
    
    结构变量名.嵌套结构变量名.结构成员名 

     

    结构体定义变量的三种方法
    1.先定义结构体,然后在定义结构体变量
    
    struct stu{ /*定义学生结构体类型*/
        char name[20]; //学生姓名
        char sex; //性别
        long num; //学号
        float score[3]; //三科考试成绩
    }
    struct stu student1,student2; //定义结构体类型变量
    struct stu student3,student4;
    //用此结构体类型,可以定义更多的该结构体类型变量。
    
     
    
    2.定义结构体类型同时定义结构体类型变量
    
    struct data{
        int day;
        int month;
        int year;
    } time1,time2;
    //也可以在定义如下变量:
    struct data time3,time4;
    //用此结构体类型,同样可以定义更多的该结构体类型变量。
    
     
    
    3.直接定义结构体类型变量
    
    
    struct{
        char name[20]; //学生姓名
        char sex; //性别
        long num; //学号
        float score[3]; //三科考试成绩
    } person1,person2; //定义该结构体类型变量
    //该定义方法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。
    
     
    
    4.在C中定义一个结构体类型要用typedef
    
    
    typedef struct Student{
        int a;
    }Stu;
    //于是在声明变量的时候就可: Stu stu1;
    /*
    如果没有typedef就必须用struct Student stu1;来声明
    这里的Stu, 实际上就是 struct Student的别名
    另外这里也可以不写Student(于是也不能struct Student stu1;了)
    
    typedef struct{
        int a;
    }Stu;
    */
    

     

     

    bq25895StructTypeDef  bq25895A; //再定义变量
    
    
    
    
      typedef struct {
        bool      powerGood;
        bool      chargeFault;
        uint16_t  battryVoltage;
        uint8_t   battryPercentage;
        
        uint16_t  chargeCurrent;
        
      } bq25895StructTypeDef;//定义类型
    
    
    
    lastPowerGood = bq25895A.powerGood;  //直接这样用
    
     //直接这样用
    bq25895ItHandler(&bq25895A);
     //直接这样用
    
    void bq25895ItHandler(bq25895StructTypeDef *p) {
      if (BQ25895_POWER_GOOD == (bq25895ReadReg(BQ25895_RA_PG_STAT) & BQ25895_REG0B_PG_STAT_MASK)) {
        p->powerGood = true;
        if (BQ25895_CHARGE_NORMAL == (bq25895ReadReg(BQ25895_RA_CHRG_FAULT) & BQ25895_REG0C_CHRG_FAULT_MASK)) {
          p->chargeFault = false;
        } else {
          p->chargeFault = true;
        }
      } else {
        p->powerGood   = false;
        p->chargeFault = false;
      }
    }
      typedef enum {
        STATUS_MOVING,    //枚举类型  如果不自定义第一个默认为0
        STATUS_COLORING,  //
        STATUS_COLORED,   //
      } statusTypeDef;
      
      typedef enum {
        TX_MOTION_START_TAB     = 0,
        TX_MOTION_END_TAB       = 12,
        TX_MAGNETIC_START_TAB   = 12,
        TX_MAGNETIC_END_TAB     = 18,
        TX_COLOR_START_TAB      = 18,
        TX_COLOR_END_TAB        = 24,
        TX_BATTERY_TAB          = 24,
        TX_FRAME_LENGTH         = 25,
      } txTabTypeDef;

     

        typedef enum {
        TX_MOTION_START_TAB     = 0,
        TX_MOTION_END_TAB       = 12,
        TX_MAGNETIC_START_TAB   = 12,
        TX_MAGNETIC_END_TAB     = 18,
        TX_COLOR_START_TAB      = 18,
        TX_COLOR_END_TAB        = 24,
        TX_BATTERY_TAB          = 24,
        TX_FRAME_LENGTH         = 25,
      } txTabTypeDef;
    
    //TX_FRAME_LENGTH  25
    typedef struct {
        struct {
          uint8_t _1[TX_FRAME_LENGTH];
          uint8_t _2[TX_FRAME_LENGTH];
        } buffer;
        bool buffer1Latched;
      } txStructTypeDef;
    
    
     extern txStructTypeDef txA;
    
    txRefleshBattery(&txA, bq25895A.battryPercentage);
    
    
    
    void txRefleshBattery(txStructTypeDef *pTx, uint8_t battery) {
      pTx->buffer1Latched = true;
      pTx->buffer._1[TX_BATTERY_TAB] = battery;
      pTx->buffer1Latched = false;
      pTx->buffer._2[TX_BATTERY_TAB] = battery;
    }
    
    
    txClearColorBuffer(&txA);
    
    void txClearColorBuffer(txStructTypeDef *pTx) {
      pTx->buffer1Latched = true;
      for (uint8_t i = TX_COLOR_START_TAB; i < TX_COLOR_END_TAB; ++i) {
        pTx->buffer._1[i] = 0;
      }
      pTx->buffer1Latched = false;
      for (uint8_t i = TX_COLOR_START_TAB; i < TX_COLOR_END_TAB; ++i) {
        pTx->buffer._2[i] = 0;
      }
    }

     

     

    \

      pTx->buffer1Latched = true;
      for (uint8_t i = TX_MAGNETIC_START_TAB, j = 0; i < TX_MAGNETIC_END_TAB; ++i, ++j) {
        pTx->buffer._1[i] = pAk8963->tx[j];
      }
      pTx->buffer1Latched = false;
      for (uint8_t i = TX_MAGNETIC_START_TAB, j = 0; i < TX_MAGNETIC_END_TAB; ++i, ++j) {
        pTx->buffer._2[i] = pAk8963->tx[j];
      }

     

    展开全文
  • 特殊的OSPF区域类型

    千次阅读 2014-03-27 10:17:01
    区域类型决定了它将收到什么样的路由信息。 使用末节区域旨在通告默认路由,这样外部LSA汇总LSA将不会扩散到该区域中。这将缩小该区域中路由器LSDB路由选择表的规模: 末节区域:接收链路更新汇总路由,不...

    本文摘自《CCNP学习指南:BSCI》

    区域的类型决定了它将收到什么样的路由信息。

    使用末节区域旨在通告默认路由,这样外部LSA和汇总LSA将不会扩散到该区域中。这将缩小该区域中路由器LSDB和路由选择表的规模:

    末节区域:接收链路更新和汇总路由,不接受外部路由;

    主干区域:将其他区域互联起来,接收所有LSA;

    NSSA:允许将外部路由注入到末节区域中。


    标准区域:这是默认的区域类型,接收链路更新、汇总路由和外部路由。

    主干区域(中转区域):主干区域是中央实体,其他区域都与之相连。主干区域为区域0,其他区域都与之相连以交换路由信息。OSPF主干区域具备标准的OSPF区域的所有特性。

    末节区域:这种区域不接受关于AS外部的路由信息,如来自非OSPF路由器的路由。需要路由到AS外部的网络时,路由器使用默认路由(用0.0.0.0表示)。末节区域不能包含ASBR(除非ABR也是ASBR)。

    绝对末节区域:这种区域不接受来自AS外部的路由和来自AS中其他区域的汇总路由。需要将分组发送到区域外的网络时,路由器使用默认路由。绝对末节区域不能有ASBR(除非ABR也是ASBR)。

    NSSA:NSSA是对OSPF RFC的补充。这种区域定义了一种特殊的LSA:7类LSA。NSSA具有末节区域和绝对末节区域的优点,但可以包含ASBR,这违反了关于末节区域的规则。

    区域有如下特征时,可将其设置成为末节区域或绝对末节区域:

    1.只有一个出口;或有多个出口,但一台或多台ABR将默认路由注入到区域中,且不要求选择最佳路径。换句话说,,前往其他区域或自主系统时可能采用次优路径:通过一个离目标网络较远的出口离开区域。

    2.必须将末节区域中所有的OSPF路由器(包括ABR和内部路由器)都配置为末节路由器,这样他们才能成为邻居,进而交换路由信息。

    3.区域不会被用作虚链路的中转区域。

    4.末节区域中没有ASBR。

    5.不是主干区域0.


    关于路由汇总:

    注意:根据采用的网络拓扑,可能不想将区域0中的网络进行汇总,并通告给其他区域。例如,如果非主干区域和主干区域之间有多个ABR,则通过将包含网络信息3类(网络)LSA发送到该区域中,可确保前往区域外的目的地时将选择最短路径。如果对路由进行汇总,则可能导致选择的是次优路径。


    展开全文
  • 区域插值中可以使用哪些类型的数据?  区域插值接受三种不同的面数据集类型作为输入。所有这三种类型都可以生成预测标准误差表面,然后重新聚合到目标面。每种数据类型的预测表面重新聚合预测的插值都不同,...
  • #include #define SENTENCE "That's all I can say" char main() { const char *mood ="Fuck the dog Qiaoguang"; printf ("%s\n%s",SENTENCE,mood); return 0; }![图片说明]...
  • OSPF详解(六)特殊区域类型

    千次阅读 2019-04-09 21:00:23
    OSPF特殊区域类型(优化OSPF数据库路由表) 作用 是否下发默认路由 STUB 过滤四类、五类LSA 下发三类LSA缺省 totally-STUB 过滤三类、四类、五类LSA 下发三类LSA缺省 NSSA 过滤四类...
  • C++中各种类型的变量的存储区域和作用域 变量有:全局变量、静态全局变量、静态局部变量、局部变量。 按照存储区域分,全局变量,静态全局变量静态局部变量都是存储在内存的静态存储区域的,局部变量存放在内存...
  • OSPF之重要LSA类型与特殊区域

    千次阅读 多人点赞 2018-11-28 01:41:17
    OSPF协议定义了多种不同的路由器,例如一台DR路由器必须通告多路访问链路中和所有与这条链路相连的路由器,其它类型的路由器将不需要通告这种类型的信息。可见,不同的路由器通告的信息是不同的,于是用LSA类型去...
  • 这篇文章主要是从内存的角度来区分基本类型和引用类型的区别: 1、先了解内存分区(大家需要知道,定义的变量都是在内存中存放的) 内存是存储数据的,不同类型的数据要存储在不同的区域,即分类存放,不同的区域...
  • OSPF协议将其管理的网络划分为不同类型的若干区域(Area),其中标准区域特点是(64);存根区域(stub)的特点是(65)。 (64)A.不接受本地AS之外的路由信息,也不接受其他区域的路由汇总信息 B.不接受本地AS...
  • 六、了解联合类型和交叉类型 有了这些知识,你现在就可以了解联合和交叉类型的含义了。 联合类型 A | B 表示一个集合,该集合是与类型A关联的一组值和与类型 B 关联的一组值的并集。交叉类型 A & B 表示一个集合,...
  • Stub区域和NSSA区域比较

    千次阅读 2016-06-14 11:26:42
    STUB区域的设计思想在于:在划分了区域之后,非骨干区域中的路由器对于区域外的路由,一定要通过ABR(区域边界路由器)来转发,或者说对于区域内的路由器来说ABR是一个通往外部世界的必经之路。既然如此,对于区域内...
  • 变量数据类型难舍难分,思考了好久,得出下面这个结论: 变量是内存中的一个存储区域。而数据类型定义决定了这块存储区域的大小。【变量与数据类型的关系】 为什么需要定义变量存储区域的大小? 以结果为导向...
  • unity中的值类型和引用类型

    千次阅读 2019-08-14 16:32:53
    一、值类型和引用类型概念 值(value)类型 :Unity中的vector3、quaternion是structs,它们是值。 引用(feference)类型 :Unity中的transform、gameobject是类类型,所以它们是引用。引用类型是对数据存储位置...
  • OSPF区域划分和区域间路由(三类LSA)

    千次阅读 2020-11-20 00:50:48
    OSPF区域间路由 一、区域划分的好处 背景: 随着网络规模不断扩大,结构也日趋复杂,路由器完成路由计算所消耗的内存、CPU资源也越来越多 网络发生故障的可能性也随之增加,如果区域内某处发生故障,整个区域内的...
  • 方法内定义的基本数据类型放在栈桢中,栈里面的数据是线程私有的,不共享。 方法外定义的全局变量,存放在java的堆中 java虚拟机是线程私有的,生命周期跟线程是相同的,每个方法调用的时候都会创建一个栈桢用于存储...
  • 区域和裁减区域-Window GDI

    千次阅读 2011-05-15 20:53:00
    区域的创建选择一个应用程序通过调用指定形状的函数来创建一个区域。下表显示了创建标准图形的函数形状函数矩形区域CreateRectRgn, CreateRectRgnIndirect, SetRectRgn圆角的矩形区域CreateRoundRectRgn椭圆区域...
  • 1.一般的Mat定义方法:cv::Mat M(height,width,),例: cv::Mat M(480,640,CV_8UC3); 表示定义了一个480行640列的矩阵,矩阵的每个单元的由三个(C3:3 Channel)8位无符号整形(U Unsigned U8 8位)构成。 2.将已有数...
  • 区域填充

    千次阅读 2017-03-24 12:22:06
    一、种子填充算法  区域是指光栅网络上的一组像素,区域填充是把某确定的像素值送入到... 内定义区域定义方法是指出区域内部所有的像素值,此时区域内部所有像素有某个原值oldvalue。  边界定义区域定义方法
  • 类型和引用类型的区别

    千次阅读 2017-10-25 10:07:08
    一、定义引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变。值类型表示复制一个当前变量传给方法,当你在这...
  • TypeScript 的核心在于静态类型,我们在编写 TS 的时候会定义很多的类型,但是主流的库都是 JavaScript 编写的,并不支持类型系统。那么如何让这些第三方库也可以进行类型推导呢?这篇文章我们来讲解 JavaScript ...
  • STM8使用----STVD(COSMIC)定义变量指定其类型和定义 http://www.51hei.com/bbs/dpj-31009-1.html (出处: 单片机论坛) stm8 stvd下 near等于51的xdata tiny等于51的idata 如何分配变量到指定的地址 ...
  • Java内存区域划分内存分配策略

    千次阅读 多人点赞 2020-05-15 12:32:46
    Java内存区域划分内存分配策略 如果不知道,类的静态变量存储在那? 方法的局部变量存储在那? 赶快收藏 Java内存区域主要可以分为共享内存,堆、方法区线程私有内存,虚拟机栈、本地方法栈程序计数器。如下...
  • 释义:NSSA中重新定义了一种LSA——Type 7类型的LSA,作为区域内的路由器引入外部路由时使用,该类型的LSA除了类型标识与Type 5不相同之外,其它内容基本一样。这样区域内的路由器就可以通过LSA的类型来判断是否该...
  • 指针类型和存储区的关系详解 一、存储类型与存储区关系  data ---> 可寻址片内ram  bdata ---> 可位寻址的片内ram  idata ---> 可寻址片内ram,允许访问全部内部ram  pdata ---> 分页...
  • C/C++程序内存的各种变量存储区域和各个区域详解

    万次阅读 多人点赞 2018-03-11 17:57:16
    C语言在内存中一共分为如下几个区域,分别是:1. 内存栈区: 存放局部变量名;2. 内存堆区: 存放new或者malloc出来的对象;3. 常数区: 存放局部变量或者全局变量的值;4. 静态区: 用于存放全局变量或者静态变量;...
  • 引用类型和基本类型区别

    万次阅读 2011-12-20 22:34:35
    今天明白了一个困扰很久的问题:引用类型和基本类型的区别与联系 要明白这个问题,首先需要理解堆栈的概念。那什么又是堆栈,有什么区别和联系呢? 堆:首先堆是动态分配的,JVM并不会自动释放这部分内存。只用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 470,080
精华内容 188,032
关键字:

区域的含义和类型