[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 01/06 13:57 / Filesize : 237 KB / Number-of Response : 832
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Cygwin + MinGW + GCC 相談室 Part 3



1 名前:デフォルトの名無しさん [2007/04/30(月) 23:52:47 ]
Windows上で動作するフリーの開発環境 CygwinとMinGWに関する相談スレッドです。

過去スレ:
cygwin + mingwn + gcc 相談室 Part2
pc11.2ch.net/test/read.cgi/tech/1126103347/
cygwin + mingwn + gcc 相談室
pc8.2ch.net/test/read.cgi/tech/1058134693/

関連サイト:
Cygwin www.cygwin.com/
MinGW www.mingw.org/

関連スレッド:
GCCについて part7
pc11.2ch.net/test/read.cgi/tech/1145357824/
【激遅】AppleGCC【絶望】
pc11.2ch.net/test/read.cgi/tech/1173267844/


477 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:33:08 ]
デバッグ情報てんこもりとか

478 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 03:08:49 ]
[Test.java]
public class Test {
  public static void main(String[] args) {
    System.out.println("Hello, world.");
  }
}

> gcj -O2 --main=Test -o test Test.java
> ls -lh test.exe
-rwxr-xr-x 1 hoge none 6.1M Jan 14 03:04 test.exe*
> strip test.exe
> ls -lh test.exe
-rwxr-xr-x 1 hoge none 2.1M Jan 14 03:06 test.exe*

うはwww

479 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 14:10:45 ]
>>471
VS と MinGW の両方でコンパイルできるコードが割と簡単に書けるところが MinGW のメリット。
MinGW では基本的に Win32 API を使う。
スレッド、WinSock2、DLL のロードなどは Win32 API を利用するので
VS 用と MinGW 用のコードの差分は小さくなることが多い。
コンパイラ依存の部分を #ifdef で分ければ大半のコードを共用できる。

Cygwin は使ったこと無いのでパス。

480 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 14:43:38 ]
逆に、cygwinだとWinSockを使わないでソケット周りを書けるのが魅力。
要は、Linuxと同じソースでいける可能性が高い。

481 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:47:17 ]
>>474
windows用のソースをwindows用にコンパイルするのがmingw、勿論VSも
linux用のソースをwindows用にコンパイルするのがcygwinのgcc
cygwinでもwindows用のソースをコンパイルする事はできます、そこで使われているのがmingw
このcygwinのmingwが本家と同一なのかどうなのかはよく知りませんが。

gcc --target-help の最初の10行程を見てみてください、参考になるかと思います。

482 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 04:56:41 ]
一部のファイルをインクルードすると

failure to convert cp932 to UTF-8

というエラーが発生するんですが
これは何が原因なんでしょう?

別のエディタで文字コードをUTF-8にして保存しても直りませんでした

483 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 05:46:45 ]
改行コードかも

484 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 06:25:37 ]
>>483
阿呆ですか。

>>482
--input-charsetは?

485 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 07:23:08 ]
いやまじであるぜ?
改行コード



486 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 14:22:35 ]
>>482
「一部のファイル」ってのを明確すると話が早かったりするかも。
boostだったりしない?


487 名前:本田 [2008/01/17(木) 17:40:38 ]
>COMプログラマの解説書
>Crispin Goswell
>Microsoft Office Product Unit
>1995年 春
>1995年9月13日改訂
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdncomp/htm/com_co.asp
>抄録
>この解説書は、
>Microsoft(r) OLE Component Object Model(COM)オブジェクトを作成し、
>効果的に使用する方法を説明しています。
>例文はほとんどCで書かれていますので、実際に何が行われているかが、大変分かりやすく示されています。
>プログラマの中には、オブジェクトを実行するためにC++を好んで使用する人もいるでしょう。
>C++プログラマの観点からCOMの概念および基本的な使用法を論じているのは
>Kraig Brockschmidt著のInside OLE (第2版)(MSDN Library(Books))です。
>COMとは何か、またその設計や哲学の後ろにある動機付けをより理解する事に興味がある読者なら、
>Component Object Model Specification(MSDN Library(Specifications))の最初の2章を読んでください。
>第1章には簡単なイントロダクションを、第2章では徹底的に概要を解説してあります。
>この解説書ではInside OLEとCOM Specificationにある情報を、
>COMオブジェクトを実装する良い方法をいくつか示しながら解説するようにしてあります。

