青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

colorful

zc qq:1337220912

 

Windows調(diào)試 - 如何使用dump文件

http://blog.csdn.net/jfkidear/article/details/22201829
 

Windows調(diào)試 - 如何使用dump文件

2013-02-04 16:05 445人閱讀 評論(0) 收藏 舉報(bào)
dmp dump debug visua

如何使用dump文件

我最近在開發(fā)一個(gè)windows下的程序(win7/win8),有一些case下會(huì)crash,如果在自己開發(fā)機(jī)器上調(diào)試比較簡單:運(yùn)行程序,然后vs attach到進(jìn)程上即可,但是在每臺(tái)QA的機(jī)器上安裝vs時(shí)不現(xiàn)實(shí)的,因此我們要用到dump文件。

微軟網(wǎng)站有一篇文章講述如何創(chuàng)建dump文件:

http://support.microsoft.com/kb/931673

第一種: 通過任務(wù)管理器:這種適用在程序掛了(crash)的時(shí)候進(jìn)程還未退出,比如我運(yùn)行程序,出現(xiàn)了下面的錯(cuò):


此時(shí)打開任務(wù)管理器,右擊相應(yīng)進(jìn)程,點(diǎn)擊"Create Dump File“:


一會(huì)創(chuàng)建完成:


然后把這個(gè)DMP文件拷到開發(fā)機(jī)器上,用VS打開: 會(huì)出現(xiàn)下面的界面,要想知道發(fā)生錯(cuò)誤時(shí)候的調(diào)用棧,需要設(shè)置symbol的路徑,點(diǎn)擊”Set Symbol Paths“:


注意這個(gè)pdb要對應(yīng)于crash的exe,否則調(diào)用棧沒法顯示:


設(shè)置完成后,點(diǎn)擊”Debug with Native Only“ 你就可以看到調(diào)用棧了。


第二種: 改注冊表

如果程序crash的時(shí)候沒有框蹦出來,可以通過改注冊表的設(shè)置讓操作系統(tǒng)在程序crash的時(shí)候自動(dòng)生成dump,并放到特定的目錄下

 

  1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps  
  2. Value Name = DumpType  
  3. Data type: REG_DWORD  
  4. Value Data = 1  

其中Value Data=1代表的含義是:

 

 

  1. 0 = Create a custom dump  
  2. 1 = Mini dump  
  3. 2 = Full dump  

設(shè)置完成后,crash發(fā)生時(shí),操作系統(tǒng)生成dump,路徑在%LOCALAPPDATA%\CrashDumps下,詳細(xì)可以參考:

 

http://msdn.microsoft.com/en-us/library/bb787181%28v=VS.85%29.aspx

(完)

posted @ 2015-10-21 15:22 多彩人生 閱讀(660) | 評論 (0)編輯 收藏

STL的remove函數(shù)和list的remove成員函數(shù)

http://www.cnblogs.com/kinuxroot/archive/2013/01/25/stl_remove_problem.html

今天看書剛剛看的,就記錄下來吧。這可能是老生常談了,權(quán)且作為一個(gè)警醒的例子吧。

大家都知道STL有兩個(gè)非常重要的組成部分,容器和算法。

算法就是一個(gè)個(gè)的函數(shù),通過迭代器和容器關(guān)聯(lián)在一起,完成一些工作。

算法和容器的分離為程序設(shè)計(jì)提供了很大的靈活性,但是也帶來了一些負(fù)面效果,下面我講的這個(gè)問題就是一個(gè)例子。

STL的算法里有一個(gè)remove函數(shù),而list自身也有一個(gè)remove函數(shù),功能都是一樣的,移除某一個(gè)元素,那我們應(yīng)該使用哪一個(gè)呢?

看一下下面這段程序

復(fù)制代碼
 1     list<int> numbers;  2   3     for ( int number = 0; number <= 6; number ++ ) {  4         numbers.push_front(number);  5         numbers.push_back(number);  6     }  7   8     copy(numbers.begin(), numbers.end(),  9             ostream_iterator<int>(cout, " ")); 10     cout << endl; 11  12     // remove algorithm will remove element but not erase the element from container 13     // it will return the logical desination of container 14     list<int>::iterator endOfNumbers = remove(numbers.begin(), numbers.end(), 3); 15  16     copy(numbers.begin(), numbers.end(), 17             ostream_iterator<int>(cout, " ")); 18     cout << endl;
復(fù)制代碼

輸出是什么呢?

第一行肯定是6 5 4 3 2 1 0 0 1 2 3 4 5 6,那么第二行會(huì)輸出什么?

如果是沒有仔細(xì)看過STL的人肯定會(huì)認(rèn)為remove(number.begin(), numbers.end(), 3)會(huì)移除所有值為3的元素。所以輸出是:6 5 4 2 1 0 0 1 2 4 5 6。

但是,我們看一下它真正的輸出:

6 5 4 2 1 0 0 1 2 4 5 6 5 6

你可能會(huì)非常驚訝,為什么最后會(huì)多出5和6兩個(gè)數(shù)呢?

我們來講一下remove算法的原理。

remove算法工作時(shí)并不是直接把元素刪除,而是用后面的元素替代前面的元素,也即是說如果我對1234這個(gè)序列remove 2,返回的序列是 1344(3被復(fù)制到2的位置,4被復(fù)制到3的位置)。

