天天看點

rtklib中常用的幾個函數&必須注意函數

1、strstr()

C 庫函數 char *strstr(const char *haystack, const char *needle) 在字元串 haystack 中查找第一次出現字元串 needle 的位置,不包含終止符 '\0'。

參考:C 庫函數 - strstr()

#include <stdio.h>
#include <string.h>
int main() {
	char dest[] = "Hello A World";
	char sour[] = "A";
	char sour1 = 'A';
	char *temp;
	int  temp1;
	temp=strstr(dest, sour);
	printf("temp=%s\n",temp);
	temp = strrchr(dest, sour1);
	printf("temp=%s\n", temp);
	temp1 = strcmp(dest, sour);
	printf("temp=%d\n", temp1);
	return 0;
}
           

輸出:

rtklib中常用的幾個函數&amp;必須注意函數

如果沒有查找到,傳回null

//測試strstr
	char dest[] = "Hello A World";
	char sour[] = "A";
	char sour1 = 'Z';
	char *Temp;
	int  temp1;
	Temp = strstr(dest, sour);
	printf("Temp=%s\n", Temp);
	Temp = strrchr(dest, sour1);
	printf("Temp=%s\n", Temp);
	temp1 = strcmp(dest, sour);
	printf("temp1=%d\n", temp1);
           
rtklib中常用的幾個函數&amp;必須注意函數

2、strrchr() 和 strchr()

(1)strrchr()

#include "string"  
char *strrchr( const char *str, int ch );
           

 功能:函數傳回一個指針,它指向字元ch 在字元串str末次/最後出現的位置,如果比對失敗,傳回NULL。