488 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:01:35 ]
>>482
input-charset を CP932 として使っていながら、欧州由来のコードで
CP932的に不正なものを含むソースをコンパイルしたんだと思う。
ffmpegの何かのヘッダとか。

489 名前:デフォルトの名無しさん [2008/01/20(日) 14:26:15 ]
エクスプローラーを使っているときに
今見ているフォルダでCgywin窓を開きたいのですが
どうしたらいいですか?


490 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 15:01:59 ]
アドレスバーからコピーして、cdすれば?

491 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 15:39:29 ]
>>489
cygwin hereでググれ

492 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:41:55 ]
俺はこうしてる
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\WinHandPrompt]
@="Zsh(&C)"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\WinHandPrompt\command]
@="cmd.exe /F:on /K \"cd %L&&zsh\""

493 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 21:47:51 ]
窓の手の流用か

494 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 02:51:02 ]
あれ、なんでばれたんだろう?
、と思ったら書いてあったねハッキリと

495 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 01:51:09 ]
MSYSからgetchとかkbhitを拾うのはどうしたらいい?

コマンドプロンプトではできることが
MSYSでは上手くいかないことが意外に多い
printfは必ずfflushも書かないと表示されないし・・・(TT



496 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 05:18:27 ]
毎回のようにfflushするくらいならsetvbufに_IOLBFしとけ。

で、getchやkbhitはC/C++にもPOSIXにも準拠していないし、Win32にも無い。
強いて言えば、DOSのデファクトスタンダードだったので残してある、というだけ。

Win32APIを使わないとするなら、
conio.hじゃなくてcursesとかを使うんじゃないの?知らないけど。

497 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 11:11:00 ]
>>495
>printfは必ずfflushも書かないと表示されないし・・・(TT
リダイレクトする用途を考慮しなくていいなら、printf()ではなくfprintf(stderr, ...)したまえ。

498 名前:デフォルトの名無しさん [2008/01/26(土) 15:58:13 ]
いま操作しているPC(ネットワーク上でのコンピュータ名はPC1)のcygwin(以下cygwin1)から
sshでほかのPC(ネットワーク上でのコンピュータ名はPC2)のcygwin(以下cygwin2)にログインして
\\PC1\Shareにアクセスしようとすると"-bash: cd: \\yy-x60s\Share: Permission denied"と言われてしまいます

cygwin2から直接"cd \\\\PC1\\Share"を実行するとこちらは成功します

cygwin2で"setfacl -m user:SYSTEM:rwx \\\\PC1\\Share"を実行して
直後に"getfacl \\\\PC1\\Share"を実行すると
# file: \\PC1\Share
# owner: pc2user
# group: なし
user::rwx
group::r-x
other:r-x
mask:rwx
とでていて設定が反映されてないことが原因なような気がするのですが、どのように設定するばよいか分かりません

499 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 15:58:46 ]
そういえばstderrはバッファリングされないからflushする必要もないよね

500 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 16:13:01 ]
でなきゃ困るだろ.そもそも
>printfは必ずfflushも書かないと表示されないし・・・(TT
は,それが当たり前だということを知らずに泣いてるだけの話だろ

501 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 19:20:24 ]
>>495-496
MSYS では、ってのは rxvt では、ってことだよね。
pdcurses の getch を使うプログラムを書いて試してみたけど rxvt ではダメっぽい。

LINES value must be >= 2 and <= -4096: got 1
initscr(): LINES=1 COLS=1: too small.

とか出てプログラムが異常終了する。
ググってみると lynx や aspell で同じ問題が起こっているみたい。
rxvt では (pd)curses は NG。

