【初心者歓迎】C/C++室 Ver.32【環境依存OK】
2ダ
ここって、テンプレないんだね。
テンプレが1に収まるほどコンパクトなだけでは
これからの時代はSTLですか?
7 :
デフォルトの名無しさん :2006/10/15(日) 16:35:22
すいません。質問させてください。 VC++2005でプログラムの勉強をしています。 結果の表示にはコンソールを使っています。 例えば、円の面積を計算するプログラムをつくったのですが、 半径を入れて計算すると、一瞬ぱっとでてすぐ消えます。 これは普通の文章を表示するプログラムを作った時にもあったので ネットで検索したら、対応策があり、すぐに解決しましたが、 計算結果の場合はうまくいきません。 半径を入力したあとにenterキーを押すからでしょうか? うまい方法があったら教えてください。
コピーコンストラクタや代入演算子を実装したクラスを関数の戻り値の型にした場合、戻り値最適化ってされなくなってしまいますか?
>7 コマンドラインから起動
12 :
デフォルトの名無しさん :2006/10/15(日) 16:56:28
>>9-11 レスありがとうございます。
コード上で書きたいと思っています。
>>9 うまくいきました。
>>8 規格では「してもよい」とされているだけなので、
戻り値最適化の条件はコンパイラによる。
コピーコンストラクタや代入演算子の有無で最適化の
可能性に影響するとは思わないので、大丈夫なんじゃないかね。
動的配列のメモリ量についてですが、 newを使用した場合とvectorを使用した場合で メモリ量は異なるのでしょうか? 型のサイズを調べると sizeof(float)は4、sizeof(vector<float>)は12なのに、 cygwin上のtopコマンドで調べると総メモリ量は同じになります。 「配列のサイズ=型のサイズ×配列数」とは限らないのでしょうか? 初歩的な質問ですみません。よろしくお願いします。
std::vectorは配列のように使えるクラスだが、配列ではない。 従ってそのサイズはvectorがどう実装されているかによる。 それからvectorのインスタンスが占めるメモリの大きさと vectorが持つメモリブロックの大きさには何の関係もない。
16 :
14 :2006/10/15(日) 19:44:41
>>15 なるほど。勉強不足ですみません。
単純に動的配列で使うならnewでもvectorでもメモリ量は同じなんですね。
vectorはメモリを食うからvalarrayを使う方が良いと
どこかで書いてあったのは何だったんだろう…。
もうちょっと勉強します。ありがとうございました。
久しぶりに聞いたな valarray 。 C++ 標準ライブラリの汚点だとしか覚えていない。
>>13 戻り値最適化が働くとコピーコンストラクタの呼び出し回数が減ると思うんです。
なのでそんなかで副作用のあることしたりしたら最適化されなくなっちゃうのかなと思ったんですよ。
>>18 戻り値最適化される可能性があるので、呼び出し回数で結果が変わってしまうような
副作用をコピーコンストラクタに持たせるべきではない。
これは C++ プログラマの責任なので、コンパイラがそこまで見て最適化の
有効無効を決めるべきではない。もし、あるコンパイラがそこまで面倒を見てくれて、
それに依存したコーディングをしてしまえば、移植性を失うことになる。
コピーコンストラクタや代入演算子をデフォルトのままにして方が最適化が促進されやすいとかありそうだよね。
21 :
デフォルトの名無しさん :2006/10/15(日) 23:11:27
はじめまして下記のコードで表示結果として 10 10 と得たいと思います/*????〜????*/を どのように書けばよいですか? #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int i=10; char *a="test"; /*???? a=; ????*/ printf("%d\n",i); printf("%s\n",a); return 0; }
23 :
デフォルトの名無しさん :2006/10/15(日) 23:17:21
>>22 すこし言葉たりませんでした。
iを型変換してaに代入したいと思います。
sprintf
char a[]="test"; ならともかく、 char *a="test"; で sprintf() を使うのはどうかと。
std::string s = boost::lexical_cast<std::string>(i); a = s.c_str();
27 :
デフォルトの名無しさん :2006/10/15(日) 23:36:26
Visual C++2003を使用しているのですがうまくいかないです。
29 :
デフォルトの名無しさん :2006/10/15(日) 23:53:53
>>28 さま
21で相談していたものです。すみません。
sprintfを使って少し考えてみます。
スマートポインタを使わないと C++プログラムとして認められませんか?
何を以って認めるかによる
まぁ一般論としては 肝心なのは使い方がスマートかどうかだ
33 :
デフォルトの名無しさん :2006/10/16(月) 12:43:39
すいません、質問です。 「C言語を始めよう」でコンパイラの位置を指定し (C:\borland\bcc55\Bin\bcc32.exe)、実行すると Error: 外部シンボル 'wWinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32W.OBJ が参照) と出てきて実行できません。なぜでしょうか?
borlandスレ行け
初心者ですが以下のように書き、 例えばaと入力すると文字コードaを表す値97が表示されますが xの型をint型にすると9445729という値が出ます。 Cでは文字定数はint型なのに何がダメなんでしょうか。 char x; printf("英字入力>>>");scanf("%c",&x); printf("%d\n",x);
scanf の中の人が %c というフォーマット指定から、渡された引数の大きさを char と期待して書き込んでいるから。 char x; int v; ..... scanf("%c", &x); v=x; printf("%d\n",v); とすればよかろう
37 :
35 :2006/10/16(月) 16:02:37
>>36 そのやり方でint型に変換することで出来るのは分かったのですが、
イマイチ「charと期待して書き込んでいる」という所が分からないので
図々しいようですが詳しい説明をお願いできますか><
上の表示部分を下のように%cにすると正常にaと表示されるということは
不正な操作で誤った値が代入されているということではないということなのでしょうか。
int x;
printf("英字入力>>>");scanf("%c",&x);
printf("%c\n",x);
>>35 scanfの%cはcharへのポインタが渡されることを前提にしている。
また自動変数を初期化しないと、内容は不定(ごみが入っている)。
だから、int x = 0;のように初期化してやるか、
printf("%d\n", x & 0xff);のように要らないところをマスクしてやれば、
おそらくうまくいく。(ただし規格に照らし合わせて問題ないかはわからない)
>>38 そのコードだとリトルエンディアンしか通用しないんじゃ?
40 :
35 :2006/10/16(月) 16:55:46
自分の知識を総動員して
>>36 ,
>>38 さんの話を考えたところ、
char型(1バイト)とint型(とりあえず4バイト)を考えると同じ97でも
charだと01100001で、
intだと00000000 0000000 0000000 01100001で表している。
%cで指定したscanfはchar型の8ビット、
この01100001の部分に値を入れるけど他24ビットには何もしない。
そして%cでも同様に8ビットだけ見て、そこで表されている文字を表示する。
その結果正しい文字が表示される。
しかし%dは全32ビットに注目するので残り24ビットを0にしておかないと不定値が出る。
という結論になったのですがこの理解でOKでしょうか?><
ポインタを理解しているかどうかが鍵だな。
まだ、そこまでいっていないのなら さしあたり
>>40 の認識(間違っているが)でも良いかもしれん。
42 :
35 :2006/10/16(月) 17:18:36
>>41 ポインタは柴田さんの「ポインタの極意」とかも読んだので
基本レベルならとりあえずちゃんと分かってる感じです。
間違っている認識だと気持ち悪いので、
理解できないかもしれませんが分からなかったら自分で勉強してみるので
そのポインタの話伺えますか。
scanf を自分で実装することを考えてみるべし。 1) "%c" というヒントをもらった。 2) ポインターで書き込み対象の変数の先頭アドレスだけは分かる。 3) "%c" の指示に従い、2)のポインターから char サイズ分しか値を書き込まない。 こういう動作をする関数に対して無理矢理 int のポインターを渡した。 上記 3) で書き換えた部分はいったい何処に相当するのか? その結果どうなるのか? ○ char ⇔ int の実装上の大きさ、メモリ配置は環境によりばらばら。
44 :
35 :2006/10/16(月) 17:37:24
>>43 あぁなるほど!!
すごい分かりやすい説明ありがとうございます!
やっと理解できました!><
初めこのバグが出たとき完全に意味が分からなくてどうしようかと思いましたorz
文系で周りに聞ける人がいないので本当に助かりました。
本当にありがとうございました><
45 :
デフォルトの名無しさん :2006/10/16(月) 21:39:56
char readbuf[512]; FILE* fd; if( NULL == ( fd = fopen(path, openmode) ) ) { //エラー処理 } else { while( NULL != fgets(readbuf, 512, fd ) { //処理 ココに入らない } fclose(fd); } 上記のコードの実行ファイルを動かすと、fgetsでNULLが返ります。 ファイルは500行2MByte程度のテキストファイルです。 必ず1回目でNULLが返ってきてしまい、メイン処理が何故か動きません。 fclose直後にfeof, ferrorをかけると、エラーはセットされていないものの、何故かEOFが ONになっています。 fopen自体は成功するのですが、fgets出来ない 理由は何が考えられますか?
なんでfgetsがNULLを返した直後にferrorしないの?
>>45 fcloseでfdが無効になった後のfeof, ferrorはダメだろ。
間違えました。feof, ferrorしてるのはfclose前です。 NULLを返した直後に実行したら、エラーなし、EOFだったんです。 ちなみに、512を20とかにすると動きました。 これはメモリ枯渇ですかね???
馬鹿は氏ね
openmode が変なんじゃないの? windows とかだと勝手が違うから。
だから回答する側が初心者なのはやめろって。
この板見ててふと思ったのですが、 Cでは文字定数はint型なのに文字配列にする時にはchar moji[] とかってなるのは何ででしょうか? 要素はint型なのにchar?
54 :
デフォルトの名無しさん :2006/10/17(火) 12:04:14
スレ違いかもしれませんが質問させてください。 VC++6を使っているのですが、使用している関数がスレッドセーフ関数かどうかは どうやって調べるのでしょうか?
>>54 何の関数か知らないが、標準関数ならMSDNに書いてあると思う。
56 :
54 :2006/10/17(火) 12:14:46
>>55 標準関数と、WIN32APIです。
MSDNってお金払わないと買えないやつですよね?
VC++6だけでも高いのにMSDNが必要なのか・・・。
誰か持っている奴に見せてもらうしかないかなぁ〜
webで公開されてる
VC++6.0にも入ってるハズだ
59 :
54 :2006/10/17(火) 12:41:50
皆様。迅速なレス、ありがとうございます。
>>57 オッケー。探してみます。
>>58 オッケー。探して見ます。
ついでに言うと、標準関数だけで、一覧になっているものってないでしょうか?
いいからMSDN見ろ
61 :
54 :2006/10/17(火) 13:53:09
>>60 という事で、Web版のMSDNを見てみました。
有名なlocaltimeに関して調べて見たところ、スレッドに関する記述はありませんでした。
ただ、互換性のところを見ると、「ライブラリをLIBCMT.LIBにすれば、マルチスレッド対応になるよ」
的な事が書いてあるので、基本的に全ての関数はLIBCMT.LIBを使う限り、
スレッドセーフと考えてよいのでしょうか?
インライン関数を使うと何故処理速度が向上するのかイメージがわかないのですが、 どういう仕組みでしょうか?しかも短い処理分じゃないと使えないそうで・・・ 調べたところ、インライン関数を呼び出した所にコードを埋め込むとのことですが、 よくわからなかったのでわかりやすいように説明してくれませんか?
あまりにも初心者的な質問で申し訳ありませんが Java等で「System.io」と記述するところはC++では「System::io」となるのですか? また、「System:io」のように「:」を一つだけ記述したり3つ以上記述するようなことはあるのでしょうか
64 :
デフォルトの名無しさん :2006/10/17(火) 14:09:50
JavaのパッケージとC++のネームスペースとの区別はついているのか? :一つは文法上ある。 :::のように三つは文法上ない。
>>62 例えばこんなコードがあったとする。
static inline int add(int a, int b) {return a + b;}
int main()
{
printf("%d\n", add(3, 5));
return 0;
}
インライン展開できないと関数add()は明示的に呼び出されるが、
インライン展開できると関数add()がインライン展開された状態で最適化が行われる。
つまり、インライン展開してさらに最適化を行うと先ほどのコードはこのようにコンパイルされる。
int main()
{
printf("%d\n", 8);
return 0;
}
66 :
デフォルトの名無しさん :2006/10/17(火) 14:49:37
すまん。。 Cの表記でわからなくなったので教えてくれ。 struct s A[10]; memset( A, 0, sizeof(struct s)*10 ); 初期化してるだけなんだが、 A &A &A[0] この3つは、同じアドレスを示してる。 本来正しい表記は、どれ?
あれ?&Aもだっけ? 俺はAか&A[0]を使うが。
>>66 この場合、要求されているのは(void *)だからどれでもいいよ。
69 :
66 :2006/10/17(火) 15:18:44
A ・・配列の先頭アドレス &A[0] ・・配列の先頭要素[0]のアドレス と認識してたんだけど、 &A の意味はどうなるの?
70 :
62 :2006/10/17(火) 15:21:53
>>65 なんとなく分かりました。
ありがとうございます。
けれど、それならもう一つ不思議なことがあります。
インライン関数は短い処理で使われるそうですが、何故同じように長い処理でも使わないのでしょうか?
同じように最適化したら早くなるのではないのですか?
>>70 実行ファイルサイズがでかくなるという弊害がある。
でかくなればキャッシュに入らなくなる可能性があり、逆に遅くなる事もある。
72 :
53 :2006/10/17(火) 16:16:24
誰か
>>53 を頼みますorz
文字定数がint型で定義されているのはEOFを
11111111 11111111 11111111 11111111
というようにcharでは表現できない値を表現するため。
文字配列ではEOFを途中で表現する必要がないからメモリの節約のために
charになってるとかそんな感じで良いのでしょうか?
ていうかそもそも文字定数がint型なのは上の理由で良いのですか?
73 :
62 :2006/10/17(火) 16:21:08
>>71 なるほど!
よく分かりました。ありがとうございました。
>>70 短いとは限らないよ。
例えば最近のgccやiccは、一回しか呼ばないようなstaticな関数は仮令長くてもインライン展開してしまうし。
Ex.
static void func()
{
// this function is too long.
}
int main()
{
func();
return 0;
}
但し、・サイズがでかくなる・最適化処理が複雑になりコンパイル時間がかかる、
などの理由からローカル変数を使うだけでインライン展開しないコンパイラもある。
>>69 式の中では原則、Aと&A[0]は同じ。Aの先頭要素へのポインタでありstruct s*型。
&Aと書くと、それはAへのポインタ。struct (*s)[10]型。
T型の変数(正確には左辺値)にアドレス演算子を適用するとT*型になる。
これを配列型の変数そのものに当てはめると、そうなる。
CListBoxクラスにAddStringでデータを設定して ボタンを押した瞬間にリストを初期化するためDeleteString しているんですが、前のデータがなぜか残った状態で 表示されます。なぜでしょうか? 分かる方いましたら解決法を教えてください 開発環境 VS2005 WinXP SP2 MFC
static char* str=new char; これって大丈夫なんでしょうか? 普通に動いているんですが、どうもよく分かりません。 ウインドウプロシージャで使ってるんですが、 参照されるたびに動的に確保されているんでしょうか?
79 :
77 :2006/10/17(火) 18:29:09
すみません、自己解決しました。
>>78 strの初期化は最初の1回だけ行われる。
リスト構造を勉強しているのですが、リスト構造にデータを追加する 関数に戻り値に成功、失敗を返すようにするにはどうしたらいいでしょうか? (なんらかの原因で領域が確保できなかった時のエラー対策をしたい。) 検索すると、下記のような先頭ポインタを返す関数しか見つかりません。 struct list { int test; struct list *next;/* 次のデータへのポインタ */ }; //--リストにデータを登録 struct list *add_list(int test, struct list *head) { //--リストに追加処理(略) return head; }
エラーが起きたらNULLが返る、っていうのがよくある仕様です。
83 :
72 :2006/10/17(火) 21:21:12
>>75 遅レスになってしまったけどありがとうございます。
ホントにそんな感じの理由なんだ><
勉強初めに本の内容よく考えないで丸覚えしてたから
こういう基本的なこと分かってなくてダメだなぁ・・・orz
>>83 概ねという言葉に気をつけるべし。
stdio.h をエディタで開いて EOF を検索してごらん。
>>84 #define EOF (-1)
と出たけど、どういう意味で概ねなのでしょう?(´・ω・`)
しばし考えても言葉の裏が読み取れなかったので詳しくお願いできますか?orz
EOFは、*いかなる整数型においても全ビットを立てた値* を示すということに相当する
87 :
84 :2006/10/17(火) 22:33:13
>>85 75ではないので75の真意は分からんが、
EOFは-1という値に置き換えられるのであって
11111111 11111111 11111111 11111111
じゃないよと言いたかった。
邪魔したな。
ただしEOFは-1と規格で決められているわけではない。 ただ、いかなるchar型の値とも区別できなければならないと定められていたと思う。
>>86-87 あぁ、そういうことでしたか。
2の補数なので例えばchar型なら11111111ですものね。
自分も
>>72 で「int型が4バイトの場合では」と厳密に書いた方が良かったですね。
どうもありがとうございました><
てか、いつからEOFは'文字定数'になったのだろうか、、、、 、、、、、成り行きを見守るか、、、
91 :
88 :2006/10/17(火) 22:46:35
ああ、ごめん嘘書いた。 X 3010:2003見たらこう書いてある。(7.19.1) EOFは、型がintで、負の値を持つ整数定数式に展開する。(以下略)
>>90 ?
EOFは文字定数と区別するためにっていう話でそ?
>>92 最初の質問とそれに対する説明が引っかかっている。
94 :
86 :2006/10/17(火) 22:55:41
>>91 負の値をもつ(以下略) が 必ずしも全ビット立つとは限らない か…
# 負の値が2の補数ではなく1の補数もありえるわけだし
95 :
デフォルトの名無しさん :2006/10/17(火) 23:02:14
hpp と cpp の違いって何?
>>95 hppは.h+.cppって感じ
定義と実装を両方書くから
非常に初心的な問題で聞きにくいのですが gets(); を使って入力を読ませようと思っても入力する前に次の入力に飛んでしまうのはなぜでしょうか? struct entry_word input[160]; int c=0; FL: printf("文字列1を入力してください-->"); gets(input->en); printf("文字列2を入力してください -->"); gets(input->part); こんな感じなのですが。getsを使うなというのはおいといてください。fgetsもしてみたんですが改行を取るのがめんどくさくてついでに上記の方も直らなかったので。
>>95 cpp は c の C++ 版。
hpp は h の C++ 版。
101 :
デフォルトの名無しさん :2006/10/18(水) 04:05:51
くだらない質問です。delete は型が分からなくても正しく使えますか? class C1 { long m1; }; class C2 { long m1, m2, m3, m4, m5, m6, m7, m8; }; void main() { C2* c2 = new C2; void* p = c2; delete p; }
メモリは解放されるけど、デストラクタが呼ばれない つーか、そのくらい自分でテストしろよ。 それでも疑問なら「この動作は規格どおりですか」って質問しなよ。
103 :
101 :2006/10/18(水) 04:58:16
>>102 ありがとうございます。解決しました。
テストはしましたが、正しく削除されているか確認する術が見つかりませんでした。
C2のデストラクタで文字列出力してみるとか、いろいろあるだろうに。
105 :
デフォルトの名無しさん :2006/10/18(水) 09:56:30
クラス内のメソッドをスレッドとして生成したいのですが、どうやったらいいでしょうか? class hoge{ ~hoge(){ std::cout << "終了" << endl; } void homu(){ ... } }; こんな感じでhomu()をスレッドとして作って、 スレッドが終わるとデストラクタを呼び出して抜けるって感じにしたいのですが。
xxx thread_proc(xxx) { hoge foo; foo.homu(); return xxx; }
107 :
デフォルトの名無しさん :2006/10/18(水) 10:04:28
>>106 ああなるほど・・・直接呼び出すことにしか頭回ってませんでした・・・
ありがとうございます
108 :
101 :2006/10/18(水) 10:26:58
>>104 デストラクタが呼ばれる呼ばれない自体当時は頭に無かったので。
「当時」ってのは別に「ずっと以前」という意味ではないから、 ほんの6時間前の自分の状態について使っても間違いではないんだが、 慣習的にはなんか違和感があるなw
黄色い豚はただの豚だ
誤爆しました
ブヒブヒ
113 :
デフォルトの名無しさん :2006/10/18(水) 15:28:53
板違いならすいません。 (unix板で反応無かったもので) aixでC++によるアプリ開発をしていて、DBXでデバッグをしています。 しかしstring型の変数の中身を参照したいのですが上手く出来ません。 printしてもキャストしても期待する値が表示されないんですがどなたか方法をご存知ありませんか?
114 :
デフォルトの名無しさん :2006/10/18(水) 15:51:45
ポインタのポインタについて簡単にノートにまとめようと思っているのですが、 下記の考え方であってますでしょうか? char *p="abcde"; char **pp=&p; ppには変数p自体のアドレスが格納されている。 *ppは格納されているpのアドレスの内容表示であり、 その内容は文字列"abcde"の先頭のアドレスである。 よって文字列を表示させるためには printf("%s",*pp); /* printf("%s",p)と同じ意味 */ とする。
>>101 ちなみに、boost::shred_ptr<void>は、
元の型のオブジェクトを削除するので、問題なく使える。
>>114 正解。
C言語をCygwinで練習し始めたのですが、 自分で書いたCのファイルをWindows上で動くexeファイルに変換は無料で出来るのでしょうか? 調べてみてVisual C++で出来るのかな?とおもったのですが、 これはC++じゃない普通のCのプログラムもコンパイルできるのでしょうか?
cygwinでも出来る。MinGWでも出来る。 もちろんVC++でも出来る。
電気があれば何でもできる!
謝れ!バベジに謝れ!
120 :
116 :2006/10/18(水) 17:56:44
ありがとうございます。 CygwinでもVC++でもコンパイルしてプログラムを走らせることは出来るようになったのですが、 単純にexeファイルをダブルクリックすると起動できる形にすることができません。 よろしければご教授願います
121 :
116 :2006/10/18(水) 18:14:23
すみません、もうひとつお願いします。 先ほどCygwin、VC++ともにコンパイルできるようになったと書きましたが、 配列を使ったプログラムの場合、CygwinではコンパイルできましたがVC++では 「配列または、ポインタでない変数に添字が使われました。」とでてコンパイルできません。 この原因はなんでしょうか?
( ^ω^)
>>120 Cygwinの場合は-mno-cygwinを付けてコンパイルすると、
Cygwinなしで実行できるEXEになる。
>>120 VC++ならコンパイルオプションでマルチスレッドDLLからマルチスレッドに変更しろ。
普段普通に呼び出して使ってる関数ってどう定義されてるのかと思って borland C++コンパイラのIncludeフォルダの中にある「stdio.h」を開いて 「printf」で検索してみたところ、 int _RTLENTRY _EXPFUNC printf(const char * __format, ...); みたいなのしか見当たらなかったのですが、これがprintfの定義なんでしょうか? てっきり自分で作る関数みたいに int printf(const char *xxx,・・・) { ・・・・・・・ } みたいな部分があると思ってたのですが、そういうのは無いのですか?
ソースが提供されてなければあきらめろ
>>125 stdio.hに書かれてるのは宣言だけ。
ビルド時にリンクされるCW32(MT).libに実体がある。
TurboC++2006ExpにVCLソース付いてるから一緒にRTLのソースも入ってるんじゃないかな。
>125 それはただのプロトタイプ宣言。
>>126-128 どうもありがとうございます。
_RTLENTRY _EXPFUNCとか知らないのが入ってるし他に見当たらないから特別な定義の仕方なのかと勘違いしてましたorz
RTLが何かとかよく把握してないレベルなので色々と調べてきます><
_RTLENTRY _EXPFUNCあたりはBorland C++固有のものだから、あまり気にしないが吉。
C言語で、#defineをstatic constに書き換えようと思ったのですが #define FOO 100 #define BAR FOO*2 みたいなものを static const int foo = 100; static const int bar = foo*2 とすると ”initializer element is not constant” というエラーが出ます。 static変数を使って他のstatic変数を初期化することは無理なのでしょうか?
あー、Cではどうだったかナァ。 C++では出来るはずだが。
>>131 Cではマズイ。C++使うか、 #define のままにしとけ。
enumなら大丈夫
質問:RECTの初期化について 環境:vc2005EE struct A { public: RECT rc[40]; }; struct B... struct C... class HOGE: public A, public B, public C {...}; static HOGE Hoge; とし、現在は Hoge のコンストラクタでデータをいれ、RECT rc を初期化しているのですが。 rc.left = 0, rc.top = 0, .... と書いています。 RECT rei = {0,0,10,10}; みたいに短く書きたいのですが何か手はあるでしょうか。
#include <algorithm> HOGE::HOGE() { const RECT proto = {0,0,10,10}; std::fill(this->rc, this->rc + 40, proto); }
ありがとうございます。 早速試します。
VC2005です アクセラレータ作成に挑戦してるのですが メニューの一番上の項目(ファイル(F)や編集(E)など)には IDがないですよね? こいつらをAlt+FやAlt+Eで表示できるようにするには どうすればいいのでしょうか
139 :
138 :2006/10/21(土) 11:24:10
自己解決 Captionにファイル(&F)のように&をつけて指定することで うまくいきました
140 :
デフォルトの名無しさん :2006/10/21(土) 11:51:15
vc7.1とか8.0とかでつかえるinttypes.hはありますか?
141 :
デフォルトの名無しさん :2006/10/21(土) 12:44:26
質問させていただきます. 今繰り返し計算を行っているのですが たとえば100万回繰り返し計算をしているときに あとどれくらいで終わるか知りたいため,(目安で) 1万回ごとに「今○回計算が終了しました」という文章を DOS画面上に出したいのですがどのようにしたらできるのでしょうか? 教えてください.よろしくお願いします.
%
boost::progress_displayを無駄に使ってみるとか
144 :
デフォルトの名無しさん :2006/10/21(土) 13:41:46
ピクセルデータを格納した配列から、 イメージ(JavaのBufferedImageのようなもの)を生成するには どうすればいいんでしょうか
CreateDIBSection
146 :
145 :2006/10/21(土) 15:26:27
Win32前提にしてどうする orz
Visual Studio .NET2003でスタックの領域を増やす方法を教えてください。 double型の配列を3つ(256*256)宣言するだけでエラーが出て終了するので。 for(i=0;i<256;i++) { for(j=0;j<256;j++) { for(k=0;k<256;k++) { c[i][j] = a[k][j]+b[k][j]; } } } みたいな使い方をするので3つ用意する必要があると思うのですが・・・。
148 :
アフォルトの名無しさん :2006/10/21(土) 17:34:16
javaのコードをC++に移植するとき、例外処理の部分ってどう移植したらいいでしょうか。 javaの例外クラスの階層とC++の例外クラスの階層構造とは完全にはかさならない ですよね?? C++ではユーザー定義の例外クラスを作ることはできますか?
std::exception を継承したクラスでなければならないと言う制限をどこかで見た気がしないでもないが、 基本的になんでも(組み込み型だろうが、自作のクラスだろうが抽象クラスじゃなきゃ) throw できるよ。
>>148 例外は型であればなんでもいい。例外クラスを作ることもできる。
階層構造も再現できるだろう。そこまでする意味があるとは思わないけど。
>>147 本当にスタックにおく必要があるのか?
ヒープで済ませたほうがいいんじゃないか?
>>147 プロジェクトのプロパティから[リンカ]-[システム]-[スタックのサイズの設定]
俺もヒープに確保したほうがいいとは思うが。
153 :
アフォルトの名無しさん :2006/10/21(土) 18:30:35
たとえば、 try { throw new NullPointerException(); } catch( NullPointerException e ) { e.printStackTrace(); } こんな感じのJavaの例外処理をC++に置き換えたいとすれば、 どうなる?C++にNullPointerExceptionってないよね。 NullPointerExceptionに相当するクラスを作って投げなきゃいけないよね。 でも、どんなクラスにすればいいんでしょうか
>>153 std::exception から派生させたクラスとして、 what() を適当に実装すればいい。
スタックトレースは無理。 throw するときに new しちゃだめ。 catch は const& で受ける。
155 :
アフォルトの名無しさん :2006/10/21(土) 19:04:41
#include <iostream> #include <exception> class nullpointerexception: public std::exception { }; int main(void){ try{ throw nullpointerexception(); } catch(std::exception& e){ std::cerr << e.what() << std::endl; } return 0; } こんなん書いてみたんだけど、 no named exception thrown ってでるよ。
>>151 >>152 ヒープはよくわからないので。
スタックを増やしたら実行できました。
ありがとうございました。
158 :
144 :2006/10/21(土) 19:34:03
>>145 回答どうもです
配列から生成したイメージを、DirectXをつかってtextureにしたい
のですが、CreateDIBSectionで可能なんですか?
vc7.1とか8.0とかでつかえるinttypes.hはありますか?
162 :
デフォルトの名無しさん :2006/10/21(土) 23:15:13
.net2003で、C++を勉強し始めて2日目になります。 テンプレートメソッドパターンの勉強中なんですが、 #include<iostream> template <class T,T> T ave(T a,T b) { return (a + b) / 2; } main() { using namespace std; cout << ave<int,int>(1203, 3344) << endl; } とすると、 Question.cpp Question.cpp(11) : error C2975: 'ave' : 'function-parameter' に対するテンプレート引数が無効です。コンパイル時に評価可能 な定数式が必要です。 Question.cpp(4) : 'ave' の宣言を確認してください。 と出てしまいます。 文法的に正しくするとしたら、どうすればいいですか。
163 :
162 :2006/10/21(土) 23:17:22
すみません、テンプレートメソッドではなく、 ただのテンプレートでした。
>>162 エラーメッセージが遠いな。
× template <class T,T>
○ template <class T>
× ave<int,int>(1203, 3344)
○ ave(1203, 3344)
165 :
162 :2006/10/21(土) 23:29:04
>>164 ありがとうございます。
他の例で、
template <class T,T>
T max(T a,T b) {
return (a > b) ? a : b;
}
mainの中で、
cout << max(2,5) << endl;
この場合は、<class T>ではなく、<class T,T>にしないと動かないのですが、
違いはなんででしょうか。
>>165 maxは標準に既に用意されている。
別の名前で試してみ。
168 :
162 :2006/10/21(土) 23:41:21
>>166 >>167 max2にしたら、コンパイル通るようになりました。
試していたのが、max min 等だったので、今まで偶然 標準関数ばかりを
試していたようです。
ありがとうございました。
169 :
デフォルトの名無しさん :2006/10/22(日) 00:03:34
void func( char* begin, char* end ); int main(){ std::vector<char> v; func( &*v.begin(), &*v.end() ); } このコードをVisualC++のSTLを使って 実行すると、*v.end()のところで "vector iterator not dereferencable"とアサートに引っ掛ります。 STLPortでは引っ掛りません。 言わんとしていることはわかるのですが、これに対する対策をどうしてよいやら がわかりません。 template< typename iterator > void func( iterator begin, iterator end ); にすると、関数のオーバーロードに引っ掛りマズー template< typename value_type > void func( std::vector<value_type>::iterator begin, std::vector<value_type>::iterator end ); にするとstd::vector以外使えなくなってマズー いったいどうすればいいと思いますか?
>>169 if (!v.empty()) { char* begin = &v[0]; func(begin, begin + v.size()); }
171 :
デフォルトの名無しさん :2006/10/22(日) 00:44:39
>>170 お答えありがとうございます。
その方法をとって、以下のようにしました。
void func( char* begin, size_t size );
172 :
アフォルトの名無しさん :2006/10/22(日) 11:08:40
C++にはjavaのthrowsに相当するような、メソッドの呼び出し元に対して 例外処理を丸投げする仕組みはないんでしょうか。 ないとしたら、それを再現するようなうまい方法って知りませんか
class Image1 { public: vector<double> db1;// vector<double> db2;// }; class Character1 { public: vector<Image1> img;// Image1のデータ }; vector<Character1> chara1;
int main(int argc,char *argv[]){ for(int j = 0; j < 2; j++){ // 5人分キャラクターを作成 chara1.reserve(5); for(int i = 0; i < 5; i++){ chara1.push_back(Character1()); } chara1[0].img.reserve(2); for(int i = 0; i < 2; i++){ chara1[0].img.push_back(Image1()); } chara1[0].img[0].db1.push_back(0.5); chara1[0].img[0].db1.push_back(1); chara1[0].img[0].db1.push_back(1.5); chara1[0].img[0].db2.push_back(10); /* chara1[0].img[0].db1.clear();// chara1[0].img[0].db2.clear();// chara1[0].img.clear();// */ chara1.clear();// データを消去 } return 0; } こんな風にした場合は、コメントの中の部分は要る? あってもなくても正常に動きはしたけど…
>>172 これらじゃ用件を満たさない?
void f0(){
throw exception();}
void f1(){
try{
throw exception();}
catch(...){
throw;}
>>172 C++にもJavaのthrowsのようなものはあるにはあるが、
コンパイル時にチェックされるわけではないなどの理由から原則使わない。
使わなくても全ての例外はJavaのRuntimeExceptionの如く自動的に呼び出し元へ伝わる。
178 :
アフォルトの名無しさん :2006/10/22(日) 12:49:11
>>175 throw;って投げるエラーかかないと何のエラーがどこに投げられるの?
>>178 catch の中で実行された場合は、現在処理中の例外を外に投げる。
それ以外の場合は死ぬ。
>>178 catch文の中でthrow;のように投げるものを書かない場合は、
受け取った元の例外オブジェクトを投げるということを意味する。catch(...)以外でも次のように必要。
#include <iostream>
#include <stdexcept>
int main() {
try {
try {
throw std::runtime_error("hoge");
} catch(const std::exception& e) {
throw;
}
} catch(const std::runtime_error&) {
std::cout << "std::runtime_error" << std::endl;
} catch(const std::exception&) {
std::cout << "std::exception" << std::endl;
}
}
もしthrow;をthrow e;とすると、オブジェクトをコピーすることになり、スライシングされてしまう。
つまりeの静的な(つまりソースコード上の)型であるstd::exception型のオブジェクトを投げることになる。
throw;では元のstd::runtime_errorを投げることになり、外側のcatchでもstd::runtime_errorとして受け取ることができる。
181 :
アフォルトの名無しさん :2006/10/22(日) 14:24:49
なるほど。大変よく分かりました。さんきう
std::numeric_limitsって、windows.hと共存できないんでしょうか? #include <limits> //#include <windows.h> //このコメントはずすとエラー #include <iostream> int main(){ std::cout << std::numeric_limits<int>::max() << std::endl; return 0; }
183 :
182 :2006/10/22(日) 15:17:06
解決 すみません、ググったらでてきました #define NOMINMAXをwindows.hの前に定義すると うまくいきました
184 :
デフォルトの名無しさん :2006/10/22(日) 16:53:06
ウィンドウズXPでウィンドウソフトを作っています。 処理をさせているときに突然勝手にウィンドウが閉じて 終了します。何が主な原因でしょうか?
>>184 エスパーで解答すると、
ウインドウプロシージャの中で使っているswitch文のbreakを書き忘れているとか。
まあ、超エスパーの降臨を待てよ。
あるいは、その「処理」とやらが、何十秒もかかるようなものだったら、 別スレッドに移すことか。 HKEY_CURRENT_USER\Control Panel\Desktop\AutoEndTasksの値が1だったら、 一定時間応答のないアプリケーションを自動的に強制終了する。 とはいっても、これデフォで0だから違うだろうけど。
>184 あなたが作っているのはコンソールプログラムと見た。 int main(){ 略 sleep(10); /*ここを追加*/ return 0; } でコンパイルしてみ。
188 :
184 :2006/10/22(日) 18:57:10
すいません説明不足でした。 ウィンドウズソフトです。コンソールプログラムではありません さっきパフォーマンスモニタを観察していたら、強制終了される処理の部分で Handle Countが異様に増えていきました。ファイルハンドル解放わすれかな と思いましたので、調べてみます
190 :
デフォルトの名無しさん :2006/10/22(日) 20:32:04
/* * list4a.c * */ #include <stdio.h> int x = 10; extern int y; /* externは実はなくても動く */ int main(void) { extern int z; printf("x=%d y=%d z=%d\n", x, y, z); return 0; } /* * list4b.c * */ int y = 20; int z = 30; externの実験なのですが、 これを動作させるにはどうすればいいのでしょうか? list4a.cだけを実行させても動きません。
>>190 「動きません」って、どうなるんだ?
list4b.c もコンパイルしてリンクしないとダメだよ。
192 :
デフォルトの名無しさん :2006/10/22(日) 20:40:32
>>191 それってどうすればできますか?
とりあえずそれぞれ.objっていうのが出来たんですが。
VCでやれば意識しないでいいぞ〜
>>192 環境くらいかけよ
大抵のコンパイラはhoge.c foobar.cのようにファイル名並べてやればうまくやってくれる
.obj作れたんなら自分でリンカでなんとかできるはず
196 :
デフォルトの名無しさん :2006/10/22(日) 20:59:58
>>195 できました。
bcc32 hoge.c foobar.c で。
どうもありがとう。
bccかよ!
>>196 コンパイル済みのobjからexe作成したい場合はリンカ直接呼べばいい。
ilink32 c0x32.obj hoge.obj foobar.obj, hoge.exe, , cw32.lib, ,
※c0x32.objはスタートアップモジュール(コンソールアプリ)。GUIならc0w32.obj、dllならc0d32.obj
cw32.libは標準ライブラリのスタティックリンクライブラリ。マルチスレッドの場合はcw32mt.lib
199 :
デフォルトの名無しさん :2006/10/24(火) 18:55:44
メインウィンドウのスタイルにWS_CLIPCHILDRENを追加し、 ステータスバーを追加。 起動して、マウスでウィンドウを小さく(タイトルバーだけにする)と下の部分の描写がおかしくなります。 InvalidateRectやUpdateWindowをステータスバーに指定しても変わりません。 どうしたらいいのでしょうか。。。?それともメインウィンドウにWS_CLIPCHILDRENを指定してはいけないのですか?
>下の部分の描写がおかしくなります それだけじゃわからん
すいません、すごく初歩的な質問で申し訳ないのですがファイルを分割して変数や関数がどのファイルで通用するか考えた場合、 スコープはグローバル変数と関数は全てのファイルで通用、ただし両方ともstaticをつけるとスコープは内部リンゲージになる。 ローカル変数はブロック内でstaticをつけると内部リンゲージになる。 ただしグローバル変数に関して別のファイルの無指定のグローバル変数を利用するときは(staticをつけない場合のことです) externという指定をつけたヘッドファイルを読み込んでコンパイルしないと正しく使うことができない という理解でよろしいでしょうか? 分かりにくい文章でごめんなさい
>>201 ちょっとおかしい。
×リンゲージ
○リンケージ
×ヘッドファイル
○ヘッダファイル
ローカル変数は( extern を付けて宣言しない限り)リンケージなし。
static を付けた場合、記憶クラスが変わる。
きっと
>>201 は、リンゲージを飲んでヘッドファイルになっちゃったんだよ。
もともと頭おかしかったみたいだし。
エディットコントロールで文字の中央揃えをしたいのですが Create時に指定するのではなく動的に変更する場合 どのようにしたらいいでしょうか?
205 :
204 :2006/10/25(水) 10:46:58
スレ違いでした。
206 :
201 :2006/10/25(水) 19:16:08
>>202 すいませんw ちょっと疲れてたので書き間違いをしてしまいました
リンケージとヘッダファイルですね。
ローカル変数はexternをつけると別のファイルでも通用する
staticをつけるとそのファイルのみ通用する
何もつけないとブロック内のみ通用する
これで完璧ですか?
ダメだこりゃ
エクス y=ー( ゚д゚)・∵.ターン
関数ブロック内で、externを付けて宣言すると、 外で宣言したのと同じくグローバル変数の宣言になる。 (ただしそれが見えるスコープはそのブロック内限定)
static そのスコープ内で(ファイル・関数)一回だけ初期化し、その後領域を保持しつづけてくれる エクス y=ー( ゚д゚)・∵.ターン 誰かが外に造っているはずと期待し本体の置き場は(基本的に)他ソースにあることを想定
211 :
デフォルトの名無しさん :2006/10/27(金) 12:33:43
c言語初めて1ヶ月で壁に当たっています。 レベル低くて申し訳ないんですが教えてください。 scanf("%s",str)で^zを判断する方法が知りたいです おねがいします
あー来た来たw
>>211 DOS系OSならscanf()の戻り値を判断せよ。入力が閉じられている筈だから変換に失敗したことになるので0のはずだ。
Unix系OSなら単純に収容されるからstrchr(str, '\x1a')でもするってところかな。
>>212 ありがとうございます。
先ほど私もその方法を試してみたのですが
scanfの戻り値の型がわからず代入時にエラーがでてしまいます
int chk;
chk = scanf("%s",str);
if (chk == 0){
〜〜
おかしいでしょうか?
これだけヒントが並んでも未だに自分の環境を語らない
>>213 w
おまけにエラーが出たと言いつつエラーメッセージも張らないし。
先ずはコミュニケーションのレベル上げから始めた方がいいんでない?
215 :
デフォルトの名無しさん :2006/10/27(金) 13:11:16
>>214 すいませんでした><
環境はbcc5.5.1 + DOS です
エラーメッセージは出ず異常終了します
>>213 ヘッダファイル見れば?
scanfでぐぐれば?
確かEOFが返った気がする
ヘッダファイルにそこまで書いてあるとは思わないが、>213のケースなら0ではなくてEOFだろうな。
> scanfの戻り値の型がわからず に反応しただけです。
やっぱりCは難しいな…
コンパイラ : VC2005 クラスが巨大なので、クラスを書いたファイルとmainのあるファイルを別にしたのですが、 どうすればmainのあるファイルで、別ファイルにあるクラスが使えるようになるんでしょうか。 ただの関数なら共通ヘッダにプロトタイプを書けば良いというのは分かるんですが。
>>220 クラスのインターフェースだけをヘッダファイルに書く。
実現部は別ファイルでよい。
環境:VS2005を使用しています。 ダイアログで日付と時刻を表示するプログラムを作っています。 日付と時刻が連結された状態で入ってくるのですが、下記のような コードを記述したところ Run-Time Check Failure #2 - Stack around the variable 'cBuf' was corrupted. というエラーが発生してしまいました。 メモリを破壊しているようなのですがなぜ壊れているのかわかりませんでした。 分かる方いましたらお教えください。お願いします。 以下コード抜粋 m_DateStr = _T("2006/10/21 30"); //日付と時刻が入っている。 wchar_t cBuf[2]; _tcscpy_s(cBuf, sizeof(cBuf), m_DateStr.Right(2));
>>223 その関数には、バッファの「文字数」を指定する必要がある。
バッファの「バイト数」ではない。
char型の場合は、文字数はバイト数と同じだが、
wchar_tの場合は違う。
TCHAR str[256] ;
size_t number_of_chars = sizeof(str) / sizeof(TCHAR) ;
そもそも_tcsとつくのは、マクロで置き換わるわけだから、
wchar_tを直接使うのであれば、wcscpy_s()を直接呼んだほうがいいと思うのだけれど。
>>224 出来ました。
すごく分かりやすい解説をありがとうございました。
クラスのインターフェースってなんですか?
>>226 とりあえず何か本でも買って一通り勉強した方がいいよ
ようするに、とことん大雑把に言えばそのクラスがどんなメンバを持っているかということ。
MFCとかのライブラリって 何段階も継承してるけど、あそこまでやる必要あるの?
指→手→腕→体→一歩前へ→歩け 歩かせるのに指の動作から指示し直してたら効率悪いってことだろ。 納得行かなければ自分で改良してやんな
・C++にテンプレートが無い時代だった ・オブジェクト指向と言えば継承な時代だった(包含しない)
そういえば、今はテンプレート時代だな。
VS.NET 2005です。 iostreamから1行getlineをしてstringを得たいのですが、途中でchar[128]などのバッファを使わず、一気にstringをとる方法はありますか? string s = stream.getline(); のようなものを期待しています。
236 :
234 :2006/10/29(日) 17:33:01
すみません解決しました fstream >> string
char buf[256]; fgets(buf, sizeof(buf), stdin); という記述を良く見かけますが、 sizeof(buf)は256なので、もし256文字分入力されたら bufの最後の\0が入らなくてよろしくない結果になったりしないのですか?
なぜ試さない?
>>239 を見て、ためしに「fgets NULL」でぐぐったら、最初のページでもう答となる記述を見つけた。
1分で自己解決できることをなぜ質問するのか、理解に苦しむ。
初心者だからだよ
ネットの?社会生活の?
両方
245 :
デフォルトの名無しさん :2006/10/30(月) 15:54:46
質問です。 int *a, int b=100; *a=&b; printf("%d",*a); char *a="a" printf("%c",*a); char *a="abcde"; printf("%s",a); 文字や数字を表示させる時は*をつけるのに、文字列の場合は*をつけないのはなぜですか? 文字の場合は値の内容なのに、文字列の場合はアドレスで文字表示ができるのが 理解できません。何て言えばいいのかよく分からないので、 質問が解りにくくてすみません。 よろしくお願いします。
>>245 Cの文字列は'\0'で終端するcharの配列だからだよ。
配列の内容を参照するだけなら、直接渡すのではなく
先頭アドレスを渡すことで事足りる。
だからオブジェクトじゃなくて先頭を示すポインタを渡してる。おわり。
247 :
デフォルトの名無しさん :2006/10/30(月) 16:09:31
認識できない前処理命令です ってエラーはどういうことでしょうか・・・? msxmlをimportしようとして、VCならいけるんですが Solarisではコンパイルエラーになってしまいます。 どなたか救いの手を…。 よろしくおねがいします。
248 :
247 :2006/10/30(月) 16:10:46
認識できない前処理指令 でした。 よろしくおねがいします。
>>247 #importはVC++独自拡張。他のコンパイラには存在しない。
#importはオートメーション、Windowsべったり。msxmlもWindowsもの。 Solarisに移植ですか・・・xmlライブラリ探してそれ使う所は自分で書かなきゃだね。
251 :
デフォルトの名無しさん :2006/10/30(月) 17:07:28
COMってUNIXでも使えなかったっけ?
252 :
250 :2006/10/30(月) 17:44:30
おぉ、COMの仕様はOSに依存しないのか。普及してるのかな。
質問があります。 プログラムをUNICODE対応に変更したのですが char型の配列に格納した文字列をListBoxに AddStringするところでキャストエラーが発生したため、 (wchar_t*)でキャスト変換したところ、リスト内の文字が 文字化けしてしまいました。 原因がお分かりになる方いらっしゃいましたら お教え下さい。お願いいたします。 wstring wstr = (wchar_t*)m_tagtestDat->testStr;
254 :
253 :2006/10/30(月) 18:23:41
>wstring wstr = (wchar_t*)m_tagtestDat->testStr; 間違って入ってしまいましたorz 上記の記述は無視してください。
>>253 そんな化けるようではUNICODE対応したと言わないだろ。
それはともかく、そのchar型の配列をTCHARにするか、
それができないならUNICODEとしてコンパイルするときにはchar配列をワイド文字列に変換するようにしろ。
VC++ならATLのATL::CA2TだかA2Tで簡単に変換できる。
UNICODEだけに対応するならTではなくWだがな。
256 :
253 :2006/10/30(月) 18:54:18
>>255 CA2Wマクロを使用することでワイド文字列に変換することが出来ました。
ありがとうございました。
257 :
デフォルトの名無しさん :2006/10/31(火) 02:01:07
#include<stdio.h> #include<stdlib.h> int main(void) { char *buf; buf=(char *)malloc(20); if(buf==NULL){ printf("失敗です\n"); exit(1); } buf="abcde"; printf("%s",buf); free(buf); return 0; } 強制終了になるんですがどこがおかしいのでしょうか??
CString使おうぜ〜
260 :
259 :2006/10/31(火) 02:05:20
タイミング悪 orz
261 :
257 :2006/10/31(火) 02:18:36
strcpyを使ってできました。ありです。 でもこの場合bufってabcdeの先頭のアドレスが入るんではないんですかね? なぜ入らないんですか?
>>261 期待通りに値は入っている。それを free() に渡すから落ちる。
free() の引数には malloc() の戻り値を渡さないといけない。
教えてください。 それぞれのデータ型が使うメモリを調べてみようとして、 char c int i double d,e のアドレスを表示させたら 0012FF8B 0012FF84 0012FF7C 0012FF74 と、表示されたんですが、 cは8B番地の1バイト分のメモリを使っているぽいのは分かるんですが、 iとdとeはそれぞれ何番地から何番地までのメモリを 使っているんですか?
>>263 sizeof(int)とsizeof(double)
必ずしも c, i, d, e が隙間無く配置されるとは限らない。 アライメント ってやつだ。 sizeof(char)=1, sizeof(int)=4, sizeof(double)=8 として 4バイトアライメントがかかると cxxxiiiiddddddddeeeeeeee (1文字が1バイト xはゴミ) のようなことになる。
>>265 >>263 のアドレスからすると、先頭番地が 0012FF74H で、
eeeeeeeeddddddddiiiixxxc
dとeはどっちが先かは環境依存だと思うけど、こんなかんじじゃないか?
267 :
265 :2006/10/31(火) 21:32:04
C++について質問させて下さい。 C++で書かれたBlowfishの実装を眺めていたら下記のようなコードに出くわしました。 union aword { unsigned long dword; unsigned char byte[4]; struct { unsigned int byte3:8; unsigned int byte2:8; unsigned int byte1:8; unsigned int byte0:8; } w; }; この、unsigned int byte3:8;の末尾にある、:8というのはどのような意味なのでしょうか? 多分、下位(あるいは上位)8ビットを使用する、というような意味だとおもうのですが、 だとしたらunsigned char byte3というような定義と違いが無いとおもうのです。 無論、charが8ビットであるという前提において、ですが。 このような定義をしているということは、自分の考えが間違っているとおもうので その辺りを教えていただけませんでしょうか。
std::vectorって代入無理ですか。 std::vector<int> a,b; b.push_back(1); a = b; とかやると挙動が変で。 配列と違ってそういう事できるものだと思ってた。
できます。
>>270 「挙動が変」じゃぁわからん。
期待した動作と、それに対する結果を言えるか?
おおかた
>>270 のミスなんだろうけど。
270そのままのソースでバッファオーバーランとかアンダーランとか言ってくる。 動作はおおむね期待どうりだけど不安なので template<class T> class vector2: public: std::vector<T> { public: T& operator=(T& right) { if(this == &right) return *this; clear(); insert(begin(), right.begin(), right.end()); return *this; } } 細かい所間違ってるかもしれないけどこういうの書いた。 これで大丈夫。
274 :
デフォルトの名無しさん :2006/11/03(金) 03:07:34
Windows2000のDOSプロンプトで使うツールを作っています。 Win2Kのプロンプト上ではエスケープシーケンスでの文字色の 変更などができませんでした。 何か使いやすいモジュール(と言うのでしょうか?)は ないでしょうか。 使っているコンパイラはフリーのBorland C++です。 よろしくお願いします。
>>273 警告を回避するためだけにそんなことするかよ。
>>274 使いやすいかどうかは別として、Windows APIでそういうことはできる。
276 :
デフォルトの名無しさん :2006/11/03(金) 10:20:12
引数を調べるプログラムで int _tmain(int argc, _TCHAR* argv[]) { int i; printf("argcは %dです。\n",argc); printf("次に、argv[x]の中身を表示します。\n"); for(i=0; i < argc; i++) printf("argv[%d]=%s\n", i, argv[i]); printf("おしまいっ!\n"); rewind(stdin); getchar(); return 0; } a.exe abc def と引数を入れても、 Visual C++ 2005では C a d と、最初の1文字しか出ません。 なぜなのでしょうか
>>276 Unicode文字列をascii文字列として出力しようとしているから。
詳しくはVSスレなりどこへでも。
>>273 VC++2003では出ないが、どんな環境なんだ?
std::vectorにはoperator=があるんだし、わざわざそんなことする必要無いと思うが。
280 :
デフォルトの名無しさん :2006/11/03(金) 11:45:13
マルチモニタで両方のディスプレイにフルスクリーン表示させる方法ってありますか? プライマリモニタでしかフルスクリーン表示できなくて
スレ違い
282 :
デフォルトの名無しさん :2006/11/03(金) 19:32:24
ちょっと相談させてくれ。 HDC をラップするRAIIクラス作ろうと思ったんだが、メンバ関数名のつけ方で悩んでる。 clas DeviceContext { public: // HDC を置き換える void reset(HDC hdc=NULL) { if (hdc_) ReleaseDC() か DeleteDC() を呼ぶ; hdc_ = hdc; } // HDC の所有権を解放 HDC release() { HDC hdc = hdc_; hdc_ = NULL; return hdc; } //... private: HDC hdc_ //... }; こんなクラスなんだが、release ってメンバ名が非常に微妙な気がしてならん。 とりあえず auto_ptr や shared_ptr のインターフェイスに合わせとこうと思ったんだが、 release ってのが Win32 API の ReleaseDC とカブってるのにぜんぜん違う動作だから混乱を招きそうだ。 かといって、他にいい名前を思いつかん。 なんかいい名前ってない? ちなみに環境は、Win32 SDK + VC6.0以降。
MFCではAttach+Detach
>>282 本当に必要じゃないんなら reset() も release() も消しとけ。
285 :
デフォルトの名無しさん :2006/11/03(金) 20:13:11
>>283 普段は MFC 使うことのほうが多いクセにまったく思いつかんかった・・・orz
サンクスです!
>>284 いや、インターフェイスを最小限にってのはわかるけど、一応どっちも必要なんす。
DCが不要になった時点でさっさと reset しないとなんかキモチワルイし、
release (または Detach)がないと、戻り値とか引数として使えなくなっちゃうし。
俺だったら、リソース管理をしない、関数をラップするだけのクラスを作り、 それをprivate継承して、所有権を持つクラスを作ると思う。 ATL::CDCでは、releaseではなく、Detachという名前で同様のものを持っていたはず。 もちろんその逆のAtatchもある。
287 :
デフォルトの名無しさん :2006/11/04(土) 00:25:22
>>286 自分の場合、単なる関数ラッパークラスにはあんまり魅力を感じとらんのです。
結局それって DeleteDC(dc); が dc.DeleteDC(); と書けるくらいの違いですよね?
それで HDC を引数にとるAPIを片っ端からメンバにしようとするとメンバ関数が膨大になるし、
かといって「よく使うやつだけ」とかやると、どれがメンバでどれが非メンバか覚えとくのが大変だし。
小さな具象クラスに留めておきたいから、継承とかもあんまりやりたくないし。
ただ、 if (...) return FALSE; のたびにオブジェクトを忘れず解放ってのはめど過ぎるし、
自分のケツくらいはオブジェクト自身で拭いて欲しいなと。
環境は WinXP home sp2 Microsoft Visual C++ .NET 上位関数でファイルポインタを宣言して fopenは子関数でして fcloseは親でしたいんだけど ↓じゃ上手いこといきません void a(file *fp){ fp=fopen(filename,"w"); fprintf(fp, "test\n"); } main(){ file *fp a(fp); fclose(fp); }
void a(file **fp){ *fp=fopen(filename,"w"); fprintf(*fp, "test\n"); } main(){ file *fp a(&fp); fclose(fp); }
>>288 void a(FILE **fpp) {
*fpp = fopen(filename, "w");
fprintf(*fpp, "test\n");
}
main(){
FILE *fp;
a(&fp);
fclose(fp);
}
292 :
288 :2006/11/04(土) 01:04:00
>>289-290 ありがとう
あーそうか
ファイルポインタのアドレスが入った場所のアドレスを送らないといけないのか
で受け取った先は↑のせいで**になるのか
C++なら *& で受けるんだけどな
そういえば、どこかのスレで、 同じように**を使ってポインタ変数を書き換える部分を書いたら **を見た瞬間に「初期化が」「NULLを参照すると」とか言い出す奴が湧いて来たっけ。 お前らはint*を受けて整数を代入するコードでも同じ事を言うのか、と。 いや、本当に必要があるなら、NULLチェックするのも当然だとは思うけどね。
>>294 あとでライブラリ的に再利用する予定(または可能性)があるコードなら、
それの外部インタフェースとなる関数では入力値のチェックはしたほうがいいかもね。
ユーザ(他人や将来の自分)が間違った使い方をしてもいいように。
内部的な関数でコール元から適切な値が渡ってくることを前提にできる関数なら
いちいちチェックする必要は無いと思う。
296 :
288 :2006/11/04(土) 02:12:02
孫以降は ↓でおkだよね? void aa(file **fp){ fprintf(*fp, "test\n"); } void a(file **fp){ *fp=fopen(filename,"w"); fprintf(*fp, "test\n"); aa(&*fp); } main(){ file *fp a(&fp); fclose(fp); }
void a(file **fp){ *fp=fopen(filename,"w"); fprintf(*fp, "test\n"); aa(fp); } でいいよ。二回目以降の呼び出しはわざわざ &*ってしなくてもいい
>>296 孫以降というよりも、
FILE *fp = <なんか> のようなポインタの書き換えを伴うやつ(fopen だな)だけ
引数では FILE ** で受けて 呼び出し側は FILE *fp; foo(&fp) のように &付きで渡す。
あとは素直に FILE * で受けてれば問題無い。
fseek()も書き換えを伴うぞ。
>>300 それは fp 自身ではなく fp が指す FILE構造体の内容を書き換えるんでない?
>>300 fseek() は fp の実体内部を書き換えるだけで fp そのものは書き換えられないだろ?
その証拠に FILE* を戻さないし、FILE** で受けてない
# fwrite() fprintf() も fp の実体内部を書き換えてるぞ
だからfseek()を使う関数をfile *fp;で呼び出したらだめ。 **fpで呼び出さないと戻ってきた時fpの中身が食い違ってしまう
>>302 それやったら、fseek()をした直後にfread()をやっても影響を受けないと
言うのか?読み出す場所が違ってくるだろ。
あ seek ポイントが狂うからか。 あれ? fwrite, fprintf は書き換えずに別管理で現在位置を保持してるのか?
結局**fpで受ける必要があるのは、fopen()で代入する時だけだよね?
>>306 いや、*fpだけでもFILE構造体を指す事はできる。しかしfopenは
FILE構造体へのポインタを返すので、**でないといけないんだろう。
まとめると 1.FILE構造体へのポインタを受け取って代入する関数は**で呼び出す。 2.それ以外は*だけでよい。 1.はfopen()、freopen() 2.はそれ以外 ってとこかな
書き換えてるのはFILE構造体の実体だものな。 foo(int **a) { *a = malloc(...); } bar(int *a) { *a = ...; } // fseek に相当 hoge(int *a) { ... = *a; } // その他参照のみ { int* a; foo(&a); bar(a); hoge(a); } 別に bar() hoge() 間で問題おきないよな。
311 :
286 :2006/11/04(土) 02:53:03
>>297-310 マジ、ありがとう
ポインタも奥が深いorz
まだまだがんばらないといけないな・・・
できれば戻り値を使うのが一番だってのを忘れんなよ。
313 :
273 :2006/11/04(土) 03:46:45
>278 BCB5。 別件で別スレに質問したらRogueWaveのバグの可能性があると言われた。 これもそうかも。 ちなみにpush_back()やらないと何もいってこないのでひょっとすると浅いコピーやってるのではと思ってる。 普通は=使えると聞いてほっとした。
>>313 STLport4.6.3なら入るからそれ入れたら?
>>313 clear() + insert() よりも assign(right.begin(), right.end()) がお勧め。
すみません、まったくの初心者なのですが・・・ ANSI−Cを使ってWinXP上にウインドウを出すには 何をそろえればいいんでしょうか? VC++5.0持ってますけど・・・これじゃなきゃ駄目?
>>316 ANSIの規格内ではGUIに関する操作は一切出来ない。
> 何をそろえればいいんでしょうか? ANSI-C準拠の処理系 > これじゃなきゃ駄目? いいえ
Windowsのclおよびgccを使っています。 問題を単純化した例を下記に挙げます。 #include <stdio.h> int Test1() { printf("Test1\n"); return 0; } int Test2() { printf("Test2\n"); return 0; } int main(void) { int B = Test1() && Test2(); return 0; } 上記でTest2()が実行されません。(Bの結果が何であるにせよTest2()は実行したい) webを調べたところvolatileと言うキーワードに遭遇したので試しに下記にしてもだめでした。 volatile int Test1() { volatile int Test2() { volatile int B = Test1() && Test2(); Test2()を確実に実行するには B1 = Test1(); B2 = Test2(); B = B1 && B2; のように、2つに分けるしか手がないでしょうか?
>>320 それはショートサーキットという動作。
ショートサーキット無しの論理演算をしたければ、2つに分けるのが正解。
そうでなければ、たとえば Test1() & Test2() ならショートサーキットは起こらない。
volatile は関係ない。
>> 320 式1 && 式2 という演算では、式2より先に式1が評価されるのが保障されている。 そして、式1が偽(=0)なら式2は評価されないことが保障されている。
保障?
326 :
323 :2006/11/04(土) 12:29:45
>>321 >>316 にGUI/CUI云々は書かれてないぜ。
ウィンドウが出さえすれば要件を満足するはずだ。
>>327 いやあの、GUIです…
ないんですか?
ANSI−C準拠の処理系ってどんなのがあるんですか?
>>328 前にも書かれているようにC言語自体にウィンドウ表示する機能はない
Windows環境でウィンドウを出したいのならWin32APIを使う必要がある。
そのためにはPlatform SDKが必要だが、VC++5.0持ってるなら必要ない。
でも今さら5.0使うよりかはVS2005Expressを使ってみるのもいいかもね。
質問です。 下記のコードなのですがWinXPのCygwin上のgcc3.44ではコンパイルして 実行できたのですが、VC6.0では 「error C2440: 'initializing' : 'struct teststruct' から 'int' に変換することはできません。 (新しい動作 ; ヘルプを参照) この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。」 というエラーが出てしまいます。VC6.0では配列の初期値として構造体を 返す関数を指定する事はできないのでしょうか? #include <stdio.h> struct teststruct{ int mem1; double mem2; }; teststruct get_ts(int in_mem1,double in_mem2){ teststruct ts; ts.mem1 = in_mem1; ts.mem2 = in_mem2; return ts; } teststruct array[] = {get_ts(1,1.1),get_ts(1,2.4)}; int main(){ printf("%d %f : %d %f\n",array[0].mem1,array[0].mem2,array[1].mem1,array[1].mem2); return 0; }
331 :
330 :2006/11/04(土) 16:13:32
ちなみにOSはWinXP Pro SP2でソースはcppです。
>>329 どうもありがとうございます。
UNIXには、turtle.hとかってありましたよね…
あの頃が懐かしい
はどうすれば良いんですか?
>>33 それ多分gccの拡張だから
teststruct(int in_mem1, double in_mem2) : mem1(in_mem1), mem2(in_mem2) {}
teststruct() {}
って書けよ
>>330 VC++ 6の問題だと思う。
VC++ 7.1/8ではコンパイルできるし、
そんなをできないようにする理由もないはず。
337 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 19:19:11
こんばんわ。C++暦2日目の学生です。
乱数で0が出るまでの回数をtemp[]配列に記憶しておき,それを1万回試行してtemp[]の平均を求める。
http://ipoko.skr.jp/ransuu.cpp.txt というプログラムを考えたのですが,なぜか最初の1回だけランダムな数字が出て
残りの9999回は全部0になってしまいます。
何故でしょうか?誰か教えてくださいm(__)mペコ
志村sの初期化ー!
339 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 19:27:43
>>338 アッー!
なるほど、どうもありがとうございましたw
2日ってまだ書ける時期じゃないな。 覚えないと。
341 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 19:29:30
まだクラスの単元しか読んでいません。 テンプレートってのをはやく覚えたいです頑張ります
342 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 19:31:28
Cはそれなりに得意ですが CとC++の違いがまだ分からないです。 勉強に当たって何に気をつければいいとかありますか?
罠が増えてるので気をつけましょう
C++暦2日目でもマルチポストはベテランらしいな
345 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 19:43:29
気をつけます 2ch暦6年です
>>336 アホウ!
初期化に関数を使えるようにしたら、
関数の呼び出し順序によって結果が変わることがありえる。
その関数の場合は副作用が無いから問題ないが、
よく考えてものを言え。
俺がアホで悪かった。 しかし規格上できることになっていることに変わりはない。
>>347 規格のセクション貼れよ。どこにそんな事が書いてある。
>>346 君はunary function以外認めない気かw
8.5.12
>>349 §8.5.12なんてねーぞ。8.5.1.12も違う内容だし
>>349 unary function?全然関係ない。
たとえばこんなコードがあったときにarrayとarray2のどっちが先に初期化されるかで結果が変わるが、
どっちが先に初期化されるのか予測できるか?
// test.h
struct teststruct{ int mem1; double mem2; };
extern int a;
// test1.c
#include "test.h"
int a=1;
teststruct get_ts(int in_mem1,double in_mem2){
struct teststruct ts;
ts.mem1 = in_mem1+(a==1);
ts.mem2 = in_mem2+(a==1);
a++;
return ts;
}
teststruct array[] = {get_ts(1,1.1), get_ts(1,2.4)};
// test2.c
teststruct array2[]={get_ts(1,1.3)};
#include "stdio.h"
int main(){
printf("%d %f : %d %f\n",array[0].mem1,array[0].mem2,array[1].mem1,array[1].mem2);
return 0;
}
struct teststruct xxx ; って書かないで構造体の宣言できるんですか? いつも定義で typedef struct { // any code } teststruct ;
ずばり、規格書に書かれている場所を示せばいい。
>>349 みたいな出鱈目書かないで
コンパイル前というか、lint というツールを使用するのは基本なんでしょうか。 lintで構文チェックするのは常識ですか。
>>354 最近のコンパイラは賢い。
あやしいところの警告もちゃんとしてくれる。
gccやvcなみのコンパイラを使ってるならlintは不要。
失礼、8.5 -12-だった -12- The initialization that occurs in argument passing, function return, throwing an exception (except.throw), handling an exception (except.handle), and brace-enclosed initializer lists (dcl.init.aggr) is called copy-initialization and is equivalent to the form T x = a;
>>348 JIS X3014:2003より。
8.5の1節では、初期化子節に代入式が挙げられている。
代入式とは関数呼出式を含んでおり、
実際同2節には、関数で初期化できることも書かれている。
>>351 たぶんもう分かってると思うけど
それはもう配列に限った話じゃなくて未定義だ
360 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 21:51:12
すいませんさっきの大学生ですが ボクの計算機では1万回やると約3秒かかりました。 しかし2万回以上に増やすとエラーで強制終了してしまうのですが・・・ 原因はメモリ不足でしょうか? C言語では乱数を2万回作ったくらいじゃメモリ不足?で強制終了されなかったと思いますが C++はそんなもんなのでしょうか?? [3] 環境 [3.1] OS: WindowsXP-SP1 [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 for Win32 & Turbo Incremental Link 5.00 あ、CPUとメモリも載せておきます 演算装置:Athlon64-3600+ メインメモリ:DDR SDRAM 1024GB
グローバルなコンストラクタの初期化順序が予想できないのは 配列に限ったことじゃないし。 どんな言い訳してくれるか楽しみ
362 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 21:55:47
>> 355 ありがとうございます。そうすると lint は一つ前の世代のものなんですか。 書き込みが早いですね。
365 :
秋葉の大学生♂&rlo;望志んさ屋トフソ :2006/11/04(土) 23:00:09
すいません さっきの大学生ですが
http://ipoko.skr.jp/ransuu.cpp.txt int型の配列を25000個なら確保できるけど,
30000個以上だとプログラム実行させても強制終了しちゃいます
int temp[3万以上]; としたソースをコンパイルして実行させると強制終了しちゃいます。
これの原因は何でしょうか?
367 :
デフォルトの名無しさん :2006/11/04(土) 23:08:40
私、mixiのとあるC言語コミュに加入していたのですが、そこの管理人があまりに横柄&失礼な文を書くので退会してきました(^_^;) 初心者の人が虫食い状態のソースを埋めて完成させる簡単な課題を丸投げしていたのですが… わざと理解できないように難しく書き直したり、きちんとお礼を言っている質問者に対して『この程度の事が分からないのはやる気がないだけ、そんな人間にお礼を言われる筋合いもないし、虫酸が走る』とまで書いていました…。 分かる人には大した事の無いことだったとしても、分からない人にはそうでないのですから、もう少し常識ある態度が取れないのかな…と思った訳です。
368 :
デフォルトの名無しさん :2006/11/04(土) 23:09:28
実は、他の掲示板でも似たような事があり、非常に不愉快な気分になった事もありました。初心者&入門者用と謳っていながら、分かる人が知識をひけらかし、分からない人を中傷するような感じだったんです。 こういうのを見た後に、ここのサイトにやってきたので、余計に素晴らしいなと思ったんですよね(笑) 私の拙い知識でも役に立つ人がいるのならば…と、今後を驕ることなく書き込みしていきたいと思ってますよ(^-^)
いったいここは何なんだ
>>367 表層的に丁寧な言葉を使ってても、
あからさまに解く気が無いのはとても失礼な態度だと思う。
それで罵倒されたからってここで書くのもどうかと思う。
ここはそんなに素晴らしい場所じゃない。 人が多いから、たまにとても親切な人も来るというだけ。 あなたが退会してきたそこも、別にひどい場所じゃないだろう。 そういう考えの人がいるのは別に不思議じゃない。ここにだっている。
質問した相手が悪かったんだろう。これからは質問する前に Ku○○○○○eがいないかどうか確かめて、もしいたらそこには 何も書き込まない事だな。
>372 その人は管理人じゃないから、catっぽい名前の人だと思う。 ちなみに自分も耐えられなくて逃げてきた。何かをけなされたわけではないが。
374 :
デフォルトの名無しさん :2006/11/05(日) 00:56:07
IT化だから最近の子供は凄いのか〜とか思うのは間違い!! 最近の子供はコンピュータがブラックボックス化してしまたせいで コンピュータの仕組みについては何も知らない MS-DOS?Windows3.1?コマンドライン?(謎)って感じ 昔に比べて自分でプログラム作る必要は無くなったし 自作する必要も無くなった(自作PCと既製PCの値段の差が無くなってきている!) (まぁインターネットサーフェインやHP作成はちょっと昔の子供より出来そう?だが) 商業高校の掲示板とかスレとか見てみ? 情報をたくさん勉強してるはずなのに何も知らないよ? 資格もワープロ検定やパソコン検定などエンドユーザ側の試験ばかり(それはそれで悪くはない・・?)
375 :
デフォルトの名無しさん :2006/11/05(日) 02:54:37
>>365 そりゃ、スタックオーバーフローだろうな。
temp配列の領域をスタックに置いているから、ある程度以上のインデックスを超えると
リンカで用意しているスタック領域を超えて、メモリ領域を壊しまくる。か、MMUによってアクセス例外が起きる。
普通ある程度大きな領域を必要とする場合は、ヒープ領域にとる。
int* temp = new int[1000000]; //領域確保
... 処理
delelte[] temp; //使い終わったら必ず領域開放
宿題スレ覗いてこっち開いたけど…マルチポストが流行ってるのか?
マルチポストにレスを返す教えるクンが居る限り、マルチポストは なくならない。
378 :
デフォルトの名無しさん :2006/11/05(日) 04:16:19
∧ l'vヘ ハ ┌( ;/ ト, ,、 rヘ r'^ナrジ-z __}ヽ,__ (ヽ/ス_r^フしz,り い)n/イr〜^′ 'っヾ、r'__ |レ'ノ_C'入彳勺ソメろ_j/し-,_ `フ ヾ勹_| <_r' !|刀_」r''>||/⌒(_rヘ-‐' <_ゝし||フぅ(ひzメ__ゝ'l !'そ ~zヾ|て 、l レ^ //'| |'~ | | ヽl| // }| | :! || | | ,/ ,' すいません、ちょっと通りますよ | :{. || | |/ / l !|| | | / ヽ ヽ.|/ // _,r)_ j (_,( ciz ,ノこ_- __,ーヽ ん|Zゥ レz zjそ_ } ... 丿 ろ、,_!|乙7ムLそ/し-z ノ""'' 一( `う.l !シ/ア了//_⊂, /、__ ヽ ^'| |~//,/_ソ ハr^ / ...... ーl | |// //ノ /~"' 、__/ ,,,...} |/ /// {' _ `y′ 一 / r'〜(_ノ 人 =/‐- ハ 丿" ''( ヽ '' / __,, / / ‐- ''') '∨ X. }''' ....ノ j ー/ /== ノ'ヽ /=‐ r'´-ヽ } ー/'''' { ,' _,, 人 ''"`、 ノ.. '' ノ`ヽ ''"ヽ {ー / \ -'} / / \'''}` ハ 〈 )八 ( f )ハ ヽ ) (( )ノ / ノ/ ') _/
379 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/05(日) 04:20:07
>>375 ありがとうございました。
スタックがそんなところに存在して
あの場所で宣言すると勝手にリンカのスタックに入ってしまい
しかもゴチャゴチャした制約があったなんて知りませんでした
勉強になります
>>372 晒し
Kusakabe
id=1277347
耐性のない初心者はこの基地外のいるコミュニティに書き込むべからず
メモリが足りなくて困ってます。 ただ同じことを繰り返してるだけなので、 試行が終わるたびにテキストで出力すればあとは手作業で済ませます。 どうすれば、試行の度に出力することができますか? ファイル名をその度に変える必要があるんどえしょうか?
メモリ足りないなら買ってくればいいじゃん。
>>381 マルチか嵐か?
誘導されてきた積もりなのなら、誘導元に断り書きすることとこちらにもその旨を書くこと。
つーか、誘導元でソースを貼れと言われただろ。
384 :
デフォルトの名無しさん :2006/11/05(日) 17:12:12
windowsXP,VisualC++6.0での質問です。 リストボックスで複数行(8行)そして、複数列(256列)表示させたいのです。 表示内容は2次配列を用いて、処理中に書き換え可能としたいのです。 質問は複数列表示についてですが、基本的なところでどうすれば複数列設定ができるのでしょうか? お願いします。
>>384 素直にFlexGridでも使っとけ。VC6ならついてるぞ。
386 :
384 :2006/11/05(日) 19:11:47
>>385 FlexGridの方が素直ですか。
明日から考えてみます。
387 :
デフォルトの名無しさん :2006/11/05(日) 20:34:30
よくわからない事態になっているので、どなたかご教授ください。 先日、フリーのCコンパイラを試そうといろいろ入れたんです。 @ Cygwin A VisualC++2005ExpressEdition + Platform SDK B Borland C++Builder と、みっつ連続でインストールしたのですが、@のCygwinしか正常にコンパイルを行うことが出来ません。 ABどちらも解説サイトの手順に沿ってインストールを行い、全てデフォルトの位置に入れました。 環境変数の Path Include Lib への追記も済んでいるので問題なくコンパイルできなければいけないはずなのですが… AのVCはMSVCR80.dllにまつわるエラーらしき警告がたくさん出て終了、BのBCCは大量のエラーがずらずらと流れて終了、というありさまです。 これらのコンパイラは共存できないものなんでしょうか?これでは使い勝手を試しようがありません。 OSはWindows2000SP4です。どなたか解決方法をご教授ください orz
Cygwinが一番面倒な気がするんだが… 何をしてどんなエラーが出たか書いてもらわないことには何とも言えない
普通に動いてるが
>>388 上記3件全てのコンパイル用ファイルが梱包されていたathenaというプログラムを比較用サンプルに使用しました。
Cygwinでは手順どおりに行えばコンパイルが完了してexeをちゃんと吐き出しました。
VC・BCC共に環境変数及びbatファイル内のPass・Include・Libそれぞれをインストール先に書き換え、
batのダブルクリックとコマンドプロンプトからの実行をそれぞれ行いました。
VCは「プロシージャ エントリ ポイント __security_error_handler がダイナミック リンク ライブラリ MSVCR80.dll から見つかりませんでした。」
という警告ウィンドウが連続発生して処理終了。BCCはE2000番台やW8000番台のエラーが数百行近く流れ続けて処理終了。
どちらも結局exeを吐き出すことはありませんでした。
とりあえず正常に動く環境にしたいのですが、どうすればよろしいでしょうか…
C++再考を読んで勉強中なんですが p84にある int main() { Expr t=Expr("*", Expr("-",5),Expr("+",3,4); cout << t << endl; のExpr("*", Expr("-",5),Expr("+",3,4); の部分がよくわかりません。 Exprは型名だと思うのですが Expr hoge("*", Expr("-" 〜 ではなく Exprのすぐあとに括弧で引数をわたしているのはどういうことなんでしょうか?
>>391 まずコンパイラの動作確かめるならHello, Worldにしよう
394 :
デフォルトの名無しさん :2006/11/05(日) 21:27:30
今日始めたての初心者なんですが
ttp://homepage3.nifty.com/mmgames/c_guide/p_bcc.html に書いてあった
#include <stdio.h>
int main (void)
{
printf("Hello World\n");
return 0;
}
をコンパイルしてみたんですが、なんかいやっても
エラー E2209 ooo.c 1: インクルードファイル 'stdio.h' をオープンできない
になってしまいます・・・
<stdio.h>がおかしいって事はかろうじて分かったんですけど、どう対処すればいいのでしょうか?
>>392 vector<Hoge> vi;
vi.push_back(Hoge(...));
名無しの一時オブジェクトができる
テンプレに「初心者はBCC使用禁止」を追加すべきだな。
397 :
392 :2006/11/05(日) 21:56:37
>>395 今回の例のようなSTLに格納するわけではない場合
一時オブジェクトをつくるのにどんなメリットがあるんでしょうか?
Expr t("*",Expr("-",5),Expr("+",3,4));
と書いたほうがスッキリしていると思うんですが
>>397 Cからある初期化構文を使うんで、理解されやすいかもしれない。その程度。
>>397 どっちかって言ったらデメリットの方が大きい気がするなぁ
>>374 デベロッパ側の勉強は工業高校の方じゃね?
401 :
デフォルトの名無しさん :2006/11/06(月) 15:24:27
プログラムがexit()で終了(引数の値がおかしいと出る)するんですが、 終了している箇所がライブラリの奥深くで、どこの呼出が原因なのかまったく分かりません。 exit()で正常終了されてしまうのでgdbでwhereとかも出来ないんですが、 これを調べる良い方法はありませんでしょうか? printfデバッグしかないんでしょうか。
>>401 exitにブレークポイントしかけて実行して、bt
free/deleteしたポインタに明示的にNULLを代入する行為ってのは 「free/deleteしたポインタを操作する危険な命令」ですか?
>>403 いいえ。
free/delete した後もそのポインタが指す内容を参照すること = 「free/deleteしたポインタを操作する危険な命令」
delete p;
*p = .... とか hoge = *p; 等
delete p; p=NULL; としておけば、上記 *p = ... 等で不正書き込みとして検出できる。
サンクス
>検出できる。 とは限らない。
class hoge { public: hoge() { cout << "test" << endl; } }; 上のようなクラスを定義して int main() { hoge hoge1; hoge hoge2(); return 0; } とやるとhoge1のときだけコンストラクタが呼ばれるみたいなんですが どうしてhoge2のときはコンストラクが呼ばれないでしょうか?
>>408 > hoge hoge2();
引数を取らずhoge型を返す関数hoge2の宣言。
>>409 よくわかりました。ありがとうございます
STL標準講座を読んでいたらp37に bool isEven(int i) { return !(i%2); return false; } というコードがあったんですが 下のreturn false;が実行される事はあるんでしょうか?
決してない そんな本投げ捨てろ
その本ひでぇw
まあ誤植の1個くらいでそこまでたたかなくても
C++で一つ質問。プログラム上でBATを叩いて、そのBATが吐き出した結果を 取得する方法ってあるかな? たとえばdirで出したディレクトリ構造とかとか。
標準出力をパイプかなんかで受けて CMD.EXEを起動して引数に渡せばいいんじゃね?
つ[popen()]
>>374 商業出身でも工業出身でもないが、ハードや仕組み、(工業高校のみ)BASIC(VBA)は今の高校の情報の教科書に乗っている。
ただ睡眠学習しているだけ。
質問:デバッグ時の検討の付け方について vc2005EEで C/C++ プラットフォームSDK win32アプリケーション を使い ある処理をするHOGEクラスのみを書いた cpp と h を用意し ライブラリのように使おうと思いました。 ある程度プログラムを書きデバッグをしクラスの情報を見ると コンストラクタを呼び出す前にゴミの様な情報が 渡されている事に気が付きました。 デバック画面で class名 {メンバ変数名 = [アドレス]"ゴミ文字"} となっていました。 どうも、ファイル内でHOGEクラスを HOGE hoge と書いた回数分だけ ゴミ文字が付いてしまっているようです。 さらに困った事に、このゴミ文字の分だけアドレス(?)も ずれてしまっているようです。 例えば、ZeroMemory() を使い char型のメンバ変数 moji を初期化仕様とすると moji[0] = "@" moji[1] = "□" moji[2] = "." moji[3] = "0" moji[4] = "0" moji[5] = "0" moji[6] = "0" と、なったり
421 :
420 :2006/11/07(火) 06:17:09
moji に文字列 abc を入れようとすると moji[0] = "@" moji[1] = "□" moji[2] = "." moji[3] = "0" moji[4] = "a" moji[5] = "b" moji[6] = "c" と、なってしまいます。 HOGE hogeをファイル内で一度のみ使うようにすると一応正常に動くようで class名 {メンバ変数名 = [アドレス]""} となっていました。 そこで、問題の箇所を確かめようと、別にHOGEクラスのファイルを付けただけの プロジェクトファイルを作り、HOGE hoge を複数の関数で使ってみたのですが 正常に動いてしまいました。 どうやら、問題の起こっているプロジェクトの方で何か不味い事をしてしまった様だ という事は分かるのですが、そこから先の検討の付け方が分かりません。
長文ダラダラ書かずにコード示しなよ
423 :
415 :2006/11/07(火) 07:29:56
ありがとう!やってみます!
質問です。 とてもサイズが大きいクラスBigAがあったとします。 で、vectorみたいなコンテナを作ったとして vector<BigA> bigAvec; BigAオブジェクトをどんどん格納していきたいんですが bigAvec.pusu_back(BigA()); ってやると、BigAが重たいコンストラクタで生成されて、 さらにpush_backされる時にコピーコンストラクタでコピーされますよね。 いきなりvector内のコンテナの中でBigAオブジェクトを生成したりとかできないんでしょうか。
できない
>>426 連続したメモリにbigAオブジェクトを隙間無く並べたいという都合があるので、
ポインタ格納はやりたくないんです・・・。
あるいは、普通の配列にbigAオブジェクトを格納して並べて、
それらへのポインタをvectorとして管理すればいいんでしょうか。
424です。
今思いつきましたが、
BigAのメンバ変数を全てpublicにしてしまえば、
vector<BigA> bigAvec(1000);
bigAvec[0].valueA = 9.9; //BigAのメンバ変数
bigAvec[0].valueB = 2.9;
.....
のようにすれば
>>424 のボトルネックは解消できますよね。
あ、でもこの場合、
vector<BigA> bigAvec(1000);
でBigAのデフォルトコンストラクタが呼ばれるのでしょうか?
呼ばれる
fputc(fgetc(fp),fp) fgetcでfpの指示位置が遷移して、fputcで書き込まれる? それとも まるっきりコピー?
引数の評価順って環境依存じゃなかったっけ?
評価順は関係ないと思われ
printf("a",printf("b"),printf("c"),printf("d")); これってどうなる?
>>433 dcba
WinXP BCC 5.51
>>430 間にseek系挟まずにread系,write系はアウト
>fputc(fgetc(fp),fp) fgetcがfputcより先に呼ばれるのは確実だからfgetcでポインタが進んでからfputcで書き込まれるだろ もしかして俺、勘違いしてる?
>>433 dcba
WinXPSP2 VC6SP6
439 :
432 :2006/11/07(火) 20:35:35
fpはポインタなんだから問題ないんじゃね?
442 :
430 :2006/11/07(火) 21:19:18
int a; a=fgetc(fp); fseek(fp, -1, SEEK_CUR); fputc(a,fp): 正直にこうした方がいいのかな
何がしたいのかわからない
C++の演算子のオーバーロードに関してなのですが、 演算子の左辺側の値を取得しようとしたら クラス定義の際に使えるthisポインタ以外に方法はありませんよね?
別にメンバ関数でオーバーロードしなくてもいいだろ。
main関数のプロトタイプ宣言はするべきですか?
何の為にプロトタイプ宣言するのか理解してる?
なんでこれぐらいのことコンパイラというかプリプロセッサというかどっちでもいいけど 普通に関数本体のところのプロトタイプ宣言に当る部分を読んでくれないのかね? 何でわざわざユーザーに書かすのかが分からん
コンパイラの負担減らす為じゃなかったっけ? 上から1回だけスキャンすればいいから。
でも関数内部見なくていいんだよ そのためだけに1回スキャンしても一瞬で終わるじゃん
452 :
デフォルトの名無しさん :2006/11/08(水) 20:54:54
すみません、ほとんどプログラムをしたことないのに、 仕事でプログラムをしなくてはいけなくなりまして。 VC6.0でプログラムされたものを改造しています。 関数の途中でアプリケーションを終了する方法を探しています。 exitやabortだとアプリケーションがフリーズした状態になるだけでした。 終了するコマンドってありますか? すみませんが、どなたか教えてください。
>>451 ソースがスキャンしたくないくらいに長いとき、ソースとヘッダを
分離するメリットくを考えるとそういう仕様になってるのが納得できるよ。
昔のコンパイラは非力でした、でOK? >453 言いたい事はわかるが、コンパイラがスキャンしたくないようなレベルの長さってどうよ
v = ClassAのメンバ変数のClassB の実体 ClassA::ClassA (ClassB* p) : v( p) { …… } 本に載ってたサンプルでこんなのがあったんですけど これってどういう構文なんでしょうか。 継承ではなさそうだし、デフォルト引数でもないし。
コンストラクタでちゅね。 引数としてClassBへのポインタを取り、vにそれを代入する
なるほど、こういう書き方もできるんですね。 ありがとうございます。
代入じゃなくて初期化だろ
初期化リストって奴だな
>>454 関数定義が必ずしも同じソース内に無くていいってのもあるんじゃない?
aaa.cから呼び出している関数定義がbbb.cにあるとき、
aaa.cのコンパイルでbbb.cまでスキャンしなきゃならないなんてコンパイラには知りようがない。
>>452 非MFCのウィンドウアプリケーションならメインのウィンドウへWM_CLOSEをSendMessageで送る。
ウィンドウを表示しないアプリケーションならexitで問題ないはず。
MFCは知らない。
でもプロトタイプなくてもコンパイル通るよね
>>462 警告出てないか?
もしくは警告レベルを低く設定していないか?
464 :
そうべえ :2006/11/09(木) 07:29:06
かなり素人ですが、教えてください。 (Visual C++ 2005 Express Edtを使っています) ↓のエラーが出ます。(プログラムの★印) --- ビルド開始: プロジェクト: Date01, 構成: Debug Win32 --- InitAsign.cpp d:\initasign.cpp(14) : error C2228: '.Year' の左側は クラス、構造体、共用体でなければなりません d:\initasign.cpp(14) : error C2228: '.Month' の左側は クラス、構造体、共用体でなければなりません d:\initasign.cpp(14) : error C2228: '.Day' の左側は クラス、構造体、共用体でなければなりません Date.cpp Date01 - エラー 3、警告 0
465 :
そうべえ :2006/11/09(木) 07:30:47
プログラムは、 Date.h@とInitAsign.cppAとDate.cppBです。 よろしくお願いします! /*@■■■Date.h■■■*/ class Date { int year; // 西暦年 int month; // 月 int day; // 日 public: Date(); // デフォルト Date(int y, int m, int d); // コンストラクタ int Year() { return year; } // 年を返却 int Month() { return month; } // 月を返却 int Day() { return day; } // 日を返却 };
466 :
そうべえ :2006/11/09(木) 07:32:09
/*A■■■InitAsign.cpp■■■*/ #include <iostream> #include "Date.h" using namespace std; int main() { Date x(); // テスト cout << "X = " << x.Year() << "年" << x.Month() << "月" << x.Day() << "日\n"; return 0; }
467 :
そうべえ :2006/11/09(木) 07:33:08
/*B■■■Date.h■■■*/ #include "Date.h" //--- コンストラクタ ---// Date::Date(int y, int m, int d) { year = y; month = m; day = d; } //--- デフォルトコンストラクタ ---// Date::Date() { year = 1; month = 1; day = 1; } 以上です。(「改行が多すぎます!」ってのが出たため分割しました)
469 :
そうべえ :2006/11/09(木) 08:18:47
>>468 >>408 の方のように、理解できません。
hoge hoge1; → 正しい
hoge hoge2(); → 間違い
ということでしょうか?
括弧は必要だと思うのですが...
Date x; あるいは Date x = Date();
472 :
そうべえ :2006/11/09(木) 08:40:59
わかりました。
>>469 の書きたかった事をエスパー分析してみる。
hoge* hoge1 = new hoge;
と
hoge* hoge2 = new hoge();
の違いを知りたかったのか。
PODかそうでないかで、前者と後者の動きが違う。
PODの時は前者は領域を確保するのみ、後者は0フィルされる。
PODでない時は前者と後者で差はない。デフォルトコンストラクタが呼び出される。
>>474 エスパーする前にちゃんと前後のレスを読め
int function(i,j) int i; int j; { if( i == j ){ return i + j; } } main( void ){ int k = function(1,2); printf( "function() = %d" , k ); } 古い書き方で申し訳内が、こんな感じのプログラムを流した場合 function() = 0 って表示されるんだがこれって0が保障されてる? イマイチ、アセンブラの知識が乏しくてorz.. まぁ、そもそも、バグに保障も糞もないが・・・ ちなみに環境はAIXでVisualAge C++のバージョン6
仕様では無保証。 コンパイラの吐き出すアセンブラ次第だろうね。 if 内部の等価比較のコードに左右されそうに思う今日このごろ
>>476 returnがないときに何が戻るかと言う質問と言うことで宜しいか?
だとしたら、x86用の私の知っているコンパイラなら0になることは先ず有り得ない。
勿論1になるか2になるか、或いは他の何が戻されても不思議ではないが。
479 :
デフォルトの名無しさん :2006/11/09(木) 15:55:49
レスサンクス 478 そうそうreturnで値を返してない時の動作ッス ふむ、やっぱり不定値って事だよねぇ
プログラム実行してたら、ループの途中で killed って表示されてそこで止まったんですが、これは何なんでしょうか? ぐぐってもわからなかったorz
環境をかいてくだはい。
482 :
デフォルトの名無しさん :2006/11/09(木) 19:48:28
Windows XP SP2でVisual Studio Express Edition C++を使っています。 .NET無しで作りたかったので、「共通ランタイムサポート」を 「共通言語ランタイム サポートを使用しない」に設定したところ、 「error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。」 みたいなエラーがたくさん出力されました。 「共通ランタイムサポート」を「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」にすると、 正常にコンパイルできることは確認しております。PSDKもインストールしております。 どなたかスレ違いでなければ、どうすればコンパイルエラーをなくすことができるか教えていただけませんでしょうか?
>>483 System が含まれている共通言語ランタイムのサポートを使用するといいよ。
>>484 そうですか…
どうもありがとうございました。
managedとunmanagedで調べるといいと思うよ
>485 名前空間Systemにあるものは全て.NET Frameworkのクラスライブラリ。 .NET無しで作るとは、これらを全く使わないということ。 (名前空間Microsoft以下も同様)
>>476 eaxレジスタにごみが入っていればごみが戻り値になる
>>488 AIXだからx86系のCPUとは限らんのとちゃう?
戻り値が返ってこない場合があると言われるんじゃ
Fedora Core5でgccを使ってプログラムを書いています。 fprintfでファイルに書き込む際に、OSの書き込みバッファは使われるのでしょうか? それとも、バッファを自分でプログラムする必要があるのでしょうか? あるいは、これは、OSに依存するのでしょうか? 一文字ごとに出力するのと、100文字まとめて出力するのでは、 処理速度に大きな違いが出るので、自作プログラムから書き込みバッファがどのように使われるのか知りたいのですが。
>>491 setbuf, fflush を調べてみよう
どっちかというとprintfのオーバヘッドじゃないかなあ。 まずはfputc,fputs,fwriteあたり試したほうがいいような。
fprintfのオーバーヘッドなんてたいしたことないんじゃないの? 試したことないけど。
#define MAX 256 int _tmain(int argc, _TCHAR* argv[]) { wchar_t* t[MAX]; for(int i=0; i<10; i++) { wchar_t buf[MAX]; swprintf_s( buf, MAX, L"test%d",i); t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX); wcscpy(t[i] ,buf); } for(int i=0; i<10; i++) printf("%s\n",*(t+i)); getchar(); return 0; } test0,test1,test2...と表示させたいんですが、 頭の一文字目しか表示されません。何を間違えてるんでしょうか・・・?
locale 関係の問題じゃない?
wchar_t* t[10]; for(int i=0; i<10; i++) { wchar_t buf[MAX]; swprintf_s( buf, MAX, L"test%d",i); t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX); t[i] = buf; } for(int i=0; i<10; i++) wprintf(L"%s\n",t[i] ); getchar(); 上手く行ったと思ったんですが、全部test9でした。 t[i]に入れてるのに、なぜ全部の要素に一つのアドレスが 入ってしまうのでしょうか?
t[i] = buf; ↓ wcsncpy(t[i],buf,MAX); とか
見事解決しました。
ありがとうございました。
wchar_t* t[10];
for(int i=0; i<10; i++){
t[i] = (wchar_t*)calloc(MAX,sizeof(wchar_t));
swprintf_s( t[i], MAX, L"test%d",i);
}
for(int i=0; i<10; i++)
wprintf(L"%s\n",t[i] );
でもなんで
>>497 は失敗するんでしょうか?
t[i] = bufがt[0-9]=bufになる理由がわからない。
ポインタ難しい。
>t[i] = buf; こんなん書いてりゃ当たり前じゃん
wchar_t** t = (wchar_t**)malloc(sizeof(wchar_t*));
for(int i=0; i<10; i++)
{
wchar_t* buf;
buf = (wchar_t*)calloc(MAX,sizeof(wchar_t));
t = (wchar_t**)realloc(t,sizeof(wchar_t**)*(i+1));
swprintf_s( buf, MAX, L"test%d",i);
t[i] = buf;
}
for(int i=0; i<10; i++)
wprintf(L"%s\n",t[i] );
free(t);
getchar();
return 0;
できました。
ノートにひたすら図形書きながらぽちぽちと・・・・。
ちょっと悲しくなりました。
>>500 なぜですか?
コンパイラ : VC++2005 class foo{ static const int var0=1000; static const double var1=0.123;//コンパイルエラー }; なぜ整数型しか初期化してはいけないんですか。
コンパイルエラーの内容は?
> for(int i=0; i<10; i++)
> {
> wchar_t buf[MAX];
> swprintf_s( buf, MAX, L"test%d",i);
> t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX);
ここでt[i]に動的確保した領域のポインタを代入する
> t[i] = buf;
しかしここでbufへのポインタを代入する。動的確保した領域は迷子。
やりたいのはt[i]の指す領域にbufの内容をコピーしたいんだろ?
> }
さらにブロックを抜ける。bufの記憶域期間終了。しかしそれを参照しつづけるt[]。ぃゃん
つーか
>>501 はまったく出来てないよ。
>>497 >t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX);
>t[i] = buf;
もしかして、mallocで確保した領域にbufの内容をコピーしているつもりか?
上の式ではそんなことをしていない。
mallocで確保した領域のアドレスはt[i]にいったん格納しているが、
そのあとに、それをすててbufのアドレスで上書きしているだけ。
ついでに言うと、bufはfor文のブロックの中で宣言されている。
for分のブロックを抜けたあとには参照してはいけない。
参照しても、以前自分が設定していた値が入っているとは限らないし、
更新すれば他で使用しているメモリ領域を壊すことになる。
全部test9が入っていたのはたまたま10階のループですべて同じ領域を指しており、
最後にループを抜けたとあとにもそこが壊されていなかっただけ。
>>503 エラー : C2864
整数型は初期化できてもそれ以外が初期化できないのはどうしてだろうという疑問。
>>506 ふーん。g++(gcc) では通るけどなあ。
VC2005特有の仕様なのか・・・
>>507 -pedantic つけると通らない。
あとVC6だとintもダメ。
510 :
507 :2006/11/11(土) 12:03:40
なるほど ISO C++ が非int の初期化を認めてないのね。 さんくす。
技術的な問題ではなく、単なる技術的な部分に依存しない仕様?
タイトルに初心者歓迎と入れてるくせに 本当に初心者来たらからかって終わりじゃん プログラマとここの回答者はみんな死ねばいいのに
グフ。
上手く行ったと思って眠りについたら、
朝見直してみて全然上手く行ってないことに気付きました。
>>504 >>505 そうですね。いろいろいじってる内にわけわからなくなってました。。。
もう一度考えてみてこんな感じかなと思ったんですが、どうでしょう。
wchar_t** t = (wchar_t**)malloc(sizeof(wchar_t**));
for(int i=0; i<10; i++)
{
t[i] = (wchar_t*)calloc(MAX,sizeof(wchar_t));
swprintf_s( t[i], MAX, L"test%d",i);
}
for(int i=0; i<10; i++)
{
wprintf(L"%s\n",t[i] );
}
表示はちゃんとされますが、free(t)とかfree(t[i])とかすると落ちます。
やはり最初の一行目は間違ってるんでしょうか。
でもこれをつけないと表示にすら届きません。
10個だって分かってるのに何でmalloc使ってんだよ。 しかも1個だけしか確保してないし。
>>512 初心者のうち、やる気があり且つそれが文章から伝わる場合のみ歓迎。
ていうか別に「からかって終わ」ってないし。 すぐ下で「初心者」がちゃんと会話を成立させてるあたり 512のピエロっぷりが際立っててグー。
t[i] と *(t+i) は等価値なんだ。ポインタにとってはね。
>>506 俺はこう思っている。
そもそも導入されたきっかけが、#defineの置き換えを意図しているため。
だから、整数型さえその場で定義できれば十分だ(実際そうなっている)。
>>518 #define による定数の定義は浮動小数点型でも文字列リテラルでも可能だったわけだが。
M_PIとかISO C++だとどうしてるの?
bool func(){ #ifdef DEBUG if(hoge) return false; #endif return true; } int main(){ if(func()) hogehoge; } このような関数の場合、DEBUGが定義されていない時は、 最適化されてfunc自体が呼び出されないことを期待できるのでしょうか?
#ifdef DEBUG #define func() (!hoge) #else #define func() true #endif のほうが最適化してくれる可能性が高そう
>>520 ISO C++ に M_PI は定義されていません。
とりあえず #define が削除されたわけじゃないんで、
C で定義されていた定数は互換性のためにそのまま
残っています。
"Standard value" とされて "Standard macro" とは
分離されているので、マクロとするかどうかは処理系が
自由に決めていいのかもしれません。
>>513 t[0]〜t[9]に値を格納したいなら、tは10個分の(wchar_t*)が格納できるサイズで確保すること。
freeで落ちたのは、t[1]〜t[9]に書き込んだ際に、壊してはいけない領域を壊したため。
Windows2000、VC++7、Unmanagedでやってます switchの動作が理解不能な動作してて困ってるんですが switch(hoge) { case 値A 式A break; case 値B 式B break; case 値C 式C break; case 値D 式D break; default: 式E break; } こうしてデバッグで追ったところ、hogeの値が値Bなのにも関わらずdefaultに跳んでました なんでcase 値Bに行かないんでしょう?
>>527 hogeの値は本当にBか?
まさかhogeとかBが文字列だったりしないよな
コロンは?
>>528 Bです
値Bは0x8002で、hogeはshort型で中身も0x8002なのデバッガで確認しました
>>529 省いてますが
元の文にはちゃんと書いてます
値Bは、直で 0x8002 って書いてる? それともなんかの変数? 変数なら型は?
>>513 #include <stdio.h>
#include <stdlib.h>
#define N 10
#define MAX 20
int main(void) {
int i;
wchar_t** t = (wchar_t**)malloc(sizeof(wchar_t*) * N);
for(i = 0; i < N; i++) {
t[i] = (wchar_t*)malloc(sizeof(wchar_t) * MAX);
swprintf_s(t[i], MAX, L"test%d", i);
}
for(i = 0; i < N; i++) {
wprintf(L"%s\n", t[i]);
}
for(i = 0; i < N; i++) {
free(t[i]);
}
free(t);
return 0;
}
>>531 #define HOGE 0x8002
で、case HOGE: というような定数式で書いてます
short が 16bit だと 0x8002 という値は -32766 として解釈される。 一方、0x8002 と書くと int なので 32770 として解釈される。 従って異なる値として処理される。 hoge を unsigned short にすれば解決するはず。
あ、なるほど ということは、「#define HOGE ((short)0x8002)」でもいけそうですね どうもありがとうございました
unsigned shortだって言ってるだろカス
unsigned shortにするといいのはswitchに渡す変数の方だろ
というか、片方がsigned intで処理されてるのにunsigned shortで値だけ無理やり合わせるのは良くない
そんなことをすれば、定数値が0xffffを越えた時に絶対に一致しなくなる
>>535 のは定数値の方を変数と同じsigned shortに合わせるから値範囲の違いが是正できて現実的
少しは頭使えよカス
537のほうがカスに一票
switch-caseの判定値を不安定な型で処理するほうがどうかしてる。 「unsigned」で統一するのが常ってもんだろ
不安定か?
doubleとfloatを混ぜた式では、doubleだけの式よりも速度が落ちますか?
一文字だけcharに格納する場合は、 char x[]={'a','b','c'}; ですが、同じように、文字列{"abc","def","ghi"}を格納するにはどのように書けばよいのでしょうか?
char* x[]={"abc","def","ghi"}
>541 一般論では「そうかもしれない」。具体的な環境も書かずに正しい回答が得られると思ったら大間違い。
545 :
デフォルトの名無しさん :2006/11/12(日) 20:05:26
>>541 型変換してるので理論上は落ちるはず。自分で確認してみては?
546 :
デフォルトの名無しさん :2006/11/12(日) 21:01:39
gets(nyuryoku); if(nyuryoku[0] == '+') {・・・ という風に、if文での比較対象が半角文字だとこれでいいのですが、 2バイト文字を比較対象にしようと思ったらどうすればいいのでしょうか。 2バイトなのだから if(nyuryoku[0] == 'あ') とかじゃいけないってことはわかるのですが・・・。
nyuryoku の型は?
>>547 char型です。
char nyuryoku[30];
にしてます。
strncmp(nyuryoku, "あ", 2) == 0
w_char使えばいいと思うよ
552 :
デフォルトの名無しさん :2006/11/12(日) 21:48:29
C++ です. 以下のような擬似コードについて教えていただきたいと思います。 class A : public B {} class B : public C {} void func( boost::shared_ptr<C> val ) { ... } void main() { boost::shared_ptr<C> a( new A() ); boost::shared_ptr<C> b( new B() ); func( a ); func( b ); } は問題ありませんが, ================================================= void main() { boost::shared_ptr<A> a( new A() ); boost::shared_ptr<B> b( new B() ); func( a ); func( b ); } は型が違うとコンパイルが通りませんでした. これを問題のないものにするにはどうしたらよいでしょうか?
>>552 boost::shared_dynamic_cast だったかな
デザインパターンを解説した良書を教えて下さい´・ω・` 言語はC++でなくてもokです。。
556 :
デフォルトの名無しさん :2006/11/12(日) 22:39:20
C言語の質問です。 main関数であるファイルX.txtのfopen(),fclose()を行ったとします。 この場合、main関数内で呼び出した関数a()内では、ファイルX.txtに関してfprintf()やfscanf()を行うのは無理なのでしょうか?? というのは、main関数内で呼び出すべき関数が複数あり、また何度も関数を呼び出すので、 そのそれぞれでfprintf()等を使おうとfopen(),fclose()を記述してしまうと、ファイルのオープンとクローズを繰り返すことになるからです・・・ 何か良い方法はありませんか?よろしくお願いします。
fopenの戻り値を関数に渡しゃええじゃん
558 :
556 :2006/11/12(日) 23:07:30
>>557 int main(void)
{
void a();
char filename[256];
FILE *fp;
scanf("%s",filename);
fp = fopen( filename, "w" );
a();
fclose(fp);
}
このような場合、fopenの戻り値とはfpのことでしょうか?
a(fp);のようにfpを引数として渡せばいいのでしょうか?
560 :
デフォルトの名無しさん :2006/11/12(日) 23:29:42
外部変数のように複数の関数から引数無しで直接扱える方法は無いかなと勘違いしていただけです。 答えてくださった方、どうもありがとうございました。
じゃあ外部変数にしたらいいんじゃね?
562 :
556 :2006/11/12(日) 23:45:51
560は私です。名前抜けてすみませんでした。 561さん、ありがとうございます。 FILE *fp;の一文だけをヘッダに移動させれば、main関数内でfopen()させても、引数を一つ一つ渡さなくても可能となるのでしょうか?
なるよ
564 :
556 :2006/11/13(月) 00:04:34
>>563 どうもありがとうございました。これでファイル操作について一つ上達できました。
疑問を解消してもらえる、このようなスレは大変ありがたいです。またの時もよろしくお願いします。
グローバル変数使って解決するのは上達って言えないね。
566 :
556 :2006/11/13(月) 00:16:21
>>565 何度も顔を出してすみません。
ほかにも良い方法があるのでしょうか?差し支えなければ教えていただきたいです・・・
無限ループって怖くね?
グローバル変数が嫌われる理由って 名前がぶつかる可能性があるから? メモリ上?にずっと残ってるから?
570 :
556 :2006/11/13(月) 00:28:41
>>567 ありがとうございます。
fopen()の返戻値を引数として関数に渡すのが一番なんですね。
main関数内で関数呼び出しが非常に多いので躊躇してしまいました。手抜きはやっぱり駄目ですね。
よく変数とか関数の戦闘に_(アンダーバー)をつけてるのを見ますが あれってどういう場合に付けるとかって慣例みたいなものってあるのでしょうか?
あるよ
574 :
556 :2006/11/13(月) 00:43:25
>>572 自分の参考書には「下線で始まる名前はライブラリルーチンで用いることが多いので、使わない方が良い」と書いてあります。
このスレが”初心者歓迎”といっているのは、質問者に対してだけではなく 回答者に対しても歓迎しているという事実を今知った。
>>574 使わないほうが良い、ではなく本当に使っては駄目。
下線で始まるグローバルな名前は処理系予約。
また、下線2つあるいは下線に続いて英大文字で始まる名前はいかなる場合でも処理系予約。
それぞれただのユーザは使ってはいけない。
577 :
デフォルトの名無しさん :2006/11/13(月) 03:16:23
あほな質問だったらごめんなさい たとえばWM_LBUTTONDOWNメッセージのlParamとかで、 low-order word とhigh-order word にマウスポジションが入ってるのありますよね。 64bit環境の場合でも、やっぱり下位32bitに同じデータが入ってるんですか? それとも下位32bitがLOWで上位32bitがHIなんですか?
そんなこと気にするから互換性が取れなくなる。 MAKEPOINTS or GET_X_LPARAM and GET_Y_LPARAM が正解。
windowsでlibiconv.libを使っているのですけど、errnoが書き換え られないのです。 わざと不完全なマルチバイト文字列を入力してやると、iconvの返り 値が(size_t)(-1)にはなるのですがerrnoは0のまま。 何故だ?
Linux、C++でpopenと同じような働きをする関数とかってありますか?
JavaでいうところのforName関数(文字列を引数に取って、その文字列と同じ名前のクラスのクラスオブジェクトを返す関数) のような動きをする関数ってC/C++でありますか?
585 :
デフォルトの名無しさん :2006/11/14(火) 08:55:56
下記のプログラムでファイル名が"file_name"の中身を表示させようとすると、 最後にfinから読み取った文字列が2回出力されてしまい困っています. どこを直せばいいのでしょうか。 string str; ifstream fin(file_name); while(!fin.eof()) { fin >> str; cout << str << endl; }
while (fin >> str) cout << str << endl;
587 :
デフォルトの名無しさん :2006/11/14(火) 09:03:43
588 :
デフォルトの名無しさん :2006/11/14(火) 15:41:00
VC++6.0です。配列名って実は配列を記憶しているメモリ領域の先頭の アドレスを表すポインタだと聞きました。では、以下のようなことが 可能なのでしょうか? ていうか、できなくて頑張っているんですけど、いい方法ありませんか? つか、根本的に分かっていないのでしょうか? ==実現したい夢== ・メモリの任意のアドレスを何らかの配列に渡してやる。 ・すると、渡したアドレスを先頭にして配列のサイズだけのデータを 使って配列にデータが入っている。 例えば void main(){ int *ptr; int a[10]; &a = ptr; } とすると、ptrを先頭にして40バイト分のデータを4バイトずつa[0]〜a[9]に 割り当てて、且つint型で換算して値が入っている、なんて事です。for文で 10回まわしてもいいんですけど。 ==== でも配列から配列への参照渡しなんて同じことですよね?
589 :
デフォルトの名無しさん :2006/11/14(火) 15:55:22
>>588 ど初心者の漏れが10円玉の裏表を使って占ってみた
そしたら、出来ないと出たなり、漏れの占いは良くあたるから参考にしてね
#include<stdio.h> int main(void){ int a; if(a=1){} } これってif(a=1)の評価どうなってるの?
trueだろ
代入式は代入した値を返す そうじゃないとb=a=1とかできなくなる
>>588 式の中で配列オブジェクトは、原則としてその先頭要素へのポインタに変換されるというだけ。
簡単なプログラムを作っていたんですが、意図しない動作を起こします。
どうやらファイルを開こうとすると、この現象が起こるようです。
しかしそれ以上の原因はわかりません。。。
なぜエラーが起こるかわかりますか?
ソース
ttp://mumei24.run.buttobi.net/cgi-bin/src/up0020.txt ―――――
実行結果
<<>>は入力
1 : ファイル名:<<file1>>
2 : ファイル.\file1を開きます。
3 : le1<<file1>>
4 : ファイル.\file1を開きます。
5 : le1
3行目がおかしい!「ファイル名:」と表示されるはずなのに…。
5行目もなぜか勝手に変な表示が。
読みにくいかもしれないのでこっちにテキストをうpしました。
ちなみにコンパイラはLSIC−86の試食版です。
>>588 struct 経由したら? 以下C++ で記述。 多少遠回りすればCでも同じこと書ける(かな?)
struct TempArray {
int val[10];
};
int* ptr;
int a[10];
(TempArray&)a = *(TempArray *)ptr;
左辺に若干の怖さがあるけどね…
>>594 strcat の第一引数は、連結後の大きさを持ちえるだけの大きさの器が必要
and 文字列リテラル( ソース上の ".\\" のこと)を書き換えることはやっちゃダメ(だったハズ)
>>595 TempArrayをstruct TempArrayにするだけでC言語になる予感
>>596 ありがとうございます。
直してみます。
>>600 できないのか・・・
無知ですまんかった
>>596 できましたorz
"aaa"は4バイト分しかメモリが無いのにその後に連結しようと
したのがいけなかったんですね。
ありがとうございました。
603 :
デフォルトの名無しさん :2006/11/14(火) 17:25:28
質問です データーがA B C D・・・と大きな分類があり その個々の例えばAについてa b c とデーターが分類されている場合で ABCやabcの個数があらかじめ決まっていない場合(増えることがある) どのようにすればいいのでしょうか?
>>603 Cなら、mallocして確保した領域を
データを追加する度にreallocして拡大してみる。
C++なら、Vectorとか、その類のクラスを使ってみる。
>>602 >"aaa"は4バイト分しかメモリが無いのにその後に連結しようと
それ以前に文字列リテラルを書き換えたら鼻から悪魔
606 :
デフォルトの名無しさん :2006/11/14(火) 17:43:36
const int a = 10; const int b = a + 1; int array[a]; 2・3行目がエラーになるんですがどうすればいいでしょう。 事情があってC++にはできません。 名前空間が汚染されるんでなるべくマクロは使いたくありません。 なお、gccです。
>606 そのような動作をやりたきゃ newを使うかvector使え
あ、すまんC++できないのか じゃmallocを使え
事情があってC++はダメとかはまぁいいとして 名前空間が汚染されるからマクロ嫌とか、ワガママじゃの
611 :
デフォルトの名無しさん :2006/11/14(火) 17:55:02
>>589 占いアリガト
>>593 dクス。いろいろな見方を覚えていくことで上達を感じる。素人だけに余計に。
>>595 アイデアをアリガd。こういうアイデアは1年参考書を読み続けても思いつく
かどうかは分からないからありがたい。感謝します。
もらったキーワードを元にもう一度ググリ旅にでます。謝謝
612 :
611 :2006/11/14(火) 17:55:42
あ、漏れは588
C99ならできるだろ。
DirectXのヘッダーに以下のような記述があるのですが struct D3DXVECTOR2 { FLOAT x, y; BOOL operator == ( D3DXVECTOR2& ) const; BOOL operator != ( D3DXVECTOR2& ) const; } この中身(ソース)はどういう風に記述されているのでしょうか? FLOATをintに変えたクラスを作りたいのですが、==の多重定義をググっても 上記のようなソースのサンプルがなかなか見つからなくて… ちなみにDirectX自体はlibのみの提供のようでソースは見つかりませんでした。
普通に BOOL operator == ( D3DXVECTOR2& rhs) const { return (x == rhs.x) && (y == rhs.y); } BOOL operator != ( D3DXVECTOR2& rhs) const { return !(*this == rhs); } でいいんじゃないの?
ソースが提供されてないのにどういう風に記述されてるのかと聞かれてもな・・・ つか、正確な内容はわからずとも、大まかにどういう処理がされてるかくらいわかるだろ、そのオペレータ見ればよ
>>617 615 じゃないけど、変?
ばらして { return (x != rhs.x) || (y != rhs.y); } と書くより間違いが少ないように思うけど。
>>615 は問題ないかと
そんなことよりrhsがconst修飾されていないのがちょっと
まぁぶっちゃけ、ばらして書こうが特に問題なんて起こらんけどな
なるほど、そういう感じですか! C++は初心者なので、後ろについているconst;の意味がよく分から なかったのです。ググっても inline friend bool operator==( const Complex & a, const Complex & b ) しか見つからなくて、余計混乱していました。 みなさん、有難うございましたm(__)m
まぁ、誰もconstの説明なんてしてないが あれはそのメソッド内でメンバの値の変更など行わないという意味 読み取り専用
625 :
デフォルトの名無しさん :2006/11/15(水) 02:05:24
626 :
デフォルトの名無しさん :2006/11/15(水) 08:50:05
スレッドに関して質問です. class Hoge { public: void * hoge(void *); }; というクラスがあり、 int main() { pthread_t pth; Hoge h; pthread_create(&pth, NULL, (void *)h.hoge, NULL); return 0; } みたいなことをやりたいのですが、どうもうまく行きません. クラスのメンバ関数を別スレッドで実行するにはどうすればよいのでしょうか。
>>626 使用する関数の仕様をしっかり把握すること。
無茶なキャストをしないこと。
エラーメッセージを読むこと。
内側のブロックでmallocで確保した領域っていうのはfreeしてなければ外側のブロックから使えるんですよね? int main(void){ int a[10]; int i; for(i = 0; i < 10; i++){ int *p; p = (int *)malloc(sizeof(int)); *p = i; a[i] = (int)p; } for(i = 0; i < 10; i++) printf("%d ", *((int *)(a[i]))); return 0; } この時出力は0 1 2 3 4 5 6 7 8 9であることは間違いないんですよね?
>>628 それmallocする意味まったく無いが
630 :
628 :2006/11/15(水) 12:05:38
>>629 すいませんこれは例のためにかいたんで
*pがintじゃなくてなんかstructだと思ってください
ポインタってintにキャストして使っていいんだっけ?
>>631 一般的にはダメ。ポインタのほうがintより大きなことがあるから。
intではなくintptr_t/uintptr_tを使う。
>>628 (1)使える。
(2)多くの環境ではそうなるだろうだが、int*⇔int間のキャストは結果が処理系定義。
>>632 でもそれらの型はoptionalってことになってるからな…
void * 使えよ。
「(int*)p&~1」みたいなときに使われてる&~ってどういう意味ですか?
(int *)p & (~1)
ビット反転
windows2000/VC++6を使っております。 debugでコンパイル(_DEBUGオプション付きコンパイル?)して TRACEマクロでデバッグ文を出力しているのですが、 タスクマネージャのパフォーマンスを見ると メモリの使用量がTRACEする度に増えてしまい困っています。 TRACEを使った後に、何かをしなければいけないのでしょうか? ソースは以下です void CTest_servDlg::OnButtonStart() { while(1){ TRACE("CTest_servDlg::OnButtonStart(): debug\n") Sleep(1); } }
>>634 <boost/cstdint.hpp>
そういうもんだ。 大量に吐くんなら、ファイルにでも書けばよろし。
642 :
639 :2006/11/15(水) 21:18:02
>>641 そういうもんなんですか・・・
何か対応考えるようにします。ありがとう
643 :
デフォルトの名無しさん :2006/11/15(水) 21:24:24
再帰関数を使用しないハノイの塔って可能ですか?
>>643 スタックと局所変数の代わりに配列を使えばいいじゃん
645 :
デフォルトの名無しさん :2006/11/15(水) 22:00:32
cでコンソールアプリ作るんですけど、 コンソールで入力できる最大文字数って取得できますか?
>>643 1 から 2 へ 3 を補助領域として用いて移動する手順を求める
#include <iostream>
#include <string>
std::string hanoi(int n) {
std::string abc, bca, cab, acb, bac, cba;
for (int i = 0; i < n; ++i) {
std::string tabc, tbca, tcab, tacb, tbac, tcba;
tabc = acb + " 1->2 " + cba;
tbca = bac + " 2->3 " + acb;
tcab = cba + " 3->1 " + bac;
tacb = abc + " 1->3 " + bca;
tbac = bca + " 2->1 " + cab;
tcba = cab + " 3->2 " + abc;
abc = tabc;
bca = tbca;
cab = tcab;
acb = tacb;
bac = tbac;
cba = tcba;
}
return abc;
}
int main() { std::cout << hanoi(5) << std::endl; }
>>645 先ずはコンソールアプリとは何かから説明してくれたまえ。
さもなくば、想定している環境を示してくれたまえ。
質問です。 #include<iostream.h> int main(void) { cout<<"hello world"; return 0; } としてビルドしてもiostreamファイルが開けないとエラーがでます。 これはiostreamファイルがないのでしょうか? visual C++ 2005 Express Editionを使っています。 アホな質問かもしれませんがお願いします。
『.h』イラネ
>>648 エラーメッセージには "iostream.h" が開けないと書いてあるんじゃないか?
.h 付きの奴は古い C++ の仕様のものだから、 VC++ 2005 には無いんだろう。
本当だ VS2005Pro版SP1だけど、ついに.h付きの古いヘッダー無くなったか。
>>648 今のC++には<iostream.h>がない。
現代のC++で書くとこうなる。
#include<iostream>
int main()
{
std::cout << "hello world";
}
名前空間と言うものがC++の言語仕様に追加され、
標準ライブラリの中身は全て名前空間stdに入れられ、新しい名前のヘッダに収められている。
規格上古いC++のヘッダはなくなった。互換性のため残している処理系もあるが。
従来のCのヘッダはすったもんだの末に残されているものの、非推奨になっているはず。
新しいヘッダの名前は、
C++からのヘッダの場合単に.hをとっただけ(例外があるかもしれない)。
Cからあるヘッダの場合は.hをとって頭にcを付ける。<stdlib.h>→<cstdlib>
648はきっと浦島太郎状態なんだろうな。 VC++ 2005を使い出す前には何を使っていたんだろう?
まあぶっちゃけ俺はSTLportをVC8に入れてるんで問題ないけどな 古い参考書で勉強したいならSTLportを入れるといいよ
656 :
648 :2006/11/16(木) 02:47:23
>>649-655 ありがとうございます。
無事ビルドできました。
Cの勉強をしている時は<stdio.h>でもビルドできていたので特に考えずに書いていました。
C++の勉強を始めた元Java屋です。 1つ参照戻し(っていうのが一般的なのかな?)について質問させてください。 今、ArrayList相当のクラスを自作しております。そのクラスの指定されたindex番号の要素 を返す場合に、指定されたindexが要素数を超えていたり、もしくは配列がまだ 初期化されていなかった場合に未定義値(NULL値)を返したいのですが、こういった場合は 参照戻しをせずにポインタを返すべきなのでしょうか? サンプルコードは以下のものです。 template <class T> T& ArrayList::get(unsigned int index) { if(this->length < index || this->list == NULL) { return NULL; } return this->list[index]; } まぁ、予想通りNULL=0なのでint値は返せませんというコンパイルエラーになってしまいます。。。 もろもろの関係で例外は使えないのですが、このようの場合はやはりポインタ型で 返すしかないのでしょうか?
658 :
657 :2006/11/16(木) 10:11:46
ああ。。。。タイポ発見。 × T& ArrayList::get(unsigned int index) { ○ T& ArrayList<T>::get(unsigned int index) { の間違いです。
>>657 その通り
参照を返したのならば、std::out_of_rangeとかを投げる
660 :
657 :2006/11/16(木) 10:18:37
>>659 おお。早速のご返答ありがとうございます。
std::out_of_rangeですか。了解しました!
#BR○Wで使えるのかな・・・・・?
>>660 分かっててやってるんだろうけど、一応指摘しておくと、
ArrayList相当のコレクションはすでに標準でstd::vector
として存在している。
662 :
657 :2006/11/16(木) 10:29:24
げふ。。。。 std::out_of_rangeって例外なのですね。。。。 例外は使えないのです。 >661 BRE○で、std::vector(というかSTL)って使えるのでしょうか? そもそも、Cの標準関数(mallocとかstrcmpとか)が使えないので、STLも使えないんじゃ ないのかなぁと勝手に思ってたりします。
初めて知った で、 > BREW では、ANSI 標準ライブラリや、STL、Boost などの C++ ライブラリが使えません。ARM コンパイラの組込み関数も使えません。 お疲れ様です。配列の最後に番兵置くかポインタしかないんじゃないかな
番兵ってなに? センティネルのこと?
セントリー
666 :
657 :2006/11/16(木) 11:20:04
>>663 ぐへ〜。やっぱりその方法しかないみたいですね。
がんばります。ありがとうございました。
∧||∧
( ⌒ ヽ
∪ ノ
∪∪
667 :
デフォルトの名無しさん :2006/11/16(木) 11:20:25
WinXP SP2、VC++6.0です。 void *buffer; long lbytes ; lbytes = 1024; buffer = (void *)malloc(lbytes); で1024バイトのメモリを確保して、既にその中にデータが入っています。 FILE* fp = fopen("C:/test/a.txt", "w"); rc = fwrite(buffer, 4, 256, fp); で内容をファイルに書き出してバイナリエディタで見てみたら、 正しくデータが格納されているところまでは確認しています。 ここから4バイトずつ切り出して float a[256]; のa[1]〜a[255]に入れたいのですが、どうしたらよいのでしょうか? なんかヒントだけでも結構ですので下さい。お願いします。
669 :
667 :2006/11/16(木) 13:36:48
>>668 実はハナから無理なことをしていて、例えばfloat buffer[256]って宣言し
といてから値をbufferに入れてやるべきなのか、このまま進めて行って
いいのかすら分からなくなってしまって質問しているところなのです。
>>667 は初心者が2時間かけて伝わるようにいろいろ書き直した上に書き
上げた質問なので、そのあたりを斟酌していただけませんでしょうか。
素朴な疑問なんだが、そのレベルの初心者がよくバイナリエディタでデータが正しいか確認できたな。
32ビット実数なんて、結構検算だけでも難しいと思うのだが。
>>669 それはさておき、1要素分の処理はこう書ける。後はこいつの応用だ。
union {
char b[4];
float f;
} data_t;
data_t foo;
fread(foo.b, sizeof(foo), 1, fp);
printf("%g\n", foo.f); // 確認はこんな感じで
>>669 どっちでもできる。castとかでなんとでもなっちゃうのがCのいい所でもあり悪い所でもある。
実行環境があるならまずやってみろって。
で、期待通りに動かなくてわからない時に質問してくれ。ソースを晒して。
VC8です。 _beginthreadにクラスのメンバ関数を渡すとフリーズしてしまうんですが、何故ででしょうか。
偶然メモリの破損箇所にアクセスでもしたんだろ ('A`)
偶然といわれても、いつもフリーズしてしまうんです。 デバッガで確認するとスレッドは実行されてるみたいなんですが、応答無しになってしまいます。 普通の関数を渡すとうまくいくんですが・・・。
無茶なキャストはやってはいけません。
676 :
675 :2006/11/16(木) 14:24:27
677 :
667 :2006/11/16(木) 14:53:54
>>670-671 freadを使えばよかったのか。いろいろ有難う。
それでできるとわかれば早速リトライです。
ほんとに初心者ですんません。
fwrite使っててfread思いつかないってどんなだよw
679 :
デフォルトの名無しさん :2006/11/16(木) 16:27:27
条件文の真は常に1ですか?
680 :
667 :2006/11/16(木) 16:29:00
freadのfがファイルのFだと思っていたので、メモリ上のブロックデータに 対してアクセスするのに使えるとはよもや思わんかったと言うことです。
ネコジュース吹いたw
確かに f??? 系で FILE* の取る位置が一貫してないけどサ… ちょっと酷くない?
683 :
デフォルトの名無しさん :2006/11/16(木) 17:09:01
>>682 可変個引数のもの以外は全部最後部に統一されてる。
要するにprintf系が例外なだけ。
>>684 fseek,f(get|set)pos
686 :
デフォルトの名無しさん :2006/11/16(木) 17:49:41
以下のプログラムで、 定期的にファイルから数値を読み込み、処理を行いたいのですが、 while(1)ループの2回目以降のファイルの読み込みが実行されまん。 どこを修正すればいいのでしょうか。 float loadavg,time; ifstream fin; while(1){ fin.open(file_nam); while(fin>>loadavg){ fin>>time; /*loadavgとtimeに関する処理*/ } fin.close(); sleep(60); }
687 :
デフォルトの名無しさん :2006/11/16(木) 18:34:42
例えば #include <stdio.h> #define BUFFMAX 256 int main() { char buff[BUFFMAX]; printf("文字列を入力してください:\n"); scanf("%s", buff); return 0; } 上のプログラムを実行した場合、自分の環境ではscanf("%s", buff); に対して入力できる文字数が127文字なので確保する領域はBUFFMAXで十分だけど 他の環境でコンパイルしたり実行したりしたら入力できる文字数が違ってくるので 256文字以上入力したら余分なメモリを書き換えてしまいます。 入力に対する文字数の上限が定義されているヘッダとか取得方法ってありますか? (又は、このbuffに対する十分な領域、ってどれくらいですか?)
>>687 その例ならば、scanf("%255s", buff);とすればバッファオーバランは防げる。
#残りを読み捨てるなどの処置も必要ではあるが。
689 :
デフォルトの名無しさん :2006/11/16(木) 18:57:36
C++でポインタ型をconst付きの参照型にキャストするにはどうしたらいいですか?
>>689 int* pHoge;
int& rHoge = *pHoge;
だがキャストする必要性を感じない
691 :
デフォルトの名無しさん :2006/11/16(木) 19:13:16
float data[1024]; void *data; 同じモジュール内でこんな宣言をした場合ってどうなるの? floatのdata[1024]とvoidのdataが別々に存在できるの?
692 :
デフォルトの名無しさん :2006/11/16(木) 19:16:54
ファイルaaa.cをコンパイルするのにgmake(gcc?)を使っているのですが、 aaa.c内で使用している関数をbbb.cに記述している場合は ファイルの中身やコンパイル文のオプションはどうしたらよいのでしょうか?
>>691 自分でやってデバッグしてみりゃいいだろ
>>672 (非静的な)メンバ関数へのポインタは、通常の関数へのポインタとは別物。
でもテンプレートを使えばどうにでもできる。
#include <boost/bind.hpp>
template<typename T>
void ThreadEntry(void* p)
{
(static_cast<T*>(p))();
}
template<typename T>
uintptr_t BeginThread(T fn, unsigned stackSize = 0)
{
return _beginthread(ThreadEntry<T>, stackSize, &fn);
}
struct Foo
{
void Bar();
};
void Hoge()
{
Foo obj;
BeginThread(boost::bind(&Foo::Bar, obj));
}
>>695 BeginThread() 抜けたら fn が消えてあぼーん。
697 :
692 :2006/11/16(木) 20:38:30
>>694 bbb.cをbbb.hにしてinclude<bbb.h>とすると読み込まれるということでしょうか?
.cファイルのまま使う方法はないのでしょうか?
もっと基本的な勉強ができてないようだ
700 :
692 :2006/11/16(木) 20:56:08
構造体についての質問です。 struct HOGE { int height, flag; }; struct MOEMOE { struct HOGE *hoge[10]; struct HOGE hoge0[10]; }; struct HOGE *func_hoge(struct MOEMOE *moemoe) { struct HOGE *hoge; int i; for (i = 0; i < 10; i++) { if (moemoe->hoge[i].flag == 0) { hoge = &moemoe->hoge0[i]; hoge->flag = 1 hoge->height = -1 moemoe->hoge[i]->height = 100; return hoge; } } return 0 } という関数があった場合、1.return hogeでhoge0[i]のアドレスが返されるのは、 hogeがポインタだからですよね。構造体タグは構造体のアドレスを返すといった配列みたいな決まりはないですよね。 2.moemoe->hoge[i]->height = 100;はmoemoeのメンバであるhoge(hoge0のアドレスが入っている)のメンバの height(実質hoge0のheight)に100を代入すると言う意味で良いんですよね。
>>701 ソース貼るん前にコンパイルぐらいしとけ。
>>692 % cat aaa.c bbb.c > ccc.c
% cc ccc.c
>>701 どこにも、MOEMOE::hogeにMOEMOE::hoge0のポインタが保持されてる事実を裏付ける記述が無いが
まぁ保持されているという前提で考えようか
1. func_hoge内で宣言されているhogeがHOGEのポインタを保持するための変数であり
途中の処理でhogeにhoge0[i]のアドレスが取得されているから、return hogeでhoge0[i]のアドレスが返される
配列のような動作は構造体にはない
2. moemoeのメンバであるhogeに保持されているアドレスが示すところのHOGE構造体変数のheightメンバに100を代入する
最初に指摘したように、提示されたコード内にはなんら裏付ける記述がないのでhoge0のheightに代入するかは不明
あと蛇足だが、最後のreturn 0はreturn NULLにしといた方が無難
>>704 > あと蛇足だが、最後のreturn 0はreturn NULLにしといた方が無難
んー。なんでかなー?
なんでだろうねー。考えてごらんなさい。
>>704 NULL なんて使わなくていい。わざわざヘッダのインクルードを確認するのも面倒。
オマエみたいに何かを誤解する奴も増える。
708 :
デフォルトの名無しさん :2006/11/16(木) 22:30:41
質問です。 繰り返し回数の多いループ内では メンバ変数を呼び出すと処理時間が 遅くなるので、ループの外でいったん ローカル変数に値を入れるようにして、 ループ内ではローカル変数だけを 使うようにしたほうが、処理時間は 短くなるという話を聞いたんですが 本当でしょうか?
基本すぎて役に立たない回答だな
>>708 ようするに*thisから間接アクセスするからって話だろ。
CPUによっても違うし、コンパイラによっても違う。
>>708 メンバ変数だと、それが指している先のaliasが存在しないことを
証明するのが非常に困難なので大多数のコンパイラでは遅くなるでしょう。
>709-712 ありがとうございました。 1回走らせると時間かかるので 試す前に知ってる人がいたら・・・ と思って質問しました。 面倒がらずにきちんと実測する ことにします。
714 :
◆mI7lo1ZRb6 :2006/11/16(木) 22:42:15
だが断る
716 :
デフォルトの名無しさん :2006/11/16(木) 23:10:02
しかし断りを断られた
>C++,mod_perl,P2Pが使えるコーダ >P2Pが使えるコーダ >コーダ 小学生からやり直し
実はコーダじゃなくてダカーポだったんだな
合い言葉は Bee!!
>>719 コーダでそれが出てくるとは。懐かしい名前を思い出したよ。
大学時代の友人の部屋には、その手の雑誌がいっぱい転がってたので、いつの間にか覚えてしまってたw
質問させてください。 関数の引数に想定外の値が入力さてたとき、 ・assert()でチェックするだけでいい。 ・assert()でチェック後、正常な値に丸め込んだ方がいい。 と主張して対立する両者がプロジェクトにいるのですが、 どちらが最善なのでしょうか? 私自身は前者が正しいと思っていて、 ・丸め込むコードは本来ならば必要がないもの。 ・コードが増えればバグが入り込む可能性も増える。 と考えているのですがこの考え方は正しいのでしょうか? このようなバグに対するコーディングについて なにか参考になる文献などありますでしょうか? よろしくお願いします。
國府田さんか もう隠居したかと思ったけどこの後のkanonで名雪やってるのな
正常値に丸めるならわざわざassertする意味がないじゃん
>>721 俺はプロのプログラマじゃないけど、前者が基本思想じゃないかと思う。
だいたい、assertは異常があったときはプログラムを終了させるだろう?
>>721 後者は中途半端だな。実際のコードでチェックして異常があったなら、
処理を続行するべきじゃないだろう。仕様に明記されていなければね。
assert() で済ませていいかどうかは、その入力がプログラム内で
制御可能なものかどうかによるだろう。たとえばユーザー入力に対する
チェックなら assert() では不適切。
>>721 その関数のコール元として誰を想定しているかによる。
ユーザから呼ばれる関数なら、ユーザは間違った使い方をする可能性があるから、
エラーを返すとか、丸めるとか。仕様に明記すればいい。
いきなりassertに引っかかってシステムがダウンしたら、ユーザとしては嬉しくない。
システム内部でしか呼ばれない関数なら、正しい引数が渡されなければおかしい。
assert()を使用して、不当な値が渡ってきたときに検知できれば問題が早く発覚する。
727 :
721 :2006/11/17(金) 00:14:26
>>723 >>724 >>725 回答ありがとうございます。
assertはデバッグに使用していてリリースの時には無効になっています。
説明が不足していて申し訳ありません。
関数はプロジェクトの外部から呼ばれるようなものではなく
内部だけで使用するものです。
>>727 これ以上は何も言うことはない。判断基準は理解しただろうから、あとは話し合って決めろ。
assertはあくまで内部デバッグ用だろう。 デバッグモードでユーザ向けににリリースするのはありえない。 よってassertで引っかかってユーザが云々もない。
731 :
デフォルトの名無しさん :2006/11/17(金) 02:28:13
独習始めたばかりの、ど初心者です。 何故そうなるかがわからず、お知恵を頂きたいのですが。 charbname[80][80],name[80][80]; voidmain(void) { int sw=0; printf("enter sw\n"); scanf("%d",&sw); switch(sw){ case1:{ inti=0; while(i!=1){ printf("1"); gets(bname[i]); printf("2"); gets(name[i]); i++; } } break; } } っで、whileの中の、最初のgets(bname[i])がすっ飛ばされる理由がわからなくて、知りたいのです。 本の答えを見て、scanf("%d",&sw);の部分を、sw=getche()-'0';にすると動くことはわかったのですが、 なぜscanfだといけないのか、また、getche()-'0'の-'0'の部分は、どういった処理をさせるためなのかを教えていただけないでしょうか? 使ってるソフトはvc++6.0、OSはwinxpです。 小汚いソースで申し訳ないですが、どなたかお願いします。
>>731 入力バッファにscanf("%d", &sw)で入力したデータのうち改行文字'\n'が
残り、それが次のgets()で読み取られてしまうから。
この問題を解決するには、scanf()系で統一するか、gets()で文字列に
読み込んでからatoi()などで変換するかのどちらか一方にすればよい。
733 :
731 :2006/11/17(金) 02:40:54
>>732 素早くわかりやすい回答、ありがとうございます。
このまま頭抱えたまま、朝まで寝られないかと思ってました。
解決策まで頂き、本当にありがとうございました。
4bitの型って無いの? 8bitをビットフィールドで4bitにすると4bit無駄になるからやだ。
>>731 getcher()-'0' は、getcharで読み込んだ文字(数字)を数値に変換する処理。
文字'0'のもつ値と数値0は異なる。
たとえば文字'5'が入力されたなら、'5'-'0'=5で数値の5を得ることができる。
ただし、これは文字'0'〜'9'に連続した値が割り当てられている文字コードを
使用した場合にしか使えない。まあ普通の環境なら問題ないはず。
736 :
デフォルトの名無しさん :2006/11/17(金) 13:37:45
すいません、実用的なC言語のプログラムの場合あまりscanf関数は使われないと聞いたのですが
本当でしょうか?教えてくださいよろしくお願いします。
http://wisdom.sakura.ne.jp/programming/c/c58.html それから、scanf関数でぐぐったら上記のサイトが引っかかったのですが、
#include <stdio.h>
int main() {
char yn;
printf("猫耳は好きですか?y/n>");
scanf("%[yn]" , &yn);
printf("入力された値 = %c" , yn);
return 0;
このコードでscanf関数の後に[]が使われているのですがこれはなんですか?
C言語を始めたばかりの初心者なので右も左も分かりませんがよろしくお願いします。
737 :
731 :2006/11/17(金) 13:47:44
>>735 getche()のchar型からの変換処理の回答、ありがとうございました。
初心者でも大変わかりやすかったです。
scanf()ともども、色々試して覚えます。
732さん、735さん、本当にありがとうございました。
getche()を使うなら他のも cgets()、cscanf()、cprintf()に統一しろよ。
740 :
731 :2006/11/17(金) 14:01:57
>>736 同じく初心者なのですが、知っていることだけを。
scanf("%[yn] は、スキャン集合と呼ばれるもので、この場合はyとn以外のものを取らないんだったと思います。
"スキャン集合"で調べると、詳しい使い方がわかると思います。
もう一つの質問については、初心者のため、わかりません。
741 :
736 :2006/11/17(金) 14:05:00
>>740 ありがとうございます。
助かりました。
742 :
731 :2006/11/17(金) 14:05:58
>>739 まだ知らない関数です。調べて使ってみます。
ありがとうございます。
743 :
735 :2006/11/17(金) 14:07:16
>>737 ,739
getche()ってgetchar()のtypoかと思ってたら、そういう関数があったのね。
cgets()なども初めて知ったよ。勉強になりました。
>>736 >すいません、実用的なC言語のプログラムの場合あまりscanf関数は使われないと聞いたのですが
>本当でしょうか?教えてくださいよろしくお願いします。
どこで言われているのか分からないから想像で答えると、
・そこで言っている実用的なプログラムというのが今時のGUIのものを指しているので、
CUIの入力はあまり使われない。
・ユーザはこちらが望んだ入力をするとは限らない。(誤って、または意図的に。)
数値を入力させようと%dを使うと、数字以外が入力されたときにまずい。
ユーザ入力はfgetsで1行分すべて受け取って、sscanfなどで自分で解析したほうが安全。
>>745 そこの説明もなんか香ばしいな。
> fgets(buf, 200, stdin);
これで良くて
> scanf("%.199s", buf);
これで駄目?馬鹿じゃねーの。
>735 C/C++では'0'...'9'の文字コードは連続しているという前提を置いて構わない。
>747 もし仮に'0'...'9'に不連続な値を割り当てた俺様文字コードを考案したら、 それに対応したCコンパイラを実装しようとしても厳密に規格に合致させることができないってこと? (もちろん、そんなものを作ろうとは思わないけど。)
EBCDICではA〜MとN〜Zが切り離されているけど、0〜9は連続してるな。
質問させていただきます。 OnTimer関数を利用する際に、 1度目のカウントでは何も呼び出さず、 2回目のカウントで関数を呼び出すようにしたいのですが 上手く制御できません。 if(nIDEvent ==1) { int i=0; if(i=0) { i++; } if(i=1){ KillTimer(1); } こんな感じにソースを書いてみたのですが上手くいかないのです(´・ω・`) どうすればよいでしょうか…?
>>748 そういうこと。'0'から'9'までは連続していなければならないことを意味する規定が存在する。
もちろん逆順も駄目。
>>750 そのiはそのブロックに入る度に作成され0で初期化される。
staticを付けて、静的変数にしろ。
static抜け以外にも、色々間違い過ぎ。
>>750 その内容ではカウント用変数「i」が毎度確保しなおされて、永遠に1になることは無いので関数コールに行かない
カウント用変数をメンバ変数にするか、もしくはstatic宣言してみれ
さて、俺ら重婚しすぎかね?w
>751-753 (´・ω・)! 有難う御座います…; もう少し勉強してから取り組んでみます。
756 :
デフォルトの名無しさん :2006/11/19(日) 00:55:18
日本語の文章をファイルから読み込んで、 漢字の単語だけを文字列として、文字配列のポインタ配列を作る、なんてことは可能でしょうか? 例えば、 「本日は晴天なり」だったら 「本日」という文字列と 「晴天」という文字列をつくるみたいな。
>>756 文字コードがはっきりしてればできる。
わりと面倒な問題だが。
758 :
デフォルトの名無しさん :2006/11/19(日) 11:46:34
シフトJISでなら、一文字ずつ見て漢字のコード(漢字だけに使われている部分があったはず)があったら2バイト読み込みとかで
まぁ、概ね間違っちゃいないが。
iskanji()使えよ
763 :
デフォルトの名無しさん :2006/11/19(日) 12:17:52
>>759 知ったかぶりじゃないところを見せてくれ、君
765 :
デフォルトの名無しさん :2006/11/19(日) 12:43:35
環境依存のコードを書くなって教えじゃないか。 スレタイに環境依存OKと書いてある時点で何かが間違っている気がするが。
素直に「教えてください」って言えよカス
まったくだ
質問です。 "あいう えお aiu eo" のような文字列を単語ごとに分割したいのですが、次のコードがうまく動きません。 どのように書き直したらよいでしょうか? #include < iostream> #include < string> #include < deque> #include < algorithm> #include < cctype> using namespace std; deque<string> Split_String(const string& str) { string::size_type i = 0 , j = 0; string::size_type max_len = str.length(); deque<string> tmp_deque; while( i <= max_len ) { while( i <= max_len && isspace( str[i] ) ) ++i; j = i; while( j <= max_len && !isspace( str[j] ) ) ++j; if( i != j ) { tmp_deque.push_back( str.substr(i , j-i) ); i = j; } } return tmp_deque; }
771 :
770 :2006/11/19(日) 13:15:34
続きです int main() { deque<string> d; string s("multibyte is very difficult."); d = Split_String(s); //動く copy( d.begin() , d.end() , ostream_iterator<string>(cout , "\n") ); s = "まるち バイト ha muzukashii."; d = Split_String(s); //動かない copy( d.begin() , d.end() , ostream_iterator<string>(cout , "\n") ); }
>>770 マンドクセーからちゃんと読んでないが、isspace()のようなctype.hの
マクロ使う時は、何も考えずにsigned charを渡しちゃだめ。
引数が-1(EOF)〜255の範囲にあることが前提になってて、通常は
引数をそのまま配列indexとして使って表参照で判定してるから。
非ASCII文字だと、signed char→intに符号拡張した時に
負値になるような値が入ってるんで、
↑の範囲に収まらずに動作が不定になる。
isspace()に渡す前に、unsigned charにキャストしる。
char はデフォルトで unsigned char じゃなかったっけ?
775 :
770 :2006/11/19(日) 13:57:59
>>772 while( i <= max_len && isspace( str[i] ) )
を
while( i <= max_len && isspace( (unsigned char)str[i] ) )
に変えたらうまく動きました
どうもありがとうございます
776 :
773 :2006/11/19(日) 14:01:47
>>774 辞書見たら不定って書いてあったよ。orz
>>775 工エエェェ(´ロ`ノ)ノェェエエ工
#include <cctype>
#include <cstdlib>
#include <locale>
using namespace std;
deque<string> SplitMultiByteString(const string& str) {
deque<string> words;
int len_char;
string::size_type first = string::size_type(), last, length = str.length();
locale previous = locale::global(locale("japanese", locale::ctype));
while (first < length) {
while (first < length && (len_char = mblen(&str[first], MB_CUR_MAX)) == 1 && isspace(str[first]))
first += len_char;
last = first;
while (last < length && ((len_char = mblen(&str[last], MB_CUR_MAX)) == 1 && !isspace(str[last]) || len_char > 1))
last += len_char;
if (first != last) {
words.push_back(str.substr(first, last - first));
first = last;
}
}
locale::global(previous);
return words;
}
>>778 ぶっちゃけASCIIのスペースと被るようなマルチバイトエンコード系を知らんのだが、
あったっけ?
バックスラッシュ等がShiftJISの2byte目と被るのは有名だが。
初めまして。書籍を参考にしながら独自コードに直している間につまづきました。 static修飾子について質問させてください。 static修飾子をつけた同じクラスのメンバにアクセスさせると、 コンパイル時にリンクエラーになります。 参考にした書籍にはそのように載っているので、何か条件があるのだと思いますがわかりません。 何から疑っていったら良いでしょうか。 具体的には、下記のようなコードの場合にエラーになります。 class CWindow { public: HWND RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY); protected: static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static CWindow* m_static; }; LRESULT CALLBACK CWindow::_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CWindow* p = m_static; // こいつがいけないらしい } HWND CWindow::RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY) { m_static = this; // これもいけないらしい }
もうそれ秋田。書き込んだの何スレ目だよ。
782 :
778 :2006/11/19(日) 14:54:09
>>779 正直なところ俺も知らない。ただ、マルチバイト文字列の扱いの勉強になるかなと思って。
783 :
デフォルトの名無しさん :2006/11/19(日) 14:58:11
C++では、Javaみたいにオブジェクトを保存/読み込みできるのでしょうか。
>>783 Java みたいにはできません。
boost::serialization を使ってみる?
785 :
デフォルトの名無しさん :2006/11/19(日) 14:59:45
先生すいません。 環境変数の設定が出来ません、前にジャバで変数を変えたときがあるんですがそれが原因ですか? 原因だとしたらどーやれば元に戻せますか?? 教えてください。。。
>>780 m_staticが、宣言しかされていない。実体を定義する必要がある。
どこかのソースファイル(ヘッダ以外)にCWindow* CWindow::m_static;とでも書いとけ。
788 :
デフォルトの名無しさん :2006/11/19(日) 15:06:05
>786 すんません。 OS借り物なのでマニュアルがありませんです。 だめですか???
789 :
デフォルトの名無しさん :2006/11/19(日) 15:06:44
「マイコンピュータ」→「プロパティ」→「詳細」タグ 以下略
790 :
780 :2006/11/19(日) 15:15:11
借り物っておめぇ・・・
盗むことを借りると訳すのはDQNの典型
やっぱ天然がたまに見せる切れ味には勝てんわ。
C++ソースファイルの拡張子ってどれが正しいんですか? .C .cc .c++ .cpp .oc
797 :
デフォルトの名無しさん :2006/11/19(日) 17:54:29
>>794 標準で定められた拡張子は無い。
.C は Windows で .c と区別できないからやめたほうがいい。
.oc は ObjectiveC じゃないか?
.c++ワロタw
C#ならどうするつもりなんだろう…
インライン関数の宣言をヘッダに書いて、定義は別に書くとインライン展開されませんか?
書き忘れました。 コンパイラはVC2005です。
グローバルな最適化オプションなら、もしかしたらインライン展開されるかも。 いずれにせよ、そうなるかどうかは、関数の評価しだい。 インライン展開しないほうがいい場合もあるし。
VisualStudioを買おうと検討しています。 2005 Standardには2003.net相当のものが含まれていると考えてもいいでしょうか? やりたいことは、 1.ネットワーク上からデータをダウンロード 2.上記ダウンロードデータよりデータベースを作成 3.上記データベースより数値計算をおこなう というものです。 .netバージョンだとネットワークとのインターフェースのライブラリが あると聞いたので2005には標準でついているのかどうか知りたいです。 よろしくお願いします。 (スレ違いなら最適なスレに誘導していただけると幸いです。)
お前は「Visual Studio」でスレタイ検索かけることも出来んのか?
807 :
805 :2006/11/19(日) 20:55:24
i|!| |i┏┓! i!┏┳┓| |||i|!i| ||!i|| |||ii| ||| ||| |i||!|i│i!┏┓i!| |i|┏┛┗━╋┻┛|i!||!|ii|| i|!i||i|┏━┓ ┏┓i|i| i┃┃i!| i||┗┓┏┓┃||i┏━━━━┓┗━┛ ┃┃|i||!i┃┃i!| |i |!|i┃┃┃┃i||┗━━━━┛|i|| || ||||!┃┃i|i| i┗┛!i| i||i ||┃┃┃┃|! |||i ||i !|||!|┏━━┛┃|i||!i┏┓i|! |i!i |!┗┛┗┛i|!i| / | / | ┗━━━┛i|i| i┗┛i!| i| |||i|!i| ||!|i||i! /,_ ┴─/ ヽ |!i| ||| |i||!|i|i|||| ||i |i|| ||i!i|| (_゜.,》.'(_゜,》)ミ ヽ ! | |!i||!|ii||!|ii| i|ii / ,,__,ニ、、 ノ( | i|i!|i| |i | Y~~/~y} `, ~ | そ、そんなー… |i !. | ,k.,.,!,.,.,r| ,! く | i / <ニニニ'ノ \ l
808 :
805 :2006/11/19(日) 21:01:45
すんません。浅はかでした。 スレ検索してそちらで聞きます。
809 :
809 :2006/11/20(月) 01:43:42
BirthDayクラスはコンパイルできたのですが、IDクラスがコンパイルできません。
ID.cppをコンパイルすると、
BirthDay.h 1: 'BirthDay' の宣言が複数見つかった
BirthDay.h 1: 一つ前の 'BirthDay' の定義位置
とBirthDayクラスのヘッダでエラーがでます。
どうなっているのでしょうか。
ttp://www.geocities.jp/mwada11/index.htm
>>809 取り敢えずIDクラスが二回宣言されてるから一回にしろ
>>809 いついかなるときも、ヘッダファイルにはインクルードガードを書くクセをつけましょう。
cppが同じヘッダはスルーするようにすればいいのに。
815 :
デフォルトの名無しさん :2006/11/20(月) 12:58:36
特殊仕様が欲しいなら自分で作ればいいのに
12分
VC8 (2005) を使っています。 自作のライブラリ mylib.lib の中に main 関数があり、そこからユーザー定義の mymain を呼ぶ形になっています。 フレームワーク的に #include "mylib.h" int mymain(void) { return 0 ; } と書いただけのソースをコンパイルし、リンクしようとすると「エントリー ポイントを定義しなければなりません。」と怒られます。 mylib の中にある関数やオブジェクトを参照すればリンクも通るのですが、 プログラムによって使うかどうか分からない関数をフレームワークソースで呼んだりするのもアレな気がします。 この場合どの様にするのがスマートでしょうか?
11分
>>818 main()をライブラリの中に入れることが根本的に間違い。
> この場合どの様にするのがスマートでしょうか?
・main()が入っているオブジェクトをライブラリから抜き出して「リン
クするときはxxx.objもリンクしてください」とする。
・main()をmylib_main()に改名して「あなたのコードのmain()で
mylib_main()を呼んでね」とする。
>>818 VC++ベッタリの方法だが。
#pragma comment()
でどうにかならんか。ヘルプ見てみ。
#pragma comment(linker, /include: シンボル)
で、シンボルを強制的に取り込むことができるはず。
質問です。 _itoa_s関数の第四引数にvalue の基数 (2 〜 36 の範囲内で指定する必要があります)。 とあるのですが、意味がよくわかりませんでした。 ここには実際にどのようなデータを入力したらよいのでしょうか?
824 :
822 :2006/11/20(月) 20:57:14
825 :
初心者 :2006/11/20(月) 22:04:59
C++でハッキングを作るにはどうすればよいですか? 注:私の質問に対して煽りで返す不届き者がいるようですが、 そのような方は発言するだけ無駄ですのでお黙り下さい。 ちなみに私の友達には2ch管理者さえも畏れるハッカーがおり、 あまりにも礼を欠く発言に対してはそれ相応の「処置」をとらせていただくことを ご承知下さい。なお、質問に対して有意義な答えを下さった方には 感謝します。
>>825 きみの友達の方が詳しいからそっちに聞いた方が良いと思うよ。
827 :
初心者 :2006/11/20(月) 22:15:05
>>826 やはり自力でやらなければ意味がないのでここで質問しました。
出来ればもっと有意義なレスを期待します。
829 :
初心者 :2006/11/20(月) 22:18:01
もういいです。 皆さんにはそれなりの制裁を下すのでそのつもりでいてください。
ふむ、楽しみができた。
態度がやけにでかいとおもったらやっぱり朝鮮人か。 祖国に帰れ。
>>827 >自力でやらなければ意味がない
いや、だからこそ、その友達に色々聞いて自分でプログラム組めばいいんじゃない?
だから釣りだって
>ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る >ハッキングを作る
愛用していたC++コンパイラに2時間と10分餌を与えないでいたら死んでしまいました。 どうすれば生き返るんでしょうか。
あきらめて新しいのもってこい。
あきらめて新しいのもってこい。
>>835 コンパイラの種類がわからないと答えられません
839 :
836 :2006/11/20(月) 22:27:04
841 :
837 :2006/11/20(月) 22:32:40
質問です。 今現在Eclipse+CDTでC++のソフトを作っているのですが ヘッダーファイルとCPPファイルにクラスの定義と実装を分けて書いています。 コンパイラはGCCを用いています。 そこで、 test.h class testc { int hoge(); }; test.cpp #include "testc.h" int testc::hoge(){ return 1; } のように書いてコンパイルすると、 first defined here multiple definition of `testc::hoge()' と表示され、エラーとなってしまいます。 単語を調べてみたところ多重定義といわれていると思うのですが、C++の入門のHPを見ても上記の様に書かれています。 メソッドの実装方法が間違っているのでしょうか? ご教授お願いします。
そのインクルードしているtestc.hとやらはどこにある?
845 :
843 :2006/11/20(月) 23:50:31
>>844 しまった・・・
すいません、書き間違えです。
test.cppはtest.hをインクルードしています。
>>825 ハッキングは行為であるから、それに対して作るという表現は適切でないと思う。
>>843 ソースもエラーメッセージもコピペしろ。分からないのに勝手に省くな。
>>847 わかりました。全部書くとこうなります。
行数オーバーしたので2回にわかれます。すいません。
//main.cpp
#include <iostream>
#include "test.cpp"
using namespace std;
int main()
{
testc test(1,1);
cout << "HELLO" << test.hoge() << endl;
return 0;
}
//test.h class testc { private: int a,b; public: testc(int x, int y) :a(x),b(y){} testc(){} int hoge(); }; //test.cpp #include "testc.h" int testc::hoge(){ return 1; } //エラーメッセージ 重大度記述リソースフォルダーロケーション作成時刻ID 2first defined heretestc.cpptest行 32006/11/20 23:47:164426 2multiple definition of `testc::hoge()'testc.cpptest行 32006/11/20 23:47:164425
とりあえず、#include "test.cpp" は消しとけ
852 :
843 :2006/11/21(火) 00:06:18
>>851 それが・・・
#include "test.cpp"を消すと
重大度記述リソースフォルダーロケーション作成時刻ID
2error: `testc' undeclared (first use this function)test.cpptest行 82006/11/21 0:09:454428
2error: (Each undeclared identifier is reported only once for each function it appears in.)test.cpptest行 82006/11/21 0:09:454429
2error: expected `;' before "test"test.cpptest行 82006/11/21 0:09:454430
2error: `test' undeclared (first use this function)test.cpptest行 92006/11/21 0:09:454431
と、エラーが出ます。
そういうものかと思っていたのですが、ひょっとしてウチの環境がまちがっとるのか・・・
ねぇ、リンクって知ってる?
>>852 #include "test.cpp"
↓
#include "test.h"
>>849 × #include "test.cpp"
○ #include "test.h"
なんのためにヘッダファイル作ったのか、わかってなさそうだな。
で、コピペしたのにやっぱり testc.h があんのか?
そっちはエラーにならないの?
856 :
844 :2006/11/21(火) 00:18:48
>>854 ,855
エラーが消えました。ありがとうございます。
>>855 えっと、正直に申し上げますと
本当はtestc.hというファイル名で保存してあるんです。
で、最初に投稿したときにファイル名を間違えて書いてしまったので、
ややこしくなってはいけないと思い書き込み文はtest.hに修正しようとしたら見事に失敗しますた。。。
最初に間違えたときにそう訂正すべきでした。
浅慮で申し訳ないです。
ヘッダファイルの必要性から勉強し直してきますorz
857 :
デフォルトの名無しさん :2006/11/21(火) 01:14:34
質問です。 double a = 1.234; _ftprintf(fp, _T("%lf"), a); 上のようにして、double 型をテキストファイルに書き出して いるのですが、書き込んだファイルを読み込んだとき、 値が完全に復元されないのですが、復元させるような方法が あるのでしょうか? 数値自体は double の型の有効数字のみです。 開発環境は、WinXP, VS2005 です。 よろしくお願いします。
>>857 それじゃ小数点以下6桁までしか出ない。
%.20gにしておけば、大抵は誤差がなくなるはず。
>>857 あと、double型は内部的に2進数で小数を表現しているから、
10進表記で切りのいい数値だと思っていても実際には切り捨てられていることもあるよ。
>>857 値を完全に復元したいのなら、fwrite等でバイナリ保存するべき
環境: vs2005ee c/c++ マルチバイト文字を使用にチェック済み int map[4] = {0, 1, 1, 0}; for ( int i=0; i<4; ++i ) { putchar( "0A"[map[i]] ); } printf( "\n" ); putchar( "0A"[map[i]] ); を putchar( "□■"[map[i]] ); と表示したいのですが 画面表示をしようとしたのですが文字化けしてしまいます。 マルチバイト文字を表示させるにはどう書けばいいのでしょうか。
「マルチ」バイトの意味解ってる?
2バイト文字ですよね putwcharでも駄目でした
>>861 Shift_JISの漢字は2byte分消費するのでchar一個に収まらん。
変わりにwchar_tを使って
putwchar(L"□■"[map[i]]);
とするか
for (j = 0; j < 2; ++i)
putchar("□■"[2*map[i]+j]);
とでもするんだな。
for( i=0; i<4; ++i ) putwchar(L"□■"[map[i]]); こっちでは表示されませんでしたが for( i=0; i<4; ++i ) { for ( j=0; j<2; ++j ) putchar("□■"[2*map[i]+j]); } こっちでは表示されました。 ありがとうございました
>>865 putwchar() 使うんなら、
あらかじめ setlocale() 呼んどく必要がある。
ありがとうございます。 setlocale (LC_ALL, "Japanese"); を最初に追加し もう一度やってみましたが、やはり表示されないようです。
コンソールで Unicode 表示するのは、何か変なことしないと文字化けした気がする、確か
>>867 訳が分からんな。俺の環境(VC7.1だが)では以下が動作するが。
""を"japanese"に変えても同じ。
---------------------------
#include <stdio.h>
#include <locale.h>
main()
{
setlocale(LC_ALL, "");
putwchar(L'あ');
}
---------------------------
>>868 putwcharはUnicode文字列をそのままWriteする訳ではないよ。
ええ、こっちもわけが分かりません
>>869 のでも表示されません。
>>865 後者はこれでもいい。
printf("%.2s", "□■"[2 * map[i]]);
872 :
デフォルトの名無しさん :2006/11/21(火) 11:56:54
質問させてください VC++2005を使っているのですが、マクロ名の衝突を避けるために、今まで#defineで 定義していたマルチバイト、ワイドキャラの切替マクロを名前空間内にconstで定義 しようとしたのですが、下の例の様にtypedefを使わなかった時の定義がうまく 出来ません。 関数ポインタ型そのものを別の場所で使用する予定はないので、できればtypedefを 使わずに行ないたいのですが良い方法はありませんでしょうか? よろしくお願いします。 namespace Macros{ typedef int (*TYPEPRINTF)(LPCTSTR,...); #if defined _UNICODE const TYPEPRINTF Printf1 = wprintf; // OK const int (*Printf2)(LPCTSTR,...) = wprintf; // error C2440 int (*Printf3)(LPCTSTR,...) const = wprintf; // error C2270 #else : #endif } // namespace
>>872 int (* const Printf4)(LPCTSTR,...) = wprintf;
JNIでjobject⇔cobjectの変換で楽な方法を教えてください どーしてもゴリッとしたのしか・・・
>>863 2バイト文字はマルチバイト文字と言えるが
マルチバイト文字即ち2バイト文字ではない
マルチバイト文字=1文字2バイト以上の文字
JISコードだと文字列操作が大変。
printfみたいに引数の数が任意の関数を作りたいんですが、詳しくはなんてググればいいですか
可変引数 va_arg
stdarg.h
素直にASCII使っときゃ問題なんて起きないのにね。
>>882 Windows NTはUTF-16がネイティブ。
ちょwww
885 :
868 :2006/11/21(火) 21:15:34
>>881 そうそう、んで、メンバで何かをクリアしたら上手く動いたとかそんな話もあったはず。
あいまいでスマン('A`)
886 :
デフォルトの名無しさん :2006/11/21(火) 22:54:10
標準出力を関数呼び出しに中継することはできますか? pythonとかrubyとかをプログラムの中から呼び出し スクリプトが吐く標準出力などを自分で作ったGUIに描写したいです
|を使えばいいんじゃね?
man popen
VC8でfgetcしたら↑↓で補完できたけど前から出来た?
補完じゃねえやヒストリ
892 :
886 :2006/11/21(火) 23:34:48
すみません 効率などを考慮し、別プロセスとしてではなく rubyの場合だとrb_load_fileやrb_eval_stringなど pythonの場合だとPyRun_SimpleFileやPyRun_SimpleStringなど を使って実行したスクリプトの標準出力を自分で用意した関数に中継しGUIに描写したいです
るぅびぃって言語なの? HTMLを出力するうんこツールじゃないの?
中継するの意味を詳しく
同じプロセス空間内で実行すれば効率がいいと思い込んでいるのだろうか。
896 :
886 :2006/11/21(火) 23:53:28
void my_stdout(const std::string& s) { buf += s; // View 更新 } int main() { set_stdout_func(my_stdout); ruby_init(...); rb_eval_string("print \"Hello from ruby script\""); .... } set_stdout_func相当を実現したいです 上記の例ではGUIに"Hello from ruby script"と表示されます...
>>890 NT系のWindowsならできる。
VC8とか関係ない。キーボードドライバがやってる。
error LNK2019: 未解決の外部シンボル "public: char const * __thiscall type_info::name(void)const " コレって何が原因でつか?
>>898 type_info::name() が使われてるけど、適切なライブラリがリンカに渡されていない。
>>902 一応全部2005でリビルドしてるんですが・・・
元がmsvc6のソースなのが関係してるのでしょうか?
>>903 VC6 用にビルドされたライブラリ食わせてたりしない?
905 :
898 :2006/11/22(水) 01:04:17
>>904 クリーンからリビルドですし、
VSとPSDKしかみてないのですが・・・
例外部分のログメッセージでのエラー名だったのでコメントにして対処してしまいました。
原因は別で取ってきてるので。
RTTI?
>>906 RTTIが検索に引っかかったのですがPocketPC周りの情報しか見つからず放置しておりました。
詳しく教えていただけますでしょうか?
つ /GR (ランタイム型情報の有効化)
>>908 ありがとうございます。
調べましたが/GRはすべてのプロジェクトでついていました。
何が原因なのやら・・・
はて、うちのVC7で新規プロジェクト作成してtype_info使ってみたがエラーでなかったなぁ 元がVC6のソースってことだから、何か修正せにゃいけんところを見落としてるとかだろうけど・・・
とりあえずコンパイルオプションとリンカオプションコピペしてみ。 プロジェクトのプロパティからC/C++やリンカのコマンドラインって項目に載ってるから。
関数の引数が、const char*であるにも関わらず、コンパイルが通り 書きかえられちゃいます。変更できないと思うんですが、 何か間違っているでしょうか? ※環境は、Visual C++ 2005 Express Edition 日本語版です。 #include <iostream> using namespace std; void test(const char* pstr) { pstr = "abc"; cout << pstr ; } int main() { test("ABC"); return 0; }
書き換えられるのはpstrであって、pstrが指している文字列定数の中身ではないので 何も問題ないような。
>>912 そのコードで問題ないのは正常。
おまいさんがやりたいのはたぶんこっち
>void test(const char* pstr)
↓
void test(char* const pstr)
つーか、const char * const pstrでいいよ、もう。
>>913 >>914 ありがとうございます。
間違っていました。
上の例では、指しているところを変えただけでしたね。
VS2005 VC++ MFCで作ってます。 void Aaaa::bbb() { Cccc Dddd; bool (Cccc::*p_func)(void); ---(1) p_func = &Cccc::func; ---------(2) (Dddd.*p_func)(); --------------(3) } クラスCcccの関数funcのポインタを取得して実行する動作で、上記のように した場合問題ありませんが、(1)をクラスCcccに関する記述があるヘッダファイルへ (2)をCcccのコンストラクタへ記述するとコンパイルで(3)がエラーになります。 (勿論その場合(1)と(2)はコメント) この場合どうすればいいのでしょうか?
(this->*p_func)();で動くというオチ?
>>918 どっかのサイトにそれ書いてあってチャレンジしてみましたがダメでした。
何か記述間違ってたのかな?
920 :
デフォルトの名無しさん :2006/11/22(水) 17:27:49
教えて神さま class A{ //メンバ class B; ・・・ } 見たいのがあってclass Bを拡張したとき class C : public B{ ・・・・ } で、Bを拡張したclass Cをメンバに持つclass Dを書きたいんだけど class D{ //メンバ class C; ・・・・(ほとんどAといっしょ) } なんかすっきり書けないっすかね。。
>>920 こんな感じで。
class BC {...}
class B : public class BC {...}
class C : public class BC {...}
class AD {
//メンバ
class BC* hoge;
}
class A : public class AD {
//メンバ
class B hoge_b;
A() { hoge = &hoge_b; }
}
class D : public class AD {
//メンバ
class C hoge_c;
D() { hoge = &hoge_c; }
}
922 :
デフォルトの名無しさん :2006/11/22(水) 18:00:32
920 >921 m(_ _)m なんでc++ってインターフェースないんすかね
それだけではわからないが、場合によってはAをクラステンプレートにしたほうがいいかもしれないと思う。
/libpathの指定でProgram Filesみたいな空白のある場合ってどうすればいいのでしょうか? #pragma comment (linker, "/libpath:\"/Program Files/XXX/lib\" ") としてみましたがうまく動いていないみたいです includepathの指定も#pragma でできないのでしょうか?
どう見ても、肝心のパス部がクォートされてないんだがな
>>921-922 BC に必要なインターフェースをきっちり抽出していれば、
A, D は要らなくて AD だけで済むんじゃないの?
>>917 エラーメッセージ貼れ。できればエラーの出るソースもな。
>>924 多重継承を使う人は頭が悪いスパゲッティ君
Java/C#でもインタフェースの多重継承は認めない人ですか。
せ、先生〜! スパゲッティが食べたいです!
,. ‐''三ヾ´彡シ,=`丶、 /'".:=≡ミ_≧_尨彡三:ヽ、 //.:;:彡:f'"´‐------ ``'r=:l /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉 'y=、、:f´===tr==、.___,. ==、._ゞ{ {´yヘl'′ | /⌒l′ |`Y} ゙、ゝ) `''''ツ_ _;`ー‐'゙:::::l{ あきらめたら? . ヽ.__ ,ィnmmm、 .:::|! ,.ィ'´ト.´ ´`"`"`゙″ .::::;' イ´::ノ|::::l \ "' :::/ ::::::::::::|:::::l ヽ、 ..:: .:::/.、 :::::: ::: |:::::ヽ ヽ、.......::::/..:::/!\\ ::::::::::: |::::::::ヽ ``''‐--ァt''′ |!:::ヽ:::\ :::::::::::::|::::::::::::ヽ、 /i|iト、 |l:::::::ヽ:::::\ :::::::::::::|::::::::::::::/:ヽ、 ∧|i|i|i|〉. ||::::::::::ヽ:::::::\
ここで長年の疑問、なぜナポリタンス(ry
じゃあ僕はインスタントラーメンちゃん!!
Objective-CじゃなくてC++を使う人は頭が悪いスパゲッティ君
__,冖__ ,、 __冖__ / // ,. - ―- 、 `,-. -、'ヽ' └ァ --'、 〔/ / _/ ヽ ヽ_'_ノ)_ノ `r=_ノ / / ,.フ^''''ー- j __,冖__ ,、 ,へ / ,ィ / \ `,-. -、'ヽ' く <´ 7_// / _/^ 、`、 ヽ_'_ノ)_ノ \> / / / _ 、,.;j ヽ| n 「 | /. | -'''" =-{_ヽ{ ll || .,ヘ / ,-、 | ,r' / ̄''''‐-..,フ! ll ヽ二ノ__ { / ハ `l/ i' i _ `ヽ l| _| ゙っ  ̄フ.rソ i' l r' ,..二''ァ ,ノ |l (,・_,゙> / { ' ノ l /''"´ 〈/ / ll __,冖__ ,、 > >-' ;: | ! i { l| `,-. -、'ヽ' \ l l ;. l |D言語| ! |l ヽ_'_ノ)_ノ トー-. !. ; |. | ,. -、,...、| :l ll __,冖__ ,、 |\/ l ; l i i | l ll `,-. -、'ヽ' iヾ l l ;: l | { j { |l ヽ_'_ノ)_ノ { |. ゝ ;:i' `''''ー‐-' } . n. n. n l | ::. \ ヽ、__ ノ |! |! |! l | ::. `ー-`ニ''ブ o o o ,へ l :. | / ヽ :
939 :
デフォルトの名無しさん :2006/11/23(木) 17:32:47
質問です。 文字列の指定した箇所の文字列だけを比較しようと思ったらどうすればいいのでしょうか。 たとえば、 私は太郎です。 という文字列があったとき、 3,4文字目(2バイトなので5〜8文字目ですが)が「太郎」のとき、 という条件を指定するにはどうすればいいのでしょうか。
940 :
939 :2006/11/23(木) 17:36:13
書き忘れました。Cです。
比較関数に「太」へのポインタを渡す
>>939 if (strlen(s) >= 8 && strncmp(s + 4, "太郎", 4) == 0) {
...
}
943 :
デフォルトの名無しさん :2006/11/23(木) 17:58:57
前段で長さ8以上を保証しているからmemcmp()でもいいね。
クラス内でstatic const floatの初期化できないけど、 変わりに良い方法ってないかな
static const intなら宣言部で定義可能だが、それ以外の型は 外部で定義するしかない。コンストラクタもstaticには無力。
>>945 クラス外に定義するとか。 static メンバ関数をインラインで定義するとか。
949 :
デフォルトの名無しさん :2006/11/23(木) 19:21:56
質問があります。 拡張子がrtfのファイルに関連するアイコンデータがプログラムから ひつようなのですが、レジストリエディタで確認すると "%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE",1 になっていました。 このリソースIDは何番にしたらいいですか?ワードパッドみても リソースIDが一番のアイコンはありませんでした。 よろしくお願いします
952 :
949 :2006/11/23(木) 19:36:42
申し訳ありません。移動します
953 :
デフォルトの名無しさん :2006/11/23(木) 19:50:13
駆け出しです。 char *r = "あいうえお"; として、最初の1文字、2文字を表示させようと思って printf("%-2s %-4s",r,r); としたのですが、これではすべてが出力されてしまいます。 どうすれば?
char buf[ BUF_MAX ]; で宣言された配列をwhile()ループで回す時に、buf[ BUF_MAX ]へのポインタ が必要になったのですが、 char *p_buf_end = buf[ BUF_MAX ]; にしてしまうと、p_buf_endという名前が buf[ BUF_MAX -1 ] と紛らわしい のではないか?と悩んでいます。 この場合、どのような変数名にするのが無難でしょうか?
>>953 ドットも忘れないでやってください。
Ex.
"%-.2s"
>>954 std::vectorでは、end()とlast()で使い分けている。
>>956 参照してみます。ありがとうございました。m(__)m
>>956 std::vector に last() なんてないぞ。
959 :
デフォルトの名無しさん :2006/11/23(木) 20:26:57
>>955 できたよ!
どうもありがとうございました。
960 :
デフォルトの名無しさん :2006/11/23(木) 23:25:31
>>954 for(i = 0; i < sizeof buf; i++) {
buf[i];
}
わざわざポインタ使う必要ないんじゃない?
>>960 名前の付け方に関する質問なんだからそのレスは見当違いだろう。
仮に今回はそれでいいとしても配列を超えたとこのポインタが必要になることはないとも限らん。
p_buf_goal = buf + BUF_MAX
loadavgファイルに過去の負荷が1行に1つで、 計10万ほど保存されていて、 下記のようなコードを書いて読み取ろうとしたところ、 はじめの3千から4千行ぐらい(?)まではうまくいくのですが、 途中からファイルから数値をよみこんでくれなく、 同じ数字のみが出力されるようになります。 どのようにすれば全部の数字を読み込んでくれるでしょうか? #include<fstream> int i; float avg,outavg; ifstream infile("loadavg"); for(i=0;i<60000;i++){ infile>>avg; outavg=avg/0.02 cout<<outavg<<"\n"; }
>>964 - for(i=0;i<60000;i++){
- infile>>avg;
+ while(infine>>avg){
>>965 今試してみましたが 8825行目ぐらいまでしか読み込んでくれません。 何事もなかったかのようにwhileループを抜けてしまいます。
>>966 8825行目あたりに float として読めない文字があるんじゃないの?
あとは、 #include <cstdio> して while ループ抜けた後
if (!infile.eof()) perror("infile"); ってしとけ。
出入力エラーがあれば、これで表示されるだろう。
>>967 ファイルを確認してみたところ特に変わったところはありませんでした
あと、試してみたところ,sucessと表示されました。
オーバーフロー
>>968 やっぱり途中で止まってるな。
>>967 のとおりだろ。
最後に読み込まれた数値の次にある文字列をファイルの
先頭にコピペすれば、どうせ最初で止まるだろう。
971 :
デフォルトの名無しさん :2006/11/24(金) 11:02:50
Hoge(Foo& foo); って宣言したコンストラクタがgccでコンパイルとおらない。 error: expected `)' が '&' トークンの前にあります こういうエラー出してくる。
>>971 同じ問題の発生する最小のソースと、コマンドラインを貼ってみろ。
Cとしてコンパイルしている落ちとか。
974 :
デフォルトの名無しさん :2006/11/24(金) 11:30:03
>>972 namespace foo
{
class Hoge
{
public:
Hoge(foo::Foo & foo);
virtual ~Hoge() = 0;
virtual void setStereo(bool flag) = 0;
virtual bool isStereo() = 0;
private:
protected:
};
}
/usr/local/bin/i386-mingw32-g++ -fno-exceptions -fno-rtti -I.
ステップ実行中ではifstreamがファイルの読み込みに失敗します。なぜですか? Microsoft Visual C++ 2005 Express Edition + STLPort 5.0.2の環境です。
>>974 namespaceのfooとHogeコンストラクタの仮引数のfooが被ってる
>>976 仮引数の名前を変えてもエラーが出ます。
>>977 namespace foo の中に Foo は解決されてるのか?
最小コードが
>>974 だとしたら、foo::Foo なんて型はないぞ
>>974 こういう情報を小出しにするアホは死んだ方がいい
>>980 何が必要十分であるか分からないくせに
自分で勝手に判断して情報を制限・抽象化する。
初心者とはそういうものだ。
初心者歓迎のスレタイ掲げてその台詞はちときつい気がするよ。
質問しても良いですか? メモリの指定範囲で書き込んだ値を調べる関数を作っています。 writeがメモリに書き込んだ値で、違う値が書き込んであったら-1を返します。 int color_false(char *memadd, char write, int sx, int sy) { char p; int x, y; for (y = sy; y <8; y++){ for (x = sx; x<8; x++){ p = memadd[ y * 320+ x ]; if(write != p) goto hoge; } } return 0; hoge: return -1; } まったく逆のメモリに書き込む関数は上手くいったのですが、 書き込んだ値を読み込む関数が上手くいきません。 何故か違う色を書き込んでいるところを指定しても 戻り値が0になってしまいます。 for文をネストしなくてVRAM[100]とかだと、上手く識別してくれます。 基本的に書き込む時と逆の処理しかしていないのですが 何故上手くいかないか分かる方いらっしゃいますでしょうか?
>>982 >for (y = sy; y <8; y++){
>for (x = sx; x<8; x++){
何やってんだよ
やりたいことは y < (sy+8) と x < (sx+8) か?
あと if( write != p ) return -1; でいっきに抜けたほうがきれいだぞ
がんがれ
>何やってんだよ >やりたいことは y < (sy+8) と x < (sx+8) か? 違うんです。 p = memadd[ y * 320+ x ]; memadd[0]、memadd[1]、memadd[3]、memadd[320]、memadd[321]・・・ 見たいな感じで調べたいんです。 変数を使うと上手くいかないんです。 >あと if( write != p ) return -1; でいっきに抜けたほうがきれいだぞ >がんがれ if( write != p ) return -1;って出来ますよねぇ。 何やつっても上手くいかないので、goto文使えばうまくいくかなっと思って いろいろ試してました。 頑張ります。
>>984 違うってことはsy,sxが8以上だと何もせずにチェックが終了することになるが・・・
やりたいことはfor (x = 0; x < sx; ++x) だと思うんだがなぁ。
エスパーが必要だな。
紙ヒコーキ先生に命中
ツいてないね
テレポーテーショーン
Cって関数の引数に構造体使うとコピーされるんでしたっけ?
関数の引数に構造体を指定できない処理系ってありますか?
よっぽど古かったりサブセット過ぎたりすると、構造体はポインタでないと渡せなかったり内部で勝手にポインタ渡ししたりする。
構造体の値渡しは勘弁してくれ
998 :
の :2006/11/24(金) 22:38:07
Windowアプリケーションが作りたくて、Win32 APIについて勉強しています。 その中で、C言語でつくったプログラムを使用したいのですが、どうすればよいのかまったくわかりません。 そもそも、そういうことはできるのですか?
ついでに1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。