【初心者歓迎】C/C++室 Ver.38【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/06/03(日) 22:33:55ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.37【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1178432985/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2007/06/03(日) 22:35:410003デフォルトの名無しさん
2007/06/03(日) 22:57:430004デフォルトの名無しさん
2007/06/03(日) 22:59:140005デフォルトの名無しさん
2007/06/03(日) 23:00:47( ´Д` ) < 通報しますた!!
/, / \_______
(ぃ9 |
/ /、
/ ∧_二つ
/ /
/ \ ((( ))) / ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ /~\ \ ( ´Д`) < しますた!!!
/ / > ) (ぃ9 ) \_______
/ ノ / / / ∧つ
/ / . / ./ / \ (゚д゚) シマスタ!!
/ ./ ( ヽ、 / /⌒> ) ゚( )−
( _) \__つ (_) \_つ / > (・∀・)シマスタ!! .マスタ!! .スタ!!
0006デフォルトの名無しさん
2007/06/03(日) 23:01:44ここはいつからネタスレになったんだ
00072
2007/06/03(日) 23:08:10/::::::::::::::::::::::::::::::::::::::::::::\
ゝ---‐彡'´:::::::::/::;::::::::::::::::::::::::::::::::ヽ
 ̄//:::::::/::/l:::::l::|:::ヽ::::::::ヽ::::::ハ