502 名前:デフォルトの名無しさん [2008/01/30(水) 21:32:07 ]
質問です。非常に初歩的ですみません。

ジョークコマンド sl を、Cygwin や その他 dll 等に依存しない、exeファイ
ル単体で動く形にコンパイルしたいのです。

chaosweb.complex.eng.hokudai.ac.jp/~hagi/contents/memo-cygwin.html#sl
freethink.way-nifty.com/action/2006/06/gnuwin32_6362.html
これらを参考に、Mingw、GnuWin32 をそれぞれフルインストールしました。
makefile の -lcurses と sl.c の usleep を書き換えました。
また、makefile を
CC=c:/mingw/bin/gcc.exe
と書き換えました。
そこから先が分かりません。

gnuwin32 のコマンドプロンプトから、makeを実行すると、以下のようなエラー
が出ます。
gcc -O -o sl sl.c -lpdcurses -ltermcap
sl.c:30:20: curses.h: No such file or directory
sl.c: In function `my_mvaddstr':
sl.c:42: error: `ERR' undeclared (first use in this function)
sl.c:42: error: (Each undeclared identifier is reported only once
...(略)

ということで質問です。GnuWin32 の termcap と pdcurses を、MinGW から利
用できるようにするには、どのように何を設定したらいいのでしょうか?


503 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:04:14 ]
>>502
gcc の -I オプションで curses.h があるディレクトリを指定


504 名前:502 mailto:sage [2008/01/30(水) 23:57:09 ]
>>503
ありがとうございます。makefileのCFLAGSを以下のように修正したところ、
CFLAGS=-O -I "/Program Files/gnuwin32/include/"
一歩前進し、今度はこんなエラーが出るようになりました。

c:\mingw\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe:
cannot find -lpdcurses
collect2: ld returned 1 exit status
make: *** [sl] Error 1

今度はどこに何を設定したら良いでしょう?

505 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:01:20 ]
1を聞いて10を知れ、とは言わないがちょっとな・・・



506 名前:502 mailto:sage [2008/01/31(木) 00:46:02 ]
ごめんなさい、図々しいお願いですね。

gcc の man を見ているのですが、ライブラリの検索パスを追加するオプショ
ンが見つかりません。
また、C:\Program Files\gnuwin32 の下に pdcurses に相当するライブラリが
あるのかと思ったのですが、libpdcurses.a というファイルが見つかりません。
行き詰ってしまいました。

507 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:49:24 ]
-L でしょ?

508 名前:502 mailto:sage [2008/01/31(木) 01:08:26 ]
うわあ、これは恥ずかしい。申し訳ありません。
日本語manを"ライブラリ"で検索していたので見つかりませんでした。

c:\program files\gnuwin32\lib に pdcurses がなく、curses があったので、
Makefile を元に戻しました。

--- sl.c ----
/* usleep(20000); */
sleep(1);

ここで今、こんなエラーが出ています。
c:\DOCUME~1\ユーザ名\LOCALS~1\Temp/ccGQbaaa.o:sl.c:(.text+0x1a4):
undefined reference to `sleep'
collect2: ld returned 1 exit status

たぶん、正しいヘッダをインクルードすればいいと思うのですが。

509 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 01:48:36 ]
>>508
> たぶん、正しいヘッダをインクルードすればいいと思うのですが。

そう思うんだったら、includeディレクトリの中でsleep()の宣言を探す
べきでしょ。たぶん無いけど。



510 名前:502 mailto:sage [2008/01/31(木) 02:01:22 ]
おっしゃるとおりです。見つかりませんでした。

/MinGw/include には何もなく、

/Program Files/gnuwin32/include には
glibc/unistd.h に sleep() がありましたが、includeすると大量のエラー。
winx/timex.h に nanosleep() がありましたが、
undefined reference to `nanosleep' のエラーが出ます。

/cygwin/include でも見つからなかったので、どうも方針がまずいようです。
Cygwin 上だと何もせずにコンパイル、実行できましたので。

今日はいったん中止します。

