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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

870閲覧

callback関数のサンプルでmodule.hが見つかりませんとエラー

mercurian-teto

総合スコア75

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/10/13 05:45

編集2018/10/16 07:57

#環境
OS:windows10 pro
プログラミング環境: visual studio2017
セキュリティソフト: ウイルスバスター
#問題

あるサイトに記載のあったcallback関数を使ったサンプル(一番下に記載されています。)をビルドした後、エラーが発生しました。

例外がスローされました:読み取りアクセス違反。 wer_NULL_THUNK_DATA_DLA が 0x11101110111011A でした。
module.hが見つかりません。 現在の呼び出し履歴のフレームのソースを表示するには、module.h を見つける必要があります

読み取りアクセス違反のエラー
は間違ったアドレスの使用によるものと聞いたのですが、
どこら辺が間違っているのでしょうか。
module.hなるものが存在していないからでしょうか。回答お願いします。

#include<stdio.h> #include<math.h> double f1(double x) { return x + 1.0; } double f2(double x) { return x + 2.0; } int main(void) { double(*p)(double); p = f1; double ans1 = p(5.0); double ans2, ans3; double aa; p = f2; /* ポインタの付け替え */ ans2 = p(5.0); p = sqrt; /* ポインタをsqrt関数にセット */ ans3 = p(2.0); printf("ans1=%g, ans2=%g, ans3=%g\n", ans1, ans2, ans3); return 0; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

呼び出し規約をcdecl以外にした場合に起きそうな気がします。

f1およびf2を

c

1double __cdecl f1(double x) 2double __cdecl f2(double x)

pを

c

1double (__cdecl *p)(double);

とした方がよりよいでしょう。

投稿2018/10/13 06:21

asm

総合スコア15147

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

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

mercurian-teto

2018/10/13 17:20

回答ありがとうございます。呼び出すところ以外のところに__cdecl を付け足したのですが、エラーは出たままでした。 関数を呼び出す際も__cdeclを付け足した方がいいでしょうか。
asm

2018/10/14 00:54 編集

呼び出し側には不要です。 再現しないので私にはこれ以上なんとも言えません。 環境(OS, コンパイラのバージョン, セキュリティソフトの有無および詳細)あたりを公開しとくと追試できる人がいるかもしれません。
mercurian-teto

2018/10/16 07:45

回答ありがとうございます。 ウイルスバスターを停止させたら、全く出なくなりました。 ウイルスバスターとの関連性については違う質問レスで質問します。 回答ありがとうございました。
guest

0

こんにちは。

module.hなるものが存在していないからでしょうか。

これは例外が発生する原因ではありません。例外が発生した時、その発生箇所のソースを表示しますが、ソースがないので表示できないという警告です。

プログラム自体は正しいです。手元の Visual C++ 2017で、cl prog.cpp、cl prog.cの両方でビルドしてみましたが正常動作しているように見えます。

ans1=6, ans2=7, ans3=1.41421

プログラムのソースではなく、ビルド手順に誤りがあるのかも知れません。

以上

投稿2018/10/13 06:00

Chironian

総合スコア23272

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

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

mercurian-teto

2018/10/13 17:30

回答ありがとうございます。 <プログラムソースではなく、ビルド手順に誤りがあるのかもしれません。 ビルド手順に誤りとはどういうことですか。ビルドする際に違うモードがあったりするのでしょうか。
Chironian

2018/10/13 18:12

ビルドする際にはたくさんの設定項目があります。それらのなにかを間違っているのではないかという意味です。 試しに、ソースを 例えばsample.c に保存し、スタートメニューのVisaul Studio 2017にある"Developer Command Prompt for VS2017"を起動し、sample.cのあるフォルダへ移動後、下記コマンドでコンパイル後、実行してみて下さい。 > cl sample.c > sample もしも、これでも例外が発生するなら、Visual Studio、もしくは、Windowsが壊れている可能性があります。
mercurian-teto

2018/10/16 07:38

回答ありがとうございます。以上の操作を実行したところ、例外発生しませんでした。ビルド手順をreleaseモードにしましたが、同じように例外発生しました。debug、releaseモード以外の構成マネージャーとありますが、ここで何かしら設定をすればいいのですか。
Chironian

2018/10/16 07:42

設定項目は山のようにあるし、同じ経験はないのでちょっと見当がつきません。 プロジェクトを作り直すのが手っ取り早いと思います。
mercurian-teto

2018/10/16 07:55 編集

回答ありがとうございます。 セキュリティソフトのウイルスバスターを一時停止させたところ、 先ほどのエラーは発生しなくなりました。 新規で作成したものもウイルスバスターを起動していると必ず、module.hが見つかりませんとエラーが発生していました。 セキュリティーソフトととの関連については他の質問レスで質問することにします。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問