GCCについて part2

このエントリーをはてなブックマークに追加
してます。補足すると、powlが異常でpowは何とも無いです。
math.hをincludeしたら正しくでるぞ。
includeを外したら948と同じになった。
>>948
試してみたが、ちゃんと出たぞ。

C:\hoge>gcc --version
gcc (GCC) 3.3.1 (mingw special 20030804-1)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

C:\hoge>gcc -o foo foo.c -lm

C:\hoge>foo
1
10
100
1000
10000
100000
1000000
10000000
-ansi をつけてみてちょ。
ダメ。
ソース:
#include <math.h>
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 8; i++) {
printf("%ld\n", (long)powl((long double)10.0, (long double)i));
}
}

C>gcc -ansi -o check2.exe check2.c

C>check2
30720
24576
8448
6432
4384
2401
353
14689
見てるmath.hが食い違ってるとか。
>>957
#include <...> search starts here:
C:/GCC/include
C:/GCC/lib/gcc-lib/mingw32/3.3.1/include
End of search list.

lodprf32で見るとmsvcrt使ってるんだけどlong doubleのサイズが
MSVCとgccで違うんだよね。何で動くのか謎だし、ちと怖い。
単にgccのconfigureをしそこなってるだけじゃないかと小一時間(r
>>959
Winユーザーがバイナリあるのにわざわざconfigureなんかするかよボケ。

>>958
mingwのdouble周りはバグだらけだぞ。
floatまでにしとけ。
コマンドラインオプション変えもしないでうだうだ言ってるだけだろしねや
gccの--enable-mbcharってちゃんと使えてる人いる?

>>962
3.2くらいの時試しただけだが、問題なかった。
ちなみに文字/文字列リテラルの表現はUCS-2になったと記憶。
たまにMulti Byte Stringになると勘違いしている人がいる。
そっか。
ucs2になるのは見当ついているんだが、
なぜか日本語文字がみんな\200\201になるんだよな。
もうちょっと試してみる。サンクス。
>>958
MinGW使う限り、msvcrt.dllのdoubleが8バイトという呪縛からは
逃れられない。STLportを入れてビルドしても同じ。

#include <iostream>
#include <cstdio>
#include <cfloat>

int main()
{
long double l = 123.456, m, n;

m = n = l;

scanf("%Lf", &m);

m = m + 1.0;

std::printf("%Lf\n", m);

std::cout << "sizeof long double = " << sizeof(long double) << std::endl;
std::cout << l << std::endl;
std::printf("%Lf\n", LDBL_MAX / 10);
std::printf("%Lf\n", l);
}

出力(MinGW gcc 3.3.1 + STLport4.6)
-2.000000
sizeof long double = 12
123.456
-92559631349317831000000000000000000000000000000000000000000000.000000
-6416663311523673700000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000.000000
STLportのiostreamを使うと若干結果が異なる。

#include <iostream>
#include <iomanip>
#include <limits>

int main()
{
long double l = 123.456, m, n;

m = n = l;

std::cin >> m;

m = m + 1.0;

std::cout << std::setprecision(20) << m << std::endl;

std::cout << "sizeof long double = " << sizeof(long double) << std::endl;
std::cout << l << std::endl;
std::cout << std::numeric_limits<long double>::max() / 10 << std::endl;
}
出力結果

2
sizeof long double = 12
123.456
inf

gccの内部では恐らくlong doubleは正しく扱われているのであろうが
(10バイト、12バイトは多分アラインのため)入出力がおかしい。
970デフォルトの名無しさん:03/11/29 15:37
gcc3.3 で std::ios_base::fmtflags は使えるのですが gcc2.95.3 では使えません。
両方のコンパイラで使えるクラスを教えて頂けないでしょうか?
gcc2.9xのg++は捨てろ。
972デフォルトの名無しさん:03/12/02 07:43
うぶQですまん。
なんか、うちが使ってる、gnu make と gcc / g++ が日本語のエラーを出すのでキモいのだが。
英語でエラー/警告を出す方法ねぇですか?
オプションを発見できんかったの。

だれかマシンにgcc3.xをいれたよーで・・・。環境はVine Linuxで、bash使ってます。
>>972
locale変えれば良いんじゃないだろうか
$ export LANG=C
とか
974デフォルトの名無しさん:03/12/02 07:48
>>973サンキュです。試してみます。bashって書いといて良かった(^^)
LC_ALL=Cの方が良い。
976972:03/12/02 08:18
>>973 >>975 感謝。両方試して、両方とも英語になりました。
うちの環境ではLC_ALLのほうは、設定されていないようなので、
理解するまではLANGで設定することにします。

そうして、alias登録しようとして、.bashrcを開いたら、
あらかじめ、こんなんありました。
alias eng='LANG=C LANGUAGE=C LC_ALL=C'
お手数おかけして申し訳ないです。
次スレよろ。>>980
978デフォルトの名無しさん:03/12/15 15:51
次の事をcygwinで実行したいんですが、エラーが出てしまいます。
文法間違ってますか?

./configure --target=h8300-hms-coff --prefix=/usr/local/h8
979978:03/12/15 15:58
誤爆です
すいません。
980デフォルトの名無しさん:03/12/27 02:14
gccでのコンパイルとはどうやれは良いんでしょうか。
gcc [ option | filename ] ...
982デフォルトの名無しさん:03/12/27 02:28
gccでレジスタに保存されている値を取得したいのですが、
どのような関数を使用すればよいのか分かりません。
レジスタ値を取得する関数はどのようなものがあるのでしょうか?

以上、宜しくお願い致します。
>>980
マジ質デスカ?
asm( ・・・ );
>>982 その問いの一般的な答えとしては、「ない」でいいのだろうか…

何がやりたいんだ?自分の目的を正しく理解した上での質問か疑わしい。
986982:03/12/27 03:12
>>983,984,985
初心者ですみません・・・。

"初めて読む486"より
DOSでは以下のように取得できるらしいのですが、
#include <stdio.h>
#include <dos.h>
int
main ( int argc, char* argv[] ){
struct SREGS sreg;
segread(&sreg);
printf("cs:%04X ds:%04X es:%04X ss:%04X \n",sreg.cs, sreg.ds, sreg.es, sreg.ss);
return 0;
}
環境が無いのでLinuxでやってみようと思いまして・・・。

宜しくお願い致します。
987デフォルトの名無しさん:03/12/27 03:34
gccでのコンパイルの仕方について、
詳しく一から教えて頂けないでしょうか。
色々ぐぐってみたのですが、
みれといった使用方等が載っているサイトはなかったので…
ご教授下さい、宜しくお願い致します。
GCCは文法が違うので「はじめて…」のソースはコンパイルできない。
これ以上は他のスレでどうぞ。
>>987
gmakeを導入することが作法。直接gccを起動してはダメ。
Makefileは必ずしも書く必要はない。

make 実行ファイル名

Cコンパイラを複数バージョン入れたときに理由が分かる。
>>986
LSIC86ではできたよ。
991982:03/12/27 04:00
>>990

お、出来ました!
でもLinuxでもやってみたいんですよね・・・。
なんでMS-DOSが使いにくいので。 cygwinでlsic.batを実行できないのかなぁ・・・。

ps)
時々あなた騙されてますよ?って表示されて書き込みできないのは何故なんでしょうか?
992デフォルトの名無しさん:03/12/27 09:02
レジスタの値を得てどうするのさ?
DOSのときはINT21H呼ぶのによくつかってたけど
じゃなきゃ別に使いみちないような。
次スレ
・GCCについて part3
http://pc2.2ch.net/test/read.cgi/tech/1072484422/
何の意味あるのか分からんが…

---- test.c ----
#include <stdio.h>

void getsreg( unsigned int reg[4]);

unsigned int sreg[4];

void main( void)
{
  getsreg( sreg);
  printf("cs:%04X ds:%04X es:%04X ss:%04X \n",
      sreg[0],sreg[1],sreg[2],sreg[3]);
}
---- test.c ----
---- getsreg.s ----
.text
.globl _getsreg
.type _getsreg,@function
_getsreg:
  movl 4(%esp),%eax
  movl %cs,(%eax)
  movl %ds,4(%eax)
  movl %es,8(%eax)
  movl %ss,12(%eax)
  ret
---- getsreg.s ----

gcc -O -o test test.c getsreg.s

これで良かったかな…
995デフォルトの名無しさん:03/12/27 11:57
記念カキコ v(^-^*)
そもそもLinuxがプロテクトモードで(略 ってツッコミが入らないな…
そのツッコミもどうかと思うが…
G
C
1000デフォルトの名無しさん:03/12/28 19:56
C
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。