這樣上面的例子就好解釋了,那兩個(gè)3的元素并沒有被移除,而是用后面的元素覆蓋了前面的元素。多出的那兩個(gè)數(shù)沒有被移除掉而已。

那么我們應(yīng)該如何真正完成移除呢?remove函數(shù)會(huì)返回一個(gè)迭代器,那個(gè)迭代器是這個(gè)序列的邏輯終點(diǎn),也即是我代碼里的endOfNumbers,它指向倒數(shù)第二個(gè)5上。

于是我們要利用list的erase函數(shù)完成元素移除

numbers.erase(endOfNumbers, numbers.end());

這樣我們就完成了我們的工作,稍稍有點(diǎn)曲折……

其實(shí)我們可以把這兩步放在一起,比如如果我想接著移除所有值為2的元素

numbers.erase(remove(numbers.begin(), numbers.end(), 2), numbers.end());

這樣我們就可以一步到位了。

但是這樣好么?

不好。

大家會(huì)發(fā)現(xiàn),remove函數(shù)的原理是復(fù)制而不是指針的移動(dòng)(因?yàn)楹瘮?shù)操縱的是迭代器,而C++的迭代器沒有定義刪除操作),這樣會(huì)帶來一個(gè)問題:我們使用list是因?yàn)樗男薷牡男史浅8撸淖円幌轮羔樉涂梢粤恕6@里我們復(fù)制了元素,如果在vector中,可能還是高效的,因?yàn)関ector無論如何都要復(fù)制,而對于list就不是如此了,會(huì)極度降低我們的效率。

那我們怎么辦呢?

答案是使用list自己的remove函數(shù)

numbers.remove(1);

我們可以這樣刪除所有值為1的元素。

也即是說,如果要?jiǎng)h除list中的元素,我們應(yīng)該使用list的remove成員函數(shù),而不是remove算法

小結(jié)

我們都知道,STL是一個(gè)效率、復(fù)用性、靈活性折衷的產(chǎn)物,其中效率至關(guān)重要,所以STL已經(jīng)禁止了一些效率低的操作(比如list的隨機(jī)訪問),而鼓勵(lì)你去使用其它的容器。

但是,在算法中,為了靈活性,STL還是會(huì)犧牲一些東西,比如我們這個(gè)例子。

個(gè)人覺得,STL作為C++標(biāo)準(zhǔn)庫的一個(gè)組成部分,特點(diǎn)和C++本身一模一樣,強(qiáng)大而復(fù)雜,有些地方難以理解,很多細(xì)節(jié)需要學(xué)習(xí)注意,我們要學(xué)會(huì)避免陷入某些陷阱之中,比如這個(gè)例子就是一個(gè)效率陷阱。

其它更多的陷阱是錯(cuò)誤處理方面的,STL本身并沒有規(guī)定過多的錯(cuò)誤處理,大部分的錯(cuò)誤處理都交給了我們,理由很簡單:性能至上,如果一個(gè)東西自身沒有錯(cuò)誤檢查,我們可以包裝一個(gè)帶錯(cuò)誤檢查的類;但是如果這個(gè)東西自身就帶了錯(cuò)誤檢查,那么我們就沒有任何方法提升它的效率了。這也是很多C和C++庫的設(shè)計(jì)原則。

所以,很多時(shí)候,需要我們深入細(xì)節(jié),然后再?zèng)Q定到底怎么做。因?yàn)镃++就是如此:有很多路可以走,需要我們自己選擇最好的一條路。

分類: C++

posted @ 2015-10-14 15:50 多彩人生 閱讀(917) | 評論 (1)編輯 收藏

C++ 11 Lambda表達(dá)式

