質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

5185閲覧

C#/Windows フォームアプリケーションでのSystem.AccessViolationExceptionについて

Kashi_wamochi

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

1クリップ

投稿2019/04/10 13:42

前提・実現したいこと

現在C#で計測制御のプログラムを作成しています。
使用するのはContecのPCIe接続のアナログ入力ボードで、現物が手元にないため、
API-AIO(WDM)からDemo Deviceという仮想デバイスを用いて開発しています。

環境はVisual Studio 2015/Windows フォームアプリケーション/.Net Framework 4.6.1です。

まず取っ掛かりとして、100ミリ秒間隔で16個のテキストボックスにアナログ入力の値を表示しようとしていましたが、
20秒程度プログラムが動いたのち、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

System.AccessViolationException
HResult=0x80004003
Message=保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
Source=System.Windows.Forms
スタック トレース:
場所 System.Windows.Forms.PropertyStore.LocateObjectEntry(Int16 entryKey, Int32& index)
場所 System.Windows.Forms.PropertyStore.GetObject(Int32 key, Boolean& found)
場所 System.Windows.Forms.Form.get_IsMdiChild()
場所 System.Windows.Forms.Form.CanRecreateHandle()
場所 System.Windows.Forms.Form.set_Active(Boolean value)
場所 System.Windows.Forms.Form.WmActivate(Message& m)
場所 System.Windows.Forms.Form.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

該当のソースコード

c#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using System.Windows.Forms; 6 7namespace DigitShowBasic 8{ 9 static class Program 10 { 11 /// <summary> 12 /// アプリケーションのメイン エントリ ポイントです。 13 /// </summary> 14 [STAThread] 15 static void Main() 16 { 17 Application.EnableVisualStyles(); 18 Application.SetCompatibleTextRenderingDefault(false); 19 Application.Run(new MainForm()); // ここでエラーメッセージが発生 20 } 21 } 22}

c#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using CaioCs; 11 12namespace DigitShowBasic 13{ 14 public partial class MainForm : Form 15 { 16 Caio aio = new Caio(); 17 18 int Ret; 19 short m_Id; 20 DateTime StartTime; 21 static short ADNUM = 16; 22 int ChartPointNum = 1000; 23 int AiSamplingTimes = ADNUM; 24 float[] AiData = new float[ADNUM]; 25 26 public MainForm() 27 { 28 InitializeComponent(); 29 30 AdInitialize(); 31 } 32 33 private void AdInitialize() 34 { 35 Ret = aio.Init("Aio000", out m_Id); 36 ErrorJudge(Ret); 37 Ret = aio.SetAiInputMethod(m_Id, 0); 38 ErrorJudge(Ret); 39 Ret = aio.SetAiChannels(m_Id, ADNUM); 40 ErrorJudge(Ret); 41 Ret = aio.SetAiRangeAll(m_Id, 0); 42 ErrorJudge(Ret); 43 Ret = aio.SetAiTransferMode(m_Id, 0); 44 ErrorJudge(Ret); 45 Ret = aio.SetAiMemoryType(m_Id, 0); 46 ErrorJudge(Ret); 47 Ret = aio.SetAiClockType(m_Id, 0); 48 ErrorJudge(Ret); 49 Ret = aio.SetAiSamplingClock(m_Id, 100000); 50 ErrorJudge(Ret); 51 Ret = aio.SetAiStartTrigger(m_Id, 0); 52 ErrorJudge(Ret); 53 Ret = aio.SetAiStopTrigger(m_Id, 4); 54 ErrorJudge(Ret); 55 Ret = aio.ResetAiMemory(m_Id); 56 ErrorJudge(Ret); 57 int AiSamplingCount; 58 Ret = aio.GetAiSamplingCount(m_Id, out AiSamplingCount); 59 ErrorJudge(Ret); 60 Ret = aio.StartAi(m_Id); 61 ErrorJudge(Ret); 62 StartTime = DateTime.Now; 63 64 } 65 66 private void MainForm_Closed(object sender, FormClosedEventArgs e) 67 { 68 Ret = aio.StopAi(m_Id); 69 ErrorJudge(Ret); 70 Ret = aio.Exit(m_Id); 71 ErrorJudge(Ret); 72 } 73 74 private void timer1_Tick(object sender, EventArgs e) 75 { 76 Ret = aio.GetAiSamplingDataEx(m_Id, ref AiSamplingTimes, ref AiData); 77 CH01_textbox.Text = AiData[0].ToString("F6"); 78 CH02_textbox.Text = AiData[1].ToString("F6"); 79 CH03_textbox.Text = AiData[2].ToString("F6"); 80 CH04_textbox.Text = AiData[3].ToString("F6"); 81 CH05_textbox.Text = AiData[4].ToString("F6"); 82 CH06_textbox.Text = AiData[5].ToString("F6"); 83 CH07_textbox.Text = AiData[6].ToString("F6"); 84 CH08_textbox.Text = AiData[7].ToString("F6"); 85 CH09_textbox.Text = AiData[8].ToString("F6"); 86 CH10_textbox.Text = AiData[9].ToString("F6"); 87 CH11_textbox.Text = AiData[10].ToString("F6"); 88 CH12_textbox.Text = AiData[11].ToString("F6"); 89 CH13_textbox.Text = AiData[12].ToString("F6"); 90 CH14_textbox.Text = AiData[13].ToString("F6"); 91 CH15_textbox.Text = AiData[14].ToString("F6"); 92 CH16_textbox.Text = AiData[15].ToString("F6"); 93 } 94 95 private void ErrorJudge(int Ret) 96 { 97 if (Ret != 0) 98 { 99 string ErrorString; 100 aio.GetErrorString(Ret, out ErrorString); 101 MessageBox.Show("aio.Init = " + Ret.ToString() + " : " + ErrorString); 102 return; 103 } 104 return; 105 } 106 } 107 108} 109