511 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 08:33:38 ]
このまま続けると嫌われるよ。
おそらく、初心者板の方が適している質問と思われ。

# -Iや-Lオプションなんて、cc時代から定番のオプションだし。
# CygwinやMinGWの問題か切り分けられて無いし。

512 名前:502 mailto:sage [2008/01/31(木) 13:11:55 ]
ごめんなさい、では最後に一点だけ。

/* usleep(20000); */
この行をコメントアウトすると、コンパイルは通るようになりました。まあ実
行すると、一瞬で終わってしまうのですが。

ただし、カレントディレクトリに curses2.dll を必要とします。exeファイル
のみで実行できるようにならないでしょうか?

見よう見まねで gcc に -static オプションを付けてみましたが、大量にコン
パイルエラーが出てしまいます。

c:\DOCUME~1\ユーザ名\LOCALS~1\Temp/ccy2baaa.o:sl.c:(.text+0x34):
undefined reference to `_imp__stdscr'
c:\DOCUME~1\ユーザ名\LOCALS~1\Temp/ccy2baaa.o:sl.c:(.text+0x4f):
undefined reference to `imp( *) static'
c:\DOCUME~1\ユーザ名\LOCALS~1\Temp/ccy2baaa.o:sl.c:(.text+0x6b):
undefined reference to `_imp__stdscr'


513 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:17:19 ]
>>512
そのpdcursesにスタティックリンク用のライブラリが添付されてない限
り、キミには無理。


514 名前:502 mailto:sage [2008/01/31(木) 13:22:08 ]
ありがとうございました。dllは諦めます。
あとはusleep(20000)ですが、これはどこか初心者スレを探して質問します。

515 名前:502 mailto:sage [2008/01/31(木) 15:17:52 ]
先ほどの者ですが、解決しました。

#include <windows.h>
...
Sleep(20);

Windowsプログラミングに詳しい知人にアドバイスされ、このように修正したと
ころ、見事に動くようになりました。

どうもお騒がせしてすみませんでした。ありがとうございました。




516 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 15:59:00 ]
最初からそいつに聞け糞が

そいつはそいつで、掲示板で聞けようぜえ
と思ってるだろうがな

517 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 16:23:57 ]
「mingw sleep」でググるだけで、ヒントがたくさん出てくるんだけどなあ。


518 名前:502 mailto:sage [2008/01/31(木) 18:53:51 ]
ごめんなさい、訳があって急ぎだったので、無神経な質問をしてしまいました。
ご迷惑をおかけしました。
今度Java質問スレで、超初心者にていねいに答えますので、それで埋め合わせ
にさせてください。


519 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 20:08:57 ]
人に教えてる暇があったら勉強しろ

520 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 09:18:44 ]
以上 >502 の日記からお伝えしました


521 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 07:20:34 ]
Cygwinでcファイルをコンパイルしようとしたところ、
3[main] ? 26824 init cheap: Couldn't reserve 3600336 bytes of space for cygwin's heap, Win32 error 487

というエラーメッセージを4つ吐くのですが、解決策はありますでしょうか?
ググってみて、再インストールもしてみたのですができませんでした…

WinXP Home SP2
RAM DDR SDRAM 512MB

522 名前:521 mailto:sage [2008/02/02(土) 08:38:29 ]
すみません自己解決しました。

System32にCygwin1.dllがあったのが悪かったようです。

523 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 19:57:57 ]
guileのinfoにある例(インタプリタを作るだけ)をmingwでコンパイルしたら
sys/select.h
ieeefp.h
が無いと言われてしまいます。
確かに/includeにも/mingw/includeにもそんなファイルはありゃしませんが。
mingwじゃlibguileは使えないのでしょうか?

バージョンは
gcc: 3.4.2
guile: 1.8.2
です。


524 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:08:18 ]
 _____ ___
<ー、\\ヾiγ/rニミ
 \ヾヘヽヽリ川///γ
  >川/ ̄"""" ̄「リ
  (ヘir-=o=ッィ=o=j
 _ハ| `ー/ ii、i
