12.4總結(jié)-創(chuàng)新互聯(lián)

1、Link Error 和 Compile Error

1) Link階段發(fā)生的錯誤(文件本身complie沒有問題,但是互相鏈接階段的問題。例如聲明了函數(shù)但是沒有找到主體、庫文件的錯誤以及互相引用的問題等。)

創(chuàng)新互聯(lián)專注于資中企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站建設(shè)。資中網(wǎng)站建設(shè)公司,為資中等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

*error以LNK開頭
在這里插入圖片描述

2) Complie階段的問題。(某個文件本身的問題,可能是語法等)

error以C開頭
在這里插入圖片描述

2、頭文件中函數(shù)定義:使用inline 或者 static

#include相當(dāng)于復(fù)制過去,如果在一個頭文件A.h中定義函數(shù)B,其他多個文件都使用了#include"A.h",那B函數(shù)就會出現(xiàn)多次定義的LNK錯誤。(always have a body in xx,but… )

解決辦法:
1)只在頭文件中寫函數(shù)聲明,函數(shù)body寫入其他函數(shù)。
2)在函數(shù)前加static,相當(dāng)于該函數(shù)為本文件私有使用,不對外可見。所有使用該函數(shù)的文件相當(dāng)于都單獨擁有一份該函數(shù)的內(nèi)部定義。
3)在函數(shù)前加inline,內(nèi)聯(lián)函數(shù)相當(dāng)于直接在函數(shù)引用中替換值。

3、Inline 內(nèi)聯(lián)函數(shù)
  1. 隱式內(nèi)聯(lián)、顯式內(nèi)聯(lián)
    定義在類內(nèi)的函數(shù)都是隱式內(nèi)聯(lián)函數(shù),顯示內(nèi)聯(lián)需要增加關(guān)鍵字inline

參考:隱式內(nèi)聯(lián)函數(shù)和顯式內(nèi)聯(lián)函數(shù)

**隱式內(nèi)聯(lián)**

using namespace std;

class A

{public:

    void func(int x,int y){i=x;j=y;}     //成員函數(shù)func()是內(nèi)聯(lián)函數(shù)

