07/03/20 06:37:45
>>656
CPadってBorlandC++Compilerだけだっけ?
↑なら
bcc32 main.cpp kouza.cpp で正常にコンパイルできたけど
668:デフォルトの名無しさん
07/03/20 06:50:51
パラメータの入力順が違うだけだったりな
kouza.h kouza.cpp main.cpp とか
669:デフォルトの名無しさん
07/03/20 07:16:51
ヘッダをC言語としてコンパイルしているので、classでエラーが出るという落ちでは
670:デフォルトの名無しさん
07/03/20 07:25:43
>>663
そんなことしても多重対策にはならんわいw
671:656
07/03/20 15:43:42
みなさん回答ありがとうございます。無事に解決することができました。
>>666
kouza.hを外したらコンパイルが通りました。
以前にヘッダも指定した時はたまたま上手くいったので、
それが正しいと思い込んでしまっていました。
>>670
kouza.cppの中身を移してkouza.hとmain.cppだけをコンパイルすれば
対策ではなく、そもそも多重定義が起こらないと思ったのですが・・・
何か自分が勘違いしてるかもしれません。申し訳ないです。
672:デフォルトの名無しさん
07/03/20 16:02:45
>>662
^LはFFなんだね.首でも吊ってくるよ
勉強になった ㌧クス
673:デフォルトの名無しさん
07/03/20 23:31:41
>>650-651
久しぶりに職場にお泊りしてしまった
遅くなったけど、ありがとう
674:デフォルトの名無しさん
07/03/21 15:21:56
windowsでMSTPサーバを使用して、メール送信してますが
outlookで、メール送信することできるでしょうか?
APIかコマンドラインから使うことできれば、便利なんですが。
よろしくお願いします。
675:デフォルトの名無しさん
07/03/21 15:24:56
Outlook Expressのことなら知らない。
OfficeのOutlookなら、VBAでできるかやってみろ。
それでできたらC++でもできる。
676:デフォルトの名無しさん
07/03/21 17:26:27
>>675
レス感謝です。
検索して、しらべてみます。
677:デフォルトの名無しさん
07/03/21 18:05:11
>>674
メーラーを外部から操作するためのMAPIというAPIがあり、Outlookは
対応しているが、ある時点で(XPのSP2だったかな?)、セキュリティ絡みで
非常に強い制限が課せられるようになったはず。
送信が許可されてたかどうか。
678:デフォルトの名無しさん
07/03/22 17:20:23
済みません、int から byteヘとか
そのまた逆にする場合はどうしたらいいでしょうか?
ググッたんですがJavaやC#は見つかったんですけれども
C++が見つからなくて
初心者の質問で済みません
679:デフォルトの名無しさん
07/03/22 17:22:50
CやC++にはbyteなどという型は存在しないのでintからbyteにする方法などはありません
680:デフォルトの名無しさん
07/03/22 17:27:08
あっそうなんですか
そうすると今使ってる
byteはwinやTurbo C++の環境なのかな...orz
もうちょっと調べてみます
681:デフォルトの名無しさん
07/03/22 17:33:12
typedefでしょ?
castすればいい。もちろんcastの動作を理解した上でやってね。
682:デフォルトの名無しさん
07/03/22 17:42:53
byteとcharって、どの程度違うの?
683:デフォルトの名無しさん
07/03/22 17:43:22
有り難う御座います、castの知識曖昧な所が多いので
勉強しながらやってみます
684:デフォルトの名無しさん
07/03/22 18:02:02
>>682
charはコンパイラによって符号ありだったりなしだったりするが
BYTEは大抵は符号なしcharのtypedef
byteはシラネ
685:デフォルトの名無しさん
07/03/22 18:47:47
>>678
static_cast
おそらくbyte→intのように、扱える範囲が広くなるほうへは使わなくても平気。
Cとの互換を保つため実は狭くなる方へもキャスト無しで行けるが、キャスト使っておけ。
エラーにできないもんだから、みんな警告を出す。
686:デフォルトの名無しさん
07/03/22 19:20:44
有り難う御座います
やってみます
687:デフォルトの名無しさん
07/03/23 05:44:57
質問です。
tableと言う配列があったとして
ループ部分で、前の値を計算式に含める場合。スマートな方法は無いのでしょうか?
具体的には
int table[128],res[128];
for(int i=0; i<128; i++){
res[i]=table[i-1]*5;
}
こういった式の事です。
このままでは、1回目のi=0の時に負の値が添え字に与えられてしまいます。
int i=1だと、res[i-1]としなければならず、なんとも気持ちが悪いものです。
一般的にはこのようなループはどのように対処するものなのでしょうか?イディオム的なものはあるのでしょうか?
688:デフォルトの名無しさん
07/03/23 05:51:26
>>687
res[0]には何入れるの?
689:デフォルトの名無しさん
07/03/23 06:19:26
>>687
int * dest = &res[0] ;
int * src = table[-1] ;
for ( ; dest != &res[128] ; ++dest, ++src )
{ *dest = *src * 5 ; }
あるいは、
std::copy( &table[-1], &table[127], &res[0] ) ;
>>688
悪魔が入ります。
690:デフォルトの名無しさん
07/03/23 07:31:31
>>689
> int * src = table[-1];
おまえ正気かいな
691:デフォルトの名無しさん
07/03/23 07:37:29
>>689
それ何の解決にもなってないだろ
692:デフォルトの名無しさん
07/03/23 08:28:34
>>687
>res[i-1]
結局行き着くのはここ
それで気持ちが悪いとか言ってたらC/C++なんてやってらんねぇよ
>>689
そんなにアクセス違反とか領域破壊とかしたいのかおまいはw
693:デフォルトの名無しさん
07/03/23 13:44:09
添え字に飽和減算マクロを使えばおk
694:デフォルトの名無しさん
07/03/23 17:51:14
>>687
res[i-1] はコンパイラによって (res-1)[i] みたいに
なることが多いので気持悪く思う必要はない。最初から
(res-1)[i] とも書けるけどこれは規約違反。
695:デフォルトの名無しさん
07/03/23 19:41:22
>>694 強い電波をキャッチしました。
696:デフォルトの名無しさん
07/03/23 20:06:10
>>694
(res-1)[i] <-> *(res-1+i) <-> res[i-1]
resがポインタ型なら常にこれらは等価。
規格にもなんら違反していない。
697:デフォルトの名無しさん
07/03/23 20:19:32
694自身もしくは694の職場でのコーディング規約なのでは?
698:デフォルトの名無しさん
07/03/23 20:30:38
ついでに言うと(-1+i)[res]でも同じだな。キモ過ぎるなこれ。
>>694はポインタ同士の演算(減算を除く)が不正であることと
混同してるんじゃないか?
699:デフォルトの名無しさん
07/03/23 21:41:50
>>687
for( int i=1; i<128; i++){
res[ i - 1 ]=table[ i ]*5;
}
じゃダメなの?
700:デフォルトの名無しさん
07/03/23 21:57:26
それ意味変わってね?
701:デフォルトの名無しさん
07/03/23 22:03:48
>>698
さすがにそんなコードは書かないけど、
C言語におけるポインタとはどういうものかを知るには
素晴らしい例だと思う
702:デフォルトの名無しさん
07/03/23 22:09:57
>(-1+i)[res]
の解説キボンウ
703:デフォルトの名無しさん
07/03/23 22:13:46
例えば res[i-1] ってのは
(resが指し示すアドレス)と(添え字=この場合ならi-1)
との単なる加算を行い、そのアドレスが保持している値を返す。
数字が前に来ようが後に来ようが両方に来ようが
加算の結果は変わらないので指し示すアドレスも変わらず、
よって問題は起こらないと
704:デフォルトの名無しさん
07/03/23 22:14:01
>>702
解説面倒だからポインタがなんであるかの勉強してこい
705:デフォルトの名無しさん
07/03/23 22:15:49
>>702
a, bの片方がポインタ型で他方が整数型である場合、a[b] は *(a+b) に等しい。
706:デフォルトの名無しさん
07/03/23 22:18:12
>>702
(-1 + i)[res] ⇔ *(-1 + i + res) ⇔ *(res + -1 + i) ⇔ res[-1 + i] ⇔ res[i - 1]
これ書いていて思い出した。CもC++も規格では
配列の先頭要素~最後の要素を1つ越えたところの範囲外を指すポインタの存在すると
プログラムの挙動が未定義になる。694が規約違反と言っているのはこのことだ。
URLリンク(www.kouno.jp)
707:デフォルトの名無しさん
07/03/23 22:19:56
目からぬるぽでした
解説あんがとさんでした
708:デフォルトの名無しさん
07/03/23 22:55:03
無料でC++使える環境は?.NET使えなくていいから
709:デフォルトの名無しさん
07/03/23 22:56:42
cygwin, mingw gcc
710:デフォルトの名無しさん
07/03/23 23:01:17
>>708
VC++EE
711:デフォルトの名無しさん
07/03/23 23:01:44
>>706
なるほど。C FAQをもう一度読み直すとするか…。
712:デフォルトの名無しさん
07/03/24 01:23:19
>>707
目にガッしていいの?
目にガッって、やっていいの?
BCC
713:デフォルトの名無しさん
07/03/24 01:24:49
>>706
どうでもいいけど日本語がおかしい。
714:デフォルトの名無しさん
07/03/24 01:41:55
デバッグ出力なんかだと、時折り"NULLPO"[ga]なんてのも使うよね。
#流石にga["NULLPO"]とはしないけど。
715:デフォルトの名無しさん
07/03/24 01:48:48
俺はテストデータに"いろはにほへとちりぬるぽ"とか使う。
最初は反応してくれる人が居たけど、最近は誰も反応してくれなくなった。
いいかげん、次のネタを考えんといかん。
716:デフォルトの名無しさん
07/03/24 02:17:01
分割コンパイルをやってて、
コンパイルすると「外部シンボル”○○(自分で定義した関数)”が未解決です」
ってでるんですが、俺はどうしたらいいですか?
717:デフォルトの名無しさん
07/03/24 02:18:23
>>716
コンパイラエンジンの使い方を勉強すればいいと思います。
718:デフォルトの名無しさん
07/03/24 02:27:23
>>716
コンパイルだけじゃなくてリンクまでやっちゃってるから。
それはリンカが出してるエラーメッセージ。
719:デフォルトの名無しさん
07/03/24 03:13:58
変数の命名に関して質問です。
メンバ変数の末尾に"_"をつけているソースをよく見ますが、
これはシステムが利用している変数名とは被らないのでしょうか?
自分で調べたところ、_xや__xや_x_はダメだという記述は
見られましたが、x_に関しての記述はなかったもので。
720:716
07/03/24 03:20:22
>>717-718
こんな質問に答えてくれてありがとうです。
このエラーを解決するにはどうすればいいですか?
一通りググってみたけど、いまいち理解出来ませんでした。
質問ばかりですいません。
721:デフォルトの名無しさん
07/03/24 03:26:47
>>719
末尾なら良いんでないでしょうか。
俺はアンダースコア(アンダーバー)で終わる変数名は
つけないけど。
722:デフォルトの名無しさん
07/03/24 03:29:57
>>719
末尾についてるのは大丈夫。ただし C++ では末尾でも(途中も含めて)二重なのはダメ。
723:デフォルトの名無しさん
07/03/24 03:31:20
>>720
○○が定義されているオブジェクトファイルもリンカに渡せ。
724:デフォルトの名無しさん
07/03/24 03:33:17
>>720
まず、お前自身が自分がなにをやってるのか正確に理解する必要がある。
フツーのコンパイルなら一度に全てのソースをコンパイルしリンクを行う。
分割コンパイルの場合は一部のソースのコンパイルだけ行う。
リンクは全てのソースのコンパイルが完了している任意のタイミングで行う。
で、お前の今の状況だが、大きく二つのケースに分かれると思う。
ひとつはコンパイルだけ行えばいいタイミングでリンクまでやっている。
( 通常、コンパイラは"コンパイルのみを行う"という指示がない場合、勝手にリンクまでやっちゃう。 )
もうひとつはリンク時に必要な( ソースファイルをコンパイルして生成される )オブジェクトファイルが
全部そろってない、あるいはオブジェクトファイル自体はあるが、リンカに渡っていない。
725:デフォルトの名無しさん
07/03/24 03:36:07
>>720
ヘッダで関数宣言だけしてあるけど、
中身の定義が見つからんてことだよ
726:716
07/03/24 03:59:33
どうやら自分は何がしたいのかが理解できてないようです。
取り敢えずもう少し勉強してみます。
こんな時間におさがわせしました
727:デフォルトの名無しさん
07/03/24 04:01:15
まあそう言わずに思いのたけをぶつけてくれたまえ。
728:デフォルトの名無しさん
07/03/24 04:15:14
>>726
具体的にどんな環境でどんなふうにコンパイルしてるのか、詳しく教えてくれれば
多分、ちょっとしたことでうまくいく問題だぞ。
729:429
07/03/24 04:17:10
>>430-444
ありがとうございます。
質問してたの忘れてた(汗
遅レススマムコ
730:デフォルトの名無しさん
07/03/24 04:22:44
#define って そのソースファイル内でしか適用されんの?
また同じ #define をソ-スごとに書かないと駄目なの?
731:デフォルトの名無しさん
07/03/24 04:27:33
>>730
プリプロセッサだもの、そりゃそうでしょ。
いっぱい書きたくなかったらヘッダに書けばおk。
732:デフォルトの名無しさん
07/03/24 04:28:34
同じ #define を複数箇所に書くとかあまりにも意味がないw
733:デフォルトの名無しさん
07/03/24 04:32:25
>>730
コンパイルオプションで指定するならソース上のどこにも書かなくていいよ。
734:デフォルトの名無しさん
07/03/24 04:34:19
>>731
ヘッダに書いてインクルードさせれば使えるの?
735:デフォルトの名無しさん
07/03/24 05:04:18
#includeは単なるファイルのコピペ指令だ
気張る必要はないよ
736:デフォルトの名無しさん
07/03/24 09:37:31
>>732
それそのまんまマイクロソフトに言ってやれ
737:デフォルトの名無しさん
07/03/24 10:03:11
一応VC++でのコマンドラインからのコンパイルとリンクの仕方を
msdnから抜粋しといた。必要ないから、俺は使ったこと無いけど
コマンド ラインで、オブジェクト ファイル FIRST.obj と SECOND.obj が作成される。
CL /c FIRST.C SECOND.C
実行可能ファイルを作成するには、LINK を呼び出す必要があります。
LINK firsti.obj second.obj /OUT:filename.exe
738:デフォルトの名無しさん
07/03/24 11:19:57
WinXP、MinGW-5.1.3を使ってます。
10E13位の実数を扱いたいんですが、float型やdouble型で宣言しても
warning: integer constant is too large for "long" type
というエラーが出てしまいます。どうすれば解決できるでしょうか。
739:デフォルトの名無しさん
07/03/24 11:22:20
コード書け
740:738
07/03/24 11:27:25
これだけなんですが。
float na;
long nb;
na = 100000000000;
nb = 1000000000;
741:デフォルトの名無しさん
07/03/24 11:29:05
double f[] = {100000000000000., 10e+13};
742:デフォルトの名無しさん
07/03/24 11:30:28
>>740
それはlongリテラルだもん
743:デフォルトの名無しさん
07/03/24 11:33:42
>>740
小数点でも書いとけばいいんじゃないの
744:デフォルトの名無しさん
07/03/24 11:34:11
エラーメッセージのまんまだな。
longリテラルではなく浮動小数点リテラルとして認識させればいいだけ。
745:738
07/03/24 11:36:04
宣言はできましたが、数値を代入したら同じエラーが出てしまいました。
代入するには
f[0] = 100000000000;
でいいんですか?
746:デフォルトの名無しさん
07/03/24 11:36:32
>>740
na = 100000000000.0f;
つーか10E13ってそういうことか
てっきり0x10E13かと思ってたわ
747:デフォルトの名無しさん
07/03/24 11:40:24
>>745
だからdoubleリテラルにするために小数点かeつけろよ
748:738
07/03/24 11:48:23
代入する数値に.を付けて
f = 100000000000.;
としたら解決しました。ありがとうございます。
749:デフォルトの名無しさん
07/03/24 11:55:31
>>737
-cオプション与えなければclでexeを直接生成できるよ。
cl -o foo.exe first.c second.c
でよい。
ま、普通は(Makefileを使うような場合は)-cオプションつきでobjを
作った後で結合するけどな。
750:デフォルトの名無しさん
07/03/24 12:18:51
C++版のgetch()ってありますか?
751:デフォルトの名無しさん
07/03/24 12:25:29
ない。そもそもgetchは標準関数ではないのだからC++がどうこう言う話ではないだろ
まあ、conio.hがある環境なら#includeしとけば使えると思うよ
752:デフォルトの名無しさん
07/03/24 12:34:29
標準じゃなかったんですね・・・
回答ありがとうございました
753:デフォルトの名無しさん
07/03/24 17:36:07
#include <windows.h>
#include <iostream>
BYTE A(const BYTE* a)
{ return a[0]; }
BYTE A(const PBYTE a)
{ return a[1]; }
int main() {
const BYTE a[] = { '0', '1', '2', '\0', };
/* */ BYTE b[] = { '0', '1', '2', '\0', };
std::cout << A(a) << A(b) << std::endl;
return 0;
}
このコードは 01 と表示するんですが、aとbが区別される理屈がわかりません
また、Aの定義からconstを取り除いた場合、同じBYTE*の関数としてあつかわれて
コンパイルエラーになるのに、constがあるとOKなのも理解できません
なぜこうなるんでしょうか?
754:デフォルトの名無しさん
07/03/24 17:48:28
const PBYTEはBYTE* constになる。
const BYTE* aはaの指す先がconstという意味。
BYTE* const aはaそのものがconstという意味。
それぞれ別の型として扱われるので多重定義できる。
仮引数そのものがconstかどうかは多重定義の解決の際に考慮されないので、
実質的にはA(const BYTE* a)とA(BYTE* a)の中からどちらのAを呼ぶかということになる。
main関数の中のAの呼出では、それぞれaとbの型に引数が最も合うAが選ばれたということ。
755:デフォルトの名無しさん
07/03/24 17:54:04
constなポインタとconstなオブジェクトを指すポインタの違いはこんな感じ
int i;
const int c;
int *const pc;
const int* cp;
pc = &i; //エラー:pcはconstだから
cp = &c; //Ok
*pc = 0; //Ok
*cp = 0; //エラー:cpの指す先はconstだから
756:デフォルトの名無しさん
07/03/24 17:57:58
>>754-755
うぉぉ すごく良くわかりました
> const PBYTEはBYTE* constになる。
これに気づけなかった。感激です
あとドルジっょぃ
757:デフォルトの名無しさん
07/03/24 18:15:44
ポインタが絡んだときに、constがどこにつくかってのは、定期的に出るね。
cont BYTE *
だから分かりにくいのであって
BYTE const * //上の型はこれ
BYTE * const
BYTE const * const
そもそもなんで、型の前にも後ろにも付けられるようにしたんだか。
後ろだけだったら、こんなに混乱しなかったはずなのに。
758:デフォルトの名無しさん
07/03/24 18:22:36
>>757
C++の言語仕様は何でもあり
これがすべての混乱の元と言われている
759:デフォルトの名無しさん
07/03/24 18:30:57
結局C/C++は女子供の使うものじゃなかったんだよ。
スキルのもった、何でも自分で出来る現場のおっさんが、好きなように出来るように作られたもの
それが出来ないなら、制限されたC♯で"安全な"プログラムを組めって事さ
760:デフォルトの名無しさん
07/03/24 18:35:28
>>757
URLリンク(www.research.att.com)
761:デフォルトの名無しさん
07/03/24 18:40:16
>>758
これはC++だけではなく、基のCからそうだった。
762:デフォルトの名無しさん
07/03/24 18:50:53
const BYTE *A だったら
(const BYTE)←Aって感じでポインタのAがconst BYTEを指してますよーっ
て感じで直感的かもしれない気がしただけでしたごめんなしあ
763:デフォルトの名無しさん
07/03/24 18:51:13
C++はオブジェクト指向が追加されて更に言語仕様が複雑になった
CはポインタとGOTOを制限すれば構造化プログラミングを
正常に行える。
オブジェクト指向言語でありながらポインタがある。この言語仕様で
自由にプログラマーがコーディングする他人が読めないコードに
なるのはむしろ必然
764:デフォルトの名無しさん
07/03/24 19:14:33
GOTOなんて気持ち悪すぎ
765:デフォルトの名無しさん
07/03/24 22:11:17
>>763
初心者丸出しの発言乙w
766:デフォルトの名無しさん
07/03/24 22:23:51
玄人がするような発言をして下さい↓
767:デフォルトの名無しさん
07/03/24 22:25:49
gotoにも使いどころはあるよ
768:デフォルトの名無しさん
07/03/24 22:28:47
プログラミング規約を行わないでコーディングさせたら
プログラムを複雑にするのは事実
フレームワークを言語に取り入れるのは大規模開発では常識となっている。
世界で活躍するプログラマになると実行速度・コードサイズ・可読性に優れた
コーディングを行っている。
他人が読めないコードは最悪のコーディングスタイルだ
769:デフォルトの名無しさん
07/03/24 22:33:57
実行速度やコードサイズを犠牲にして可読性上げてるんじゃなかったっけ・・・
770:デフォルトの名無しさん
07/03/24 22:38:53
エセ玄人がするような発言をして下さい↓
771:デフォルトの名無しさん
07/03/24 22:40:33
実行速度・コードサイズは最適なアルゴリズムを採用することにより実現
可読性はクラス設計を適切に行い、関数の粒度を均一にすることで実現
更に優秀なプログラマなら再利用可能なプログラム設計も行える。
772:デフォルトの名無しさん
07/03/24 23:05:56
ごめんなさい
どれも出来ません。
773:デフォルトの名無しさん
07/03/24 23:06:22
・最適な
・適切に
・関数の粒度を均一にすること
・優秀なプログラマ
774:デフォルトの名無しさん
07/03/24 23:09:56
goto 使わずにどうやって for の二重ループから脱出するの?
775:デフォルトの名無しさん
07/03/24 23:11:01
フラグ立てんじゃね?
まあ俺はgoto使っちまうがな
776:デフォルトの名無しさん
07/03/24 23:11:45
日本ブレイク工業社歌ばりにブレイクブレイク。
777:デフォルトの名無しさん
07/03/24 23:16:07
最初は素直な実装を心がけてればいいんじゃないかな
778:デフォルトの名無しさん
07/03/24 23:25:07
2重ループを関数に移してreturnするな俺は
779:デフォルトの名無しさん
07/03/24 23:38:25
で、goto 使うななんて発言はどこにも見当たらないんだが…
780:デフォルトの名無しさん
07/03/24 23:44:06
ばっかだなぁ throwがあるじゃないか
781:デフォルトの名無しさん
07/03/24 23:45:14
例外ってgotoよりタチが悪いだろ
782:デフォルトの名無しさん
07/03/25 00:58:07
gotoを全く使ってはいけないのではなく、多用すると可読性が悪くなるから制限が必要
多重ループからの離脱はgoto使うとむしろ可読性が良くなるから使うべきケース
783:デフォルトの名無しさん
07/03/25 01:23:56
try throw catchってやばいのん?
784:デフォルトの名無しさん
07/03/25 01:27:33
>>783
もちろん、ちょーやばい。宇宙並みにヤバイ。お前は絶対使うなよ! やばいから!
・・・俺は使うけど。
785:デフォルトの名無しさん
07/03/25 02:04:48
例外は"見えないgoto"だとはよくいったものだ。
悪用すると、gotoよりも可読性が悪くなる。
使わなくて済むのなら避けるべき。
786:デフォルトの名無しさん
07/03/25 02:44:48
どの言語でも例外を非ローカル脱出に使うのは推奨されていないなあ…
787:デフォルトの名無しさん
07/03/25 10:25:08
例外って、使う使わないというものじゃなくて
「使わざるを得ない」ものではなかろうか
788:デフォルトの名無しさん
07/03/25 12:41:01
うるさいうるさいうるさい!
789:デフォルトの名無しさん
07/03/25 16:35:02
質問失礼します。
とある関数で、time(NULL)を種として乱数を発生させているのですが、
高速で繰り返し関数を呼び出しているため、同じ乱数が何度も発生してしまいます。
速度を落とさずこれを回避するには、どうすればよいでしょうか?
790:デフォルトの名無しさん
07/03/25 16:36:12
種を与えるのは一回だけでいい
791:デフォルトの名無しさん
07/03/25 18:43:58
循環参照とか循環インクルードとか、
このヘッダインクルードしたらこのヘッダもついてくるから
新しくヘッダつくるかそしたらこのヘッダインクルードしないといけないから
そしたらこのヘッダもついてくるからって
もう嫌になった
792:デフォルトの名無しさん
07/03/25 18:46:20
インクルードガードしろ
793:デフォルトの名無しさん
07/03/25 19:53:17
分割コンパイルするならインクルードガード必須だろ、常識的に考えて
794:デフォルトの名無しさん
07/03/25 20:00:55
インクルードガードは本当は良くないんじゃないんですかね。
それはただの対処法ってだけじゃないの?
795:デフォルトの名無しさん
07/03/25 20:04:53
やっぱ#pragma onceで重複処理するだけって駄目なのか・・・
796:デフォルトの名無しさん
07/03/25 20:09:15
>>794
ただの対処法がダメならどうしろとw
>>795
そいつぁコンパイラを選ぶんじゃなかったか
797:デフォルトの名無しさん
07/03/25 20:14:56
>>796
基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
それが基本的に本当だと思うのよね。
ヘッダ1000個とかになって人間として難しいって時の対処法でインクルードガードがあるんだと思うんだよね。
798:デフォルトの名無しさん
07/03/25 20:32:57
それはつまり、NULLが定義されているのがstddef.hのみだった場合
stdio.hやstdlib.h内でstddef.hをincludeするのは禁止で、かつ
ユーザーはstdio.hとstdlib.hの両方を使用するコードを書くべきではない
ということですよね?
799:デフォルトの名無しさん
07/03/25 20:46:45
標準ライブラリは重複してもおkなの?
800:デフォルトの名無しさん
07/03/25 20:48:24
何をもっておkとしたいのか判らん
オブジェクトコードを1バイトでも軽くしたいとかコンパイルを1秒でも早く終わらせたいとか
そんな目標があるのか?
801:デフォルトの名無しさん
07/03/25 20:51:50
つまり発生する問題はその程度ということですか、ならおkです
802:デフォルトの名無しさん
07/03/25 21:00:31
>>797
>基本的に循環しないように分割の設計していかないと駄目だと思うのよね。
>それが基本的に本当だと思うのよね。
んなこたねーよ馬鹿。循環していなくても
同じ宣言・定義を2回読む危険性はあるだろ。
>>799
標準ライブラリもインクルードガードされているから大丈夫。ソース見れ。
>>800
#include <stdio.h>と何回も書くと
その分だけオブジェクトコードが増えるとでも思ってるのか?
時間は数ミリくらいは遅くなるだろうが。
803:デフォルトの名無しさん
07/03/25 21:11:19
>>802
>>799は>>797理論について標準ライブラリも重複しないようにせにゃならんのかと言ってんじゃね?
804:デフォルトの名無しさん
07/03/25 23:18:38
>>798->>803
バカかお前ら。依存関係の事言ってんだよ
805:デフォルトの名無しさん
07/03/25 23:24:59
>>804 ごめん、よくわからん
806:デフォルトの名無しさん
07/03/25 23:25:03
結局これか
URLリンク(www.kouno.jp)
807:デフォルトの名無しさん
07/03/25 23:28:37
>>804
無能
808:デフォルトの名無しさん
07/03/25 23:34:21
>>806に関連して(このスレの流れには関係ないが)
borlandのコンパイラ及びmakeは、自動的に依存ファイルの更新をチェックする機能がある
(.objのコメントにincludeされたファイルと日付を含め、makeがそれをチェックする)
まあmakeにかかる時間が若干増えるが。
809:デフォルトの名無しさん
07/03/26 00:24:06
>>806
Indian Hill スタイルガイドを策定したヤツは馬鹿ですか? 信じられん。
一度、#include を入れ子にしてないプログラムのメンテしたことあるけど地獄だったぞ。
810:デフォルトの名無しさん
07/03/26 02:43:27
例えばクラスAを保持しているクラスBとCがあって、それぞれが別々の
.cpp と .h のセットに記述されていた場合とか、
入れ子 #include が禁止だと非常に困る
811:デフォルトの名無しさん
07/03/26 05:27:27
>789
どういう状況かは知らないが、似たような経験がある。
とあるアプリのプラグインを開発していたんだけど、
アプリの仕様上、その機能が使われる度に毎回プラグインがロードされるので
static変数が使いにくいという状況だった。
そのときに色々と調べて見つかった方法が、
・シードをファイル等に書き込んでおく
・プラグインとは別にプロセスを立ち上げ、種を保持しておく
・ミリ秒ではなくマイクロ秒を種に与える
の3つだった。他にもあるかもしれない。
812:デフォルトの名無しさん
07/03/26 16:52:23
Win32APIフックについて教えてください。
ユニットテストでAPI呼出失敗を検証する為、
APIフックを行う必要があります。
いろいろ調べた結果、以下のHPにサンプルがありました。
URLリンク(ruffnex.oc.to)
URLリンク(ruffnex.oc.to)
動作検証した所、フックは成功しました。
しかし、フック状態から元の状態に戻す方法がわかりませんでした。
(プログラムを終了すれば元の状態にもどりますが、そうではなく、任意のタイミングで戻したい)
どのようなコードを書けばよいのか、識者の方ご教授いただけませんでしょうか。
813:デフォルトの名無しさん
07/03/26 16:57:48
そりゃ、自分のプロセスのテーブルを上書きして書き換えてるだけだから。
そこのページに置いてある API_Hook.zip をちゃんと読めば分かるよ。
814:デフォルトの名無しさん
07/03/26 17:03:34
ややすれ違い WindowsAPIべったりな話題だから
スレリンク(tech板)l50
さらにいうなら親切にBBS用意してるんだからそっちで聞くほうがいいとおもうけどな
さらにいうならもう一個下のサンプルにはちゃんと実装されてるんだから
それぐらい調べてからでも遅くないと思うんだけどな
でもってReplaceIATEntryInAllModsの引数逆転させてみな
815:812
07/03/26 17:40:00
>>813
>>814
レスありがとうございます。
ご指摘の通り、ソースを調べてから質問するべきでした。
また、スレ違いであることも、重ねてお詫びします。
申し訳ありませんでした。
816:デフォルトの名無しさん
07/03/26 18:34:00
Cの質問です。
unsigned int a = 1;
a -= 2;
このとき、aの値がUINT_MAXになることは保障されているのでしょうか?
817:デフォルトの名無しさん
07/03/26 18:42:17
UnsignedIntegerOutOfBoundExceptionがシグナれます
818:デフォルトの名無しさん
07/03/26 18:52:17
>>816
整数オーバーフローが発生した場合の動作は未定義
そもそもUINT_MAX==2^(sizeof unsigned)-1である保証もない
819:816
07/03/26 18:58:34
>>818
分かりました
別の方法を考えてみることにします・・・
レスありがとうございました!
820:デフォルトの名無しさん
07/03/26 19:31:05
>>818
あれ、そうだっけ。
intとかの負数を含む型は、
オーバーフローは未定義だったのは規格で書いてあった覚えあるけど。
unsignedも未定義って書いてたっけ?
確か2^Nで余剰を取った結果になるって書いてたと思うけど。
821:デフォルトの名無しさん
07/03/26 21:09:16
>>816
規格では、符号なし整数の演算結果が範囲外になったときは範囲内に収まるまで
(その型の最大値+1) を足したり引いたりした値になるとされている。 ISO C 6.3.1.3
これにより ((unsigned int)-1) は常に UINT_MAX に等しいと言える。
822:デフォルトの名無しさん
07/03/26 21:19:31
UINT_MAX は-1よりも~0の方が好きだな
単なる好みの問題だけど
823:デフォルトの名無しさん
07/03/26 21:21:05
オーバーフローはバグの原因になるから理解するのはいいけど、
実際にプログラムに組み込むなよw
824:デフォルトの名無しさん
07/03/26 21:44:31
>>822
それって保証されてるん?
825:デフォルトの名無しさん
07/03/26 22:00:58
C90/C99ともにただ 0 とだけ書いた場合は (int)0 と等価なので
それを全ビット反転するわけだから -1 になると思うが
826:デフォルトの名無しさん
07/03/26 22:01:46
書き漏らした
int範囲で -1 になると思う
827:デフォルトの名無しさん
07/03/26 22:02:27
負数の表現方法は C の規格外。
828:デフォルトの名無しさん
07/03/26 22:03:45
~0Uだな
829:デフォルトの名無しさん
07/03/26 22:12:28
つまり、-1 が 0x80000001 な環境でも
(unsigned)-1 は 0xFFFFFFFF (が UINT_MAX とする)になるということか。
830:デフォルトの名無しさん
07/03/26 22:15:01
まぁそういうことだよな?
ただの -1 なら 0x80000001 で解釈されるけど
(unsigned)キャスト時はコンパイルでUINT_MAXに置換されるってことなんだろうか
831:デフォルトの名無しさん
07/03/26 23:28:52
VC++ 2005を始めました。
Byte単位でのファイル入出力はできますか?
ビギナー本には書いてないし、ネットでも色々探したのですが…。
エロい人、方法を教えてくだされ。
832:デフォルトの名無しさん
07/03/26 23:34:42
fread() fwrite()
833:デフォルトの名無しさん
07/03/26 23:36:00
fstream