今だけ人気マンガ100円レンタル特集♪

はじめまして。
すごく初歩的な質問ですが
誰かライブラリとAPIの違いを教えてください。
どちらもプログラムでよく使うものをまとめたものみたいですが両者の違いが分かりません。
またDLLはライブラリの一部なんでしょうか?

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

A 回答 (4件)

> ここでまた疑問なんですがライブラリ(複数の関数)も


> API(1つの関数)も同じ関数ならAPIを入れなくても
> 直接アプリケーションとライブラリでできないんでしょうか。

ん?
APIは一つの関数とは限らないです。複数の関数を総称してAPIってこともあります。

ただの関数でも、アプリとのインターフェイスになるものはAPI(の一部)ですし、
インターフェイスの役をしない関数もあります。

関数そのものをAPIと呼ぶことも多いですが、必ずしも一致しません。
APIを実装(実現)する代表格が関数であって、関数=APIでもAPI=関数でもないです。

> 直接アプリケーションとライブラリでできないんでしょうか。

何ができないのかよく分かりませんが、APIってのは本質的には「取り決め」なので、
これがちゃんとしてないと、別の担当者になったときに困ったりします。

郵便局員の担当が「いつもの人」で互いに意思疎通できてれば多少のことはケアしてくれますけど、
別の担当になったとたんに話が通じなくなったり。(Interfaceが定まってない)
これが、応対マニュアルとか、申込用紙とか完備してきちんと取り決めがされていると、
別の担当者でも同じ手順で応対してもらえます。(Interfaceが定まっている)

APIってのは、「アプリケーションがこういうお願いをしたら、私はこういう応答をします」っていうお約束と、
それを実際にやってくれる担当者のことであって、関数は行員、ライブラリは郵便局。

APIがある利点というのは、利用者(アプリ)が郵便局内のごたごたとか業務フローを気にせずに、
窓口で決まった手順でお願いするだけで、誰が担当でもきちんと書留を送って貰える。
こういう、決まった手順をコミットして、何かをお願いすれば望む結果が返ってくると期待できるというところにあります。
これがばらばらだと、利用者が郵便局の支店ごとに別の手順を覚えるとか、窓口の担当者ごとに手順を確認するなどが必要になったりするのです。
    • good
    • 2
この回答へのお礼

APIで、どうゆう質問をすればどうゆう答えが返ってくることがわかるので
その先のライブラリの内容を気にしなくていいということですね。

>> 直接アプリケーションとライブラリでできないんでしょうか。
>何ができないのかよく分かりませんが、APIってのは本質的には「取り決め」なので、
>これがちゃんとしてないと、別の担当者になったときに困ったりします。

これはライブラリの内容がわかっていれば、どうゆう質問をすればどうゆう答えが返ってくるかわかると思ったので。

ご丁寧に教えてもらってありがとうございました。

お礼日時:2007/02/05 23:52

ANo.1です。


言葉足らずで、すみません

>ライブラリは複数のAPI
例えば、WindowsのメッセージBOXを表示したい場合、一から作ることは無いと思います。メッセージBOXを表示する場合は、あらかじめ、OSに準備してある関数を呼び出して、表示させます。
このOSなどソフトに機能を使用するに当たって、呼び出す関数等をAPIと呼びます。

ライブラリはAPIが登録されているファイルです。

>DLLは動的にメモリ確保できるライブラリ
メモリ確保できるライブラリでは、ありません

プログラムがAPIを使用するとき、APIが登録してあるファイル(=ライブラリ)を呼び出される都度、参照するのがDLLです
仮にDLLが無くても、プログラムがDLLに登録されているAPIを呼び出さない限り、実行できるのは、このためです。

一方、SLLは、プログラムが実行することさえ出来ません。

>ライブラリをリンクするためにはDLLとSLLどちらでもいいんですか?
どちらが良いかは、ケースバイケースです

DLLでは、不具合の修正を行ったばあい、不具合の発生したDLLのみを入れ替えることで修正することが出来ます。
その他にも、メニューなどに、導入してあるソフトウェアによって挙動を変える場合は、DLLを使用します。
ただし、DLLを作成するには少々難しくなります。

一方SLLは、作成するには、簡単ですが、DLLのようにファイルを入れ替えということはできません。
不具合を修正しても、全てリンクしなおす必要があります

