ママのスキンケアのお悩みにおすすめアイテム

struct hostent FAR* PASCAL FAR gethostbyname(const char FAR* name);
等でPASCALやFARという文字列がでてきます。

自分なりに調べたのですが
FARは16bit時代の名残でfarの別名、32bitのアドレスを明示的に
指すもの?でしょうか。
PASCALについてはよくわかりませんでした。
どなたかご存知の方、ご教授ください。

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

A 回答 (6件)

FARもPASCALも昔の名残です。




FARは16ビット時代に使われていたもので、たいていはfarというキーワードに#defineされていました。

farというキーワードはポインタに対して指定するもので、farをつけるとポインタのサイズが32ビットになり、DOSの頃は1MBまで、Windows 3.xの頃は16MBまでを参照できるようになるものでした。

ちなみにnearというキーワードもあり、ポインタにnearを指定するとポインタのサイズが16ビットになり、そのポインタでは64KBまでしか参照できませんでした。

またfar/nearを省略したときには自動的にどちらか(コンパイラのコマンドラインオプションによる)が選択されました。

Windowsに限定すると、32ビットプログラムではfar/nearの区別はないので、FARは空文字列に#defineされています。


次にPASCALですが、これはたいていpascalというキーワードに#defineされていました。

pascalというキーワードは、以前PASCALがいまよりもずっと流行っていた頃に、C/C++のプログラムからPASCALのプログラムを呼び出す際に使用するものでした。

こちらもWindowsに限定すると、32ビットプログラムでもこのpascalに相当するキーワードが存在します。PASCALはそのキーワードに#defineされています。(Microsoft Visual C++ .NET 2003の場合、そのキーワードは__stdcallです。)
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
nearというのもあるのですね。
勉強になります。

お礼日時:2005/07/05 20:29

ほとんどトリビア



マイクロソフトは、Windows3.0やOffice95あたりまで、プログラムやシステム記述を、高級言語としては、MS-Pascalでコーディングしていました。
そのため、ライブラリの中にPASCALでコーディングされ、その呼び出し規約で呼ばなければならないものが残っていたためです。

実際には、ほとんどのユーザーがTyrbo Pascalを使っていたため、MS-Pascalを使った者は、特に国内では少ないでしょう。Turbo PascalはDelphiとなって再生しましたが、MS-Pascal(FortranやCobolもあったけど)は、消えてしまいましたね。元々のPascalの仕様にはMSの方が(珍しく)準拠していたのですが。

farに付いては、アドレッシングモードの指定ですが、このほかに、nearやshortがあり、それぞれ、8086の命令に対応しています。また、register intなんてのもありましたね。興味があれば調べてみると面白いかも。
処理系によっては12ビットアドレッシングの指定なんかもあったはずです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
詳しい回答、色々と勉強になります。

register int は「独習C」に載っていました。
明示的にレジスタを使用するとき使うようですね。

お礼日時:2005/07/05 20:27

PASCAL は呼び出し規約


Win16では、2つの呼び出し規約、CとPASCALがあった。

PASCAL は、可変長引数はできないが出来上がったコードが小さくなるというメリットがあった。(メリットは無いと言う意見もあるが・・・)

呼び出し規約とは、関数の引数をどの順にスタックに積むとか、誰がスタックフレームを操作するかを決めたもの。

Win32では、STDCALL が使われている。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

お礼日時:2005/07/05 20:29

ついでに。


FARはFARポインタやFARコールを指す。
FARポインタはセグメントとオフセットで示されるfarアドレスを参照するポインタで、FARコールは関数が呼び出し元とは別のセグメントにある場合の関数呼び出し方法である。
どちらも基本的に16bit時代のものだが、32bitCPUもセグメントは使えるのでカーネル内などでは今もFARポインタ(この場合は16bitセグメントと32bitオフセットね)を使っているかもしれない。
    • good
    • 0

PASCALは元々は関数呼び出し形式がPASCAL形式(PASCALで書かれた関数を呼び出す)であることを示します。

PASCALではCとは引数を積む順が逆など違いがあります。
昔のWindowsはPASCALで書かれていたらしく、API周りではPASCAL指定がよく使われます。
現在はPASCAL指定は意味がないので#defineで空文字に置き換えられているはずです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
仰るとおり現在では空白になるようですね。

お礼日時:2005/07/05 20:25

PASCALというのはプログラム言語の一種で(一時はやったことがありました)、その方式による呼び出し形式です。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2005/07/05 20:25

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

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

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

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

Qプログラミングのfarについて

Microsoft Visual C++ .NETを使っているのですが、
ある書籍に

unsigned char far *pixmap;

とやるとエラーがでてしまいます。

ここで質問なんですが、farとは何なんですか?

Aベストアンサー

追記です。
前の参考URLではわかりにくいので、こちらの参考URLのfarポインタのところを参照してください。

現在はfarもnearもいっしょですし、もう使われていませんのでそのキーワードを削除してもかまわないと思いますが。

参考URL:http://www.cqpub.co.jp/try/kijidb/yougo/san.htm

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) {
// ここに処理を書く
}
という関数が必要なようです。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

Qwsprintf関数の使い方について

いつもお世話になっております。
 
いまいち、分からなくて質問しました。
 
 
int hp=60;

としたとき、
 
TextOut(.............,hp,lstrlen(hp));

としようと思ってたんですけど、
 
文字がでないので、
 
 
wsprintf((LPWSTR)nowhp,"%d",hp);

としたら、エラーがでて実行できませんでした。
 
TextOut関数で、60とだしたいのですが、
その後の処理で値が変わってくるので
 
TextOut(......................,TEXT("60")..........)
 
ともできず、困っています。 
 
 
要は
wsprintfに値を格納して
その後の処理で
 
hp-=10
 
としても、
wsprintfでnowhpに値を格納し
TextOutで50と表示されるようにしたいのです。
 
 
うまく説明できませんが、↑のようにする方法を
 
教えてください。
 
お願いします。

Aベストアンサー

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので,
TCHAR nowhp[11];
if (FAILED(StringCbPrintf(nowhp, sizeof(nowhp) / sizeof(nowhp[0]), TEXT("%d"), hp))
{
// 失敗時処理
}
のようにした方がよいでしょう。

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので...続きを読む

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

QLRESULTとHRESULT

身近でよく見かけるものに限ってなかなか探しても見つからないものなのですよね。

よくC++のプログラムで見かける
LRESULT型
HRESULT型
いったいどの様な型なのでしょうか?
どの様な時に使うのか教えてください。

Aベストアンサー

もう少しだけ補足。

ATLは、COM実装等に使うことを意識したライブラリなのでHRESULTとはなじみが深い。

そして、HRESULT(LRESULTも)は特にC++固有ということはなく
「Microsoftが定義したWindows開発用APIの一部」です。

COMやActiveX等はWindowsにおいてC++以外にも使いうるものであって、
C/C++用ヘッダでもその型定義があるに過ぎませんし、
UNIX等ではC++だったとしてもそんな型はまぁ使いません。

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++として使用するなら良いで...続きを読む

Qint型からchar型への変換

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

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

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


人気Q&Aランキング