http://www.cnblogs.com/hujian/archive/2012/02/14/2350306.html
C++ 11中的Lambda表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對象,以簡化編程工作。Lambda的語法形式如下:
              [函數(shù)對象參數(shù)] (操作符重載函數(shù)參數(shù)) mutable或exception聲明 ->返回值類型 {函數(shù)體}
      可以看到,Lambda主要分為五個(gè)部分:[函數(shù)對象參數(shù)]、(操作符重載函數(shù)參數(shù))、mutable或exception聲明、->返回值類型、{函數(shù)體}。下面分別進(jìn)行介紹。
      一、[函數(shù)對象參數(shù)],標(biāo)識(shí)一個(gè)Lambda的開始,這部分必須存在,不能省略。函數(shù)對象參數(shù)是傳遞給編譯器自動(dòng)生成的函數(shù)對象類的構(gòu)造函數(shù)的。函數(shù)對象 參數(shù)只能使用那些到定義Lambda為止時(shí)Lambda所在作用范圍內(nèi)可見的局部變量(包括Lambda所在類的this)。函數(shù)對象參數(shù)有以下形式:
           1、空。沒有使用任何函數(shù)對象參數(shù)。
           2、=。函數(shù)體內(nèi)可以使用Lambda所在作用范圍內(nèi)所有可見的局部變量(包括Lambda所在類的this),并且是值傳遞方式(相當(dāng)于編譯器自動(dòng)為我們按值傳遞了所有局部變量)。
           3、&。函數(shù)體內(nèi)可以使用Lambda所在作用范圍內(nèi)所有可見的局部變量(包括Lambda所在類的this),并且是引用傳遞方式(相當(dāng)于編譯器自動(dòng)為我們按引用傳遞了所有局部變量)。
           4、this。函數(shù)體內(nèi)可以使用Lambda所在類中的成員變量。
           5、a。將a按值進(jìn)行傳遞。按值進(jìn)行傳遞時(shí),函數(shù)體內(nèi)不能修改傳遞進(jìn)來的a的拷貝,因?yàn)槟J(rèn)情況下函數(shù)是const的。要修改傳遞進(jìn)來的a的拷貝,可以添加mutable修飾符。
           6、&a。將a按引用進(jìn)行傳遞。
           7、a, &b。將a按值進(jìn)行傳遞,b按引用進(jìn)行傳遞。
           8、=,&a, &b。除a和b按引用進(jìn)行傳遞外,其他參數(shù)都按值進(jìn)行傳遞。
           9、&, a, b。除a和b按值進(jìn)行傳遞外,其他參數(shù)都按引用進(jìn)行傳遞。
      二、(操作符重載函數(shù)參數(shù)),標(biāo)識(shí)重載的()操作符的參數(shù),沒有參數(shù)時(shí),這部分可以省略。參數(shù)可以通過按值(如:(a,b))和按引用(如:(&a,&b))兩種方式進(jìn)行傳遞。
      三、mutable或exception聲明,這部分可以省略。按值傳遞函數(shù)對象參數(shù)時(shí),加上mutable修飾符后,可以修改按值傳遞進(jìn)來的拷貝(注意 是能修改拷貝,而不是值本身)。exception聲明用于指定函數(shù)拋出的異常,如拋出整數(shù)類型的異常,可以使用throw(int)。
      四、->返回值類型,標(biāo)識(shí)函數(shù)返回值的類型,當(dāng)返回值為void,或者函數(shù)體中只有一處return的地方(此時(shí)編譯器可以自動(dòng)推斷出返回值類型)時(shí),這部分可以省略。
      五、{函數(shù)體},標(biāo)識(shí)函數(shù)的實(shí)現(xiàn),這部分不能省略,但函數(shù)體可以為空。
      下面給出了一段示例代碼,用于演示上述提到的各種情況,代碼中有簡單的注釋可作為參考。
復(fù)制代碼
class CTest
{
public:
 CTest() : m_nData(20) { NULL; }
 void TestLambda()
 {
  vector<int> vctTemp;
  vctTemp.push_back(1);
  vctTemp.push_back(2);

  // 無函數(shù)對象參數(shù),輸出:1 2
  {
   for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
  }

  // 以值方式傳遞作用域內(nèi)所有可見的局部變量(包括this),輸出:11 12
  {
   int a = 10;
   for_each(vctTemp.begin(), vctTemp.end(), [=](int v){ cout << v+a << endl; });
  }

  // 以引用方式傳遞作用域內(nèi)所有可見的局部變量(包括this),輸出:11 13 12
  {
   int a = 10;
   for_each(vctTemp.begin(), vctTemp.end(), [&](int v)mutable{ cout << v+a << endl; a++; });
   cout << a << endl;
  }

  // 以值方式傳遞局部變量a,輸出:11 13 10
  {
   int a = 10;
   for_each(vctTemp.begin(), vctTemp.end(), [a](int v)mutable{ cout << v+a << endl; a++; });
   cout << a << endl;
  }

  // 以引用方式傳遞局部變量a,輸出:11 13 12
  {
   int a = 10;
   for_each(vctTemp.begin(), vctTemp.end(), [&a](int v){ cout << v+a << endl; a++; });
   cout << a << endl;
  }

  // 傳遞this,輸出:21 22
  {
   for_each(vctTemp.begin(), vctTemp.end(), [this](int v){ cout << v+m_nData << endl; });
  }

  // 除b按引用傳遞外,其他均按值傳遞,輸出:11 12 17
  {
   int a = 10;
   int b = 15;
   for_each(vctTemp.begin(), vctTemp.end(), [=, &b](int v){ cout << v+a << endl; b++; });
   cout << b << endl;
  }


  // 操作符重載函數(shù)參數(shù)按引用傳遞,輸出:2 3
  {
   for_each(vctTemp.begin(), vctTemp.end(), [](int &v){ v++; });
   for_each(vctTemp.begin(), vctTemp.end(), [](int v){ cout << v << endl; });
  }

  // 空的Lambda表達(dá)式
  {
   [](){}();
   []{}();
  }
 }

private:
 int m_nData;
};
復(fù)制代碼

posted @ 2015-04-21 10:39 多彩人生 閱讀(516) | 評論 (0)編輯 收藏

qcjl lua project log

2015/3/1
protoc-gen-lua 生成的lua又發(fā)現(xiàn)新的問題, main function has more than 200 local variables問題,網(wǎng)上搜索了一下,有相應(yīng)的解決方法,據(jù)說還會(huì)有一個(gè)新的問題出來:不能用 repeated submessage,  建議用云風(fēng)的pbc. 所以方案改為用云風(fēng)的pbc

posted @ 2015-03-01 11:55 多彩人生 閱讀(1593) | 評論 (0)編輯 收藏

cocos2dx lua protobuf

http://blog.csdn.net/weyson/article/details/17024325
http://m.shnenglu.com/colorful/archive/2015/01/17/209557.html
http://blog.csdn.net/w00w12l/article/details/39316321

protoc-gen-lua下載地址: https://github.com/sean-lin/protoc-gen-lua

1/ 先到protobuf的python目錄下執(zhí)行
    python setup.py build
    python setup.py install