APIを提供しているソフトウェアのほとんどは、DLLで提供していると思います。
一方、個人レベルで関数などを共有して使用したいときは、SLLのほうが良いかと思います
    • good
    • 0

Application Programming Interfaceの意味するところは、


アプリケーションをプログラミングするためのインターフェイス(イメージは窓口の利用方法)です。
「1番がインフォメーションカウンタ、2番は普通預金、3番は普通郵便、…」
みたいなものの、プログラム版と思ってもらえば分かりやすいかと。
「1を使うとファイルオープン、2を使うとクローズ、…」
窓口に出す伝票相当が、関数でいえば引数(パラメータ)とかで、
受け取るものが戻り値などです。

API自体はこういったお願いをするための手順や、
その結果の報告方法(郵送?口頭?)なども含めた一連をルールを含めての「決め事」をさすので、
関数呼出が一般的ですがそれに限った話ではないです。


で、ライブラリというのは関数の詰め物です。
他人が作ったライブラリ等は、呼び出しに決め事があるのが普通で、
これがそのライブラリを使うためのAPIになります。

> ライブラリは複数のAPI

より粒度の狭い、各関数単位でAPIを見れば、ライブラリは複数のAPIを含むともいえますが、
一連の機能群を持ったライブラリであれば、全体としてAPIの実装を提供していると取るべきかと思います。
# APIが窓口なら、ライブラリ(郵便局?)の中には関数(受付やその他の局員)が詰まってます。
# 利用者が一般的な利用手順に沿って郵便局を利用するように、
# プログラマはAPIに沿ってそのライブラリを使います。

> DLLは動的にメモリ確保できるライブラリ

「メモリ確保」だと語弊があるかもしれません。
実行時にリンクできるのがDLLで、ビルド時にリンクしてしまうのがSLLです。
「(コードに限らない)動的なメモリ確保」だけであればどちらでも可能です。

> ライブラリをリンクするためにはDLLとSLLどちらでもいいんですか?

DLLもSLLもどちらもライブラリの一種であり、どちらもリンクして使います。
但し、リンクのタイミングがビルドの時に予めやってしまうか、実行時にやるか、の違いがあります。
(実行時にやると、その場で取り替えるとかができる反面、管理が多少煩雑になります)

この回答への補足

ありがとうございます。

すごい分かりやすい例えです。

ライブラリ(郵便局)を利用するためにインターフェース(窓口)が必要なんですね。

ここでまた疑問なんですがライブラリ(複数の関数)もAPI(1つの関数)も同じ関数ならAPIを入れなくても直接アプリケーションとライブラリでできないんでしょうか。

初歩的な質問ですいません。

補足日時:2007/02/05 21:55
    • good
    • 0

APIとは、Application Program Interfaceの略です。


OSやDBなどのミドルウェア、CADなどのソフトウェアの機能を使用するための関数です。
ライブラリとは、そのAPIをまとめてあるバイナリファイルを言います

APIを使用するにはライブラリをリンクする必要があり、リンク方法には、ダイナミック・リンクとスタティック・リンクの2つの方法があります

DLLとは、そのダイナミック・リンクを行えるライブラリファイルのことです
ダイナミック・リンクの特徴は、プログラムが必要としているとき、メモリー上に読み込むことにあります。
その結果、プログラム本体のサイズが小さくなったり、ライブラリをファイル単位で共有することが出来ます

一方、スタティック・リンクの特徴は、プログラム本体とライブラリをリンクするため、APIの呼び出しが比較的に早いことです
ただし、ライブラリを共有して使用したいときなどは、リンクを行う必要があります。

この回答への補足

お答えありがとうございます。
ライブラリは複数のAPI
DLLは動的にメモリ確保できるライブラリ
ということですよね?

>ただし、ライブラリを共有して使用したいときなどは、リンクを行う必要があります。
ライブラリをリンクするためにはDLLとSLLどちらでもいいんですか?

補足日時:2007/02/05 08:36
    • good
    • 0

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

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

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

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

QC++ API 全般 APIの概要は

独学にてプログラミングを勉強しているのですが、いきづまってしまったので質問お願いします。

※Visual Studio 2008 Express Editionsを使用しています。