ー=ニ:ィ::/::l:/::/::::/:::::l:::\::ヽヽ::::l::::::::l
. /::;l:/-イ:l、:::::::::::/l::/l:∧::::}::::|::::::、\
l::/'l:::::::::::トl_ヽ:::::///zl左∨:::::l:::::::::::‐≧-
l:{ ゝ::::::::{代fjヘ:{/´ 弋チ, }::::メテ:≦≠-
`ゝ ヽ::l:::≧= }`  ̄ ノィ/´::l/
j/ヽlヘ 丶 彳!:/ 殺すなんて・・・
´ l´ ヽ、' ⌒ /ノィk1
/>‐ 彡 ´ ̄ 〉
{:.: ̄ ̄ .:.:.:.:.:└-、_
_/>:.:.:.:.:..:.:_:.:-‐:.:.:. ´.:└┐
__/.:./ ./:. :.:.:.: ̄:.:.:.-‐ .:. _ -‐'^`ア ヽ
. /l/.:. 人:. .:.:.:.:. _、-‐ / ∧
{/ .: / \___ -‐ ´ ∧
. /: ' | l / l|
/: .: l l | l|
l.: .:.:. | , ゚ ヽ| l 〈
機動戦士ガンダム00
http://www.gundam00.net/
00082
2007/06/03(日) 23:12:01( ´Д` ) < ころしますだ!!
/, / \_______
(ぃ9 |
/ /、
/ ∧_二つ
/ /
/ \ ((( ))) / ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ /~\ \ ( ´Д`) < 殺します!!!
/ / > ) (ぃ9 ) \_______
/ ノ / / / ∧つ
/ / . / ./ / \ (゚д゚) シマスタ!!
/ ./ ( ヽ、 / /⌒> ) ゚( )−
( _) \__つ (_) \_つ / > (・∀・)シマスタ!! .マスタ-ベーション!!
0009デフォルトの名無しさん
2007/06/04(月) 00:05:40={0}とmemsetによる初期化ってどう違うのでしょうか?
またどちらの方がいいですか?
0010デフォルトの名無しさん
2007/06/04(月) 00:11:34前者の方が普遍的。
後者は間違いの元。
積極的に使う理由がないなら前者でOK。
0011デフォルトの名無しさん
2007/06/04(月) 00:14:09={0} : 他のメンバが初期化されてない、って警告が出る場合がある。
memset : ビットパターンが0であると保証されているわけではない型
(ポインタとか)でぐだぐだ言われる場合もないわけでもない。それと、
ゼロクリア処理であって、初期化ではないので、挟もうと思えば処理を
挟むことができてしまう。
0013デフォルトの名無しさん
2007/06/04(月) 00:53:18l ::/i:::l:| j:l|:::;ハ::. ト;::::: j |l-‐|ヤl k'//リ }゙i 〉、} }
j::/::i:::l::l i::|l:;��-!十!::::: / |! l }リ |lヾン j|,! ∧∨
|/|::l:::l:::| j;lfl:::| |:j }:::/ _,jzヶ=ュ!、{ レ' /ヽ〉〉
|| |::i::::l:::i l::| l::| _,.z;リュj:/ ケ{! :::::: Y!〉ヽ、_,/ //、\
‖ |::l、:|:::ト、:!ヾ�a´::::ヾ` ゙t._''''ゲ'゙ ! jN 〈〈 ヽ.ヽ
|! !:トN:::l::l:トィf{!; :;;;;rう  ̄ j,.イ! トi、ヽ\ ) 〉
| ∧!:l:ト:ト:ljヘ ` `=‐''´ ,小:i:. l |::、 )_)`'"
/〃X! /人ーヘ `_ /i.:.li:|::. l l::i
/ // .::::;イ' アー:ヽ、 ‘ー’ ,イ|::i :.i::ト、::| |::!
/,イ// .::;ィ' j j/| : :i::|in、_ / |:l::i.:.:i:| }::! |:|
/ / / j .::/l | / / ,! : :i:::li:j::|:「フi ‐ - '′ |:|::i:.:.i:| j:;! !|
〃 l / | :/ !l/ ,イ{,/_:_::l:::j⊥'-'"j ・∵!|:j:::// // |l
0014デフォルトの名無しさん
2007/06/04(月) 04:53:15あるクラスのメンバ関数を別ファイルにし#includeしているのですが
・型限定子 '***' がクラス名または名前空間名ではない
・宣言が正しく終了していない
というエラーが出ます。
このファイルをプロジェクトからはずすとコンパイルでき
問題なく実行できるのですが、なぜでしょうか。
また、クラス宣言内に関数を書いてもうまくいきます。
0015デフォルトの名無しさん
2007/06/04(月) 05:11:56***.cpp もそれ単体でコンパイルされるからだ。
つーか、何で #include してるかが気になる。
0016デフォルトの名無しさん
2007/06/04(月) 09:23:11どのようにすればよいのでしょうか?
コマンドラインでいうところの&をつけてバックグラウンドで実行するような形にしたいのです。
0017デフォルトの名無しさん
2007/06/04(月) 10:15:54一般的にsystem()はシェルを経由してコマンドを呼び出すので、単に&をつければいい。
Ex.
system("sleep 86400&");
0018デフォルトの名無しさん
2007/06/04(月) 10:19:54環境は自分のパソコンにCygwinを入れて使っています。
今まではアスキー出版の「C言語入門」という本で勉強してきて基本的なことは理解しています。
それでC++にはいつ頃から入ればいいでしょうか?まだ早いでしょうか?
またこれから何を勉強していったらいいかいまいち先がわかりません。
簡単なゲームを製作することが目標です。
ただプログラミングは楽しんでいるのでこれからも続けていきたいです。
大学の授業ではC言語のアルゴリズムを勉強中です。
0019デフォルトの名無しさん
2007/06/04(月) 10:30:280020デフォルトの名無しさん
2007/06/04(月) 13:23:33struct car {int number;
string color;
};
car cars[100];
のように宣言したのですが。
これを並び替えるための関数を作り、関数の宣言したいのですが。
void function(car cars[])
のような宣言の仕方でいいのでしょうか?
質問がわかりにくくて、申し訳ないです。
0021デフォルトの名無しさん
2007/06/04(月) 13:25:30void function(struct car[])で良いんじゃないの。
0022デフォルトの名無しさん
2007/06/04(月) 13:26:46AoSよりSoAを使え。
0023デフォルトの名無しさん
2007/06/04(月) 13:26:55その構造体の比較関数をオーバーロードして、std::sort()呼ぶだけでいいんだから。
0024デフォルトの名無しさん
2007/06/04(月) 13:29:38パフォーマンスを気にするようなレベルじゃないならAoSでいいんでね?
どうせ100台分だってことだし。
002520
2007/06/04(月) 13:45:11また質問で悪いんですけども、下のように2種類のファイルを呼んだんですけども
二個目のexample2の部分でエラーがでてしまいます。
何が悪いんでしょうか?
#include<fstream>
int main(){
ifstream fin("sample1.txt"); /* 入力ファイルストリーム 宣言 */
fin >> x;
fin >> y; /* 読み込み */
cout << x << ' ' << y << endl; /* 表示 */
fin.close(); /* 読み込み終了 */
ifstream fin("sample2.txt"); /* 入力ファイルストリーム 宣言 */
fin >> a;
fin >> b; /* 読み込み */
cout << x << ' ' << y << endl; /* 表示 */
fin.close(); /* 読み込み終了 */
return 0;
}
0026デフォルトの名無しさん
2007/06/04(月) 13:48:340027デフォルトの名無しさん
2007/06/04(月) 13:53:26002820
2007/06/04(月) 13:54:520029デフォルトの名無しさん
2007/06/04(月) 13:57:17入門書読めばわかる
0030デフォルトの名無しさん
2007/06/04(月) 14:27:31staticじゃないといけないんでしょうか?
エラーが出て困ってます。
0031デフォルトの名無しさん
2007/06/04(月) 14:30:560032デフォルトの名無しさん
2007/06/04(月) 14:55:060033デフォルトの名無しさん
2007/06/04(月) 15:17:32そうですれ。
0034デフォルトの名無しさん
2007/06/04(月) 15:28:450035デフォルトの名無しさん
2007/06/04(月) 18:32:08staticを付けなくてもstatic扱いされる。だって実体がまだ/もう存在していないから。
これに限らず静的メンバは、ただそのクラスに関連があるからクラス宣言の中に入っているだけと思えばいい。
0036デフォルトの名無しさん
2007/06/05(火) 00:51:23遅レスなんだが、みんな{0}初期化なの?
個人的にCでtypedef enumを使うんだが、こいつが一番始めにいると
型違いエラー(警告だっけ?)になるからずっとmemsetを使うようになったんだが。
わざわざ、メンバの順番意識するなんてバカらしいし・・・
0037デフォルトの名無しさん
2007/06/05(火) 00:55:30単に0を並べただけと規定されているわけではないから
もちろん自分の環境でそうなっているのなら、
移植性無視してやるという選択肢はある
0038デフォルトの名無しさん
2007/06/05(火) 00:56:430039デフォルトの名無しさん
2007/06/05(火) 01:03:05>>38
いや、C++だったらコンストラクタでポチポチ初期化するよ。
浮動小数点は使わない(使えない)環境なんで問題ないんだが、
NULLポインタはどうしようもないな。今の環境は0だから問題ないんだけど。
0040デフォルトの名無しさん
2007/06/05(火) 01:32:09そのような構造体用の初期化関数をつくってポチポチ初期化してみては。
あるいは、初期化専用のglobal変数を確保しておいて、それを代入することで
初期化するとか。
後者はmutexを初期化するときにPTHREAD_MUTEX_INITIALIZERを使う
のと同様の使い勝手になると思いますので、そういう感じの
名前をつけておけば紛らわしさも無いかと。
0041デフォルトの名無しさん
2007/06/05(火) 01:46:07初期化するとか。
一時期はそういう風に初期化してた。
const XXX_STR INIT_TABLE = {0}; // global
ソース内
XXX_STR strValue;
strValue = INIT_TABLE
で、構造体のメンバの頭にtypedef enumが来たときにVCでコンパイルエラー。
確かにそうだよな・・・って思って、全部memsetにしたんだ。
組込みなもんで、C→C++になんて早々変わらないんだ。
しばらくはこのままmemsetでやっていこうと思う。
0042デフォルトの名無しさん
2007/06/05(火) 01:49:20global変数なら
= { 0 }
とかは、べつにいらないのではないでしょうか。
0043デフォルトの名無しさん
2007/06/05(火) 01:50:02memsetて
0044デフォルトの名無しさん
2007/06/05(火) 01:59:21global変数ってのは間違ってたかな?
初期化用のconstデータを作るって感じで
>>43
構造体内のメンバに変更があったときに、面倒なのと
チーム内で変数の0=異常値として扱ってるのでまぁいいかなと・・・
いや、わかってるんだけどね・・・昔からの流れは中々変えさせてもらえなくて
0045デフォルトの名無しさん
2007/06/05(火) 02:08:21global変数の場合ですと、ゼロで初期化したいだけなら、規格に
準拠している処理系なら自動的にそうなるので、= { 0 } は不要です。
enumのようなものを含む型に初期値を正しく与えたい場合には、例えば
= { none, 0, ... }
とでも書けばよいではありませんか。
global変数による初期化を利用するのなら、こう書くのは一箇所だけ、
型の定義を変えても変更はそこだけで済みます。
0046デフォルトの名無しさん
2007/06/05(火) 02:29:01いや、組込みなんで、処理系なんてもんがいてくれればそれでいいんだけど
RAM配置からコールドスタート処理、レジスタ設定からその他初期化処理まで
やるのは自分なわけで・・・って関係ないか。
ま、そんなわけで、自動的に初期化なんてしてはくれないわけですよ。
>enumのようなものを含む型に・・・
{0}によって、後ろの省略されたメンバを0で初期化するって話とずれてません?
全部、初期化子書くなら初期化用の関数でも同じですよね?
って、そろそろすれ違いなんでやめますか。
板汚し、失礼しました。
0047デフォルトの名無しさん
2007/06/05(火) 02:42:48組み込みのイニシャルルーチンは無いの?
そこでRAMの初期化をするはずなんだが
0048デフォルトの名無しさん
2007/06/05(火) 02:48:22領域クリアしてるよ
いくつかの領域にわけて、初期化内容に応じてどこまで初期化するか決定してる。
で、そこで初期化されると困るけどメインルーチンに戻ってきたときには
初期化しておいてほしいやつとかを、ぽちぽち初期化してる。
いや、そんな変数ばっかの環境が悪いとかは言わないで・・・
0049デフォルトの名無しさん
2007/06/05(火) 03:04:00なんでRAM全領域を初期化しないの?
005049
2007/06/05(火) 03:06:39組み込みの話題は別にします。
0051デフォルトの名無しさん
2007/06/05(火) 03:19:39Q1,πって高校数学でも式作れるよね?
それをプログラムにすればいいんじゃない?とか思ったんだけど・・
でもサイト調べたら難しい公式とか使ってるけどどうして?
Q2,円周率のプログラムってなんで桁に限界あるの?一応無限までだせそうだけど
パソコンつけっぱなしでどんどんでてくるんじゃないのかなっておもったんだけど
どこどこの大学が何桁まで出した!とかあってあれ?って思った
Q3,高校数学レベルでいいから簡単なπ求めるプログラムを教えて。
使用してるのはC言語のWINDOWS
学校で聞いてきになったんだけど、言葉足らずだったらごめん
0052デフォルトの名無しさん
2007/06/05(火) 03:21:23http://www1.coralnet.or.jp/kusuto/PI/
0053デフォルトの名無しさん
2007/06/05(火) 03:25:23ちょっと行ってみる。ありがとう。
0054デフォルトの名無しさん
2007/06/05(火) 03:25:41.bssは分けてくれるけどそれをゼロクリアするスタートアップコードはついて
無いし、自分でも書いてない?(セグメント別れてるんなら書くの簡単だと思うけど)
組込みって奥が深くてわかんないや
005551
2007/06/05(火) 03:35:07だった・・
今見てきたけど、このくらいの質問は論外なんだなって思った。
学校で聞いてもそれは今関係ない、いつかやるからって言われるし・・
まぁいつかわかるとおもうけど
0056デフォルトの名無しさん
2007/06/05(火) 03:36:41「マチンの公式 多倍長演算」でぐぐってみろ。
0058デフォルトの名無しさん
2007/06/05(火) 03:50:05Cなら enum を 0 で初期化してもエラーにはならないはず。
C++ ならエラーになるけど、その場合はコンストラクタが使えるし、
= {} も使える。
C/C++ のどっちかが決まってるなら問題にならないはず。
CのソースをC++でもコンパイルできるようにしたいときだけ、
面倒な話になる。
0059デフォルトの名無しさん
2007/06/05(火) 04:09:56おそらく初期化ルーチンはライブラリ化されていると思うよ。
どこのマイコンコアだかわからんが、メーカー純正のコンパイラ?
組み込みのCの場合でもスタック以外のRAM領域はクリア(つまり0)されているのが基本
0060デフォルトの名無しさん
2007/06/05(火) 04:30:00ソース http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4155.txt
コンパイラ BCC5.5
デバッガを走らせて見たところ、39行目のscanf("%d",&ch);の実行後にstartPtrの値がNULLになったことが原因みたいなんですが、
なぜここでstartPtrの値が変わるかわかりません
BCC5.5のバグかなんかでしょうか?
0061デフォルトの名無しさん
2007/06/05(火) 04:38:02バグってるのはすぐ処理系のせいにする君の頭だ
char型の変数に%dを突っ込むな
%dはint型のポインタを要求する
0062デフォルトの名無しさん
2007/06/05(火) 04:43:000063デフォルトの名無しさん
2007/06/05(火) 04:44:09ありがとうございます
なんか、こういうミスで詰まること多いんですよね
0064デフォルトの名無しさん
2007/06/05(火) 04:53:05startPtr + 9 は一体どこをポイントしているとお思いか?
自分の無理解無努力無責任のつけをコンパイラに転嫁させませぬよう。
0065デフォルトの名無しさん
2007/06/05(火) 04:54:230066デフォルトの名無しさん
2007/06/05(火) 07:46:12startPtr + 9で問題ないだろ
0067デフォルトの名無しさん
2007/06/05(火) 08:23:530068デフォルトの名無しさん
2007/06/05(火) 08:30:080069デフォルトの名無しさん
2007/06/05(火) 13:23:44???
chはchar型でそのポインタにintサイズ書き込んだら近くのメモリ壊すのは当たり前だと思うが
まぁ言葉足らずとかのレベルで間違いとも言い切れないな
あとどうでもいいことだが
(startPtr+9)->
って書くよりは
startPtr[9].
のほうがスマートでわかりやすい気がする
さらに言わせてもらえば
startPtrは他の変数にコピーしといて
for(int c=0;c<10;c++;startPtr++){
printf("%d個目の文字を入力してください:",c+1);
scanf("%d",&(startPtr->data));
startPtr->nextPtr=startPtr+1; // ++startPtrにして上のstartPtr++無くしてもいいんだが
}
startPtr->nextPtr=NULL;
でとっといた startPtr のコピーを戻してやればスマートじゃないかと
0070デフォルトの名無しさん
2007/06/05(火) 13:27:54for(int c=0;c<10;c++;startPtr++){
これは
for(int c=0;c<10;c++,startPtr++){
の間違い
0071デフォルトの名無しさん
2007/06/05(火) 13:36:12for(int c=0;c<10;c++,startPtr++){
これは
for(int c=0;c<10;c++;startPtr++){
の間違い探し
0072デフォルトの名無しさん
2007/06/05(火) 13:40:540073デフォルトの名無しさん
2007/06/05(火) 13:43:07誰がうまいことを言えと(ry
0074デフォルトの名無しさん
2007/06/05(火) 13:43:49画面上でも1ドットだぜ・・・
0075デフォルトの名無しさん
2007/06/05(火) 21:57:56制御構造やポインタなど基本的なことは理解できました。
これから何をしていけばいいでしょうか?将来はプログラマ志望です。
授業ではアルゴリズムを勉強しています。
勉強しておいたほうがいい言語や順序みたいなものを提示してくださると嬉しいです。
0076デフォルトの名無しさん
2007/06/05(火) 22:00:290077デフォルトの名無しさん
2007/06/05(火) 22:00:50擬似でいいからアセンブラ
0078デフォルトの名無しさん
2007/06/05(火) 22:04:440079デフォルトの名無しさん
2007/06/05(火) 22:08:57>>77のアセンブラもいいと思うし、割り込みとかマルチスレッドなんかもいいんじゃね?
可読性とか汎用性とかデザインパターン、テストとかデバッグ技術もあってもいいかも?
アルゴリズムって実際に役に立つかな?
いろんなプログラムを山ほどこなしてるほうがいい気がする。
0080デフォルトの名無しさん
2007/06/05(火) 22:15:30>>75の大学がどこかは知らないが、大抵大学の授業で教えるアルゴリズムっていうと
基礎の基礎で結構重要だろw
0081デフォルトの名無しさん
2007/06/05(火) 22:18:43俺、役に立ってねぇ・・・
もっと基礎的な内容かな?ソートとか?
ソートなんて、バブルソートとクイックソート以外は必要なときに毎度調べてるな。
0082デフォルトの名無しさん
2007/06/05(火) 22:19:09宿題スレで宿題解くのオススメ
0083デフォルトの名無しさん
2007/06/05(火) 22:25:36ソートとか探索とかリストとかやったかなぁ・・・?
仕事でそのまま使えるってことは少ないだろうけど、基礎を覚えておいて損は無い
0084デフォルトの名無しさん
2007/06/05(火) 22:29:01俺「qsort(...); はい終わり^^」
0085デフォルトの名無しさん
2007/06/05(火) 22:30:50「標準ライブラリに丸投げでOK」から「自力でアルゴリズムをひねり出すことを要求される」まで幅広いわけで
0086デフォルトの名無しさん
2007/06/05(火) 22:32:250087デフォルトの名無しさん
2007/06/05(火) 22:32:29リスト、スタック、キューとかのデータ構造とかか。
素因数分解とかは、暗号化とかの分野いかなきゃ使う機会はなさそうだな
008875
2007/06/05(火) 22:50:14授業のアルゴリズムではソートやリスト構造、木構造などをやっています。
アセンブラですか。何か必要な環境等は必要でしょうか?
またC++も興味があるのですが勉強可能でしょうか?環境はCygwinです。
0089デフォルトの名無しさん
2007/06/05(火) 22:55:43やる気があれば何でも可能。
>>82のアドバイスをうけて、慣れてきたら同じ課題をCっぽい解き方、
C++っぽい解き方の両方やってみたりしても良いかも。
0090デフォルトの名無しさん
2007/06/05(火) 22:57:04つ[std::stable_sort()]
0091デフォルトの名無しさん
2007/06/05(火) 23:08:45紙とペンさえあれば勉強できる
>>90
C言語で解け
0092デフォルトの名無しさん
2007/06/05(火) 23:18:29常人は適当にmasmなりインラインアセンブラ等ケースで身に着けましょう
0093デフォルトの名無しさん
2007/06/05(火) 23:19:300094デフォルトの名無しさん
2007/06/05(火) 23:26:17VirtualPC とか VmwarePlayer とか Bochs とか qemu とか
いろいろあるけど、どれがいいんだろう?
009575
2007/06/05(火) 23:36:48あと、どうもMicrosoft製はソフトが重いイメージがあるので微妙です。
なのでVisual Studioはどうも慣れません。
大学の先生もなるべくUNIX上でコンパイル・実行したほうがいいと言っています。
0096デフォルトの名無しさん
2007/06/05(火) 23:39:250097デフォルトの名無しさん
2007/06/05(火) 23:40:24はいはいかわいい子犬ちゃん
0098デフォルトの名無しさん
2007/06/05(火) 23:47:21構成ツールをmake代わりに使ったり、clだけ利用すればいい話
てかいくらなんでもUNIX推奨は冗談だろう…
0099デフォルトの名無しさん
2007/06/05(火) 23:48:45俺はそうしてる。つっても芽衣の開発環境じゃないんだが。
普段がテキストエディタなもんで、そっちのほうがやりやすい。
0100デフォルトの名無しさん
2007/06/05(火) 23:50:21・・・もしかしてだいぶMSにお布施してるかな、漏れ。
0101デフォルトの名無しさん
2007/06/05(火) 23:55:22かわいこちゃん・・・
人の話聞いて知ったかするより、自分でWinとUnix系の違いを
自分で調べて知りなさい。
0102デフォルトの名無しさん
2007/06/06(水) 00:43:54最近のゲーム機やパチンコ台の液晶なんかの場合はUNIX系環境が主流だな
そっち方面ならcygwinやlinuxでなれておくと楽だぞ
あのへんなら開発環境に金かからんし
Winだけのプログラム勉強したいならともかく、
広い意味でプログラムの勉強したいならVisualStudioはオススメしない
0103デフォルトの名無しさん
2007/06/06(水) 00:46:430104デフォルトの名無しさん
2007/06/06(水) 00:51:270105デフォルトの名無しさん
2007/06/06(水) 00:53:21もうvsのインターフェースに慣れちゃったぜ…orz
0106デフォルトの名無しさん
2007/06/06(水) 01:23:45MSの環境は独自の俺様仕様が多過ぎる、それに値段も高い
SDKのバージョン変わるとコンパイル通らなくなったりするし
小規模なプログラムだといいけど大規模になるとあの互換性のなさには泣けてくるぞ
開発以外の余計な事に時間取られすぎるんだよ
いまだに一部ゲームで古いDirectXとか使ってるのはそのせいだろうし
仕事の関係で多数の環境、日立のshcとかgcc、ボーランドCとかLSI-C、CodeWarrior その他いろいろ
使ってきたけどあそこまでかけ離れてるのはMS環境だけだ
0107デフォルトの名無しさん
2007/06/06(水) 01:35:06SDKとかMFCをC++の勉強に使うなんて、とても勧められないし
コンパイラのバグもちょくちょくあったりする。
設定に困ったときにネットで探せば色々見つかるってのは大きいと思う。
コンパイラのバグなんて、MS環境でもなきゃ中々しにくくね?
まぁ、bccやgccならそれなりにサイトも多いけどやっぱMSに比べると・・・
やっぱ、作ったもんが動くからプログラミングって楽しいんじゃね?
とはいえ値段や仕様変更の多さには同感だw
0108デフォルトの名無しさん
2007/06/06(水) 02:56:46Visual C++ は単品で持ってたけど、VSのあの安さなら買っちゃうって
0109デフォルトの名無しさん
2007/06/06(水) 04:25:45Sphere.hにint Collide( Sphere, Sphere )という関数を定義して, Sphere.cppで実装しました
このint Collide( Sphere, Sphere )をinline関数にしたいのですが、上手く行きません
.h, .cppのどちらにもinlineを書く, どちらか一方に書く場合と試しましたが上手く行きません
どちらにもつけない場合は上手く行きます
どうすればinline関数にできるでしょうか?無理なのでしょうか?
よろしくお願いします
0110デフォルトの名無しさん
2007/06/06(水) 04:26:580111109
2007/06/06(水) 04:36:03ありがとうございました
0112デフォルトの名無しさん
2007/06/06(水) 04:55:09理解せずに使ってるだけな馬鹿は無視しろ
0113デフォルトの名無しさん
2007/06/06(水) 04:56:48inline 関数はヘッダに書くもんだろw
0114デフォルトの名無しさん
2007/06/06(水) 06:07:24書け、って事だな
0115デフォルトの名無しさん
2007/06/06(水) 06:13:31なんか極めて限られるような状況ですな
0116デフォルトの名無しさん
2007/06/06(水) 07:31:36inline 指定とリンケージは関係ないよ。
0117デフォルトの名無しさん
2007/06/06(水) 07:32:28でもヘッダファイルに宣言だけしたらリンカエラーでるじゃん?
0118デフォルトの名無しさん
2007/06/06(水) 07:35:02これは暗に「よほどのことが無い限り使うな」と言っているので同じではないか
0119デフォルトの名無しさん
2007/06/06(水) 07:36:50定義が無いからだろ。リンケージも inline も関係ない。
0120デフォルトの名無しさん
2007/06/06(水) 07:39:09その認識で問題ない。 inline で速度が変わる状況なんてかなり減ってきてるし、
これからも減るだろうし。
0121デフォルトの名無しさん
2007/06/06(水) 07:40:49適当にやってくれるだろ
0122デフォルトの名無しさん
2007/06/06(水) 07:45:38ついでに言えば、最早コンパイラはオブジェクト間最適化を行なう時代。
inline指定なんぞせんでもコンパイラの方で勝手に(別ファイルの関数さえ)インライン展開してくれるよ。
0123デフォルトの名無しさん
2007/06/06(水) 07:46:05静的リンケージだから定義がないんじゃないのか?
0124デフォルトの名無しさん
2007/06/06(水) 07:47:010125デフォルトの名無しさん
2007/06/06(水) 07:51:14それはおかしい。extern宣言しても他のファイルで定義してある
inline関数は使えんぞ。
0126デフォルトの名無しさん
2007/06/06(水) 08:03:10なるほど。 inline は関係あるな。
7.1.2p4 より
"An inline function shall be defined in every translation unit in which it is used and
shall have exactly the same definition in every case."
inline 関数は使われるソースごとに定義が必要になるってことらしい。
エラーになるのはこのルールに違反するからであって、リンケージは
関係ない。
0127デフォルトの名無しさん
2007/06/06(水) 08:05:29お前最初にinline関係ないって言ったじゃん。いい加減な事を言うな。
0128デフォルトの名無しさん
2007/06/06(水) 08:19:030129デフォルトの名無しさん
2007/06/06(水) 08:20:180130デフォルトの名無しさん
2007/06/06(水) 08:21:370131デフォルトの名無しさん
2007/06/06(水) 19:15:39c - '0' /*cの中が文字か数字かをしらべる*/
c - '0' の意味がわかりません
これは何をやってるんですか?
0132デフォルトの名無しさん
2007/06/06(水) 19:18:360133デフォルトの名無しさん
2007/06/06(水) 19:43:22仮想関数テーブルに関する記述がないんですが、
仮想関数テーブルは C++ の仕様上には
全く存在しない概念なんでしょうか?
0134デフォルトの名無しさん
2007/06/06(水) 19:50:110135デフォルトの名無しさん
2007/06/06(水) 19:53:29'0'ってのは数値的には0x30、そこから順に0x39('9')まで並んでる
だから文字として入力したものを数値に変換するときはそういうこともするけど・・・
キャラクターコードの意味わかってないなら
isdigitとか使っとけ
変換するなら
atoiとかstrtol使えばいい
それコメントが間違ってるよw
関数使わずに調べるなら
if((c >= '0') && (c <= '9'))
でいいだろうし、
変換したいならその後に c-'0' したほうがいいと思う
c-'0' じゃ数字かどうか調べてないしな・・・
0136デフォルトの名無しさん
2007/06/06(水) 19:58:24ネットワーク外部にインストールしたRuby等の.exeを、ファイル共有した状態で
例えば
\\マシン名\\Ruby\bin\ruby.exe
にあるruby.exeを実行したくて
Path環境変数に"\\マシン名\\Ruby\bin"を追加したのですが、うまくいきません。
そもそも無理なのか、または指定のやり方が間違っているのでしょうか?
0137デフォルトの名無しさん
2007/06/06(水) 20:02:41スレ違い
0138デフォルトの名無しさん
2007/06/06(水) 20:14:380139デフォルトの名無しさん
2007/06/06(水) 20:43:07つまり、仮想関数テーブルは Implementation Specific な話ということなんですね。
了解しました。
01401/2
2007/06/06(水) 20:51:48int main(void)
{
int a, b, n;
puts("整数を2つ入力してください");
scanf("%d %d", &a, &b);
puts("演算子を入力してください");
n = getchar();
switch(n)
{
case '+':
printf("%d\n", a+b);
break;
case '-':
printf("%d\n", a-b);
break;
case '*':
printf("%d\n", a*b);
break;
case '/':
printf("%d\n", a/b);
break;
case '%':
printf("%d\n", a%b);
break;
}
return 0;
}
01412/2
2007/06/06(水) 20:52:58int main(void)
{
int a, b, n;
puts("整数を2つ入力してください");
scanf("%d %d", &a, &b);
puts("演算子を入力してください");
n = getchar();
switch(n)
{
case '+':
printf("%d\n", a+b);
break;
case '-':
printf("%d\n", a-b);
break;
case '*':
printf("%d\n", a*b);
break;
case '/':
printf("%d\n", a/b);
break;
case '%':
printf("%d\n", a%b);
break;
}
return 0;
}
01422/2
2007/06/06(水) 20:53:38「演算子を入力してください」
でプログラムが終了してしまいます。
何故でしょうか?
環境はcygwinです。
0143デフォルトの名無しさん
2007/06/06(水) 20:58:13getchar() で改行文字を読み込んでいるから
0145デフォルトの名無しさん
2007/06/06(水) 21:22:48getchar でバッファに残った改行文字が取り出される
とりあえず
scanf("%d %d", &a, &b);
↓
scanf("%d %d%*[\n]", &a, &b);
または
scanf("%d %d", &a, &b);
↓
scanf("%d %d", &a, &b);
while(getchar()!='\n');
としてみては?
0146142
2007/06/06(水) 21:29:59無事解決しました。有り難うございます。
直後の改行が残ってたんですね;
あらかじめ、a,bに値を代入してscanfを削除したらちゃんと実行できた訳ですね。
0147デフォルトの名無しさん
2007/06/06(水) 23:46:170148デフォルトの名無しさん
2007/06/06(水) 23:57:06それって、前にTVでやっていた著作権切れの本を公開する奴?
0149デフォルトの名無しさん
2007/06/07(木) 06:26:400がぬるぽじゃない環境ってのもあるんでしょうか?
0150デフォルトの名無しさん
2007/06/07(木) 06:28:41NULLが0じゃない環境ってのもあるんでしょうか?
0151デフォルトの名無しさん
2007/06/07(木) 06:49:24よく考えると自分も質問の意図を把握できてないのに気づいたので取り下げます
0152デフォルトの名無しさん
2007/06/07(木) 09:12:190 こそが真のヌルポインタだよ。
ただ、これだけだと整数型とか小数型の値としてもとれるから、
NULL ってマクロを使ってそれを回避できるようにもしてるだけ。
0153デフォルトの名無しさん
2007/06/07(木) 09:53:37そんな隙だらけの説明しかできないんならヌルポインタについて語るのはやめとけ。
↓これでいいだろ。
http://www.kouno.jp/home/c_faq/c5.html
0154デフォルトの名無しさん
2007/06/07(木) 09:57:540155デフォルトの名無しさん
2007/06/07(木) 10:10:02>ただ、これだけだと整数型とか小数型の値としてもとれるから、
これは、
#ただ、これだけだと「プログラムを読む人間」 が、この 0 が
#数値の 0 か、ヌルポインタの 0 かを、そこからだけでは読み取れないので、
という風な意味。
0156デフォルトの名無しさん
2007/06/07(木) 10:13:430157デフォルトの名無しさん
2007/06/07(木) 10:18:000158デフォルトの名無しさん
2007/06/07(木) 10:25:380159デフォルトの名無しさん
2007/06/07(木) 10:33:510160デフォルトの名無しさん
2007/06/07(木) 10:54:040161デフォルトの名無しさん
2007/06/07(木) 14:32:34{
struct st* a;
get(&a); /* callocで構造体配列作成しaに割り当て */
free(a);
}
これをコンパイルすると、syntax error: missing';' before 'type'
とでます。アドバイスを頂けないでしょうか。お願いします。
0162デフォルトの名無しさん
2007/06/07(木) 14:36:43のようです。しかし、freeのときにエラーが出るのがわからなく
その件について助言お願い致します。
0163デフォルトの名無しさん
2007/06/07(木) 14:42:07その原因の行も書いてよ。
自分がコンパイラになったつもりでたどればわかる
0164デフォルトの名無しさん
2007/06/07(木) 14:47:380165デフォルトの名無しさん
2007/06/07(木) 14:49:080166デフォルトの名無しさん
2007/06/07(木) 15:18:12if(FALSE)break;
struct st* a;
get(&a);
free(a);
だとコンパイルできなくて
struct st* a;
if(FALSE)break;
get(&a);
free(a);
だと実行時エラー。
struct st* a = NULL;
if(FALSE)break;
get(&a);
free(a);
で解決しました。C言語に慣れておらずいまいち理解できないので
すごく変な勘違いしてそうですね…。
0167デフォルトの名無しさん
2007/06/07(木) 15:27:24実行時エラーは何か勘違いしてる
0168デフォルトの名無しさん
2007/06/07(木) 15:32:370169デフォルトの名無しさん
2007/06/07(木) 15:32:46あれは未初期化ポインタに対するアクセスのエラーだから
リリースビルドにすれば実行時に落ちることは無い
しかしその前にコンパイラの方で未初期化に対するどうたらこうたらっていう
警告が出るはずなんだが…
0170デフォルトの名無しさん
2007/06/07(木) 15:34:10get で &つけて呼び出してるから、警告は出ないんじゃないかな。
その関数で代入失敗してるっぽい。
0171デフォルトの名無しさん
2007/06/07(木) 15:38:09試しにそうしたら確かに通っちゃったよ…
0172デフォルトの名無しさん
2007/06/07(木) 15:41:04(リンクの段階で出てくるのが リンクエラー)
出来上がった実行ファイルを実行して出てくるのが 実行時エラー
m(c)alloc で得られたポインタではない非NULL 値を realloc しようとしたんじゃねーかな?
0173デフォルトの名無しさん
2007/06/07(木) 15:44:43get(struct st**) の実装晒したほうが早いぞ
0174デフォルトの名無しさん
2007/06/07(木) 15:52:12確認したところキャストはされていませんでした。
ブロックの先頭・値初期化の不備は、お恥ずかしいミスです。
ところで、C++てエラーメッセージがわかりにくくないですか?
関数や引数のクイックインフォも出なくて、難しすぎて泣けてきます。
0175デフォルトの名無しさん
2007/06/07(木) 15:56:37getの仕様によるけどな。
0176デフォルトの名無しさん
2007/06/07(木) 15:59:17ことでしょうか?でも多分、get()には問題はないはずです。
たった4行のコードでここまで悩める俺みたいなバカは
プログラマに向いてないんでしょうねorz
0177デフォルトの名無しさん
2007/06/07(木) 16:08:38だったら get(arg) の仕様は?
第一引数 arg の内容を書き換えるだけ ならば、
NULL 初期化しなくても、実行時エラーは出ないつくりになる(はず)。
第一引数 arg の内容を確認してから書き換える ならば、
NULL 初期化が必須になるだろう。
この違いは get() を作った奴が指示すべきで、それを利用する側は、
その指示に従うしかない。 (で、その指示がない場合は作った奴を呪う)
0178デフォルトの名無しさん
2007/06/07(木) 18:47:58それをC言語で使用するにはどうすればいいのでしょうか?
具体的に言いますと、とりあえずexeファイルにa.txtをD&Dしたらそのディレクトリに
copy_a.txtというファイルを作成したりしたいです。コマンドプロンプトでいうとcp a.txt copy_a.txtですね。
まぁやりたいのはcpコマンドではなくて、javacコマンドとjavaコマンドなのですが・・・。
0179デフォルトの名無しさん
2007/06/07(木) 18:51:140180178
2007/06/07(木) 18:51:420182デフォルトの名無しさん
2007/06/07(木) 19:19:13でエラーが出るのですが、何か書式を間違ってるでしょうか?
文字列を最後まで1文字ずつ取得して、文字数を数えるプログラムを作ろうとしています。
最後取得したら\0がbufに入ると思うのですが、上の文でエラーが・・・
0183デフォルトの名無しさん
2007/06/07(木) 19:23:49http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcmp.3.html
引数の型が違う。(というかたぶんstrcmp()が何をする関数なのか勘違いしている)
0184デフォルトの名無しさん
2007/06/07(木) 19:26:230185デフォルトの名無しさん
2007/06/07(木) 19:37:02とりあえずnullmoji[2]に'\0'を入れてstrcmpをしたら正常に動作しました。
ありがとうございました。
>>184
そういう課題なんです・・・
0186デフォルトの名無しさん
2007/06/07(木) 19:42:50#define Public public:
#define Private private:
#define Protected protected:
って定義して、んでヘッダファイルを
Public int getNum();
Public void setNum(int num);
みたいに書いてみたんだけど、これと似たようなことをやる人は多い?
それとも明らかにC++の常識からは外れた書き方?
0187デフォルトの名無しさん
2007/06/07(木) 19:46:56なにより読みにくいし、なら java でかけよと言いたい
0188デフォルトの名無しさん
2007/06/07(木) 19:52:34m9( ´,_‥`)プッ
0189デフォルトの名無しさん
2007/06/07(木) 19:56:46Javaってpublicだのprivateだのの先頭、いつから大文字で書くようになったんだ
0190デフォルトの名無しさん
2007/06/07(木) 19:57:08PASCAL風に
#define BEGIN }
#define END }
なんてやられたソースをおまえは許せるんだな?
0191デフォルトの名無しさん
2007/06/07(木) 19:59:41シェルを書いたのは(勿論悪い意味で)有名
0192デフォルトの名無しさん
2007/06/07(木) 20:20:55関数一覧をカテゴリ別に並べて書きたくて……
>>188
(´・ω・`)
>>189
いや先頭が小文字のpublicとかは予約語なんで
>>190
……ええと、すいません
0193デフォルトの名無しさん
2007/06/07(木) 20:23:510194デフォルトの名無しさん
2007/06/07(木) 20:26:05とかできるんだぜ。
0195デフォルトの名無しさん
2007/06/07(木) 20:29:36やるな。
理由は色々あるが、一番実害があるのはこんなところか。
#define public public:
としたとして、
class A {
public void foo();
void bar();
};
の bar のアクセス指定がどうなるか考えてみよう。
これは public だ。
だが、見た目から直感的に感じるのは private だろう。
こういう齟齬が発生するから、してはいけない。
0196デフォルトの名無しさん
2007/06/07(木) 20:29:41あほすぎw
0197デフォルトの名無しさん
2007/06/07(木) 20:37:01for (int i=0; ...) {
// スコープ1
}
// スコープ2
でi がスコープ2 まで有効な特殊系(VCだなっ) を回避する常套句ですな
0198デフォルトの名無しさん
2007/06/07(木) 20:41:400199デフォルトの名無しさん
2007/06/07(木) 22:09:010200デフォルトの名無しさん
2007/06/07(木) 23:01:19public: void Hoge()なんてコードを出していた気がする
0201デフォルトの名無しさん
2007/06/07(木) 23:03:36それが仕様だったかも知れないが、規格にはなっていない罠。
0202デフォルトの名無しさん
2007/06/07(木) 23:06:05それでもなってないの?
0203デフォルトの名無しさん
2007/06/07(木) 23:07:51規格になっていたと言うがいい
0204デフォルトの名無しさん
2007/06/07(木) 23:26:130205178
2007/06/07(木) 23:43:26system("cd c:\\java");
system("java HelloWorld");
で実行したみたのですが、
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
と出てしまいます。普通にコマンドプロンプトでcd c:\javaとjava HelloWorldを打ち込んだときは
正常に動作するのですが、何かsystemでやるときに特別に何かしなければいけない事があるのでしょうか?
0206178
2007/06/07(木) 23:49:32system("dir")を実行したら、javaディレクトリが表示されずに、
プロジェクトのディレクトリが表示されるのですが・・・
0207デフォルトの名無しさん
2007/06/07(木) 23:52:220208デフォルトの名無しさん
2007/06/07(木) 23:52:571度のsystem呼出で済ませるようにしろ
絶対パスで指定するとか、バッチファイルを作ってそれをsystemで呼ぶとか
0209178
2007/06/07(木) 23:56:35とりあえずsystem("java c:\\java\\HelloWorld");で実行してみたのですが、やはり
Exception in thread "main" java.lang.NoClassDefFoundError: c:\java\HelloWorld
と出てしまいます。う〜ん・・・
0210178
2007/06/08(金) 00:06:01は普通に実行できてるっぽいです。javaコマンドだけ何で出来ないのかな;;
0211デフォルトの名無しさん
2007/06/08(金) 00:12:18それとも区切り文字か。
ってことで、system("cd c:\\java; java HelloWord")とsystem("java c:/java/HelloWordl")を試して味噌。
0212デフォルトの名無しさん
2007/06/08(金) 00:21:010213デフォルトの名無しさん
2007/06/08(金) 09:35:51普通はそれを最初にやるわな
0214デフォルトの名無しさん
2007/06/08(金) 10:47:42(関数内で参照をいくつか用いると、それだけスタック使うことになりますか?)
0215デフォルトの名無しさん
2007/06/08(金) 10:55:06質問の意図が読めんが…
関数の引数で
値渡しした場合には 値が持つ大きさ だけスタックに詰まれる
参照渡しした場合には ポインタが持つ大きさ だけスタックに詰まれる
0216デフォルトの名無しさん
2007/06/08(金) 11:34:37通常変数がスタックを消費する保証はない。
まして、参照変数がスタックを消費するかどうかはコンパイラ次第。
0217178
2007/06/08(金) 12:13:26おぉ・・・出来ませんでした・・・。何でだろう・・・。
javaコマンドはそのカレントディレクトリにあるファイルに対してしか実行できないとか・・・?
0218178
2007/06/08(金) 12:19:35system("cd c:\\java; java HelloWorld");
だと、指定されたパスが見つかりませんと出ます。
system("java c:/java/HelloWordl");
だと、Exception in thread "main" java.lang.NoClassDefFoundError: c:/java/HelloWorld
う〜ん・・・
0219178
2007/06/08(金) 12:23:46などは正常に動作するようです。やはりjavaコマンドの仕様なのでしょうか・・・;;
0220デフォルトの名無しさん
2007/06/08(金) 12:32:11まあカレントディレクトリの移動などは、SetCurrentDirectory() 使えばいい
0221178
2007/06/08(金) 12:44:54ありがとうございます。どうやら僕の勉強不足のようですね。しかし、
SetCurrentDirectory((LPCWSTR)"c:\\JAVA");
としても、カレントディレクトリが変わったような動作はしないのですが・・・。
その後dirコマンドを打ったら、やはりプロジェクトのディレクトリが表示されます。
0222デフォルトの名無しさん
2007/06/08(金) 12:48:210223デフォルトの名無しさん
2007/06/08(金) 12:49:32SetCurrentDirectory(L"c:\\JAVA");
じゃ…
0224178
2007/06/08(金) 12:53:25とりあえずプロジェクトのプロパティの文字設定をUnicodeから設定なしに変更しました。
その後、SetCurrentDirectory((LPCWSTR)"c:\\JAVA");をSetCurrentDirectory("c:\\JAVA");
に変更し、system("dir")をしたところ、JAVAディレクトリが表示されました。
それを確かめた上で、system("java HelloWorld");を行ったら無事実行する事が出来ました。
原因がよく理解出来ないのですが、とりあえず動作できたのでいいのかな・・・。
ありがとうございました。
0225デフォルトの名無しさん
2007/06/08(金) 13:32:56エラーが出るからってとりあえずキャストすんのはやめとけ
0226デフォルトの名無しさん
2007/06/08(金) 13:42:37system("java c:/java/HelloWordl");
これだけど、
system("java -classpath c:/java HelloWordl");
これなら動くんじゃないか?
HelloWordl の綴りが気になるが
0227178
2007/06/08(金) 13:54:53丁寧にありがとうございます。キャストはあまりしないほうがいいみたいですね。
現在はchar型の変数にパスを入れて、SetCurrentDirectory(dirPass);のようにしているのですが、
やはりそれだと動作が微妙です。引数はcharじゃなくてLPCTSTR(?)じゃないといけないのかな
とか思いつつ奮闘しています。
>>226
一応-classpath(-cp)も使って実行してみたのですが、確か出来なかったです。
HelloWorldの綴りが>>211で間違ってるのにも実は気付いていて、ちゃんと綴りを直して実行しました。
0228デフォルトの名無しさん
2007/06/08(金) 13:56:31classpath の指定と HelloWordl の間にはスペースがあるんだけどわかってる?
0229デフォルトの名無しさん
2007/06/08(金) 14:00:32http://www.google.co.jp/search?q=hellowordl&lr=lang_ja
0230178
2007/06/08(金) 14:04:28あ、大丈夫です。ちゃんと半角スペース入れています。
あと、どうやら>>227のSetCurrentDirectory()は引数の型とかの問題じゃなかったです。
むしろ何も問題は起きてませんでした・・・(´・ω・`)
どうやらstrncat(dirPass, &argv[0][0], point);を実行した後にsystemコマンドが使えないです。
system("dir");を実行しただけでエラーが・・・。
0231デフォルトの名無しさん
2007/06/08(金) 14:10:49ちゃんとコピペしてやってみたのかよ
そもそも、これがおかしいんだよ→ c:/java/HelloWordl
ここはファイルを指定するんじゃなくてクラス名を指定するの
パス名がクラスの階層を表してはいるけどな
>system("dir");を実行しただけでエラーが・・・。
ふーん
0233デフォルトの名無しさん
2007/06/08(金) 14:32:47うちでは動いてるけど、君のトコでは動かないんだね
0234デフォルトの名無しさん
2007/06/08(金) 14:44:31どこか壊してるんでしょう。
dirPassはちゃんと文字列を置ける所を指してる?
(argv[0]って自分の名前なんだけど、それで何するんだろ?)
0235178
2007/06/08(金) 15:16:42そういう次元でもないような・・・。
>>234
dirPassをprintfで表示させたらちゃんと目的のものを表示してくれました。
とりあえず手法を変えて、argv[0][point]に\0を入れてstrcpyしてみたらsystem("dir")が正常に動作しました。
一体何だったのでしょう・・・。argv[0]は最終的にはargv[1]に置換する予定ですw
0236デフォルトの名無しさん
2007/06/08(金) 15:18:420237デフォルトの名無しさん
2007/06/08(金) 15:19:58複数コマンドだとしてもバッチファイルで済むレベルの内容じゃないのか?
無理矢理Cで作ろうとするほうが疑問なんだが・・・
0238178
2007/06/08(金) 15:30:47ヤバイ・・・全然皮肉が伝わってなかったらしいです;;
言われても気付けない俺はバカかもしれない・・・
まぁ、逆に考えれば幸せな人なのかもしれないから良いか(`・ω・´)ふふふ
>>237
やろうとしていることは、D&Dで.javaを渡したらコンパイル、.classを渡したらそれを実行するプログラムです。
もしかしたらもっと簡単で楽な方法があるんですかね・・・。バッチファイルとか分からないので後でググッておきます。
JAVAを昨日から勉強しようと思ったのですが、いちいちコマンドプロンプトでディレクトリ移動したり
javaコマンド打ったりするのが面倒だと思って・・・。↑押せば前のコマンドは出てきますけど、それさえも面倒で・・・。
というか、コマンドプロンプトでコマンド打つのが嫌いなんです;;
そして、今大体プログラムは完成したっぽいです。
0239デフォルトの名無しさん
2007/06/08(金) 15:32:320240デフォルトの名無しさん
2007/06/08(金) 17:32:11printf("%d\n", Fd)としたら値が変化しません・・・
struct ffblk Fd;
findfirst("*", &Fd, 55);
do {
printf("%s\n", Fd.ff_name);
}
while(!findnext(&Fd));
0241デフォルトの名無しさん
2007/06/08(金) 17:45:49何も分からない
0242デフォルトの名無しさん
2007/06/08(金) 17:48:57再帰を使わずにディレクトリ内のファイルを出力したいのですが
ディレクトリを進めたときに上ディレクトリで何処まで読んだかを記録しておきたいんです
0243デフォルトの名無しさん
2007/06/08(金) 17:50:47B_dir
C_dir
というディレクトリがあったとき、B_dirを調べ終わったとき
次にC_dirを検索するにはどのデータを保存しておけば良いんですか??
0244デフォルトの名無しさん
2007/06/08(金) 17:59:58関数を再帰的に書けば良いじゃん
0245デフォルトの名無しさん
2007/06/08(金) 18:05:38再帰を使いたくないんです・・・
0246デフォルトの名無しさん
2007/06/08(金) 18:07:080247デフォルトの名無しさん
2007/06/08(金) 18:09:330248デフォルトの名無しさん
2007/06/08(金) 18:10:05ttp://ja.wikipedia.org/wiki/%E6%9C%AB%E5%B0%BE%E5%86%8D%E5%B8%B0
0249デフォルトの名無しさん
2007/06/08(金) 18:13:57>>247 struct ffblk Fd , Fe; としてFe = Fdと記録してみましたがた゛めでした
0250デフォルトの名無しさん
2007/06/08(金) 18:19:050251デフォルトの名無しさん
2007/06/08(金) 18:19:210252デフォルトの名無しさん
2007/06/08(金) 18:21:440253デフォルトの名無しさん
2007/06/08(金) 18:23:20再帰で不安定になるのは、あなたの書いたプログラムの問題。
まあ再帰使わなくても>>250みたいなやり方でFA_DIRECでも調べれば可能かとは思うけど
100人中95人以上は、再帰の方がわかりやすく書きやすいと言うだろう。
速度なんか気にするケースじゃないしね。
0254デフォルトの名無しさん
2007/06/08(金) 18:28:290255249
2007/06/08(金) 18:29:22再帰だと出来ないんです・・・・
0256デフォルトの名無しさん
2007/06/08(金) 18:31:38どうやればいいんですか???
フォルダサイズ調査 『 D-Usage.exe 』
http://hp.vector.co.jp/authors/VA032597/Software/DirMan.html
0257デフォルトの名無しさん
2007/06/08(金) 18:32:30かえって遅くなるような気がしないでもない
0258デフォルトの名無しさん
2007/06/08(金) 18:35:07進める前に、ディレクトリ情報を取得しておいて
自分でそこのディレクトリを設定し直せばいいってことか
それでできそうかも
0259デフォルトの名無しさん
2007/06/08(金) 18:36:020260デフォルトの名無しさん
2007/06/08(金) 18:36:15実際にデータを読み込む訳ではないんですよ
0261デフォルトの名無しさん
2007/06/08(金) 18:37:02もっとけばいいだけじゃないの?
そのハンドル持っとけば、次にFindNextFile()呼んだらちゃんと
続きから返ってこないか?
0263デフォルトの名無しさん
2007/06/08(金) 18:42:22そのアプリなら、2スレッドしか動かしていないよ。
恐らくは、GUIスレッドと調査スレッドか。
動きを見ていても、とても複数スレッドでやっているようには見えない。
調べもしないで想像で語る愚に填まったね。
0264249
2007/06/08(金) 18:46:10複数スレッド
D-Usage. 36s
http://hp.vector.co.jp/authors/VA032597/Software/index.html
単一スレッド
VCDCASE 45s
http://www.hi-ho.ne.jp/hiro30/
0265デフォルトの名無しさん
2007/06/08(金) 18:49:33自作関数で実引数で文字列を返す事は可能ですか?
0267デフォルトの名無しさん
2007/06/08(金) 18:50:33>263
0268デフォルトの名無しさん
2007/06/08(金) 18:54:110269デフォルトの名無しさん
2007/06/08(金) 19:00:58作者本人は悦に入っているようだから別にいいけど。
つーか、VCDCASEは目的が違うじゃん。違う目的のソフトを比較して速度云々って>249はどこまで阿呆を晒せば気が済むんだ?
0270デフォルトの名無しさん
2007/06/08(金) 19:09:05できます
0271デフォルトの名無しさん
2007/06/08(金) 20:52:54A_dir
- file1
- file2
B_dir
- file3
とあった場合に欲しい結果は以下のどっち?
1) A_dir B_dir
2) A_dir file1 file2 B_dir file3
1)ならFdを保存すればOK。
0272デフォルトの名無しさん
2007/06/09(土) 01:52:08#ifdef UNICODE
#define tcout wcout
#define tcin wcin
#define tcerr wcerr
#define tclog wclog
#endif
#ifdef _MBCS
#define tcout cout
#define tcin wcin
#define tcerr wcerr
#define tclog wclog
#endif
のようにtc*を定義するのは良くないんでしょうか?
もしそうであるならば、大体案としてはどのようなものがありますか?
0273デフォルトの名無しさん
2007/06/09(土) 01:55:200274デフォルトの名無しさん
2007/06/09(土) 01:56:39iostream& tcin = cin;
(ry
0275デフォルトの名無しさん
2007/06/09(土) 01:57:45とりあえず、_MBCS ブロック内のヤツは cin, cerr, clog にしたほうがいいと思うよ。
0276デフォルトの名無しさん
2007/06/09(土) 01:57:52おそらく、個人・環境等で意見は様々だと思う。
個人的には、4つや5つなら許せるが、こんなことしなくても問題ないようなモノにしたい。
で、その書き方なんだがUNICODEと_MBCSが万が一両方定義されていた場合のことも
考えて、#if-#else-#endifのほうがいいかと。
もしくは、両方定義されていたらコンパイルエラーにするとか。
0277デフォルトの名無しさん
2007/06/09(土) 02:01:44cin の型は iostream じゃなくて istream やね。
そして、_UNICODE の場合は wistream 。
0278デフォルトの名無しさん
2007/06/09(土) 02:05:01実際困っちゃうんだよね、それ。
自分も似たようなコトしてるし、多分大丈夫だと思いますよ。
0279デフォルトの名無しさん
2007/06/09(土) 02:29:52皆様の意見を参考にこのようにしました。
#ifdef UNICODE
#ifdef _MBCS
#error define either only UNICODE or _MBCS.
#else
std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::wcout;
std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::wcerr;
std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::wclog;
#endif
#else
#ifdef _MBCS
std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::cin;
std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcout = std::cout;
std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tcerr = std::cerr;
std::basic_ostream<TCHAR, std::char_traits<TCHAR> >& Tclog = std::clog;
#else
#error define either only UNICODE or _MBCS.
#endif
#endif
軽く使っただけなんで不具合は分かりませんが、
iostreamやiosfwdでの定義から考えればこれでいけそうに思えます。
_INC_TCHARの定義を必要とするようにとかまだ色々付け加えるべきことはあるとはおもいますが
0280デフォルトの名無しさん
2007/06/09(土) 03:17:18でファイルをオープンしようとしたのですが、どうやら実行ファイルの場所ではなく、
C:\C:\Documents and Settings\ユーザ名
のディレクトリが対象となっているっぽいです。どうにか対象を実行ファイルのある場所にしたいのですが、
どうすればいいのでしょうか?というよりも、普通実行ファイルの場所が対象になると思うのですが、、、
0281デフォルトの名無しさん
2007/06/09(土) 03:24:21>普通実行ファイルの場所が対象になると思うのですが、、、
そんな「普通」はあなたの脳内にしかありません。
大人しく絶対パス指定するなりユーザに設定してもらうなりインストーラで設定するなり
アプリケーションの在り処を検索するなりしてください。
0282534
2007/06/09(土) 03:49:25これ使ってください><
int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i = 0;
size_t len;
len = strlen(argv[0]);
while (i < len) {
printf("argv[0][%d]:%c\n", len-i, argv[0][len-i]);
if (argv[0][len-i] == '\\')
break;
++i;
}
if (dest_sz < len-i +2)
return -1;
strncpy(dest, argv[0], len-i+1);
dest[len-i+1] = '\0';
return 0;
}
argvはmain(int argc, char* argv[])のargvで
destは出力先の文字列の先頭ポインタ
dest_szはsizeof(dest)です><
ちなみにこれC++のSTL使うと4行程でできちゃいます><
0283534
2007/06/09(土) 04:20:39// コマンドライン引数配列から実行されたディレクトリを取得する
int getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i;
size_t len;
i = len = strlen(argv[0]);
while (i > 0) {
if (argv[0][i-1] == '\\')
break;
--i;
}
if (dest_sz < i +2 || i == 0)
return -1;
strncpy_s(dest, dest_sz, argv[0], i);
dest[i] = '\0';
return (int)i;
}
0284デフォルトの名無しさん
2007/06/09(土) 04:36:26そんなアプリケーション見たことねえw
0285534
2007/06/09(土) 04:48:38// コマンドライン引数配列から実行されたディレクトリを取得する
size_t getExecutedDirectory(const char* argv[], char* dest, size_t dest_sz) {
size_t i;
size_t len;
i = len = strlen(argv[0]);
while (i > 0) {
if (argv[0][i-1] == '\\')
break;
--i;
}
if (dest_sz < i +1 || i == 0)
return -1;
strncpy_s(dest, dest_sz, argv[0], i);
dest[i] = '\0';
return i;
}
0286デフォルトの名無しさん
2007/06/09(土) 05:58:260287534
2007/06/09(土) 06:31:110288534
2007/06/09(土) 06:49:51フルパスじゃないと取得できないので
windowsだとGetModuleFileName()を使うのですね^^
この辺は環境依存になるので注意が必要ですね^^
勉強になりました^^^^;;
0289デフォルトの名無しさん
2007/06/09(土) 06:51:34printf("aaa\n");をコメントアウトするだけで、エラーが出てしまいます。
これは俺が、system()で使う領域を侵してると考えていいのでしょうか?
0290デフォルトの名無しさん
2007/06/09(土) 06:51:362.バッファオーバーランしかけたらエラー処理してくれ
3.Shift-JISだとそのコードはまずくね?「c:\ソ.exeとか」
4.const char* argv[]じゃなくてchar const *const argv[]な
0291534
2007/06/09(土) 08:06:37もうWindows特化ですが(というかUNIXの実行環境が無い(´・ω・`) )
// コマンドライン引数配列から実行されたディレクトリを取得する
size_t getExecutedDirectory(TCHAR* dest, size_t dest_sz) {
_locale_t loc;
size_t len;
// 実行ファイルのフルパスを取得
TCHAR fullpath[4096];
GetModuleFileName(NULL, fullpath, sizeof(fullpath));
// ロケール設定
loc =_create_locale(LC_CTYPE, "japanese");
// 最後の\を見つけて、コピー範囲[fullpath,len)が適用できるようなlenを生成
TCHAR* last_slash = _tcsrchr(fullpath, '\\');
len = last_slash - fullpath +1;
// 出力先の容量が不足ならエラーで-1を返す
if (len-1 == 0 || dest_sz < len) {
if (dest_sz > 0)
dest[0] = '\0';
return -1;
}
// コピーして終端に0
_tcsncpy_l(dest, fullpath, len, loc);
dest[len] = '\0';
return len-1;
}
0292デフォルトの名無しさん
2007/06/09(土) 08:17:05その周辺を晒してくれないとなんとも言えないのだが。
0293デフォルトの名無しさん
2007/06/09(土) 08:34:05std::basic_istream<TCHAR, std::char_traits<TCHAR> >& Tcin = std::wcin;
とかって、ここで TCHAR 使っても意味ない気が。
右辺が明らかに wistream 型だし、
wistream と書いた方がすっきりしていいと思うぜ。
0294デフォルトの名無しさん
2007/06/09(土) 09:21:552._tcsrchr(fullpath, '\\')→ _T('\\')
3._tcsrchr(fullpath, '\\') _UNICDEかMBCSが定義されてないとShift-JISは問題起こす(たぶん)
4.dest[0] = '\0'→_T('\0')
5.return -1→return static_cast<size_t>(-1)とか
↓ これで我慢しろ。(UNCパスだと問題あるかも)
std::basic_string<TCHAR> getExePath()
{
TCHAR exe_path[MAX_PATH];
DWORD r = ::GetModuleFileName(NULL, exe_path, sizeof exe_path / sizeof *exe_path);
if( r == 0 || r == sizeof exe_path / sizeof *exe_path )
throw std::runtime_error("うぎゃあ");
TCHAR drive[_MAX_DRIVE], path[_MAX_PATH];
_tsplitpath(exe_path, drive, path, NULL, NULL);
return std::basic_string<TCHAR>(drive) + path;
}
0295デフォルトの名無しさん
2007/06/09(土) 09:27:16sizeof(fullpath)じゃなんであかんのんですか?
0296デフォルトの名無しさん
2007/06/09(土) 09:54:28GetModuleFileNameの第3引数はバイト単位のサイズでなく配列要素数を
指定する。Unicodeビルドの時はsizeof(TCHAR)が2なので、TCHAR buf[10]は
sizeof buf = 20
sizeof buf / sizeof *buf = 10
違ってたらごめん
0297デフォルトの名無しさん
2007/06/09(土) 10:05:43嘘つくな。氏ね
0298デフォルトの名無しさん
2007/06/09(土) 10:46:05ttp://msdn2.microsoft.com/en-us/library/ms683197.aspx
> The size of the lpFilename buffer, in TCHARs.
だから>>296であってる
0299デフォルトの名無しさん
2007/06/09(土) 17:45:36class temp{
public:
int *func();
};
と書いた場合、funcの定義はどう書き始めればいいですか
int temp::*func()
int temp::(*func())
int *temp::func()
0300デフォルトの名無しさん
2007/06/09(土) 17:59:130301デフォルトの名無しさん
2007/06/09(土) 18:05:51コンパイルできるのは一つだけしかないだろ?
0302デフォルトの名無しさん
2007/06/09(土) 18:16:44int* func();
0303デフォルトの名無しさん
2007/06/09(土) 19:58:45テンプレートデフォルト引数があるんだから
std::char_traits<TCHAR>まで律儀に指定しなくてもいいと思う
0304デフォルトの名無しさん
2007/06/10(日) 00:26:59CSV形式のテキストファイルを採用することになったんだけど、
エスケープの方法など、細かい仕様について悩んでる。
この辺の定番仕様ってどんな感じかな。
専用の入力ツールを用意しない場合、やっぱりExcelあたりに合わせるのがベターだろうか。
で、その定番仕様に対応したCまたはC++のライブラリがあればお願いします。
0305デフォルトの名無しさん
2007/06/10(日) 00:30:560306304
2007/06/10(日) 00:59:150307デフォルトの名無しさん
2007/06/10(日) 02:42:21-aを使いたいのですがどのようにすればよいでしょうか
よろしくおねがいします
0308デフォルトの名無しさん
2007/06/10(日) 02:44:070309デフォルトの名無しさん
2007/06/10(日) 02:46:32-演算子をオーバーロード?
0310デフォルトの名無しさん
2007/06/10(日) 02:46:582次元ベクトルの例だと、Vectorのメンバに
Vector operator - () const {return Vector(-x, -y);}
みたいな感じか?
0311307
2007/06/10(日) 02:54:520312デフォルトの名無しさん
2007/06/10(日) 04:01:52glibc-2.5.0-0exp1
glibc-2.5.0-0exp2
の違いってなんですか?
0313デフォルトの名無しさん
2007/06/10(日) 07:16:070314デフォルトの名無しさん
2007/06/10(日) 11:47:50そのパッケージは Ubuntu にしか無いっぽいな、
俺はFedora使いだからよくわからん
Ubuntu系のスレにでも行ったほうがよさげだ
0315デフォルトの名無しさん
2007/06/10(日) 13:20:400316デフォルトの名無しさん
2007/06/10(日) 13:24:060317デフォルトの名無しさん
2007/06/10(日) 13:30:010318デフォルトの名無しさん
2007/06/10(日) 14:10:54変更の種類(作成,更新,削除等)と,変更を与えたプロセスを
出力するプログラムを作成しようと思っています.
変更の検知とその種類に関しては,Win32APIのReadDirectoryChangesWで
取得できるのですが,変更を与えたプロセスの取得方法が
Win32APIや.NETを探しても分かりません.
何か方法があれば教えていただけませんか?
0319318
2007/06/10(日) 14:11:45Windows環境 → WindowsXP環境
です
0320デフォルトの名無しさん
2007/06/10(日) 14:56:21考えたかとか、コーディングの仕方で教えてください。
0321デフォルトの名無しさん
2007/06/10(日) 15:09:240322デフォルトの名無しさん
2007/06/10(日) 15:11:46struct A {
A(){
std::cout << "A" << std::endl;
}
~A() {
std::cout << "~A" << std::endl;
}
template<class T>
static void func() {
std::cout << "func" << std::endl;
}
};
int main() {
A().func<int>();
return 0;
}
以上のプログラムを実行すると
vc, gccでは
A
func
~A
と出力され、bccでは
func
~A
と表示されました。
コンストラクタが呼ばれないのはbccのバグでしょうか?
ちなみにメンバ関数にtemplateを使わなかったりstaticでなければ問題なくコンストラクタは呼ばれるようです。
0323デフォルトの名無しさん
2007/06/10(日) 15:19:03バグだね。 bcc なんて使わなけりゃいい。
0324320
2007/06/10(日) 15:24:40定数、変数のきり方とか・・・・
インスタンスの方法とか、考え方とか・・・
単に、方言が違うだけ?
0326デフォルトの名無しさん
2007/06/10(日) 15:39:27.NETスレは他にあるだろ。なんでここで聞くんだ?
どのくらい違うかの位置関係はこんな感じで、
VB6−−−−−−VB.NET−C#
メモリーの考え方とかインスタンスの考え方はVB6から大きく変更になってる。
0327320
2007/06/10(日) 15:55:44C#スレと勘違いしてた。
0328デフォルトの名無しさん
2007/06/10(日) 18:12:080329デフォルトの名無しさん
2007/06/10(日) 19:01:15戻り値が構造体/クラスなのは普通ですか?
0330デフォルトの名無しさん
2007/06/10(日) 19:08:14コピーが重い場合には避けられるけど、単純にポインタや参照にして
置き換えられないこともあるので、引数に比べれば使われる機会は多いでしょう。
0331デフォルトの名無しさん
2007/06/10(日) 19:21:23↑のサイトのプログラムを落として
makeしてみたらエラーがでて、makeできませんでした。
どのようにしたらmakeできますか?
実行はCygwin上で行ってます。
エラー内容は
$ make
g++ Input_Output_Manager.o Apriori.o Trie.o Apriori_Trie.o main.o -o ../apriori
Input_Output_Manager.o: In function `_ZN20Input_Output_ManagerC2ERSt14basic_ifstreamIcSt11char_traitsIcEEPKc':
Input_Output_Manager.cpp:(.text+0x2f): undefined reference to `_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E'
Input_Output_Manager.cpp:(.text+0x4a): undefined reference to `_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev'
・
・
・
Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x0): undefin
ed reference to `_ZTVN10__cxxabiv120__si_class_type_infoE'
Input_Output_Manager.o:(.gnu.linkonce.r._ZTI20Input_Output_Manager+0x8): undefin
ed reference to `_ZTISt14basic_ofstreamIcSt11char_traitsIcEE'
collect2: ld returned 1 exit status
make: *** [../apriori] Error 1
0332デフォルトの名無しさん
2007/06/10(日) 19:42:17うちとは環境が違うけど,Trie.cppの
bool Edge_point_less(const Edge edge, const itemtype label)
の閉じ括弧の後のセミコロン取り除いて
一度make cleanしたあとmakeしたら成功したよ
0333デフォルトの名無しさん
2007/06/10(日) 19:48:07小さい構造体/クラスならないこともない。
複雑なクラスだとあまりやらない。皆無ではないかもしれんが。
演算子オーバーロードの戻り値は例外で、状況により普通に使うが、
速度が欲しいとき用にそうでない関数を用意した方がいいと思う。
0334デフォルトの名無しさん
2007/06/10(日) 20:20:48成功しました。ありがとうございます。
0335デフォルトの名無しさん
2007/06/10(日) 20:23:04暇人乙
0336デフォルトの名無しさん
2007/06/10(日) 20:52:44暇潰しにもならんかったよ
0337デフォルトの名無しさん
2007/06/10(日) 20:54:110338デフォルトの名無しさん
2007/06/10(日) 21:44:29さっきの
ttp://www.cs.bme.hu/~bodon/en/apriori/
のやつなんですが、
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4208.txt
↑のもっと長いようなデータ読み込ませようとすると
11 [sig] apriori 436 open_stackdumpfile: Dumping stack trace to apriori.exe.stackdump
ってでて、動きません。
動くようにするには、どの部分をどのようにすればいいですか?
0339デフォルトの名無しさん
2007/06/10(日) 23:51:010340デフォルトの名無しさん
2007/06/11(月) 11:47:18void func(B obj_arg) という関数を定義してBを渡すと、
Bのコピーコンストラクタは呼ばれるのですが、Aは通常のコンストラクタが
呼ばれます。(コピーコンストラクタではない、と言う意味です)
これは、なぜこのようになっているのでしょうか?
いまC++を勉強中ですが、この部分が納得できずにいます。
すみませんがどなたか理由を教えてもらえませんでしょうか?
0341デフォルトの名無しさん
2007/06/11(月) 12:26:40再現する最小限のソース貼って
0342デフォルトの名無しさん
2007/06/11(月) 12:29:24A(){}
A(int n){}
};
class B:A {
B(){}
B(int n){}
};
B b(1);
って書いたら、基底クラスAのコンストラクタはどっちが呼ばれる?
とESPしてみる
0343デフォルトの名無しさん
2007/06/11(月) 12:46:26#include <iostream>
using namespace std;
class aaa {
public:
aaa() {printf("%p: [%s]: %s called\n",this,"aaa","constructor");}
aaa(const aaa &a) {printf("%p: [%s]: %s called\n",this,"aaa","copy constructor");}
~aaa() {printf("%p: [%s]: %s called\n", this, "aaa", "destructor");}
};
class bbb : public aaa {
public:
bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};
void func2(bbb x){return;}
int main()
{
bbb x;
func2(x);
return 0;
}
0344デフォルトの名無しさん
2007/06/11(月) 12:47:18改行が多すぎるといわれたので、わけました。
実行結果は以下のようになりました。
~/> g++ samp.cpp
~/> ./a.out
0xbfc07bee: [aaa]: constructor called
0xbfc07bee: [bbb]: constructor called
0xbfc07bef: [aaa]: constructor called
0xbfc07bef: [bbb]: copy constructor called
0xbfc07bef: [bbb]: destructor called
0xbfc07bef: [aaa]: destructor called
0xbfc07bee: [bbb]: destructor called
0xbfc07bee: [aaa]: destructor called
0345デフォルトの名無しさん
2007/06/11(月) 12:52:34class bbb : public aaa {
public:
bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "constructor");}
- bbb(const bbb &b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
+ bbb(const bbb &b): aaa (b) {printf("%p: [%s]: %s called\n", this, "bbb", "copy constructor");}
~bbb() {printf("%p: [%s]: %s called\n", this, "bbb", "destructor");}
};
0346デフォルトの名無しさん
2007/06/11(月) 12:57:06すいません、理由は理解できてないのですが、書かれた通りに
したら、基底クラスのコピーコンストラクタが呼ばれました。
どうやら勉強不足のようです。
失礼しました。
ありがとうございました。
0347デフォルトの名無しさん
2007/06/11(月) 12:59:400348デフォルトの名無しさん
2007/06/11(月) 13:16:15>>347
なるほど、基底クラスの関数は、指定しなければ
引数がないものが呼ばれるということでしょうか?
今になって、342の書き込みの意味が少しわかりました。
0349デフォルトの名無しさん
2007/06/11(月) 13:19:25コピーする必要がなければコピーコンストラクタが呼ばれないのは蓋し当然。
0350デフォルトの名無しさん
2007/06/11(月) 13:25:20でも、コピーコンストラクタが呼ぶ基底クラスの関数は
デフォルトでは、基底クラスのコピーコンストラクタになっている
のだろうと思っていました。
(はっきりと意識していたわけではないですが。)
0351342
2007/06/11(月) 13:48:27>>342にしても、B(int) が自動的に A(int) を呼んでくれるものと
勝手に思い込んでたし(それもかなり長いこと)。
一度分かってしまえばなんてことはない話なんで、まあ頑張れ。
0352デフォルトの名無しさん
2007/06/11(月) 21:21:19string::rfind と string::find_last_of って、
どう違うの? 同じ?
0353デフォルトの名無しさん
2007/06/11(月) 21:23:36begin側から探し始めるかeng側から探し始めるかの違い
0354デフォルトの名無しさん
2007/06/11(月) 21:52:19解説を穴が空くほど読んだら
全然違う関数と分かった。
0355デフォルトの名無しさん
2007/06/12(火) 14:27:03不完全なまま出力されることってあるの?
大丈夫だって保証があればいいんだけど。
0356デフォルトの名無しさん
2007/06/12(火) 18:12:14何らかの方法で埋め込みたいのだけれど、どうしたらいいかしら?
0357デフォルトの名無しさん
2007/06/12(火) 18:15:590358デフォルトの名無しさん
2007/06/12(火) 18:23:26感謝するわよ。
0359デフォルトの名無しさん
2007/06/12(火) 18:34:03Jun 12 2007
って出るのを、
2007年6月12日にするにはどうしたらいいかしら?
0360デフォルトの名無しさん
2007/06/12(火) 20:18:53余りをランダムに割り振るプログラムを書いて見ました
#include<ctime>
#include<cstdlib>
#include<iostream>
using namespace std;
int main()
{
int a;//適当な大きさの変数を読み取らせるための変数
int c1;
int c2;
int c3;
int c4;//aを4で割り、余りをこの4つの数値にランダムに格納する
int b;
c1=c2=c3=c4=0;
scanf("%d",&a);
b=a % 4;
printf("%d,%d\n",a/4,b);
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);
while(b>0)
{
srand(time(NULL));
int dice=rand() % 4;
0361360
2007/06/12(火) 20:20:06switch(dice)
{
case 0:
{
c1++;
c2+=0;
c3+=0;
c4+=0;
}
case 1:
{
c1+=0;
c2++;
c3+=0;
c4+=0;
}
case 2:
{
c1+=0;
c2+=0;
c3++;
c4+=0;
}
case 3:
{
c1+=0;
c2+=0;
c3+=0; c4++;
}
}
0362360
2007/06/12(火) 20:22:09//dice=0;
b--;
}
printf("分配計算後に\n");
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);
c1+=(int)a/4;
c2+=(int)a/4;
c3+=(int)a/4;
c4+=(int)a/4;
printf("%d,%d,%d,%d\n",c1,c2,c3,c4);
scanf("%d",&c1);
return 0;
}
このように作ったのですが、余りが2になる場合に
どうしても余分な計算をしているようです。
srand(time(NULL));
int dice=rand() % 4;
に問題があるのか、case文がおかしいのか分からず迷っております
よろしくお願いします
0363デフォルトの名無しさん
2007/06/12(火) 20:25:30+=0て
0364デフォルトの名無しさん
2007/06/12(火) 20:26:450365デフォルトの名無しさん
2007/06/12(火) 20:29:49一番の原因は >>364 の指摘してるとおりだと思うが
0366デフォルトの名無しさん
2007/06/12(火) 20:37:55実行時に自分で変換すれば。
0367MSX++
2007/06/12(火) 20:42:32*(int *)(((void *)(&c1))+(rand()&3))++;
}
ただし、c1からc4までが連続定義されているものとする。ANSI
環境依存なら。
int cx[4];
while(b--) {
cx[rand()&3]++;
}
かな?
0368デフォルトの名無しさん
2007/06/12(火) 20:42:47関してですが、コマンドプロンプトなどで引数を与えると正常にo.txtが
出力されるのですが、ドラッグアンドドロップだと上手く動作しないです。
ご指南お願いします。
OSはWindowsです。
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc,char **argv)
{
char buf[256];
ifstream ifs(argv[1]);
ofstream ofs("o.txt");
while( ifs.getline(buf,sizeof(buf)))
ofs << buf << endl;
return 0;
}
0369デフォルトの名無しさん
2007/06/12(火) 20:47:31コマンドプロンプトにD&Dしてんの?
どういうオブジェクトをD&Dしてて、
どううまく動作しないのさ
0370デフォルトの名無しさん
2007/06/12(火) 20:49:250371デフォルトの名無しさん
2007/06/12(火) 20:53:09なんか変なトコに出力してるだけだろ。
0373368
2007/06/12(火) 20:55:45test.exe i.txtへの絶対パス
test.exe i.txt
両者ともファイルの書き出しに成功しますが、
エクスプローラー上でi.txtをtest.exeへD&Dするとファイルの書き出しが
行われません。
ちなみに引数を表示するプログラムを追加してみたところ、見た目は
batファイルとD&D両者とも同じ引数を受け取っているように見えます。
0374368
2007/06/12(火) 21:08:30なるほど、作業しているディレクトリ上位のディレクトリを見てみたら、
確かに変な位置に出力されてました。
んでコマンドライン第一引数から実行ファイルまでのパスを切り取って
output.txtに付け加えてあげたら、正常動作しました。
ありがとうございます。
0375デフォルトの名無しさん
2007/06/12(火) 21:13:46カレントディレクトリの位置が違うんだよね。
よく分からん仕様ではあるよな
0376デフォルトの名無しさん
2007/06/12(火) 23:11:47これの右側(コンマ)の意味がわかりません。
0377デフォルトの名無しさん
2007/06/12(火) 23:14:35コンマなんてどこにあるんだ?
0378デフォルトの名無しさん
2007/06/12(火) 23:15:35右側にあるのはシングルクォーテーション「'」とピリオド「.」
0379デフォルトの名無しさん
2007/06/12(火) 23:17:000380デフォルトの名無しさん
2007/06/12(火) 23:18:29じゃあ、' の意味は分かるのか?
0381デフォルトの名無しさん
2007/06/12(火) 23:20:53aとか!=の意味は?
0382デフォルトの名無しさん
2007/06/12(火) 23:25:130383デフォルトの名無しさん
2007/06/12(火) 23:26:08分かります。
0384デフォルトの名無しさん
2007/06/12(火) 23:27:31本当にわかるのか?!=の意味言ってみ
0385デフォルトの名無しさん
2007/06/12(火) 23:29:510386デフォルトの名無しさん
2007/06/12(火) 23:30:19>>376 の質問にちゃんと応えようとしたらこうなるのは致し方ないかw
0387デフォルトの名無しさん
2007/06/12(火) 23:33:21変数aがピリオドと等しくない
0388デフォルトの名無しさん
2007/06/12(火) 23:42:32これはひどい
0389デフォルトの名無しさん
2007/06/12(火) 23:43:550390デフォルトの名無しさん
2007/06/12(火) 23:47:43. が文字リテラルなわけではない。
0391デフォルトの名無しさん
2007/06/13(水) 00:15:42本日 -> という記号が出てきたんですが、どういった意味なんでしょう
よろしくお願いします。
0392デフォルトの名無しさん
2007/06/13(水) 00:20:34よろぴくね
0393デフォルトの名無しさん
2007/06/13(水) 00:23:44http://wisdom.sakura.ne.jp/programming/c/c36.html
ここ見ると幸せな予感。
0394デフォルトの名無しさん
2007/06/13(水) 00:30:40ありがとうございます。早速読んでみます
0395デフォルトの名無しさん
2007/06/13(水) 00:33:33「train.h 6: 宣言の構文エラー」となります。なぜでしょうか^^;
初心者ゆえ何卒ご指導願います。
−−−−−−−−−−−−−−−
#ifndef __TRAIN_H__
#define __TRAIN_H__
#include<stdio.h>
class Train
{
public:
Train();
void SetSpeed(int aspeed);
int GetSpeed();
void Run();
void Stop();
private:
int speed;
};
#endif // __TRAIN_H__
0396デフォルトの名無しさん
2007/06/13(水) 00:40:02Borland詳しく知らないが、C言語でclass使えないぞ。
0397デフォルトの名無しさん
2007/06/13(水) 00:44:140398デフォルトの名無しさん
2007/06/13(水) 01:16:30stable_sortの同じ値をもつ要素が複数存在していたときに、元の順序を崩さない
ってどういうときに重要になるの?
別関数を用意してまで保障する必要性がわからない。
0399デフォルトの名無しさん
2007/06/13(水) 01:20:200400デフォルトの名無しさん
2007/06/13(水) 01:27:34すでに出来上がっている順番待ちの行列を「今から年齢順に受付まーす」って
話になったとき、同じ年齢の人同士では元の順番を保持するのが平和的だと思います。
0401デフォルトの名無しさん
2007/06/13(水) 01:35:500402デフォルトの名無しさん
2007/06/13(水) 01:37:10ヒープソートのライブラリ拾うなり作るなりすればいいんじゃないかな。
0403デフォルトの名無しさん
2007/06/13(水) 01:48:030404デフォルトの名無しさん
2007/06/13(水) 03:14:47それから位置を変更していけば、
安定かつ高速なソートができると思う。
作業領域が必要にはなるけどね。
0405デフォルトの名無しさん
2007/06/13(水) 03:22:420406デフォルトの名無しさん
2007/06/13(水) 09:22:35みたいな例外処理を何て呼ぶんですか?
0407デフォルトの名無しさん
2007/06/13(水) 09:26:41「例外処理」でいいような気がするけど、「C++のthrow/catch」に限定するなら
「C++例外処理」とでも呼べば?
0408デフォルトの名無しさん
2007/06/13(水) 09:28:09これの存在を知らない組み込みな人たちに伝えるので、
センセーショナルでクールな呼び名を教えて欲しいでつ。
0409デフォルトの名無しさん
2007/06/13(水) 09:34:500410デフォルトの名無しさん
2007/06/13(水) 09:36:43組み込みな人達から見ればセンセーショナルでクールでつね。
でも、自分から見れば八百長っぽくてダサダサ。
0411デフォルトの名無しさん
2007/06/13(水) 09:38:21あったら、auto_ptr使わなくてもこんな感じで書けたりしませんか?
char *str = new char[256];
try {
...
if (...) return;
...
} finally {
delete [] str;
}
と、C/C++初めて1年の俺が適当に言ってみる。
0412デフォルトの名無しさん
2007/06/13(水) 09:41:27逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、
finalliyはいらないという判断だったような気がする
0413デフォルトの名無しさん
2007/06/13(水) 09:42:02そんな書き方をいったい何箇所にコピペするつもりだ?
RAII のほうが処理を局所化できていい。
finally しかない Java では実際にそういうコードのコピペが多くなる。
0414デフォルトの名無しさん
2007/06/13(水) 09:45:13↓こっちのが楽だと思わんか?
std::string str(256);
...
if (...) return;
...
0415デフォルトの名無しさん
2007/06/13(水) 09:53:430416デフォルトの名無しさん
2007/06/13(水) 09:54:43割り込み処理って、中断するだけで割り込みが終わったら元の処理に戻るんじゃなかったっけ?
なら意味違うかも。。。
0417デフォルトの名無しさん
2007/06/13(水) 10:48:04例外処理は例外処理。
例外的な動作が起こった場合に行う処理。
0418デフォルトの名無しさん
2007/06/13(水) 10:52:150419デフォルトの名無しさん
2007/06/13(水) 10:56:58C言語の戻り値見て対処するのも”例外処理”って呼ばれるし、
これじゃ、区別付かないじゃん。
0420デフォルトの名無しさん
2007/06/13(水) 11:02:07センセーショナルでクールな・・・
|
\ __ /
_ (m) _ピコーン
|ミ|
/ `´ \
('A`)
ノヽノヽ
くく
「禿式例外処理」なんてどうだ?
組み込みのおっさん相手にはかなりセンセーショナルだろ。
0421デフォルトの名無しさん
2007/06/13(水) 11:03:25当たり前だろ、C++の例外処理は、C++例外処理です。っていえないお。
>「禿式例外処理」なんてどうだ?
オヤジギャグ?
0422デフォルトの名無しさん
2007/06/13(水) 11:06:32他人とコミュニケーションを取るときには使わないでね
0423デフォルトの名無しさん
2007/06/13(水) 11:08:450424デフォルトの名無しさん
2007/06/13(水) 11:09:05http://www.research.att.com/~bs/
エラーコードによる例外処理に対して区別するって意味なら、
例外オブジェクトによる例外処理って感じかなぁ。
0425デフォルトの名無しさん
2007/06/13(水) 11:15:260426デフォルトの名無しさん
2007/06/13(水) 11:27:040427デフォルトの名無しさん
2007/06/13(水) 11:38:040428デフォルトの名無しさん
2007/06/13(水) 12:42:32それは言語的に特殊な構文が用意されてるわけじゃない。
あと、何でもかんでも名前で説明しようと思うからいけない。
そういう違いは名前以外の解説文で説明しなはれ。
0429デフォルトの名無しさん
2007/06/13(水) 13:04:41forで回すのとその関数を使うのとではどちらが早いんですか?
もしくは、計測するのでその関数名教えてください。age
0430デフォルトの名無しさん
2007/06/13(水) 13:14:350431デフォルトの名無しさん
2007/06/13(水) 14:27:310432デフォルトの名無しさん
2007/06/13(水) 15:00:43何で const void* じゃないの?
クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?
0433デフォルトの名無しさん
2007/06/13(水) 15:05:48writeは何をする関数かな?
0434デフォルトの名無しさん
2007/06/13(水) 15:12:290435デフォルトの名無しさん
2007/06/13(水) 16:19:29{
FILE *fp;
int c;
fp=fopen("sample.txt","r");
while((c=fgetc(fp))!=EOF)
putchar(c);
fclose(fp);
return 0;
}
このプログラムの動作でsample.txtが日本語でも大丈夫なようにしたいのですが、
fgetcをどう変えたら良いでしょうか?
0436デフォルトの名無しさん
2007/06/13(水) 16:26:24それで大丈夫なように見えるけど、どうダメだったの?
0437デフォルトの名無しさん
2007/06/13(水) 16:33:31すいません、putcharの下に一つ入れ忘れましたorz
int main()
{
FILE *fp;
int c;
fp=fopen("sample.txt","r");
while((c=fgetc(fp))!=EOF)
{
putchar(c);
putchar('\n');
}
fclose(fp);
return 0;
}
正しくはこうでした。
0438デフォルトの名無しさん
2007/06/13(水) 16:34:431バイト目かどうかの判断は文字コードによる
0439デフォルトの名無しさん
2007/06/13(水) 16:36:49で、1バイト目を出力したことは覚えておいて
2バイト目は無条件に出力
3バイトの文字コードなら以下同様
0440デフォルトの名無しさん
2007/06/13(水) 16:48:56ありがとうございます。
エラー内容と言われたことをよく考えたら
c=fgetc(fp);
putchar(c);
c=fgetc(fp);
putchar(c);
これで日本語一字を出力するんですね。
putcharってこれでやったら日本語を1バイトずつ区切って
ゴミ(?)の文字2つを出力するかと思ってました。
0441デフォルトの名無しさん
2007/06/13(水) 17:32:27構造化例外処理という言葉はあるにはあるのだが、
Windowsの例外処理の名称として有名なので使えない
0442デフォルトの名無しさん
2007/06/13(水) 17:58:33これってなんだけ?
0443デフォルトの名無しさん
2007/06/13(水) 18:16:48そんなこと全く関係ないっしょ。
fwrite の引数の型が const void* だし。
0444デフォルトの名無しさん
2007/06/13(水) 18:19:30fwrite は、サイズと数を指定するだろ。
ストリームはストリームを指定するんだ
0445デフォルトの名無しさん
2007/06/13(水) 18:21:58「構造化例外」つってんのにググりもしないとは。
>>443
それこそまったく関係がない。
「文字列を出力する」 ostream と
「何でも出力する」 fwrite() を比較するとは
頭大丈夫?
0446デフォルトの名無しさん
2007/06/13(水) 18:22:12__try
__except
__finally
0447デフォルトの名無しさん
2007/06/13(水) 18:23:58ostream は別に文字列だけ出力すればいいわけじゃないってのは、
ofstream と ios::binary の存在を考えれば分かると思うが。
0448デフォルトの名無しさん
2007/06/13(水) 18:24:54要するに、あくまでバイトストリームを出力する、というスタンスを示すために、
write では引数を const char* としてるという理解でいいのか?
0449デフォルトの名無しさん
2007/06/13(水) 18:26:380450デフォルトの名無しさん
2007/06/13(水) 18:34:58writeの引数はただのcharではなくテンプレート引数よ
0451デフォルトの名無しさん
2007/06/13(水) 18:36:15そういうことか・・・。
了解。分かった。
0452デフォルトの名無しさん
2007/06/13(水) 18:42:34fwriteではなくfputs/fputwsなのだろう
するとfwriteに対応するのはなんだろうという気になるが
0453デフォルトの名無しさん
2007/06/13(水) 18:52:56wostream::write がある以上、
fwrite と basic_ostream::write も対応しないんだろうな。
用途的には fwrite と ostream::write が対応するんだろうけど。
0454デフォルトの名無しさん
2007/06/13(水) 18:56:35ofstream f("hoge", ios::binary);
int x = 0x12345678;
f.write(reinterpret_cast<const char*>(&x), sizeof x);
という風に使うんだよね?(エラー処理は略)
0455デフォルトの名無しさん
2007/06/13(水) 19:29:120456デフォルトの名無しさん
2007/06/13(水) 19:37:32標準にはない
0457デフォルトの名無しさん
2007/06/13(水) 20:03:36たしかに、そうなんだけどね。ただ、
basic_ofstream<wchat_t> f;
のときは
f.write(reinterpret_cast<const wchar_t*>(&x), sizeof(x) / sizeof(wchat_t));
になる。
const void* を引数にするとわけ分からなくならないか?
0458デフォルトの名無しさん
2007/06/13(水) 20:05:260459デフォルトの名無しさん
2007/06/13(水) 20:11:26それって意図したとおりに動かないんじゃないの
最終的に書き込む際にはバイト列に落とし込まなければならないんだから
char以外のストリームだと確実にエンコード変換がかかるだろ
単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる
write()で書いたものが変換をバイパスできるわけではないし
0460デフォルトの名無しさん
2007/06/13(水) 20:34:48それは x のサイズが wchar_t のサイズで割り切れなければヤバいかと。
まあ、今回は x が int だから多分ほとんどの環境で大丈夫なんだろうけど。
const void* でわけわからなくなる点に関しては、
既にその点で了解してる。
バイナリで wchar_t 以外の値を書き込む場合は、
ostream::stream を使うしかないとういことやね。
char = 1バイトと決まってるし。
0461デフォルトの名無しさん
2007/06/13(水) 21:14:07replacement newを書くというのはだめなのかな。
0462デフォルトの名無しさん
2007/06/13(水) 21:16:49エンコード変換なんてかかるの?
basic_ofstreamはwchar_tだけ特殊化なんてことはしないと思うから、
charでかからないならwchar_tでもかからないと思うよ。
それとも、エンディアン変換の話か?
>>459
うん。割り切れない処理系がないとは言い切れないよね。正確には知らんけど^^
そもそも、stream系のクラスはバイト列を扱うこと自体が
向いていないってことを言いたかっただけだよ。
0463デフォルトの名無しさん
2007/06/13(水) 21:21:27まぁ落ち着いてVCとかの標準C++ライブラリのソース見てみ。
0464デフォルトの名無しさん
2007/06/13(水) 21:38:59いざコマンドプロンプトで実行して整数値を入力だとかするんだけど、
数回入力するとエラーがでるんだけどなんでなんだい?
0465デフォルトの名無しさん
2007/06/13(水) 21:40:41その情報だけじゃ何が原因かはわからんけど
0466デフォルトの名無しさん
2007/06/13(水) 21:42:18長い文を書いて作ると絶対なるんだよね。
行数の限界とかってないよね?
0467デフォルトの名無しさん
2007/06/13(水) 21:47:43char 以外のストリームでバイナリ出入力っていうのがそもそも無理。
0468デフォルトの名無しさん
2007/06/13(水) 22:12:04一応、STLportのソースをざっとみたけどそんな箇所は見あたらなかった。
少なくともSTLportでは、
ofstream::write → streambuf::sputn → streambuf::xsputn → char_traits<_Char>::assign
の順で文字などが出力されているのだけど、
このどこでエンコーディング変換を行うのかだけでもよかったら教えて欲しい。
多分、探し方が足りないだけだと思うので。
>>467
basic_ostream<char>でしか正しくバイナリストリームを扱えないにもかかわらず、
UTF8やUTF16、UCS4などに対しても適切なstreamクラスを提供せねばならんので、
charだけ特別ってわけにはいかなかったんだろうね。
0469デフォルトの名無しさん
2007/06/13(水) 22:14:37#define GameMain \
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)\
{\
MSG lpMsg;\
HWND hWnd;\
WNDCLASS myProg;\
(以下略)
}
って書いてるんだけど、家に帰っていざ作って入力すると全行にエラーが出て動かないんだ・・・
とりあえず、\消してやってみたりしても{に対応する関数がないとかエラーが出て動かない。
学校だと.net2003で、家だとVC2005なんだけど・・・何がどう間違っているんだかさっぱりだ。orz
0470デフォルトの名無しさん
2007/06/13(水) 22:14:47足りんな。
そこまででは、I/Oバッファに書き込んでいるだけだ。
実際にI/Oバッファからファイルにフラッシュする時点で同時に
変換を行っているはずなので、そこを探せ。
0471デフォルトの名無しさん
2007/06/13(水) 22:18:50どういうエラーだよ
\は次の文字と組み合わさるので
この場合は、\直後の改行が無効になるだけ
スペースとかまぎれこんでるとエラーになるぞ
0472デフォルトの名無しさん
2007/06/13(水) 22:19:40}が全角だとか言う落ちはないよな?
0473デフォルトの名無しさん
2007/06/13(水) 22:24:580474デフォルトの名無しさん
2007/06/13(水) 22:35:19半角だった。
今、見比べていて、唯一違った部分のコメント部分消したら動くようになった。
\とかとコメントって絡ませたらまずいってことを知ったよ。お騒がせして申し訳ない。orz
0475デフォルトの名無しさん
2007/06/13(水) 22:50:00コマンドプロンプトで実行したら絶対途中でエラーがでる。
なぜだよおい。
0476デフォルトの名無しさん
2007/06/13(水) 22:51:56まぁexeとかコマンドプロンプトとか言ってるし
Windowsなんだろうなってことぐらいはわかるが
0477デフォルトの名無しさん
2007/06/13(水) 22:53:56で、VS2003のIDEのデフォルト設定がMBCSで、
VS2005のデフォルトが、ようやく、ほんとうにようやくUnicodeに変わったので、
こけてるんじゃないか。
0478デフォルトの名無しさん
2007/06/13(水) 22:54:51でなにを示せばいいんだい。
ちなみに短い文ならエラーでないのに複雑な文になると途中で強制終了される。
0479デフォルトの名無しさん
2007/06/13(水) 23:00:51Cのstdioだとバイナリモードなら変換がかからなかったはず
もしかしたら単に俺の使っているVisual C++固有の挙動なのかもしれないけど
>>468
locale関係で文字の変換の機能が提供されていて、
標準では(locale毎の)charとwchar_tの変換が用意されていることになっている
たしかcodecvtとかいうファセットがそれだったと思う
0480デフォルトの名無しさん
2007/06/13(水) 23:02:34素人が手を出すもんじゃない。
大人しく一から言語の勉強をしなさい。
0481デフォルトの名無しさん
2007/06/13(水) 23:04:08おそらくコマンドプロンプトがバグってると思われるんだけどな
0482デフォルトの名無しさん
2007/06/13(水) 23:10:040483デフォルトの名無しさん
2007/06/13(水) 23:11:04わらた、おもしろすぎ。
0484デフォルトの名無しさん
2007/06/13(水) 23:13:38windows入れなおせばいいと思うよ
0485デフォルトの名無しさん
2007/06/13(水) 23:26:52最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。
たしかに変換してた。
勉強になった。ありがとう。
0486デフォルトの名無しさん
2007/06/13(水) 23:39:48/* */ 型のコメントなら大丈夫だよ
0487デフォルトの名無しさん
2007/06/13(水) 23:46:04へぇ、今まで自分もエラーは一括して-1返してた。
ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?
0488デフォルトの名無しさん
2007/06/13(水) 23:47:300489487
2007/06/13(水) 23:51:37焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><
0490デフォルトの名無しさん
2007/06/14(木) 00:52:31「NULLは 0」ということを前提としたプログラムは書くべきではないですか?
例えば…
void hoge(Foo *bar)
{
// bar が NULL じゃなかったら
if (bar != NULL) // こっちはいいけど
if (bar) // こう書く奴は死ぬべきでしょうか
bar->...;
}
0491デフォルトの名無しさん
2007/06/14(木) 00:54:41それらしい記述見つからないから、flushした方がいいのかなぁ。
ようわからん。
0492デフォルトの名無しさん
2007/06/14(木) 00:56:230493デフォルトの名無しさん
2007/06/14(木) 01:24:47�d。
俺も最新のドラフト見てるけど、
それにすらそれらしい記述が見つからないんだよな。
どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。
まあ、flush しといた方が無難そうだな。
0494デフォルトの名無しさん
2007/06/14(木) 19:27:21↑のスレで>>982のコードを書いたのですが、
このプログラムで非数字(たとえばaとか)が入力されると
プログラムが異常な動作となってしまいます。
これって普通どうやって対処するものなのでしょうか?
0495デフォルトの名無しさん
2007/06/14(木) 19:35:500 なら 1 文字捨てて読み直す
0496デフォルトの名無しさん
2007/06/14(木) 20:18:35for(i=0;i<3;i++){
printf("%d行目の\n",i+1);
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0)
printf("%d",array[i][j]);
j--;
}
こういうことかと思ったらやはり間違ってて、
「一文字捨てる」という概念がいまいち分からないです。
どう直したらarray[i][j]のエラー入力は無かったことにされて
再入力するようにできるんでしょうか?orz
0497デフォルトの名無しさん
2007/06/14(木) 20:35:41while(ret = scanf("%d", &array[i][j]), ret == 0) {
scanf("%*c");
}
if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }
0498デフォルトの名無しさん
2007/06/14(木) 20:43:41%*cって何やってるんだろうとググったらscanfに見たことも無い仕様が
いっぱいで今更ながらにビックリしてしまったです…。
for(j=0;j<3;j++){
printf("%d列目=",j+1);
if(scanf("%d",&array[i][j])==0){
scanf("%*c");
j--;
}
レスを参考にこんな感じで直したらいけそうな感じになりました!
scanfの入力エラーって結構よくあるわりに長いこと対処法が分からなかったのでとても助かりました。
教えて頂き本当にありがとうございます><
0499デフォルトの名無しさん
2007/06/14(木) 20:53:500500デフォルトの名無しさん
2007/06/14(木) 21:12:28getcharって文字入力用じゃないですか?
これで使う方法ってあります?
0501デフォルトの名無しさん
2007/06/14(木) 21:26:250502デフォルトの名無しさん
2007/06/14(木) 21:34:57あぁあなるほど、そっちの方に使うのか!
getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。
それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz
ちょっとそちらでも試してきてみます><
0503デフォルトの名無しさん
2007/06/14(木) 22:46:340504デフォルトの名無しさん
2007/06/14(木) 22:48:530505デフォルトの名無しさん
2007/06/15(金) 03:24:22文字が来ても対処簡単だし
0506デフォルトの名無しさん
2007/06/15(金) 04:02:270507デフォルトの名無しさん
2007/06/15(金) 13:00:46オイオイ、strtolは変換できなかった場所のポインタ返ってくるし
変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ
0508デフォルトの名無しさん
2007/06/15(金) 13:48:270509デフォルトの名無しさん
2007/06/15(金) 15:35:13学習用の簡単なクラス(名前をsampとします)があって、内部でintの値を保持してます。
そこに、friend関数でoperator+()を追加したいです。
最初、
samp operator+(samp & obj, int i)
samp operator+(int i, samp & obj)
としたところ、
obj = 10 + obj;
はOKだったのですが、
obj = 10 + obj1 + 10;
はコンパイルがエラーになりました。
そこで、
samp operator+(samp obj, int i)
samp operator+(int i, samp obj)
としたところ、コンパイルが通り、結果も意図した通りになりました。
これはなぜなのでしょうか?
ちなみに、operator+()の内部は以下のように書きました。
samp operator+(int i, samp obj)
{
samp temp;
temp.x = obj.x + i;
temp.y = obj.y + i;
temp.z = obj.z + i;
return temp;
}
引数の順序が反対の関数も内部は同じです。
今まで参照と実物とはまったく同じ扱いでいいと思っていたのですが、
0510デフォルトの名無しさん
2007/06/15(金) 15:43:21samp operator+(int const & i, samp & obj) ;
0511デフォルトの名無しさん
2007/06/15(金) 15:56:02そのように書き直してみましたが、コンパイル通りませんでした。
以下はコンパイルエラーのメッセージです。
> g++ samp.cpp
samp.cpp: In function 'int main()':
samp.cpp:50: error: no match for 'operator+' in 'operator+(((const int&)((const int*)(&10))), ((samp&)(& obj3))) + obj3'
samp.cpp:37: note: candidates are: samp operator+(const int&, samp&)
samp.cpp:28: note: samp operator+(samp&, const int&)
0512デフォルトの名無しさん
2007/06/15(金) 16:10:41すまん、sampの分を忘れてた。
samp operator+(samp const & obj, int const & i) ;
samp operator+(int const & i, samp const & obj) ;
理由?
関数の戻り値はrvalueだからかな。
0513デフォルトの名無しさん
2007/06/15(金) 16:13:55operator||()って、定義するのが何か変な感じなのですが、
||って、そもそも
式A || 式B
などと書いて、
式Aまたは式Bのどちらかが真なら、真。
という意味ですよね?このとき、||の右側の値と左側の値とを
特にoperator||(式A, 式B)としてひとつの関数内で一緒に処理しなくては
ならないような状況ってないんじゃないか
と思うのですが、
,,,
ここまで書いてきて、なんだか自分でも意味が分からなくなってきました。
ぶっちゃけた話、operator||()が定義できてよかった、という状況って
ありますでしょうか?
よろしくお願いします。
0514デフォルトの名無しさん
2007/06/15(金) 16:18:52実装例では簡単にするため、たんなる文字列だったが。
operator , () より使い道はあるだろ。
こんなものBoostを実装できるような変態なやつらしか使わない。
0515デフォルトの名無しさん
2007/06/15(金) 16:23:16教えてもらった書き方でコンパイルは通りました。
しかし、今度は
obj3 = 10 + obj3 + obj3 + 100;
と書くとコンパイルが通りません。
ずーっと御世話になってますので、ソースを張り付けます。
#include <iostream>
using namespace std;
class samp {
int x;
public:
samp(int i = 0) {x = i;}
friend samp operator+(int const & i, samp const & obj);
friend samp operator+(samp const & obj, int const & i);
};
samp operator+(samp const & obj, int const & i) {
samp temp;
temp.x = obj.x + i;
return temp;
}
samp operator+(int const & i, samp const & obj) {
samp temp;
temp.x = obj.x + i;
return temp;
}
int main() {
samp obj1(10), obj2(7), obj3;
obj3 = 10 + obj3 + obj3 + 100;
return 0;
}
0516デフォルトの名無しさん
2007/06/15(金) 16:31:38そうなんですか。実は今独修C++を読んでいますが、そこに、operator,()は
特殊なのでこの本では扱わない、と書いてあって、不思議な感じがして
いました。たしかに手元のマシンでgrepしてみると出てきますね。
rpm -ql boost-devel | xargs egrep 'operator\,\('
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
/usr/include/boost/assign/list_inserter.hpp: return operator,( r );
...(略)
前このスレで、独修C++をやればそれなりに力が付く、とだれかが
書いていたのでこの本を勉強しているのですが、たしかにいい本だと
思ってます。でも、この本にも書いてないことがあるのですね。
この本を終えたら次はどういう本で勉強すべきでしょうか?
0517デフォルトの名無しさん
2007/06/15(金) 16:34:28C++再考ですね。見てみます。
ありがとうございます。
0518デフォルトの名無しさん
2007/06/15(金) 16:36:000519デフォルトの名無しさん
2007/06/15(金) 16:38:22つい上記のような質問ばかりになってしまいました。
0520デフォルトの名無しさん
2007/06/15(金) 16:39:390521257
2007/06/15(金) 16:40:19が必要
((10 + obj3) +obj3) + 100 の順に評価される
operator 演算子呼ばれた後のの戻り型を並べると
((samp) + samp) + int
~~~~~~~~~~~~~~~~ ここの演算定義がいない
0522デフォルトの名無しさん
2007/06/15(金) 17:03:04なるほど。。。。その通りですね。定義したらコンパイルできました。
あと、constの役割(とくにint const &iのあたりとか)が気になるのですが、
それはもうすこし自分で調べてみます。
ありがとうございました。
0523デフォルトの名無しさん
2007/06/15(金) 17:10:09いやいや。。
それにしても、C++はいろいろ複雑ですね。
0524デフォルトの名無しさん
2007/06/15(金) 17:18:12JavaのEclipseみたいにいきなり変なことを書いてもその場で教えてくれるやつってありますかね?
ソースコードを書くのが楽したいというのが要望です。
ちなみに、TurboC++を試してみましたがどうもしっくりこない。
というか、まだほとんど使っていないので分からないというのが正直なところです。
環境、WinXP 普通の32ビット
(MacやLinuxでもおk)
当方のスペック 大学3年 Javaは普通に使いこなせるという程度
0525デフォルトの名無しさん
2007/06/15(金) 17:19:060526デフォルトの名無しさん
2007/06/15(金) 17:54:370527デフォルトの名無しさん
2007/06/15(金) 18:22:25見た目が一緒なのに評価のやり方が変わってしまうのであまり良くない
0528デフォルトの名無しさん
2007/06/15(金) 19:50:20sscan系でも%iというものがあってな
>>512
intは値渡しでいいだろ
>>513
> operator||()が定義できてよかった、という状況って
Boost.Lambda
0529デフォルトの名無しさん
2007/06/15(金) 19:57:070530デフォルトの名無しさん
2007/06/15(金) 19:57:36VC++のアカデミックは?
アカデミックは超安かった希ガス
ところで、みんなは何使ってんだ?
俺はVStudioでC++とC#を中心にやってる。
0531デフォルトの名無しさん
2007/06/15(金) 20:10:290532デフォルトの名無しさん
2007/06/15(金) 20:40:21商用には使えないが、それはアカデミックも同じだな。
0533デフォルトの名無しさん
2007/06/15(金) 21:12:36Expressも他のEditionと同じように、
商用利用を禁止する条項はない
0534デフォルトの名無しさん
2007/06/15(金) 21:27:41それ以外は十分だな
0535デフォルトの名無しさん
2007/06/15(金) 21:30:29前どっかのスレでそう聞いたんだけど、騙されてたのか。
ググったら商用に使えるって書いてたわ。ありがとう。
0536デフォルトの名無しさん
2007/06/15(金) 23:32:570537デフォルトの名無しさん
2007/06/16(土) 01:23:34void CLog::Write( LPCWSTR strMessage )
{
if( !m_ofs.is_open() ) return;
m_ofs << " Message:" << strMessage;
}
こういうものを作って
CLog log;
log.Write( L"てすと" );
という風に使うと
Message:
としか出力されません。何故でしょうか?
0538デフォルトの名無しさん
2007/06/16(土) 01:26:58フラッシュしたら?
0539デフォルトの名無しさん
2007/06/16(土) 01:27:160540デフォルトの名無しさん
2007/06/16(土) 01:34:54Message:aaと普通に表示されます
日本語だけだめみたいです
>>539
ぐぐりました
こういうのが出てきたので→setlocale(LC_ALL,"Japanese")
付け足しましたが、解決ませんでした・・・
0541デフォルトの名無しさん
2007/06/16(土) 01:40:59imbue()
ただし
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7
0542デフォルトの名無しさん
2007/06/16(土) 01:47:35おお!解決しました!
ありがとうございます!
0543デフォルトの名無しさん
2007/06/16(土) 02:41:070544デフォルトの名無しさん
2007/06/16(土) 05:12:13gcc の拡張だね。 static const char [] な変数と決められてるから、いまのことろ無いね。
0545デフォルトの名無しさん
2007/06/16(土) 05:36:40swprintf(wfunc, sizeof __FUNCTION__, L"%s", __FUNCTION__);
とか自分で変換するしかないのかな。
バッファが必要だから、マクロ化するのも難しいな。
グローバル変数を使うのもアレだし・・・。
0546デフォルトの名無しさん
2007/06/16(土) 09:33:44"japanese"より""を勧める
0547デフォルトの名無しさん
2007/06/16(土) 11:10:16scanf系の関数だと何個変換できたかしか返ってこない
どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい
勉強レベルとか手抜き処理でいいならscanfでいいんだけど、
エラー検出とか入力の自由度とか考えて作ろうと思ったらscanfは使えないと思う
今のPCなんかだとあんまり問題にもならないかもしれないけど処理速度も遅いし
0548デフォルトの名無しさん
2007/06/16(土) 11:16:07普段はcygwin上でgcc使ってるな
簡単なwinアプリもgccで作ってる
今の仕事の開発環境もcygwin+gccクロスコンパイラだったりする
0549デフォルトの名無しさん
2007/06/16(土) 11:21:21それはわかる
1行目の10進以外もに反応しただけ
0550デフォルトの名無しさん
2007/06/16(土) 11:21:59つ[%i]
って、>528に書かれているじゃないか。
ちょっと調べることもしないでえらそうに語るなよ。
0551デフォルトの名無しさん
2007/06/16(土) 11:23:48>どこまで変換できたかとか知る方法がないからstrtolと比べたら使い勝手わるい
0552デフォルトの名無しさん
2007/06/16(土) 11:30:180553デフォルトの名無しさん
2007/06/16(土) 11:38:37とてもみっともないんだよね
0554デフォルトの名無しさん
2007/06/16(土) 11:41:57>>547は「どこまで変換したかscanfでは判定できない」と言っている。
これが、%nを知らない、「無知なのに偉そうなことを言って恥ずかしい」こと。
>>505の基数の自由度に関しては、確かにstrtolの方が便利。
0555デフォルトの名無しさん
2007/06/16(土) 11:51:44講座などを見ると、Javaにできることは全部できると感じましたが、
Javaと同じようにやるのが難しいこととか、
Javaの感覚でやると間違いやすいこととか、ありますか?
それからヘッダというのはプログラム本体と同じように、
関数を定義したり、グローバルに使う変数を保持してもいいのでしょうか?
VCにはJavaのEclipseのように、打った瞬間コンパイルエラーを表示してくれたり、
3,4字打ったら当てはまる構文や変数名やクラス名を出してくれる機能はないのでしょうか?
それがないと、打ち間違いしそうです。
0556デフォルトの名無しさん
2007/06/16(土) 12:03:58C言語のコマンドラインプログラムを勉強した程度です(独習C)のレベルです。
それから、JavaやPHPやASP.NETのWeb系の仕事をしたりしていたんですが、最近、Win32プログラムの昔買った本とかを
読んでみると結構理解できます。自分としてはVCへの憧れが強いので、MFCとかも勉強したいとおもっているのですが
いまさらMFCを勉強しても無駄でしょうか?C++の文法的知識はあります。
0557デフォルトの名無しさん
2007/06/16(土) 12:08:01全部C#でことたりね?
0558デフォルトの名無しさん
2007/06/16(土) 12:10:30ありがとうございます。
全部ユニコードで統一したいので、面倒ですがいちいち変換することにします。
0559デフォルトの名無しさん
2007/06/16(土) 13:44:46.NETのランタイム要らないとか?
MFCならスタティックリンクしたら
特にランタイムインストールしなくても動くし。
個人的には今からMFCやる意味はあんまり無いと思うけど。
0560デフォルトの名無しさん
2007/06/16(土) 14:02:04こういう時のメンバ変数はprivateにするのが基本なんですよね?
Setは1つで済むとしてもGetはメンバ変数と同じだけ用意するんですか?
0561デフォルトの名無しさん
2007/06/16(土) 14:16:15必要に応じて。
0562デフォルトの名無しさん
2007/06/16(土) 14:30:56ではこのやり方はおかしくないんですね。
なんかこれならpublicにした方が手っ取り早いなあとか思ったんですが
それはダメ!って色んなところで解説されてるので・・・
ありがとうございます。
0563デフォルトの名無しさん
2007/06/16(土) 14:41:34クラスじゃなくて構造体を使うとかしたら?
0564デフォルトの名無しさん
2007/06/16(土) 15:00:11駄目な理由を考えてみる
0565デフォルトの名無しさん
2007/06/16(土) 15:17:27このクラスの変数には別のクラスから頻繁にアクセスする必要があって、
こういう場合隠蔽する意味あるのかな〜?と。
かといって全部同じクラスにしちゃうと大きくなりすぎてこれもまた良くないよな・・・
とか思ってなかなか決められないんです。
0566デフォルトの名無しさん
2007/06/16(土) 15:20:29結局隠蔽すべきかそうでないのかの判断が良く分からないと言うか。
0567デフォルトの名無しさん
2007/06/16(土) 15:22:570568デフォルトの名無しさん
2007/06/16(土) 15:28:29まずこの設計が間違ってないかどうかを考えるべきだと思う
0569デフォルトの名無しさん
2007/06/16(土) 15:35:22ちょっと検討しなおします。
ありがとうございました。
0570デフォルトの名無しさん
2007/06/16(土) 16:54:32現在独学でC/C++を勉強中でコンソールプログラムを色々作ってきた後、
GUIを作るのにWin32APIを勉強していて、
山本信雄さんの『はじめてのWindowsプログラミング』を読んだら、
Win32APIをそのまま扱うのは普通しなくてMFCで作る
みたいなことが書いてあったから次はMFCと思っていたのですが、
MFCやる利点がないということはこれからどう勉強を進めたら良いですか?
0571デフォルトの名無しさん
2007/06/16(土) 17:00:38とりあえず.NETかそうでないほうをやるかで決めては
0572そう思えるかどうかが分岐点
2007/06/16(土) 17:06:41もう後がないとか、2005EEでできないとか、どうでもいいじゃん。
0573デフォルトの名無しさん
2007/06/16(土) 17:11:21どうせまだ入り口程度しかやってないんだろ。
だったら早いうちに.Netへ移行しておけ。
0574デフォルトの名無しさん
2007/06/16(土) 17:15:07今のスタンダートとしては.NETなのですか?
ていうかそうでないほうっていうのが何なのかも分からないですorz
>>572
今は趣味ですが大学卒業後プログラマになりたくて勉強しているので
実際に現場で役に立つものを勉強したいのです。
0575デフォルトの名無しさん
2007/06/16(土) 17:17:10やはり.NETが良いんですね><
正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます><
ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか?
それともJavaとかも身に付けておいた方が良いのですか?
0576デフォルトの名無しさん
2007/06/16(土) 17:21:08プログラマを目指すなら、MFCも.Netも要らない。
現場で使っているものをその場で使えるようになればいい。
その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。
その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。
0577デフォルトの名無しさん
2007/06/16(土) 17:21:190578デフォルトの名無しさん
2007/06/16(土) 17:34:410579デフォルトの名無しさん
2007/06/16(土) 17:36:31C++0xとかまだ定まっていないというのに
0580デフォルトの名無しさん
2007/06/16(土) 17:36:53つぶしが利かない。
0581デフォルトの名無しさん
2007/06/16(土) 17:39:32C++できたら他の言語なんて楽勝だろ。
0582デフォルトの名無しさん
2007/06/16(土) 17:41:420583デフォルトの名無しさん
2007/06/16(土) 17:45:080584デフォルトの名無しさん
2007/06/16(土) 17:46:280585デフォルトの名無しさん
2007/06/16(土) 17:47:52C++言語を覚えただけじゃ、GUIもスレッドもないしな。
0586デフォルトの名無しさん
2007/06/16(土) 17:49:110587デフォルトの名無しさん
2007/06/16(土) 17:50:03でも逆の Java → C++ と違って挫折することはまずないだろ。
0588デフォルトの名無しさん
2007/06/16(土) 17:51:100589デフォルトの名無しさん
2007/06/16(土) 17:59:050590デフォルトの名無しさん
2007/06/16(土) 18:00:40設計まで絡んだら知らん。
0591デフォルトの名無しさん
2007/06/16(土) 18:01:50ネット辞典で調べてもでてこん。
0592デフォルトの名無しさん
2007/06/16(土) 18:03:550593デフォルトの名無しさん
2007/06/16(土) 18:12:53そもそも質問主は、MFCか.Netかで迷ってるんだよ?
それでもライブラリだから論点が外れてるといえるか?
0594デフォルトの名無しさん
2007/06/16(土) 18:17:30いまだにfor(A;B;C){...}の判断,処理手順を間違えてるときあるしな。情けないよ
for(A;B;C){...}の判断,処理手順で混乱する香具師、手を挙げろ! .ノ
イテレータを作成してるときなんかあれ???、あれれれ?、なんで になるときあるニダ
0595デフォルトの名無しさん
2007/06/16(土) 19:20:14慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。
0596デフォルトの名無しさん
2007/06/16(土) 20:22:02C#には簡単に移行出来たな。
0597W
2007/06/16(土) 20:25:340598デフォルトの名無しさん
2007/06/16(土) 20:30:12a = b = c = d;
としたら、段階的に処理を書くと、
a = b = (c = d); //まずcにdが代入される
a = (b = c) = d; //次にbにcが代入される
(a = b) = c = d; //最後にaにbが代入される
と言うことでいいのでしょうか?
詳しく教えてほしいです
0599デフォルトの名無しさん
2007/06/16(土) 20:34:46c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される
0600デフォルトの名無しさん
2007/06/16(土) 20:40:25わかりやすい説明をありがとうございます!!
0601デフォルトの名無しさん
2007/06/16(土) 20:43:430602デフォルトの名無しさん
2007/06/16(土) 20:46:19・ループ、条件分岐が書けない
・関数も書けない
修飾言語ではあるが、プログラム言語ではないかな
0603デフォルトの名無しさん
2007/06/16(土) 20:53:070604デフォルトの名無しさん
2007/06/16(土) 21:01:38トンです。
上でプログラミング言語と並んで書かれてたから
なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら
コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。
0605デフォルトの名無しさん
2007/06/16(土) 21:03:45デバッグモードではビルドできるのに、リリースにすると
error LNK2005: *** は既に ***.obj で定義されています。
というエラーが全部のファイルで発生してしまいます。
これは何故なんでしょうか?
環境はVS2005です
0606デフォルトの名無しさん
2007/06/16(土) 21:28:390607デフォルトの名無しさん
2007/06/16(土) 21:32:24一応Languageと名前についてるけど、
これをプログラミング言語と呼ぶのは
ちょっと抵抗ある。
0608デフォルトの名無しさん
2007/06/16(土) 21:49:460609デフォルトの名無しさん
2007/06/16(土) 21:51:480610デフォルトの名無しさん
2007/06/16(土) 21:58:45SQLはプログラミング言語じゃなくて、データベース言語だろ
0611デフォルトの名無しさん
2007/06/16(土) 21:59:390612デフォルトの名無しさん
2007/06/16(土) 23:07:19for(A; B; C) { D } で、
A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・
とか考えるのは効率が悪い。
グルングルンと実行されるみたいな流れを
もっとグラフィカルに頭に思い浮かべるのがコツ。
一旦処理の流れを線でつないで紙に書いて、
それを意識するもんだ。
0613デフォルトの名無しさん
2007/06/16(土) 23:08:18TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。
0614デフォルトの名無しさん
2007/06/16(土) 23:56:370615デフォルトの名無しさん
2007/06/17(日) 00:22:000616デフォルトの名無しさん
2007/06/17(日) 08:02:030617デフォルトの名無しさん
2007/06/17(日) 08:07:530618デフォルトの名無しさん
2007/06/17(日) 09:34:26IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ
0619デフォルトの名無しさん
2007/06/17(日) 12:43:27publicにならずにprotectedなままなのは何故ですか?
親クラスのpublicな変数が、protected継承した子クラスでは
protectedになるのに。
publicよりもprotectedの方が強いと理解しておけばよいのでしょうか
0620デフォルトの名無しさん
2007/06/17(日) 12:46:05そしてプライベートが最強と
0621デフォルトの名無しさん
2007/06/17(日) 12:55:24ありがとうございました。
そう理解しときます。
0622デフォルトの名無しさん
2007/06/17(日) 14:57:34thisポインタを戻り値にしない書き方ってありますか?
0623デフォルトの名無しさん
2007/06/17(日) 14:58:530624デフォルトの名無しさん
2007/06/17(日) 15:01:580625デフォルトの名無しさん
2007/06/17(日) 15:03:170626デフォルトの名無しさん
2007/06/17(日) 15:04:43a = (b + c) + d; //まずbにcを加算
a = ((b + c) + d); //次にb+cの値にdを加算
最後に aに代入という流れで理解してよいのでしょうか?
詳しく教えてください。
0627デフォルトの名無しさん
2007/06/17(日) 15:06:250628デフォルトの名無しさん
2007/06/17(日) 15:06:570629デフォルトの名無しさん
2007/06/17(日) 15:09:12マジサンキュー
課題が終わった
0630デフォルトの名無しさん
2007/06/17(日) 15:10:36その例はその理解で正しい。
演算の順序は、演算子の優先順位と結合規則によって決まってる。
0631デフォルトの名無しさん
2007/06/17(日) 15:13:460632デフォルトの名無しさん
2007/06/17(日) 15:28:39b+cが先だろ
0633デフォルトの名無しさん
2007/06/17(日) 16:40:39しかし、順序が変更されても結果に影響が出ない範囲でなら
最適化で順序が入れ替えられる可能性はあるな。
ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は
そういうことは絶対にないが(コンパイラにバグでもない限り)。
0634デフォルトの名無しさん
2007/06/17(日) 16:56:56コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?
0635デフォルトの名無しさん
2007/06/17(日) 17:08:24誰もそんな事言ってないぞ?
0636デフォルトの名無しさん
2007/06/17(日) 17:14:590637デフォルトの名無しさん
2007/06/17(日) 18:18:51で、b, c, d の呼び出される順番は未定義だっけ?
結合順と、各項の評価順はまた別の話だよな。
0638デフォルトの名無しさん
2007/06/17(日) 18:37:07fgets(buf, sizeof(buf), stdin);
のような常套句がありますが、これは sizeof(char) が1であることが
前提になっていますよね。もし sizeof(char) が2だったら、読み込む文字数が
想定した数の2倍になってしまうと思うのですが。
こういった書き方は問題ないのでしょうか。
0639デフォルトの名無しさん
2007/06/17(日) 18:40:16sizeof(char)は常に1
0640デフォルトの名無しさん
2007/06/17(日) 18:41:57sizeof(char)は絶対に1だから安心しる。
ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか
分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。
0641デフォルトの名無しさん
2007/06/17(日) 18:43:560642デフォルトの名無しさん
2007/06/17(日) 18:44:210643638
2007/06/17(日) 18:47:09charが常に1バイトというのは、規格で決まっているのですか?
0644デフォルトの名無しさん
2007/06/17(日) 18:48:49決まってる。
ただ、「buf の型が char である」ということに依存しているから、
ここを変更したいと思った場合に変更を要するコードである事は確かだな。
0645デフォルトの名無しさん
2007/06/17(日) 18:50:14char が 1 バイトというのは決まってるが、
1 バイトが 8 ビットである保証はない。
1 バイトが 9 ビットの環境もある。
0646デフォルトの名無しさん
2007/06/17(日) 18:51:290647638
2007/06/17(日) 18:51:480648デフォルトの名無しさん
2007/06/17(日) 18:57:420649デフォルトの名無しさん
2007/06/17(日) 19:19:40CHAR_BIT
0650デフォルトの名無しさん
2007/06/17(日) 20:31:59未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。
0651デフォルトの名無しさん
2007/06/17(日) 21:06:510652デフォルトの名無しさん
2007/06/17(日) 21:08:100653デフォルトの名無しさん
2007/06/17(日) 21:10:150654デフォルトの名無しさん
2007/06/17(日) 21:21:250655デフォルトの名無しさん
2007/06/17(日) 21:22:24つまり、以下のようなことがしたいのですが
これは規格でできることが保証されていますか?
void hoge() {
struct hage {
...
};
...
}
0656デフォルトの名無しさん
2007/06/17(日) 21:23:440657デフォルトの名無しさん
2007/06/17(日) 21:26:150658デフォルトの名無しさん
2007/06/17(日) 21:33:03ちゃんと規格で決まってるんですか。
知りませんでした。
どうも、ありがとうございます。
>>657
構造体やクラスの静的関数で代用するのが常套句になってますね。
0659デフォルトの名無しさん
2007/06/17(日) 21:44:490660デフォルトの名無しさん
2007/06/17(日) 22:29:53と思うことがある
0661デフォルトの名無しさん
2007/06/17(日) 23:05:55shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか?
決まってないのなら確実に2byteの型は有りますか?
また確実に4byteの型はありますか?
0662デフォルトの名無しさん
2007/06/17(日) 23:07:51というか規格原理主義者によると、1バイトが何ビットかも決められていないとか
0663デフォルトの名無しさん
2007/06/17(日) 23:17:52#include <stdint.h> で int16_t と int32_t でおk。
0664デフォルトの名無しさん
2007/06/17(日) 23:20:56sizeof (short) == 2と規格で定まっているわけではない
でも規格の最大値・最小値の規定から少なくとも16ビット以上あるということは導ける
同様に(662も書いてあるように)、longが少なくとも32ビットあるということも導ける
2バイトの方が欲しければ、C99なら<stdint.h>のint16_tやint_least16_tが使える
前者がぴったし16ビットの型(対応する型があれば用意されている)
後者は少なくとも16ビットの型(絶対に用意されている)
後者だけ必須なのは1バイトが8ビットでない環境の存在を考えれば納得
C++に今のところ<stdint.h>は、存在しないから
<boost/integer.hpp>や<boost/cstdint.hpp>で代用するくらいしかない
0665デフォルトの名無しさん
2007/06/17(日) 23:32:470666デフォルトの名無しさん
2007/06/17(日) 23:48:09必要以上に移植性を失うのも愚かしいこと。
0667デフォルトの名無しさん
2007/06/17(日) 23:53:100668デフォルトの名無しさん
2007/06/17(日) 23:56:15どんどん使っちゃえYO!
0669デフォルトの名無しさん
2007/06/18(月) 00:04:53__closureも活用してもっと便利に!
0670デフォルトの名無しさん
2007/06/18(月) 00:13:580671デフォルトの名無しさん
2007/06/18(月) 00:19:27VC6だと「そんなヘッダ見つからねーよ。死ねボケ。」って言われてしまった OTL。
0672デフォルトの名無しさん
2007/06/18(月) 00:47:53void hoge()
{
何かの処理
#ifdef DEBUG
printf("Debug %s, nanka);
#endif
何かの処理
#ifdef DEBUG
printf("Debug %s, nanka);
#endif
↑こんな調子で数百行位ある
}
こういう汚い関数を直したいんだが
void DebugPrint(char *str)
{
#ifdef DEBUG
printf("Debug %s, str);
#endif
}
void hoge()
{
何かの処理
DebugPrint(nanka);
何かの処理
DebugPrint(nanka);
}
って感じに直したいんだが、やったら動作変わっちゃう?
#ifdefあんま使ったこと無いから教えてくださいな
0673デフォルトの名無しさん
2007/06/18(月) 00:48:220674デフォルトの名無しさん
2007/06/18(月) 00:49:09すんません
分かり易く解説お願いします
0677デフォルトの名無しさん
2007/06/18(月) 00:57:26#define DEBUG_PRINT(a) printf("Debug %s, (a))
#else
#define DEBUG_PRINT(a)
#endif
void hoge()
{
何かの処理
DEBUG_PRINT(nanka);
何かの処理
DEBUG_PRINT(nanka);
}
こういうのはよくやるな。
ただ、printfは引数の数が可変だから、引数の数にばらつきがあるとまた別の対策が必要になるが。
0678デフォルトの名無しさん
2007/06/18(月) 01:04:08おぉ、なるほど
後、確認なんですけど、自分が書いた>>672だと動作変わっちゃうんですよね?
勉強として実際のソース見て動きを理解しろ
とか言われてるんですが、こんなソースばっかで
見づらくてしょうがないんで
何とかしたくて・・・
コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz
0679デフォルトの名無しさん
2007/06/18(月) 01:05:320680デフォルトの名無しさん
2007/06/18(月) 01:11:32あ、そうなんですか?
ありがとうございます
個人的にはDebugPrintの部分は他から呼びたいので
関数化したいな〜と思ってたんですけど、
#ifdefとかはコンパイル時に読み込まれるとか有ったので
動作変わっちゃうのかと・・・糞初心者ですんません
(もう、たまにソース直せと言われるとおっかなビックリっす・・・)
0681デフォルトの名無しさん
2007/06/18(月) 01:12:16×他から
○他からも
0682デフォルトの名無しさん
2007/06/18(月) 01:13:48後者は関数呼び出しのオーバーヘッドが発生する。
0683デフォルトの名無しさん
2007/06/18(月) 01:20:02あんまりいいコードとはいえないな。
「見づらくてしょうがない」というその感覚は限りなく正しい。
改善する方法をいろいろ考えるべきだな。
0684デフォルトの名無しさん
2007/06/18(月) 01:25:43すいません
そのオーバーヘッドって遅くなるって事ですよね?
どの程度遅くなりますか?
>>683
ありがとうございます
パワハラ上司なんで聞くに聞けなくて
ここでたまに質問してます
見やすくしろって教えてくれたのもこのスレです
0685デフォルトの名無しさん
2007/06/18(月) 01:39:54プログラムカウンタの移動などの処理が行われる。
だから、>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。
一方で>>677の方法だと、不要なときには関数呼び出し自体がなくなるので、
そういう心配がない。この方法が好んで使われる所以。
ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった
りしなければたいしたオーバーヘッドではないので問題にはならない。
でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって
美しくないとは思わないかい?
0686デフォルトの名無しさん
2007/06/18(月) 01:47:04なるほど、詳しい解説ありがとうございます
せっかく用意したDebugPrintなのに
リリース等の時は実際は使わないのに
その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね
確かに綺麗じゃないですね
0687デフォルトの名無しさん
2007/06/18(月) 01:56:30#if DEBUG
#define DebugPrint(...) fprintf(stderr, "\nDebugPrint : File %s - Line %d\n", __FILE__, __LINE__),fprintf(stderr, __VA_ARGS__)
#else
#define DebugPrint(...)
#endif
0688デフォルトの名無しさん
2007/06/18(月) 02:01:41コンパイラの最適化に期待する手もある。
0689デフォルトの名無しさん
2007/06/18(月) 02:02:11#if DEBUG
#define DebugPrint(args) printf args
#else
#define DebugPrint(args)
#endif
/* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */
DebugPrint(("%d\n", 1234));
0690デフォルトの名無しさん
2007/06/18(月) 02:03:190691デフォルトの名無しさん
2007/06/18(月) 02:03:47おぉ、凄いですね
色々ご教授ありがとうございます
>>688
もし良ければその方法も教えて頂けないでしょうか・・・
0692デフォルトの名無しさん
2007/06/18(月) 02:16:332. inline を INLINE マクロに置き換える
INLINE マクロの定義は以下の通り(これは自分で定義する)
#ifdef NDEBUG
#define INLINE inline
#else
#define INLINE
#endif
3. リリース版の場合はヘッダファイルでインクルードする
#ifdef NDEBUG
#include "***.***"
#endif
4. デバッグ版の場合はソースファイルでインクルードする
#ifndef NDEBUG
#include "***.***"
#endif
0693デフォルトの名無しさん
2007/06/18(月) 02:16:49#define DebugPrint printf
#else
#define DebugPrint (int)sizeof
#endif
0694デフォルトの名無しさん
2007/06/18(月) 02:17:09class DebugPrinter {
DebugPrinter(const char *filename, int line) {...}
void out(const char *format, ...) {...}
};
#if DEBUG
#define DebugPrint DebugPrinter(__FILE__, __LINE__).out
#else
#define DebugPrint
#endif
0695デフォルトの名無しさん
2007/06/18(月) 02:21:380696デフォルトの名無しさん
2007/06/18(月) 02:30:28エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。
0697デフォルトの名無しさん
2007/06/18(月) 02:30:35たぶん、ならんよ。リリース時は
DebugPrint("%d, %d", f(x), f(y)); → ("%d, %d", f(x), f(y));
ってなるだけだから。
ただ、これがいやなら、>>693のようにsizeofしちゃうか、
dummyの関数作って
#if DEBUG
#define DebugPrint DebugPrinter(__FILE__, __LINE__).out
#else
inline DebugPrintDummy(const char *filename, ...) {}
#define DebugPrint DebugPrintDummy
#endif
って感じにしちゃうのがいいかもね
0698デフォルトの名無しさん
2007/06/18(月) 02:33:270699デフォルトの名無しさん
2007/06/18(月) 02:34:36多分最適化で消える。
0700デフォルトの名無しさん
2007/06/18(月) 02:39:27関数 f が副作用を持ってたら問題があるな。
0701デフォルトの名無しさん
2007/06/18(月) 02:39:550702デフォルトの名無しさん
2007/06/18(月) 02:41:56感謝、感激雨あられです
ちょっとF1見てる隙にこんなに書き込みが・・・
色々参考にさせてもらいます
0703デフォルトの名無しさん
2007/06/18(月) 02:52:340704デフォルトの名無しさん
2007/06/18(月) 02:55:55役に立たないヘルプが出るよね
0705デフォルトの名無しさん
2007/06/18(月) 02:56:43まあ、必要なら>>699で多分消せるじゃね?
>>701
TRACEは問題点は以下の3つ。
1,Windows限定
2,Boost.Formatなどの他の形式が使えない
3,出力先が変更できない
他にもあるかもしれんがよく分からん
0706デフォルトの名無しさん
2007/06/18(月) 02:57:530707デフォルトの名無しさん
2007/06/18(月) 03:02:02いや、そういう意味じゃなくて、
関数の副作用をどうしても消したいならって意味だお。
残したい場合も当然あるでしょ?
0708デフォルトの名無しさん
2007/06/18(月) 03:06:340709デフォルトの名無しさん
2007/06/18(月) 03:10:09言語はCでもC++でも構いません。
ちなみに開発環境はWin2000+VisualStudio2005です。
DLLで用意された、既存の関数 Func(char* str) を呼び出す必要があります。
この関数は、処理結果を文字列として str に返してくれます。
strに渡される文字列の長さは *不明* です。
DLL、および関数Funcの中身を弄ることは出来ないものとします。
この時、長さの不明なstrを、安全に処理するテクニックがあれば教えてください。
0710デフォルトの名無しさん
2007/06/18(月) 03:18:04これならいけるかな?
#define DebugPrint 1 ? (void)0 : DebugPrintDummy
0711デフォルトの名無しさん
2007/06/18(月) 03:18:48static str[100000000];
ではどうだ?
そうですか、足りませんかすいません。
0712デフォルトの名無しさん
2007/06/18(月) 03:19:32Func を呼び出すことで、str の指すアドレスに
文字列が書き込まれるのであれば、安全に処理する方法は無いです
通常は、どの程度の長さが必要かを返す関数があったり、
渡したバッファの大きさを知らせる引数を付けたりします。
例えばFuncがファイル名を返す関数であるならファイルシステムが許す最大パス長などがあるので、
関数の仕様以外から最大の長さを決めることが出来るかも知れません
0713デフォルトの名無しさん
2007/06/18(月) 03:21:19charが抜けた。すいません。
0714デフォルトの名無しさん
2007/06/18(月) 03:25:49そういやそうだな。
0715709
2007/06/18(月) 03:28:23やっぱ無理そうですね。boostあたりでなんか何とかならないかなーとか淡い期待を抱いてましたが。
>711
とりあえず1万バイトくらいでがんばろうと思います。
>712
バッファサイズ関連のパラメータとか、実際に無いものは仕方ないんで諦めます(笑)
0716デフォルトの名無しさん
2007/06/18(月) 09:01:59え、本当にどうしようもないの?
仕様上から決まる例(>>712 が言ってるMAX_PATH) とか、
NULL渡したら戻り値で必要length返るとかって挙動もないの?
そりゃDLLの設計が糞としか言いようがないが…
0717デフォルトの名無しさん
2007/06/18(月) 09:45:43っていう質問と一緒だね。残念ながら無理だ。
0718デフォルトの名無しさん
2007/06/18(月) 10:59:41常にその大きさの配列渡せば安心、かな
0719デフォルトの名無しさん
2007/06/18(月) 11:10:290720デフォルトの名無しさん
2007/06/18(月) 11:12:45それにしても 32bit 最大値はやりすぎだろうけど。
0721デフォルトの名無しさん
2007/06/18(月) 11:50:560722デフォルトの名無しさん
2007/06/18(月) 13:48:29#include <iostream>
using namespace std;
class base {
public:
int a;
base(int x) {a=x;}
};
class sub1 : virtual public base {
public:
sub1() : base(0) {}
};
class sub2 : virtual public base {
public:
sub2() : base(0) {}
};
class sub3 : public sub1, public sub2 {};
int main() {
sub3 obj;
obj.a = 10;
return 0;
}
これがコンパイル通らないんですが、baseクラスに引数のないコンストラクタを
追加するとコンパイル通るようになります。virtual指定で継承すると、引数のない
コンストラクタを呼ぶというルールなのでしょうか?
0723デフォルトの名無しさん
2007/06/18(月) 14:17:15namespace test_ {
class base {
public:
base() { std::cout << "base::base()" << std::endl; }
base(int x) { std::cout << "base::base(int x)" << std::endl; }
};
class derived1 : virtual public base {
public:
derived1() : base(0) { std::cout << "derived1::derived1()" << std::endl; }
derived1(int x): base(x) { std::cout << "derived1::derived1(int x)" << std::endl; }
};
class derived2 : public derived1 {};
}
int main() {
test_::derived2 a;
return 0;
}
そのようですね
なので混乱を避けるために出来るだけデフォルトコンストラクタも定義しておきたいところです
0724デフォルトの名無しさん
2007/06/18(月) 14:53:20>引数のないコンストラクタを呼
んでるじゃないか、自分で。
>sub3 obj;
0725709
2007/06/18(月) 15:00:50一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
3000とか4000とか飛んでるのを何度か見たことはありますが。
0726デフォルトの名無しさん
2007/06/18(月) 15:21:26>一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。
>3000とか4000とか飛んでるのを何度か見たことはありますが。
そりゃーDLLが糞でFAじゃね?
もしくは文書に反映されてないだけで仕様が4096に変わってるとか…。
仕様であるならstrncpyでもなんでもやって1024以内にすべきだし。
仕事絡みなら、バッファサイズ1024で書いて落ちる&再現性ありの状態を作って、クレームつけるとかかね。
まぁがんがれw
0727デフォルトの名無しさん
2007/06/18(月) 18:05:42#include <string>
#include <boost/function.hpp>
#include <boost/bind.hpp>
class Writer { public: void run(const std::string& str) { std::cout << str << std::endl; } };
class Module1 {
public: typedef boost::function<void(const std::string&)> func_t;
private: func_t func;
public:
Module1(func_t func_) : func(func_) {}
void run() { func("message"); }
};
int main() {
Writer w;
w.run("test");
using boost::bind;
Module1 module(
static_cast<Module1::func_t>( bind(&Writer::run, &w) )
);
module.run();
return 0;
}
Writerクラスのrun()をコールバック関数として、boost::bindを使ってクラスModule1に渡します
Module1はboost::functionを用いてこのコールバック関数を保持します
これを実現したいのですがエラーどころか、コンパイラ(VC2005のcl.exe)が落ちます(汗
どうすればこの動作を実現できるんでしょうか?
0728デフォルトの名無しさん
2007/06/18(月) 18:09:09bind(&Writer::run, &w)→bind(&Writer::run, &w, _1)
引数とる場合はプレースホルダが要るんですね(汗
0729デフォルトの名無しさん
2007/06/18(月) 19:34:13class sub3 : public sub1, public sub2
{
sub3() : base(1) {}
};
仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
0730デフォルトの名無しさん
2007/06/18(月) 20:43:11テンプレートの定数の引数をエレガントに記述する方法が分かりません
template <class Type, int Length> Array
{
…Arrayの実装…
};
class Color : public Array< unsigned char, 3 > // RGBなので3
{
public:
static const int ColorDimension = 3; // これは使えない…
…Arrayの実装…
};
ここに出てくる3をエレガントに記述する方法が分かりません
グローバルで定義したりdefineディレクティブで定義したりは汚いですし、
無名namespaceやconst staticなグローバルの定数はヘッダなので避けたいです。
0731デフォルトの名無しさん
2007/06/18(月) 20:48:520732デフォルトの名無しさん
2007/06/18(月) 20:50:52template <class Type, int Length> Array
{ …Arrayの実装… };
class ColorBase
{
public:
const static int Dimension = 3;
}
class Color : public ColorBase, public Array< unsigned char, ColorBase::Dimension > // RGBなので3
{ …Arrayの実装… };
なんか微妙です…第一、継承する意味があるのかと…う〜ん。
でもnamespaceだと関連性の記述があいまいです。
さらにはこんな方法もあるのですが…
class TColor<int Length> : public ColorBase, public Array< unsigned char, Length >
{ …Arrayの実装… };
typedef TColor<3> Color;
結局これでは定数をtypedefに移しただけで意味がなく、
const TColor::Dimension=3;
typedef TColor<TColor::Dimension> Color;
とまでして構造をめちゃくちゃにするのなら、
そのまま3って書いておいたほうがましな気がします。
何かよい方法があるのでしょうか?
0733デフォルトの名無しさん
2007/06/18(月) 20:53:19では、その元々汚いものを綺麗にする方法を教えてください。
0734デフォルトの名無しさん
2007/06/18(月) 21:00:58Arrayに手を付けていいなら、
template <class Type, int Length_> Array
{
public:
static const int Length = Length_;
//...
};
class Color : public Array<unsigned char, 3> // RGBなので3
{
public:
static const int ColorDimension = Length;
//...
};
0735デフォルトの名無しさん
2007/06/18(月) 21:10:10main(){
int li;int l2; int la[10]; int lb[10][10];
printf("%d\n", &g1);
printf("%d\n", &g2);
printf("%d\n", &l1);
printf("%d\n", &l2);
printf("%d\n", &l1-&l2);
}
↑のようなプログラムの
printf("%d\n", &l1-&l2);の表示結果の意味と
大局変数ga と局所変数la がどのように並んでいるのかを答えろって
課題なのですが、全くもって意味が分かりませんorz
ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。
これはどういう事を意味しているのでしょうか?
ga[10]とla[10]に関してですが、これは[0]〜[9]までの配列が用意されてるって事で良いんですかね?
ヒントの方よろしくお願いしますorz
0736デフォルトの名無しさん
2007/06/18(月) 21:14:010737デフォルトの名無しさん
2007/06/18(月) 21:15:51>これはどういう事を意味しているのでしょうか?
「鼻から悪魔がでてきて私をたぶらかした結果である」
0738デフォルトの名無しさん
2007/06/18(月) 21:16:171、ArrayクラスのLength変数はテンプレートが使用されたときに初期化されるのですか?
int i = Array<int, 3>::Length;
とかやったら(この例では最適化はされるでしょうが)アクセスしたその瞬間に
初期化が行われるのでしょうか?
2、int i = Color::ColorDimension;
とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?
ちなみに、せっかく答えていただいたのに恐縮ですが、
class Color : public Array<unsigned char, 3>
の、3がマジックナンバーとなっているのを何とかしたかったのですが…
やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。
0740デフォルトの名無しさん
2007/06/18(月) 21:20:20ヒント:課題スレではない
しかし答えておいてやろう
「&変数」は、メモリ上における変数のアドレスを意味している。
つまり、画面に表示されるのは各変数のアドレスだ。
&l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。
0741デフォルトの名無しさん
2007/06/18(月) 21:23:23>printf("%d\n", &l1-&l2);の表示結果の意味と
ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
配列を指すポインタであれば、例えば
&la[4] + 3 = &la[7] であり、逆に &la[7] - &la[4] = 3 なわけだが
配列でもなんでもないポインタの引き算に意味なんかない。
メモリ上、int のサイズ分離れた場所に割り当てられていると
答えさせたいんだろうが、課題として激しく相応しくない。
>[0]〜[9]までの配列が用意されてるって事で
おk。
0742デフォルトの名無しさん
2007/06/18(月) 21:27:19define使ったり、
グローバルなenum使ったり
namespaceを使ったり
できないのなら、それは不可能ってことだよ。
別にグローバルにColorDimensionを定義してもいいじゃん。
0743デフォルトの名無しさん
2007/06/18(月) 21:44:32Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな
俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど
0744デフォルトの名無しさん
2007/06/18(月) 21:49:54理論上は意味ないかもしれないけど、
実装を見るというのなら、意味ないこともないような気がしないでもない。
0745デフォルトの名無しさん
2007/06/18(月) 21:51:47頭のおかしい講師に言ってくださいよorz
ほんと変な人で・・・
殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで
授業を進めるんです。
>>740
神様有難う。スレ違いだったんですか・・・。申し訳ないです。
&l1-&l2の件、理解しました。
>>741
神様レス有難う。
ga[10]とla[10]の件理解しました。
>ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。
やっぱり、おかしいですよねえ??
Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、
どうも変な奴なんですよ・・・。
0746730
2007/06/18(月) 21:54:59グローバルの名前空間は絶対に汚せない環境というのがございまして…
#define COLOR_DIMENSION 3
class Color : public Array< unsigned char, COLOR_DIMENSION > // RGBなので3
{
…Arrayの実装…
};
#undef COLOR_DIMENSION
とかwww、もう何がなんだか…
#undef _COLOR_DIMENSION 3
あたりで我慢っすかねぇ
>>743
しかし、ArrayはColorとはあんまり関係なかったりして…
そもそも、public継承なのかprivate継承なのかという問題までありまして…
template <int Dimension = 3> class Color : public Array< unsigned char, Dimension > // RGBなのでデフォルトは3
{
public:
Color() { assert(Dimension==3); }
}
とか…いや、assertで比較している3がまたマジックナンバーに…
なんかもう、素直にあきらめたほうが良いかも
0747594デフォルトの名無しさん
2007/06/18(月) 21:57:33仕様してるのはVisualStudio2005で、プロジェクトはWin32コンソールアプリケーションのMFC付与です。
(CDatabaseクラスとかCRecordsetクラス等も使うこともできます)。
現在、入力された文字列に「�@全角記号、半角記号、全角数字、半角数字を一文字でも含むならエラー」
(つまり�@の処理は漢字や平仮名カタカナや英字は入力出来ます)
という処理と、「�A全角半角のハイフン以外の全角半角記号を一文字でも含むならエラー」
(�Aは、�@の通過可能な条件に、全角半角数字が含まれます)
という処理と、「�B全角半角の数字と全角半角のハイフンはOK」という処理の3つのロジックを組んでます。
半角記号や半角数字はASCIIコードを見ながら「for文で文字列を回してコードの中の記号を表す数字ならエラー」というロジックで
どうにかなってますが、�Aのハイフンの判別ができずに詰まってます。
使ってるソースは、
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=3606
こちらの掲示板に
書き込んでおきます。
長くなりそうなので、続きの質問文はそっちのほうに書きます。
もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。
0748デフォルトの名無しさん
2007/06/18(月) 21:58:46とりあえずグダグダうるせえ。
0749デフォルトの名無しさん
2007/06/18(月) 22:00:47というか、継承では"Color is an Array"が成立するかという問題がある
ので、素直に包含関係にしてしまえ。
0750デフォルトの名無しさん
2007/06/18(月) 22:03:07ShiftJISの仕様についてもうちっと調べるべき、かな。
まあ、一旦wcharに変換して扱う手もあるけどネ。
0751デフォルトの名無しさん
2007/06/18(月) 22:17:19継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?
0752デフォルトの名無しさん
2007/06/18(月) 22:21:47class Foo {int bar; int barz;} foo = {1, 2}
できたらごめん。
0753デフォルトの名無しさん
2007/06/18(月) 22:39:10全メンバをpublicにすればコンパイルできた。
まあ、当然といえば当然か。
0754デフォルトの名無しさん
2007/06/18(月) 22:49:14しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。
内緒にしとくもんでもなかろうて。
0755デフォルトの名無しさん
2007/06/18(月) 23:00:501. 死ぬまでenumハックを使うべきなのか。
2. 死ぬまでexportは使ってはならないのか。
0756デフォルトの名無しさん
2007/06/18(月) 23:07:211. そうです
2. そうです
早死にしないように気をつけて
0757デフォルトの名無しさん
2007/06/18(月) 23:10:242 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね
0758デフォルトの名無しさん
2007/06/18(月) 23:16:47http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
0759デフォルトの名無しさん
2007/06/18(月) 23:44:18初期化は実行時に起こる。
テンプレートが使用された時、というのはコンパイル時の話。
件の場合、定数化されてしまうというのを無視すると
int i = Array<int, 3>::Length;
とすると、Array<int, 3>::Length に相当する定義がコンパイル時に生成される。
で、その生成されたソース中に初期化が存在するから、コンパイルした結果のコードでも
初期化が実行される。タイミングは普通の初期化と一緒で main 到達前。
>2、int i = Color::ColorDimension;
> とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか?
実際には Color::ColorDimension は定数と見なされるので Array と無関係に単なる 3 として評価されると思われ。
0760デフォルトの名無しさん
2007/06/19(火) 06:38:16STARTUPINFO si = {sizeof (STARTUPINFO)};
は何をやっているんでしょうか?
STARTUPINFO si = {0};
や、
STARTUPINFO si;
memset(&si,0,sizeof (STARTUPINFO);
si.cb = sizeof(STARTUPINFO);
などなら分かるのですが。
0761760
2007/06/19(火) 07:24:58構造体の第一メンバをsizeof (STARTUPINFO)で、
残りのメンバを0で初期化している事が分かりました。
値を設定してないと0で初期化されるようですが、
STARTUPINFO si = {};
のような使い方では0で初期化される保証はないのでしょうか?
0762デフォルトの名無しさん
2007/06/19(火) 07:59:43定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。
また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。
>STARTUPINFO si = {};
コンパイル通った?
0763760
2007/06/19(火) 08:56:24コンパイル通らない可能性もあるんですね。それなら使いません。
あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると
「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。
これはmemset()が使われてるということなんでしょうか?
0764デフォルトの名無しさん
2007/06/19(火) 08:56:28全部省略できるのは C++ だけ。
0765デフォルトの名無しさん
2007/06/19(火) 09:59:42そうみたいだね。 memset() は標準ライブラリだから、
リンクできることを前提にしてるんだろう。
0766デフォルトの名無しさん
2007/06/19(火) 10:21:17Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり
開始したりする方法を教えて下さい。
宜しくお願いします。
0768766
2007/06/19(火) 12:48:110769デフォルトの名無しさん
2007/06/19(火) 12:57:26よろしければ必要最低限のプログラムのソースを教えていただけませんか?
よろしくお願いします。
0770デフォルトの名無しさん
2007/06/19(火) 13:01:28>>1
>ただしその場合、質問者は必ず、環境を書きましょう。
0771デフォルトの名無しさん
2007/06/19(火) 13:10:27#include <stdio.h>
int main(){
printf("今現在BMPの画像");
return 0;
}
0772デフォルトの名無しさん
2007/06/19(火) 13:11:07猫でも読んどけ
0773デフォルトの名無しさん
2007/06/19(火) 13:47:09今どこまで理解しててどこら辺がわからないのか書け
0774デフォルトの名無しさん
2007/06/19(火) 14:38:22ありがとうございます。
なるほど、そうなってるんですか。。
しかし、以下のソースをコンパイルしようとしたところ、
sub3クラスでの仮想基底クラスのコンストラクタ呼び出し
(base(33)の呼び出し)はコンパイルを通すために必須でした。
ということは、
ー仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
+仮想基底クラスのコンストラクタは、多重継承になるクラス以降最派生クラスまで、毎クラスで指定することになっている
ということなのでしょうか?
(有効なのは最派生クラスでの呼び出しだけみたいですが、、、)
0775デフォルトの名無しさん
2007/06/19(火) 14:46:23#include <iostream>
using namespace std;
class base {
public:
int a;
base(int x) {
a=x;
cout << "x=" << x << endl;
}
};
class sub1 : virtual public base {
public: sub1() : base(0) {}
};
class sub2 : virtual public base {
public: sub2() : base(0) {}
};
class sub3 : public sub1, public sub2 {
public: sub3() : base(33) {}
};
class sub4 : public sub3 {
public: sub4() : base(1) {}
};
int main()
{
sub4 obj;
obj.a = 10;
return 0;
}
0776デフォルトの名無しさん
2007/06/19(火) 14:49:43win32 apiとc言語標準ライブラリに同じような関数があった場合、Windowsではapiの方を使ったほうがよいのですか?
また、両者の使い分け基準って何かあるのですか?
たとえば、CopyMemoryとmemcpyは同じことをする関数なんですけど..どっち使うのべきか
0777デフォルトの名無しさん
2007/06/19(火) 14:56:41趣味でやるなら好みでいいんじゃない?
0778デフォルトの名無しさん
2007/06/19(火) 16:30:34今は変数を0の入った変数で割って例外を出しています
0779デフォルトの名無しさん
2007/06/19(火) 16:40:490780デフォルトの名無しさん
2007/06/19(火) 16:42:510781デフォルトの名無しさん
2007/06/19(火) 16:48:030782デフォルトの名無しさん
2007/06/19(火) 17:01:37LINK : warning LNK4039: /SECTION オプションで指定されたセクション '.share' は存在しません。
がでるんだけど、何が悪いか教えてください。
どうやったらwarning消せますか。ちゃんと.shareが使える形で。
#include <windows.h>
#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
HANDLE x = NULL;
#pragma data_seg()
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
return TRUE;
}
0783デフォルトの名無しさん
2007/06/19(火) 17:24:35とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1
0784デフォルトの名無しさん
2007/06/19(火) 17:35:43debugだとでなくて、releaseだとでるみたい。
0785783
2007/06/19(火) 18:05:35#include <stdio.h>
#include <windows.h>
#pragma comment(linker, "/SECTION:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()
int main(int ac, char** av)
{
printf("%d\n", x);
x += 1;
MessageBox(NULL, TEXT("Press Enter key to continue"), TEXT("TINKO"), MB_OK);
return 0;
}
0786デフォルトの名無しさん
2007/06/19(火) 18:59:16まじですか。
こちらの環境はVS2005のExpress。
調べたらこんな差がわかった。でも、なんでかは不明。初期化されないからと推測。
コンパイルエラーが出ないソース。
#include <windows.h>
#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
++x;
MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
return TRUE;
}
つづく
0787デフォルトの名無しさん
2007/06/19(火) 19:01:28#include <windows.h>
#pragma comment(linker, "/section:.share,RWS")
#pragma data_seg(".share")
int x = 1;
#pragma data_seg()
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK);
return TRUE;
}
++x; がないだけ。
↑のは ×初期化されない ○一度も利用されることがない
かと思っています。
0788デフォルトの名無しさん
2007/06/19(火) 20:14:08/Faで.asm見ればわかるよ
0789デフォルトの名無しさん
2007/06/19(火) 22:00:05http://sakura03.bbspink.com/test/read.cgi/ascii2d/1178640935/537
537 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/06/19(火) 21:47:45 ID:C++ilogK
>>528
試 し た の か ?
IDがC++
0790デフォルトの名無しさん
2007/06/19(火) 22:08:560791デフォルトの名無しさん
2007/06/19(火) 22:12:52何か化学的な雰囲気を感じるぞ。
0792730
2007/06/19(火) 22:17:42Color::ColorDimension が定数でなかった場合の動作はどうなりますか?
クラスのstaicオブジェクトが初期化される順番は未定義であるように、
初期化順序が未定義なために不定動作となるのか、
派生関係があるので初期化順序をコンパイラが考えてくれるのか、
どちらになるのでしょうか?
0793デフォルトの名無しさん
2007/06/19(火) 23:26:19テンプレート展開はコンパイル時に行われるから、
コンパイル時に判明する定数値しかを与えることができない
0794730
2007/06/19(火) 23:51:30ああなるほど、確かにそうですね。これはテンプレートを使わない場合も同じですよね。
コンパイル時に行われるということを考えると文法も分かりますね。
・OKな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B;
};
const int Base:: A = 1;
const int Derived:: B = A;
・ダメな例
class Base
{
public:
static const int A;
};
class Derived : public Base
{
public:
static const int B = A;
};
const int Base:: A = 1;
たしかにwww。ありがとうございました。
0795デフォルトの名無しさん
2007/06/19(火) 23:55:57最近始めたCの勉強をここ一週間ほどさぼってたんだが
ここ見てちょっと焦ってきた
いかんいかん
0796デフォルトの名無しさん
2007/06/20(水) 01:49:32template<typename T> value_t
{
public:
T get() const { return value; }
void set(T n) { value = n; }
private:
T value;
};
という感じになると思います。value_t<int> とかなら問題ないと思いますが、
(普通は参照を使って渡す)クラスや構造体が型に指定されると、
無駄にコピーコンストラクタが呼ばれたりすると思うので、微妙な感じになってしまいます。
ということで、最初から参照を使って、
template<typename T> value_t
{
public:
const T & get() const { return value; }
void set(const T &n) { value = n; } // ここで operator= が呼ばれるのは問題ないことにする
private:
T value;
};
こう書いても問題ないですか?(というか、こう書くべきですか?)
0797デフォルトの名無しさん
2007/06/20(水) 02:00:31プリミティブ型だと結構遅くなる。
0798デフォルトの名無しさん
2007/06/20(水) 02:37:39boost::call_traitsはどう?
もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか
0800デフォルトの名無しさん
2007/06/20(水) 12:49:37ofs << ((LPCREATESTRUCT)lParam)->lpszClass << ',' << ((LPCREATESTRUCT)lParam)->lpszName << endl;
や、
if (!lstrcmp(((LPCREATESTRUCT)lParam)->lpszClass,"ClassName") && !lstrcmp(((LPCREATESTRUCT)lParam)->lpszName,"WindowName"))
だとプログラムがクラッシュすることがあります。(lpszClass、lpszNameどちらか一方のみでも)
ofs << ((LPCREATESTRUCT)lParam)->hwndParent << endl;
や、
if (((LPCREATESTRUCT)lParam)->hwndParent == FindWindow("ClassName","WindowName"))
のようにhwndParentならクラッシュしません。これは何が原因でしょうか?
0801デフォルトの名無しさん
2007/06/20(水) 12:51:30各変数の値がどうなってるかくらい調べろよ
0802デフォルトの名無しさん
2007/06/20(水) 12:56:12とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。
キャストが安全である根拠はあるか?
キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?
0803800
2007/06/20(水) 13:04:12すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。
>>802
ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。
0804デフォルトの名無しさん
2007/06/20(水) 13:13:25->の元がNULLでないことを保証するassertなんかは必須かと
というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを
処理の前に挿入してログにでも吐けばいいんじゃね?
0805デフォルトの名無しさん
2007/06/20(水) 13:17:03予測なんてしなくていいから、デバッグ実行しろ。
0806800
2007/06/20(水) 13:41:47lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。
>>805
デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。
0807デフォルトの名無しさん
2007/06/20(水) 13:56:34Because the lpszClass member can contain a pointer to a local
(and thus inaccessable) atom, do not obtain the class name
by using this member. Use the GetClassName function instead.
と書かれているようだが。
lpszClassに直接アクセスしてクラス名を取得しようとするな
ってことじゃねえの。
0809デフォルトの名無しさん
2007/06/20(水) 19:21:18public:
Stone();
int color, groupNumber;
Stone *nextStone, * groupHead, *nextGroup;
};
Stone::Stone(){
color = groupNumber = 0;
*nextStone, = *groupHead, = *nextGroup = 0; // (1).ここで整数を代入できない
}
というStoneオブジェクトのインスタンスを21*21の二次元配列として生成して、
Boardオブジェクトを作りたいと考えています。
改行が多いといわれたので続きます
0810809の続き
2007/06/20(水) 19:22:32public:
Board();
Stone board[21][21];
Stone *boardHead;
};
Board::Board{
*boardHead = &board; // (2).Stone(*)型はStone型に変換できない
for(int i; i < 20; i++){
int j;
for(j; j < 19; j++){
board[i][j].color = 3;
board[i][j].(*nextGroup) = board[i][j + 1];
}
board[i][j].color = 3;
board[i][j].(*nextGroup) = boardboard[i + 1][1}; // (2).と同様
}
と表記したところ、(1).(2)のエラーが起きました。
配列の要素一つ一つにポインタを持たせて、グループ化をしたいと思っています。どうすればよいのでしょうか?
0811809、810
2007/06/20(水) 19:24:44(1)では、ヌルポインターを取り合えず代入したいと思っています。
(2)では、配列番号から、要素のポインターを代入したいと思っています。
0812デフォルトの名無しさん
2007/06/20(水) 19:29:47(2)の最初の箇所は、余計な*が付いている
2つ目の(2)は、board[i][j].nextGroup = &boardboard[i + 1][1];にしろ
0813デフォルトの名無しさん
2007/06/20(水) 19:31:34nextStone = groupHead = nextGroup = 0;
とか
0814デフォルトの名無しさん
2007/06/20(水) 19:33:43void foo(const char *const& hoge);
のような宣言の関数があるのですが、引き数定義部分の「const&」の意味が
分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか?
よろしくお願いします
0815デフォルトの名無しさん
2007/06/20(水) 19:42:09宣言自体の読み解き方がわからなければ、ここでも読んでおけ
http://kmaebashi.com/programmer/pointer.html
Cだから参照は出てこないが、ポインタの*と同じような要領で解釈しろ
0816デフォルトの名無しさん
2007/06/20(水) 20:19:12あ、*の扱い方が間違ってたのか。ありがとうございました。
0817デフォルトの名無しさん
2007/06/20(水) 21:05:47質問です。
Linuxだと、iptablesのテーブルの中身を書き換えて
iptablesを再起動すると、設定変更できますよね。
やりたいことは、
※時間ごとに、アクセスできる人を変更したいんです。
これをwindowsでやりたいんです。
1、ファイアーウォールみたいなのから、自分で作る。
これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり
とかのやり方がわからないです。本などご存じないでしょうか。
2、フリーのファイアーウォールソフトを探してきて、
linuxのiptablesと同じように、テーブル書き換え->ソフト再起動
で、できそうでしょうか?
2番目だと簡単そうですか?
0818デフォルトの名無しさん
2007/06/20(水) 21:56:04windowsのばあい、システムに対してユーザーが介入するのは難しい。
アクセスというのは、何に対してのアクセスなんだ?
webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。
共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。
0819デフォルトの名無しさん
2007/06/20(水) 22:05:58ttp://www.wilderssecurity.com/showthread.php?t=112582
でも読んでみたら
0820デフォルトの名無しさん
2007/06/20(水) 22:29:39レスありがとうございます。
ふむふむ。windowsだと難しいですか。
自分作ってないソフトで、しかもそのソフトは
フィルタリング機能とか無いんです。
>>819
ありがとうございます。
iptablesと似てるのないですか。だけ理解できました。
じっくり、読んでみます。
似たようなのがあれば、やりたいことできそうですね。
0821デフォルトの名無しさん
2007/06/20(水) 22:47:33そんなあなたにフィルタドライバか、DLLインジェクション。
0822デフォルトの名無しさん
2007/06/20(水) 23:07:410823デフォルトの名無しさん
2007/06/20(水) 23:36:120824デフォルトの名無しさん
2007/06/20(水) 23:45:03所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて
自分が消滅する時にそれらを一気にぬるぽ値に設定することで
コピーは本体の事を意識しなくて済むというメリットがあります
質問はこれと似たような事が出来る既存のライブラリは無いかということです
正直あまり良い実装じゃない上に根本的に泥臭いんですよね…
0825デフォルトの名無しさん
2007/06/20(水) 23:53:560826デフォルトの名無しさん
2007/06/21(木) 00:31:22(unsigned int) ((context->count[0] >> 3) & 0x3F)
これがなぜ64のあまりになるのですか?
0827デフォルトの名無しさん
2007/06/21(木) 00:33:420x3fは2^6-1だから。
0828デフォルトの名無しさん
2007/06/21(木) 00:47:400829デフォルトの名無しさん
2007/06/21(木) 00:50:0645と120の場合いくらになるんだろ
なんか計算あわない
0830デフォルトの名無しさん
2007/06/21(木) 00:52:38一瞬、LISPあたりのコードかと思った。
0831デフォルトの名無しさん
2007/06/21(木) 00:53:37(context->count[0] >> 3)してるんだろう。
これすると値辺になる気がするのですが
0832デフォルトの名無しさん
2007/06/21(木) 13:05:298で割った後に64で割った余りを求めてる事になるが
0833デフォルトの名無しさん
2007/06/21(木) 13:14:490834デフォルトの名無しさん
2007/06/21(木) 14:30:080835デフォルトの名無しさん
2007/06/21(木) 14:54:1310進数で下6桁残して上の桁を0にしたら
それは100万 (10^6) で割った余りになる。
それと同じように、0x3F で AND とると
(=2進数の下6ビットを残して上のビットをクリア)
64 (2^6) で割った余りになるわさ。
0836ひろみつ
2007/06/21(木) 16:29:58K&Rだかなんだかが、一版最初に書いたのは、何で書いたの?アセンブラ?B?
0837デフォルトの名無しさん
2007/06/21(木) 16:33:430838デフォルトの名無しさん
2007/06/21(木) 16:50:44http://www.amazon.co.jp/C%E4%BE%BF%E5%88%A9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E9%9B%86-%E6%9E%97-%E6%AD%A3%E5%B9%B8/dp/4320027108/ref=sr_1_3/250-4187414-6697033?ie=UTF8&s=books&qid=1182412183&sr=1-3
です。
QuickC対応って書いてあるんですが、VC++6.0でも大丈夫ですか?
0839デフォルトの名無しさん
2007/06/21(木) 17:10:28QuickC……
その本は今すぐ返品しなさいw
ソースが欲しいなら、
http://sourceforge.jp/
http://sourceforge.net/
なんかで探しなさい。
もしくはあなたの好きなアプリやライブラリでオープンソースなのを探しなさい。
0840デフォルトの名無しさん
2007/06/21(木) 17:57:250841デフォルトの名無しさん
2007/06/21(木) 18:27:59という記述を見かけたのですが
このコロンはなんですか?
0842デフォルトの名無しさん
2007/06/21(木) 18:31:58ビットフィールド。
変数のサイズを1bitにする指定。
とはいっても、実際に1bitになっているわけじゃないけど。
1bitしか使わない宣言というべきなのかな。
0843838
2007/06/21(木) 18:33:45どうもありがとうございました。そんなサイトがあるんですね・・
すごいです。独学者なので、助かります。ありがとうございました。
>>840
やっぱだめですよね。。どうもありがとうございました。
0844デフォルトの名無しさん
2007/06/21(木) 18:35:490846デフォルトの名無しさん
2007/06/21(木) 18:55:12今日始めたばかりの独学者なんだろ。事情を察しろ。
0847デフォルトの名無しさん
2007/06/21(木) 19:06:10見つける喜びってのがあるからなあ
0848デフォルトの名無しさん
2007/06/21(木) 19:09:04急に貼られても今日始めたばかりの独学者だから困るだろ。事情を察しろ。
0849デフォルトの名無しさん
2007/06/21(木) 22:20:52いや本気にしないでね
0850デフォルトの名無しさん
2007/06/21(木) 22:22:08おー、weak_ptrで出来るんですね
しかもロック付ですか…凄い
0851デフォルトの名無しさん
2007/06/21(木) 22:45:49ただ、UNIX系を想定しているので、COMを使った方法ではダメなのです。
DCOMを使うのも、避けたいのです。
そこで、WORDのデータ構造を調べてみたのですが、どこにも見当たらないのですが、
UNIX系で操作できるようなライブラリ・もしくはデータ構造がわかるサイトがあれば教えてもらいたいです。
よろしくお願いします、
0852デフォルトの名無しさん
2007/06/21(木) 22:51:510853デフォルトの名無しさん
2007/06/22(金) 01:10:310854デフォルトの名無しさん
2007/06/22(金) 01:17:29がんばって移植すれ。
0855デフォルトの名無しさん
2007/06/22(金) 04:31:38typedef V::iterator I;
typedef vector<V> VV;
VV vv;
for_each(
vv.begin(),
vv.end(),
tr1::bind(
&fill<I,int>,
tr1::bind(static_cast<I (V::*)()>(&V::begin), tr1::placeholders::_1),
tr1::bind(static_cast<I (V::*)()>(&V::end), tr1::placeholders::_1),
0));
g++ 4.1.2です。
2次配列の初期化をalgorithmの練習でやってみようと思っていろいろ試行錯誤してみたのですが、
こんな悲しいコードになってしまいます。
static_castは省略できても良さそうなものですが、これはg++特有の問題でしょうか?
(省略できたとしても普通にループ書いたほうがわかりやすいけど)
0856デフォルトの名無しさん
2007/06/22(金) 08:20:41ふと思ったんだが、公開されてないデータ構造ってどうやってわかるの?
やっぱバイナリエディタで開くと、大体わかっちゃうものなの?
0857デフォルトの名無しさん
2007/06/22(金) 10:06:54バイナリデータの解析の基本は
「ちょっといじって何が変わったか調べる」。
0858デフォルトの名無しさん
2007/06/22(金) 10:10:480859デフォルトの名無しさん
2007/06/22(金) 11:00:27g++ じゃなくても static_cast は外せないだろうね。
bind() の第1引数にはほとんど何でも入るから、コンパイラの知ってる情報だけでは
オーバーロードされた &V::begin のうち適切なものを選べない。
0860デフォルトの名無しさん
2007/06/22(金) 11:55:40WORDは色々バージョンも多いから
そんなめんどくさい事せずに、POIを使った方がいいと思われ。
ただ無駄にJavaのコード呼び出す必要があるけどな。
0861デフォルトの名無しさん
2007/06/22(金) 13:26:29数字が被らないように
どのような順番で数字が来たか表示させるという処理をしたいのですが
このようなプログラムを作るにはどうすればいいのでしょうか
乱数生成時に数字が被りすぎて無限ループに近いじょうたいになってしまいます
0862デフォルトの名無しさん
2007/06/22(金) 13:30:14C++ なら random_shuffle って関数テンプレートがあるから、それ使う。
C なら自前で作るべし。
アルゴリズム悪いと確率が偏るから、
ランダムシャッフルで検索してアルゴリズム調べてちょ。
0863デフォルトの名無しさん
2007/06/22(金) 13:30:39絶対被っちゃいけないなら、それは0-9のランダムではなくて0-9のうち前回の数字を取り除いたランダムじゃないか。
0864861
2007/06/22(金) 13:35:54゙'lliiiiiiiiiiiiilllllllllllllllll|||li,, l||||l
゙゙゙゙゙ 、,,,,,,,ii!!"゙゙゙゙゙ 、,,,,,, 、,,,, ||||
,l||||" ゙゙'llli,, ゙l||! ,,l|||゙ ill,,,,,,,,,,,,,,,,,,,,,,,,,,,iiilllll,,, |||
,,l|||! ゙゙゙゙゙ ,,,l||" ゙゙'゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙ ||
,il|l゙゙ ,,rlll" ,,,,
,,ill"゙ ,,,ril"゙ il||||l
0865デフォルトの名無しさん
2007/06/22(金) 13:40:260866デフォルトの名無しさん
2007/06/22(金) 13:56:170867デフォルトの名無しさん
2007/06/22(金) 13:59:440868デフォルトの名無しさん
2007/06/22(金) 14:02:500869デフォルトの名無しさん
2007/06/22(金) 14:27:56goto文で変数の宣言を飛ばすことはできないのですか?
以下の文をコンパイルできません。
int main() {
goto end;
int a = 100;
end:
return 0;
}
0870デフォルトの名無しさん
2007/06/22(金) 14:38:20何が目的なのかさっぱり解らんが、
「宣言」は「実行」されないんだから
飛ばすも何もない。
0871デフォルトの名無しさん
2007/06/22(金) 15:43:430872デフォルトの名無しさん
2007/06/22(金) 15:46:050873デフォルトの名無しさん
2007/06/22(金) 16:18:11以下のように文字などを無視してその個数分だけ整数値を格納する
というプログラムを作りたいのですが、これって可能でしょうか?
fgetsとstrtolを使うといけそうな気がするのですが
頑張ったものの自分ではどうにもならない状況ですorz
【実行画面】
個数を入力したください>>5
5a11bbb7
88yew99
数値1:5
数値2:11
数値3:7
数値4:88
数値5:99
0874デフォルトの名無しさん
2007/06/22(金) 16:53:19sprintf(str,"%d",num);のようにやってたのですが、
C++でstd::stringとsize_type size()等、STLを使う場合はどのように変換すればいいのでしょうか?
std::string str1 = "ああああ";
std::string str2 = "長さ" + str1.size() + "です";
みたいに使いたいのですが、これはエラーがでます。
0875デフォルトの名無しさん
2007/06/22(金) 17:01:090876874
2007/06/22(金) 17:10:29おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。
0877デフォルトの名無しさん
2007/06/22(金) 17:20:04一文字ずつアスキーコードで比較して行けばいいのでは?
0878デフォルトの名無しさん
2007/06/22(金) 17:25:46宿題なら宿題スレ行きを薦めるが、とりあえずこんな感じで出来る。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int i, c, nc, *nv;
printf("個数を入力してください>>");
if (scanf("%d", &nc) != 1 || nc <= 0) return 1;
nv = malloc(nc * sizeof(int));
for (i = 0; i < nc && (c = getchar()) != EOF; ) {
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &nv[i++]);
}
}
nc = i;
for (i = 0; i < nc; i++)
printf("数値%d:%d\n", i+1, nv[i]);
free(nv);
return 0;
}
0879デフォルトの名無しさん
2007/06/22(金) 17:41:32このスレを最初から読んでいたらscanf処理のことが書いてあって、
代わりにfgets+strtolということが書いてあったので
この処理を弄くって上に書いたような処理がOKになったら
使いやすくなりそうだと思ったのですが
やはりこの仕様にするとそれが早いかもですね…。
>>878
宿題では無くちょっとこのスレを読んでいて気になったので考えていました。
しかし書いてくださりありがとうございます。
いくつか知らない関数があるのでググって見てみます。
ちなみにfgetsとstrtolで12a23から12と23を取りたかったら
strtol(str,&error[i],0);
strtol(&error[i]+1,&error[i+1],0);
こんな感じでずらしていく感じにするのでしょうか?
0880デフォルトの名無しさん
2007/06/22(金) 17:51:22こんなかんじ。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
char buff[0x1000], *p, *q;
unsigned char c;
while (fgets(buff, sizeof buff, stdin)) {
for (p = buff; c = *p++; ) {
if (isdigit(c)) {
printf("%ld\n", strtol(p-1, &q, 10));
p = q;
}
}
}
return 0;
}
0881デフォルトの名無しさん
2007/06/22(金) 18:25:06おぉ、激しく感謝です!
しかもコードが短くて使いやすくて良いですね!
今日なんだかんだで5、6時間ほど考えていたので
教えてくださりかなりガチで嬉しいです><
重ね重ねですが本当にありがとうございます!
0882デフォルトの名無しさん
2007/06/22(金) 19:30:17自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。
そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました
すると、いくつもファイルがあり、ひとつではありませんでした。
教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています
どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか?
分がわかりにくかったらすみません。教えていただけたら幸いです。
0883デフォルトの名無しさん
2007/06/22(金) 19:35:300884デフォルトの名無しさん
2007/06/22(金) 19:43:540885たろう
2007/06/22(金) 21:41:10現在、ある処理をできるだけ小さいプログラムで記述する競争をしてまして、
以下のような記述か可能かどうか教えてください。
●質問1
-----
int a = 0;
int b[] = {a++, a++, a++};
-----
と記述した場合、
b = {0, 1, 2} となるのでしょうか?
それともコンパイラ依存でしょうか?
コンマ演算子は左から行う結合ルールですが、
この場合は演算子じゃないので、
明確なルールはなく、コンパイラ依存でしょうか?
●質問2
func1 があるクラスのポインターを返す関数であるとして、
-----
int a = 0;
func1(a++)->func2(a++);
-----
と記述した場合、
func1(0)->func2(1) となるのでしょうか?
それともコンパイラ依存でしょうか?
func1(0) を実行してからでないと、func2 が決定しないので、
なんとなくその中の引数の評価が後のような気がしますが。
0886じろう
2007/06/22(金) 22:12:25この勝負は俺がもらった
約束通りお婆ちゃんの貞操は頂いて逝くぜ
0887デフォルトの名無しさん
2007/06/22(金) 23:20:55int b[] = {a++, a++, a++};
-----
int b[] = {0, 1, 2};の方がよほど短いわけだが。
-----
int a = 0;
func1(a++)->func2(a++);
-----
同様にfunc1(0)->func2(1);ではいけないのだろうか。
まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。
0888デフォルトの名無しさん
2007/06/22(金) 23:27:23プログラムを短くするノウハウについては
↓のスレが勉強になるかもよ
七行プログラミング part5
ttp://pc11.2ch.net/test/read.cgi/tech/1142467359/
0889デフォルトの名無しさん
2007/06/22(金) 23:38:11sizeof(buff)の形ならよく見るのですが、sizeof buffのように括弧のないものって何でしょうか?
0890デフォルトの名無しさん
2007/06/22(金) 23:41:30別にカッコつけなくても生きていけるんです
0891デフォルトの名無しさん
2007/06/22(金) 23:46:17だから、sizeof(buf)のbufは、関数の「引数」じゃない。
関数じゃないから、括弧は「関数呼び出し演算子」ではない。
sizeofは、演算子の一つ、sizeof演算子です。だから、括弧は不要。
「1+1」を「 (1)+(1) 」とは書かないでしょ?これと一緒。
0892889
2007/06/23(土) 00:11:33なのに()付きのサンプルコードが多いのは何故なんでしょうか?
0893デフォルトの名無しさん
2007/06/23(土) 00:15:46型のサイズを知るには、sizeof(int)のように括弧が必要。
それに倣って、括弧をつける人が多数。
0894889
2007/06/23(土) 00:19:49ありがとうございました。
0895デフォルトの名無しさん
2007/06/23(土) 00:22:27無駄だし勘違いする人も出るからと嫌う人もいるし、
括弧を付けた方が統一性が出ると付ける人もいる。
そして、よく知らないけど括弧付けないといけないと勘違いしてる人もいる。
0896デフォルトの名無しさん
2007/06/23(土) 00:56:100897デフォルトの名無しさん
2007/06/23(土) 00:58:17だから個人的には、sizeofも常に括弧を書いたほうが何となく対象性がある気がする。
0898デフォルトの名無しさん
2007/06/23(土) 01:07:29>まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。
不定じゃなくて未定義でしょ。
鼻から悪魔がでてくるじょ
0899デフォルトの名無しさん
2007/06/23(土) 06:59:030900デフォルトの名無しさん
2007/06/23(土) 07:11:10「この段落の規定によると(略)a[i++]=i;は、未定義の式文である」
0901デフォルトの名無しさん
2007/06/23(土) 13:33:55「未定義」だから、コンパイラにより「不定」になるんだろ。
0902デフォルトの名無しさん
2007/06/23(土) 14:02:30http://www.kouno.jp/home/c_faq/c11.html#33
0903デフォルトの名無しさん
2007/06/23(土) 14:44:39VC++6.0のマクロ機能を使って、エディタ上で選択している文字列を
外部プログラムに渡すマクロを作りたいのですが、このマクロの仕様というか
そもそもこいつが何者なのかがさっぱりわかりません。
マクロのサンプルを見て出てきた文字列を片っ端からぐぐりつつやってみたのですが
外部プログラムの実行だけがどうしてもできません。
どなたかこいつが何者なのか、どうすれば外部プログラムを実行できるのか教えてください。
0904855
2007/06/23(土) 21:13:36遅くなってすみません。キャスト外せませんか…ありがとう。
俺もそのような意味の話をネットのどこかで読んでキャストをつけたんですが、
でもV::beginってオーバーロードされてないですよね?何か勘違いしてるんでしょうか。
0905デフォルトの名無しさん
2007/06/23(土) 21:15:34const の有無で2つある。
0906855
2007/06/23(土) 23:25:01あ、ありがと。気づきませんでした。
&V::beginは関数ポインタの集合で、これをキャストなり代入なりする時に
型に合う関数ポインタが適当に選ばれるような感じでしょうか。
V::iterator (V::*b)() = &V::begin;
V::const_iterator (V::*cb)() const = &V::begin;
V::beginは前者、(const V)::beginは後者を選ぶようなルールがあれば話は早いと思うけど、残念。
0907デフォルトの名無しさん
2007/06/23(土) 23:46:52std::basic_string<TCHAR>::iterator dquoteToESC(std::basic_string<TCHAR>& str) {
typedef std::basic_string<TCHAR>::iterator iter;
iter i = str.begin();
while ( i != str.end() ) {
i = std::find(i, str.end(), _T('\"'));
if ( i == str.end() )
break;
i = str.insert(i, _T('\\')) +2;
}
return str.begin();
}
0908デフォルトの名無しさん
2007/06/24(日) 00:03:120909デフォルトの名無しさん
2007/06/24(日) 05:33:08昔は少なくとも規格上では保証されていませんでした。
で、実際のところ、メモリ上での連続性がない場合のある処理系って実在したんでしょうか?
実在しなければ、メモリ上での連続性を仮定したプログラムは
過去の処理系との互換性があるということで安心できるのですが。
0910デフォルトの名無しさん
2007/06/24(日) 07:15:16普通に作れば連続するから実質的に実装の後追いで連続性の保障が与えられたのであって、
連続していなかった処理系なんてないと思って差し支えないはず
0911デフォルトの名無しさん
2007/06/24(日) 07:17:54�d。
0912デフォルトの名無しさん
2007/06/24(日) 13:53:56ifstream fin("test");
として、
char c;
char s[100];
のとき、
(1) fin >> c; ===> 読み込みは一文字だけ。
(2) fin >> s; ===> 読み込みは一行全部。配列sのサイズを越えても。
という理解でいいでしょうか。
(実験したらそうなりました。)
0913デフォルトの名無しさん
2007/06/24(日) 14:04:560914デフォルトの名無しさん
2007/06/24(日) 14:14:46配列の先頭アドレスしか受け取っていない関数は、配列のサイズについて関知しない。
0915デフォルトの名無しさん
2007/06/24(日) 14:31:41(1)についてはそのとおり
(2)についてはちがう。
空白文字(スペース、タブ、改行等)を読み飛ばし、
次の空白文字が来るまでバッファを超過しようがsに詰め込もうとする。
scanfの%sと同じと思っておけばよい。
0916デフォルトの名無しさん
2007/06/24(日) 14:35:50char じゃなくて string 使った方が安全でいいね。
0917デフォルトの名無しさん
2007/06/24(日) 14:52:060918デフォルトの名無しさん
2007/06/24(日) 14:54:292行目以後を読めば、1行目の「書き込み」はただのtypoだと分かるから。
0919デフォルトの名無しさん
2007/06/24(日) 15:22:55設計時点で C 配列の代用という用途は考えられていて、
規格への明記が漏れていただけだと思われ。
↓でも現状の実装についての考察なんて問題にならなかったみたいだし。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69
0920デフォルトの名無しさん
2007/06/24(日) 15:59:49なるほど。確かに。
ただ、仕様上 one-past-the-end の問題は無い、
と言ってる点がいまいち分からんのですが。
5.7 para 5-7 (配列では one-past-the-end のアドレスが有効であることを保証)
あたりとは矛盾しないのですか?
0921デフォルトの名無しさん
2007/06/24(日) 16:17:52!v.empty() な v について &v[0] + v.size() が有効なことは &v[0] + (v.size() - 1) が
有効なことと 5.7p4 の
「配列じゃないオブジェクトもポインタの加算においては長さ1の配列とみなす」
っていうルールから導き出せるから、特に vector について書くことは無い
ってことじゃないかな?
まぁ、そうだとしてもわかりにくいね。
0922デフォルトの名無しさん
2007/06/24(日) 16:26:540923デフォルトの名無しさん
2007/06/24(日) 17:10:37アルゴリズムはmazeをベースで。
書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
サンプルなどがあればと思って質問させていただきました。
0924デフォルトの名無しさん
2007/06/24(日) 17:28:14http://www5e.biglobe.ne.jp/~me-jin_k/
0925デフォルトの名無しさん
2007/06/24(日) 17:30:070926デフォルトの名無しさん
2007/06/24(日) 17:33:480927デフォルトの名無しさん
2007/06/24(日) 18:24:12半導体用の自動配置配線ツールなら、優秀なものが出来て売ることが出来れば
2本程度売れるだけで遊んで暮らせるでしょう
そして、そんなものが作れるなら…
0928デフォルトの名無しさん
2007/06/24(日) 18:35:00そうなんですか。
イメージしてるのはたとえばこここの配線プログラムみたいなものなんですけど。
ht_tp://www.icot.or.jp/ARCHIVE/Museum/IFS/abst/058-J.html
プログラムを落としてみたんですけど、分からない言語(KL1?)で書かれている(?)ようで、
中身を開けませんでした。
0929デフォルトの名無しさん
2007/06/24(日) 18:36:550930ちんこ
2007/06/24(日) 19:27:46g++です。
三目並べのゲームを作ります。
show_stateがばぐります。どこがおかしいか教えてください
0931デフォルトの名無しさん
2007/06/24(日) 19:34:070932デフォルトの名無しさん
2007/06/24(日) 19:37:08State::State(bool s[3][3]){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
a[i][j] = s[i][j];
}
}
}
ちなみに、マスの状態は、「○」「×」「どちらもおかれていない」の3通りあるから、boolではだめかと。
0933ちんこ
2007/06/24(日) 20:33:11[akira@58x13x98x215 sanmoku]$ ./a.out
1 0 1
0 1 0
1 0 1
さんくるです。>>932では3通りを表現するのに一番適したデータ型はなんですか?
空 1 0 というつもりだったのですが。intだとメモリがでかくなる。
まぁ三目なら全検索してもうんこだけど。
幅検索型の三目並べゲームをclassを使って作るというのが目標です。
計画しているクラスは
Player
CPU
State
Queue(Stateを含みまくるキューのクラス)
Board(mainのクラスです)
とかです。オブジェクト指向的に考えて適切ですか?
うまい人ならどういうクラスを考えるんでしょうか。
0934ちんこ
2007/06/24(日) 20:35:34最終目標は囲碁のソフトですがこれはやばそうなので、まずは五目並べとかでゲーム作りのノウハウを学びます。
0935デフォルトの名無しさん
2007/06/24(日) 20:38:40boost::triboolってのがある
これはtrue, false, indeterminateの3値を表現できる
これをtrue = 白, false = 黒, inderteminate = 何がおかれているかわからない = 色が不定
とでも使えばちょうど良いんじゃないかな
0936デフォルトの名無しさん
2007/06/24(日) 20:39:14intでもメモリには大差なくね?
ってより、intのほうが高速になる可能性を秘めていると思うが・・・
あくまでも可能性だけど
0937ちんこ
2007/06/24(日) 20:53:33不定か、なんか怪しいデータ型ですね。
>>936
intの方が高速になる理由は?
intって4byteですよね、boolがダメならcharかなと思っています
0938デフォルトの名無しさん
2007/06/24(日) 20:55:370939デフォルトの名無しさん
2007/06/24(日) 20:58:59eclipse + Java並のリファクタリングやコード補完、コード整形等の機能を備えたC/C++のIDEはありますか?
0940デフォルトの名無しさん
2007/06/24(日) 21:02:43あります。スレ違いなので詳細は割愛。
>>937
サイズが大きいから遅いとは簡単にはいえません。
まずは真っ当に作り上げることが先決でしょう。
0941デフォルトの名無しさん
2007/06/24(日) 21:07:12そのCPUがもっとも得意とするビット幅を、intに割り当ててるコンパイラが多い可能性がある。
って程度じゃない。intの処理速度≧charの処理速度になる可能性があると。
ほとんどintの処理速度=charの処理速度だと思うが。
実際型のビット幅が決まってないのって弊害にしかならん気がする。
0942デフォルトの名無しさん
2007/06/24(日) 21:12:39とりあえず組んでみたら?
出来てから速度とか使用メモリーを測定してそれから決めればいい
0943デフォルトの名無しさん
2007/06/24(日) 21:16:21高速になる理由は>940-941のとおり。
charとintでの速度比較した場合、intが早くなることはあっても遅くなることはあまり無いと思う。
1億×1億のフィールドとかを考えるならそりゃcharのほうがメモリは節約できるだろう。
ただ、intだとメモリが危ういがcharならきっと大丈夫程度の問題ならば、ベタに
配列として持つより設計を見直すほうがいいと思われる。
0944デフォルトの名無しさん
2007/06/24(日) 21:20:22やっぱり最終的に実測しないと決まらない。
0945ちんこ
2007/06/24(日) 21:21:39じゃあintにしてみます。
9路盤で5目並べする時用にプログラムをあらかじめ
N // 盤の大きさ
M // これだけ並べば勝ちだぜぃな数
として組んだ方がいいですかね?
しかしどうやればいいかはさっぱりなんですがね。
何しろゆとりなもんでwww
0946デフォルトの名無しさん
2007/06/24(日) 21:25:46とりあえず数字決め打ちでもintでもcharでもいいから作りあげろ
話はそれからだ
0947ちんこ
2007/06/24(日) 21:27:000948ちんこ
2007/06/24(日) 21:29:530949デフォルトの名無しさん
2007/06/24(日) 21:33:390950デフォルトの名無しさん
2007/06/24(日) 21:43:370951デフォルトの名無しさん
2007/06/24(日) 21:45:30メモリ気にするんなら2bit一組で使えばいい、速度気にするんならintでok
ちなみにC++ではbool型のサイズは環境によって違う
普通はintかcharになってるようなのでメモリの節約にはならない
でもな、実際にこんなの気にしなきゃいけない環境って最近は少ないから
まず動くもの作ってそれから考えるほうがいいよ
0952デフォルトの名無しさん
2007/06/24(日) 21:58:34ちなみに、見た目簡単そうな5目並べだが、
まともな思考エンジン作れたら結構な額で売れる
昔仕事でUIだけ作って5目並べの思考エンジン買ってきた奴組み込んだけど、
中身かなり複雑で読む気もしなかったわw
0953ちんこ
2007/06/24(日) 21:58:57でもないとオブジェクト指向っぽくないよなぁ・・
0954デフォルトの名無しさん
2007/06/24(日) 22:00:34この辺参考にして頑張ってくれ
http://www.h6.dion.ne.jp/~game296o/GameMain.html
http://www002.upp.so-net.ne.jp/ys_oota/mdp/
後はひたすら試行錯誤
考えて分からなければとりあえず書いたら最低限何が駄目か何が必要かとかわかってくるんじゃね?
0955デフォルトの名無しさん
2007/06/24(日) 22:05:01お前には無理だ
せいぜい無駄な時間を浪費するがよい
0956デフォルトの名無しさん
2007/06/24(日) 22:42:47KL1
http://www.klic.org/software/klic/index.ja.html
0957デフォルトの名無しさん
2007/06/24(日) 23:48:42STLのvectorに格納した要素を、配列に即変換する方法はないのでしょうか?
Iteratorを使って地道にループさせて配列に設定する方法しか思いつきませんでした。
0958デフォルトの名無しさん
2007/06/24(日) 23:49:270959デフォルトの名無しさん
2007/06/25(月) 00:06:23どうもです。
0960デフォルトの名無しさん
2007/06/25(月) 00:09:280961こんにちは
2007/06/25(月) 03:30:000962デフォルトの名無しさん
2007/06/25(月) 04:45:34今の所は &v[0] か &v.front() だな。
0963デフォルトの名無しさん
2007/06/25(月) 04:47:50Player インタフェースクラスを作って、
PlayerCom と PlayerHuman クラスを派生して・・・
0964デフォルトの名無しさん
2007/06/25(月) 06:03:540965デフォルトの名無しさん
2007/06/25(月) 06:05:410966ちんこ
2007/06/25(月) 07:14:38PlayerからPlayerComとPlayerHumanを継承
PlayerComから複数はなんで?
もしや思考パターンを変える為?
0967デフォルトの名無しさん
2007/06/25(月) 07:32:330968ちんこ
2007/06/25(月) 07:36:38クラスを使ったものとしてはC++かつGUI以外でははじめて
もう何がなんだか分からんとです。
まずUML勉強した方がいいかな?
生半可に利用するのはおれのタチじゃない、オブジェクト指向なら徹底的にオブジェクト指向にしたい。
0969デフォルトの名無しさん
2007/06/25(月) 07:53:010970デフォルトの名無しさん
2007/06/25(月) 07:53:12設計をやり直してオブジェクト指向にするのが(勉強には)いいと思う。
0971デフォルトの名無しさん
2007/06/25(月) 07:59:30愚かな一貫性は小人物に憑いたお化けである
0972デフォルトの名無しさん
2007/06/25(月) 08:03:07それぞれのプログラムの性質を比較してみるのも勉強になるよね。
0973デフォルトの名無しさん
2007/06/25(月) 08:13:380974デフォルトの名無しさん
2007/06/25(月) 09:55:200975デフォルトの名無しさん
2007/06/25(月) 12:02:09【初心者歓迎】C/C++室 Ver.39【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1182740506/
0976デフォルトの名無しさん
2007/06/25(月) 12:03:140977デフォルトの名無しさん
2007/06/25(月) 22:36:14これは何故でしょうか?
case 1:
int i=1;//int i; i=1;ならOK
break;
case 2:
break;
0978デフォルトの名無しさん
2007/06/25(月) 22:38:42case 2 に飛んだ場合は i が使えるのに
初期化の位置を飛ばしてしまう。
だから、そういうことはできないようになってる。
case 1: {
int i = 1;
} break;
みたいにブロックで囲むといいよ。
0979977
2007/06/25(月) 22:54:360980デフォルトの名無しさん
2007/06/26(火) 21:11:34ありがとうございました。
0981デフォルトの名無しさん
2007/06/26(火) 22:34:30横レスだが
なるほど
時間があれば言語仕様もきっちり読んでおけってことか
0982デフォルトの名無しさん
2007/06/26(火) 22:55:000983デフォルトの名無しさん
2007/06/26(火) 23:21:51プログラム開発の面接を受けた感触として
ひょっとしたら読まなきゃかもなーとは思ってたが
0984デフォルトの名無しさん
2007/06/26(火) 23:24:17経験があってこそ初めて理解できるような部分もあるし
0985デフォルトの名無しさん
2007/06/26(火) 23:52:05boost::functionとかそれだけで40バイトぐらいあるから何とか参照渡ししたいんですが
右辺値を参照で渡せるような何か良い手段ありますか?
0986デフォルトの名無しさん
2007/06/26(火) 23:52:500987デフォルトの名無しさん
2007/06/26(火) 23:59:47どうもです
0988デフォルトの名無しさん
2007/06/27(水) 00:09:12charとかshortは演算途中で内部的にintに無理矢理キャストされることがある
理由は>>941の通り
だからキャストのオーバヘッドまで考慮するとintの方が速い場合が多い
0989デフォルトの名無しさん
2007/06/27(水) 00:23:42「ことがある」じゃなくて、その動作が標準として規定されている。
0990デフォルトの名無しさん
2007/06/27(水) 00:27:02windows.hのBOOL型は実際はlongのtypedefで TRUE = 1, FALSE = 0
Cだと_Bool型で
_Bool型は符号なし型として扱われる
_Bool型には signed, unsigned はつけられない
_Bool型は 0 と 1 を格納できれば十分なサイズ
_Boolに変換するときその値が0なら0、それ以外は 1
_Bool型はどの標準整数型ランクよりも小さい
ビットフィールドに無修飾版の _Bool をおける
引用(ttp://seclan.dll.jp/c99d/c99d05.htm)
0991デフォルトの名無しさん
2007/06/27(水) 00:29:54そうか、すまん俺の勉強不足だった
0992デフォルトの名無しさん
2007/06/27(水) 01:19:35File WinDef.h:
typedef int BOOL;
0993デフォルトの名無しさん
2007/06/27(水) 03:34:17格上げされない場合もあるわけだが。
0994デフォルトの名無しさん
2007/06/27(水) 03:52:270995デフォルトの名無しさん
2007/06/27(水) 04:18:220996デフォルトの名無しさん
2007/06/27(水) 05:44:06あ、いや、キャストもか。
0997デフォルトの名無しさん
2007/06/27(水) 07:02:02http://pc11.2ch.net/test/read.cgi/tech/1182740506/
念のためにもう一度貼っとくよ〜
二重に立てるような無駄を防ぐためだよ〜
0998デフォルトの名無しさん
2007/06/27(水) 12:26:27MSのやつはバージョンによって違うらしいぞ
0999デフォルトの名無しさん
2007/06/27(水) 14:45:411000デフォルトの名無しさん
2007/06/27(水) 14:46:23. * .
* + 。 。 +
__ _ /ヾ_/ヽ 旦
f ミv'´{ごづヾ彡 , '´⌒'v'ヾ '´ ̄`ヽ * 。
゙i´!(((从 从リ ! ifi」liリ゙l i!卯、 (((/从从 i
!○(l ^ヮ゚ノ!| i * |i、゚ヮ^ |!)○゙ 。 从゚- ゚ ||○ *
ノノ ヽ)本iO ヾ Oi本(~/ヽ OL介_(ノ . +
ガタン||| ((´ く/_i_iヾ )) ||| /i_i_ヾ> ) )) ||| + /_|_|ヾ> |||ガタン +
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ロ リ 最 強 ! 華 麗 な 1 0 0 0 に 超 感 動 !
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。