<\ ヽヽ `ー′/
 \ヽ \  ̄ ̄/∩へ  Cygwinじゃ駄目なのか?
__ii   ̄/二ノ レ<    guileのmakeに必要な環境やライブラリはあるのか?
ヘヘヘ\ヽニ>-イ|( Y/)
ノ// / ヽ_ノ|ヽハ/)
ノ ̄  `ー | |ヒ/


525 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:13:56 ]
>>524
試しにcygwinでやってみたら、gmpを入れてないのでハネられます。
まあ、gmp入れてcygwinでやればいいだけなんだろうけど。
主力環境がmingwなのでmingwでやりたいなと。



526 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:20:56 ]
敗因は2つだ
- >>525 は sys/select.h が何なのかわかってない
- >>525 は mingw がどんな位置づけにあるものかもわかってない

527 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:31:43 ]
guileを使うのにPOSIX環境である必然性があるのかな

528 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 21:10:01 ]
ないと思うが…

529 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:46:04 ]
では、mingwの位置づけ云々は関係ないような。
select.hを使わないようにconfigureできないものか。

530 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 00:23:46 ]
>>529
mingwの位置付けが判っていたら当然そういう風に行動するだろ?
ってか guile をビルドの話なのか?
guile をビルドするときなら configure --disable-posix とかあった気がするが…

531 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 01:24:34 ]
>>530
sourceforgeのmingw用にビルドされたguileをインスコしてlibguileまで一緒に入っているのにselectがないとかもうね、なんなんだと。

532 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 05:34:13 ]
じゃあきっとそのlibguileは --disable-posix で作られてるんだろ?

533 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 12:51:39 ]
>>532
guileの意義がわかんねーなら上から目線で語るなよwwww

534 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:33:53 ]
…と、>>533が最上位から申しております。

535 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:04:39 ]
Cygwinでgcovを使いたいのですが、
gccに-mno-cygwinのオプションを付けて実行すると以下のようなエラーが出ます。
test.gcda:Version mismatch - expected 304m got 304c

-mno-cygwinを付けてgcovを使うことはできないのでしょうか?

Cygwinのバージョンは1.5.25-7です。




536 名前:デフォルトの名無しさん [2008/02/10(日) 03:15:32 ]
Cygwin v2.573.2.2で開発しています。C++からperlを使おうと思って、とりあえず下のソースを拾ってきました。
#include <EXTERN.h>
#include <perl.h>
static PerlInterpreter *my_perl;
void main ()
{
char *perl[] = { "", "-e", "printf(\"%x\", 3735928559);" };
my_perl = perl_alloc ();
perl_construct (my_perl);
perl_parse (my_perl, NULL, 3, perl, (char **)NULL);
perl_run (my_perl);
perl_destruct (my_perl);
perl_free (my_perl);
}
それを perl_sample.cpp という名前で保存し、
g++ perl_sample.cpp -I/lib/perl5/5.8/cygwin/CORE -L/lib/perl5/5.8/cygwin/CORE
と、コンパイルしようとしました。しかし、
/cygdrive/c/Users/hoge/AppData/Local/Temp/ccwiKLdy.o:perl_sample.cpp:(.text+0x40): undefined reference to `_perl_lloc'
/cygdrive/c/Users/hoge/AppData/Local/Temp/ccwiKLdy.o:perl_sample.cpp:(.text+0x52): undefined reference to `_perl_construct'
/cygdrive/c/Users/hoge/AppData/Local/Temp/ccwiKLdy.o:perl_sample.cpp:(.text+0x7e): undefined reference to `_perl_parse'
/cygdrive/c/Users/hoge/AppData/Local/Temp/ccwiKLdy.o:perl_sample.cpp:(.text+0x8b): undefined reference to `_perl_run'
/cygdrive/c/Users/hoge/AppData/Local/Temp/ccwiKLdy.o:perl_sample.cpp:(.text+0x98): undefined reference to `_perl_destruct'
/cygdrive/c/Users/hoge/AppData/Local/Temp/ccwiKLdy.o:perl_sample.cpp:(.text+0xa5): undefined reference to `_perl_free'
collect2: ld returned 1 exit status
と、エラーをはきます。perl自体はcygwinのインストール時に入れたものです。perlのlibが無いのかと思い、探しましたが見つからず、また、perlの最新版をコンパイルしようとしましたが失敗しました。ちなみにOSはVistaです。
どのようにすればコンパイルできるようになるのでしょうか?