まだプログラミングに関しての勉強を始めて1ヶ月程度で、最初はVB.NETから始めて、最近C++に乗り換えました。
趣味の範囲でのゲームを作ろうと思っていて、C++とDirectXでの開発を予定しています。(しかし、最終的にはゲームに限らずプログラミングの技術と知識を習得することを目標にしています。)(DirectXに関してはまだ手をつけていません。)
まったく1からのスタートで、現在win32コンソールアプリケーションにてコードの勉強をしているところです。

勉強に使っている参考文献は
・VisualC++.NET逆引き大全500の極意
・ゲームプログラマになる前に覚えて起きたい技術(これを買うには早すぎたようです…。第一章も半分くらいしか理解できません…。)

サイトは
・主に「0からのゲームプログラミング」というサイトです。
http://www.plustarnet.com/aspil/Programming/



本題の質問ですが、APIというものがいまいち理解できません。
(1)上記のような目的で使用するAPIは、標準 Windows APIというものでいいのでしょうか?

(2)win32コンソールアプリケーションでは実行できるのに、win32プロジェクトでは実行できないのはなぜでしょうか?
#include<windows.h>

int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {
MessageBox(NULL , TEXT("Hello Wold!") ,
TEXT("メッセージボックス") , MB_OK);
return 0;
}

(3)http://www.plustarnet.com/aspil/Programming/CConsole.htm
このURLのコンソールAPIというのは、一般的に使われているものでしょうか?それともこのサイトのオリジナルのものでしょうか?win32コンソールアプリケーションでAPIを使うには、このURLのCConsoleクラスとうものをインクルードしないといけないのでしょうか?#include<windows.h>と宣言することによって気軽に使いたいものを使うことはできないのでしょうか?

(4)#include<windows.h>
とした場合、作るものが「win32コンソールアプリケーション」だったり「win32プロジェクト」だったり「windowsフォームアプリケーション」だったりで、使用方法などがまったく別になってしまうのでしょうか?

(5)そもそも、上記の目的の場合APIを勉強する必要はあるでしょうか?

(6)勉強をしたほうが後々に役立つ場合、どのAPIを勉強するのがいいのでしょうか?(APIといっても様々なものがあるんだなと思い質問しました。もし勘違いでAPIというものは一つしかないとしたらすみません。)


なぜAPIに関してかというと、単純に上記のサイトで言語編の一番上から順に見ていったからです。
初心者すぎて質問が的外れかもしれませんがよろしくお願いします。

独学にてプログラミングを勉強しているのですが、いきづまってしまったので質問お願いします。

※Visual Studio 2008 Express Editionsを使用しています。

まだプログラミングに関しての勉強を始めて1ヶ月程度で、最初はVB.NETから始めて、最近C++に乗り換えました。
趣味の範囲でのゲームを作ろうと思っていて、C++とDirectXでの開発を予定しています。(しかし、最終的にはゲームに限らずプログラミングの技術と知識を習得することを目標にしています。)(DirectXに関してはまだ手をつけていません。)
...続きを読む

Aベストアンサー

まず"API"というものそのものについてわかっておられないようです。

現在のプログラミングは非常に複雑化してきました。
また、(特にプロフェッショナルな場合)納期も短期化してきています。

そんなわけで、プログラミングも一から全て作るのは非現実的な状態です。
誰かの作ってくれたものを利用する場面が非常に多くなりつつあります。
(並行して開発する場合も多くあります)

その際、
どのような物(関数でも良いし、クラスとかでも良い)をどうやって
(パラメータとか呼び出し順序とか)
使うか
を定めておかないと、利用しようにも利用できませんよね。
この定めた規約のことをAPIと呼びます。

Windowsには
・ファイルを操作する関数
・画面にグラフィックを描画する関数
等々様々なものが提供されています。

たとえば、ファイルを操作するには
CreateFileで開き、ReadFileで読み込み、WriteFileで書き込み
CloseHandleで閉じる
という手順が定められています。
この規約は”Win32API”と呼ばれます。
CreateFileなどWin32で定められた個々の関数は
Win32API関数
と呼ばれます。

Windows上で動くプログラムは基本的には
Win32APIを利用します。