extern int readpcv(const char *file, pcvs_t *pcvs)
{
    pcv_t *pcv;
    char *ext;
    int i,stat;
    
    trace(3,"readpcv: file=%s\n",file);
    /*char *strrchr( const char *str, int ch );
	功能:函數傳回一個指針,它指向字元ch 在字元串str末次出現的位置,如果比對失敗,傳回NULL。*/
    if (!(ext=strrchr(file,'.'))) ext="";
    
    if (!strcmp(ext,".atx")||!strcmp(ext,".ATX")) {
        stat=readantex(file,pcvs);
    }
    else {
        stat=readngspcv(file,pcvs);
    }
           

讀取接收機和衛星天線檔案中,使用!

(2) strchr()

char *strchr(const char *str, int c)
參數

    str -- 要被檢索的 C 字元串。
    c -- 在 str 中要搜尋的字元。

傳回值

該函數傳回在字元串 str 中第一次出現字元 c 的位置,如果未找到該字元則傳回 NULL。
           

C 庫函數 char *strchr(const char *str, int c) 在參數 str 所指向的字元串中搜尋第一次/開始位置出現字元 c(一個無符号字元)的位置。

示例代碼:

#include <stdio.h>
#include <string.h>

int main ()
{
   const char str[] = "http://www.runoob.com";
   const char ch = '.';
   char *ret;

   ret = strchr(str, ch);

   printf("|%c| 之後的字元串是 - |%s|\n", ch, ret);
   
   return(0);
}
           

運作結果:

|.| 之後的字元串是 - |.runoob.com|
           

C 庫函數 - strchr()

3、strcmp()

#include <string.h>
  int strcmp( const char *str1, const char *str2 );
           

功能:比較字元串str1 和 str2, 傳回值如下:

傳回值 解釋
less than 0 str1 is less than str2
equal to 0 str1 is equal to str2
greater than 0 str1 is greater than str2
for (j = k = nf = 0; j < n; j++) {

	ext = strrchr(infile[j], '.');

	if (ext && (!strcmp(ext, ".rtcm3") || !strcmp(ext, ".RTCM3"))) {
		strcpy(ifile[nf++], infile[j]);
	}
	else {
		/* include next day precise ephemeris or rinex brdc nav */
		ttte = tte;
		if (ext && (!strcmp(ext, ".sp3") || !strcmp(ext, ".SP3") ||
			!strcmp(ext, ".eph") || !strcmp(ext, ".EPH"))) {
			ttte = timeadd(ttte, 3600.0);
		}
		else if (strstr(infile[j], "brdc")) {
			ttte = timeadd(ttte, 7200.0);
		}
		nf += reppaths(infile[j], ifile + nf, MAXINFILE - nf, tts, ttte, "", "");
	}
	while (k < nf) index[k++] = j;

	if (nf >= MAXINFILE) {
		trace(2, "too many input files. trancated\n");
		break;
	}
}
           

簡單總結下三個函數:

函數原型:

int strcmp( const char *str1, const char *str2 );
 char *strrchr( const char *str, int ch );
 char *strstr( const char *str1, const char *str2 );
           

看兩點:str2參數不同,傳回值不同;

strncpy()

C 庫函數 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字元串複制到 dest,最多複制 n 個字元。當 src 的長度小于 n 時,dest 的剩餘部分将用空位元組填充。

https://www.runoob.com/cprogramming/c-function-strncpy.html

注:需要自己加上’\0‘;

4、定義一個指針數組,*ifile[MAXINFILE]

#define MAXINFILE   1000         /* max number of input files */
char *ifile[MAXINFILE]         //指針數組
for (i=0;i<n;i++) {
            if (!(ifile[i]=(char *)malloc(1024))) {
                free(base_); for (;i>=0;i--) free(ifile[i]);
                freepreceph(&navs,&sbss,&lexs);
                return 0;
            }
        }
/* free prec ephemeris and sbas data -----------------------------------------*/
static void freepreceph(nav_t *nav, sbs_t *sbs, lex_t *lex)
{
    int i;
    
    trace(3,"freepreceph:\n");
    
    free(nav->peph); nav->peph=NULL; nav->ne=nav->nemax=0;
    free(nav->pclk); nav->pclk=NULL; nav->nc=nav->ncmax=0;
    free(nav->fcb ); nav->fcb =NULL; nav->nf=nav->nfmax=0;
    free(nav->seph); nav->seph=NULL; nav->ns=nav->nsmax=0;
    free(sbs->msgs); sbs->msgs=NULL; sbs->n =sbs->nmax =0;
    free(lex->msgs); lex->msgs=NULL; lex->n =lex->nmax =0;
    for (i=0;i<nav->nt;i++) {
        free(nav->tec[i].data);
        free(nav->tec[i].rms );
    }
    free(nav->tec ); nav->tec =NULL; nav->nt=nav->ntmax=0;
    
    if (fp_rtcm) fclose(fp_rtcm);
    free_rtcm(&rtcm);
}
           

将指針數組中的每一個元素(指針),通過malloc函數,在堆區進行記憶體配置設定;如果配置設定任意一個沒有配置設定成功,則free釋放結構體變量(base_、ifile[i]、navs、sbss、lexs)

5、如果在VS中進行後處理,将ts、te設定為0,RTKLIB識别開始和結束時間在:

一般我們将其設定為0,如下所示:

gtime_t ts = { 0 }, te = { 0 };
           

當RTKLIB讀取完obs、nav之後,

/* read obs and nav data -----------------------------------------------------*/
static int readobsnav(gtime_t ts, gtime_t te, double ti, char **infile,
                      const int *index, int n, const prcopt_t *prcopt,
                      obs_t *obs, nav_t *nav, sta_t *sta)
           

在上面函數中,有如下的代碼片段,根據觀測資料得到時間跨度,ts、te

/* set time span for progress display */
    if (ts.time==0||te.time==0) {
        for (i=0;   i<obs->n;i++) if (obs->data[i].rcv==1) break;
        for (j=obs->n-1;j>=0;j--) if (obs->data[j].rcv==1) break;
        if (i<j) {
            if (ts.time==0) ts=obs->data[i].time;
            if (te.time==0) te=obs->data[j].time;
            settspan(ts,te);
        }
    }
           

6、RTKLIB提供了Output Debug Trace (OFF Level1-5)

如果在VS中我們打開了Debug Trace,那麼函數内部開始運作及将相關調試資訊儲存到檔案中;調試開始的代碼位于:

位于:static int execses(……)中

/* execute processing session ------------------------------------------------*/
static int execses(gtime_t ts, gtime_t te, double ti, const prcopt_t *popt,
                   const solopt_t *sopt, const filopt_t *fopt, int flag,
                   char **infile, const int *index, int n, char *outfile)
{
    FILE *fp;
    prcopt_t popt_=*popt;
    char tracefile[1024],statfile[1024],path[1024],*ext;
    
    trace(3,"execses : n=%d outfile=%s\n",n,outfile);
    
    /* open debug trace */
    if (flag&&sopt->trace>0) {
        if (*outfile) {
            strcpy(tracefile,outfile);
            strcat(tracefile,".trace"); //原輸出檔案名,後加.trace
        }
        else {
            strcpy(tracefile,fopt->trace);
        }
        traceclose();
        traceopen(tracefile); //開始對 trace檔案進行寫處理
        tracelevel(sopt->trace);
    }
           

 位于:static int execses(……)中

輸出結果統計檔案:

/* open solution statistics */
    if (flag&&sopt->sstat>0) {
        strcpy(statfile,outfile);
        strcat(statfile,".stat");
        rtkclosestat();
        rtkopenstat(statfile,sopt->sstat);
    }
           

7、strstr(infile[i],"%r")

C 庫函數 char *strstr(const char *haystack, const char *needle) 在字元串 haystack 中查找第一次出現字元串 needle 的位置,不包含終止符 '\0'。

 readpreceph函數中,如下代碼片段:

/* read precise ephemeris files */
    for (i=0;i<n;i++) {
        if (strstr(infile[i],"%r")||strstr(infile[i],"%b")) continue;
        readsp3(infile[i],nav,0);
    }
    /* read precise clock files */
    for (i=0;i<n;i++) {
        if (strstr(infile[i],"%r")||strstr(infile[i],"%b")) continue;
        readrnxc(infile[i],nav);
    }
    /* read satellite fcb files */
    for (i=0;i<n;i++) {
        if (strstr(infile[i],"%r")||strstr(infile[i],"%b")) continue;
        if ((ext=strrchr(infile[i],'.'))&&
            (!strcmp(ext,".fcb")||!strcmp(ext,".FCB"))) {
            readfcb(infile[i],nav);
        }
    }
           

 如果輸入檔案中,含有基站和流動站的通配符:

rtklib中常用的幾個函數&amp;必須注意函數
if (strstr(infile[i],"%r")||strstr(infile[i],"%b")) continue;
           

8、reppath函數:

/* replace keywords in file path -----------------------------------------------
* replace keywords in file path with date, time, rover and base station id
* args   : char   *path     I   file path (see below)
*          char   *rpath    O   file path in which keywords replaced (see below)
*          gtime_t time     I   time (gpst)  (time.time==0: not replaced)
*          char   *rov      I   rover id string        ("": not replaced)
*          char   *base     I   base station id string ("": not replaced)
* return : status (1:keywords replaced, 0:no valid keyword in the path,
*                  -1:no valid time)
* notes  : the following keywords in path are replaced by date, time and name
*              %Y -> yyyy : year (4 digits) (1900-2099)
*              %y -> yy   : year (2 digits) (00-99)
*              %m -> mm   : month           (01-12)
*              %d -> dd   : day of month    (01-31)
*              %h -> hh   : hours           (00-23)
*              %M -> mm   : minutes         (00-59)
*              %S -> ss   : seconds         (00-59)
*              %n -> ddd  : day of year     (001-366)
*              %W -> wwww : gps week        (0001-9999)
*              %D -> d    : day of gps week (0-6)
*              %H -> h    : hour code       (a=0,b=1,c=2,...,x=23)
*              %ha-> hh   : 3 hours         (00,03,06,...,21)
*              %hb-> hh   : 6 hours         (00,06,12,18)
*              %hc-> hh   : 12 hours        (00,12)
*              %t -> mm   : 15 minutes      (00,15,30,45)
*              %r -> rrrr : rover id
*              %b -> bbbb : base station id
*-----------------------------------------------------------------------------*/
extern int reppath(const char *path, char *rpath, gtime_t time, const char *rov,
                   const char *base)
           

如果輸入檔案(file)中,含有通配符,則 reppath函數的目的就是将file[]檔案名中的通配符進行替換,儲存到rpath中;這個根據輸入的檔案名是否含通配符而定!

9、向量内積(點乘)和外積(叉乘)

概括地說,向量的内積(點乘/數量積)。對兩個向量執行點乘運算,就是對這兩個向量對應位一一相乘之後求和的操作,如下所示,對于向量a和向量b:

rtklib中常用的幾個函數&amp;必須注意函數
rtklib中常用的幾個函數&amp;必須注意函數

a和b的點積公式為:

rtklib中常用的幾個函數&amp;必須注意函數

這裡要求一維向量a和向量b的行列數相同。注意:點乘的結果是一個标量(數量而不是向量)

向量的外積(叉乘)

概括地說,兩個向量的外積,又叫叉乘、叉積向量積,其運算結果是一個向量而不是一個标量。并且兩個向量的外積與這兩個向量組成的坐标平面垂直。

定義:向量a與b的外積a×b是一個向量,其長度等于|a×b| = |a||b|sin∠(a,b),其方向正交于a與b。并且,(a,b,a×b)構成右手系。

特别地,0×a = a×0 = 0.此外,對任意向量a,a×a=0。

對于向量a和向量b:

rtklib中常用的幾個函數&amp;必須注意函數

a和b的外積公式為:

rtklib中常用的幾個函數&amp;必須注意函數

其中:

rtklib中常用的幾個函數&amp;必須注意函數

根據i、j、k間關系,有:

rtklib中常用的幾個函數&amp;必須注意函數

向量内積(點乘)和外積(叉乘)概念及幾何意義

RTKLIB中 求向量範數:先内積,然後開方

/* euclid norm  歐幾裡得範數,說白了,就是同一個向量點乘後開方,求向量長度-----------------------------------------------------------------
* euclid norm of vector
* args   : double *a        I   vector a (n x 1)
*          int    n         I   size of vector a
* return : || a ||
*-----------------------------------------------------------------------------*/
extern double norm(const double *a, int n)
{
    return sqrt(dot(a,a,n));
}
           

RTKLIB叉乘實作:

/* outer product of 3d vectors 叉積 外積-------------------------------------------------
* outer product of 3d vectors 
* args   : double *a,*b     I   vector a,b (3 x 1)
*          double *c        O   outer product (a x b) (3 x 1)
* return : none
*-----------------------------------------------------------------------------*/
extern void cross3(const double *a, const double *b, double *c)
{
    c[0]=a[1]*b[2]-a[2]*b[1];
    c[1]=a[2]*b[0]-a[0]*b[2];
    c[2]=a[0]*b[1]-a[1]*b[0];
}
           

10、涉及的矩陣運算

#include <string.h>
  void *memcpy( void *to, const void *from, size_t count );
           

 功能:函數從from中複制count 個字元到to中,并傳回to指針。 如果to 和 from 重疊,則函數行為不确定。

/* copy matrix -----------------------------------------------------------------
* copy matrix 将B矩陣的值,複制到A中,是以傳入兩個矩陣
* args   : double *A        O   destination matrix A (n x m)
*          double *B        I   source matrix B (n x m)
*          int    n,m       I   number of rows and columns of matrix
* return : none
*-----------------------------------------------------------------------------*/
extern void matcpy(double *A, const double *B, int n, int m)
{
    memcpy(A,B,sizeof(double)*n*m);
}
           

11、setstr()

函數将 src字元串中長度為n的字串,複制給dst,長度必須小于strlen(dst),但是無論n為多少,dst的内容都被覆寫,詳情見示例!

/* set string without tail space ---------------------------------------------*/
static void setstr(char *dst, const char *src, int n)
{
    char *p=dst;
    const char *q=src;
    while (*q&&q<src+n) *p++=*q++;
    *p--='\0';
    while (p>=dst&&*p==' ') *p--='\0';
}
           

示例程式:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* set string without tail space ---------------------------------------------*/
static void setstr(char *dst, const char *src, int n)
{
	char *p = dst;
	const char *q = src;
	while (*q&&q < src + n) *p++ = *q++;
	*p-- = '\0';
	while (p >= dst && *p == ' ') *p-- = '\0';
}
int main()
{
	char A[] = "VVVVVVVV";
	char B[] = "Am er ican Welcome";
	setstr(A,B,strlen(A));
	printf("A[]=%s\n", A);
	printf("B[]=%s\n", B);
	char C[] = "VVVVVVVV";
	char D[] = "Am er ican Welcome";
	setstr(C, D, 5);
	printf("C[]=%s\n",C);
	printf("D[]=%s\n",D);
	return 0;
}
           

運作結果:

rtklib中常用的幾個函數&amp;必須注意函數

12、static int cmpobs(const void *p1,const void *p2)

其中cmpobs是C标準庫的函數;函數的定義如下:

功能: 使用快速排序例程進行排序

頭檔案:stdlib.h

用法:  void qsort(void* base, size_t num, size_t width, int(__cdecl*compare)(const void*,const void*));

參數:

  • 待排序數組,排序之後的結果仍放在這個數組中
  • 數組中待排序元素數量
  • 各元素的占用空間大小(機關為位元組)
  • 指向函數的指針,用于确定排序的順序(需要使用者自定義一個比較函數)

代碼如下:

qsort(obs->data,obs->n,sizeof(obsd_t),cmpobs);

/* compare observation data -------------------------------------------------*/
static int cmpobs(const void *p1, const void *p2)
{
    obsd_t *q1=(obsd_t *)p1,*q2=(obsd_t *)p2;
    double tt=timediff(q1->time,q2->time);
    if (fabs(tt)>DTTOL) return tt<0?-1:1;
    if (q1->rcv!=q2->rcv) return (int)q1->rcv-(int)q2->rcv;
    return (int)q1->sat-(int)q2->sat;
}
           

13、結構體中含有字元數組,用指向結構體的指針賦初值

結構體sta_t裡面有 字元數組、int 、double類型;是以通過指向sta_t結構體類型的指針,對結構體進行初始化(賦初值)時,字元數組的名字是個位址,也即看作指針;是以,

*sta->name='\0'; //成員數組的名字是個位址,需要使用”*“解引用,即把‘\0’指派給這個數組的第0個成員(首位置處)

或一般把字元串指派給一個結構體成員,使用memcpy

示例代碼:

#include <iostream>
using namespace std;
#define  MAXANT 1024
 
typedef struct {        /* station parameter type */
	char name[MAXANT]; /* marker name */
	char marker[MAXANT]; /* marker number */
	char antdes[MAXANT]; /* antenna descriptor */
	char antsno[MAXANT]; /* antenna serial number */
	char rectype[MAXANT]; /* receiver type descriptor */
	char recver[MAXANT]; /* receiver firmware version */
	char recsno[MAXANT]; /* receiver serial number */
	int antsetup;       /* antenna setup id */
	int itrf;           /* ITRF realization year */
	int deltype;        /* antenna delta type (0:enu,1:xyz) */
	double pos[3];      /* station position (ecef) (m) */
	double del[3];      /* antenna position delta (e/n/u or x/y/z) (m) */
	double hgt;         /* antenna height (m) */
} sta_t;
/* initialize station parameter ----------------------------------------------*/
static void init_sta(sta_t *sta)
{
	int i;
	/* 	*/
	*sta->name = '\0'; // -> 優先級 高于 *
	*sta->marker = '\0';
	*sta->antdes = '\0';
	*sta->antsno = '\0';
	*sta->rectype = '\0';
	*sta->recver = '\0';
	*sta->recsno = '\0';

	sta->antsetup = sta->itrf = sta->deltype = 0;
	for (i = 0; i < 3; i++) sta->pos[i] = 0.0;
	for (i = 0; i < 3; i++) sta->del[i] = 0.0;
	sta->hgt = 0.0;
}
int main() {

	sta_t Sta;
	sta_t *sta = &Sta;
	if (sta) init_sta(sta);  /* station parameter type */
	/*
	char str[MAXANT];
	*str = '\0';
	*/
	/*
	char *p_str = str;
	p_str = (char *)"字元數組";
	*/
	system("pause");
	return 0;
}
           

14、getbits和getbitu函數

/* extract unsigned/signed bits ------------------------------------------------
* extract unsigned/signed bits from byte data
* args   : unsigned char *buff I byte data
*          int    pos    I      bit position from start of data (bits)
*          int    len    I      bit length (bits) (len<=32)
* return : extracted unsigned/signed bits
*-----------------------------------------------------------------------------*/
extern unsigned int getbitu(const unsigned char *buff, int pos, int len)
{
    unsigned int bits=0;
    int i;
    for (i=pos;i<pos+len;i++) bits=(bits<<1)+((buff[i/8]>>(7-i%8))&1u); //1U 表示無符号整型1
    return bits;
}
extern int getbits(const unsigned char *buff, int pos, int len)
{
    unsigned int bits=getbitu(buff,pos,len);
    if (len<=0||32<=len||!(bits&(1u<<(len-1)))) return (int)bits;
    return (int)(bits|(~0u<<len)); /* extend sign */
}
           

都是從多少位裡面擷取資料,getbitu是擷取無符号32位的資料;getbits是擷取32位有符号的資料。

其中,POS為起始位,len為位數長度;

示例代碼:

#include <stdio.h>
/* extract unsigned/signed bits ------------------------------------------------
* extract unsigned/signed bits from byte data
* args   : unsigned char *buff I byte data
*          int    pos    I      bit position from start of data (bits)
*          int    len    I      bit length (bits) (len<=32)
* return : extracted unsigned/signed bits
*-----------------------------------------------------------------------------*/
extern unsigned int getbitu(const unsigned char *buff, int pos, int len)
{
	unsigned int bits = 0;
	int i;
	for (i = pos; i < pos + len; i++) bits = (bits << 1) + ((buff[i / 8] >> (7 - i % 8)) & 1u); //1U 表示無符号整型1
	//printf("getbitu 函數 bits=%d\n", bits);
	return bits;
	
}
extern int getbits(const unsigned char *buff, int pos, int len)
{
	unsigned int bits = getbitu(buff, pos, len);
	if (len <= 0 || 32 <= len || !(bits&(1u << (len - 1)))) return (int)bits;
	 
	return (int)(bits | (~0u << len)); /* extend sign */
}
/* get signed 38bit field ----------------------------------------------------*/
static double getbits_38(const unsigned char *buff, int pos)
{
	return (double)getbits(buff, pos, 32)*64.0 + getbitu(buff, pos + 32, 6);
}
int main() {
	//1005資料(基站位置)
	unsigned char str[] = { 0XD3, 0X00, 0X13, 0X3E, 0XD7, 0XD3, 0X02, 0X02, 0X98, 0X0E, 0XDE, 0XEF, 0X34, 0XB4, 0XBD, 0X62, 0XAC, 0X09, 0X41, 0X98, 0X6F, 0X33, 0X36, 0X0B, 0X98 };
	int i = 24, j, staid, itrf,messageID;
	double rr[3], re[3], pos[3];
	
	messageID= getbitu(str, i, 12); i += 12; //資訊類型
	staid = getbitu(str, i, 12); i += 12; //基準站ID
	itrf = getbitu(str, i, 6); i += 6 + 4; //
	rr[0] = getbits_38(str, i); i += 38 + 2; //天線位置X (ECEF坐标)
	rr[1] = getbits_38(str, i); i += 38 + 2; //天線位置Y (ECEF坐标)
	rr[2] = getbits_38(str, i);   //天線位置Z (ECEF坐标)
 
	printf("messageID=%d staid =%d\n", messageID, staid);
	printf("ECEF下天線位置:%d %d %d\n", rr[0], rr[1], rr[2]);
 
	system("pause");
	return 0;
}
           

運作結果:

rtklib中常用的幾個函數&amp;必須注意函數

15、setbits和setbitu函數

/* set unsigned/signed bits ----------------------------------------------------
* set unsigned/signed bits to byte data
* args   : unsigned char *buff IO byte data
*          int    pos    I      bit position from start of data (bits)
*          int    len    I      bit length (bits) (len<=32)
*         (unsigned) int I      unsigned/signed data
* return : none
*-----------------------------------------------------------------------------*/
extern void setbitu(unsigned char *buff, int pos, int len, unsigned int data)
{
    unsigned int mask=1u<<(len-1);
    int i;
    if (len<=0||32<len) return;
    for (i=pos;i<pos+len;i++,mask>>=1) {
        if (data&mask) buff[i/8]|=1u<<(7-i%8); else buff[i/8]&=~(1u<<(7-i%8));
    }
}
extern void setbits(unsigned char *buff, int pos, int len, int data)
{
    if (data<0) data|=1<<(len-1); else data&=~(1<<(len-1)); /* set sign bit */
    setbitu(buff,pos,len,(unsigned int)data);
}
           

參考連結:

1、學習rtklib(一)

2、C語言qsort函數用法

目錄

1、strstr()

2、strrchr() 和 strchr()

3、strcmp()

4、定義一個指針數組,*ifile[MAXINFILE]

5、如果在VS中進行後處理,将ts、te設定為0,RTKLIB識别開始和結束時間在:

6、RTKLIB提供了Output Debug Trace (OFF Level1-5)

7、strstr(infile[i],"%r")

8、reppath函數:

9、向量内積(點乘)和外積(叉乘)

         向量内積(點乘)和外積(叉乘)概念及幾何意義

10、涉及的矩陣運算

11、setstr()

12、static int cmpobs(const void *p1,const void *p2)

13、結構體中含有字元數組,用指向結構體的指針賦初值

參考連結:

繼續閱讀