- 締切済み
ADボードのプログラムでの無限サンプリング
自分でプログラムをADsamplingData関数でやってみたのですがデータが指定の保存場所に出力されません。 CSV形式で保存するプログラムを作ったつもりです。 保存場所はEドライブのEdataの中に出力されるようにしたいです。 ちなみにプログラムはこちらです。 int nRet; HANDLE hDeviceHandle; ADSMPLREQ SmplConfig; ADBOARDSPEC BoardSpec; ULONG ulSmplNum; FILE *outp; WORD wSmplData[20000][2]; hDeviceHandle = AdOpen ("FBIAD1"); if (hDeviceHandle == INVALID_HANDLE_VALUE){ AfxMessageBox("デバイスのオープンに失敗しました",MB_OK, 0); return; } else{ nRet = AdGetSamplingConfig(hDeviceHandle,&SmplConfig); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("サンプリング設定情報の読み出しに失敗しました",MB_OK, 0); } nRet = AdGetDeviceInfo(hDeviceHandle, &BoardSpec ); if(nRet !=AD_ERROR_SUCCESS){ AfxMessageBox("デバイスの情報取得にに失敗しました", MB_OK, 0); } { SmplConfig.SmplChReq[0]. ulChNo = 2; SmplConfig.ulSmplNum = 20000; SmplConfig.ulTrigMode = AD_ETERNITY; SmplConfig.fSmplFreq = 20000; SmplConfig.SmplChReq[0]. ulRange = AD_5V; nRet = AdSetSamplingConfig(hDeviceHandle,&SmplConfig ); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("サンプリング条件設定に失敗しました",MB_OK, 0); } nRet = AdStartSampling(hDeviceHandle, FLAG_SYNC); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("CSVファイル作成に失敗しました", MB_OK, 0); } AdGetSamplingData(hDeviceHandle,&wSmplData[0][0], &ulSmplNum ); outp = fopen("E\\Edata\\record.csv","a"); fprintf(outp,"%f\n",wSmplData); fclose(outp); } } } 何が違うのですか? dビルドはできるのですが、プログラムを動かしてもファイルができません。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- koi1234
- ベストアンサー率53% (1866/3459)
AdOpen ("FBIAD1");って使ってるのはインターフェースのADボード? 無限サンプリングにもなってないソースに見えますが今後の話? (ちょっと前に似た件で質問立ててた人?) まあ上は置いといて 転記ミスでないのならファイルができないのは >outp = fopen("E\\Edata\\record.csv","a"); が間違っているからではないでしょうか ↑だとプログラム動かした時のカレントフォルダのE\Edata にファイルを書こうとします E:\\Edata\\record.csv にしてもできませんか? できたとしてもほかの回答者書かれているようにまともなデータは書き込まれません fprintf(outp,"%f\n",wSmplData[i][p]); 等のようにして配列分(ループ)書き込み処理してください それでもできないなら E:\Edata フォルダがないとか そもそもそこのロジックが走っていないとか ※きちんとソース見たわけではありません
- TT414
- ベストアンサー率18% (72/384)
≻WORD wSmplData[20000][2]; ≻fprintf(outp,"%f\n",wSmplData); 無理です、アドレスを浮動少数点数として出力できません、出力がないのではなく変になるだけですが。
補足
どうしたら改善されますか? fopenでファイルが作成さえされないのはなぜですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
fopen の返り値をチェックしないのはなぜ?
補足
プログラムが無知なので詳しく教えて下さい。 返り値とはE:¥¥Edata¥¥ の:のことですか?
補足
インターフェイスのADボードを使用しています。前も投稿したものです。 E:\\Edata\\record.csv の:がぬけていたので直しましたがファイルができません。 ちゃんとEドライブの下にEdataをおいています。 ロジックとはどうしたら通りますか? fprintf(outp,"%f\n",wSmplData[i][p]);はiとpを forでfor(i=0;i<=94;++i)のようにすればいいですか? int nRet; HANDLE hDeviceHandle; ADSMPLREQ SmplConfig; ADBOARDSPEC BoardSpec; ULONG ulSmplNum; FILE *outp; WORD wSmplData[20000]; hDeviceHandle = AdOpen ("FBIAD1"); if (hDeviceHandle == INVALID_HANDLE_VALUE){ AfxMessageBox("デバイスのオープンに失敗しました",MB_OK, 0); return; } else{ nRet = AdGetSamplingConfig(hDeviceHandle,&SmplConfig); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("サンプリング設定情報の読み出しに失敗しました",MB_OK, 0); } nRet = AdGetDeviceInfo(hDeviceHandle, &BoardSpec ); if(nRet !=AD_ERROR_SUCCESS){ AfxMessageBox("デバイスの情報取得にに失敗しました", MB_OK, 0); } { SmplConfig.SmplChReq[0]. ulChNo = 2; SmplConfig.ulSmplNum = 20000; SmplConfig.ulTrigMode = AD_ETERNITY; SmplConfig.fSmplFreq = 20000; SmplConfig.SmplChReq[0]. ulRange = AD_5V; nRet = AdSetSamplingConfig(hDeviceHandle,&SmplConfig ); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("サンプリング条件設定に失敗しました",MB_OK, 0); } nRet = AdStartSampling(hDeviceHandle, FLAG_SYNC); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("CSVファイル作成に失敗しました", MB_OK, 0); } AdGetSamplingData(hDeviceHandle,&wSmplData[0], &ulSmplNum ); AdOutputDO(hDeviceHandle,1); outp = fopen("E:\\Edata\\record.csv","a"); fprintf(outp,"%f\n",wSmplData[0]); fclose(outp); } } } ちなみに直したプログラムがこちらです。