しかし、Win32APIには色々不便な点も多く、
それを補うものが作られてきました。
DirectXもその一例です。
もちろん、DirectXも(ごみではなく)"利用される"ために作られたものですので
Win32API同様、利用するための規格(API)があります。
Direct X APIと呼ばれたりします。

ですから
(1)はWin32APIです
(2)は明らかに逆です。
   Win32プロジェクトとは通常のEXEの他にDLL(EXEのための部品です。単独では動きません)など様々な開発を行えます。コンソール専用ではないので、
コンソール用の設定がされていません。したがって、コンソールのソースを持ってきただけでは動作するようになりません。
(自分でプロジェクトの設定を行えばコンソールアプリになります)

(3)についてはそのサイト専用です
ピンク色の部分をコピーしてConsole.hという名称で保存してください。
そして#include "Consol.h"
すれば自動的にWindows.hも取り込まれます。
別途Windows.hを取り込む必要はありませんし
Windows.hで定義されているものは自由に使えます

(4)win32コンソールアプリケーションとWindoiws プロジェクトの違いについては
先に述べましたので省略します。
"Windows フォームアプリケーション"とは
".NET (ドット ネット)"という新しい技術に基づくものです。
今までのWin32APIとは別物です。
当然APIも異なります。
原則的にはWin32APIは利用できません。
(C++/CLIという方法で利用できますが、それなりの設定が必要です)

(5) 目的に合ったAPIを勉強する必要があります。
先ほどものべましたが".NET"を使うには
Win32APIとは別の知識が必要です。
逆に、".NET"の知識しかない場合、Win32コンソールアプリは作れませんので
Win32APIを勉強しなくてはなりません。
もっとも、これは厳密な言い方ではありません。
Cの標準関数で収まる範囲であれば、Win32APIの知識は不要です。

(6)
既に述べています。
APIはたくさんあります。
あなたも、たとえばWin32プロジェクトでDLLを作成する場合、
どのように利用するかを考えてAPIを定める必要があります。

まず"API"というものそのものについてわかっておられないようです。

現在のプログラミングは非常に複雑化してきました。
また、(特にプロフェッショナルな場合)納期も短期化してきています。

そんなわけで、プログラミングも一から全て作るのは非現実的な状態です。
誰かの作ってくれたものを利用する場面が非常に多くなりつつあります。
(並行して開発する場合も多くあります)

その際、
どのような物(関数でも良いし、クラスとかでも良い)をどうやって
(パラメータとか呼び出し順序とか)
使...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。

Qラッパーって何なんでしょう・・・?

C++を勉強し始めたのですが、何とも難しい言葉が多くて、書いてあることが本当に理解できません。
ラッパーって?
ハンドルって??
と、次から次へと理解不能な言葉が・・・
読んでいるのは、C++Builderの開発者ガイドと、プログラミング言語C++の本です。
具体的なイメージが浮かばず、概念自体もピンときません。
わかりやすい本などあったら教えてください。
また、とりあえずラッパーとハンドルがどうしても気になるので、この2つの意味教えてください!!
よろしくお願いします。

Aベストアンサー

ラッパーは、wrapper で包み込むものの意味です。
wrap ラップはサランラップのラップですね。
wrappingラッピングといえば、プレゼントを包むやつですね。

つまり、たとえばある関数を使いたいと思ったとします。
しかし、その関数を呼び出すには、いろんな手続きをしないといけない、また呼ぶときに渡す引数をたくさん設定しなければならないなど、使用するのが面倒な場合があります。
これはその関数が汎用的に使えるように、動作に自由度を持たせていると、面倒になる傾向にあります。

そんな時、引数なし、又は簡単な引数で呼び出せるような関数を作ってあげれば楽になります。
この場合は、ある程度用途が決まっているので、その関数を呼び出すときの手続きを省略してくれるような関数ですね。
それがラッパーというわけです。

あと良くあるのが、C言語で書かれたライブラリなどをC++の機能を使って使いたいときに、ラッパーを作ったりします。
この場合は逆に機能を追加して使いやすくするイメージですね。

ハンドル(handle)はつまり何かを操作するときのハンドル(車のハンドルと同じ)です。

