2017-07-26 34 views
-1
分段故障

我是相當新的編碼,並且我一直在努力,只要按下連接到GPIO引腳上我的RasPi一個按鈕,寫東西寫一個佔位符的文本文檔:與wiringPi

//Write date function// 
void record() { 

    ofstream myFile; 
    myFile.open("report.txt"); 
    myFile << "Input at SPAM \n"; 
    myFile.close(); 

} 

//myRead function// 
void myRead(int i){ 

    if((digitalRead(4) == HIGH) && (i<5)) { 
     record(); 
     digitalWrite(14, HIGH); 
     delay(500); 
     digitalWrite(14, LOW); 
     ++i; 
     delay(500); 
     myRead(i); 
    } 
    else{ 
     if((digitalRead(4) != HIGH) && (i<5)){  
      myRead(i); 
     } 
    } 

} 

int main() { 
    wiringPiSetup(); 
    pinMode(12, OUTPUT); 
    pinMode(14, OUTPUT); 
    pinMode(4, INPUT); 
    digitalWrite(12, HIGH); 
    digitalWrite(14, LOW); 

    myRead(1); 
    digitalWrite(14, HIGH); 
    delay(5000); 
    digitalWrite(14, LOW); 

    return 0; 
} 

該代碼編譯沒有任何抱怨,但如果我運行在終端沒有sudo命令,我得到一個「分段錯誤」錯誤。
當我用sudo命令運行它時,程序啓動並幾乎立即結束。

參考:

  • 銷12對試驗板的分壓器提供電力。
  • 引腳4應接受來自此分頻器的輸入。
  • 引腳14使一個LED光只要存在對銷的輸入4.

每當運行程序和非常快速地壓在分壓器的按鈕時,如果我按住按鈕LED將點亮。

我怎樣才能讓它正常運行,而不是一開始就停止運行?

+0

'myRead'可能遞歸到您需要按下按鈕的時間。通過調試信息(在編譯和鏈接時添加'-g'標誌),然後在調試器中運行以找出崩潰發生的時間和位置,並查看函數調用堆棧是否充滿了調用' myRead'。 –

+0

謝謝,我會嘗試。我的代碼在源文件中縮進,但我不確定這裏的格式。現在編輯縮進,但我一直在教自己C++不到一個月,所以我得到了我的代碼非常混亂,難以閱讀。 – Merk

+0

這似乎是問題所在。我得到的輸出是:「程序接收到的信號SIGSEGV,分段錯誤 0x00010b6c in myRead(i = )in inputReport.cpp:18 18 void myRead(int i){」 。我不確定該怎麼做。關於如何讓系統每隔幾秒檢查一次輸入的建議? – Merk

回答

0

我認爲myRead有幾個可能的問題。

A小調重寫可能是:

void myRead(int i) 
{ 
    if((digitalRead(4) == HIGH) && (i<5)) { 
     record(); 
     digitalWrite(14, HIGH); 
     delay(500); 
     digitalWrite(14, LOW); 
     ++i; 
     delay(500); 
     myRead(i); 
    } else if((digitalRead(4) != HIGH) && (i<5)) { 
     myRead(i); 
    } 
} 

請注意,您有兩個呼叫digitalRead - 這可能導致問題,因爲第一個我回來的東西不同,HIGH和第二可能返回HIGH,這意味着這兩個條件都沒有。

您撥打電話myRead與原始電話在替代分支中使用相同的i。如果digitalRead多次返回與HIGH不同的東西,那麼您的堆棧將會非常快速地運行,並且會出現段錯誤。

我會提出一個不同的版本,即應該是相同的(霸菱對我而言有什麼誤會):

void myRead(int i) 
{ 
    // as long as i is less than 5 
    while (i < 5) { 
     // busy wait for digitalRead(4) to be HIGH 
     while (digitalRead(4) != HIGH); 
     // do the main thing 
     record(); 
     digitalWrite(14, HIGH); 
     delay(500); 
     digitalWrite(14, LOW); 
     ++i; 
     delay(500); 
    } 
} 

也請注意,這只是普通的C,不是C++(良好技術上,它是有效的C++,但它沒有使用C++)

+0

這似乎是可行的,但我只是改變了它,並使用while循環,在一些程序員夥計的建議,這似乎工作得很好。感謝你的回答!至於整個C/C++的東西......我不知道關於C的一件事情。我想開始學習一門編程語言,還有一些人推薦C++。我從Sololearn課程中學到了基礎知識,但我從未有人直接教過我。除了明顯的「繼續採取更具挑戰性的項目」外,關於如何在C++中取得更好的任何建議? – Merk

+0

獲取一本關於C++的好書,而不是一些隨機的互聯網課程。通常他們是由那些在20世紀80年代學過C或者在1980年代學過C的人所寫的。他們有各種你不想學習的壞東西。我建議讓Bjarne Stroustroup的最新書與您的編譯器相關。希望這是C++ 11或更高版本(最好是C++ 17)。還有其他好書,但我不知道他們中的任何一本,所以我不能評論他們。 – Clearer

+0

謝謝,我會研究它。我距離單身漢還有一年的時間,我從來沒有在學校做過計算機。我想要做的課程涉及一定程度的編程,但聲稱要爲完整的初學者教授它。儘管如此,我仍想在繼續之前瞭解自己在做什麼。 – Merk