537 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 05:47:34 ]
>>535
www.cygwin.com/ml/cygwin/2007-11/msg00180.html



538 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:22:53 ]
>>536
ライブラリのサーチパスは指定しているけど、ライブラリそのものを指定していないじゃん。

539 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 09:52:41 ]
>>537
Cygwinで-mno-cygwinを使う代わりに本物のMinGWを使うことで解決できました。
ありがとうございました。

540 名前:デフォルトの名無しさん [2008/02/10(日) 13:45:20 ]
>>538
ありがとうございました。無事コンパイルすることができ、実行もできました。

541 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:17:56 ]
ckのソースどっかに落ちとらんかのー

542 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:44:21 ]
どぞ www.ch-werner.de/ck/

543 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:17:09 ]
ん? ck違い!? とりあえずサンクスコ

544 名前:デフォルトの名無しさん [2008/02/23(土) 09:23:36 ]
浮動小数点演算を行なうルーチンをコンソールアプリ(main関数)から呼んだときと
Win32 API で書いた GUI アプリから呼んだときとで計算結果が違うという問題に
悩まされています。どなたか解決策をご存じないでしょうか。

問題を再現する、できるだけ小さなプログラムを作りました。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6078.zip
付属の Makefile は MinGW (GNU make)用です。
test1.exe(コンソールアプリ)と test2.exe(GUI アプリ)をビルドして実行します。
どちらも init.c の initialize() を呼び出します。
initialize() は double 型の配列 x を初期化する関数です。
計算結果を見るために x[5] と x[6] をカレントディレクトリの output.txt に書き出しています。
gcc version 3.4.5 (mingw special) では以下のようになりました。

test1.exe
x[5] = 4.7474747474747475e-001
x[6] = 4.6969696969696967e-001

test2.exe
x[5] = 4.7474747474747475e-001
x[6] = 4.6969696969696972e-001

同じルーチンを呼んでいるのに x[6] の値が異なります。x[5] は一致しています。

比較のために VC++ Toolkit 2003 (nmake.exe) 用の Makefile.vc も入れておきました。
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
でコンパイルしたところ2つのプログラムの計算結果が配列 x の全要素について一致しました。
MinGW (gcc) でコンパイルしたときの test2.exe の計算結果と一致しています。
すなわち test1.exe の計算結果がおかしいようです。

どなたか解決策をご存知の方がいらっしゃいましたらご教示下さい。よろしくお願いいたします。

545 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:53:13 ]
面倒だからソースは見ていないけど、どちらかはFPUで計算を行いどちらかはSSEで計算を行なっていると思われる。
コンパイルオプションで強制できるから、必要なら強制すればいい。
但し、doubleの精度を超えた領域の話なのでどちらも間違っているとはいえない。



546 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:55:30 ]
./test1
4.7474747474747475e-001
4.6969696969696967e-001
./test2
4.7474747474747475e-001
4.6969696969696967e-001

gcc version 4.1.2

ごめん、役に立てそうも無いw
とりあえずmap出力してdiff取ってみたらどうか

547 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:01:53 ]
アセンブリ出力を見るだけだろ。常考

548 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:17:20 ]
同じになっちまった。
.gcc version 3.4.5 (mingw special)
/test1
cat output.txt
4.7474747474747475e-001
4.6969696969696967e-001
gcc -o test2.exe -mwindows test2.c init.o
./test2
cat output.txt
4.7474747474747475e-001
4.6969696969696967e-001

gccオプションに--save-temps
しかし、同じ.oファイル使ってるから意味ないか。