この概念は良く使われます。
たとえば、ハードディスクにはファイルがたくさん入っています。
その中のファイルを開いて何か処理しようとします。するとディスクアクセスの処理をしなければなりませんが、それを自分で書くのは大変なので、ライブラリを使います。
ライブラリでは、
・指定されたファイルを開く関数
・指定されたファイルの中身を読み出す関数
・指定されたファイルに指定の文字を書き出す関数
などなどたくさん用意します。

ここで一つ問題が生じます。もし複数のファイルを同時に処理したい場合どうやったらよいでしょう。
いちいちファイル名で指定する方法も考えられますが、ファイルを開くときに一つのハンドルという名前の変数を用意し、その変数の中にどのファイルであるという情報、そのファイルのサイズ、そのほか必要な情報を一つにまとめておくと、ファイルを操作するときにはその変数を引数として渡すだけで、ファイルがどれであるのかという指示が簡単に出来ます。

いまファイルハンドルを例にあげましたが、他にもWindowsではたくさんのWindowを開きますので、それら一つ一つにもハンドルが用意されています。

基本的に、

・同種のものが複数ある
・上記に対して操作する関数が複数ある

という条件を満たすようなものに対しては、ハンドルという概念でコントロールすることがよくあります。

ラッパーは、wrapper で包み込むものの意味です。
wrap ラップはサランラップのラップですね。
wrappingラッピングといえば、プレゼントを包むやつですね。

つまり、たとえばある関数を使いたいと思ったとします。
しかし、その関数を呼び出すには、いろんな手続きをしないといけない、また呼ぶときに渡す引数をたくさん設定しなければならないなど、使用するのが面倒な場合があります。
これはその関数が汎用的に使えるように、動作に自由度を持たせていると、面倒になる傾向にあります。

そんな時、引...続きを読む

Qライブラリ、.libとは?

ライブラリと検索すると、標準ライブラリばかり出てきて「○○.lib」のことがいまいち見えてこないのですが、このファイルはどういったものなのでしょうか。
.h、.c、.cppなどでは代用が利かないものなのでしょうか。

あと、C、C++にはライブラリと言うものがあり、あると便利・・・
というのは何となく分かるのですが、
1.ライブラリを配布しているのをあまり見ませんが、どこかまとまって置いてある場所はあるのでしょうか。
2.あまり記載されている参考書が見当たりませんが、どのように使うものなのでしょうか。
3.「このライブラリはどういうものか覚えていた方がいい」というものはありますでしょうか。

この3点について教えていただけるとありがたいです。
よろしくお願いいたします。

Aベストアンサー

>1.ライブラリを配布しているのをあまり見ませんが、
>どこかまとまって置いてある場所はあるのでしょうか。
なんのライブラリのことでしょうか?
ライブラリとは汎用性の高い関数や機能を再利用可能な形にした物を
言います。これは、目的によってプログラマが作ったり、
既に公開されたりしているものもあります。

>2.あまり記載されている参考書が見当たりませんが、
>どのように使うものなのでしょうか。
ライブラリの作りはそれを使う環境にも依存しますが、
Windows環境の場合、Libファイルにはダイナミックリンクライブラリ
(DLL)とスタティックリンクライブラリという2種類が存在します。
Libファイル(***.lib)はDLLの場合、そのライブラリが提供している
関数の関数名などの外部参照用のデータが入っています。
そして、実行には使用したLIBファイルのバイナリデータが入った
DLLファイル(***.dll)が必要です。
スタティックリンクライブラリのLibファイルは、それ自体に
ライブラリのバイナリが含まれており、使う場合はその使ったアプリ
にバイナリとして埋め込まれます。
なので、実行時にDLLファイルは必要ありません。

>3.「このライブラリはどういうものか覚えていた方がいい」
>というものはありますでしょうか。
ライブラリについては特に覚えることは多くありませんし
自分でライブラリを作るなら覚えて損はありません。
むしろ、覚えなくてはいけないのは、ライブラリにした場合に
どのようなことに注意するかです。
ライブラリの扱いは上には上にも書いたとおり、環境に依存する
ところがあるため、使用する環境に応じてある程度作り方が
違ってきます。

>1.ライブラリを配布しているのをあまり見ませんが、
>どこかまとまって置いてある場所はあるのでしょうか。
なんのライブラリのことでしょうか?
ライブラリとは汎用性の高い関数や機能を再利用可能な形にした物を
言います。これは、目的によってプログラマが作ったり、
既に公開されたりしているものもあります。