    void print(){cout<<"兩數(shù)相乘為:"<A a;

    a.func(1,2); //調(diào)用func(1,2)內(nèi)聯(lián)函數(shù)等于直接將i=1,j=2寫在這里

    a.print(); //調(diào)用print()內(nèi)聯(lián)函數(shù)等于將"cout<<"兩數(shù)相乘為:"<

2)不是所有的函數(shù)都適合定義為inline,因為inline是以代碼復(fù)制、即增加內(nèi)存消耗為代價換取代碼運行速度的(無需調(diào)用函數(shù)而是直接復(fù)制替換)。
①使用次數(shù)過多的,每次都復(fù)制,內(nèi)存消耗量++
②本身inline函數(shù)中消耗就較大的,不適合。比如當(dāng)內(nèi)部有循環(huán)體時,執(zhí)行函數(shù)體的循環(huán)要比調(diào)用函數(shù)的花銷更大。

參考:inline那些事

4、C++類型轉(zhuǎn)換及其??!極其?。〔恢悄?p>一定要注意數(shù)據(jù)類型不同時的轉(zhuǎn)換丟失情況。bool 、int、float、double它是一點不會轉(zhuǎn)?。?!
另外,注意output里面warning的信息,很可能就是最后導(dǎo)致error的地方!沒報錯是因為語法上對,邏輯上和實際嚴(yán)格檢查上不一定對。
在這里插入圖片描述

編譯器報錯的滯后性:

很可能報錯在n行,實際出錯在n-1行,報錯位置比真正出錯的位置滯后一行。
例如:在第7行缺少分號,但在編譯第8行時才會發(fā)現(xiàn)第7行有錯,因此報錯在8行。記得debug時檢查上一行內(nèi)容。

5、判斷點是否在三角形內(nèi)部 法1:一般程序都用同側(cè)法,即將三角形三邊看作有方向的AB、BC、CA,看Q點是否在三條邊的同側(cè)。

圖1
新的問題,如何判斷兩個點在一條線的同側(cè)?——右手螺旋定則!
在這里插入圖片描述
根據(jù)向量的叉乘以及右手螺旋定則,ABxAM (x表示叉乘,這里向量省略了字母上面的箭頭符號)的方向為向外指出屏幕,ABxAN也是向外指出屏幕,但ABxAO的方向是向內(nèi)指向屏幕,因此M,N在直線AB的同側(cè),M ,O在直線AB的兩側(cè)。實際計算時,只需要考慮叉積的數(shù)值正負(fù)。
假設(shè)以上各點坐標(biāo)為A(0,0), B(4,0), M(1,2), N(3,4), O(3,-4), 則:

ABxAM = (4,0)x(1,2) = 42 - 01 = 8

ABxAN = (4,0)x(3,4) = 44 – 03 = 16

ABxAO = (4,0)x(3,-4) = 4*-4 – 0*3 = –16

回到三角形內(nèi)外的判斷中來,以Q點圖為例。判斷Q點:
flag1=ABxAQ
flag2=BCxBQ
flag3=CAxCQ
3個flag同號則在內(nèi)部,異號則在外部。

PS:點乘(意義是cos)可以用于判斷角度是否大于90°,大于為負(fù),小于為正

//ours_1
static bool insideTriangle(int x, int y, const Vector3f* _v)
{// TODO : Implement this function to check if the point (x, y) is inside the triangle represented by _v[0], _v[1], _v[2]                          
    
    //p
    Eigen::Vector3f v0p = {_v[0].x() - x,_v[0].y() - y,1.0f };
    Eigen::Vector3f v1p = {_v[1].x() - x,_v[1].y() - y,1.0f };
    Eigen::Vector3f v2p = {_v[2].x() - x,_v[2].y() - y,1.0f };
    //v
    Eigen::Vector3f v0v1 = {_v[0].x() - _v[1].x(),_v[0].y() - _v[1].y(),1.0f };
    Eigen::Vector3f v1v2 = {_v[1].x() - _v[2].x(),_v[1].y() - _v[2].y(),1.0f };
    Eigen::Vector3f v2v0 = {_v[2].x() - _v[0].x(),_v[2].y() - _v[0].y(),1.0f };

    float flagv0v1 = v0p.cross(-v2v0).z();
    float flagv1v2 = v1p.cross(-v0v1).z();
    float flagv2v0 = v2p.cross(-v1v2).z();

    if (flagv0v1>0) {return  flagv1v2>0 && flagv2v0>0;
    }
    else {  
        return flagv1v2<0 && flagv2v0<0;
    }
        
}
法2:自向量乘法,其實跟上一個方法的核心思想一樣,但是計算量小,中間變量也更小

flag1=QAxQB
flag2=QBxQC
flag3=QCxQA
同號內(nèi)部,異號外部

static bool insideTriangle(int x, int y, const Vector3f* _v){Eigen::Vector3f pv0 = {x - _v[0].x() ,y- _v[0].y() ,1.0f };
    Eigen::Vector3f pv1 = {x - _v[1].x() ,y - _v[1].y() ,1.0f };
    Eigen::Vector3f pv2 = {x - _v[2].x() ,y - _v[2].y() ,1.0f };

    if (pv0.cross(pv1).z()>0 ) {return  pv1.cross(pv2).z() >0 && pv2.cross(pv0).z() >0;
    }
    else {return pv1.cross(pv2).z()< 0 && pv2.cross(pv0).z()< 0;
    }

}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享文章:12.4總結(jié)-創(chuàng)新互聯(lián)
分享地址:http://muchs.cn/article24/dhsije.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、App開發(fā)微信公眾號、手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)