試したこと

Access violationに惑わされて4時間奪われた話
こちらを参考に、「「プロジェクトのプロパティ>デバッグ>ネイティブ コードのデバッグを有効にする(T)」にチェック」をやってみたのですが、症状は変わらずでした。

補足情報(FW/ツールのバージョンなど)

teratail初質問になります。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/04/11 02:09

商用パッケージなのでなかなかレスが付かないと思います。 アドバイスとしては、「引数の型を確認してください」くらいしか思いつきません。 特に、数値はすべてint型のリテラルになっているので注意してください。
dodox86

2019/04/11 02:24

回答未満ですので、こちらに書いています。 1.Windowsのバージョンは何でしょうか。 2.timer1_Tick内でGetAiSamplingDataExを呼んでいますが、エラーチェックされていません。エラーが起きているということは無いですか。 3.AiData[0].ToString("F6")など、ApiDataの内容を読み出さない場合はどうなりますか。 4.読み出し間隔を100ミリ秒からもっと延ばすとどうなりますか。(ドライバー内では速く処理できるでしょうが、アプリとしては速過ぎるかもしれません) 仮想デバイスではなく、本物のデバイスで試すと問題が起きない可能性もあります。 ただ、本件はCONTEC社のWDMドライバーとアプリ用ライブラリに関係する問題ぽいので、どうしても解決しない場合はCONTEC社に問い合わせすべきことかもしれません。
Kashi_wamochi

2019/04/11 07:11

>hihijiji様 ありがとうございます。とりあえず使用したモジュールのドキュメントを参照しながら、引数があっているかどうかを確認してみます。
Kashi_wamochi

2019/04/11 07:40

>dodox様 1. Windows10 Pro 1809です 2. 結果的にこれが正解でした。この関数の呼び出し時にエラーが出ていました。エラーの内容はメモリのオーバーフローです。GetAiSamplingDataExにおいて、読み込むデータの数を表す第2引数が、第3引数の配列の大きさよりも大きい値を入力していました。 今後読み出し間隔をさらに狭めることも考えていたので、少しでもTick内の処理を軽くしようとして、エラーチェックを外していたのですが、これが盲点でした。 的確なコメント、ありがとうございます。
hihijiji

2019/04/11 07:43

ここに書かずに、解答欄に書いて解決済みにしてくださるようお願いします。
guest

回答1

0

自己解決

c#

1Ret = aio.GetAiSamplingDataEx(m_Id, ref AiSamplingTimes, ref AiData);

GetAiSamplingDataExにおいて、読み込むデータの数を表すAiSamplingTimesが、AiDataの配列の大きさよりも大きい値を入力していました。コメントいただいたdodox様、ありがとうございました。

投稿2019/04/11 07:44

Kashi_wamochi

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問