###前提・実現したいこと
cntを正しく動作させたい
###発生している問題・エラーメッセージ
cntでカウントしてそれに準じて処理を行なっているのですが
なぜか動作がおかしく、cntを表示させると値がおかしくて困っています
###該当のソースコード
import UIKit import CoreMotion import AudioToolbox import AVFoundation class ViewController: UIViewController { let motionManager = CMMotionManager() var dataX:[Double] = [] var dataY:[Double] = [] var dataZ:[Double] = [] var deviY = [Double](repeating: 0.0, count: 15000) var dispY = [Double](repeating: 0.0, count: 15000) var btn = false weak var timer: Timer! var startTime = Date() var totalTime = 0.0 var cnt:Int = 0 var alertY = true @IBOutlet weak var timeL: UILabel! @IBOutlet weak var accelX: UILabel! @IBOutlet weak var accelY: UILabel! @IBOutlet weak var accelZ: UILabel! @IBOutlet weak var kakuninL: UILabel! // 計測開始・停止ボタン @IBAction func startB(_ sender: Any) { let button = sender as! UIButton if (btn == true) { btn = false cnt = 0 deviY = [Double](repeating: 0.0, count: 15000) dispY = [Double](repeating: 0.0, count: 15000) button.setTitle("計測開始", for: .normal) stopTimer() } else { btn = true button.setTitle("計測停止", for: .normal) startTimer() cnt = 0 } } @IBAction func resetB(_ sender: Any) { cnt = 0 deviY = [Double](repeating: 0.0, count: 15000) dispY = [Double](repeating: 0.0, count: 15000) resetTimer() stopTimer() } // データの格納 func outputAccelData(acceleration: CMAcceleration){ if (btn) { dataX.append(acceleration.x) dataY.append(acceleration.y) dataZ.append(acceleration.z) accelX.text = String(format: "x = %.3f", acceleration.x) accelY.text = String(format: "y = %.3f", acceleration.y) accelZ.text = String(format: "z = %.3f", acceleration.z) culculator() } } // データの計算 func culculator() { var tmpy:Double = 0.0 if(dataY.count > 10) { for i in 0 ..< (dataY.count - 11) { for j in i ..< (i + 10) { tmpy = tmpy + dataY[j] } tmpy = tmpy / 10.0 for k in i ..< (i + 10) { dispY[i] = dispY[i] + pow(dataY[k]-tmpy,2.0) } dispY[i] = dispY[i] / 10.0 deviY[i] = sqrt(dispY[i]) if(judgecount(deviY[i])){ cnt = cnt + 1 } } } } // 動作の判定 func judgecount(_ devi:Double) -> Bool { var soundIdRing:SystemSoundID = 1005 kakuninL.text = String(format: "%d", cnt) if((devi > 0.20)&&(cnt > 50)) { cnt = 0 return false } else if((cnt == 100)&&(alertY)) { alertY = false let alert1 = UIAlertController(title: nil, message: nil, preferredStyle: .alert) alert1.title = "警告!" alert1.message = "1の方" alert1.addAction( UIAlertAction( title: "OK", style: .default, handler: {(action) -> Void in self.alertY = true })) self.present( alert1, animated: true, completion:nil) if let soundUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), nil, nil, nil){ AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing) AudioServicesPlaySystemSound(soundIdRing) } return true } else if((cnt > 200)&&(alertY)) { alertY = false let alert2 = UIAlertController(title: nil, message: nil, preferredStyle: .alert) alert2.title = "警告!" alert2.message = "2の方" alert2.addAction( UIAlertAction( title: "OK", style: .default, handler: {(action) -> Void in self.cnt = 0 self.alertY = true })) self.present( alert2, animated: true, completion:nil) return false } else { return true } } // アラートの表示 func displayalert(_ message:String) { let alert = UIAlertController(title: nil, message: nil, preferredStyle: .alert) alert.title = "警告!" alert.message = message alert.addAction( UIAlertAction( title: "OK", style: .default, handler: {(action) -> Void in self.startTimer() self.alertY = true })) self.present( alert, animated: true, completion:nil) } // 時間の表示 func displayTime(_ time: TimeInterval) { let minute = (Int)(fmod((time/60), 60)) let second = (Int)(fmod(time, 60)) let msec = (Int)((time - floor(time))*100) timeL.text = String(format: "%02d : %02d : %02d", minute, second, msec) } // 時間の計測 @objc func timerCounter() { let currentTime = totalTime + Date().timeIntervalSince(startTime) displayTime(currentTime) } // タイマーのスタート func startTimer() { if timer != nil { timer.invalidate() } else { startTime = Date(); } timer = Timer.scheduledTimer( timeInterval: 0.01, target: self, selector: #selector(self.timerCounter), userInfo: nil, repeats: true) } // タイマーの一時停止 func stopTimer() { if timer != nil { totalTime = totalTime + Date().timeIntervalSince(startTime) timer.invalidate() timer = nil } displayTime(totalTime) } // タイマーのリセット func resetTimer() { startTime = Date(); totalTime = 0.0 displayTime(totalTime) startTimer() } // 加速度取得停止 func stopAccelerometer(){ if (motionManager.isAccelerometerActive) { motionManager.stopAccelerometerUpdates() } } override func viewDidLoad() { super.viewDidLoad() if motionManager.isAccelerometerAvailable { motionManager.accelerometerUpdateInterval = 0.5 motionManager.startAccelerometerUpdates( to: OperationQueue.current!, withHandler: {(accelData: CMAccelerometerData?, errorOC: Error?) in self.outputAccelData(acceleration: accelData!.acceleration) }) } UIApplication.shared.isIdleTimerDisabled = true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
「なぜか動作がおかしく」を具体的に書きましょう。想定している振る舞いを説明して、その振る舞いのどの処理がうまくいっていないのか、それに対する自分の現在の考えなどを書いていただけると回答が得られやすいのではないでしょうか。どのようなプログラムなのかソースを全部読まなくてはいけないという負担を感じると回答者も回答への意欲が薄れます。
あなたの回答
tips
プレビュー