gccでMS-VCの__int64にあたるキーワードはありますか?

A 回答 (1件)

確か long long です。

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

ホントだ。
拙い質問ですが、どうもありがとうございました。

お礼日時:2001/07/03 14:51

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

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

Qilink32について。'__setargv__'と'__turboFloat__'が未解決

WindowsXP+bcc32+ilink32でGLUTを使ったプログラムを書いています。
bccの設定はsetbcc.exe(http://www.cmagazine.jp/setbcc.html)を使いました。
opengl32.lib, glu32.lib, glut32.libはimplib.exe(http://blog.jyoken.net/?eid=478291)を使って作成しました。

以上の設定でbcc32付属のMakeを使ってmakeしたところ、
コンパイル後のリンクで以下のようなエラーが出てしまい困っています。
どなたか解決法を教えていただけないでしょうか?

よろしくお願いします。


---------------------
エラーの内容
---------------------
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '__setargv__' が未解決(root が参照)
Error: 外部シンボル '__turboFloat' が未解決(root が参照)
---------------------

---------------------
使用しているMakefile
---------------------
CC= bcc32
LINKER= ilink32

SRCS= main.c callback.c Task.c Logger.c
OBJS= $(SRCS:.c=.obj)
TARGET= main.exe

CFLAGS= -wall -O2
LFLAGS=
LIBS= opengl32.lib glu32.lib glut32.lib

INCLUDE= -I"C:\borland\bcc55\Include"
LIB= -L"C:\borland\bcc55\Lib"


all: $(TARGET)

.SUFFIXES : .obj .c

.c.obj:
$(CC) $(CFLAGS) -c $(SRCS)

$(TARGET): $(OBJS)
$(LINKER) $(LFLAGS) $(LIB) $(OBJS),$(TARGET),,$(LIBS)
---------------------

WindowsXP+bcc32+ilink32でGLUTを使ったプログラムを書いています。
bccの設定はsetbcc.exe(http://www.cmagazine.jp/setbcc.html)を使いました。
opengl32.lib, glu32.lib, glut32.libはimplib.exe(http://blog.jyoken.net/?eid=478291)を使って作成しました。

以上の設定でbcc32付属のMakeを使ってmakeしたところ、
コンパイル後のリンクで以下のようなエラーが出てしまい困っています。
どなたか解決法を教えていただけないでしょうか?

よろしくお願いします。


---------------------
エラー...続きを読む

Aベストアンサー

BorlandのCコンパイラは、スタートアップルーチンを含むオブジェクトファイルは
ライブラリファイルの中にはアーカイブされていなくて、適切な
スタートアップ用.objファイルを別途指定してリンクしていたと思います
#bcc32.exeを使った場合はコンパイラドライバが自動でやってくれる。

質問にあるMakefileの内容を見た感じでは、そのOBJファイルを指定していませんので、
それが原因で解決できないシンボル名がでているのだと思います。
ということで、ilink32.exeでリンクする対象にそのスタートアップ用OBJファイルを
含めてやればよろしいかと。

C0なんとか.OBJという名前で、コンパイルオプションに応じていくつか
存在していたと思います。
#置かれている場所はライブラリファイルのあるディレクトリです。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

Qint rev_int(int num)文  関数の入門

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転した値を返す*/

intrev_int(int num)
{


inttmp = 0;

if(num> 0){
do{
tmp = tmp * 10 + num % 10;
num /= 10;
}while (num > 0);

}

return (tmp);

}

int main(void)
{

int nx = scan_uint();

printf("反転した値は%dです。\n", rev_int(nx));

return 0;

}

教えてください!参考書に書いてあることをまとめて
プログラムを読んでるのですが、わからない部分があります。
(1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは
読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。

(2)int scan_uint(void)の文は理解できました。私なりに解釈したのは
ここでは正の数を入力しないと次に進まないことと
負の数を入力した場合、負の数を入力しないでくださいと注意がずっと
でるという文です。
質問ですが、このあとint rev_int(int num)文に移ると思うのですが
ここの int tmp = 0; これはこのint rev_int(int num)文のみの
tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で
出てきたtmpとは別個と解釈しました。

そうなると、int rev_int(int num)文を読んでみると

tmpの箱を作成。そこは0を代入。
if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??)

do文は
tmp = tmp*10 + num %10
num /=10
wile(num>0)

これを見る限り、numという箱が見えません。全体を見渡しても
どこかでnumに値が代入されたのち、このint rev_int(int num)
という文を読みこんでいき if num>0のときと宣言されていますが
もっと前の段階でnumの値が入力されていない限り
このif文は適用されないと思ったのですが、プログラムは動いてます

三つ目の質問です
tmp = tmp *10 + num % 10
num /=10 の部分がわかりませんでした。
tmpはまず、int scan_uint(void)で作成したtmpと
int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが
正しいのであれば
tmpの値はここでは初のはずです。
一体いつ値を入力したのでしょうか?
もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが
どうしてtmpを10かけるのですか?123450になり、
そのあとnumの値が此処でもまだ不明なのですがnum/10したものと
足すみたいですが、わかりませんでした。。。

まとめると、tmp = tmp*10+num%10がわかりません。
また、numとは何かわかりません、値もどの値がどこで代入されていて
while(num>0)が引っかかるのか不明です。
tmpはint scan_uint文内で入力した値(scanfの部分で)
12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか?
参考書はなぜ別個と書いてるのかわかりません。

ごめんなさい>_< とても長くなりました。
どなたか解る方、教えてください、よろしくおねがいします。

#include<stdio.h>
/*---非負の整数を読み込んでます*/

int scan_uint(void)

//関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。
{
//この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。

int tmp;//テンプの箱作成

do {
printf("非負の整数を入力してください:");scanf("%d",&tmp);
if(tmp< 0)
printf("\a負の数を入力しないでください");

}

while(tmp<0);

return (tmp);
}

/*非負の整数を逆転...続きを読む

Aベストアンサー

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き始めます。

main関数で

int nx = scan_uint();
printf("反転した値は%dです。\n", rev_int(nx));

と、それぞれの関数を呼んでいるので、実際の動作を実行順に羅列すると
1.必ずmainの先頭からプログラム開始。
2.mainからscan_uintが呼ばれる。
3.呼ばれたscan_uintが処理を行う(内容は理解しているようなので省略)
4.scan_uintからmainに帰ってくる。その時の戻り値がnxに入る。
5.printfの引数にrev_int(nx)があるので、nxを引数にしてrev_intを呼ぶ。
6.呼ばれたrev_intは、nxの値をnumとして受け取る。
7.rev_intは受け取ったnum(mainのnxと同じ値)を元に処理を行う。
8.rev_intはtmpに作った値を戻り値として関数を終わる。
9.rev_intからmainに帰ってくる。その時の戻り値がprintfの引数になる。
10.mainからprintfが呼ばれる。
11.呼ばれたprintfは何かを画面に表示し、関数を終わる。
12.printfからmainに帰ってくる。printfの戻り値は受け取ってないので捨てられる。
13.mainがreturn 0;で関数を終わらせ、プログラムが終了する。
となります。

>これを見る限り、numという箱が見えません。全体を見渡しても
上記の6.で「引数の実体として、mainから渡してもらってる」でしょう?

それが判らなかったのは「プログラムはmainの先頭から実行する」と言うのを理解できていないからです。

(3)
>tmp = tmp *10 + num % 10
>num /=10 の部分がわかりませんでした。
>どうしてtmpを10かけるのですか?123450になり、
123450にはなりません。

rev_intに入ってきたら
int tmp = 0;
ってやってるので、tmpは「最初は0」です。別の場所(scan_uintなど)にあるtmpは「同姓同名の赤の他人」なので忘れましょう。

scan_uintで「12345」を入力すると、12345がmainのnxに返って来て(nxが12345になって)、そのnxの値である12345がrev_intに渡され、rev_intは12345をnumに受け取ります。

つまり「最初は、numは12345、tmpは0になっている」のです。

そして、numが0かどうか調べます。

numが0でない(12345になっている)ので、次に
tmp = tmp *10 + num % 10;
を実行します。

tmp(中身が0)を10倍した値と、numを10で割った余りを足し、tmpに戻しています。

つまり0を10倍した0に、12345を10で割った余り5を足し、足した結果5をtmpに戻します。なのでtmpは5になります。

次に
num /=10;
を実行します。

これは「numを10で割って、numに戻す」です。
num = num / 10;
と同じです。

numは12345なので、10で割った商1234がnumの新しい値になります。

なお、Cでは、整数の割り算の答えは「商」だけです。小数点以下はありません。例えば、1を10で割ると0になります。

次は、while文で「numが0より大きいなら繰り返し」です。

numが0より大きい(1234になっている)ので繰り返すことになり、また
tmp = tmp *10 + num % 10;
を実行します。

tmpは5になっているので10倍して50、それにnum(1234)を10で割った余り4を足し、足した54をtmpに戻します。

次に
num /=10;
を実行します。

numは1234なので、10で割った商123がnumの新しい値になります。

これを「numが0より大きい間、繰り返し」すると

tmp=0、num=12345

tmp=5、num=1234

tmp=54、num=123

tmp=543、num=12

tmp=5432、num=1

tmp=54321、num=0

となり、numが0になって繰り返すのをやめた時、tmpは54321になっています。

そして、最後に
return tmp;
として、54321をmainに返します。

mainに帰って来ると、前述の9.~11.の処理で
反転した値は54321です。
と表示されます。

>参考書はなぜ別個と書いてるのかわかりません。

「別の場所にある、同じ名前の変数は、同姓同名の赤の他人」なので「別個」です。

(1)
C言語の場合「書いてある順番」と「実行する順番」は、まったく関連がありません。

決まっているのは「必ずmain関数から実行する」と言う事だけです。

因みに「実行を開始する場所(ポイント)」のことを「エントリポイント」と呼び、Cでは「main関数の先頭がエントリポイント」と決まっています。

(2)
>質問ですが、このあとint rev_int(int num)文に移ると思うのですが
いいえ。移りません。

これが「そもそもの誤解の始まり」です。

上記(1)で言った通り、必ずmainからプログラムが動き...続きを読む

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Q__asm int 3でのブレイクポイントについて

こんにちは。
質問させてください。

先ほど海外の方が制作したC/C++のコードを読んでいたところ

__asm int 3

というコードを見つけました。
少し調べてみたところ0xccというコードを埋め込んでブレイクさせる命令ということはわかりました。

しかし使用用途がいまいちわかりません。

実際には下記のように実装されていました。

#ifdef _DEBUG
#define BreakIf( c )  if( c ){ __asm int 3 }
#else
#define BreakIf( c )
#endif

しかし、いろいろと考えてみたのですがassertとどう使い分ければいいのかよくわかりません。
assertの場合は引数が0の場合引っかかりますが、上記のBreakIfコードは非0の場合に引っかかるよ
うに実装されていました。

この__asm int 3命令は主にどのような場面で使用すべきなのでしょうか?
ご教授のほど、よろしくお願いします。

/*
Microsoft VisualStudio2008 academic edition
Intel Core i7 920 2.66Ghz
RAM:12GB
Windows7 64bit professional
*/

こんにちは。
質問させてください。

先ほど海外の方が制作したC/C++のコードを読んでいたところ

__asm int 3

というコードを見つけました。
少し調べてみたところ0xccというコードを埋め込んでブレイクさせる命令ということはわかりました。

しかし使用用途がいまいちわかりません。

実際には下記のように実装されていました。

#ifdef _DEBUG
#define BreakIf( c )  if( c ){ __asm int 3 }
#else
#define BreakIf( c )
#endif

しかし、いろいろと考えてみたのですがassertとどう使い分ければいいのかよ...続きを読む

Aベストアンサー

assertはプログラムの挙動が正しくないときに異常を表明するもの。
それに対してint 3(デバッグブレーク命令)は強制的にデバッグブレークするもの。

つまりassertはバグがあるか無いかわかっていないときに、もし異常な状態になったら、それを知らせる。
それに対し、int 3はバグがあることがわかっているが、それがどこか厳密にはわからないとき、その付近を調べるためにデバッガで追えるようにする。
たとえばループの中にバグがいて1000回目にだけ異常になるような場合、ステップ実行で1000回ループをまわすのは無駄なので、ブレーク条件に1000回目のループであることを入れておく。
このような条件ブレークの機能はデバッガにもあるが、条件判定をデバッガ側で行うため、ブレークまで時間がかかることがある。そこでその条件判定を実行側で行うことによりブレークまでの時間を短縮する。
これはデバッグの手法なので、バグを取ったらint 3は削除しておく必要がある。
それに対して、assertはデバッグ後も残しておく。


このカテゴリの人気Q&Aランキング

おすすめ情報