1. 程式人生 > >來自intlsy‘s省選debug方法

來自intlsy‘s省選debug方法

comm turn 要求 out pop point 一個 int -o

debugging


寫代碼的時候......

代碼風格

唯一的要求: 自己能看懂

#define 的使用

下面會講

工程代碼 (不強求)

  • 函數專註於自己處理的數據
  • 每一個步驟分開, 別凝在一起

變量名

  • 好區分
  • 不易寫錯

細節問題

  • undefined behavior
    • 忘記寫返回值 ( 不開 -O2 時返回奇怪的東西, 開 -O2 直接 RE )
    • main 函數也要記得返回
  • 變量名與關鍵字
    • 只寫了一點代碼: 現在改還來得及
    • 寫了一大堆: 使用 namespace
    • -std=c++11?
  • 類型
    • double
      ? long double?
    • long long? int?
    • longlong?

樣例過不去?

intlsy‘s debugger

#define B cout << "BreakPoint" << endl;
#define O(x) cout << #x << " " << x << endl;
#define O_(x) cout << #x << " " << x << "  ";
#define Msz(x) cout << "Sizeof " << #x << " " << sizeof(x)/1024/1024 << " MB" << endl;
_tp<_tyn T>void Print( T a[] , int s , int t , char sp = ‘ ‘ , char ed = ‘\n‘ ){
    if( s > t ) return;
    for( int i = s ; i < t ; i++ )
        cout << a[i] << sp;
    cout << a[t] << ed;
    cout.flush();
}
_tp<_tyn T>void Print( T a , int s = 0 , int t = -1 , char sp = ‘ ‘ , char ed = ‘\n‘ ){
    if( t == -1 ) t = a.size()-1;
    for( int i = s ; i <= t ; i++ )
        cout << a[i] << sp;
    cout << ed;
    cout.flush();
}

實際應用:

#include <iostream>
using namespace std;

int Popcount( int x ){
    int ans = 0;
    while(x){
        if(x&1) ++ans;
        // x >>= 1 // OMG! I FORGOT THIS!
    }
    // Where is the return?
}
int main(){
    cout << Popcount(2333) << endl;
    return 0;
}

define

初級用法:

#define B cout << "BreakPoint" << endl;

進階:

長得像函數一樣...

#define O(x) cout << #x << " " << x << endl;

#x: 輸出 x 的變量名

小實驗:

#define Name_Of_Var(x) cout << #x << endl;
int mrclr_akioi = 2333;
Name_Of_Var(mrclr_akioi);

其他 # 開頭的語句

#ifdef INTOJ_SAIGAO
cout << "INTOJ_SAIGAO" << endl;
#endif

gdb 調試

不會

我怎麽調都調不出來

  • 使用上面的 debugger
  • 部分重構
  • 紙筆模擬 (是不是算法錯了)
  • 實在不行, 就趕快做下一題

奇技淫巧

  • 多上幾次衛生間
    • 禁賽警告
    • 禁賽警告
    • 禁賽警告

來自intlsy‘s省選debug方法