現在A/D変換ボードの制御をしようとしています。
ボードのインストールも行なったのですが、以下のエラーが出て困っています。

外部シンボル 'AdOpen' が未解決(C:\PROGRAM FILES\BORLAND\CBUILDER5\PROJECTS\MAG\MAIN.OBJ が参照)と出てしまいます。

mainはシンプルなのですが...
void __fastcall TForm1::OpenDevClick(TObject*Sender)
{
device_handle = AdOpen("FBIAD1");
if(device_handle == INVALID_HANDLE_VALUE){
ShowMessage("Err : デバイスのオープンに失敗");
return;
}
}

そもそもこのエラーはなぜ出るのですか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> [リンカ エラー]'FBIAD.LIB' contains invalid OMF record, type 0x21 (possibly COFF)


>
> さっぱりわかりません(^^;)

コンパイルしたもの(.objなど)には、決められたフォーマットが幾つかあって、
それが期待したのと違う(OMF というフォーマットで読もうとしてるんだけど、
タイプが違う、もしかしたら COFF というフォーマットかも)ということみたい。

多分 VC++ だったらいけると思う。

もしくは、変換ツール(coff2omf みたいな)が BC++ についてるとか。

A/D変換ボード用のライブラリは、DLL で提供されているものなんでしょうか?
であれば、implib で、インポートライブラリを DLL から作り直しましょう。
    • good
    • 0
この回答へのお礼

ありがとうございました!無事解決しました(^^)
何とかこれで卒研が先に進めそうです。この調子だと前途多難ですが(笑)

今までDLLとLIBとかの関係が分からなかったのですが、何となく分かった気がします。

Windows\SYSTEMにインストールされていたFbiAd.dllからimplibでFbiAd.libを作り、リンクさせた所、バッチリ動きました。
しかし、普通はVC++でDLLを提供するものなのですか?Borlandはマイナーなのかなぁ...

お礼日時:2001/10/28 00:25

> Windows\SYSTEMにインストールされていたFbiAd.dllからimplibでFbiAd.libを作り、リンクさせた所、バッチリ動きました。


> しかし、普通はVC++でDLLを提供するものなのですか?Borlandはマイナーなのかなぁ...

解決したようで良かった。

提供の形態に、どれが普通なのか、は一概に言えませんが、形態を決める一番大きい
理由は、「提供者が、どの開発環境を持っているか?」だと思います。

開発用のライブラリであれば、利用者が広がれば、その要求に応えるために、両方の
ライブラリが提供されているケースはあります(例えば、lzh 展開用の UNLHA なんか)。

また、バイナリだと、どうしてもそういうケースはありますから、ソースで提供され
ている、とかね。

かくいう私も、BC++ は(雑誌の付録のCDなんかで)持ってはいるものの、使ったことが
ありません。必要があれば、使うつもりはあるんですけどね。
    • good
    • 0

原因として、考えられることを二つほど。



・AdOpen()を持っているライブラリをリンクのときに指定していない

質問の書き方が、ちょっとプログラムを知っている人のようなので、こういうミスは
無いだろうな、と想像します。本命は、こちら。

・AdOpen() は C の関数であり、そのプロトタイプ宣言が適切にされていない

細かく分類すると、

・提供されているインクルードファイルをインクルードしていない
・提供されているインクルードファイルが C++ で使うことを想定されて書かれていない
・そもそもプロトタイプ宣言が書いてあるインクルードファイルが無くて、自分でも宣言していない

の三種類があります。

C++ は、関数のオーバーロード(引数の型や個数が違えば、同名の関数でも異なった
実装ができる)の仕組みを持っているので、いわゆる C の関数とは区別されます。

AdOpen() の引数は、(私には)想像するしかないんですが、例えば、以下のような
プロトタイプ宣言が、(自分で書くかどうかは別にして)どこかに必要です。

extern "C" int AdOpen(const char*);

この回答への補足

回答ありがとうございます。
リンクのとき指定というのは、どういうことですか?プロジェクトに.libを追加してこの問題はなんとか解決できましたが、またエラーが出てしまいしました。

[リンカ エラー]'FBIAD.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

さっぱりわかりません(^^;)

今は学生です。卒業研究でA/Dコンバータを使わないといけないのですが、初期化の段階で詰まってしまっています。