2/ 在protoc-gen-lua的plugin目錄中新建protoc-gen-lua.bat, 內(nèi)容如下:
@python 目錄\protoc-gen-lua\plugin\protoc-gen-lua

3/ 用protoc把proto文件生成lua文件
  protoc --lua_out=./ --plugin=protoc-gen-lua="目錄\protoc-gen-lua.bat"  test.proto

4/ 將protoc-gen-lua/protobuf下的pb.c 放到工程的Classes下, 并加入到c++工程中

5/ 將protoc-gen-lua/protobuf上的所有l(wèi)ua文件放到工程的src目錄(lua目錄)下

6/ AppDelegate.cpp 添加代碼
extern "C"{
    int luaopen_pb(lua_State* L);
}
在applicationDidFinishLaunching()中調(diào)用 luaopen_pb(state);

---------------------------------------------------------------------------
    require "src/xy/person_pb"  
    local msg = person_pb.Person()  
    msg.id = 100   
    msg.name = "foo"   
    msg.email = "bar"   

    local pb_data = msg:SerializeToString()  -- Parse Example  
    print("create:", msg.id, msg.name, msg.email, pb_data)  


    local msg = person_pb.Person()   
    msg:ParseFromString(pb_data)   
    print("parser:", msg.id, msg.name, msg.email, pb_data)

---------------------------------------------------------------------------
移植到android 記得將pb.c添加到proj.android\jni\Android.mk中

 

posted @ 2015-02-12 11:42 多彩人生 閱讀(1576) | 評論 (0)編輯 收藏

error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“wctomb”

1>  pb.c
1>e:\test003\test101\src\pb.c : warning C4819: 該文件包含不能在當(dāng)前代碼頁(936)中表示的字符。請將該文件保存為 Unicode 格式以防止數(shù)據(jù)丟失
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(18): error C2054: 在“using”之后應(yīng)輸入“(”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(18): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“using”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(19): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“using”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(19): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“abs”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(19): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(19): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“atexit”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(20): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“atof”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(20): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(20): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“atoi”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(20): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“atol”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(21): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“bsearch”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(21): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(21): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“calloc”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(21): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“div”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(22): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“exit”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(22): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(22): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“free”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(23): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“labs”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(23): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(23): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“ldiv”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(23): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“malloc”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(24): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“mblen”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(24): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(24): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“mbstowcs”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(24): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“mbtowc”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(25): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“qsort”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(25): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(25): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“rand”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(25): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“realloc”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(26): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“srand”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(26): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(26): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“strtod”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(26): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“strtol”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(27): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“strtoul”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(27): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(28): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“wcstombs”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(28): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(28): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“wctomb”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(30): error C2054: 在“using”之后應(yīng)輸入“(”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(33): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“using”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(34): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“system”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(34): error C2059: 語法錯(cuò)誤:“;”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(37): error C2061: 語法錯(cuò)誤: 標(biāo)識(shí)符“atoll”
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\cstdlib(37): error C2059: 語法錯(cuò)誤:“;”
解決方法:
右擊.c文件,c/c++/高級,強(qiáng)制包含文件,如果有algorithm或者其他的,去掉,重新編譯

posted @ 2015-02-06 10:37 多彩人生 閱讀(3433) | 評論 (0)編輯 收藏

fatal error C1853: "Debug\sift.pch"預(yù)編譯頭文件來自編譯器的早期版本

該錯(cuò)誤是因?yàn)楫?dāng)項(xiàng)目中混合了 .cpp 和 .c 文件時(shí),編譯器會(huì)對它們采取不同的編譯方式(主要是因?yàn)閷瘮?shù)聲明的處理方式不同),
因而不能共用一個(gè)預(yù)編譯頭文件。在 VC++ 中,默認(rèn)的預(yù)編譯頭文件是針對 C++ 的 (stdafx.h 和 stdafx.cpp),當(dāng)然也可以創(chuàng)建針對 C 的預(yù)編譯頭。

方法:將少數(shù)的不同類文件設(shè)為不使用預(yù)編譯頭是比較平衡的做法,方法是:對于 VC++6.0,在 FileView 里對要取消預(yù)編譯頭的 .c (或 .cpp) 文件點(diǎn)右鍵,
選擇 settings,在彈出的對話框右邊選擇 category 為 precompiled headers,再設(shè)置選項(xiàng)為 not using ...;
(對于 VS2005,則在 solution explorer 中對相應(yīng)文件點(diǎn)右鍵選擇 properties,在 precompiled headers 項(xiàng)下設(shè)置 not using... 即可。如果需要設(shè)置多個(gè)文件,
則可以按住 Ctrl 鍵再同時(shí)選中這些文件并設(shè)置)
PS:解釋如下點(diǎn)擊項(xiàng)目 點(diǎn)擊屬性 然后選擇C/C++ 預(yù)編譯頭 創(chuàng)建使用頭文件 不使用預(yù)編譯頭文件
(解決方案資源管理器-右擊需要排除的c或cpp文件]-彈出屬性菜單-展開C/C++-預(yù)編譯頭-創(chuàng)建/使用預(yù)編譯頭-選擇不適用預(yù)編譯頭)

posted @ 2015-02-05 18:32 多彩人生 閱讀(12638) | 評論 (0)編輯 收藏

error C2275: “XXX”: 將此類型用作表達(dá)式非法

