2015-11-23 137 views
-1

在一個C的main函數的頂部「在此範圍內未聲明」 ++劇本,我定義基於命令行參數的函數指針如下:這裏函數指針

int main(int argc, char *argv[]) 
{ 

    // Set integration method. 
    const char* method = argv[argc - 1]; 
    if (strcmp(method, "euler") == 0) 
    { 
     std::vector<double> (*get_V)(const std::vector<double> &, const double, 
            const std::vector<double> &); 
     get_V = euler; 
    } 
    else if (strcmp(method, "exact") == 0) 
    { 
     std::vector<double> (*get_V)(const std::vector<double> &, const double, 
            const std::vector<double> &); 
     get_V = exact; 
    } 
    else 
    { 
     throw std::invalid_argument("Invalid method supplied at command line."); 
    } 

我的目標是將變量get_V設置爲指向函數euler或函數exact的指針,具體取決於命令行參數。

後來,仍是main功能裏面,我叫get_V如下:

V = get_V(V, Delta_t, dV_dt); 

當我嘗試編譯,這條線 - 在我稱之爲get_V - 引發以下錯誤:

(master)[email protected][dopa_net]> g++ -O3 hansel.cpp -o hansel.o 
hansel.cpp: In function ‘int main(int, char**)’: 
hansel.cpp:65: error: ‘get_V’ was not declared in this scope 

這對我來說毫無意義。我在此範圍內確實聲明get_V。這是怎麼回事? (我可以張貼我的整個主函數如果這會是有益的,但它是相當長的。)

+1

您在塊內聲明瞭'get_V'。當該塊結束時,其中的所有當地人都超出範圍。 –

+0

@JamesRoot啊,我習慣於Python,其中如果語句沒有定義一個單獨的範圍。謝謝。 – dbliss

回答

1

你宣佈每次兩個不同的變量命名get_V,包括本地的if報表範圍內。一旦if聲明中的代碼完成,那些變量就不復存在了,它們已經超出了範圍。

簡單的解決方案?聲明變量以外的if語句,並且僅執行if語句正文中的分配。

+0

如果'euler'和'exact'最終採用不同的論點,那麼我最好的選擇是什麼?有沒有什麼辦法可以在外面的條件塊內部進行聲明? – dbliss

+1

@dbliss然後你應該開始重新考慮你的設計。或者簡單的解決方法,只需在他們的'if'語句中調用函數即可。 –

+0

調用那些if語句中的函數將不起作用。我想我可以把新的if語句在函數調用時(在一個循環中)。這個設計在任何方面對我來說似乎都不合理。我有不同的數字方法可以在腳本中使用。我想指定在命令行中使用哪種方法。每種方法都與一個函數關聯。 – dbliss