補足日時:2001/10/26 17:29
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Qvoid main(void){...}だとDosWindowが開くので

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えて!goo",
WS_OVERLAPPED,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}

もっと簡単にDosWindowが開かないようにする方法はないのでしょうか?
もしないとすると上記記述でもっと簡単にできないでしょうか?

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc...続きを読む

Aベストアンサー

ウィンドウを開く必要がないなら、mainをWinMainに変更するだけで良いのでは? ウィンドウクラス登録、ウィンドウ作成、メッセージループ、ウィンドウプロシージャは全て不要な気がしますが。

WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
  //処理内容

  return 0;
}

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Qブロックで };ついているのと }だけの差はなんでしょうか

皆様こんにちは^^
 さて、以下のプログラムの{}ブロックで質問があります。
 {ブロック+セミコロン};と{セミコロンなし}があります。
 };で最後にセミコロン;がついていますが!これは何の意味があるのでしょうか!?
 1時間ぐらい調べましたが、該当する項目がありませんでした。
 よろしくお願いいたします。
#include <stdio.h>
#include <string.h>

/* 学生の人数 */
#define GAKUSEI_NUM 3

/* 構造体の定義 */
struct TestKekka
{
char shimei[80];
int kokugo;
int sugaku;
int eigo;
};
int main(int argc, char* argv[])
{
int i,heikin;
/* 構造体の配列の宣言 */
struct TestKekka gakusei[GAKUSEI_NUM];

/* 学生のデータ入力する */
for (i = 0; i < GAKUSEI_NUM; i++)
{
printf("氏名:");
scanf("%s", &gakusei[i].shimei);
printf("国語の得点:");
scanf("%d", &gakusei[i].kokugo);
printf("数学の得点:");
scanf("%d", &gakusei[i].sugaku);
printf("英語の得点:");
scanf("%d", &gakusei[i].eigo);
printf("---------------\n");
}

/* 学生ごとの平均点を表示する */
for (i = 0; i < GAKUSEI_NUM; i++)
{
heikin = (gakusei[i].kokugo + gakusei[i].sugaku + gakusei[i].eigo)/ 3;
printf("%sの平均点%d\n", gakusei[i].shimei, heikin);
printf("----------------\n");
}

return 0;
}

皆様こんにちは^^
 さて、以下のプログラムの{}ブロックで質問があります。
 {ブロック+セミコロン};と{セミコロンなし}があります。
 };で最後にセミコロン;がついていますが!これは何の意味があるのでしょうか!?
 1時間ぐらい調べましたが、該当する項目がありませんでした。
 よろしくお願いいたします。
#include <stdio.h>
#include <string.h>

/* 学生の人数 */
#define GAKUSEI_NUM 3

/* 構造体の定義 */
struct TestKekka
{
char shimei[80];
int kokugo;
int sugaku;
...続きを読む

Aベストアンサー

for文、関数の{}はそれで完結しているので文法上 ; は必要ありません。
構造体 struct の {}は、 } の後に変数名(もしくは別名)を書くことも可能なので、終端を示す ; が必要になります。

いずれも、C言語の文法で定義されています。

struct TestKekka
{
 char shimei[80];
 int kokugo;
 int sugaku;
 int eigo;
};



struct TestKekka
{
 char shimei[80];
 int kokugo;
 int sugaku;
 int eigo;
} testkekka; ← 変数名

もしくは、

typedef struct TestKekka
{
 char shimei[80];
 int kokugo;
 int sugaku;
 int eigo;
} TESTKEKKA; ← 別名

など。

Q新たな疑問 for( ; ; ){

 ループプログラムでfor( ; ; ){ の; ;てどんなループですか?
以下参考にされてください。
練習問題 5-18
数値を繰り返して入力し、0が入力されたら入力を止め、それまでの合計を表示するプログラムを作成しなさい。
________________________________________
int sum = 0;
int value;

for( ; ; ){
scanf( "%d", &value );

if( value == 0 )
break;

sum += value;
}

printf( "合計は%d", sum );

Aベストアンサー

・for文では初期値の設定を行わない
・for文ではループを終了する条件を指定しない
・for文ではループのたびに実行する付加実行式を指定しない

ということだと思いますが・・・。

あくまでも ”for文では” 行わないということで。


人気Q&Aランキング

おすすめ情報