在移植c++代碼到c的時(shí)候,經(jīng)常會(huì)出現(xiàn)一個(gè)奇怪的錯(cuò)誤,
error C2275: “XXX”: 將此類型用作表達(dá)式非法

表達(dá)式非法,這個(gè)錯(cuò)誤是由于c的編譯器要求將變量的申明放在一個(gè)函數(shù)塊的頭部,而c++沒有這樣的要求造成的。


解決的辦法就是把變量的申明全部放在變量的生存塊的開始。

posted @ 2015-02-05 18:30 多彩人生 閱讀(6893) | 評論 (0)編輯 收藏

Quick-Cocos2d-x 集成 Google protobuf 方法

http://cn.cocos2d-x.org/tutorial/show?id=506

本文將向您介紹Quick-Cocos2d-x集成google protobuf的方法。  
 
第一步   需要最新的protobuf 類庫和解析程序。 
下載地址:https://github.com/sean-lin/protoc-gen-lua
 
git clone https://github.com/sean-lin/protoc-gen-lua.git 到任意的一個(gè)地方
 

然后,可以得到重要的兩個(gè)目錄

1
2
protoc-gen-lua/plugin/ 
protoc-gen-lua/protobuf/
 
第二步, 需要使用protoc —lua_out=. 這種方法, 將我們自己的*.proto 的文件解析成lua文件

plugin目錄是提供將buffer 文件解析成lua 版本的類庫, 需要python 支持。  如果已經(jīng)編譯了google 官方的protoc 那個(gè)程序, 只需要在系統(tǒng)PATH環(huán)境變量總追加plugin目錄就好:

1
export PATH={protoc-gen-lua DIR }/plugin:$PATH
 
關(guān)于protoc的編譯另請google .
 
如果解析不出lua文件來, 可以手動(dòng)志信一下plugin/protoc-gen-lua的程序, 他應(yīng)該是+x 的權(quán)限(chmod +x plugin/protoc-gen-lua)
 
細(xì)節(jié)的安裝步驟可以參考 https://code.google.com/p/protoc-gen-lua/
 
第三步 , 將protobuf 集成到quick 中
protoc-gen-lua/protobuf/ 目錄就是要編譯到quick-cocos2d-x目錄里面的部分。 
 
現(xiàn)在, 我們只需要 protoc-gen-lua/protobuf/pb.c 這個(gè)文件 
 

先確定自己的quick-cocos2d-x lua擴(kuò)展目錄:

1
/quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/
 
所有l(wèi)ua 的c/c++現(xiàn)成擴(kuò)展,都可以直接放到這里。 
  
將pb.c這個(gè)文件復(fù)制到 lua_extension目錄下, 最好獨(dú)立一個(gè)目錄, 免得擴(kuò)展多了亂。 
  

這是我的目錄結(jié)構(gòu):

1
./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c
  
然后開始修改擴(kuò)展程序配置文件, lua_extensions.c
 

路徑為:

1
./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/lua_extensions.c
 

目前是一個(gè)不足60行的小文件, 我打算全部貼進(jìn)來:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "lua_extensions.h" 
   
#if __cplusplus 
extern "C"
#endif 
    
// cjson 
#include "cjson/lua_cjson.h" 
    
    
// zlib 
#include "zlib/lua_zlib.h" 
    
    
// lpack 
#include "lpack/lpack.h" 
    
    
// socket 
#include "socket/luasocket.h" 
#include "socket/mime.h" 
#include "socket/socket_scripts.h" 
    
    
// filesystem 
#include "filesystem/lfs.h" 
    
    
// lsqlite3 
#include "lsqlite3/lsqlite3.h" 
    
    
#include "protobuf/pb.c"   //引用protobuf 庫文件 
    
    
static luaL_Reg luax_exts[] = { 
     {"cjson", luaopen_cjson_safe}, 
     {"zlib", luaopen_zlib}, 
     {"pack", luaopen_pack}, 
     {"socket.core", luaopen_socket_core}, 
     {"mime.core", luaopen_mime_core}, 
     {"lfs", luaopen_lfs}, 
     {"lsqlite3", luaopen_lsqlite3}, 
     {NULL, NULL} 
}; 
    
    
void luaopen_lua_extensions(lua_State *L) 
     // load extensions 
     luaL_Reg* lib = luax_exts; 
     lua_getglobal(L, "package"); 
     lua_getfield(L, -1, "preload"); 
     for (; lib->func; lib++) 
     
         lua_pushcfunction(L, lib->func); 
         lua_setfield(L, -2, lib->name); 
     
     lua_pop(L, 2); 
    
    
     // load extensions script 
     luaopen_socket_scripts(L); 
     luaopen_pb(L);   //這是加入的protobuf 擴(kuò)展注冊名 
    
    
#if __cplusplus 
} // extern "C" 
#endif
至此 , protobuf 擴(kuò)展部分就算擴(kuò)展完成了。 
 
確認(rèn)是否成功支持 , 可以在quick 項(xiàng)目最先被調(diào)用的lua文件中追加 require "pb" 做測試。 
 
*但這時(shí)候通過protoc 轉(zhuǎn)碼后得到的lua文件還不能被解析。 
 
第四步 從項(xiàng)目中包含protobuf的 lua庫
protoc-gen-lua/protobuf/這個(gè)目錄下面, 還有大量的.lua文件, 是用來支持proto轉(zhuǎn)碼后的文件解析調(diào)用的。 不能少了這些文件。 
 