>2.あまり記載されている参考書が見当たりませんが、
>どのように使うものなのでしょうか。
ライブラリの作りはそれを使う環境にも依存しますが、
Windows環境の場合、Libファイルに...続きを読む

Q「以降」ってその日も含めますか

10以上だったら10も含める。10未満だったら10は含めない。では10以降は10を含めるのでしょうか?含めないのでしょうか?例えば10日以降にお越しくださいという文があるとします。これは10日も含めるのか、もしくは11日目からのどちらをさしているんでしょうか?自分は10日も含めると思い、今までずっとそのような意味で使ってきましたが実際はどうなんでしょうか?辞書を引いてものってないので疑問に思ってしまいました。

Aベストアンサー

「以」がつけば、以上でも以降でもその時も含みます。

しかし!間違えている人もいるので、きちんと確認したほうがいいです。これって小学校の時に習い以後の教育で多々使われているんすが、小学校以後の勉強をちゃんとしていない人がそのまま勘違いしている場合があります。あ、今の「以後」も当然小学校の時のことも含まれています。

私もにた様な経験があります。美容師さんに「木曜以降でしたらいつでも」といわれたので、じゃあ木曜に。といったら「だから、木曜以降って!聞いてました?木曜は駄目なんですよぉ(怒)。と言われたことがあります。しつこく言いますが、念のため、確認したほうがいいですよ。

「以上以下」と「以外」の説明について他の方が質問していたので、ご覧ください。
http://oshiete1.goo.ne.jp/kotaeru.php3?qid=643134

QC++とVC++の違いについて

この質問をご覧頂きありがとうございます。

みなさんに2つ、お聞きしたいことがあり、質問させていただきます。
1.C++とVC++とでは、どのくらいの違い(どういう違い、特徴)があるのでしょうか?

2.また、これからC++/VC++でプログラミングを始めようとした場合、
C++からVC++へと段階を踏んで勉強した方がよいのでしょうか?

一応、私のプログラミングの履歴としては、
言語としてVisual Basicは多少勉強はしておりました。
また、オブジェクト指向の基礎程度(多相、継承、カプセル化)は理解しています。

抽象的な質問で大変恐縮なのですが、
みなさんの経験論や、ご参考にした本、HP等がありましたら、
ご教授いただければと思います。

Aベストアンサー

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いですが、VC++とMFCを使用してウインドウアプリケーションを作りたいという事であれば、死に物狂いな勉強が必要が必要かもしれません。Windowアプリケーションの処理プロセスを理解していないと、とっても難解に感じると思います。
 VC++でなければいや!という理由がなく、Visual Basicからスムーズに移行でき、かつVisual Basicより奥の深い事をしたい、というならば C++ Builder をお勧めします。 こちらで腕を慣らし、徐々にWindowアプリケーションの処理プロセス(WinMainから始まるプログラムの組み方の事です)を学ぶと良いかな、と思います。 その上で VC++&MFCな環境に移行すると、敷居はぐっと低くなります。
 私は一度VC++&MFCに挫折しましたが、こちらの方法で何とか理解する事が出来ました(^^;

 参考になれば幸いです(..
 

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いで...続きを読む

Qインターフェースってどのような意味で使われるのですか?

ソフト開発、エンジニア派遣の営業をやり始めたばかりです。
インターフェースという言葉をよく聞きますが、
ハードをつなげるときのコネクターを指したり、
人間と機械で情報を交換するときの方式をさしたりと、
意味がいっぱいありすぎて何のことだかわかりません。
だれかわかりやすくまとめて教えてください。お願いします!

Aベストアンサー

確かに、判ったようでわからない言葉です。
もともと、顔と顔を向かい合わせるということから「コミュニケーション」に近い言葉です。
しかし、段々いろんな分野で拡大使用されるに連れ、「接続」あるいは「コミュニケーション」の際の「約束事:技術:方法:接続用ハード」という風にあらゆる意味で使われてきています。一言でまとめると「接続技術」という感じかも知れません。
参考URLも合せてご覧ください。

参考URL:http://hakuto.mis.ous.ac.jp/~masa/web_dic/dic_r/inter_f.htm


人気Q&Aランキング