fprintf(fp, "%hX\n", x[5]);
fprintf(fp, "%hX\n", x[6]);
これ出力しても結果異なるよね?

まぁ、ollydbgあたりでステップ実行すれば原因はわかるかと思う。

549 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:20:48 ]
そういえば、全然関係ない話だけど
MinGWのprintfで、%hhXとかうまく機能しない原因知ってる人いない?

550 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:00:51 ]
msのcランタイムがc99対応じゃないから

551 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:19:49 ]
msのランタイムって、FPUの精度を固定していないか?
>544はもう一回動かしてもtest1のx[6]は違う値のまま?

552 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:01:31 ]
15桁目まで同じだからdoubleの精度としては問題ない。

553 名前:549 mailto:sage [2008/02/23(土) 12:03:17 ]
C99以前ではhhxって使えなかったんだ。
知らなかった。

554 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:18:37 ]
x86のFPUは、80ビット精度と64ビット精度が存在する。
SSE2は64ビット精度。
とかそのへんの問題かな?

>>551に一票。

浮動小数点演算の検算で精度気にしすぎると禿げるぞ。
ε使えε

555 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:55:41 ]
テキストで出力すると計算の問題なのか出力関数の問題なのか分からんな。
バイナリで出力(あるいは16進ダンプ)してみて
どうなるかチェックした方がいいと思う。

例えば
fprintf(fp, "%.16e\n", x[5]);
これを
output(fp, x[5]);
にして、output を別翻訳単位で下のように定義してみたらどう?

void output(FILE *fp, double value)
{
 union {
  double value;
  char array[sizeof (double)];
 } dc = { value };
 int i;

 for(i = 0; i < sizeof (double); ++i) {
  fprintf(fp, "%02X ", dc.array[i]);
 }
 fputchar('\n', fp);
}



556 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:56:53 ]
_controlfp あたりでぐぐれ

557 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:05:31 ]
VCとgccのデフォルトのFPU計算精度は異なるらしい
homepage1.nifty.com/herumi/prog/prog90.html
_controlfpでいじると同じ精度にできる

558 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:11:46 ]
おー、それだそれだ、思い出した。

559 名前:544 mailto:sage [2008/02/25(月) 14:04:07 ]
皆さまコメントありがとうございました。>>556-557の方法で解決いたしました。

使用していた Windows 環境では MinGW でコンパイルしたコンソールアプリは 53 ビット、
MinGW でコンパイルした GUI アプリと VC++ Toolkit 2003 でコンパイルした両アプリは
64 ビットの演算精度を用いていたようです。

別の Windows 環境で試したところ MinGW でも両アプリとも同じ計算結果になりました。

コンソールアプリを MinGW でコンパイルすると演算精度が 53 ビットになる環境がある、
確実を期すなら  _controlfp を使え、ということですね。

髪がすこし減ってしまった気がします。本当にありがとうございました。

560 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:29:41 ]
つーか、doubleの精度以上の処を云々すると禿げるよ。
どうせ微小誤差が付き纏うんだから適当な桁で丸めて表示するとかしないと。

561 名前:544 mailto:sage [2008/02/25(月) 15:57:08 ]
>>560
おっしゃる通りです。

今回の件が気になってしまったのは、シミュレーションコードのデバッグ中だったためです。
実行環境やコンパイラが違ったら気にしないところですが、同じ環境で同じオブジェクトコードに
同じ入力データを与えているにも関わらず計算結果が違うことにとまどってしまいました。
原因はdoubleの範囲を越えた部分の誤差でしたが、この問題を調べるきっかけになった
シミュレーション結果の違いはもっと有意な差だったので看過できませんでした。

育毛にはげみます。

562 名前:554 mailto:sage [2008/02/25(月) 21:54:36 ]
>>561
> シミュレーション結果の違いはもっと有意な差だったので

俺は予言する
もまいは禿げる。

肝心のアルゴリズム、あるいはテストベクタが草ってんじゃない?