復(fù)制protoc-gen-lua/protobuf文件夾 到項(xiàng)目中 scripts目錄下。  
  

目錄結(jié)構(gòu)應(yīng)該是這樣的:

1
[PROJECT]/scripts/protobuf/*.lua
 
然后, 需要告訴框架,從哪里可以引用到它。 
 

修改main.lua 在require("appxxxxxx") 上面 , 加入下面的代碼:

1
package.path = package.path .. ";./protobuf/?.lua;./scripts/protobuf/?.lua;"
 
這個(gè)方法, 能保證程序在被編譯到手機(jī)之后仍然可以繼續(xù)訪問這個(gè)庫。 
  
***千萬別把轉(zhuǎn)碼的proto文件放到[PROJECT]/scripts/protobuf 目錄里面.不信可以試試。
 
現(xiàn)在, 項(xiàng)目支持protobuf 文件的解析了。
 
第五步  重新編譯player-x
如果不習(xí)慣用player-x調(diào)試, 這個(gè)步驟不是必須的。 
 

進(jìn)入player-x qt源碼目錄 :

1
cd quick-cocos2d-x/player/proj.qt
 

使用qmake 文件執(zhí)行quick-x.pro 文件 

1
qmake ./quick-x.pro
 
繼續(xù):
make 
 
等待結(jié)束, 將得到的quick-x-player文件, 
 
放到:quick-cocos2d-x/player/bin/mac/ 目錄下, 這樣sublime text 裝QuickXDev 擴(kuò)展的直接可以用。 
  
**如果是mac os 10.9 系統(tǒng), 可能編譯不過去player-x程序。 我遇到了這個(gè)問題。 
 
會(huì)提示錯(cuò)誤  pb.c:28:10: fatal error: 'endian.h' file not found 
 

如果錯(cuò)誤信息相同, 修改文件:

1
./quick-cocos2d-x/lib/cocos2d-x/scripting/lua/lua_extensions/protobuf/pb.c
 

查找行:

1
#include <endian.h>
  

臨時(shí)變更為:

1
#include <machine/endian.h>
  
然后重新編譯 player-x 
 
make 就足夠了 
 
make
 
**player-x 編譯完畢后, 千萬要將endian.h 引用改回原來的 #include <endian.h> , 否則打包到手機(jī)的時(shí)候又回提示文件找不到了。 

posted @ 2015-01-17 16:08 多彩人生 閱讀(1963) | 評論 (0)編輯 收藏

Lua注冊回調(diào)到C++

http://cn.cocos2d-x.org/tutorial/show?id=1896

思路

像所有語言一樣,綁定回調(diào)主要是執(zhí)行的任務(wù)執(zhí)行到特定情形的時(shí)候,調(diào)用對用回調(diào)方法。 本文也一樣,Lua注冊回調(diào)到C++的核心思路是,當(dāng)C代碼執(zhí)行到特定特定情形的時(shí)候,調(diào)用Lua的方法。

我這里使用的是用lua_stack直接調(diào)用lua的方法,沒有使用Cocos2d-x封裝的那個(gè)dispatcher,因?yàn)槭煜つ莻€(gè)格式太墨跡了。


主要步驟如下

  • 緩存Lua函數(shù)在Lua環(huán)境中的引用

  • 在C代碼的地方用C的方式設(shè)置好回調(diào)

  • 在C代碼回調(diào)函數(shù)執(zhí)行的時(shí)候,調(diào)用lua函數(shù)


實(shí)現(xiàn)

  • C代碼綁定回調(diào),調(diào)用Lua函數(shù)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void ArmatureNode::registerMovementEventHandler(int handler)
{
    unregisterMovementEventHandler();  //移除之前注冊的監(jiān)聽
    _movementHandler = handler;         //緩存lua函數(shù)的引用 這個(gè)后邊說
     
    auto dispatcher = getCCEventDispatcher();
     
    auto f = [this](cocos2d::EventCustom *event) //注冊c代碼形式的回調(diào) 這里用function做
    {
        auto eventData = (dragonBones::EventData*)(event->getUserData());
        auto type = (int) eventData->getType();
        auto movementId = eventData->animationState->name;
        auto lastState = eventData->armature->getAnimation()->getLastAnimationState();
         
        auto stack = cocos2d::LuaEngine::getInstance()->getLuaStack();
        stack->pushObject(this"db.ArmatureNode");
        stack->pushInt(type);
        stack->pushString(movementId.c_str(), movementId.size());        
        //通過LuaStack調(diào)用lua里的函數(shù)    最后一個(gè)參數(shù)設(shè)置參數(shù)個(gè)數(shù)
        stack->executeFunctionByHandler(_movementHandler, 3);
    };
     
    dispatcher->addCustomEventListener(dragonBones::EventData::COMPLETE, f);
}
void ArmatureNode::unregisterMovementEventHandler(void)
{
    if (0 != _movementHandler)
    {
        cocos2d::LuaEngine::getInstance()->removeScriptHandler(_movementHandler); //移除lua函數(shù)的綁定
        _movementHandler = 0;
    }
}
  • 提供Lua函數(shù)綁定到C的方法   

上邊的這個(gè)函數(shù)直接用cocos里的genbinding.py 是無法正確生成Lua里可調(diào)用的接口的,需要手動(dòng)編寫綁定方法.

說這個(gè)得用到Cocos2d-x中提供的一個(gè)方法:toluafix_ref_function會(huì)把一個(gè)Lua棧中的方法轉(zhuǎn)成一個(gè)int,以便C++中調(diào)用。我會(huì)在最后面說這個(gè)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int tolua_db_DBCCArmature_registerMovementEventHandler(lua_State* tolua_S)
{
    if (NULL == tolua_S)
        return 0;
    int argc = 0;
     
    dragonBones::ArmatureNode* self = nullptr;
    self = static_cast<dragonBones::ArmatureNode*>(tolua_tousertype(tolua_S,1,0)); //第一個(gè)參數(shù) 就是lua里的self
     
    argc = lua_gettop(tolua_S) - 1;
     
    if (1 == argc)
    {
        //第二個(gè)參數(shù),就是Lua里的function 這里要通過toluafix_ref_function這個(gè)函數(shù)映射成一個(gè)Int值
        int handler = (toluafix_ref_function(tolua_S,2,0)); 
        self->registerMovementEventHandler(handler);
         
        return 0;
    }
    return 0;
}

 

  • 將綁定方法綁定到Lua環(huán)境里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int extends_ArmatureNode(lua_State* tolua_S)
{
    lua_pushstring(tolua_S, "db.ArmatureNode");//之前db.ArmatureNode是通過腳本綁定在lua里。這里只做擴(kuò)展
    lua_rawget(tolua_S, LUA_REGISTRYINDEX);
    if (lua_istable(tolua_S,-1))
    {
        lua_pushstring(tolua_S,"registerMovementEventHandler");
        lua_pushcfunction(tolua_S,tolua_db_DBCCArmature_registerMovementEventHandler);
        lua_rawset(tolua_S,-3);
    }
     
    lua_pop(tolua_S, 1);
    return 0;
}
  • Lua里設(shè)置回調(diào)到C++

1
2
3
4
5
6
7
8
 local arm = db.ArmatureNode:create("Dragon")
    local animation = arm:getAnimation()
    animation:gotoAndPlay("walk")
    arm:registerMovementEventHandler(
        function(...)
            print(...) 
        end
    )


-測試

打印回調(diào)輸出,測試通過 userdata 8 walk


其他

  • toluafix_ref_function 以及 toluafix_get_function_by_refid

這 兩個(gè)方法是相互對應(yīng)的 toluafix_ref_function這個(gè)方法在注冊表上將一個(gè)lua的function與一個(gè)function_id生成映射 toluafix_get_function_by_refid 方法可以通過前一個(gè)方法生成的function_id來講綁定的lua function放到棧頂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//
TOLUA_API int toluafix_ref_function(lua_State* L, int lo, int def)
{
    if (!lua_isfunction(L, lo)) return 0;
    s_function_ref_id++;                            //function_id 加1
    lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING);//在注冊表上,存放luafunction 映射table 的key壓棧
    lua_rawget(L, LUA_REGISTRYINDEX);               //獲取方法映射表,放在棧頂
    lua_pushinteger(L, s_function_ref_id);          //function_id壓棧
    lua_pushvalue(L, lo);                           //lo有效處索引處是lua方法,lua方法拷貝,壓棧
 
 
    lua_rawset(L, -3);                        //生成映射 
    lua_pop(L, 1);                                              
    return s_function_ref_id;
}
TOLUA_API void toluafix_get_function_by_refid(lua_State* L, int refid)
{
    lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING);            //存放luafunction 映射table 的key壓棧
    lua_rawget(L, LUA_REGISTRYINDEX);                           //獲取方法映射表,放在棧頂
    lua_pushinteger(L, refid);                                  //function_id壓棧
    lua_rawget(L, -2);                                          //獲取到的luafunction 放到棧頂
    lua_remove(L, -2);                                          //
}
  • executeFunctionByHandler

executeFunctionByHandler 這個(gè)方法只是通過toluafix_get_function_by_refid 獲取到function然后通過lua_pcall 方法調(diào)用,代碼就不寫了。

posted @ 2015-01-17 11:12 多彩人生 閱讀(2867) | 評論 (0)編輯 收藏

僅列出標(biāo)題
共25頁: 1 2 3 4 5 6 7 8 9 Last 

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情一区二区| 久久久久久久精| 亚洲理伦在线| 亚洲男人第一网站| 免费亚洲视频| 一本一本久久a久久精品牛牛影视| 欧美一区亚洲一区| 国产精品久久久久99| 在线日韩欧美视频| 欧美伊人久久大香线蕉综合69| 亚洲国产一区二区精品专区| 亚洲欧美视频在线| 欧美日韩不卡| 亚洲国产欧美一区二区三区久久 | 国产女精品视频网站免费| 亚洲国产一区在线| 久久久最新网址| 亚洲欧美国产一区二区三区| 欧美午夜激情在线| 国产欧美亚洲一区| 亚洲一区二区三区免费视频| 亚洲国产精品成人精品| 一区二区精品| 久久久www成人免费精品| 国产人久久人人人人爽| 午夜国产精品视频| 亚洲精品久久久蜜桃 | 久久手机免费观看| 欧美日韩在线直播| 这里只有精品电影| 亚洲免费观看高清完整版在线观看熊| 欧美成人在线网站| 亚洲精品社区| 理论片一区二区在线| 亚洲香蕉视频| 国产精品日本精品| 欧美在线播放| 久久aⅴ国产欧美74aaa| 国内一区二区三区| 蜜桃久久av| 欧美在线首页| 国产精品久久久久久久久果冻传媒| 一区二区高清视频在线观看| 国产精品久久久久天堂| 香港成人在线视频| 亚洲高清毛片| 欧美性生交xxxxx久久久| 欧美色大人视频| 欧美大片91| 黄色亚洲在线| 亚洲综合色自拍一区| 在线亚洲成人| 欧美激情一区二区在线| 欧美freesex8一10精品| 国产欧美一区二区色老头| 日韩一区二区精品| 亚洲精品网站在线播放gif| 久久狠狠亚洲综合| 欧美在线三级| 国产精品久久久999| 亚洲狼人综合| 一区二区三区 在线观看视| 米奇777超碰欧美日韩亚洲| 久久婷婷国产麻豆91天堂| 国产日韩欧美精品在线| 日韩一区二区福利| 亚洲图色在线| 欧美视频国产精品| 一区二区三区蜜桃网| 一区二区三区视频免费在线观看| 欧美成人有码| 亚洲免费观看在线观看| 亚洲一区二区成人| 国产精品成人观看视频国产奇米| 欧美sm视频| 亚洲欧洲日本国产| 欧美激情二区三区| 亚洲精品日产精品乱码不卡| aa亚洲婷婷| 欧美婷婷久久| 亚洲砖区区免费| 久久狠狠亚洲综合| 在线观看日韩专区| 欧美丰满高潮xxxx喷水动漫| 亚洲国产精品久久91精品| 国产日韩欧美日韩大片| 久久九九精品| 欧美激情一区| 国产精品成人免费| 亚洲欧美日韩中文视频| 亚洲国产片色| 久久久久久成人| 亚洲香蕉伊综合在人在线视看| 国产一区二区三区四区五区美女| 欧美乱大交xxxxx| 久久精品成人欧美大片古装| 一本色道久久综合亚洲精品婷婷| 噜噜噜久久亚洲精品国产品小说| 亚洲欧美国产视频| 亚洲精品1区| 国产欧美日韩精品丝袜高跟鞋| 欧美精品情趣视频| 久久精品亚洲乱码伦伦中文| 亚洲最新在线| 亚洲福利视频网| 久久米奇亚洲| 午夜精品国产更新| 一本色道久久| 在线免费观看视频一区| 国产欧美日韩视频| 欧美网站在线观看| 欧美精品久久天天躁| 久久久久久成人| 性色av一区二区三区在线观看| 一个人看的www久久| 亚洲国产精品美女| 久久亚洲国产精品日日av夜夜| 午夜视频一区| 亚洲欧美综合网| 亚洲综合电影| 亚洲一区二区在线看| 夜夜嗨av一区二区三区网页 | 欧美国产国产综合| 久久激情五月丁香伊人| 亚洲一级片在线观看| 亚洲精品乱码久久久久久黑人| 狠狠色狠狠色综合系列| 国产午夜精品理论片a级大结局| 国产精品剧情在线亚洲| 欧美日韩一区三区| 欧美日韩另类视频| 欧美日韩精品系列| 欧美日韩三区| 国产精品久久97| 国产精品永久免费| 国产免费一区二区三区香蕉精| 国产精品嫩草久久久久| 国产欧美日韩亚洲一区二区三区| 国产精品美女久久久浪潮软件| 欧美视频四区| 国产精品午夜av在线| 国产午夜精品一区二区三区视频| 国产精品亚发布| 国内精品免费在线观看| 在线免费观看视频一区| 亚洲人成在线免费观看| 一本色道88久久加勒比精品| 一级日韩一区在线观看| 亚洲一区二区三区四区在线观看| 亚洲综合色在线| 久久精品亚洲精品国产欧美kt∨| 久久久无码精品亚洲日韩按摩| 欧美成人精品影院| 亚洲精品久久久久久久久| 亚洲天堂网站在线观看视频| 性欧美在线看片a免费观看| 久久久精品一区| 欧美国产日韩a欧美在线观看| 欧美天堂在线观看| 国产一区二区三区视频在线观看| 亚洲电影免费在线 | 久久全国免费视频| 欧美暴力喷水在线| 国产精品国产馆在线真实露脸 | 中国成人黄色视屏| 亚洲欧美综合国产精品一区| 久久另类ts人妖一区二区| 欧美成ee人免费视频| 国产精品久久7| 伊人春色精品| 99国产精品久久久久老师 | 国产精品美女久久久浪潮软件 | 亚洲欧美国产精品va在线观看| 欧美亚洲综合久久| 蜜臀va亚洲va欧美va天堂| 欧美人成在线| 国产亚洲精品aa| 99精品国产99久久久久久福利| 先锋亚洲精品| 欧美v国产在线一区二区三区| 亚洲麻豆视频| 久久精品欧洲| 国产精品久久久久久久久免费桃花| 国产日韩av在线播放| 91久久综合| 久久久精品欧美丰满| 最新亚洲激情| 久久国产福利| 国产精品日日摸夜夜添夜夜av| 尤物网精品视频| 香蕉久久夜色精品国产使用方法| 免费不卡在线观看| 亚洲欧美三级伦理| 欧美日韩在线不卡一区| 亚洲国产欧美国产综合一区| 久久国产色av| 亚洲午夜精品一区二区| 欧美极品在线观看| 在线欧美小视频| 久久人人97超碰人人澡爱香蕉|