563 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:13:26 ]
>>561
IEEEに準拠するように80bitではなく強制64bitにするオプションがあったはずだが

564 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 13:18:47 ]
>>563
>556-559

565 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:03:31 ]
そんなあなたを禿増してあげましょう



566 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 02:29:06 ]
>>541 発見しますた
ttp://sohda.net/cygwin/dist/mirror/www.geocities.jp/meir/cygwin_ck/

567 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 09:16:50 ]
OS再インスコしてdevcpp+SDLで以前のソースコンパイルしたらWinMain@16なエラーが('A`)
int main(ryから始めてるし-mwindowsも付けてるのに
cygwinでもインスコすれば変わるかなあ

568 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:14:40 ]
-lSDLmain付け忘れ&-l順番ミスでしたサーセン
SDL外したらコンパイル通って、sdl-config見てやっと思い出した

569 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 17:59:52 ]
相談じゃなくて雑談になるんだけど
g++4.3.0をビルドしてみたんだけど、g++のbinが460,475ってでかくね?
cygwinのインストーラからのg++3.4.4は96,789、verうpとかモジュール化とか考えてもねぇ。
とか思いながら動作テストで↓コンパイルしたら、2,339,843、メガってどうなの。(ちなみに3.4.4でも477,682、g++4.3.0binよりでけぇ
#include <iostream>
int main(){return0;}
これって一体何がバイナリに組み込まれてるのか気になるんだけど、分かる人教えてー、誘導だけでもいいから。
ちなみに#include<iostream>だけ消したら3.4.4が7,673、4.3.0が10,915と小さくなった。(勿論gccじゃなくてg++で

570 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 18:09:00 ]
stripしろよ
ライブラリのdebug infoもな

571 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 18:30:48 ]
なるほど、どうもー。

572 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 07:07:47 ]
g++ 普通にビルドできるのか?
それならなんで Cygwin のパッケージは 3.4 のままいっこうに動かないんだろう。

573 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 13:33:08 ]
そのうち、stripしてもまだサイズがでかいがどうしてだ? といった
ググれば5秒で分かるFAQを聞きに戻ってきそうだ

574 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 14:25:42 ]
嫌味だけは一丁前でな

575 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:16:47 ]
>>572
できたよー
そういや俺も昔クロスコンパイラ作ろうとしたけどビルド出来なかった覚えがあるな
そんときは原因分からず仕舞いやったけど

cygwinのパッケージはlinuxでビルドされてるらしいから3.4で動かない原因は別なんじゃない?



576 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 06:08:53 ]
Windows XP SP2 上で Cygwin gcc 3.4.4 の MinGW モードで開発してるんですが、
システムメニューの項目を EnableMenuItem() を使ってグレーアウトさせようとしてもできません。

具体的には、ウィンドウプロシージャで WM_CREATE を受け取ったとき

 EnableMenuItem(GetSystemMenu(hWnd, FALSE), SC_MOVE, MF_GRAYED);

としても、システムメニューの「移動」がグレーアウトせず、有効なままになってしまいます(実際にウィンドウ移動もできる)。
MF_GRAYED を MF_DISABLED にしても同様で、システムメニューからウィンドウ移動ができてしまいます。

 DeleteMenu(GetSystemMenu(hWnd, FALSE), SC_MOVE, MF_BYCOMMAND);

ならば正常に機能し、項目が削除されるんですが…。

似たような環境で EnableMenuItem() によるシステムメニュー項目のグレーアウトができている方がいれば
方法など教えていただけないでしょうか?

577 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 06:18:22 ]
すみません。追記です。

 EnableMenuItem(GetSystemMenu(hWnd, FALSE), SC_CLOSE, MF_GRAYED);

は正常に機能し、システムメニューの「閉じる」とタイトルバーの×ボタンがグレーアウトするようです。
となると「移動」とか「サイズ変更」がグレーアウト/無効化できないのは Windows API 自体の仕様なんですかね?
もしそうだったらスルーしてください。Cygwin + MinGW 環境固有の問題かと早合点してしまったので。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<237KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef