【初心者歓迎】C/C++室 Ver.12【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (dat落ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(dat落ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(dat落ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/(dat落ち)
9:http://pc5.2ch.net/test/read.cgi/tech/1094494997/l50
10:http://pc5.2ch.net/test/read.cgi/tech/1097416187/
11:http://pc5.2ch.net/test/read.cgi/tech/1099190154/
【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい
2デフォルトの名無しさん:04/11/22 14:24:45
テンプレはらないの
3デフォルトの名無しさん:04/11/22 14:27:25
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part15
http://pc5.2ch.net/test/read.cgi/tech/1097880265/l50

■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/l50

C++Builder相談室 Part12
http://pc5.2ch.net/test/read.cgi/tech/1099238936/l50

GCCについて part4
http://pc5.2ch.net/test/read.cgi/tech/1090062751/l50

cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/l50

タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/l50

タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/l50

Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50

Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50
4デフォルトの名無しさん:04/11/22 14:29:27
【関連スレ(その他)】
C言語なら俺に聞け! Part 95
http://pc5.2ch.net/test/read.cgi/tech/1100956766/l50

C++相談室 part37
http://pc5.2ch.net/test/read.cgi/tech/1098543578/l50

プログラマー軍団がC/C++の宿題を解決します 34代目
http://pc5.2ch.net/test/read.cgi/tech/1100530682/l50

【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/l50

C++は難しすぎ 難易度:2
http://pc5.2ch.net/test/read.cgi/tech/1071697977/l50

C言語の第一歩
http://pc5.2ch.net/test/read.cgi/tech/1031374980/l50
5デフォルトの名無しさん:04/11/22 14:31:33
【関連スレ(その他)】
★C言語で遊ぼう!★
http://pc5.2ch.net/test/read.cgi/tech/1028269762/l50

プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/l50

C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/l50

フリーコンパイラー使えよ。
http://pc5.2ch.net/test/read.cgi/tech/1061384369/l50

C、C++の最適化について語るスレ
http://pc5.2ch.net/test/read.cgi/tech/1084676298/l50

ラウンジでC言語
http://etc3.2ch.net/test/read.cgi/entrance/1093006298/l50
6986=991=993:04/11/22 15:05:24
一桁(6辺り?)ゲットずさー(AA略)

書いてから言うのもなんだけど、fgetc()の仕様忘れてるから適当に書いちゃったよw
7デフォルトの名無しさん:04/11/22 16:33:29
>>1にsageは禁止と書かれているのにsageばかり。
8デフォルトの名無しさん:04/11/22 17:30:10
そもそもなんでsage禁止?
9デフォルトの名無しさん:04/11/22 19:25:17
gcc 3.3.1 (cygming special) + cygwin 1.5.5 (0.94/3/2) + Windows XP Professional (SP2適用済、RAMは768 MB)で質問です。
--
#define PARAMETER_NUMBER 162905984
#include <stdio.h>

char parameter[PARAMETER_NUMBER];

int main(void)
{
printf("%d\n", sizeof(parameter));
}
--
上記プログラム(といえるほどのものではありませんが)をgccでコンパイルして実行したところ
正常にsizeofの結果を表示してくれるのですが、

#define行を
#define PARAMETER_NUMBER 162905985
とするとコンパイルできるものの実行してもsizeofの結果を返してくれません。

この問題を回避する方法、つまり
グローバル変数領域を確保し、かつ正常にプログラムを実行する方法を
教えていただけませんでしょうか。

メモリは不足していない(と思います)し、また同じプログラムをlinuxやsolarisでコンパイルした場合は
同様の現象は再現できません。
10デフォルトの名無しさん:04/11/22 19:29:53
そんな時はmallocなどで動的に作る
11デフォルトの名無しさん:04/11/22 19:30:02
LinuxやSolarisではそれが実行できるのか・・・さすがだな。
12デフォルトの名無しさん:04/11/22 19:33:34
155MBか
13デフォルトの名無しさん:04/11/22 21:54:10
Windowsでも出来るが
14デフォルトの名無しさん:04/11/22 22:59:38
このソースで何がしたいんだろう
こっちの方が気になって仕方が無い
15デフォルトの名無しさん:04/11/22 23:51:00
cygwinの虫取りを依頼されてまつ
16デフォルトの名無しさん:04/11/23 01:50:12
お聞きしたいんですが、VectorでフリーのC言語のソフトを探していたのですが

Visual Windows for BC++
BC++5.5用ウィンドウズ統合開発環境(Borland C++ Compiler 5.5付)



C/C++統合開発環境 WideStudio for WIN32
C/C++/Perl/Ruby/Python によるGUIアプリケーション統合開発環境

は、本屋でよく売っているようなC言語の本。たとえば、

「猫でもわかるC言語プログラミング」
http://www.amazon.co.jp/exec/obidos/ASIN/4797325089/qid=1101141909/br=1-1/ref=br_lf_b_0/250-1392570-1726612

を買えば、ソフトの使い方の違いはあっても
使えるものでしょうか?
17デフォルトの名無しさん:04/11/23 02:41:16
Cはじめようと思うんですけど、推薦と書のとこを見ても数が多くてどれがいいか分かりません。
どのような組み合わせで買うのがいいですか?
一応大学の理系学部生です。
18デフォルトの名無しさん:04/11/23 02:53:04
>>16
日本語喋れ

>>17
実際に見てみて自分に合うやつを一冊買ってそれ仕上げればいいんじゃないか?
19デフォルトの名無しさん:04/11/23 05:33:28
>>16 >>17
初心者用の本ならどれも内容はだいたい同じ。書いてあるコードもどんな環境でも通るもののはず。気に入ったものでよいのでは?
定番の本(CならいまだにK&R?)は読んで損はないと思うが、最初からそれだけで理解しやすいかはかなり疑問。

最終的にGUIプロミングがやりたいのであっても、楽をしようとして、いきなりwindowsプログラミングや
C++の本だけ買うのは、おすすめしない。たぶん挫折するし、楽がしたければVB等を覚える方ががマシだと思う
20デフォルトの名無しさん:04/11/23 08:10:56
ファイルから検索しようとすると、〜.ncbを開けませんと出て検索できません。
ncbを1度消してビルドしなおしてもだめでした。
どうすれば検索できるようになりますか?
21デフォルトの名無しさん:04/11/23 08:22:00
>>9
MinGW(gcc3.4.2)でも動いた
char parameter[PARAMETER_NUMBER] = { 1 }; で初期化したら
巨大な .exe が生成されたがそれでも 162905985 が出力された
22モウモウ:04/11/23 12:19:19
>>20
.ncb は VC でプロジェクトを開いている間じゅうロックされるので、
検索することはできないと思いますよ。
プロジェクトを閉じれば検索できるでしょう。
(.ncb がどういうファイルなのか知ることのほうが先かも)
23デフォルトの名無しさん:04/11/23 12:53:14
まだ始めたばっかりなので、質問内容に不備がありましたら予め失礼申し上げます

ttp://v.isp.2ch.net/up/3cc2006c584d.txt
↑のプログラムをコンパイルしたら
エラー E2206 report-b.c 29: 不正な文字 ' ' (0x8140)(関数 main )
エラー E2206 report-b.c 29: 不正な文字 ' ' (0x8140)(関数 main )
エラー E2379 report-b.c 34: ステートメントにセミコロン(;)がない(関数 main )
エラー E2379 report-b.c 35: ステートメントにセミコロン(;)がない(関数 main )
と、エラーがでて困っています。
しかし、素人目で見て何が間違っているのか、というより合っているはずなのに…と
なって先に進めず、どうすればいいのかがわかりません。
申し訳ありませんが、ここがおかしいからこのエラーが出ると指摘してもらえませんでしょうか?
お願いしますm(_ _)m

ちなみにOSはXP homeでエディタにはAOKさんのC言語を始めよう!というのを使用させて
貰ってます。
24デフォルトの名無しさん:04/11/23 12:54:39
>>18>>19
ありがとうございます。
とりあえず、自分に合いそうなダイテルとK&Rを買うつもりでヨドバシまで行ってきます。
25デフォルトの名無しさん:04/11/23 12:56:40
>>23
29行目に全角のスペースを使ってるのと、
C言語では
2sin(s)のような直感的な書き方は出来ず、
r / (2*sin(s))と書かなきゃいけない
26デフォルトの名無しさん:04/11/23 13:04:44
>>25
素早い返答ありがとうございます!
おかげさまでちゃんとコンパイルすることができました。
これで続きを書くことが出来ます。本当にありがとうございましたm(_ _)m
27デフォルトの名無しさん:04/11/23 13:21:13
>>26
そのエディタに2バイト空白を見せる機能がないなら捨てることをお勧めしておく。
ついでに言えば、タブ文字や改行文字も見えるほうがいい。
28デフォルトの名無しさん:04/11/23 13:30:01
>>27
メモ帳ってどうやって棄てればいいですか?
29デフォルトの名無しさん:04/11/23 13:33:31
>>27
VisualStudioのエディタもデフォルトでは表示してくれないわけだが(´・ω・`)
30デフォルトの名無しさん:04/11/23 13:35:37
system32のnotepadを消す
31デフォルトの名無しさん:04/11/23 13:35:40
それは「空白を見せる機能がない」というのか?
32デフォルトの名無しさん:04/11/23 13:36:18
>>29
それがどうかしましたか?
33デフォルトの名無しさん:04/11/23 13:37:22
>>30
.txt っていうファイルを開くとエラーが出てくるようになりました
34デフォルトの名無しさん:04/11/23 13:37:26
      r;ァ'N;:::::::::::::,ィ/      >::::::::::ヽ 
.      〃  ヽル1'´        ∠:::::::::::::::::i 
       i′  ___, - ,. = -一   ̄l:::::::::::::::l 
.      ! , -==、´r'          l::::::/,ニ.ヽ 
      l        _,, -‐''二ゝ  l::::l f゙ヽ |、 世の中、メモ帳だけじゃねえんだ 
        レー-- 、ヽヾニ-ァ,ニ;=、_   !:::l ) } ト 
       ヾ¨'7"ry、`   ー゙='ニ,,,`    }::ヽ(ノ  適当なエディタにでも乗り換えろ
:ーゝヽ、     !´ " ̄ 'l,;;;;,,,.、       ,i:::::::ミ 
::::::::::::::::ヽ.-‐ ト、 r'_{   __)`ニゝ、  ,,iリ::::::::ミ     
::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ ,  な! 
:::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::/// 
:::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ / 
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ / 
35デフォルトの名無しさん:04/11/23 13:39:35
メモ帳で日誌をつくろう!!

1.ドキュメントの 1 行目の左余白に、次の拡張子を入力します。ピリオドを忘れないでください。
.LOG

2.[ファイル] メニューの [名前を付けて保存] をクリックします。


このドキュメントを開くたびに、コンピュータの内部時計の日付と時刻がドキュメントの最後に書き込まれます
36デフォルトの名無しさん:04/11/23 13:40:41
>>34
オスキナモノ ドウゾ

(=゚ω゚)っ[ edlin, ed ]
37デフォルトの名無しさん:04/11/23 13:43:06
38デフォルトの名無しさん:04/11/23 13:44:03
39デフォルトの名無しさん:04/11/23 13:44:54
>>35
.log 小文字だと出ないね
40デフォルトの名無しさん:04/11/23 13:46:47
>>35
ありがとうございます。
便利だからこれからもメモ帳使うことにしますた
41デフォルトの名無しさん:04/11/23 14:45:52
2バイト空白ってすごいネーミングだな
42デフォルトの名無しさん:04/11/23 15:43:40
エディタならサクラエディタかPeggyPADがオススメ。
(Windowsなら)
43デフォルトの名無しさん:04/11/23 16:04:04
c++で使われている"?"という文字の意味が分かりません。
どのような意味があるか教えてください。

 li.push_back(line.length() > 80 ? line.substr(0, 80) : line); 
44デフォルトの名無しさん:04/11/23 16:08:14
三項演算子

A ? B : C
Aを評価し、真ならBを、偽ならCを評価する。
45デフォルトの名無しさん:04/11/23 17:04:33
>>43
> 例
>  li.push_back(line.length() > 80 ? line.substr(0, 80) : line);

li.push_backに渡される引数が、line.length() > 80の評価結果によって
変化する。
line.length() > 80がTRUEであれば、line.substr(0, 80)
line.length() > 80がFALSEであれば、lineが引数として渡される。

って、丁寧に説明書いて手気づいたのだが、これって、
最近そこらにマルチされてるテキスト行長によるソートの
課題の一部なのでは、、、、
46デフォルトの名無しさん:04/11/23 17:30:01
部分的な質問を投げてるなら、自力でやる気があるんだろうから、結構な事じゃないか。
47デフォルトの名無しさん:04/11/23 19:11:28
その通り、俺が答えたコードの一部。
http://pc5.2ch.net/test/read.cgi/tech/1100530682/303
48:04/11/23 20:01:44
テスト
4945:04/11/23 21:15:14
>>47
なるほど、、

ずいぶん前に答えは出とるのね、、、、
# ただ、この処理だと、”同じ長さの行は入力順"てのを
# 満たせない気もしないではないが、、、
50デフォルトの名無しさん:04/11/23 21:22:56
222 :デフォルトの名無しさん :04/11/23 21:20:54
>118
ちょと解読&考えてみた。

・作業用に最大80個のファイルを作成する
・文字の数によって、1〜80の作業ファイルのいずれかに追記する。
 何文字の行があるのか0と1で表す配列で持つ(領域80個)
・行数の少ないところから、作業用ファイルの最初から、順に出力する

これ、メモリほとんど使わないYo!
51デフォルトの名無しさん:04/11/23 21:25:30
vectorに入れてstable_sort使えばいい。
5247:04/11/24 01:35:17
>>49
list<>.sort()は安定的。
23.2.2.4 list operations -31
Notes: Stable: the relative order of the equivalent elements is preserved.
53デフォルトの名無しさん:04/11/24 02:16:38
std::list に stable_sort がないのが前から疑問だったけど、
std::list::sort 自体が stable だったのか にゃんにゃん
54デフォルトの名無しさん:04/11/24 02:57:05
>>53
つー事は多分内部的にはマージソートだにゃ
55デフォルトの名無しさん:04/11/24 12:17:12
つ が差し出す手に見えてしまう・・・
56デフォルトの名無しさん:04/11/24 13:42:53
>>55
つI
57デフォルトの名無しさん:04/11/24 16:47:58
STLで、vector A の途中の要素を削除する時は
その要素の番号をiteratorで指さなきゃならないと思うのですが、
今、別のint型のvector B に、削除したいVector Aの要素の番号が
何個か入っているとしたら、どんな感じで書けばよいのでしょうか。
vectorBの内容はvectorAのサイズ内の数値が
(5,2,4,8)等のように適当に入っています。
58デフォルトの名無しさん:04/11/24 17:06:31
vector<int>::iterator it = B.begin();
vector<int>::iterator end = B.end();
for (; it != end; ++it)
A.erase(A.begin() + *it);
59デフォルトの名無しさん:04/11/24 17:08:36
>>58
それ先頭から削除されるたびにインデックスがズレてバグらないか
60デフォルトの名無しさん:04/11/24 17:15:40
Bを先に降順にソートしないと駄目だな
効率悪いけど
61デフォルトの名無しさん:04/11/24 17:18:23
%dが整数などを表示する物だってことをかじる程度に知っているのですが、%5dというのはどういうものなのでしょうか。
62デフォルトの名無しさん:04/11/24 17:20:20
関係ないんですが
ちょっと違うことで質問があります

今メモ帳を使ってプログラム書いてるのですが
誤字や;の付け忘れなどがあった時 
コンパイル前にその誤字の部分が赤く又は色がついて表示される
エディタって無いものでしょうか?
63デフォルトの名無しさん:04/11/24 17:21:54
>>61
そんな細かいことをいちいち質問する気か
64デフォルトの名無しさん:04/11/24 17:24:07
>>61
もう少しかじれ

>>62
画面のプロパティ→デザイン→ウインドウの文字 を赤にする
65デフォルトの名無しさん:04/11/24 17:38:30
>>61はマルチ
>>62
メモ帳ではなく、統合開発環境を使え。エディタの問題ではない。
66デフォルトの名無しさん:04/11/24 17:57:11
>>64
>>65
サンクス

BCC Devを使ったりしてるんだけど
何かいまいちなのよね

Visual C++.netは使いやすいです?
67デフォルトの名無しさん:04/11/24 18:04:28
BCCDevはクリックしたところに無条件でカーソルが移動するのがウザい…
68デフォルトの名無しさん:04/11/24 18:10:39
>>61
APIスレで答えは出ているじゃないか。
69デフォルトの名無しさん:04/11/24 18:16:06
>>65
なんで?
使いやすいエディタ使えばいいじゃん。
7057:04/11/24 18:36:15
>>58-60
ありがとう!
ソートしたら上手くいきました。
71デフォルトの名無しさん:04/11/24 20:23:33
>>69
シンタックスエラーを色分け表示してくれるエディタなんてあるの?
7245:04/11/24 21:01:36
>>52
勉強になりマスタ。
73デフォルトの名無しさん:04/11/24 21:25:24
>>71
コンパイル前に、だからエディタでの話でしょ。
しかし、「;付け忘れ」を判定するのは難しそうだが。そういうエディタは実際あるんですか?
;付ける間まで注意表示みたいなのをいちいち出されるのもウザそう。
74デフォルトの名無しさん:04/11/24 21:33:18
たとえば
WM_PAINT:
としようとして
WM_PAIMT:
にしてしまったら Mもところだけ色がつくとか
そういう機能がついている物
なさそう?
75デフォルトの名無しさん:04/11/24 23:44:50
.NETの開発環境でシンタックスエラーらしき個所に波線が
付いたような。VS 2005だけだっけか?
76デフォルトの名無しさん:04/11/24 23:45:12
>>71,73
emacsやその派生ならできるでしょ。
マクロを書く必要はあるけど。
ただ、>>62に使いこなせないのは間違いない。
もちろん俺にも使いこなせない。

>>74
そういう場合にMのところだけに色ってのは難しいと思うけど、
あらかじめ登録した語の色を変える機能がついたエディタは多いから、
主要なメッセージ名や構造体名は登録しておいたらいいんでは?
77デフォルトの名無しさん:04/11/25 00:10:49
>>75
VS.NET2002、2003でもVC#では出るんじゃないかな
78デフォルトの名無しさん:04/11/25 01:14:42
>74はスペルチェッカーの領分だな。英文ワープロソフトなら大抵ついてる機能だ。
後は辞書をカスタマイズすれば無問題。
79デフォルトの名無しさん:04/11/25 04:41:06
a[0]=0
a[1]=1
a[2]=2
a[3]=3
という配列があるとします
この配列のa[1]=1がいらなくなったので
a[0]=0
a[1]=2
a[2]=3
のように効率よく変換できる方法ってないのでしょうか?
頻繁にこういう操作を繰り返さないとだめなんで…
80デフォルトの名無しさん:04/11/25 04:43:19
realloc
C++なら問答無用でstd::list
81デフォルトの名無しさん:04/11/25 04:45:55
>>80
ご返答有り難うございます
std::listを調べてみます
82デフォルトの名無しさん:04/11/25 05:14:20
アルゴリズムがほとんど理解できてないのに言語を
勉強するのは無理ですかね?
83デフォルトの名無しさん:04/11/25 05:18:17
>>82
両方並行して
84デフォルトの名無しさん:04/11/25 05:21:58
>83

今クラスである語が終盤を迎えていて来週から言語なんですが、
さっぱり分からずって感じです。独学でならそのようにできると思うのですが・・・

とりあえずある語を完璧に理解することは必要ということですよね?
85デフォルトの名無しさん:04/11/25 05:30:46
アルゴリズムなんて全く理解する必要ないよ。
86デフォルトの名無しさん:04/11/25 05:31:42
それはないでしょw
87デフォルトの名無しさん:04/11/25 05:34:05
アルゴリズムなんてのはどっかの数学者が勝手に考えて
どっかの低級PGが勝手に実装してくれるもの
自分は使い方だけ知ってりゃいい。
88デフォルトの名無しさん:04/11/25 05:36:44
技術は陳腐化するが物の考え方は永遠である
89デフォルトの名無しさん:04/11/25 05:38:41
>88

結局ある語的思想がないと言語は扱えないってことですよね?
90デフォルトの名無しさん:04/11/25 05:39:33
>>89
お前の言ってるある語って具体的に何よ。
91デフォルトの名無しさん:04/11/25 05:43:06
流れ図てやつです。完成図をもとに流れ図を描くのです。

学生身分に答えていただいてすいません
92デフォルトの名無しさん:04/11/25 08:03:59
べつにいわれたとおりのものつくれりゃいいよ
93デフォルトの名無しさん:04/11/25 09:17:39
フローチャート如きでアルゴリズムを語るとは片腹痛いわ。
94デフォルトの名無しさん:04/11/25 10:14:14
フローチャートで表現できないアルゴリズムの例を挙げてみて
95デフォルトの名無しさん:04/11/25 12:40:01
gammaという変数はつかえないのですか
96デフォルトの名無しさん:04/11/25 12:41:50
>>96
使えます
97デフォルトの名無しさん:04/11/25 12:59:03
>>97
もちろん使えますよ。
98デフォルトの名無しさん:04/11/25 13:02:36
superという変数はつかえないのですか!(怒
99デフォルトの名無しさん:04/11/25 13:06:57
>>98
使えます
100デフォルトの名無しさん:04/11/25 13:09:21
>>98
つかえないのは
あなた自身です
101デフォルトの名無しさん:04/11/25 13:10:15
>>99-100
空気読め
102デフォルトの名無しさん:04/11/25 13:35:14
>>101は使えません
103デフォルトの名無しさん:04/11/25 14:53:27
>>84
なんだかアルゴリズムの意味自体よく分かってなさそうだが
お前の言うアルゴリズムはプログラマにとって絶対必要なものではないかもしれない。
けれどお前がテスト通るためには必要なんだろ。だったらあきらめて勉強しろ
104デフォルトの名無しさん:04/11/25 15:16:44
>>103
辞書の内容を覚えていなくてもいい
辞書のひき方を覚えていればいいのだ

って言葉を思い出した
105デフォルトの名無しさん:04/11/25 16:26:28
学生のころは辞書の内容を理解することに努め
社会人になったらその辞書をすぐに引き出せるようにしてればいい
みたいなのだよね

話は戻って、アルゴリズムは快適になるための道具
プログラムを組むには必須ではないけど、あれば便利
なので、プログラムになれてきたらその必要性を感じて来るんジャマイカ?
106デフォルトの名無しさん:04/11/25 17:22:04
そうだよな。だから辞書ソフトをパソコンにインストールしてある。
107デフォルトの名無しさん:04/11/25 20:27:37
MS-IMEの辞書ならインストールしてあるぞ。
108デフォルトの名無しさん:04/11/25 21:33:25
コンパイルしたら、再宣言の型が一致しないとでましたが、どういうことが考えられるでしょうか
109デフォルトの名無しさん:04/11/25 21:36:25
int以外の関数を、宣言せずに使用した

これが原因でなくても(勉強中は特に)、
コンパイラのオプションで、警告は最大にしておくこと。
110デフォルトの名無しさん:04/11/25 21:37:20
>>108 マルチャン、赤いきつねと緑のたぬき
111デフォルトの名無しさん:04/11/25 22:25:09
ファイルから5個の数字を読み取り、それらを表示させる
のにはどうすればいいんですか?
112デフォルトの名無しさん:04/11/25 22:25:57
↑ 抽象的ですいません。
Cでfprint等を使ったやつです。
113デフォルトの名無しさん:04/11/25 22:26:10
>>111 作ったところまで見せて。
114デフォルトの名無しさん:04/11/25 22:38:25
>>113
 遅くなりました。

#include <stdio.h>
#define N 5
main()
{
float data[N];
int i,ndata=N;
char filename[100];
FILE *fp;

printf("input filename =");
scanf("%s",filename);


fscanf(fp,"%5d\n",&ndata);
printf("%5d\n",ndata);
for(i=0;i<ndata;i++){
fscanf(fp,"%f %f",&data[i]);
printf("%5.1f %5.1f\n",data[i]);
}
fclose(fp);
}
115デフォルトの名無しさん:04/11/25 23:42:35
>114
微妙すぎるw

・fp いつオープンする?
・scanf() %5dの5は必要?
・%f%f なにがしたいの?
116デフォルトの名無しさん:04/11/25 23:55:35
ワラタ
117デフォルトの名無しさん:04/11/26 15:09:26
>>114
とりあえず突っ込むところ多すぎ。初心者用の本を読み直しましょう。
それと、読み取るファイルの内容や、どのように表示したいかも書かないと答えにくいよ。

学校の宿題なら専用スレへどうぞ
118デフォルトの名無しさん:04/11/26 15:16:24
書籍の質問ですが
ポインタの書籍で柴田さんと前橋さんの書籍がありますが
どちらの方がおすすめですか?
119デフォルトの名無しさん:04/11/26 15:21:23
>>118
愚問だな
両方買って自分で考えろ
120デフォルトの名無しさん:04/11/26 16:05:55
VC++.netを2万だして買って来たよ

なかなか使いやすいじゃない
コンパイルエラーのところダブルクリックするとそこに飛んでくれるし
Ctrl+F5でテストランが出来るのがすげぇ

メモ帳+コマンドプロンプトでやってたときがバカばかしいな・・・

121デフォルトの名無しさん:04/11/26 16:10:31
>>120
ネタだとしてもおもしろくない
122デフォルトの名無しさん:04/11/26 17:07:39
ネタで埋めないと、このスレももたなくなった?
123デフォルトの名無しさん:04/11/26 17:22:05
ただの自慢か日記書き込みだろうと推測してみる
124デフォルトの名無しさん:04/11/26 18:05:35
>>120
それが喪前にとってのVC++.netの価値なわけだな。
マクロエディタと同程度か。
125デフォルトの名無しさん:04/11/26 18:24:22
>>120
入門者なんだろ。その調子で頑張れ。
126デフォルトの名無しさん:04/11/26 18:43:38
関係ないが、.NETってC++を使う利点がどんどん無くなっていくみたいで、なんだか嫌いだ
127デフォルトの名無しさん:04/11/26 19:34:46
C#のために作られたような言語だからな。当然の流れだな。
128デフォルトの名無しさん:04/11/26 20:28:25
いやVBのためだろ (w
そのうちWINではC++覚える利点が全く無くなったりしてな。
ま、俺は当分MFCとCOMでやっていくつもり。
129デフォルトの名無しさん:04/11/26 21:37:04
VB好きのM$がC/C++を絶滅させるために作った
130デフォルトの名無しさん:04/11/26 22:54:12
C#はMSがJavaともめたからできた言語なんだが。
131デフォルトの名無しさん:04/11/26 23:10:59
mainの中でスレッドを作って、そのスレッドをmainから殺したくて、
pthread_killを使いたいのですが、その生成したスレッドだけでなく、
mainまで死にます。
mainは生かしたままで、そのスレッドのみ殺すにはどうすればいいでしょうか。
132デフォルトの名無しさん:04/11/26 23:23:00
スレッドをどうやって作ったの?
133デフォルトの名無しさん:04/11/26 23:37:15
pthread_t th;
pthread_create(&th, ...);
です。

pthread_kill(th, 9);
で、mainまで落ちます。
134デフォルトの名無しさん:04/11/27 06:12:08
windows+VC環境で
while(!kbhit());
と等価なLINUX+gccのコードを教えてくだされ。
135デフォルトの名無しさん:04/11/27 09:04:14
C言語ってなんですか?
136デフォルトの名無しさん:04/11/27 09:53:30
>>134
int kbhitForLinux(void);
while (!kbhitForLinux());
/* ここにkbhitForLinux()の実装を書こうとしたが余白が足りないので割愛 */
137デフォルトの名無しさん:04/11/27 12:23:29
>>136
フェルマーみたいな奴だな
138デフォルトの名無しさん:04/11/27 15:00:36
>135

C programming language
139デフォルトの名無しさん:04/11/27 15:27:04
>>133>>134と、なんだかCやC++についての質問じゃなくてgcc固有の質問が多いな
140デフォルトの名無しさん:04/11/27 17:13:33
>>139
gcc固有じゃないよ
141デフォルトの名無しさん:04/11/27 19:09:04
C言語やってる人は

ローマ字だけでオナニーできるって聞いたんですが
本当なんですか?
142デフォルトの名無しさん:04/11/27 19:33:25
>>141
@
/(x)/
y
| |

これで抜けます。
143デフォルトの名無しさん:04/11/27 19:34:03
 @
/(x)/
 y
 | |
144デフォルトの名無しさん:04/11/27 19:47:13
ローマ字じゃねぇyp

私的解釈として
変数名や関数名にローマ字で宣言してるソースを見て
ナニってるということにしますた(`・ω・´)
145デフォルトの名無しさん:04/11/27 21:03:23
>>144
ローマ字以外の何で宣言するの?
アンダーバーと数字だけ?
146デフォルトの名無しさん:04/11/27 21:27:01
英単語
147デフォルトの名無しさん:04/11/27 21:33:03
もしかして、ローマ字とローマ字綴りを混同しているのかな?
148デフォルトの名無しさん:04/11/27 21:38:44
そもそもローマ字ってなんだ?
149デフォルトの名無しさん:04/11/27 21:40:23
ソースの文字列をローマ字という表現では不十分なので(記号もあるので)
ローマ字=ローマ字綴りと私的解釈をしたわけで…(´・ω・`)
150デフォルトの名無しさん:04/11/27 22:53:27
はじめまして。Cで、数学の関数などをグラフ化したいのですが、やり方がわかりません。
いろいろ検索してみたのですが、どうもやり方の書いてあるところを発見できませんでした。
教えてください!
OSはXPで、BCCを使っています。
151デフォルトの名無しさん:04/11/27 22:56:26
>>150
Windows プログラミングを勉強しないとだめかな。
簡単なライブラリならそこらへんに落ちてるかもしれませんが。
152デフォルトの名無しさん:04/11/27 23:01:33
>>150
手っ取り早くグラフを書きたいだけならテキストでデータを吐き出して
グラフィックはグラフソフト(Excel gnuplot R)に任せるとか?
Excelみたいにウィンドウにグラフを表示したいんならこれじゃだめだけど
153デフォルトの名無しさん:04/11/27 23:09:25
glutが楽だと思う
ただ、Cが"まとも"に出来ればの話だが

OpenGLスレ
http://pc5.2ch.net/test/read.cgi/tech/1100085657/
154デフォルトの名無しさん:04/11/27 23:43:16
親切に教えていただいてありがとうございます。
まだ全くの初心者なので、とりあえず、Windowsプログラミングを勉強してみます!
155デフォルトの名無しさん:04/11/28 00:12:15
Windowsプログラミングを「ついでに」勉強する神キター
156デフォルトの名無しさん:04/11/28 00:17:55
別にWindowsプログラミングなんて「ついで」でよいのではない?
どうせすぐに変わるものなんだから。
本質でもないし。
157デフォルトの名無しさん:04/11/28 00:29:17
アフォはスルー白
158デフォルトの名無しさん:04/11/28 02:29:16
数字の2にすごい興奮する
159デフォルトの名無しさん:04/11/28 06:13:10
VC++.NETでGUIプログラミングをしたいんですけど、
SDKとMFCと.net Frameworkのどれがいいんでしょうか?
楽なほうがいいんだけど。
160デフォルトの名無しさん:04/11/28 06:16:19
>>159
一番楽なのは .net Framework だろう。
その次に MFC で、最後に SDK。
WTL というものもあるが。
161デフォルトの名無しさん:04/11/28 08:12:16
二次元配列の要領で、vectorの要素としてint型のsetを持たせたいのですが、
そういうのが可能だとしたら、どうやって宣言を書けばよいでしょうか。
162デフォルトの名無しさん:04/11/28 08:43:53
std::vector<std::set<int> >
163161:04/11/28 09:00:52
>>162
ありがとうございます。VC6++使ってるんですが、

std::vector<std::set<int> >
             ↑のスペースって必要なんでしょうか?
ただの「決まり」ってことで覚えればよいですか?
スペース入れないとコンパイルエラー、
入れると警告が沢山出るもののエラーはでません。
164デフォルトの名無しさん:04/11/28 09:05:26
>>163
スペース入れないとコンパイルエラーになるのは、>> 演算子と解釈されるから
165デフォルトの名無しさん:04/11/28 09:07:48
どうしてもスペースを開けるのが嫌ならtypedef使え。
typedef std::set<int> set_int;
std::vector<set_int>
166161:04/11/28 09:36:54
>>164>>165
なるほど勉強になりました。ありがとうございました。
あと、警告は#pragma warning (disable:4786)で黙らせる事ができました。
167デフォルトの名無しさん:04/11/28 11:01:17
質問です。VC++ 6.0 を使っています。

SetTimer(1, 10, 0) として、10ミリ秒ごとに OnTimer を実行させているのですが、
計測したところ1秒間に64回ほどしか実行されていませんでした。
これはPCの処理能力の問題なのでしょうか? それとも SetTimer の精度の問題でしょうか?
WM_TIMER メッセージがメッセージキューにたまっているようには見えませんでした。

また、これを解決して確実に1秒間に100回処理を行なわせる方法はないでしょうか?
168デフォルトの名無しさん:04/11/28 11:47:43
はじめまして、redwolfといいます。
皆様に助けてもらいたいのですが、今,VC++6.0 MFCでプログラム
を作成しています。

VC++6.0 MFCの月間予定表を使用し、日付を選択させれたら
テキストに年と週番号を表示するプログラムを作成しています。

ですが、どうしても、選択した日付が表示されません。
ソースは

SYSTEMTIME tm;
CString strYear; // 表示用文字列

     CTime t; // 時間を扱うクラス
t = m_month.GetCurSel(&tm);
strYear = t.Format("%Y%U");//
m_ed1.SetWindowText(strYear); // 表示

を実行すると例えば2004年11月26日を選択しても1970と表示されます。
休日ですがみなさんのお力を私に貸してください。
お願いします。
169デフォルトの名無しさん:04/11/28 11:50:00
知っているがお前の名前が気に食わないっつってんだよ。マルチが。
170デフォルトの名無しさん:04/11/28 12:06:34
>>167
ない
171デフォルトの名無しさん:04/11/28 12:10:53
>167
精度の問題、そもそもWM_TIMERメッセージの優先度も低い。
精度の高い処理を行いたいなら、TimeGetTimeなりを使うと良いよ
172デフォルトの名無しさん:04/11/28 12:23:47
>>168
なんだそれ?
よくそこまででたらめに作れるな。
関数の仕様ぐらい嫁
173デフォルトの名無しさん:04/11/28 12:51:36
>>172
なんだそれ?
よくマルチにレス出来るな。
板の仕様ぐらい嫁
174デフォルトの名無しさん:04/11/28 13:34:33
>>160
.net frameworkが一番楽なのはいいけれど
覚えやすさで言えば次はsdkだろ。ひたすら細かい処理書かないといけないから面倒なだけで
使い方自体は覚えやすいと思うぞ
それよりもMFCの方がクラスライブラリの仕様とか理解するのが初心者には面倒だと思う。
意味も分からず、こう書けって説明するなら楽だが。
175167:04/11/28 13:48:59
>>171
ありがとうございます、timeGetTime() を使ってうまくいきました。
176デフォルトの名無しさん:04/11/29 11:10:21
Windowsでコマンドラインプログラムをコマンドプロンプトを表示させずに実行させる方法を教えてください。
できれば、コマンドプロンプトで実行した時に表示される内容も取り込めるとよいのですが。
177デフォルトの名無しさん:04/11/29 11:27:09
ウイルスでも作るの?
178デフォルトの名無しさん:04/11/29 12:04:53
jpeg2psのフロントエンドを作りたいのです
179デフォルトの名無しさん:04/11/29 12:13:27
説明面倒なんで「SetStdHandle CreateProcess」でググれ。
180デフォルトの名無しさん:04/11/29 12:20:13
そういえばCDexからLameとか外部エンコーダ呼ぶときに
DOS窓非表示の設定があるな
オープンソースだしソース見ればわかるだろう
181デフォルトの名無しさん:04/11/29 12:27:07
>>180
ソース=ドキュメントですね(`・ω・´)
182デフォルトの名無しさん:04/11/29 12:30:55
176の親です。ありがとうございました。
183デフォルトの名無しさん:04/11/29 12:53:47
VC++で計算した数値を引数で表示したいんですが、printfで表示されません。だからMessageBoxを使って表示したいんですがエラーがでます。どうしたらいいんでしょうか?どなたか分かる人教えてください。
184デフォルトの名無しさん:04/11/29 12:57:34
char str[10];
wsprintf(str, "%d",num);
MessageBox(hwnd,str,"suuji",MB_OK);
185デフォルトの名無しさん:04/11/29 13:07:59
MessageBoxの解決する前にすることあるだろ
186デフォルトの名無しさん:04/11/29 13:13:13
マルチするにしたって、なぜあそこを選んだのかが不思議だな…

C++は難しすぎ 難易度:2
http://pc5.2ch.net/test/read.cgi/tech/1071697977/504
187183:04/11/29 13:13:59
何ですか?教えてください
188デフォルトの名無しさん:04/11/29 13:34:52
マルチはだめでちゅよ
189デフォルトの名無しさん:04/11/29 14:14:39
>>186
そこだけじゃなく、あちこち書いているっぽい。

>>183
>188も言うようにマルチはダメ。
VC++でもコンソールアプリにしておけば普通にprintf()も使える。
GUIでやりたいのかCUIでやりたいのか、そこをはっきりさせた方がいい。
190デフォルトの名無しさん:04/11/29 15:41:23
Windowsのメインの音量を変更するにはどうしたらよいでしょうか?
191デフォルトの名無しさん:04/11/29 15:44:05
>>190
勝手にいじるな

以上
192デフォルトの名無しさん:04/11/29 15:53:35
te
193デフォルトの名無しさん:04/11/29 17:25:17
>>176
ぐぐる、Windowsサービス
194194:04/11/29 18:31:47
はじめまして、C++の初心者です。
mainとファンクションを5つほどつくりました。
mainではファンクション1だけを呼び出します。
ファンクション1の中で必要に応じてファンクション2〜5を呼び出したいのですが、
全部実行されてしまいます。
どのようにすれば個別のファンクションだけ呼び出せますか?
今はこんな感じです。
main
{Function1()}

Function1()
{int chose;
if(chose =2)
Function2()
if(chose=3)
Function3()
・・・・・

それぞれのファンクションではテキストファイルを読み込み
それをブラウザに表示させる動作を行います。
テキストファイルを表示語はファンクション1にもどりたいです。

上手く説明できなくて申し訳ありませんが、どなたか解決方法を教えてください。
環境はDevC++のバージョン4.0です。
195デフォルトの名無しさん:04/11/29 18:36:52
「変数chooseが3ならば」は、「if (choose==3)」と表す。「choose=3」は代入。
初心者がよくやる間違い。
196194:04/11/29 18:37:59
申し訳ありません、訂正です。
void Function1() 今はこのようになってます。
{int chose;       これで2を入力するとファンクション2にいけるのですが
if(chose =2)       3を入力してもファンクション2にいってしまいます。
{Function2()}        なぜなのかわかりません。
elseif(chose=3)
{Function3()}

ファンクション1〜5はすべてvoidです。
197デフォルトの名無しさん:04/11/29 18:44:32
だーかーらー、「chose=2」は「choseに2を代入」と言う意味。
「if (chose = 2) 〜」は「chose = 2; if (chose) 〜」と同じ意味。
「if (2) 〜」は「if (true) 〜」と同じ意味。よって「〜」は常に実行される。

君、いくら何でも素質ないよ?
198194:04/11/29 18:46:46
>195さま
変えてみましたが変化がありません、もう少し詳しく書いてみます。
main{ Function1()}
void Function1()
{int chose =0; cin >> chose;
if(chose =2)
{Function2();}    こんな感じです。
else if(chose =3)   それともう一つ質問ですが、
{Function3()}     Function2〜5からFunction1に帰りたいのですが
           そのような場合はどうすればいいのでしょうか?
return Function1();をFunction2()にいれて見ましたが反応してません。



199デフォルトの名無しさん:04/11/29 18:47:35
もはや釣りとしか思えない
200194:04/11/29 18:48:36
>197
素質がないのはわかってます。
ご指摘どうも。
やりたくなくてもやらなくてはならないのでやってます。
switchつかったほうがめんどくさくないですかね?
201194:04/11/29 18:49:22
>>199
本気です。
プログラムなんてちんぷんかんぷんです。
本読んでも理解できません。
関わりたくないですがやらなければなりません。
202デフォルトの名無しさん:04/11/29 18:49:48
if(chose=2) のところを if(chose==2) に変えろ
     ↑             ↑
  =がひとつ!!      =がふたつ!!!!!!!
203デフォルトの名無しさん:04/11/29 18:54:04
>>198
いいかげんにしる!
=は代入だっつってるだろ

int main(void) {
 Function1();
 return 0;
}

void Function1(void) {
 int chose = 0;
 cin >> chose;
 if(chose == 2) Function2();
 else if(chose == 3) Function3();
}
204デフォルトの名無しさん:04/11/29 18:55:46
ネタなんだろうけどちょっとかわいいな。
クリックリしたい・・・。
205デフォルトの名無しさん:04/11/29 18:56:43
>>176
stdout, in, errをパイプで繋ぐ。
206デフォルトの名無しさん:04/11/29 18:58:34
何気に CreateFile っていろんな機能が詰まってるよな。
207デフォルトの名無しさん:04/11/29 18:59:51
RS232Cの制御とかな。すれ違いだけど。
208デフォルトの名無しさん:04/11/29 19:01:34
ヘッダファイルの命名についてですが、ファイル名に何らかのプレフィックスを付けた方が良いですか?
#include "io.h" /* or -I/path/to/src <io.h> */
#inlcude "utils.h"
#include "private.h"

#include "xyz_io.h"
#include "xyz_utils.h"
#include "xyz_private.h"
のどちらが好ましいか、と聞きたくなったのです。
それとも
 src/ *.c ソースファイル
 include/
 include/xyz/ *.h ヘッダファイル
のようなディレクトリ構成にして
#include <xyz/private.h> /* -I/path/to/include */
の用にした方がよいでしょうか?
209デフォルトの名無しさん:04/11/29 19:04:01
>>208
好みで決めればいいんじゃない?
大きめのプロジェクトなら後者が多い気はするけど。
210デフォルトの名無しさん:04/11/29 19:04:54
>>209
後者ってのはディレクトリで分ける方な!
211194:04/11/29 19:07:53
>>203

ありがとうございます。
できました^@^!
お手数かけてもうしわけありませんでした。
212デフォルトの名無しさん:04/11/30 10:04:19
>>194
>>211
ところで main に型書かなくても動くのか?

あと、初心者だから仕方ないけど、
インデントとか空白も意識しような。
色々なパターンがあってどれがいいとは言えないけど、
ひとつのプロジェクト内では統一するに越したことはない。
213デフォルトの名無しさん:04/11/30 12:45:09
>>212
関数の戻り値の方なら書かなくても動く。
がしかし、>194はそれ以前にプログラムとしては省略しすぎなので評価する意味がない。
214デフォルトの名無しさん:04/11/30 23:45:43
>>212
お前も初心者だろ。
215デフォルトの名無しさん:04/12/01 01:03:19
STLの ofstreamで クラスオブジェクトを丸ごとバイナリファイルに保存したいんですが、
そのクラスにvectorのメンバ変数が存在します。

このままだと普通に保存できないんですが、どうしたらいいんでしょうか?
このvector変数はprivateになってます。

STLのスレに書いたんですが誰も来ないのでこっちにしました
216デフォルトの名無しさん:04/12/01 01:07:04
その短気さが身を滅ぼす
217デフォルトの名無しさん:04/12/01 01:09:14
>>216

もう滅ぼされてます;; なので助けてください
218デフォルトの名無しさん:04/12/01 01:16:05
もう少し向うで我慢してたら良かったのに。
おいらが回答しようかと思ってたんだが…

マルチポストしたから、もう回答してやんない。残念でした。
219デフォルトの名無しさん:04/12/01 01:43:42
>>215ですが 解決しました。 ほっ
220デフォルトの名無しさん:04/12/01 01:59:04
Cによる四則演算の練習をしています。

演算結果に 1.#QNB
と出るのですが何を意味しているのでしょうか?
とんでもなく大きな数字にでもなってしまったとかですか?

コンパイラVisual C++ 6.0を使っています。
221デフォルトの名無しさん:04/12/01 02:41:14
コード書け
222デフォルトの名無しさん:04/12/01 02:53:57
int型の配列aがあったとして、a["A"+1]はどういう意味になるんですか?
"A"のASCIIコード+1番目の配列ということでしょうか?
223デフォルトの名無しさん:04/12/01 03:00:25
"A"はどっかに確保された文字列"A"へのポインタ。
それに+1なのでAのあとの\0を指すポインタが[]内の式の結果。
式全体の意味は無茶苦茶。多分単なるバグ。
224デフォルトの名無しさん:04/12/01 03:00:26
ただのエラーになる
225デフォルトの名無しさん:04/12/01 03:03:07
(-"A"-)
寝ている赤ちゃん
226デフォルトの名無しさん:04/12/01 03:07:45
ちょっと無理が
227デフォルトの名無しさん:04/12/01 03:22:54
>>225
かっわい〜!
GJ!
GJ!
228デフォルトの名無しさん:04/12/01 03:25:00
(-"u"-) こっちのほうがいい
229デフォルトの名無しさん:04/12/01 09:17:43
でつ <>>228 Charlie?
230デフォルトの名無しさん:04/12/01 13:30:33
スレの流れが読めん香具師が多いな。
"A"のことを語っているのに
必死で反論しているのは恥ずかしいぜ
231デフォルトの名無しさん:04/12/01 17:12:37
( Д ) ゚ ゚
232デフォルトの名無しさん:04/12/01 17:47:08
オール・フォー・A
233222:04/12/02 00:23:48
>>223
うーん、そうですか・・・
234デフォルトの名無しさん:04/12/03 17:18:36
Aのアスキーコードにしたけりゃシングルクォーテーション
a[ 'A' + 1 ]
235デフォルトの名無しさん:04/12/03 17:43:51
('A')
236デフォルトの名無しさん:04/12/03 18:52:27
テンプレートで少々つまづいているのですが
どなたかご教授願います.

template <class T> class Hoge
{
public:
T *GetNext(void);
private:
T *abc;
}

T *Hoge<class T>::GetNext(void)
{
return abc->GetNext();//不可能?
}

GetNext()を実装した型をTとして渡しても
こういった使い方は出来ないものなんでしょうか?
237デフォルトの名無しさん:04/12/03 18:56:22
abcにはなに入れてんだ?
あと void は消せ
238デフォルトの名無しさん:04/12/03 18:58:05
return this->GetNext();
にするか、
T *abc; の private: を public: にするか、
どっちかだろ?
239デフォルトの名無しさん:04/12/03 19:02:30
m9['A']
240デフォルトの名無しさん:04/12/03 19:13:11
ドーン
241236:04/12/03 19:19:54
すみません、ドキドキしながら書き込んだら全然違うこと書いてました
書き直したので何卒もう一度お願いします。

class HogeNode
{
public:
void SetNext(HogeNode *next) {this->next = next;}
private:
HogeNode *next;
}

template <class T> class HogeList
{
public:
void Add(T *t);
private:
T *first;
T *last;
}

void Hoge<class T>::Add(T *t)
{
last->SetNext(t);//不可能?
last = t;
}

こんな感じで匿名(?)のTのメンバ関数を呼ぶことは不可能なのでしょうか?
242236:04/12/03 19:24:56
void Hoge<class T>::Add(T *t)
ではなく
void HogeList<class T>::Add(T *t)
でした... すみません
243デフォルトの名無しさん:04/12/03 19:26:17
>こんな感じで匿名(?)のTのメンバ関数を呼ぶことは不可能なのでしょうか?
可能

>>242
>void HogeList<class T>::Add(T *t)
void HogeList<T>::Add(T *t)
だよ
244236:04/12/03 19:33:57
>>243
<T>に変えてみたのですがコンパイルで蹴られてしまいます
error C2027: 認識できない型 'T' が使われています。

もしかして別の問題なのでしょうか?
ちなみにコンパイラはVC7.1です
245デフォルトの名無しさん:04/12/03 19:36:24
>>244
これでどうだ?
class HogeNode
{
public:
void SetNext(HogeNode *next) {this->next = next;}
private:
HogeNode *next;
};
template <class T> class HogeList
{
public:
void Add(T *t);
private:
T *first;
T *last;
};
template <class T>
void HogeList<T>::Add(T *t)
{
last->SetNext(t);//不可能?
last = t;
}
246236:04/12/03 19:41:43
>>245
すると今度はリンクできないようです.
error LNK2019: 未解決の外部シンボル

ますます別の問題のような気がしてきました...
247デフォルトの名無しさん:04/12/03 19:42:57
>>246
>ますます別の問題のような気がしてきました...
そう思う

>error LNK2019: 未解決の外部シンボル
のあとは?
248236:04/12/03 19:43:47
ちなみに呼び出し元では
hogeList = new HogeList<HogeNode>();
という風に書いています.
249236:04/12/03 19:46:09
>>247
続きはこんな感じです.
Test error LNK2019: 未解決の外部シンボル "public: __thiscall HogeList<class HogeNode>::HogeList<class HogeNode>(void)" (??0?$HogeList@VHogeNode@@@@QAE@XZ) が関数 "public: __thiscall Test::Test(void)" (??0Test@@QAE@XZ) で参照されました。
250デフォルトの名無しさん:04/12/03 19:54:28
>>249
>public: __thiscall HogeList<class HogeNode>::HogeList<class HogeNode>(void)
これはHogeListのコンストラクタだよね
Test::Test(void)の実装が書かれたファイル名と245の内容が書かれたファイル名は?

それと
> template <class T>
> void HogeList<T>::Add(T *t)
> {
> last->SetNext(t);//不可能?
> last = t;
> }

template <class T>
inline
void HogeList<T>::Add(T *t)
{
last->SetNext(t);//不可能?
last = t;
}

251236:04/12/03 20:06:00
>>250
HogeListに書いていたコンストラクタを消して
コンパイラに自動生成してもらったらビルドできました

ということはコンストラクタの書き方が間違ってたっぽいです

この場合コンストラクタはどう書けばいいのでしょうか?

> それと
> > template <class T>
> > void HogeList<T>::Add(T *t)
> > {
> > last->SetNext(t);//不可能?
> > last = t;
> > }
> は
> template <class T>
> inline
> void HogeList<T>::Add(T *t)
> {
> last->SetNext(t);//不可能?
> last = t;
> }
> に
EfficientC++にもinline書いてました
付け忘れてはいけませんね
252デフォルトの名無しさん:04/12/03 20:12:54
>>251
こんな感じ
template <class T>
class HogeList
{
public:
void Add(T *t);
HogeList ();
private:
T *first;
T *last;
};
template <class T>
inline
HogeList<T>::HogeList ()
{
}
253236:04/12/03 20:27:51
>>252
別段普通ですよね...
それなのになぜかリンクできないorz

ここまでくれば何かの見落としだと思うのであとは自力で頑張ってみます
色々と勉強になりました
ありがとうございました
254デフォルトの名無しさん:04/12/03 20:39:58
gcc3.4.2で通った

template <typename T>
class HogeList
{
public:
void Add(HogeList<T>* t) {
this->first = t;
}
HogeList();
private:
HogeList<T>* first;
HogeList<T>* last;
};

template <typename T>
inline HogeList<T>::HogeList() {}


int main()
{
HogeList<int> hl;
hl.Add(new HogeList<int>());
}
255デフォルトの名無しさん:04/12/03 21:33:16
うほっいい流れ
256236:04/12/03 23:24:27
236です
その後、悪戦苦闘したのですが、
どうやらテンプレートの場合は関数の定義を
ヘッダファイルの中に書かないといけないのですね。

リンク時にコンストラクタがどうしても見つからない理由が
やっとわかりました。
257デフォルトの名無しさん:04/12/03 23:28:06
今日の格言
「テンプレートは高機能マクロと思え」

※マクロよりはるかに便利だけど
258デフォルトの名無しさん:04/12/03 23:37:54
>>256
250で
>Test::Test(void)の実装が書かれたファイル名と245の内容が書かれたファイル名は?
と書いたのはそれ疑ってたんだけどね

>どうやらテンプレートの場合は関数の定義を
>ヘッダファイルの中に書かないといけないのですね。
基本的にはそうなんだけど
明示的に実体化しておけばその限りでないです

明示的な実体化は
例えばHogeListに渡すテンプレートパラメータが予め
HogeNodeとHageNodeしかないのなら
メンバ関数を定義した実装ファイル(.cpp)の最後で
template class HogeList<HogeNode>;
template class HogeList<HageNode>;
みたいにやります
259デフォルトの名無しさん:04/12/03 23:39:43
>>258
明示的な実体化のときにはtemplateは書かない気がする。
260デフォルトの名無しさん:04/12/03 23:46:50
Windowsプログラムで
system("iexplore.exe");
とやるとDOS窓が開いてしまうのがかっこ悪いです。
DOS窓が開かない方法を知りたいのですが
win32APIとかで別プログラムを起動させる方法ってありますか?
261デフォルトの名無しさん:04/12/03 23:47:41
>>260
もちろんだ
262デフォルトの名無しさん:04/12/03 23:48:33
>>259
付けるのが正解のような気がする
規格の14.7.2
263デフォルトの名無しさん:04/12/03 23:49:39
>>261
自分では見つけられませんでした。
検索しますんでキーワードおしえてください。
264デフォルトの名無しさん:04/12/03 23:50:54
>>263
こんなすれがあるんだよ↓
Win32APIしつもんばこ びるど25
http://pc5.2ch.net/test/read.cgi/tech/1101393155/
265デフォルトの名無しさん:04/12/03 23:51:01
>>260
CreateProcess() や ShellExecute()
266デフォルトの名無しさん:04/12/03 23:59:48
>>265
ども
267デフォルトの名無しさん:04/12/04 00:10:50
typedef int *INTPTR;
const INTPTR p;

int * const p;
だったなんて!
MSがLP〜なんて余計なもの作るから悪いんだ!
268デフォルトの名無しさん:04/12/04 00:15:32
すみませんが教えてください
Visual C++ 6.0 で以下のソースをビルドしても、rand() で生成される乱数が
常に 41 にしかならないようなんですが、何か間違ってますか?

#include <iostream>
#include <cstdlib>
using namespace std;

int main(void)
{
     int magic;          // 乱数を格 納
     int guess;          // ユーザの予想を格納

     magic = rand();       // 乱数を生成、格納

     cout << "Enter yout guess:";
     cin >> guess;

     if ( guess == magic )
{
          cout << "*** Right ***";
}

     cout << magic;     // 実際に生成された乱数を確認

return 0;
}
269デフォルトの名無しさん:04/12/04 00:17:05
俺はMだがSを付けろ
270デフォルトの名無しさん:04/12/04 00:19:10
>>268
srand() 使いましょう。
271デフォルトの名無しさん:04/12/04 00:19:47
srand
272デフォルトの名無しさん:04/12/04 00:21:02
273デフォルトの名無しさん:04/12/04 00:24:24
srand ですか、調べてみます
274デフォルトの名無しさん:04/12/04 00:34:31
わかりました
MSDN libraryの rand の項目も見てたんですが、
ちゃんと読んでなくて、
「srand 関数を使って疑似乱数ジェネレータを初期化してから、rand 関数を呼び出してください。」
と書いてるのを見てませんでした

ごめんなさい

ハーバート・シルトの標準講座 C++ のサンプルだったんですが、
ちょっとぐらい説明がほしかったなぁ・・・
275デフォルトの名無しさん:04/12/04 00:39:22
毎回同じ結果が欲しいこともあるので、逆に便利な機能ってことに
なってる。<rand、srand
276デフォルトの名無しさん:04/12/04 01:03:01
しかし>>268は当たる確率低いな。
277デフォルトの名無しさん:04/12/04 01:07:11
エスパー養成プログラムですから。
278デフォルトの名無しさん:04/12/04 01:44:00
どなたか、ご存知でしたら教えていただきたいのですが、
C++ で Java のリフレクションに近いような機能を実装することは
できるのでしょうか?
例えば

int function() {
  ・・・ // この関数の中で "function" という文字列を取得したいです。
}
279デフォルトの名無しさん:04/12/04 01:46:02
>>278
するなよ。
280デフォルトの名無しさん:04/12/04 01:54:06
C++は知ってるクラスしか相手できない。
間にクラスを1個挟めばリフレクションまがいのことはできそうだけど、
あまり意味はなさげ。
281デフォルトの名無しさん:04/12/04 02:16:09
VC++7.1には__FUNCTION__なんてマクロがあったりするがな。
282デフォルトの名無しさん:04/12/04 02:16:39
>>278
__func__
283デフォルトの名無しさん:04/12/04 02:17:37
ポータブルに
BOOST_CURRENT_FUNCTION
284デフォルトの名無しさん:04/12/04 02:22:44
関数のローカルスコープ内で関数名を知ることができるのと
リフレクションは全然違うと思うんだけど。
285デフォルトの名無しさん:04/12/04 02:25:21
>>284
>>278
>int function() {
>  ・・・ // この関数の中で "function" という文字列を取得したいです。
>}
286デフォルトの名無しさん:04/12/04 02:29:58
>>285
リフレクションとか関係ないですか、そうですか。
287デフォルトの名無しさん:04/12/04 02:31:53
>>286
さぁ?

278は明らかに汁
288278:04/12/04 02:34:21
すいません、それができれば間に合うので
最小限しか書いていませんでした。
やりたいことはあるクラスからメソッド名を抜いてきて
テストコードとドキュメントを生成したいと考えています。
289デフォルトの名無しさん:04/12/04 02:38:18
クラスからメンバ関数名を取得する場合、上記のやり方だと
できなさそうだがな。
290デフォルトの名無しさん:04/12/04 02:52:25
>>288
無理。ソース読んで生成するしかない。
河童とDoxygenは知ってるか?
291278:04/12/04 03:06:20
>>290
ありがとうございます。
DoxyGen にはかなりお世話になっております。
河童は知らなかったのでダウンロードしてみました。
すごく使えそうなので使ってみたいと思います。
あと、しつこくて申し訳ないのですが、
__FUNCTION__ もしくは __func__ が実装されていない
コンパイラ(ARM7)を使用している場合、
関数中で関数名を抜くことはできますでしょうか?
すいません、よろしくお願いします。
292デフォルトの名無しさん:04/12/04 03:07:20
>>291
直書きしろ。いや、関数名取ろうとなんて考えるな。
293278:04/12/04 03:50:27
みなさん、ありがとうございました。
http://www.garret.ru/~knizhnik/cppreflection/docs/reflect.html
を参考に、もう少しだけがんばってみようと思います。
294デフォルトの名無しさん:04/12/04 08:27:02
ruby以外の言語は糞
295デフォルトの名無しさん:04/12/04 10:55:48
void set_callback(void (*func)());
のような関数に、メンバ関数を渡したいんですがうまい方法はないでしょうか?

class A {
public: void callback() {...}
};
A a;
void callback_wrapper(){
 a.callback();
}

main() {
 set_callback(a.callback); //エラー
 set_callback(callback_wrapper);//ださい
 set_callback(mem_fun_pointer_to_global_fun_pointer<A>(a,callback));//できることなら
}
296デフォルトの名無しさん:04/12/04 11:06:23
>>295
ラッパー書け
297デフォルトの名無しさん:04/12/04 11:13:27
>>295
staticなメンバ関数しか出来ないような希ガス。
メンバ関数へのポインタってアドレス取っても変なアドレスになるしな。
仮想関数ならなおさら。
298デフォルトの名無しさん:04/12/04 11:15:03
>>295

template <class T>
void set_callback(T* pthis, void (T::* func)()) {
  // 保持

  // 使う
  (pthis.*func)();
}
299デフォルトの名無しさん:04/12/04 11:17:43
#include <iostream>

class Test {
static int i;
public:
Test() {}
static void print() {
std::cout << "i = " << i << std::endl;
}
static void set(int j) { i = j; }
};

int Test::i;

int main()
{
Test t;

t.set(10);
t.print();

void ((*func)()) = static_cast<void ((*)())>(&t.print);

func();
}
300デフォルトの名無しさん:04/12/04 11:27:32
int* sumArrays(int* a, int* b, int N){
int* c = new int[N];
for (int i = 0; i < N; ++i)
c[i] = a[i] + b[i];
return c;
}

これってコンパイルとラン可能ですよね?
自分でやってみたら、動いたんですけど。。。
でもエラーとか不利点とか、あるみたいで、それがいまいち、よく分からないんですが。。。

ポインターって、関数で、&パス(リファレンス)できないですよね?
なんでですか?
301デフォルトの名無しさん:04/12/04 11:39:40
>>300
おいおいdeleteは?
それから&*ってすればポインタのリファレンス取れるぞ。
302295:04/12/04 11:42:21
>>296
最終的にはそうなるんだけど、なんとかその処理を自動化できないかと思いまして。

set_callback(mem_fun_pointer_to_global_fun_pointer<A>(a,callback));

↓なんか変態的な処理

//どっかグローバルな場所
void generated_wrapper() {
 a.callback();
}
//関数内
set_callback(generated_callback);

みたいな。

>>298のようにset_callback側のラッパを書くにしても、最終的に
set_callbackにvoid (*)()を渡してやらねばならないのでコマル
303デフォルトの名無しさん:04/12/04 11:44:42
>>302
だから標準C++の仕様ではどうあがいても(ry
304デフォルトの名無しさん:04/12/04 11:45:11
>>302
class A {
 int i;
public:
 explicit A(int n) : i(n) {}
 void callback() { std::cout << "num : " << i << std::endl; }
};

template <class T>
class myCallback {
 typedef void (T::* cbFunc)();
 T* _obj;
 cbFunc _func;
public:
 myCallback(T* obj, cbFunc func) : _obj(obj), _func(func) {}
 void exec() { (_obj->*_func)(); }
};

int main()
{
 A a(10);
 myCallback<A> cb(&a, &A::callback);
 cb.exec();
}
こんなんじゃダメか?
305295:04/12/04 11:52:32
>>304
あースマソ
グローバル関数ポインタを要求する既成のライブラリがあって、
それをどうにかしたいんですよ。

でも冷静に考えるとかなり複雑な処理をする必要がある……
これはあきらめたほうがいいかもわからんね。
306デフォルトの名無しさん:04/12/04 12:07:57
>>305
気づくのが遅いよ池沼
307デフォルトの名無しさん:04/12/04 12:18:00
>>306
(・3・)
308デフォルトの名無しさん:04/12/04 13:08:32
>>305
サンクという方法もあるが、素直にラッパー書いたほうが簡単かもね。
309デフォルトの名無しさん:04/12/04 13:26:29
>>305
WindowsAPIのコールバック関数みたいにユーザー定義の値を別に渡せないのか?
310デフォルトの名無しさん:04/12/04 15:02:19
>>305
「既存の」じゃなければ関数オブジェクトをお奨めするところだが。
311デフォルトの名無しさん:04/12/05 02:58:36
「プログラミング作法」p.136-139のコードを見ていて思ったのですが、
reallocした返り値のアドレスが元のアドレスとは異なる可能性があることを
考慮していないのはマズイのではないでしょうか?

つまり、char *buffer が仮に"ABCDEFGH"を指しているとして、
char *p1 = buffer + 1; /* *p1 == 'A' */
char *p2 = buffer + 2; /* *p2 == 'B' */
char *p3 = buffer + 3; /* *p3 == 'C' */

char *temp = realloc(buffer, size_hoge);
if (temp == NULL) { /* blah */ }
buffer = temp;
bufferがreallocで別の所に飛ばされればp1, p2, p3はもう無効ですよね?
それを避けるためにはint p1, p2, p3のようにオフセットで管理するよう変更しなければならないですよね?
312デフォルトの名無しさん:04/12/05 03:43:28
>>311
確かにそのコードはマズイね。
reallocに成功した時点でbufferはdeallocateされてるから
p1,p2,p3を再割り当てするかオフセット管理しないと…
313デフォルトの名無しさん:04/12/05 04:07:18
>>311
どれに対するレス?
「プログラミング作法」ではそんなコーディングしてないよね?
314デフォルトの名無しさん:04/12/05 08:59:34
#include<stdio.h>
int main(void){

int a[2];
int *p;
int cnt;

a[0]=1;
a[1]=2;
a[2]=3;

*p=a;

for(cnt=0; cnt<3; cnt++ )
{
printf("Input data %d\n",*p[cnt]);
}
return 0;

上のプログラムをコンパイルしたらエラーが出ました。ポインターの部分というのは分かるのですが
すいませんご指導お願いします。
ex.c:12: warning: assignment makes integer from pointer without a cast
ex.c:16: invalid type argument of `unary *'
315デフォルトの名無しさん:04/12/05 09:15:37
*pの型はint
pの型はint*
316デフォルトの名無しさん:04/12/05 09:30:47
*p=a; はint*ではないのですか?
317デフォルトの名無しさん:04/12/05 09:45:39
>>316
*p=a; は代入式に決まっておろうが、という突っ込みはさておき。

int *p;
これで宣言/定義されたint型ポインタは p だよ。
int* p;
上と同じだが、この方が判りやすいかも。
318デフォルトの名無しさん:04/12/05 09:56:26
int *p;はint型ポインタは p という意味で、
*p=a;そのポインタpにaを代入・・・つまり、先ほどのプログラムを実行するには
*p=a[2]とすればいいのですかね?
319デフォルトの名無しさん:04/12/05 10:00:08
printf("Input data %d\n",*p[cnt]);がダメって言われました。何ででしょう?
invalid type argument of `unary *'
320デフォルトの名無しさん:04/12/05 10:01:25
printf("Input data %d\n",*p[cnt]);がダメって言われました。何ででしょう?
invalid type argument of `unary *'
321デフォルトの名無しさん:04/12/05 10:06:24
int *p;

p=1←pに1を代入
*p=1←*p(=pが指しているint変数)に1を代入
322デフォルトの名無しさん:04/12/05 10:08:11
>>318
違う。
p = aでいい。
pに配列aの最初のアドレスを代入。
配列の添え字を省略した場合、最初の添え字のアドレスを指すのは理解してるよね。

あとint a[2]と定義してるのにa[2]に代入するのは危険。
定義時の添え字は全体の個数、実際に使うのは添え字0からの数。

printfのところは*p[cnt]ではなく、p[cnt]でいい。

#include<stdio.h>

int main(void)
{
   int a[3];
   int cnt;

   a[0] = 1;
   a[1] = 2;
   a[2] = 3;
   p = a;

   for( cnt=0 ; cnt<3 ; cnt++ ) {
       printf("Input data %d\n", p[cnt]);
   }

   return 0;
}
323デフォルトの名無しさん:04/12/05 10:10:16

int *p;
が抜けてた。

ポインタは難しいけど、理解すればカンタンだよ
324デフォルトの名無しさん:04/12/05 10:22:52
もし、*p[cnt]とした場合、プログラムの意味的にはどういう意味になるのですか?
すいませんたびたび
325デフォルトの名無しさん:04/12/05 10:28:25
どっちの優先順位が高いのか忘れた。

*(p[cnt])
あるいは
(*p)[cnt]


プログラム的にはどっちもエラーだな。
326デフォルトの名無しさん:04/12/05 10:31:05
>>325
前者が正解
327デフォルトの名無しさん:04/12/05 10:31:06
classのprivate:で宣言した変数int *pA;をGet_A()などで値渡ししないで変えられないようにする方法はありますか?

#include <stdio.h>

class PIYO{
private:
int *A;
public:
const int *Get_A( void ){
return A;
}
PIYO( void ){
A = new int;
*A = 6;
}
};

int main( void ){
class NEKO Hoge;

int *B = ( int * )Hoge.Get_A();

//かえられてしまう
*B = 3;

const int *C = Hoge.Get_A();

printf( "%d" , *C );

return 0;
}
328デフォルトの名無しさん:04/12/05 10:38:58
>>327
そんなキャストするやつが悪い。
329デフォルトの名無しさん:04/12/05 10:43:59
>>327
>>328に激しく同意
そんなこといったらどんなprivateメンバだって((void *)&Hoge)[1]とかやれば変えられてしまう。たぶん
330デフォルトの名無しさん:04/12/05 10:44:13
つまり、優先順位を気をつけて、printf("Input data %d\n", *(p[cnt]));
こんな感じでしょうか?
でもエラーなんですか・・・
331デフォルトの名無しさん:04/12/05 10:47:14
>>327
なんでconst int *Bにしないの?
332デフォルトの名無しさん:04/12/05 10:47:24
わざわざ小難しく考える事ない。できるだけシンプルに。
配列とポインタは似て非なる物。
333デフォルトの名無しさん:04/12/05 10:48:12
>>330
#include<stdio.h>

int main(void)
{
int a[3];
int cnt;
int *p;

a[0] = 1;
a[1] = 2;
a[2] = 3;
p = a;

for(cnt=0 ; cnt<3 ; cnt++) {
printf("Input data %d\n", p[cnt]);
}

return 0;
334デフォルトの名無しさん:04/12/05 10:50:29
p[cnt]は、pが指してるアドレス(ここではa[0])からcnt分だけアドレスを進めた場所にある内容を指す。
*(p[cnt])だと、内容の内容になってわけわかめ。

ポインタの本一冊買って勉強するといいよ。特にメモリの事詳しく説明してる本。
335デフォルトの名無しさん:04/12/05 11:00:39
>>330
こうすれば問題なく動く。
#include<stdio.h>

int main(void)
{
  int a[3];
  int cnt;
  int (*p)[3];

  a[0] = 1;
  a[1] = 2;
  a[2] = 3;
  p = &a;

  for(cnt=0 ; cnt<3 ; cnt++) {
  printf("Input data %d\n", (*p)[cnt]);
  }

  return 0;
}
336デフォルトの名無しさん:04/12/05 11:09:31
>334
なるほど!わっかりました!すいません日曜の朝にこれからも精進していきます
337デフォルトの名無しさん:04/12/05 11:16:32
インスタンスメソッドのポインタを
関数ポインタに格納することはできるのでしょうか?

class class1{
public:
    void (*proc)();
    void method();
}c1;
c1.proc = c1.method;

6行目 error C2440: '=' : 'void' から 'void (__cdecl *)(void)' に変換できません。
338デフォルトの名無しさん:04/12/05 11:19:30
>>337
c1.proc=class1::method
339デフォルトの名無しさん:04/12/05 11:20:24
class class1 {
public:
void (class1::*proc)();
void method();
} c1;
c1.proc = c1::method;
340デフォルトの名無しさん:04/12/05 11:31:47
>>338 >>339
ありがとん
341デフォルトの名無しさん:04/12/05 13:45:59
*(p[cnt])だと、p[cnt]で示されるアドレスの部分の値を読もうとするのかもナ。
342デフォルトの名無しさん:04/12/05 21:48:46
標準C++の基礎知識(柏原正三 著:ASCII)を読んでC++を勉強しているのですが、
そのP.135に書いてある以下のサンプルコードがコンパイルできません。
どなたかアドバイスをお願いします。

【ソースコード】
#include <iostream>
#include <string>
using namespace std;


class MyClass {
static string class_string;

public:
static void SetString(string str) { class_string = str; }

static string Show() { return class_string; }
};

static MyClass::class_string = "MyString";

int main()
{
cout << MyClass::Show() << endl;
MyClass::SetString("Changed!");
cout << MyClass::Show() << endl;

return 0;
}
343342:04/12/05 21:49:14
【エラー内容】
list6-3.cxx:29: error: ISO C++ forbids declaration of `class_string' with no
type
list6-3.cxx:29: error: `static' may not be used when defining (as opposed to
declaring) a static data member
list6-3.cxx:29: error: conflicting types for `int MyClass::class_string'
list6-3.cxx:14: error: previous declaration as `std::string
MyClass::class_string'
list6-3.cxx:29: error: invalid conversion from `const char*' to `int'

【動作環境】
OS: FedoraCore 1
コンパイラ: gcc 3.3.2-1

よろしくお願いします。
344デフォルトの名無しさん:04/12/05 21:53:52
- static MyClass::class_string = "MyString";
+ string MyClass::class_string = "MyString";
345デフォルトの名無しさん:04/12/05 21:55:19
static MyClass::class_string = "MyString";

string MyClass::class_string = "MyString";
346345:04/12/05 21:55:41
orz
347344:04/12/05 21:56:08
あと通常 inline からは static データメンバに正常にアクセス出来ないからな
何読んでるか知らんが窓から投げ捨てておけ
348デフォルトの名無しさん:04/12/05 21:57:18
> 何読んでるか知らんが
標準C++の基礎知識(柏原正三 著:ASCII)と書いてあるが。
349デフォルトの名無しさん:04/12/05 21:57:43
>>347
>>342の1行目
350デフォルトの名無しさん:04/12/05 21:58:12
道を歩いていたらマンションの二階のガキが嘗めていたあめ玉を吐きだしたのが直撃して
頭を縫うハメになったことがあるから窓からものを投げ捨てるのは良くないと思うのです。
351デフォルトの名無しさん:04/12/05 21:58:55
Rubyならこんなまだるっこしい事しなくて済むのにね。
352デフォルトの名無しさん:04/12/05 21:59:13
>>348-349
orz
353デフォルトの名無しさん:04/12/05 21:59:30
>>351
それは禁句
354342:04/12/05 22:01:35
>>344-345
ありがとうございます。
inlineからstaticなデータメンバには正常にアクセスできないんですか。
知りませんでした。
ありがとうございました。
355デフォルトの名無しさん:04/12/05 22:02:23
やっぱり時代はrubyに向けて流れていると言える。
Ruby最強!
356デフォルトの名無しさん:04/12/05 22:09:31
>>348
その本持ってるから見てみた。P135じゃなくて134だと思うが
string MyClass::class_string = "MyString";
になってた。
357デフォルトの名無しさん:04/12/05 22:26:08
MinGWではdrand48()は使えないんですか?
358デフォルトの名無しさん:04/12/05 22:27:12
マルチ
359デフォルトの名無しさん:04/12/05 22:35:36
>>347
> あと通常 inline からは static データメンバに正常にアクセス出来ない

聞いたこと無いな。ほんとか?
360デフォルトの名無しさん:04/12/05 22:43:38
>>359
つC++ FAQ
361デフォルトの名無しさん:04/12/05 23:06:11
警告 W8017 c:\Borland\Bcc55\include\stdlib.h 117: マクロ 'abc' の重複定義

とコンパイルすると警告出ますが、対応教えてくださいませませ。
362デフォルトの名無しさん:04/12/05 23:08:16
>>361
absじゃなくて?
363デフォルトの名無しさん:04/12/05 23:13:18
ご指摘とおり、absでした。
364デフォルトの名無しさん:04/12/05 23:13:51
>>359
俺も聞いたこと無い。
思いつくキーワードで手当たり次第ぐぐってみたけど見つからないんだけど
ほんとなのかな?
365デフォルトの名無しさん:04/12/05 23:15:25
>>362
エスパー乙
366デフォルトの名無しさん:04/12/05 23:16:11
>>360 くわしく。
367デフォルトの名無しさん:04/12/05 23:21:54
>>359
わしも聞いたことない。
普通に考えてそんなことあり得ないと思うんだけど。
368デフォルトの名無しさん:04/12/05 23:49:01
inlineがstaticデータメンバにアクセスできない?知ったか君、いい加減にしなさい。
369デフォルトの名無しさん:04/12/06 00:09:41
アクセスできない、じゃなくてinlineでアクセスしてはいけない、だよ。

知らない癖になんで偉そうなんだ?無知を誇るな。いい加減にしなさい。
370デフォルトの名無しさん:04/12/06 00:11:56
情報のソースを示してくれ。
少なくとも俺はそんなの聞いたこと無い。
371デフォルトの名無しさん:04/12/06 00:12:45
>>369みたいなのはほっといて、漏れも理由が知りたい
372371:04/12/06 00:13:17
>>368だった
373デフォルトの名無しさん:04/12/06 00:19:19
>>369
ソースを示してからそのセリフ吐きなよ。
ドラフトのどこにそんな事が書いてあるんだ?知ったか君。
374デフォルトの名無しさん:04/12/06 00:20:42
>>373 そこでなんで「ドラフト」なんだよ。
375デフォルトの名無しさん:04/12/06 00:21:29
ばかだなぁ。ドラフトじゃなきゃ意味ないだろ。
376デフォルトの名無しさん:04/12/06 00:21:50
楽天にドラフトでいきたい
377デフォルトの名無しさん:04/12/06 00:22:30
>>375 正式な規格書じゃなくて、なんで草案(ドラフト)のほうなのさ?
378デフォルトの名無しさん:04/12/06 00:30:36
ばかだなぁ。ドラフトじゃなきゃ面白くないだろ。
379デフォルトの名無しさん:04/12/06 00:32:36
おまえら正式な規格書読んで喜んでるのか?ケッ、はやりじゃねぇんだよ。
380デフォルトの名無しさん:04/12/06 00:33:03
どっちが知ったか君なんだ。知ったか君って言いたかっただけか。
381デフォルトの名無しさん:04/12/06 00:40:37
そういや暗黙の inline は問題なくても
明示的な inline で怒られるのってなんで?

普通にソース書く分ではエラーは出ないけど
実際その関数を呼び出すとなるとエラーなんだよね…(´・ω・`)
ついでだからおせーてちょ
382デフォルトの名無しさん:04/12/06 00:51:05
>>381
ソース貼ってみ。
383デフォルトの名無しさん:04/12/06 01:12:43
#include <iostream>

//ここから hoge.h
class Hoge{
private:
inta;
public:
Hoge(){ a = 10; }
void hage();
};

//ここから hoge.cpp
inline void Hoge::Mage(){
a = 100;
std::cout << a << std::endl;
}

//ここから main.cpp
int main(int argc, char *argv[]){
Hogehoge;
hoge.Mage();
returnEXIT_SUCCESS;
}

言われて書いてみた。で、新たに不思議なことが。
↑のソースをmain.cpp内に全て書いたら問題なかったんだけど
クラス宣言を hoge.h, メンバ関数を hoge.cpp で書いた時は
Hoge error LNK2019: 未解決の外部シンボル "public: void __thiscall Hoge::hage(void)" (?hage@Hoge@@QAEXXZ) が関数 _main で参照されました。が出るよ…

もちろんファイル分けたときはインクルード個別にしてるし、インクルードガードもちゃんとしてます
最初に確認したのはVC6.0だったけど、今はこれ VC7.1 です
384デフォルトの名無しさん:04/12/06 01:15:15
あ、エラー文の hage は Mage に置き換えてください
結構お馬鹿な疑問(?)でしょうが、よろしくおねがいします
385デフォルトの名無しさん:04/12/06 01:17:37
気になったんで調べてみた。
確かにC++ FAQsの
FAQ 16.04 Can inline functions safely access static data members?
で、「No!」ってはっきり書いてあるね。
386デフォルトの名無しさん:04/12/06 01:18:36
>>383
inline関数の定義はその関数を使用するすべてのコンパイル単位に必要。
387デフォルトの名無しさん:04/12/06 01:18:56
あう すいません、なんかめちゃくちゃになってますね…
#include <iostream>
//#include "hoge.h"

class Hoge{
private:
inta;
public:
Hoge(){ a = 10; }
void hage();
};

inline void Hoge::hage(){
a = 100;
std::cout << a << std::endl;
}

int main(int argc, char *argv[]){
Hogehoge;
hoge.hage();
returnEXIT_SUCCESS;
}

これで上記のエラーが出ます
何度もすみません。・°・(ノД`)・°・。
388デフォルトの名無しさん:04/12/06 01:20:26
>>385
URL 教えてくれないか?
389デフォルトの名無しさん:04/12/06 01:22:41
>>385
↓これとは違うんだな。
ttp://www.parashift.com/c++-faq-lite/

んで、理由は?
390デフォルトの名無しさん:04/12/06 01:24:45
>>386
上記で言うと具体的にどこでどのように書くのでしょう?

ミス続きなのでごめんなさい(´・ω・`)
391デフォルトの名無しさん:04/12/06 01:29:04
>>390
inline関数はヘッダに含めなさい
392デフォルトの名無しさん:04/12/06 01:29:45
>>390
class Hoge の定義と同じファイルに書いてしまう。
393デフォルトの名無しさん:04/12/06 01:30:18
>>383
インライン関数はコンパイル時に展開処理されるので、
関数呼び出し位置から、その関数の定義が見えていなければならない。

非インライン関数はリンカで最終的に結合されるため、
コンパイル段階では宣言のみが見えていればいい。

>>390
ヘッダファイルに定義を書く
394デフォルトの名無しさん:04/12/06 01:35:10
>>390, 391
なるほど

つーことは明示的 inline と 暗黙の inline は
読みやすさに気を配る人は前者、
特に気にしない人は後者みたいな認識でいいのかな?

付き合ってくれてありがd
395デフォルトの名無しさん:04/12/06 01:36:16
>>393も詳しい解説ありがd
396デフォルトの名無しさん:04/12/06 01:39:19
もうだめ…
×>>390,,391
>>391,392

社会人になるまでに直さなきゃ
今日はとっとと寝ときます
397デフォルトの名無しさん:04/12/06 01:40:40
>>389
意訳になるけど、
ユーザー定義型のstaticデータメンバが初期化されるのが保証されているのは
staticメンバの定義があるのと同じコンパイル単位の、non-inline関数が呼び出される前だから、
もし別のコンパイル単位からnon-inline関数を呼び出す前にinline関数を呼び出してしまうと
初期化される前にstaticメンバを利用してしまう可能性がある

らしい。日本語版は売り切れてて持ってないから間違ってるかもしれない(´・ω・`)

サンプルソースを引用すると
// Hoge.hpp
class Hoge {
public:
  static void f() throw();
  static string g() throw();
private:
  string s_;
};
inline string Hoge::g() throw() { cout << s_; return s_; }

// Hoge.cpp
#include "Hoge.hpp"
string Hoge::s_ = "Hello";
void Hoge::f() throw() { cout << s_; } // OK 初期化は保証されている

// main.cpp
#include "Hoge.hpp"
int main() { Hoge::g(); } // s_は初期化されているか?
398デフォルトの名無しさん:04/12/06 01:45:32
- string s_;
+ static string s_;
399デフォルトの名無しさん:04/12/06 01:53:42
>>397
__declspec(selectany)使ってヘッダにstaticメンバを書いたらどうなるんだろう
400デフォルトの名無しさん:04/12/06 02:22:13
>>397
その理由が問題にしているのはこれだろう。
3.6.2/3 から引用。
"If the initialization is deferred to some point in time after the first statement of main,
 it shall occur before the first use of any function or object defined in the same translation unit as the object to be initialized."

簡単に訳すと、
「初期化がmainの最初の文よりも後に遅らされるとすれば、
 同じ翻訳単位で定義されているどの関数、オブジェクトの
 最初の使用よりも前で無ければならない。」
(最後の"as the object to be initialized"がよくわからない)

397の意訳では、
「関数、オブジェクトの使用」を「non-inline関数の呼び出し」に限ってしまっているのが、
規格の意図とは違うと言えるだろう。
401デフォルトの名無しさん:04/12/06 02:31:40
>>400
なるほど… 原文では

 Static data members are guaranteed to be initialized
before the first call to any non-inline function within
the same source file as the static data's definition.

となってたもんで。
402デフォルトの名無しさん:04/12/06 08:18:41
ところで、ドラフトな知ったか君はドコいった?
403デフォルトの名無しさん:04/12/06 20:43:27
お願いします。。VC++6.0を使っているのですが、ウォッチウィンドウでAという関数の返り値を調べたいのです。
ソース内で、Aという関数の引数にBという関数の戻り値を使っています。B(C)がエラーとして-1を返した時に、A(-1);となるので、
そのばあいA関数内でexit(-1);が呼び出されるようにしているのですが、ウォッチウィンドウにA(B(C))と打って、
Bの返り値が-1だった時に、VC++が異常終了してしまいます。(以降.dswを削除しないと起動しません。)
ウォッチウィンドウでBの返り値が-1だった時にA()を呼び出さないようにするにはどうしたらいいのでしょうか。。
ちなみにA((B(C)!=-1)?B(C):999)では動きませんでした。。(999はとりあえずの例です。)
長文すみません。。
404デフォルトの名無しさん:04/12/06 20:44:44
お願いします。。VC++6.0を使っているのですが、ウォッチウィンドウでAという関数の返り値を調べたいのです。
ソース内で、Aという関数の引数にBという関数の戻り値を使っています。B(C)がエラーとして-1を返した時に、A(-1);となるので、
そのばあいA関数内でexit(-1);が呼び出されるようにしているのですが、ウォッチウィンドウにA(B(C))と打って、
Bの返り値が-1だった時に、VC++が異常終了してしまいます。(以降.dswを削除しないと起動しません。)
ウォッチウィンドウでBの返り値が-1だった時にA()を呼び出さないようにするにはどうしたらいいのでしょうか。。
ちなみにA((B(C)!=-1)?B(C):999)では動きませんでした。。(999はとりあえずの例です。)
長文すみません。。
405デフォルトの名無しさん:04/12/06 20:47:45
しかも2重すいません・・・orz
406デフォルトの名無しさん:04/12/06 22:11:29
 
407デフォルトの名無しさん:04/12/07 00:43:02
more Effective C++ を読んでいるのですが、自作クラスのoperator をprivateで隠蔽する、っていうのは皆さんやってるんでしょうか?
ベテランの人の意見をお聞かせ願いますか?

隠蔽したいときは隠蔽する、的な解はいりません
408デフォルトの名無しさん:04/12/07 01:08:48
>>407
>隠蔽したいときは隠蔽する
これ以外の回答は有り得ないのだが?
409デフォルトの名無しさん:04/12/07 01:13:25
つまり解はいりませんのです。
410デフォルトの名無しさん:04/12/07 01:16:23
よっしゃっ、おじさんが回答しちゃる。

 隠蔽する必要があれば隠蔽する

これだな。
411デフォルトの名無しさん:04/12/07 01:16:42
おあとがよろしいようで。さんくす。
412デフォルトの名無しさん:04/12/07 01:58:59
Cで、計算したデータをファイルに書き出したいんですけど、
例えばdata_on_001_times.dat、data_on_002_times.dat ・・・
みたいに、何回目のデータかわかるように名前をつける
(ファイル名に変数を使う?)ことってできるんでしょうか?
できるならやり方を教えて欲しいです。
413デフォルトの名無しさん:04/12/07 02:01:00
>>412
sprintf
414デフォルトの名無しさん:04/12/07 02:01:42
今まで何度同じ質問が出てきたことか…( -ω-)y-~~
415412:04/12/07 02:08:44
すみません・・・
ありがとうございます。
416デフォルトの名無しさん:04/12/07 02:15:10
初心者歓迎じゃないのかYO!
417デフォルトの名無しさん:04/12/07 02:17:49
同じ質問のデジャブは初心者スレでは仕方がないな。
だれかがFAQをまとめてくれるとみんながハッピー。
418デフォルトの名無しさん:04/12/07 02:41:28
bcbにて
ボタンを押してる間ずっと数値が増えるようなプログラムを作りたいです
ご指導ご鞭撻をお願い致します
419デフォルトの名無しさん:04/12/07 03:10:27
>>418
こっち
C++Builder相談室 Part12
http://pc5.2ch.net/test/read.cgi/tech/1099238936/l50
420デフォルトの名無しさん:04/12/07 03:33:58
>>418
一番簡単に済ませるにはOnMouseDown/OnMouseUpで
Threadを動かすといいね。

--- Unit1.cpp
IncrementThread* itp;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
itp = new IncrementThread(false); // Labelをインクリメントする

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
itp->Terminate();
delete itp;
}
421デフォルトの名無しさん:04/12/07 03:34:53
--- Unit2.cpp
__fastcall IncrementThread::IncrementThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall IncrementThread::Execute()
{
while (!Terminated)
Synchronize(IncrementLabel);
}
//---------------------------------------------------------------------------
void __fastcall IncrementThread::IncrementLabel()
{
int i;
i = Form1->Label1->Caption.ToIntDef(0) + 1;
Form1->Label1->Caption = AnsiString(i);
}
422デフォルトの名無しさん:04/12/07 03:37:13
カウントアップする速度はSleep()か何かでExecute()内のループを
制御する。上のプログラムは省略してあるが。
423デフォルトの名無しさん:04/12/07 13:35:46
今、ウィンドウを作成してるのですがリサイズできるようにするには
どうしたらいいですか?ご教授お願いします。
424デフォルトの名無しさん:04/12/07 13:38:24
せめてOSとコンパイラの名前ぐらい書いとけ。
425デフォルトの名無しさん:04/12/07 13:40:37
すいません。windows2000で.NETC++でやってます。
426デフォルトの名無しさん:04/12/07 13:54:07
>>425
MFCでデザインしているならダイアログのプロパティ。
427デフォルトの名無しさん:04/12/07 16:45:19
File I/Oでなんだけど、
ofstream outStream;
ousStream.open("file.txt",ios::app)
このios::appって、なに?
428デフォルトの名無しさん:04/12/07 16:47:44
>>427
「ファイルの末尾に追加」を示すフラグ
429デフォルトの名無しさん:04/12/07 16:54:31
ここ一年C#だったんでC++のこと忘れぽ。おまいら教えてください。

class hoge { public: int i; };
class mage { public: void * h; };

class Visitor
{
public:
  virtual void visit (hoge* X) { }
  virtual void visit (mage* X) { }
};

class DerivedVisitor : public Visitor
{
public:
  void f (hoge * X) { visit (X); }
  void visit(mage * X) { }
};

っていうコードがあったとき、DerivedVisitor::f() の中からの visit 呼び出しでエラーになるっす。
(続く)
430429:04/12/07 16:54:58
-----------
> gcc testmain.cpp
testmain.cpp: In member function `void DerivedVisitor::f(hoge*)':
testmain.cpp:14: error: no matching function for call to `DerivedVisitor::visit
  (hoge*&)'
testmain.cpp:15: error: candidates are: virtual void
  DerivedVisitor::visit(mage*)
-----------

VC↓
-----------
...\testmain.cpp(14) : error C2664: 'DerivedVisitor::visit' : 1 番目の引数を 'hoge *' から 'mage *' に変換できません。
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
-----------

Visitor::visit ってやれば回避できるのは解るんだけど、知りたいのはそういうことじゃなくて、なんでここで仮想関数呼び出しじゃなくて、ふつうのメソッド呼び出しになっちゃうんだ?っていうのが疑問。
Visitor を継承した時点で、visit(mage *) は vftable に登録されるんじゃ無いのかとかそういうC++の言語構造がわかんなくなった。

どうなってるん?
431429:04/12/07 16:55:20
-----------
> gcc testmain.cpp
testmain.cpp: In member function `void DerivedVisitor::f(hoge*)':
testmain.cpp:14: error: no matching function for call to `DerivedVisitor::visit
  (hoge*&)'
testmain.cpp:15: error: candidates are: virtual void
  DerivedVisitor::visit(mage*)
-----------

VC↓
-----------
...\testmain.cpp(14) : error C2664: 'DerivedVisitor::visit' : 1 番目の引数を 'hoge *' から 'mage *' に変換できません。
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
-----------

Visitor::visit ってやれば回避できるのは解るんだけど、知りたいのはそういうことじゃなくて、なんでここで仮想関数呼び出しじゃなくて、ふつうのメソッド呼び出しになっちゃうんだ?っていうのが疑問。
Visitor を継承した時点で、visit(mage *) は vftable に登録されるんじゃ無いのかとかそういうC++の言語構造がわかんなくなった。

どうなってるん?
432デフォルトの名無しさん:04/12/07 17:02:21
>>431
仮想関数に関数の多重定義解決を混ぜるな。
ほぼ間違いなく意図通りの動作をしない。

今の例で言うと、'DerivedVisitor::visit(mage *)が仮想関数 'Visitor::visit(hoge *)を
隠蔽しているため、DerivedVisitor::visit(mage *)は仮想関数として処理されない。
virtualを付けても無駄です。
433デフォルトの名無しさん:04/12/07 17:05:55
仕様だね。
俗に言う(本当に言われてるかは知らん)
「名前が隠される」状態。
434429:04/12/07 17:33:23
仕様かー。なら仕方ない。とりあえず、こうしてみた。
-------
class Visitor;

class base { public: virtual void accept(Visitor * v) = 0; };

class hoge : public base{ public: void accept(Visitor * v); };
class mage : public base{ public: void accept(Visitor * v); };

class Visitor
{
public:
  void visit (base* X) { X->accept(this); }
  virtual void visitHoge(hoge* X) { /* default action */}
  virtual void visitMage(mage * X) { /* default action */}
};

class DerivedVisitor : public Visitor
{
public:
  void f (hoge * X) { visit (X); }
  void visitMage(mage * X) { }
};

void hoge::accept(Visitor * v) { v->visitHoge(this); }
void mage::accept(Visitor * v) { v->visitMage(this); }
-------
visitHoge とか、visitMage とか妙な感じだ。マクロとかテンプレート(ここで使えるのか?)とか使いたくないから、これで我慢するしかないのかな?
ありがとう、432,433。
435429:04/12/07 17:36:32
434、一行目。
仕様かー を 隠蔽かー に読み替えてくれるとありがたい。

だからどうしたって感じだけど。
436デフォルトの名無しさん:04/12/07 17:51:49
どうしても>>429の形式にしたいのなら、
Derivedの中に、
using Visitor::visit;
の行を入れればよい。

Visitor::のvisitという名前が、現在の名前照合空間に含まれるようになる。
437デフォルトの名無しさん:04/12/07 18:19:23
Visual C++ 6.0とWindows2000で以下のようなプログラムを作っています。


1.5秒ごとに特定フォルダをチェック。

2.そこへホストからファイルがftp転送(PUT)されてくる。

3.転送されたファイルを見つけたら、別の場所へコピーする。

4.1へ戻る。


しかし、3の段階でファイルが転送中にもかかわらず、ファイルをコピーしようとして失敗します。
これはftp転送の仕様上、ファイルが少しずつ出来上がっていくからだと思いますが、
転送が完全に終わるまでコピーしない(転送が終わったかどうか判断する)方法をご教授ください。
438デフォルトの名無しさん:04/12/07 18:28:25
>>437
ダウンロード終了(してプログラムがファイルを閉じる)まではCreateFileのdwShareを0にするとオープンできないはずだから、
それを使ったらどうだ?オープンできたら、ついでにReadFile/WriteFileあたりを使って自分でコピーしたらどうだ。
439429:04/12/07 19:55:55
thx, 436
440デフォルトの名無しさん:04/12/07 20:45:49
cmd.exeをWindowを表示させずに起動させたい場合はどうすればよいですか?
CreateProcessではSW_HIDEで指定しても無理だということになってるのでよろしくお願いします。
441デフォルトの名無しさん:04/12/07 20:46:51
>>440
何がやりたいんだ。
442デフォルトの名無しさん:04/12/07 20:50:02
コマンドプロンプトで動くソフトの出力をPipeを使って取り込もうとしています。
でもプロンプトがでてしまうのでどうにかならないかと思い質問しました。
443デフォルトの名無しさん:04/12/07 20:51:39
ちょ(ry
444デフォルトの名無しさん:04/12/07 21:45:56
>>442
それならCreateProcessでDERACHED_PROCESSを指定すればいいだけ。
445デフォルトの名無しさん:04/12/07 21:56:11
>444
ありがとうございました。やってみます。
446デフォルトの名無しさん:04/12/08 10:29:24
Dateっていうクラスがあって、

ostream& operator << (ostream& os, const Date& d){
os << d.month << d.day << d.year;
return 0;
}

この関数もあるわけなんだけど、このostreamをintとかvoidみたいに使っているのが
いまいち、よくわからないんです。
osっていうのが、ファイルだから、それを受け渡しするときに使うってこと?
でも、なんでosをreturnする必要あるんですか?
ファイルは、存在するわけだから、またメインなり、どこかで、開けばいいんじゃないんですか?
447デフォルトの名無しさん:04/12/08 10:36:10
>>446
マルチ氏ね
448デフォルトの名無しさん:04/12/08 11:37:39
>なんでosをreturnする必要あるんですか?

return 0;
449デフォルトの名無しさん:04/12/08 12:21:47
>.446
マジレスすると、
std::cout << foo << bar << std::endl;
のようにosを返しておくと便利。
ついでに言えば、ostreamはファイルそのものじゃない。
まぁ、C++の入門書でも読んでらっしゃい。
450デフォルトの名無しさん:04/12/08 14:04:24
>>446
そもそもcoutとか使ったことあるのか?
451デフォルトの名無しさん:04/12/08 14:33:25
The C++ Programming Language, Special Edition の翻訳の話はあるのでしょうか?
この版では Locale の話などが追加されているそうです。

http://www.amazon.co.jp/exec/obidos/ASIN/0201700735/qid=1102483504/sr=1-1/ref=sr_1_10_1/250-5642937-2086640

この原著を買うか 3rd の(悪名高い)翻訳を買うかで悩んでいるのですが、新
訳の話があるならそっちの方がいいかな、と考えています。どんなもんでしょ
うか。
452デフォルトの名無しさん:04/12/08 14:36:05
Localeまわりその他SEで追加された部分は禿のサイトからPDFで落とせたはずだが。
453デフォルトの名無しさん:04/12/08 14:46:34
454451:04/12/08 16:07:32
>>452-453

お、これと errata と 3rd があればOKのようですね。
情報ありがとうございます。
455デフォルトの名無しさん:04/12/08 17:17:33
すいません教えてください。

charの比較をしたいのです。
char c; の中は0〜9まで、A〜Cまで。
とチェックしたいのですが、どうしたらよいでしょうか?
456デフォルトの名無しさん:04/12/08 17:20:51
ちぇけらっちょ
457デフォルトの名無しさん:04/12/08 17:22:27
>>455
言語ならC/C++の前に日本語習え
458デフォルトの名無しさん:04/12/08 17:25:31
>>455
('0' <= c && c <= '9') || ('A' <= c && c <= 'C')
459デフォルトの名無しさん:04/12/08 17:27:22
>>455
if (isdigit(c) || toupper(c) - 'A' < 'C' - 'A')
 なんたら;
else
 ほげ;
0-9とA-Fならisxdigitが使える。
460デフォルトの名無しさん:04/12/08 17:28:55
HSPでRPG作りたいんですが、正直難しいと思います。
でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
HSPの基礎からすべてを叩き込んでくれませんか??
お願いします。
461デフォルトの名無しさん:04/12/08 17:30:56
>>460
お願いするとこ間違ってるよ
462デフォルトの名無しさん:04/12/08 17:35:14
>>460
お前に人生のうまい渡り方を教えてやりたいよ。
基礎からすべてをたたき込めなんて大仕事をタダで引き受けさせようとする
お前の根性を叩き直してやりたい。
463デフォルトの名無しさん:04/12/08 17:40:15
>>462
お願いします
464デフォルトの名無しさん:04/12/08 17:54:53
465デフォルトの名無しさん:04/12/08 18:39:45
パーティクルを飛ばすためのプログラムを組めといわれたのだが正直判らんのでだれか教えてください。
開発環境は.NETの2003アカデミック番でGSLIBってのを使ってるっす
466デフォルトの名無しさん:04/12/08 18:43:23
>>465
僕もわかりません。
学校の先生に聞いてください。
467455:04/12/08 19:15:00
>458
>459
ありがとうございました。

>457
すいません、今そっちも勉強中です。
468デフォルトの名無しさん:04/12/08 19:18:34
質問ですunsorted list(ソートされないリスト)で
┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃  ┃  ┃
┗━┻━┻━┻━┻━┻━┛
と配列が渡されたとき、「75」を挿入すると

┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃75┃  ┃
┗━┻━┻━┻━┻━┻━┛
となるので正しいですか??

また、
┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃  ┃  ┃
┗━┻━┻━┻━┻━┻━┛
から53を削除した場合、リストはどの様に並びますか?
よろしくおねがいしますm(_ _"m)
469デフォルトの名無しさん:04/12/08 19:21:22
>>468
これ以上マルチするとアク禁要望出す?かもなー
470デフォルトの名無しさん:04/12/08 19:23:52
>>468
挿入の仕方、削除の仕方による
471デフォルトの名無しさん:04/12/08 19:27:08
要するに答えられないわけですね。
【初心者歓迎】なんてスレだから質問してみたのですが、
カキコした自分が馬鹿でした。
頼りにならない人しかいないなんて知らなかった。
472デフォルトの名無しさん:04/12/08 19:30:28
>>471
質問の仕方が悪いよ。一意に取れない。
473デフォルトの名無しさん:04/12/08 19:37:51
>>471
┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃75┃  ┃
┗━┻━┻━┻━┻━┻━┛
で合ってる

53削除するとこうなる
┏━┳━┳━┳━┳━┳━┓
┃10┃  ┃24┃35┃  ┃  ┃
┗━┻━┻━┻━┻━┻━┛
これでいいか?分かったら帰れ
474デフォルトの名無しさん:04/12/08 19:38:00
>>468>>471は最初に質問した奴じゃないだろ。
面白がってあちこちにコピペ貼りしているだけ。
釣り釣られ〜
475デフォルトの名無しさん:04/12/08 19:51:13
>>474
スルーできないのが普通だからな
476デフォルトの名無しさん:04/12/08 20:40:21
HSPでRPG作りたいんですが、正直難しいと思います。
でもやりたいんです!!僕はHSPでブロック崩し(アルカノイド)
ぐらいなら作ったことあります。
今のところ、オープニングまで作ったのですが、どなたか僕に
HSPの基礎からすべてを叩き込んでくれませんか??
お願いします。
全裸で
477デフォルトの名無しさん:04/12/08 20:44:45
>>476
HSPスレ行け。
478デフォルトの名無しさん:04/12/08 20:44:46
とりあえずオープニング見せてよ
全裸で
479デフォルトの名無しさん:04/12/08 20:46:37
オープニングはあとで作れよ
480デフォルトの名無しさん:04/12/08 20:47:58
>>476
もうそのコピペも飽きた
481デフォルトの名無しさん:04/12/08 20:58:57
私は見た事無いですYO
482デフォルトの名無しさん:04/12/08 21:29:23
すみません、初歩的なことだと思うのですが…

C++で、あるクラスへのポインタの配列を格納する場所を
newするにはどう書けばよいのでしょうか?とりあえず

TEST **ppTest;
ppTest = new (TEST*)[100];

のように書いてみたらエラーが出ます。正しい書き方を教
えてもらえないでしょうか。
483デフォルトの名無しさん:04/12/08 21:33:23
new TEST*[100];
484デフォルトの名無しさん:04/12/08 21:35:33
C++ では生ポインタも配列も使いません。
std::auto_ptr や std::vector, deque 等の使用を考えましょう
485デフォルトの名無しさん:04/12/08 21:37:17
>>484
アホ
486デフォルトの名無しさん:04/12/08 22:25:24
まあオレならboost::shared_array<Test>とかstd::vector<boost::shared_ptr<Test> >とか
使うけどね
487デフォルトの名無しさん:04/12/08 22:32:31
>>486
それ使うとstd::mem_funが動かなくなるから嫌だ。
boost::mem_fn使えばいいけど。
488デフォルトの名無しさん:04/12/08 22:46:33
>>486-487
さらにアホ
489デフォルトの名無しさん:04/12/08 22:51:34
>>488
おまえもアホ
490デフォルトの名無しさん:04/12/08 22:58:39
>>490
俺もアホ
491デフォルトの名無しさん:04/12/08 23:05:40
>>485-490
アホ大杉
492デフォルトの名無しさん:04/12/08 23:19:42
>>482
ppTest = new TEST*[100];
493デフォルトの名無しさん:04/12/08 23:33:05
なにこのスレ
494デフォルトの名無しさん:04/12/09 02:21:13
1・2のアッホ!!

言ってみたかっただけ。
誰もしらんだろうな…。
495デフォルトの名無しさん:04/12/09 03:04:29
なんだか「コン・タロウ」だとか「監督」だとか、妙な単語が頭に浮かぶのだが…
496デフォルトの名無しさん:04/12/09 03:48:19
バイナリ配布する自作のlibXXXに、libstdc++の中から必要なものを
入れておく方法はないでしょうか?

実行形式ならスタティックリンクできるんですが、
libXXXだとどうやったらいいのやらわかりません。

497デフォルトの名無しさん:04/12/09 04:18:30
.netのVC++で、gprofのような解析を行うソフトはありますか?
498482:04/12/09 13:44:02
>>483
>>492
有難うございました!カッコが余計でしたか・・・
勉強になりました。
499デフォルトの名無しさん:04/12/09 13:52:50
質問です。
OS:FreeBSD
コンパイラ: cc
という環境で、次のように定義します。

int i;
char msg0[255],msg1[255],msg2[255];

msg0 = "message 0";
msg1 = "message 1";
msg2 = "message 2";

このように定義したmsg0〜2をforループのなかで順に呼び出したいとき、
つまり変数名の一部としてiを展開するにはどうすればいいのでしょうか?
msgiでは別の変数名になってしまいます。

for (i=0;i<3;i++){
printf("%s",msg???);
}


500デフォルトの名無しさん:04/12/09 13:54:56
>>499
それはギャグのつもりか?
501499:04/12/09 13:57:19
>500
私は大真面目ですが、無知です。

言語使用上、不可能ということでしょうか?
ほかにうまいやり方は無いものですかね?
502499:04/12/09 13:58:06
言語使用上→言語仕様上
503デフォルトの名無しさん:04/12/09 14:07:45
>msg0 = "message 0";
Cではこんな書き方は許されてない(動くけど)。
自分が何をやっているのかも理解できてない。
とりあえず君にCは無理なので、2,3年BASICで
勉強してきた方が良いと思われ。
504デフォルトの名無しさん:04/12/09 14:13:28
>>499
二次元配列にすればいいだけじゃないか。
char msg[3][256];

それが無理ならポインタを使え。
char *pMsg[3] = {msg0, msg1, msg2};
505499:04/12/09 14:31:45
>503
定数の文字列の定義は、次の形が推奨されると了解しました。
(K&R百回読んで逝って来ます)
const char msg0[]="hoge";

>504
ポインタを使う方法で望む動作ができました。

ありがとうございました。もっと勉強します!
506デフォルトの名無しさん:04/12/09 14:32:40
>>499
釣りなんだろうが、つまらないしウザイのでマジレスしとく
初心者用の本の配列のところでも読め
そして自分の馬鹿さが分かったら、プログラミングなんてあきらめろ
507デフォルトの名無しさん:04/12/09 14:37:42
わからないので続けます。
508デフォルトの名無しさん:04/12/09 14:45:04
>>499は半年に一回出るかでないかの逸材だな
509デフォルトの名無しさん:04/12/09 14:53:27
>>499
有名だからって理由だろうが、たぶんお前にはK&R読むのは無理だ。
格好付けていないで、初心者用の本先に読め
それとここくらい目を通してから質問しろ
ttp://www.kouno.jp/home/c_faq/c_faq.html#contents
510デフォルトの名無しさん:04/12/09 15:07:57
>>msg0 = "message 0";
>Cではこんな書き方は許されてない(動くけど)。

動かねぇよ!

>char msg0[255],msg1[255],msg2[255];
>msg0 = "message 0";

配列名への値の代入なんて出来る処理系があるならうp汁。
511デフォルトの名無しさん:04/12/09 15:46:50
>>503も2、3年BASICで勉強してこい
512デフォルトの名無しさん:04/12/09 16:18:59
>>499
新しいCの本買ったら?
あなたにはK&Rは向いてないよ。
513デフォルトの名無しさん:04/12/10 03:10:08
最近2CHのやりすぎで、
>('0' <= c && c <= '9') || ('A' <= c && c <= 'C')
これが顔文字をつかったAAに見えてしかたありません。もうそろそろ足を洗ったほうがいいでしょうか?(Cから)
514デフォルトの名無しさん:04/12/10 09:35:33
>>513
他の言語でも大して変わらんと思うが。
精々 'A' が "A" になるくらい。
515デフォルトの名無しさん:04/12/10 14:52:15
('A`)
516デフォルトの名無しさん:04/12/10 22:25:14
("A")
517デフォルトの名無しさん:04/12/11 01:27:52
int m9['A'];
518Rubyist!:04/12/11 01:40:18
毎度同じネタでうざい
519デフォルトの名無しさん:04/12/11 01:50:15
おまえに言われちゃおしまいだな
520デフォルトの名無しさん:04/12/11 11:20:07
char ch = 1["A"];
521デフォルトの名無しさん:04/12/11 13:00:24
orz=3
522デフォルトの名無しさん:04/12/11 16:01:31
warota
523デフォルトの名無しさん:04/12/11 18:01:14
誘導

AAっぽいプログラムを書くスレ
http://pc5.2ch.net/test/read.cgi/tech/1102065747/
524デフォルトの名無しさん:04/12/12 23:02:50
525デフォルトの名無しさん:04/12/12 23:42:00
>>524
なんだよ
526デフォルトの名無しさん:04/12/13 00:25:34
なぜ、アドレス渡しをすると戻り値はないのでしょうか?教えてください
527デフォルトの名無しさん:04/12/13 00:36:48
アドレス渡しをして戻り値のある関数は幾らでも有るが
528デフォルトの名無しさん:04/12/13 00:40:12
たとえば
#include<string.h>

#difine NAME_MAX 19
#difine BUF 256
{
printf("Input Name : ");
scanf("%s",&buf[0]);
if(strlen(&buf[0]) <= NAME_MA
{
strcpy(&data.name[0],&buf
break;
}
printf("\n Sorry");
}

twice_no(&data);
display_data(data);

return 0;
}

void twice_no(Person *pdata)
{
pdata->no *= 2;

return;
}
529デフォルトの名無しさん:04/12/13 00:48:10
次の方どうぞ
530デフォルトの名無しさん:04/12/13 00:55:29
C++が++Cと命名されなかった理由は何ですか?
531デフォルトの名無しさん:04/12/13 00:58:29
前処理、後処理考えれ
532デフォルトの名無しさん:04/12/13 00:59:24
C++Primeの問題にあったな…
解答編持って無くて未だに模範解答を知らない
533デフォルトの名無しさん:04/12/13 00:59:44
考えたらC++の方が自然だろうに
534デフォルトの名無しさん:04/12/13 01:01:09
すま++Cな
535デフォルトの名無しさん:04/12/13 01:33:42
まったり
536デフォルトの名無しさん:04/12/13 03:12:12
ACE
http://www.cs.wustl.edu/~schmidt/ACE.html
ってどうですか?使ったことのある人の感想などあったら教えてください。
537デフォルトの名無しさん:04/12/13 03:16:38
"++C"は"Cをインクリメントしたもの"
"C++"はCを"インクリメントしたもの"
と解釈するのはどうか

つまり前者はCとは別物の値であり
後者はCに付加価値を与えたもの

いまいち伝わらないか…
まぁでもこういう話はいくらでも出てるんだろうな
538デフォルトの名無しさん:04/12/13 03:21:37
   ___    クルッ…
  / || ̄ ̄|| <⌒ヽ ))
  |  ||__|| <  丿 
  | ̄ ̄\三⊂/ ̄ ̄ ̄/  
  |    | ( ./     /
539デフォルトの名無しさん:04/12/13 03:28:20
>>537
伝わる伝わらない以前に完全に意味不明だ
540デフォルトの名無しさん:04/12/13 03:35:17
++CはC自体をインクリメントするけど
C++でインクリメントした奴とは別にCを置き去りにしてきましたとか…
541デフォルトの名無しさん:04/12/13 05:30:39
C++ってセミコロンうってないでしょ
だからまだインクリメントされていない、不完全なわけよ
作者の言い訳のために後置なのよ
542デフォルトの名無しさん:04/12/13 06:42:26
作者だビョーン
543デフォルトの名無しさん:04/12/13 11:39:44
C++
↑↑
袋竿
544デフォルトの名無しさん:04/12/13 12:59:31
最初のC++コンパイラはCのソースを吐き出していたって言うじゃん。
逆に言えば最初のコンパイラがアセンブリ言語や機械語を直接吐き出すものだったら++Cになっていたと思うよ。

545デフォルトの名無しさん:04/12/13 14:07:18
オブジェクトの特定のパブリックメンバ変数に対してstd::findをしたいのですが
その特定のパブリックメンバはオブジェクトの値というほどのものではなく、operator==を定義するのは無理があります。
std::pairのsecondのようなかんじです。
ファンクタを作ってfind_ifするのも大げさな感じです。
boostのラムダ以外でさらりと実装する方法はありますでしょうか?
プライベートメンバ変数でgetterがあればboost::bindでさらりとかけるようですが。。。
546545:04/12/13 14:08:06
ageマース
547デフォルトの名無しさん:04/12/13 14:39:43
C++でreallocを使ったらいけないんですか?
548デフォルトの名無しさん:04/12/13 14:44:36
>>547
いけなくはないが、newしたものをreallocするとかは駄目だよ。
549デフォルトの名無しさん:04/12/13 16:51:42
renewってあったっけ?
550デフォルトの名無しさん:04/12/13 18:04:02
ない。そんなことするぐらいだったらstd::vector<>使え
551デフォルトの名無しさん:04/12/13 18:55:12
http://para-site.net/up/data/753.jpg

金額を入力して、総計を求めるプログラムを作っています。
コンパイルに失敗するのですが、どこがおかしいのかわかりません。
WinXP LSI-C試食版使用
552デフォルトの名無しさん:04/12/13 19:12:16
なぜ.jpg
553デフォルトの名無しさん:04/12/13 19:18:23
>>552
あぷろだがJPGじゃないと対応して無いので。
拡張子を変えただけなので中身はテキストです。
ビューアでも一応見れますが整形されていません。
IEならキチンと見れます。
554デフォルトの名無しさん:04/12/13 19:46:33
VCだと何の問題もない。
コンパイルに失敗したとき何かメッセージは出ないの?
555Rubyist!:04/12/13 19:51:44
今時LISI-Cなんか使うなよ。
どうせ最終行に改行がないとかそんなのだろ。
556デフォルトの名無しさん:04/12/13 19:53:29
>>551
俺もLSI Cでコンパイル&実行できた。
インクルードフォルダとかの設定がまずいんじゃないか?
557デフォルトの名無しさん:04/12/13 20:27:45
>>554->>556
改行入れたらできた・・・
わけがわからん。
どうもありがとうございました。
LSIC以外を検討します。
558デフォルトの名無しさん:04/12/13 20:29:21
出たメッセージも読めないのか
559デフォルトの名無しさん:04/12/13 20:34:34
Rubyist! →何コイツ
560デフォルトの名無しさん:04/12/13 20:37:17
Rubyは採鉱言語
561デフォルトの名無しさん:04/12/13 20:57:50
>>557
LSI-Cはコンパイラオプションによっては最終行に改行がないと正しくコンパイルできなくなる。
コードパーサの問題ではなく、コードジェネレータの問題なのでエラーが起きず、
実行して初めて異常動作に気付くケースもある。
#気付けばいいほうか。
562デフォルトの名無しさん:04/12/13 21:02:52
>>561
gccならワーニングがでるな。
563デフォルトの名無しさん:04/12/13 21:08:55
ウォーニングの事か?
564デフォルトの名無しさん:04/12/13 21:09:37
そのネタはいいから。
565デフォルトの名無しさん:04/12/13 21:20:25
ちゃんとISO Cでもソースは改行で終わっていなければならないって書いてある。
566デフォルトの名無しさん:04/12/13 22:51:28
C/C++でメールの読み書きを行うライブラリは既存の定評あるものが存在しますか?
567デフォルトの名無しさん:04/12/13 23:08:07
メールの読み上げと代筆してくれるのかと思った。
568デフォルトの名無しさん:04/12/13 23:10:10
OpenMail
569デフォルトの名無しさん:04/12/14 14:25:56
ふと思ったのですが、動的に確保した配列の数値のみ変更を許す事は出来ますか?
つまりポインタの参照先は固定で、参照先の数値のみ書換可能ということ。
*const宣言だと動的確保が出来なくなっちゃうのでconst_cast使うしかないですかね?
570デフォルトの名無しさん:04/12/14 14:28:58
>>569
宣言と同時に初期化しろ。
int *const p = new int[n];
571デフォルトの名無しさん:04/12/14 15:09:07
>>570
それは考えたのですが、そのポインタをクラスのメンバとして宣言し、
特定のメソッドが呼ばれた時に任意の領域を確保しようとした場合に
どうすりゃいいのかな?と(コンストラクタが呼ばれた時点では
サイズが不明)。説明不足で申し訳ありません。
例えば画像を扱うクラスで、画像データをロードする関数が呼ばれた
時に、その画像のサイズの大きさのメモリを確保したりとかです。
ポインタをprivateにして、publicな関数で参照渡しにすればいける
とは思うのですが、func()[x][y]みたいな書き方はスマートじゃ
無いかなと思ったもので。
privateなポインタとpublicなポインタの両方を用意しておけば、
publicの方の参照先を変更されても最悪メモリリークは防げるけれど
他に方法はありませんかね?
572デフォルトの名無しさん:04/12/14 15:11:59
スマートポインタ。つか、単にお前のクラス設計がだめなだけだとおも。
573デフォルトの名無しさん:04/12/14 15:26:25
横槍ですまんけど
ちったあ改行してよ・・・
574デフォルトの名無しさん:04/12/14 15:26:55
改行して行と行の間を空けて
ってことね
575デフォルトの名無しさん:04/12/14 15:27:41
>>570
あのう、横槍スマンが、
int* const p = new int(n);
と書きたかったのですか?
576デフォルトの名無しさん:04/12/14 15:35:45
>>572
むぉっ、スマートポインタの存在を忘れてました…。
クラス設計にツッコまれると何も言えないです・・・。もっと勉強します。
577デフォルトの名無しさん:04/12/14 16:08:14
>>572
自己解決というかクラス設計を見直した結果、添え字の演算子をオーバーロード
することで全て解決しました。やっぱダメな設計でした。
ありがとうございました。
578デフォルトの名無しさん:04/12/14 19:50:54
開発途中はmingw/msys/gccで作業してリリースにvcでやる人の意図はなんでしょうか?
579デフォルトの名無しさん:04/12/14 20:01:14
>>578
emacsとか?
580デフォルトの名無しさん:04/12/14 20:20:23
教えて下さい!
参照って何 具体的な使用例とか、詳しいサンプルとかほしいなぁ
お勧めのホームページとか、あったら教えて欲しいし
お願いしますね
581デフォルトの名無しさん:04/12/14 20:24:48
int n;
int *p = &n;
*p = 1;
cout << n;

int n;
int& r = n;
r = 1;
cout << n;
582デフォルトの名無しさん:04/12/14 20:29:14
>>580
お前なめてんのか?
なにマルチポストしてんだよ。
583デフォルトの名無しさん:04/12/14 21:09:56
 失礼します。
↓この3行がどういう処理をしているのか教えて下さいです。

if(sum & 0x80000000){
      sum = (sum & 0xffff) + (sum >> 16);
}
584デフォルトの名無しさん:04/12/14 21:26:59
sumが32ビット非負整数とすれば

sumの最上位ビットが立っていたら、sumの値を
(sumの下位16ビット) + (sumの上位16ビット) にする
585デフォルトの名無しさん:04/12/14 21:31:48
やってることはわかるが、何がやりたいのかがわからんな。
586デフォルトの名無しさん:04/12/14 21:33:37
質問お願いします。
LINUX環境でCプログラム中の各関数が何クロック使ったのか調べたいのですが、
クロック数を調べるためのコマンドってありますか?
gprofを使ってやってみたのですが、単位が秒なので正確にわかりませんでした。
587583:04/12/14 21:42:17
>>584
なんとなくですが分かった気がします。
ありがとうございました。
588デフォルトの名無しさん:04/12/14 21:48:44
キーボードから2つの整数を入力し、その加算、減算、乗算、除算を計算し結果を
画面に出力するプログラムを作成せよ。
但し各処理ごとに加算:add 減算:sub 乗算:mul 除算:divとして関数を作成すること。
(除算の結果は実数で)
C言語についてです。わかりません
589デフォルトの名無しさん:04/12/14 21:51:37
宿題スレへ
590デフォルトの名無しさん:04/12/14 21:52:00
>>585
IP のチェックサム -- 1の補数演算
http://4049.nwr.jp/comp/ip_csum.html
591588:04/12/14 21:53:33
宿題スレへ行ってくる
592デフォルトの名無しさん:04/12/14 21:53:44
>>585
TCP/IPヘッダのチェックサム部分の計算じゃないかな
593デフォルトの名無しさん:04/12/14 21:56:55
2次元配列を用いて九九の結果を画面に出力するプログラムを作成せよ。
但し掛け算の計算はmulとして関数を作成すること。
おしえてくだされ
594デフォルトの名無しさん:04/12/14 21:57:23
595デフォルトの名無しさん:04/12/14 21:59:06
>>593
簡単すぎ
ちょっとは自分で考えれ
596デフォルトの名無しさん:04/12/14 22:19:52
>>586
TSCでいいのならLinuxだと
#include <asm/msr.h>
unsigned long long hoge;
rdtscll (hoge);
みたいに取れるけど...

>Cプログラム中の各関数が何クロック使ったのか
とはちょっと違う
597デフォルトの名無しさん:04/12/14 22:35:48
>>593
588と二人で仲良く宿題スレに逝け
598デフォルトの名無しさん:04/12/15 14:34:36
LONG64 mul(UINT a,UINT b){
return a*b;
}

main(){
for(UINT i=1;i<10;i++){
for(UINT j=1;j<=10;j++)
if(j<10)
printf("%d, ",(int)mul(i,j));
else
printf("\n");

}

}
599デフォルトの名無しさん:04/12/15 15:59:42
mul()って'*'を使っちゃ意味無いんじゃね?
600デフォルトの名無しさん:04/12/15 16:00:15
2次元配列使ってないし。
601デフォルトの名無しさん:04/12/16 16:12:18
VS.NET&C言語で、
あるフォルダ(ファイルの数は不定)からファイルを
ランダムに1つづつ取り出す(同じのが選ばれないように)。
という事がしたい時、
動的な配列に格納して乱数かなんかで1つづつ取り出す
という方針でよいのでしょうか?
602601:04/12/16 16:13:52
×あるフォルダ(ファイルの数は不定)からファイルを
○あるフォルダ(ファイルの数は不定)からファイル名を
603デフォルトの名無しさん:04/12/16 16:42:45
for(int i=0; i<10; i++){
  a+=i;
}
などとやったとき、iの寿命はどこまでになるのでしょうか。
604デフォルトの名無しさん:04/12/16 16:44:08
>>603
}まで
605デフォルトの名無しさん:04/12/16 16:44:38
>>603
forの内部
606604:04/12/16 16:44:45
forのな。
607デフォルトの名無しさん:04/12/16 16:47:55
iの寿命は儚くて
608603:04/12/16 16:54:32
でも、
for(int i=0; i<10; i++){
  a+=i;
}
printf("%d\n",i);

とやるとエラーもなくちゃんと表示できるんです
これってiはまだ生きてるって事なんですよね?
609デフォルトの名無しさん:04/12/16 16:57:54
>>608
たぶんVisual C++6.0使ってるんだと思うけど、単にコンパイラが規格に準じてないだけ。
いい加減VC6なんか捨ててしまえ。
610デフォルトの名無しさん:04/12/16 17:05:21
>>609
あ わ て ん ぼ♥
611デフォルトの名無しさん:04/12/16 17:05:36
めるぽ
612デフォルトの名無しさん:04/12/16 17:09:17
入力した文字を逆に表示するプログラムを作りたいんですけどどこがおかしいんでしょうか…?
#include <stdio.h>

void reverse(char *s)
{
char *p,c[100];
     p=&c;
p = s;
for(;*p;)*p++;
*p--;
for(;*s;)*s++ = *p--;
}

main()
{
char s[100];
printf("文字列を逆から表示します.");
scanf("%s",s);
reverse(&s);
printf("%s",s);
}
613612:04/12/16 17:11:43
すいませんこちらより宿題を片づけるスレの方があってる気がしました。
スレ違いでした。
614デフォルトの名無しさん:04/12/16 17:11:46
char *p,c[100];
     p=&c;
615デフォルトの名無しさん:04/12/16 17:12:13
('A`)
616612:04/12/16 17:20:20
すいませんそこをどう直せばいいかおしえてください!
617デフォルトの名無しさん:04/12/16 17:23:16
素朴な疑問です。入門書ではなく実用書には詳しく書いてあるかもしれませんが。

int a[4] = {1, 2, 3, 4};
int *p;
int **pp;
の時、a は配列 a[4] の先頭アドレスを示すという事でした。
p = a;
などです。

では
&a
は一体何になるんでしょうか??

p = &a;
pp = &a;
など試してみましたがいずれも
warning: assignment from incompatible pointer type
になります。しかし
printf("%p %p", a, &a);
などとすると、内容は同じようです。

&a
の正体は一体なんなんですか…??
こんな構文がないなら、構文エラーになってもおかしくないと思うんですが…。
618Rubyist!:04/12/16 17:24:55
char *
reverse(char *string)
{
    char *h, *t;

    if (*string == '\0')
        return string;

    h = string;
    t = string + strlen (string) - 1;

    while (h < t) {
        char c;
        c = *h;
        *h = *t;
        h++;
        *t = c;
        t--;
    }
    return string;
}
619デフォルトの名無しさん:04/12/16 17:31:32
int a[4];
int (*p)[4] = a;
620デフォルトの名無しさん:04/12/16 17:31:46
>>612
#include <stdio.h>
#include <string.h>

int main(void)
{
 char s[100];
 printf("文字列を逆から表示します.");
 scanf("%s",s);
 strrev(s);
 printf("%s",s);
 return 0;
}
621612:04/12/16 17:41:14
>>618
その通りやったらできました!
でも中身理解するのに時間かかりそうです…。
ありがとうございます!

>>620
おお!確かにできます!!
こんな簡単にできるもんなんですね!
でもreverseって逆にする関数を別に作らないとダメっぽいので…。
ありがとうございました。
622617:04/12/16 17:49:22
>>619
わかりました!これは…、そのまんま文字通り「配列へのポインタ」ですよね。
(タイプミスでたぶん int (*p)[4] = &a; ですね)
なんだかちょっと混乱してきましたが。「配列へのポインタ」は多次元配列専用のものではないという事か(?)。
とにかく疑問解決しましたありがとうございます。
623デフォルトの名無しさん:04/12/16 18:21:40
>>612
そうやって他人のソースの流用ばかりして
ポインタの理解できていないまま次へ次へと進んでも前進とは言えない
624デフォルトの名無しさん:04/12/16 18:33:34
関数の引数で、ポインタ(*)を使う場合と参照(&)を使う場合の違いはなんでしょうか?
また、どういう時に使い分けたらいいのですか?
625デフォルトの名無しさん:04/12/16 18:43:57
626デフォルトの名無しさん:04/12/16 18:49:26
ポインタにできて参照にできないことって何かありますか?
また、その逆もありますか?
627デフォルトの名無しさん:04/12/16 18:51:31
>>626
参照先の変更
628デフォルトの名無しさん:04/12/16 18:54:33
ポインタはNULLが渡せる。
無効な値を取る場合があるときはポインタ.。
629デフォルトの名無しさん:04/12/16 19:03:16
ポインタと参照のどっちが萌えですか?
630デフォルトの名無しさん:04/12/16 19:05:27
>>629
考えるな、感じろ
631デフォルトの名無しさん:04/12/16 19:20:26
>>629-630
強いて言えばポインタ
632デフォルトの名無しさん:04/12/16 19:28:46
ポインタは古いです。参照の方が萌えだと思います。
633デフォルトの名無しさん:04/12/16 19:34:42
参照は狙いすぎ。萎え。
ポインタこそ王道。
634デフォルトの名無しさん:04/12/16 22:06:45
参照っていうと別なものと紛らわしいな
リファレンスだろ
635デフォルトの名無しさん:04/12/16 22:24:38
>>634
おまえ最悪
636デフォルトの名無しさん:04/12/16 22:25:38
日本語か英語かの違いだけ…
637デフォルトの名無しさん:04/12/16 22:52:05
>>632
参照はあまりいじれない。
638デフォルトの名無しさん:04/12/16 23:03:47
オブジェクトを値渡しで渡し隊
639デフォルトの名無しさん:04/12/16 23:13:14
char buf[10][100]
の10を動的配列にしたいんだけど
Cで、どうやって書けば良いですか?
640デフォルトの名無しさん:04/12/16 23:26:40
char *buf[100];
buf[0]=new char[要素0のサイズ];
buf[1]=new char[要素1のサイズ];
    ....
buf[99]=new char[要素99のサイズ];
641デフォルトの名無しさん:04/12/16 23:27:18
違った。newじゃなくてmallocだorz
642デフォルトの名無しさん:04/12/16 23:30:00
char buf = malloc(10);
char buf2 = malloc(10*1000);
int i;
for(i = 0; i <10; i++)
  buf[i] = bu2[i * 1000];


643デフォルトの名無しさん:04/12/16 23:33:14
Cには多次元配列なんてものは存在しないってことを覚えておけ。
644デフォルトの名無しさん:04/12/16 23:50:01
ヘッダしだいだろうけどsize_tってアーキテクトで最良のパフォーマンスを
出せる最大のバイトで宣言されてるの?
これって慣習、それとも何かの規約で保証されてる?
std::size_tも同じ?
645デフォルトの名無しさん:04/12/16 23:51:16
>>643
最高に頭悪そうな発言してください in ム板 (3)
http://pc5.2ch.net/test/read.cgi/tech/1101931660/
646639:04/12/16 23:55:21
勉強になりました。
ありがとうございました。
647デフォルトの名無しさん:04/12/17 00:52:12
Windows/Linux環境で、標準入出力を横取りする方法を知りたいです。

あるプログラム(A)から、他のプログラム(B)を呼び出すプログラムを組んでいます。
・Bは簡単なCUIのコンパイラです。引数に指定されたファイルを読み、
文法に問題がなければファイルを出力し、エラーならば各種エラーメッセージを表示します。
・Aは、BのGUIフロントエンドです。裏でBを呼び出し、その結果を利用します。

AからBの呼び出しはsystem関数を使えばいいのですが、そうすると
Bが標準入出力やエラー出力に流したメッセージが、コマンドプロンプトに垂れ流しに
なってしまいます。
これらのメッセージをAが受け取り、解釈したいのですが、どのようにすればいいのか
わかりません・・・・

できれば標準C/C++の範囲内に収まるようなやり方があればいいのですが・・・
648デフォルトの名無しさん:04/12/17 01:04:58
>できれば標準C/C++の範囲内に収まるようなやり方

さすがにこれは無理
649デフォルトの名無しさん:04/12/17 01:07:36
>>647
>標準C/C++の範囲内に収まるようなやり方があればいいのですが・・・
ない

UNIX環境についてはpipe exec forkで検索
Windows/Linux環境の差異を吸収するようなライブラリは???
650デフォルトの名無しさん:04/12/17 01:17:16
651デフォルトの名無しさん:04/12/17 01:19:59
結果をファイルに書き出してAがそのファイルを読むとか。
652デフォルトの名無しさん:04/12/17 03:28:00
標準入力に垂れ流すことは有り得ないからpopen("B", "r")だろうな。
653デフォルトの名無しさん:04/12/17 04:09:34
char a[10];
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = '\0';

とした場合、a[4]以降にはメモリ上どんな値が入ってるのでしょうか?
\0(NULL)ではないのでしょうか?
654デフォルトの名無しさん:04/12/17 04:11:23
>>653
不定です。決まっていません。
655デフォルトの名無しさん:04/12/17 04:11:53
>>653
不定
656デフォルトの名無しさん:04/12/17 04:26:05
なるほどそうでしたか。
ありがとうございます。勉強になりました。
657デフォルトの名無しさん:04/12/17 04:35:51
char a[10];
a[9] = '\0';
printf("%s",a);
658デフォルトの名無しさん:04/12/17 08:09:54
>>657
あふぉ
659デフォルトの名無しさん:04/12/17 10:57:53
>>653
不定
おせっかいなコンパイラは0(\0)を入れてくれることもある
660デフォルトの名無しさん:04/12/17 13:18:30
VCのDebugは逆にccccccccを入れたりする
661デフォルトの名無しさん:04/12/17 14:26:23
>>644
ただ単にsizeofの結果の符号無し整数型としか書かれていない。
662デフォルトの名無しさん:04/12/17 15:19:37
ふてーやろうだ
663デフォルトの名無しさん:04/12/17 15:24:27
CPU の architecture 次第だろうけど
size_t ってその architecture で
最良の performance を出せる
最大の unsigned int で宣言されてるの?
これって慣習?
それとも何かの規約で保証されてる?
664デフォルトの名無しさん:04/12/17 15:25:47
CPU の architecture 次第だろうけど
unsigned int ってその architecture で
最良の performance を出せる
最大の bit で宣言されてるの?
これって慣習?
それとも何かの規約で保証されてる?
665デフォルトの名無しさん:04/12/17 17:34:18
#include <stdio.h>
#include <string.h>

struct x{
int num;
char *str;
};

void disp(struct x data){
printf("%d, %s\n", data.num, data.str);
}

void main(){
char str[] = "abcde";
struct x data1 = { 1, str };
struct x data2;

data2 = data1;

disp(data1);
disp(data2);

*(data1.str) = 'A';

disp(data1);
disp(data2);
}
ポインタはコピー元とコピー先で同じアドレスを指しますので、
どちらか一方のポインタの指すデータを書き換えた場合は、
もう一方のデータも書き換えられることになります。

だそうです。いろいろ試したんですが、なぜか作動しません。
666デフォルトの名無しさん:04/12/17 17:38:02
ちなみに15行目の struct x data1 = { 1, str };
のstrを"他の文字"に変えると無事にコンパイルができました。
667デフォルトの名無しさん:04/12/17 17:43:35
>>665
文字列リテラルを書き換えた場合の動作結果は不定だよ。
668デフォルトの名無しさん:04/12/17 18:03:28
>>665
こうしろ
struct x data1 = {1};
struct x data2;
data1.str = str;
669665:04/12/17 18:07:07
>>668
コンパイルできました、感動です。ありがとうございます。
670デフォルトの名無しさん:04/12/18 00:50:27
うっせばーか。礼なんかいちいちいらねーんだよ。
671デフォルトの名無しさん:04/12/18 01:33:27
↑素直に感情を表現できないカワイイ人
672デフォルトの名無しさん:04/12/18 17:39:37
テキストファイルを扱うfin_textという関数があるのですが、

fopenを使ってファイルを開いておいて
引数としてファイルポインタを与えたほうがいいのでしょうか?

それとも、ファイル名を文字列として与えて、
関数内でfopenを行ったほうがいいのでしょうか?
673デフォルトの名無しさん:04/12/18 17:46:45
Winsockで画像ファイルを送信したいのですが、受信したファイルが正常に表示されません。
16KBずつ読み込んでそれを送信しているのですが、正しく表示されるのは最初の16KBの部分だけ(多分)で、
それ以降の部分は原型がないくらいに乱れています。
オフセット辺りが問題かと思って色々変えてみたのですが解決しません。
よろしくお願いします。
該当部分のソースです。

674デフォルトの名無しさん:04/12/18 17:47:12
/*
*  変数は全てローカル変数。送信ファイルのフォルダと受信ファイルのフォルダは別です。
*/
//送信部分
hFile=CreateFile(FileName,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
memset(&buf,'\0',sizeof(buf));
SetFilePointer(hFile,0,0,FILE_BEGIN);
ReadFile(hFile,buf,sizeof(buf),&read_size,NULL);
while(read_size){
    send(socket_c,buf,read_size,0);
    memset(&buf,'\0',sizeof(buf));
    SetFilePointer(hFile,read_size,0,FILE_CURRENT);
    ReadFile(hFile,buf,sizeof(buf),&read_size,NULL);
}
CloseHandle(hFile);

//受信部分
hFile=CreateFile(FileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
memset(&buf,'\0',sizeof(buf));
SetFilePointer(hFile,0,0,FILE_BEGIN);
bl=recv(socket_c,buf,sizeof(buf),0);
while(bl){
    WriteFile(hFile,buf,bl,&write_size,NULL);
    memset(&buf,'\0',sizeof(buf));
    SetFilePointer(hFile,bl,0,FILE_CURRENT);
    bl=recv(socket_c,buf,sizeof(buf),0);
}
CloseHandle(hFile);
675デフォルトの名無しさん:04/12/18 17:55:20
>>672
テキストファイルそのものを操作するならファイル名。
中身しか興味が無いならファイルポインタ。

ファイル名を渡せばそれをremoveしたり出来るし、
ファイルポインタならファイルを途中から渡したりstdinを渡したり
出来るからな。
676673-674:04/12/18 18:58:13
自己解決しました。
送信・受信のファイル読み込み時にSetFilePointerを使っていたのが問題だったようです。
SetFilePointerを使わなくてもポインタは自動的に移動するということが分かりました。
俺のソースだとそこからさらに移動させていたことになります。
お騒がせしました。
677デフォルトの名無しさん:04/12/18 21:41:56
>>675さんありがとうございます。
テキストファイルしか操作しませんので、
ファイル名を渡そうと思います。

remodeとかはよく分かりませんので調べてみます。

ありがとうございました。
678デフォルトの名無しさん:04/12/19 00:27:19
STLのコンテナにMyClass *myClassを入れたいのですが
const MyClass &でないといけないとコンパイラに怒られてしまいます
こういうのは普通どうするのでしょうか?キャスト?
679デフォルトの名無しさん:04/12/19 00:48:44
>>678
どんなコード書いてるのか知らんが、お前の書き方が悪いだけだよ
680678:04/12/19 00:57:13
>>679
えぇぇ、stl::listになんらかの変数のポインタを入れたいことって無いですか?
681デフォルトの名無しさん:04/12/19 01:01:46
入れられるって。試しにエラーが出たコードを貼ってごらん?
682デフォルトの名無しさん:04/12/19 01:06:12
>>680
入れられるんだよ。入れられないのはお前の書き方が悪いだけだって言ったんだよ。
683678:04/12/19 01:11:29
こんな感じなんですが・・・

list<MyClass> *myClassList = new list<MyClass>;
MyClass *myClass = new MyClass();
myClassList()->push_back(myClass);
684デフォルトの名無しさん:04/12/19 01:12:27
>>683
×list<MyClass>
○list<MyClass*>
685678:04/12/19 01:22:43
おおおお、できました!
なるほどそういう問題だったんですね!
686デフォルトの名無しさん:04/12/19 01:26:43
>>677
逆じゃない?ファイル名を渡すってことはファイル名を使った
APIを使いたいときにかぎるっていうことを>>675を言ってるんだと
思う。だから、ファイルポインタを渡すべきだと思う。
687デフォルトの名無しさん:04/12/19 10:59:19
メンバポインタについて質問させてください。
以下のソースで、int型のメンバポインタは作れるのですが、
void型のメンバポインタを作ろうとすると、エラーが出てしまいます。
汎用のメンバポインタというものは作れないのでしょうか?

class A{
};

int A::*ptr_int;
void A::*ptr_void; //エラー2182

int main()
{
}
688デフォルトの名無しさん:04/12/19 13:11:19
void * は総称ポインタだけど
void 自体に汎用とか総称の意味はないのでは…?
689デフォルトの名無しさん:04/12/19 13:12:11
>>687
ISOの8.3.3 pointer to membersより

A pointer to member shall not point to a static member of a class (9.4),
a member with reference type, or "cv void".
                    ~~~~~~~~~~~~
690デフォルトの名無しさん:04/12/19 20:48:43
C++ではvoid型ポインタはあまり推奨されないイメージがあるな。
継承によるポリモーフィズムを使う方向が正解では。
691デフォルトの名無しさん:04/12/19 20:56:11
というかメンバポインタって関数以外にはあまり使わないイメージがある…
692デフォルトの名無しさん:04/12/19 22:22:15
前から気になっていたのですが
exit関数の引数に入れる数字
例えばexit(0)の
0に当たるところです。

そこに入れる数字に何か意味はあるのですか
教えてください。
693デフォルトの名無しさん:04/12/19 22:25:08
>>692
ttp://www.bohyoh.com/CandCPP/C/Library/exit.html
ちょっとは自分で調べような。
694デフォルトの名無しさん:04/12/19 22:46:57
>>693は厳しいようでいて実は優しい人(・∀・)イイ!!
695デフォルトの名無しさん:04/12/20 00:04:46
>>693
ありがとうございます

とりあえずまとめてみます
exit(0)または、exit(EXIT_SUCCESS)は、正常終了時
その他は、異常終了
このEXIT_SUCCESS,(EXIT_FAILURE)はstdlib.hにマクロ定義されている
696695:04/12/20 00:11:16
実行してみたら
EXIT_SUCCESSの中身は、0でした
EXIT_FAILUREの中身は、1でした

とりあえず、0が成功、1が失敗と覚えます
697687:04/12/20 00:17:18
>> 688, 689, 690, 691
ありがとうございました。
よく分からなかったのですが、void型は使えないということで納得します。
ソースを見直したら、int型のメンバポインタで問題なさそうだったので、
それでやってみることにしました。
698デフォルトの名無しさん:04/12/20 12:25:49
新しいクラス作るときに
//hoge.hpp
class Hoge {
public:
hoge() {...}
int fuga(){
...
}
hage() {
...
}
};
ってヘッダ内に全部書いてるんだけど、後でこの実装部分を.cppに移そうとすると
非常に面倒で困るわけです。
なにかこのへんを補助してくれるツールなどご存知ありませんか?
699デフォルトの名無しさん:04/12/20 12:27:35
列挙型とそれを使う関数を定義します。
enum Value{a=1, b, c};
void func(Value val)
{
  //hogehoge
}

プログラム中でfuncを使おうとすると、

//エラー
func(a);

gccは「Valueとintに互換性がないよ」といったエラーを吐きます。
func((Value)a);とすればコンパイルは通るのですが、
これってgccでは普通なんでしょうか?MSのclでは問題はでないようなんですが・・・
700デフォルトの名無しさん:04/12/20 12:33:07
>>699
VS.net2003ではエラーになったYO
たぶんVC6.0が糞なだけだYO
701デフォルトの名無しさん:04/12/20 13:07:44
>>699,700
えっ!?
通るのが普通なんじゃないんですか?
うちのg++(3.3.4)は警告なしで通るんですが
702デフォルトの名無しさん:04/12/20 13:25:05
>>701
ちょっと待ておまえさっきはgccで通らずVCで通るとか言ってただろ。
コンパイラのバージョンとオプションくらい書いとけ
703701:04/12/20 13:53:13
>>702
699とは別人です

ついでに報告するとg++(3.3.4)は701に書いた通りで
gcc(3.3.4)だと通りません
enumってC++だけだったんだっけ?
704デフォルトの名無しさん:04/12/20 14:03:24
Cでは
enum Value { a=1, b, c };
なら
void func(enum Value val)
じゃないといかんかと。それが嫌であれば
typedef enum _Value { a=1, b, c} Value;
とか。
C++ではenumもstructも特に書かなくても使える
705701:04/12/20 15:00:27
>>704
>void func(enum Value val)
>C++ではenumもstructも特に書かなくても使える
おお
そうでしたそうでした
どうもありがとう
706704:04/12/20 17:10:09
どういたしまして。
707デフォルトの名無しさん:04/12/20 17:17:13
ここは礼儀正しいインターネッツですね
708デフォルトの名無しさん:04/12/20 20:12:02
どういたしまして。
709デフォルトの名無しさん:04/12/20 23:51:43
いえいえこちらこそ
710デフォルトの名無しさん:04/12/20 23:53:38
このスレはsage禁止
711デフォルトの名無しさん:04/12/20 23:54:36
なんでやねん
712デフォルトの名無しさん:04/12/20 23:58:39
雰囲気が良いからですよぉ〜
713デフォルトの名無しさん:04/12/21 00:00:02
00:00
714デフォルトの名無しさん:04/12/21 19:46:05
質問させてください
例えば、
struct Foo { int hoge[2][2]; };
Foo foo[2][2];
Foo *p = foo;

こんなとき、p を使って foo[1][1] の hoge[1][1] にアクセスしたいときは
どう書けばいいんですか?
715デフォルトの名無しさん:04/12/21 19:52:35
そもそもFoo *p = foo;ができない。
716714:04/12/21 20:05:42
>>715
即レスどうもです。
でもFoo *p = foo;はできたと思うんですが…(ちなみにBCC)
わかり易くしようと思ってstructにしたんですけどclassの場合どう
でしょうか?
717デフォルトの名無しさん:04/12/21 20:06:26
クラスでもダメ
718714:04/12/21 20:09:35
>>717
あっ間違えましたFoo *p = (Foo*)foo;です。
何度もスイマセン…
719デフォルトの名無しさん:04/12/21 20:11:31
>>714
struct Foo { int hoge[2][2]; };
Foo foo[2][2];

Foo (*p)[2] = foo;
int hage = p[1][1].hoge[1][1];
720デフォルトの名無しさん:04/12/21 20:16:36
実は前々から聞きたかったのだけどFooってどういう意味なんですか?・・・。
721デフォルトの名無しさん:04/12/21 20:17:05
子供好きの合言葉
722714:04/12/21 20:20:09
>>719
なるほど…
初心者なものでちょっと難しいですが後は自分で考えてみます
即レス助かりました。ありがとうございます!
723デフォルトの名無しさん:04/12/21 20:53:38
セマンティックス的に破壊的なキャストはするなボケ
724デフォルトの名無しさん:04/12/21 21:33:02
Foo* foo = &foo[0][0];
725デフォルトの名無しさん:04/12/21 23:09:34
>>715
一次配列の時と勘違いしているのでは

>>718
強引にキャストしているから代入できているようにみえるだけ。
726725:04/12/21 23:10:26
>>715
じゃなくて
>>716

727デフォルトの名無しさん:04/12/22 19:20:00
アプリケーション間で、変数の値の受け渡しは可能なのでしょうか?
例えば、コンパイラをCUIで作って、エディタをGUIで作って、コンパイラからエラーメッセージをエディタに受け渡す様なそんな感じで。
728デフォルトの名無しさん:04/12/22 19:26:39
>>727
ええ可能です
お使いの開発環境はそうなっていませんか?
729727:04/12/22 19:30:21
>728
なってますが、それをどうやってC++で実装すれば良いのやら………
ファイルに書き出して読み込むという方法は直ぐに思いつくのですが、
もっとスマートな方法があると思うので……例えば、プロセス間の通信とかは不可能なのでしょうか?
730デフォルトの名無しさん:04/12/22 19:38:09
>>729
Win32ならパイプ(NT系のみ)とか。メールスロットとか。
731デフォルトの名無しさん:04/12/22 19:38:19
プロセス間通信で調べれば一発のような。。。
732デフォルトの名無しさん:04/12/22 19:39:37
メモリファイルでも出来る。
あと、メッセージのやり取りでも。
アプリ間のプロトコルを自分で決めちゃえば
かなりのことが出来るはず。
733デフォルトの名無しさん:04/12/22 19:40:52
WM_COPYってメッセージって使えるんしたっけ?
>>729の中の人、調べてみたら?
734デフォルトの名無しさん:04/12/22 19:41:54
>>733
クリップボードと関係あるみたい。
735デフォルトの名無しさん:04/12/22 19:56:20
WM_COPYDATAなら適当にWindowsがメモリマップトファイル使っていい感じで処理してくれるが。
736デフォルトの名無しさん:04/12/22 20:26:28
>>730
名無しさんなら9xでもパイプは使えるよ。
737デフォルトの名無しさん:04/12/22 21:46:41
CUIアプリが、仕事が終わったら終了するという仕様なら、
GetExitCodeProcess で終了コードを取得できないか?
738698:04/12/23 04:05:38
誰にもレスされずに涙目の漏れが来ましたよ
739デフォルトの名無しさん:04/12/23 09:58:45
>>738
適当なエディタでマクロでも組んだら?
インクルードファイルの関数定義をコピーしてクラス名追加してインデントを整えるのと、
インクルードファイルの方は関数本体をセミコロンに変えるだけでしょ。
740714:04/12/23 23:16:21
もう一度質問させてください。
配列の配列 int array[N][N]; は式の中では配列へのポインタに成る、
というのはわかったんですがこれがポインタのポインタにならない
というのは違和感を感じます。
後ろの[N]は配列を配列として扱っているということなんでしょうか?
あと int (*p)[2] のカッコは必要なんですか?よろしくお願いします
741デフォルトの名無しさん:04/12/23 23:44:43
>>740
int *p[2];だと「『intへのポインタ』の配列[要素数2]」になる。int *(p[2]);と同じ。
int (*p)[2];は「『intの配列[要素数2]』へのポインタ」になる。

違和感は慣れるしかない。
742デフォルトの名無しさん:04/12/24 15:49:13
>>740
Tの配列はTへのポインタになる。
∴配列の配列は配列へのポインタになる。
743デフォルトの名無しさん:04/12/24 16:11:09
c言語で五目並べのソースファイルが見れる所どこかにありませんか?
対コンピュータの思考ルーチンをどうしていいか全くわからないので。
744デフォルトの名無しさん:04/12/24 16:30:49
UNICODEビルドする可能性がある場合
'a'のような1文字も_T('a')と書いた方がいいんでしょうか?
745デフォルトの名無しさん:04/12/24 21:55:18
>>744
そう。
…って俺も理由を深く考えたことなかったんだけど
_T('ア') とかの場合に特に意味があるんだよね、きっと?
746デフォルトの名無しさん:04/12/24 23:41:37
>>744
TCHARならそうしろ。
char/CHARなら_Tはつけるな。
個人的にはCランタイムはUnicodeにする意味はないと思う。
どうせ内部でShiftJISに戻していたりするんだろうし。
俺はWin32APIが絡んでくるときだけ_Tとかを使っている。
747714:04/12/25 00:18:19
>>741,742
レスどうもです。なんかわかってきました
int *p[2];は配列でint (*p)[2];はポインタというのがミソですね
ここは親切さんが多くて助かります。ありがとうございました
748デフォルトの名無しさん:04/12/25 04:56:20
本当に初歩的で申し訳ないのですが指南を頂きたく思います。
C言語で(表示はDOSの真っ暗に〇× 0は空欄4は―で何もないという意味)
簡単な〇Xゲームを作ろうとしているんですが
下記のようにC配列で判定、S配列で表示しようと考えたのですが
結局ifでc[i][j]=???でprintfで表示するしかないんじゃあS配列いらんなあ(汗
という考えになったんですけど どうにかなりませんでしょうか?
int c [5][5]={
{0,1,2,3},
{1,4,4,4},
{2,4,4,4},
{3,4,4,4}
};
//0123  456で−〇Xの判定
char s [8][15]={
" ",
      "1",
      "2",
      "3",
"−",//4
"〇",//5
"×",//6
};
749デフォルトの名無しさん:04/12/25 08:40:27
>>748
たしかにsは要らなさそうだ。
それよりその1文字変数名はやめろ。
750デフォルトの名無しさん:04/12/25 08:54:03
S配列を無理やり使う理由は?
751デフォルトの名無しさん:04/12/25 09:06:32
それよりもテーブル引き(c[i][j][s])用の配列を作ったほうがいいんじゃないか?
char *s[] = {
    " ",
    "○",
    "×",
    "−",
};
752デフォルトの名無しさん:04/12/25 09:19:47
>>749>>750
2次元配列の勉強をしていまして
1つは判定というか内部的な処理
2つ目の配列はそれに対応する反応ってな具合にできるんじゃないだろうか?
と素人考えになったんであえて2つ使ってます。

発展させれば0のときはこの画像、1の時は別の画像出す
みたいなのにも応用できる物が出来そうだな・・・と

変数名はscanとかに変えておいたほうがいいですね。申し訳ない
753デフォルトの名無しさん:04/12/25 10:04:32
>>748
何をしようとしてるのか良く分からんのでコード書いてくれ。
754デフォルトの名無しさん:04/12/25 10:48:02
>結局ifでc[i][j]=???でprintfで表示するしかないんじゃあS配列いらんなあ(汗

???
やりたい事は printf("%s",s[c[i][j]]) ではないのか?
755デフォルトの名無しさん:04/12/25 13:39:14
>>753
余計分からなくなるに
1gotoかける
756デフォルトの名無しさん:04/12/25 20:25:40
よろしくお願いします。

func( int*& a );
とある場合にどのように、引数を渡せばいいのでしょうか?
757デフォルトの名無しさん:04/12/25 20:45:34
>>756
int*&はintへのポインタへの参照。
意味としてはtypedef int *PINT; func(PINT& a);と同じで、これならわかるよな。
758756:04/12/25 20:55:56
>>757 さん
早速のレスありがとうございます。

ということで、
int* a;
func(a);
なのですね。

もうすこし、参照とポインタについて調べてみます。
ありがとうございましたm(__)m
759デフォルトの名無しさん:04/12/25 21:04:04
756ではないんだけど、ポインタを参照で受け取る理由ってあるんですか?
760デフォルトの名無しさん:04/12/25 21:40:12
>>759
例えばこういうことができる。(戻り値を使えとかそういうツッコミはするな)
void func(int*& a)
{
 a = new int;
}
761デフォルトの名無しさん:04/12/25 21:43:56
M糞のマクロが気に入らないときとか
#define SAFE_RELEASE(p) { p->Release(); p = 0; }
template <class T>
void safe_release(T*& p)
{ p->Release(); p = 0; }
762デフォルトの名無しさん:04/12/25 21:55:51
>>760
>>761
なるほど、良くわかりました。thx!
763デフォルトの名無しさん:04/12/25 21:56:41
>>761
どうでもいいけどそれはIUnknwon*&でいいんじゃないか?
全部そこから継承されているんだし。
764デフォルトの名無しさん:04/12/25 22:03:16
>>763
I???* から IUnknown* に暗黙の変換が行われたとして、
変換結果のポインタはテンポラリだから IUnknown*& には渡せないかもしれない。
765デフォルトの名無しさん:04/12/26 01:09:52
読み込んだファイルのバイト数を知りたいんですが

while(!feof(fp)){
file_length++;
}
のようにfeof関数を使うと正しくバイト数が
分かりません。
どのように書けばいいですか?
766デフォルトの名無しさん:04/12/26 01:11:04
>>765 それ、読み込んでないよ。
767デフォルトの名無しさん:04/12/26 01:18:26
>>766
省略しましたが、ファイルの内容は読んでます。
バイトが0x1Aの地点でfeofによりwhile文を抜ける
んですけど、どう書けば正しいですか?
宜しくお願いします。
768デフォルトの名無しさん:04/12/26 01:21:39
>>767
読んでるなら、読んだ時に読んだサイズを足していけ。
769デフォルトの名無しさん:04/12/26 01:23:15
fseek()とftel()使え
770デフォルトの名無しさん:04/12/26 01:26:11
>>767
> バイトが0x1Aの地点でfeofによりwhile文を抜ける
ttp://www.kouno.jp/home/c_faq/c12.html#38
771デフォルトの名無しさん:04/12/27 22:18:17
Easy Link Libraryというライブラリを使って、ゲームを作っているのですが、
Easy Link Libraryの質問掲示板や、専用スレなどは無いでしょうか?
公式HPが無くなってしまったため、困っています。

もしご存知の方いらっしゃいましたら、教えてください。
772デフォルトの名無しさん:04/12/27 22:22:25
>>771
もし初心者から一歩前へ進みたいと思うなら、そのライブラリとは極力かかわらない方が
良いですよ。
773デフォルトの名無しさん:04/12/27 22:45:28
そうですか。ところで
int *ptr と int* ptr はどちらも同じ意味なのでしょうか?
774773:04/12/27 22:46:28
一応ageます、だれか宜しくお願いします。
775デフォルトの名無しさん:04/12/27 22:47:54
>>773
そんな低レベルの質問するな
776デフォルトの名無しさん:04/12/27 22:57:25
>>773
はい、同じ意味です。
ところで、int *ptr;もしくはint* ptr;で宣言された変数ptrは何型になるか
解かりますか?
実は、これはint*型なのです。
ですから、意味としてはint* ptr;の方がわかりやすいですね。
ちなみに*ptrは、ptrが指すアドレスに記録されているint型の値のことですね。
777デフォルトの名無しさん:04/12/27 23:00:00
int* foo,bar;
778デフォルトの名無しさん:04/12/27 23:00:50
しかし
int* ptr, n;
とか書くと混乱するわけだが。
779デフォルトの名無しさん:04/12/27 23:04:10
>>778
まぁね。
780デフォルトの名無しさん:04/12/27 23:06:41
関数の戻り値がポインタの時も
int *foo() と書くか
int* foo()
と書くかで悩むなぁ。
781773:04/12/27 23:11:48

>>775
*がMSN検索でかからなかったんです、すいません。

>>776
丁寧な回答ありがとうござます、やはり同じ意味でしたか。
782デフォルトの名無しさん:04/12/27 23:16:19
>>776
俺はint *p; int *func();派
「式の中で*pと書くとint型の値が得られる」と読む。funcも当然同様。
783デフォルトの名無しさん:04/12/27 23:32:54
関数へのポインタがint (*func)();だから、
念のため混同しないように関数だけint* func();にしてる。
変数はint *p;

やっぱり統一した方がいいんでしょうか?
784デフォルトの名無しさん:04/12/27 23:36:42
>>783
スタイルを統一するのは読みやすいコード作りの第一歩。
785デフォルトの名無しさん:04/12/27 23:42:26
C++のクラスにも構造体のアライメントのようなもの
ってあるんですか?
786デフォルトの名無しさん:04/12/27 23:45:11
あります。
787デフォルトの名無しさん:04/12/28 00:44:00
>>783
そんなときのtypedef
typedef int *PINT;
PINT func();
788デフォルトの名無しさん:04/12/28 00:44:21
>>783
そんなときのtypedef
typedef int *PINT;
PINT func();
789デフォルトの名無しさん:04/12/28 00:53:12
>>787
アフォか。構造体へのポインタ使うたびに typedef するつもりかよ。
790デフォルトの名無しさん:04/12/28 01:27:43
個人開発してる内は好きなようにtypedef使いまくれば良いさ
共同開発するときはちょっとばかし気をつけたほうが良いけど
791デフォルトの名無しさん:04/12/28 01:29:46
OCamlにした方が遥かに生産性高そうだね。
792デフォルトの名無しさん:04/12/28 09:49:55
Enter のみを押すまで入力を繰り返すプログラムを書きたいのですが、
if の条件をどうすればよいのかわかりません。
ヒントだけでもお願いします。

int n = 0;
char data[64];

while(1){
printf("data[%d]=", n++);
scanf("%s", data);
if(data == '\0'){
break;
}
}
793デフォルトの名無しさん:04/12/28 10:29:57
ものすごく初心者な質問ですみません・・
家でBorlandのCコンパイラをダウンロードしてコマンドプロンプトを開いてみたのですが、
C:\Documents and Settings\user>
ってなってて、どうも学校のとは違います。
terapad等をしても
「'terapad'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
と出て何もできません。
C:>にするにはどうすればよいのでしょうか?
794デフォルトの名無しさん:04/12/28 10:37:46
cd c:\と打てば、C:\>になります。
terapadはパスが通ってないからじゃない?
terapad.exeまでのフルパスを打つか、パスを通せば OK
パスの通し方は検索すれば見つかります。
795デフォルトの名無しさん:04/12/28 10:41:06
>>794
C:\>になりました。ありがとうございました!
これからパスの通し方を勉強してきます
796デフォルトの名無しさん:04/12/28 10:41:20
>792
data[0]

>793
コマンドプロンプトを開くショートカットのプロパティで、ディレクトリを設定する。
Terapadは、ぐぐってインストールし、pathを設定する。
797デフォルトの名無しさん:04/12/28 10:44:23
>>792
こういう事か?

#include <stdio.h>
#include <string.h>

int main(void)
{
char data[64];

while (1) {
fgets(data, sizeof(data), stdin);
data[strlen(data) - 1] = '\0';
if (*data == '\0')
break;
else
printf("data = %s\n", data);
}

return 0;
}
798793:04/12/28 10:51:49
あ、パスはダウンロードした時にマニュアル通り
環境変数のPATHを編集で「;C:\BORLAND\BCC55\BIN」と追加したのですが、やはり
「'terapad'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
と出ます。
どうすればいいのでしょうか・・・
「;C:\BORLAND\BCC55\BIN」を付け加える前の部分に問題があるのでしょうか?
799デフォルトの名無しさん:04/12/28 10:54:45
>>798
それはBCCへのパスであってterapadへのパスではない。
800デフォルトの名無しさん:04/12/28 10:54:46
>>798
WindowsXPか?マイコンピュータを右クリック→プロパティ→詳細設定→環境変数で、ユーザの
環境変数のPATHに追加して、再起動してみな。
801デフォルトの名無しさん:04/12/28 10:55:58
>>798
Terapadをインストールしろ
802デフォルトの名無しさん:04/12/28 11:02:54
>>797
バッチリです!
でも、ちょっとコードの意味わかめなんで勉強してきます!
803793:04/12/28 11:21:39
>>799-801
レスありがとうございました。
terapadをダウンロードして再起動して
terapadへのパスの通し方は「C:\Program Files\TeraPad\TeraPad.exe "%1"」と打てばできるそうなのでやってみたのですが、
「'Program'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
と出てきてしまい、またダメでした・・
804デフォルトの名無しさん:04/12/28 11:28:46
C:\>
のところで、
C:\>"C:\Program Files\TeraPad\TeraPad.exe" test.c
とすれば、test.cが編集できる。

これを
C:\>TeraPad test.c
で出来るようにしたいなら、"C:\Program Files\TeraPad"にPATHを通す。
805793:04/12/28 11:44:56
>>804
ありがとうございました。
上のは理解できたのですが、下の、"C:\Program Files\TeraPad"はどこで設定するのですか?
いろんな窓が開いててちょっと混乱気味です・・すみません・・
terapadの「表示」→「オプション」→ブラウザのパス設定とかは違いますよね?
806デフォルトの名無しさん:04/12/28 11:45:26
>>797
scanf や fgets で入力された文字列の最後に'\0'が入るのではなく、
data[64]='\0' で、あとは未定義(?)ということでしょうか?

あと、fgets を scanf に入れ替えるとうまく動きませんが、
両者の違いは何ですか?
807デフォルトの名無しさん:04/12/28 11:54:18
>805
C:\BORLAND\....と同じように。

>806
fgetsは、最後に改行文字が入るから
808793:04/12/28 12:06:31
再び再起動してからやってみたらできました!ありがとうございました!
朝からお騒がせしてすみませんでした・・・
809デフォルトの名無しさん:04/12/28 12:20:03
>>806
普通scanfで中止する時は 戻り値がEOFか調べる
810デフォルトの名無しさん:04/12/28 15:05:07
すみません、コマンド プロンプトからterapadでファイルを読み込む際の、
読み込み先のファイルの変更はどうすればいいのでしょうか?
811デフォルトの名無しさん:04/12/28 15:13:25
>>810
鼬害。
terapadの使い方くらいterapadに同梱されてるだろ。
812デフォルトの名無しさん:04/12/28 15:19:19
もはやC/C++とは何の関係もない、ただの教えてクン養成スレになりつつあるな。
関係ない質問に答えていた俺にも原因の一端はあるのだが。
813デフォルトの名無しさん:04/12/28 16:04:29
読んでもよくわかりませんでした・・
荒らしてしまってすみませんでした。
もう時間なのでここで消えます。失礼しました・・
814デフォルトの名無しさん:04/12/28 16:52:29
ま、家庭教師ってなわけじゃないからさ。

815デフォルトの名無しさん:04/12/29 00:12:43
>>806
char data[64];と宣言しているのにdata[64]に代入するとは何事。
816デフォルトの名無しさん:04/12/29 00:40:29
>>815
相手のレベルを考えてから言えよな
ほっとけ
817デフォルトの名無しさん:04/12/29 02:26:45
ちなみに
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\
でパス通せたりする
818デフォルトの名無しさん:04/12/29 08:24:20
>>817
普通環境変数のPathに設定するかと…?
819デフォルトの名無しさん:04/12/29 09:25:24
>>817
ちょとまて。そこに書いたってパスは通らないんじゃないか?
820デフォルトの名無しさん:04/12/29 09:29:28
>>819
そうだよ。
>>817
そこはアプリケーションを指定して実行からでしか有効でない。
821デフォルトの名無しさん:04/12/29 15:52:45
>>815
BASICの香りが
822デフォルトの名無しさん:04/12/29 18:18:02
>821

[] でないなら BASIC なんだが...
823デフォルトの名無しさん:04/12/30 00:50:22
2進数で考えて、引数の数だけ下位からビットが立った数を
返すマクロって書けるでしょうか?

hoge(3)が7(2進数で00000111)を返すような感じです。

関数になってしまうような長いのなら書けるのですが、コンパイ
ル(プリプロセス?)時に定数になるものは書けるでしょうか?
824デフォルトの名無しさん:04/12/30 00:54:13
>>823
#define hoge(n) ((1ul<<(n))-1)
825デフォルトの名無しさん:04/12/30 00:56:46
>>823
#define hoge1 0x01
#define hoge2 0x03
#define hoge3 0x07
#define hoge4 0x0F
#define hoge5 0x1F
#define hoge6 0x3F
#define hoge7 0x7F
#define hoge8 0xFF
826デフォルトの名無しさん:04/12/30 01:07:05
>>824
ありがとうございました!
一応逆アセンブルして確かめてみましたが、きっちり定数に
なっていました。これですっきりできます。
827デフォルトの名無しさん:04/12/30 01:11:52
>>823
メルセンヌ数を知らんのか。
828デフォルトの名無しさん:04/12/30 01:15:44
>>825
BOOSTみたいなことやってるな…
829デフォルトの名無しさん:04/12/30 13:44:11
>>823
#define hoge(n) ((n == 1) ? 0x01 : (n == 2 ? 0x03 : (n == 3 ? 0x07 : (n == 4 ? 0x0F : (n == 5 ? 0x1F : (n == 6 ? 0x3F : (n == 7 ? 0x7F : (n == 8 ? 0xFF : 0)))))))
830デフォルトの名無しさん:04/12/30 15:02:39
824で答え出てんのに何でわざわざ…
831デフォルトの名無しさん:04/12/30 21:08:36
>>830
三項演算子を使うと難しいことをやっているように見えるから。
832デフォルトの名無しさん:04/12/31 00:53:35
2〜100の素数を求めるプログラムなんですが、
下のプログラムでは間違ってると思うのですがどこが違うか教えて頂けませんか?
自分の考え方は、素数は素数未満の2以上の数では割り切れないので
if((i>j)&&(i%j==0))で、素数以外の数を表しているつもりです・・。
初心者なので、根本的に間違っていたらすみません・・。よろしくお願いします。
#include <stdio.h>
main()
{
int i,j;
for(i=2;i<101;i++)
for(j=2;j<101;j++)
{
if((i>j)&&(i%j==0)) ;
else printf("%d\n",i);
}
}
833デフォルトの名無しさん:04/12/31 01:17:01
#include <stdio.h>
main()
{
int i,j;
for(i=2;i<=100;i++)
{
for(j=2;j<=i;j++){if(i%j==0) break;}
if (i==j) printf("%d\n",i);
}
}
834832:04/12/31 01:25:35
>>833
ありがとうございます。833さんのは余りが0の時にbreakでif (i==j)に行くという事ですかね…。なんか答えが、
#include <stdio.h>
main()
{
int i,j,prime;
for(i=2;i<100;i++)
{
prime=1;
for(j=2;j<=i/2;j++)
if(!(i%j)) prime=0;
if(prime) printf("%d\n",i);
}
}
となっていたので、真似して
#include <stdio.h>
main()
{
int i,j,prime;
for(i=2;i<101;i++)
{
prime=1;
for(j=2;j<101;j++)
if((i>j)&&(i%j==0)) prime=0;
if(prime) printf("%d\n",i);
}
}
としてみてたらできました。primeの意味が良く分かりませんが…。
835832:04/12/31 01:29:57
あとプログラムの実行で、3からしか表示されないのですが、
たぶん上に2が表示されていると思うのですが、2も表示させるにはどう設定を変更したら
良いのでしょうか?良かったら教えて下さい・・。
836デフォルトの名無しさん:04/12/31 01:35:14
>>835
お前…
837デフォルトの名無しさん:04/12/31 01:35:46
改行しまくってはみ出てるんならprintf("%4d", i);にすればいい。
838デフォルトの名無しさん:04/12/31 01:45:44
>>837
なるほど!ありがとうございます。
839デフォルトの名無しさん:04/12/31 20:30:49
質問があります。既出でしたらすいません。
C++でのoperatorの挙動についてです。
使用する環境は以下のとおりです。
【コンパイラ・環境】
gcc(2.9.5、3.1、3.3.2)とVS.NET
【質問内容】
myclassクラスのメンバ関数として
myclass operator + (myclass & ao)
{
myclass ret;
ret.i = i + ao.i;
return ret;
}
とし、main関数内でmyclassのオブジェクトa,b,c,dを作成した状態で、
d=a+b+c;
は当然問題なくできますが、
d=a+(b+c);
などとしますと、コンパイラがgccの場合、(b+c)が参照として渡せないとしてエラーがはかれます。
解決策としては、メンバ関数の引数にconstを書けばいいのですが、VS.NETではconstを記述しなくても
コンパイルされます。
このあたりの挙動がよくわかりません。
尚、VS.NETでは、retを返すと、(b+c)に対し新たにmyclassの一時
オブジェクトが生成されるようですが、gccでは、d=a+(b+c)の演算が終了するまで
返されたretのオブジェクトが保持されるようです(ここがconst?)。
840デフォルトの名無しさん:04/12/31 20:34:15
変換が必要なオブジェクトや定数やテンポラリは非const参照には渡せません(値が書き換えられるかもしれないので)
841839:04/12/31 20:46:15
>840
ご回答ありがとうございます。
参照を引数にしているので、その値を書き換えられるのを避けるために
constを書くのは分かるのですが、それをコンパイル時に「警告」ではなく
「エラー」にしてしまうのが分からないのです。
また、+演算子のオーバーロードを行う場合、引数に渡したオブジェクト
(当然参照されている状態)を変更したいという稀な場合もないともいえないと
思います(それが組み込み型などの演算と挙動が違う悪い書き方だとしても)。
842デフォルトの名無しさん:04/12/31 20:56:30
>>841
例えば文字列リテラル(const char*)の書き換えを
警告で済ましていい事だと思うか?
843デフォルトの名無しさん:04/12/31 21:15:49
そもそもoperator+の返値の型をconst myclassにすべきかと
844839:04/12/31 21:15:55
>842
設問ありがとうございます。
よくないんですか(よくないとしたらどこが)?
845デフォルトの名無しさん:04/12/31 21:16:55
>>841
const「に出来る」のではなく、const「でなければならない」のです。テンポラリ
オブジェクトはその式の実行が終わった時点で消滅するので変更を加える
ことにまったく意味がないからです。どうしても関数内で変更を加えたければ、
右辺を参照ではなく値渡しで受け取ればよいでしょう?
846839:04/12/31 21:17:52
>842
文字列リテラルは書き換え不可な領域に格納されているはずなので、
エラーが出てしかるべきだとは思います。
ですが、今回の+演算子の引数に参照を持たせているというだけで、
それをconstにしなければならないわけではないと思います。
実際、constを引数に記述しなくてもd=a+b+cはできるわけですし。
挙動が.NETとgccで違うところを見ると、ANSIの規格とは別の
独自拡張がどちらかになされているのかと思ってしまいます。
847デフォルトの名無しさん:04/12/31 21:19:29
つまり、gccが正しい。
848デフォルトの名無しさん:04/12/31 21:25:40
>>846
テンポラリオブジェクトを受け取るためにconst参照にするのです
849839:04/12/31 21:55:45
うーん、、、さらに混乱してきました。
今.NETとVC++6.0で以下のプログラムをコンパイルしようとしたらエラーでした。
#include <iostream>
using namespace std;
class myclass
{
public:
int i;
myclass( int ai = 0 ){ i = ai; }
const myclass operator + (const myclass & ao);
};
const myclass myclass::operator + (const myclass & ao)
{
myclass ret;
ret.i = i + ao.i;
return ret;
}
int main()
{
myclass ob1( 1 ), ob2( 2 ), ob3( 3 ), ob4( 4 );
ob3 = ob1 + ob2 + ob4;//エラー!
ob3 = ob1 + (ob2 + ob4);//できる!
cout<<ob3.i<<endl;
return 0;
}
850デフォルトの名無しさん:04/12/31 22:03:27
良くも悪くも基本的にgccは仕様に忠実。
851デフォルトの名無しさん:04/12/31 22:03:49
>const myclass operator + (const myclass & ao);

だから だろ?
852デフォルトの名無しさん:04/12/31 22:05:10
>>850
仕様に忠実で悪いことがあるの?
853デフォルトの名無しさん:04/12/31 22:11:05
試してないけど const myclass operator + (const myclass & ao) const ってしてないからじゃないの?
ってか return myclass(i + ao.i); ってしないとRVO効かないぞ
854839:04/12/31 22:14:06
>851
ですが、
ob3 = ob1 + (ob2 + ob4);
↑これできるんですよね。はじめ(ob2 + ob4)で、ob4はmyclassなんですが、const myclassの参照として
引数に渡され、テンポラリなconst myclassオブジェクトが返されると。
その後、ob1+テンポラリオブジェクトなわけですが、引数はconst myclassのテンポラリオブジェクトが
渡され、結果がまたconst myclassなテンポラリオブジェクトとして返される。
このイメージでいるんですが、それならob3 = ob1 + ob2 + ob4;もできるような
気がするんですよね。
あ、ちなみにgccでもできませんでした。
855839:04/12/31 22:20:40
>853
const myclass operator + (const myclass & ao) const
ですが、戻す型がconst myclassってだけで、const関数にする必要はないと思うのですが。

return myclass(i + ao.i);
としても、しないでも結果は変わりませんでした。
856853:04/12/31 22:22:15
ob1+ob2が先に評価される場合は
(const tmp).operator+(ob4);
だけど、operator+がc指定されてないからダメなんじゃないの?
857853:04/12/31 22:29:53
>>855
RVOは今回の話と関係ないので忘れてくれ
(気になるんだったらEffective C++ か More Effective C++ の
どちらかに書いてあったと思うんでそれ参照)
858839:04/12/31 22:46:17
>856
const myclass operator + (const myclass & ao) const
って、つまりoperator+自身をconst指定するってことですね。
これやったらちゃんとできました。

まだconstに関して混乱してますが、あともう少しといった感じです。
ありがとうございます!
859デフォルトの名無しさん:05/01/01 21:48:46
整数や文字列など 複数の値を一辺に画面に表示できる関数を、
_DEBUGが定義されていれば実行する。定義されていなければ実行しない
というように切り替えたいと考えています。

そこで以下のように考えました。

void func( const char *hoge, ... ) という可変引数を引数に持つ関数があります。
引数にしたものを 画面に表示する printfと同様の処理を行います。
_DEBUGが定義されていなければこれは実行されません。

上記のように 実装するにはどうしたらいいんでしょうか?

#define func( const char *hoge, ... ) とできればいいんですが、できないので
何か解決方法があれば教えてください。
860デフォルトの名無しさん:05/01/01 22:18:41
>>859
っ[ C99 ]
861デフォルトの名無しさん:05/01/01 22:27:47
>>859
#ifdef _DEBUG
#define FUNC func
#else
#define FUNC
#endif
と別名定義してFUNCを使えばいいだけじゃねーの?
862デフォルトの名無しさん:05/01/01 22:38:36
>>859
#ifdef _DEBUG
#define dprintf printf
#else
inline void dprintf(...) {}
#endif
863デフォルトの名無しさん:05/01/01 22:40:07
>>861

#define FUNC func の部分

引数の部分はあえて省略してかいているんですか?

この引数は可変引数なので マクロに登録できないんですよ
864デフォルトの名無しさん:05/01/01 22:51:35
>> 862

関数の名前の部分だけの マクロ登録ってやっていいかどうか
自分では判断しかねたんですが、これしか方法がないようですので
使うことにします。

ありがとうございました。
865デフォルトの名無しさん:05/01/01 22:55:48
>>864
__VA_ARGS__
866デフォルトの名無しさん:05/01/01 23:05:52
>>865

いや本当にそれが使えたら不満ないんですが
VCコンパイラでは使えないんですよ
867デフォルトの名無しさん:05/01/02 00:46:31
>>859
MFCのTRACEでは
#define FUNC 1 ? (void)0 : func
ってやってる。
最適化の段階で消されるんだろう。
868デフォルトの名無しさん:05/01/03 00:48:16
全然関係ないけど、他人のソースよく読んだりコード管理するとき
どんなツール使ってますか?私は、会社で使ったことある人がいるから、
C++仕様書工房ってソフト使ってますがどうにもなれません。何かいいソフト
ありますか?100万ステップ目視管理はさすがに辛いというか自分には無理です。
869デフォルトの名無しさん:05/01/03 00:59:31
>>868
手書きのグラフ。
870デフォルトの名無しさん:05/01/03 02:02:53
>>859
すみません。MFCはできるだけ避けたいと思っていますので。

それと実行してみてわからないことがあったんですが
#ifdef _DEBUG
#define dprintf printf
#else
inline void dprintf(...) {}
#endif

で、デバッグ用の処理ができたんですが、この部分をdprintf.lib というstatic library にして、
また別のプログラムを作ります(以下のプログラム)

[ヘッダ部分]
#pragma comment( lib, "dprintf.lib" );
#include "dprintf.h"
void func();

[ソース部分]
void func() {
dprintf( "test\n" );
}

↑をstatic library 化して func.lib とする。
871870:05/01/03 02:03:33
「つづき」

>>870
また違うプログラムAから func() を呼び出すとき、
そのプログラムAがデバッグで実行しようが、リリースで実行しようが
funclib の中には dprintfの結果がもうすでに書き込まれているので
変化はないんでしょうか。

func.lib がデバッグで作られたか、リリースで作られたかによって
プログラムAでの表示に違いがでると考えていいんでしょうか。

とすると、func.lib と dprintf.lib 各一つずつ用意して、プログラムAで
デバッグ文字を表示するときと、しないときにわけるようにはできないんでしょうか。

どなたか解決策を教えてください。
872デフォルトの名無しさん:05/01/03 02:13:26
>>870
そもそも、そのdprintf.libは意味をなしてない事に気がつかないか?
873デフォルトの名無しさん:05/01/03 02:18:08
>>871
VCなら単純にデバッグ版func.lib(func_d.libとでもしといて)とリリース版func.lib
をプログラムAのコンパイラオプションで選択すりゃいいし、

#ifdef _DEBUG
#pragma comment(lib, "func_d.lib")
#else
#pragma comment(lib, "func.lib")
#endif

と書いてもいいだろうし、どちらにせよデバッグ版とリリース版1つずつ用意して
どちらをリンクするかを決めりゃいい
874デフォルトの名無しさん:05/01/03 02:51:06
>>872

dprintf では printfを実行してますけど、実際は 可変引数の関数を実行するもので
printfとは違う処理を行ってます。

>>873

やっぱり 2つ用意するしかないんですか><;;
ありがとうございました。
875デフォルトの名無しさん:05/01/03 10:53:37
このdprintfがいろんな場所でinline展開されれば、きっと時間とお金の浪費癖が付くよ。
876デフォルトの名無しさん:05/01/03 11:00:34
それにFormatMessage,OutputDebugString,wsprintf APIも知らないとは。何を参考にしてるんだ? #defineの仕組みも知らない素人が作る枠組みは確実に失敗するよ。
877デフォルトの名無しさん:05/01/03 11:02:08
age
878デフォルトの名無しさん:05/01/03 11:11:42
>>876
また苦労と気取りですか。
879839:05/01/03 16:01:12
遅いですが、constに関して一応分かったことをご報告。
gccでは
・テンポラリオブジェクトを自動でconst扱い
・constオブジェクトで非constメンバ関数が使用できてしまう(warningは出る。constはずし?)
です。
VC++では自動的にconstにしてしまうとかないので、ANSI規格というか仕様にちゃんと準拠な感じです。
gccの勝手な(?)独自拡張が混乱のもとでした。
880デフォルトの名無しさん:05/01/03 16:04:24
>>879 断じてちがう。
881839:05/01/03 16:05:20
あ、あとgccでは
const myclass operator + (const myclass & ao)const
{
cout<<"operator+の呼び出し"<<endl;
myclass ret;
ret.i = i + ao.i;//iはmyclassメンバ
return ret;
}
とやると、return myclass(i+ao.i);と記述したと同様にRVOが働くみたいです。
コピーコンストラクタは呼ばれませんでした。VC++ではちゃんとreturn myclass(i+ao.i);と書かないとRVOは働きません。
882デフォルトの名無しさん:05/01/03 16:06:21
g++の間違い
883839:05/01/03 16:07:47
すいません。gccをGNU コンパイラコレクション
というつもりで言っています。
g++はコンパイラコレクションの一部ということで。
884デフォルトの名無しさん:05/01/03 16:08:56
>>879
テンポラリであることと const であることは無関係。
型 T のテンポラリも、型 T const のテンポラリも存在する。
型 T のテンポラリに対しては非 const メンバ関数を呼び出すことができる。
言語の規格では、型 T のテンポラリは T& を初期化することができない。
型 T のテンポラリで T& を初期化できるのは VC++ の挙動がおかしい。
VC++ の挙動がおかしいのは歴史的な事情による。
885839:05/01/03 16:14:00
>884
myclass ob1,ob2,ob3,ob4
というのがある場合(初期化は省略しました)、
ob3=ob1+ob2+ob4
という演算を行う際、operator+関数のオーバーロードを用意しますが、
その型(戻り型、operator+関数の呼び出し元オブジェクトの型、引数の型)
をどうするのかということで悩んでいました。
ob1+ob2を評価し、そのテンポラリオブジェクトを戻し、
テンポラリオブジェクト+ob4という流れになるかと思いますが、
その際、gcc(g++)ではconst扱いになるようで、VCでは戻り型に忠実でした。
886デフォルトの名無しさん:05/01/03 16:18:11
>>885
何を調べて「const扱いになる」とか、「戻り型に忠実」とか言ってんの?
887839:05/01/03 16:22:36
>886
typeidではconstかどうかまでは当然分かりませんので、実際に
プログラムを書いてみて、エラーやwarningとしてはかれていることからです。
環境はXcode(gcc3.3)とVS.NET2003です。
忠実は言い過ぎかもしれませんが、そのままの挙動をしていたので。
888デフォルトの名無しさん:05/01/03 16:25:41
>>887
エラーや警告を「そのまま」貼れ。ソースも一緒にな。

typeid で const ってわかんなかったっけ?
889デフォルトの名無しさん:05/01/03 16:27:03
typeidは環境依存
890デフォルトの名無しさん:05/01/03 16:27:28
VCはconstかどうかも分かるけどね
891デフォルトの名無しさん:05/01/03 16:27:59
typeidでconstがわからないのは正しい。(5.2.8 -5-)
892839:05/01/03 16:30:53
以下ソースです。constははずしてあります。
class myclass
{
public:
int i;
myclass( int ai = 0 ){ i = ai; cout<<"コンストラクタの呼び出し"<<endl;}//コンストラクタ
myclass(const myclass & ob){ i = ob.i; cout<<"コピーコンストラクタの呼び出し"<<endl;}//コピーコンストラクタ
~myclass(){cout<<"デストラクタの呼び出し"<<endl;}//デストラクタ
myclass operator + (myclass & ao);
};
myclass myclass::operator + (myclass & ao)
{
cout<<"operator+の呼び出し"<<endl;
//myclass ret;
//ret.i = i + ao.i;
//return ret;
return myclass(i+ao.i);
}
int main()
{
myclass ob1( 1 ), ob2( 2 ), ob3( 3 ), ob4( 4 );
const myclass ob5(100);
ob3 = ob1 + ob2 + ob4;
cout<<ob3.i<<endl;
//ob3 = ob1 + (ob2 + ob4);//このままだとVCではOK。g++ではエラー。
cout<<ob3.i<<endl;
return 0;
}
main関数内でob1〜ob5までをいろいろ組み合わせて足してみています。
typeidではオブジェクトの型は分かると思いますが、修飾子の判断までは
どうなんでしょう。
893839:05/01/03 16:36:12
//ob3 = ob1 + (ob2 + ob4);
をXcode1.5(gcc3.3)で実行すると以下のようなエラーが出ます。
error: candidates are: myclass myclass::operator+(myclass&)
error: no match for `myclass& + myclass' operator
当然、operatorの引数にconstをつければ問題ないんですが。
これはob2+ob4のテンポラリオブジェクトがg++においてconst扱いに
なるからかと思うのですが、どうなんでしょうか?
894デフォルトの名無しさん:05/01/03 17:15:49
できることとやってもいいことは違う。仮引数のconstは何のためにあるんだ?
895デフォルトの名無しさん:05/01/03 17:16:37
継承についてわかりやすく解説してるサイトを知りませんか?
896839:05/01/03 17:24:18
>894
できるからやるといった話ではなく、単にgcc(g++)の仕様が
把握できずに、戸惑っているんです。
例えば、(仮に正しいとした上で)演算中のテンポラリオブジェクトが
自動でconst扱いされるのは、そのオブジェクトが不可変であるべきだと
いうことからそうなったのであれば、なぜconstオブジェクトが非const
メンバ関数を呼び出すことを許すのかといったことです(実際はwarning
出ますが、c++の仕様では禁止されているはずです)。
gccでの挙動がc++の仕様ではなく、独自の拡張であるのなら、
様々な環境下で、それぞれにあわせたコーディングを考えないといけない
ので、厄介だーと思ったのです。
897デフォルトの名無しさん:05/01/03 17:34:28
g++で指定できる無数の起動オプションを参照することw
898デフォルトの名無しさん:05/01/03 17:34:55
>>896
>>884を読んでどこが納得できない?
899デフォルトの名無しさん:05/01/03 17:36:11
>>898
つまりテンポラリオブジェクトが自動でconstになるのは正しいのかどうか?
ということじゃないんか?
900839:05/01/03 17:42:19
>898
納得してます.constとテンポラリ,それぞれが無関係であることは.
>899
そういうことです.補足すいません.
正しいかどうかと言いますか,gcc(g++)はそうじゃないのですか,
と書いたところ,少し話がずれてきてしまいまして.

gccはそういう仕様だから,そうなる.
ということがはっきりすれば良いだけなんです.
901デフォルトの名無しさん:05/01/03 17:51:20
//ob3 = ob1 + (ob2 + ob4);//このままだとVCではOK。g++ではエラー。
これはgccの方が正しいのであって、VCの方が独自拡張だぞぃ。
902デフォルトの名無しさん:05/01/03 17:57:18
>>868
あんたの立場と何がしたいのかをもっと具体的に。
>868だけじゃ、他人のソースを読むのに手頃なツールが欲しいのか、
C++仕様書工房を使いこなしたいのか、コード管理ツールが欲しいのか、
愚痴を言いたいのか判らん。
903デフォルトの名無しさん:05/01/03 18:06:44
>>901
839ではないですが、同じ疑問がある者です。
その式は
ob1.operator+( ob2.operator+(ob4) );
と解釈されると思いますが、ob2.operator+(ob4)から返されるのはmyclassのオブジェクトですから
ob1.operator+に渡してエラーになる、というのがどうも納得いきません。

constを明示的に指定しなくてもテンポラリオブジェクトはconstと解釈されるため、
myclass&を引数に取るob1.operator+には渡せない、ということでしょうか?
904デフォルトの名無しさん:05/01/03 18:08:39
テンポラリは自動でconstになったりしない。
これは規格にも書かれているはずだし、g++も正しく実装している。
単に、非const参照を非constテンポラリで初期化できないだけだ。
905デフォルトの名無しさん:05/01/03 18:13:17
>>904
なるほど、納得しました。
const参照を非constテンポラリで初期化 ならばOKなわけですね
906デフォルトの名無しさん:05/01/03 18:14:54
>>905
ピンポーン
907839:05/01/03 18:25:02
>904
すいません!そういうことだったんですね!
今度はちゃんと理解しました.

非const参照を非constテンポラリで初期化できないのはC++の仕様である
ということですね.
で,ob1+ob2ができるということは
非const参照は(非)constオブジェクト(テンポラリじゃない)で初期化は
できるってことですかね.
908デフォルトの名無しさん:05/01/03 18:27:49
>>907
そりゃ普通のオブジェクトで参照を初期化できなかったら
参照渡しができなくなるかと…
909839:05/01/03 18:36:08
非const参照を非constテンポラリで初期化できない...
const参照ならできる・・・.記憶領域の関係で?コンパイラの最適化の関係で?
理由はわかりませんけど,そういう仕様ならそれに従うしかないですね.

ありがとうございました!
910839:05/01/03 18:46:33
っと,忘れてました.
>型 T のテンポラリに対しては非 const メンバ関数を呼び出すことができる。
に関連してですが,g++が
型 T const(テンポラリ)オブジェクトに対して非 const メンバ関数を呼び出すことができる。
ということができてしまうのは,よろしくないですよね.
911デフォルトの名無しさん:05/01/03 18:56:00
△ 非const参照を非constテンポラリで初期化できない
○ 非const参照をテンポラリで初期化できない
912デフォルトの名無しさん:05/01/03 18:56:46
>>910
できねーよ。やってみてから言え。
913デフォルトの名無しさん:05/01/03 19:04:37
初心者歓迎、とのことなので、恥を忍んで…。
自分のバカさ加減にあきれ気味です…。

#include<stdio.h>

int main(void)
{

double r;
scanf("%f\n",&r);
printf("r=%fです\n",r);


return 0;
}


単純に「5」と入力したら、「r=5です」
と表示させたいだけなのですが…。
ナニがおかしいのでしょうか…?
914デフォルトの名無しさん:05/01/03 19:07:44
scanf("%lf",&r);
915デフォルトの名無しさん:05/01/03 19:08:29
scanfの引数に\nがある。
Enterキー押していない?
916デフォルトの名無しさん:05/01/03 19:09:00
>>913
float : %f
double : %lf
long double : %Lf
917839:05/01/03 19:10:11
>911
非const参照をconstテンポラリで初期化できないのはそのままですね.

>912
できねーんですよ.そうなんです,できないはずなんです.
でもXcodeで実行するとエラーではなくwarningはくだけでコンパイルされるんです.
constが無効化するのかもしれませんが.
918デフォルトの名無しさん:05/01/03 19:16:14
g++はconstを無効にするオプションがある。
919デフォルトの名無しさん:05/01/03 19:20:04
>>915-916
ありがとうございました。
無事、表示できました。

もう少し自分のバカ脳味噌とつき合ってみます。
920839:05/01/03 19:20:04
なるほど.それでできてしまうんですね.
921デフォルトの名無しさん:05/01/03 19:30:44
>>917
エラーや警告を「そのまま」貼れ。ソースも一緒にな。

>>918
聞いた事無いな。どんなの?
まさか -Dconst= とか?
922839:05/01/03 19:40:31
>921
警告はですね
passing `const myclass' as `this' argument of `myclass myclass::operator+(myclass&)' discards qualifiers
となっています.
ソースは
>>892
です.その中でob3=ob5+ob2とやってみると,constなob5が非constメンバ関数operatorを呼び出せてしまいます.
923デフォルトの名無しさん:05/01/03 19:50:13
g++3.3.3ではエラーになるんだけどな
924デフォルトの名無しさん:05/01/03 19:50:51
>>922
それ、エラーになってないか?
警告ならメッセージの先頭に warning と書いてあるはずだぞ。
925839:05/01/03 20:00:16
>923-924
そうですか.いやXcode1.5(gcc3.3)でやるとそうなるんですよね.
Darwin(BSD?)版のgccだとよろしくないかもしれません.
linux等でエラーになるのなら,それはそれで問題ないですね.
926デフォルトの名無しさん:05/01/03 20:02:53
XCodeはどんなオプションでコンパイルしてるんだ…
927デフォルトの名無しさん:05/01/03 20:10:47
>>925
> いやXcode1.5(gcc3.3)でやるとそうなるんですよね

だったら先にそう書けこのバ
928839:05/01/03 20:12:22
す,すいません.
>>917に書いたつもりだったんですが.
929デフォルトの名無しさん:05/01/03 21:48:05
deque<char *> dp;に文字列を格納する時に
char buf[100];
strcpy(buf, "abc");
dp.push_back(buf);
とするとうまく格納されるのですが、
char buf[100];
buf[0] = 'a'; buf[1] = 'b'; buf[2] = 'c'; buf[3] = '\0';
dp.push_back(buf);
とするとdp[0]dp[1]と呼び出した時に
何も表示されなかったり、全て最後に格納した内容が表示されたりするんです
何が原因でしょうか?
930デフォルトの名無しさん:05/01/03 23:10:50
>>929
君が言っている「うまく格納される」は、1つの関数の中にdpもbufも
入っているときに過ぎない。ある関数の中で
 int hoge(){
  char buf[100];
  ...
としていたとして、この関数を抜けたところでbufそのものが消滅して
いるから、dpがこの関数の外にスコープを持っていた場合、bufの
先頭アドレスを持っているdpの内容も当然破綻する。
931デフォルトの名無しさん:05/01/04 02:39:16
int main()
{
char s1[]="Hello",s2[]="World",s3[20];
cout << strcat(s1,s2) << endl;
cout << s1 << endl                      //下のプログラムと違う箇所
<< strcpy(s3,s1) << endl;
return 0;
}

これをコンパイルして実行すると
HelloWorld
HelloWorld
HelloWorld
と出力されるのですが、

int main()
{
char s1[]="Hello",s2[]="World",s3[20];
cout << strcat(s1,s2) << endl
<< s1 << endl                      //上のプログラムと違う箇所
<< strcpy(s3,s1) << endl;
return 0;
}
これをコンパイルして実行すると
HelloWorld
HelloWorld
Hello
となるのです。

二つのプログラムの相違点が、このような出力の違いを生み出しているのは分かるのですが、
何故このような違いが現れるのか、御教授お願いします。
ちなみにコンパイラはBCC5.5.1です。
932デフォルトの名無しさん:05/01/04 02:48:17
>>strcat(s1,s2)
何やってんのよ…
ポインタや配列を一から勉強し直してください
933デフォルトの名無しさん:05/01/04 02:56:02
>>932
ああ、本当だ。
ここは、s1[15]="Hello"のように十分な配列を確保しておかなければならなかったorz
934デフォルトの名無しさん:05/01/04 03:14:23
ダメだorz
s1の配列を十分に確保したけど、それでも>>931と同じ結果になるorz
935デフォルトの名無しさん:05/01/04 03:46:23
>>934
副作用完了点 または シーケンスポイント でググれ。
一応その場合について言っておくと、
strcpy(s3,s1)がstrcat(s1,s2)より先に呼ばれたからそうなっただけ
936デフォルトの名無しさん:05/01/04 03:48:01
>>934
ポインタの配列のの問題ではない。関数の引数の評価順序の問題。
cout << strcat(s1, s2) << s1 << strcpy(s3, s1);は、operator<<()を書き下すと
operator<<(operator<<(operator<<(cout, strcat(s1, s2)), s1), strcpy(s3, s1));ということ。
途中でostream& std::operator<<(ostream&, const char*);が呼び出されるわけだが、
関数の引数の評価順序は規格により未定義。
例えば、関数の引数が右から評価されるような処理系において、最初にstrcpy(s3, s1)が
実行される。当然s3は"Hello"となる。つまり、君の環境でそのコードをコンパイルしたら、
たまたま右から引数が評価されたわけだ。
当然左からでも中央からでも不規則でもかまわない。よってそのコードは環境によって
動作が変わる。
以上のことから関数の引数の評価順序に依存するようなコードは、一般的には書いては
ならないとされている。初心者がほぼ必ず一度ははまる罠。
937デフォルトの名無しさん:05/01/04 03:52:38
そこでJavaですよ
938デフォルトの名無しさん:05/01/04 04:00:16
まあ右再帰で還元されるから、右から左へ評価されるのが
一番素直な実装ではあるんだが。
939デフォルトの名無しさん:05/01/04 04:23:50
>>935-938
丁寧な解説、感謝します。
この場合、問題解決の方法としては、>>931の下のプログラムのように、
cout << (文1) << endl;
cout << (文2) << endl;

という風にすれば、処理系に依存しないプログラムになるということですね。
940デフォルトの名無しさん:05/01/04 04:26:52
>>939
違う、下ではなく上であったorz
941デフォルトの名無しさん:05/01/04 04:29:14
strcat 等の戻り値を変数に保存しておけば何回も書かずにすむ
942デフォルトの名無しさん:05/01/04 11:17:43
構造体配列を関数に渡して関数の中でメンバの二次元配列の値を代入したいのですが
St->menba[0][0]=1;と書くと大丈夫なのですが
int i;
i=0;
St->menba[0][i]=1と項番に変数を入れると値が変更されていません。
なぜなんでしょうか。
943デフォルトの名無しさん:05/01/04 11:22:48
自己解決しました。ありがとうございました。
944942:05/01/04 11:26:58
私は自己解決全然してないので、どなたかお願いします。
945デフォルトの名無しさん:05/01/04 11:49:22
>>942
とりあえず問題部分のソース晒せ
946942:05/01/04 12:03:25
for(cnt=0;cnt<10;cnt++)
{
for(cntA=0;cntA<10;cntA++)
{
for(cntB=0;cntB<10;cntB++)
{
(St+cnt)->menba[cntA][cntB]=1;
}
}
}
だいたいこんな感じです。cntA,cntBを使わずに数字を直でいれれば値が変わるのですが
そうしてしまうと、ソースが無駄に長くなってしまうので悩んでいます。
947デフォルトの名無しさん:05/01/04 12:35:25
>>946
値が変わったかどうかは何で確認したの?
948デフォルトの名無しさん:05/01/04 14:31:54
949デフォルトの名無しさん:05/01/04 18:01:53
>>946
配列の範囲外をアクセスしている悪寒。
構造体の定義を晒してみ。
950942:05/01/04 19:39:04
徹夜で眠くて寝てしまいました。
もう少し自分でやって出来なかったらもう一回質問に来ます。
951942:05/01/04 20:01:15
覚めた頭でやってみたら出来ました。
やっぱり範囲外にアクセスしていたみたいです。
書き込みしてくれた皆様、ありがとうございました。
952初質の人:05/01/04 21:58:18
【初心者歓迎】C/C++室 Ver.13【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1104843249/
953デフォルトの名無しさん:05/01/04 22:50:41
954デフォルトの名無しさん:05/01/05 00:56:56
955デフォルトの名無しさん:05/01/05 01:12:42
map<string, int>でmap<"1234">に
すでに何かデータが入っているかを調べるにはどうすればいいですか?
データが存在しないのにアクセスするとエラーになるし・・・
956デフォルトの名無しさん:05/01/05 01:15:50
>>955
>map<"1234">
なんだその表現は。
map::findで調べればいいじゃない
957デフォルトの名無しさん:05/01/05 01:17:25
メンバ関数の
find, count, lower_bound等
Effective STL くらいは読んでおくと後が楽だよ
958957:05/01/05 01:18:52
エラーだっけか?
確か初期値が返ったと思うのだが
(禿本にもそう書いてなかったっけ?)
959デフォルトの名無しさん:05/01/05 01:19:54
初期値が返る事は規格で保証されてるよ
960デフォルトの名無しさん:05/01/05 01:57:53
VC6+STLPortについてですが、stlport付属のiostreamライブラリは使うべきですか?
961デフォルトの名無しさん:05/01/05 11:46:34
>960
何をしようとしてる?
962デフォルトの名無しさん:05/01/05 12:35:28
960ではないがリコンパイルしたもの使っているけど別に問題ないな。
処理速度とかバグとかは検証して使ってないけど。
963デフォルトの名無しさん:05/01/05 14:36:44
dllを添付するのがめんどくさい、とかじゃないかな。
964デフォルトの名無しさん:05/01/05 15:24:21
>>963
makeで必要ファイルをアーカイブするところまで作っておくと楽だよ。
VCのプロジェクトファイルとかでそれが出来るかどうかはしらないけど、
多分できるんじゃない?
965デフォルトの名無しさん:05/01/05 18:25:22
システム実行中に時間を計測したいのですがどうすればうまく計測できますか?
966デフォルトの名無しさん:05/01/05 18:31:02
>>965
処理の前後でタイマの数値取って差分出せばいいだけだろ
967デフォルトの名無しさん:05/01/05 18:31:10
>>965
プロファイル汁。
968デフォルトの名無しさん:05/01/05 18:46:23
>1-1001 ありがd
969デフォルトの名無しさん:05/01/05 20:21:17
すいません先ほどのスレでご意見いただけませんのでやってきました。。
WindowsSDKで、RICHEDITをCreateWindowExで作成しているのですが、親ウィンドウから、
どの文字(英数字のみ)が入力されたかを知るにはどうしたらいいのでしょうか。
メッセージキューに何が入るのかがわからないのです・・・コントロールは始めて使いますので
(というかどうやったら入るのかもわからないのですが・・・たぶん入っている・・・みたいな_no)
970デフォルトの名無しさん:05/01/05 20:32:22
GetTickCountトカ?マサカナ
971デフォルトの名無しさん:05/01/05 20:47:44
>969
case WM_CHAR:の処理を加工して規定の処理をしたいデータをDefWin~Procに渡せば、文字の制限など簡単。Beep参照
972デフォルトの名無しさん:05/01/05 23:38:56
良スレハケーン(大学受験板)・・・スレタイを見よ。
http://school4.2ch.net/test/read.cgi/kouri/1102125273/

なんともム板にふさわしいスレタイではないか。「真」だ!!!
973デフォルトの名無しさん:05/01/06 00:17:44
オブジェクトを宣言する場合
値型
class1 c1;
ポインタ型
class1 *c1 = new c1;
どっちが適しているんですか?
974デフォルトの名無しさん:05/01/06 00:28:26
>>973
知らん。情報少な過ぎ。
975デフォルトの名無しさん:05/01/06 00:31:12
>>973
場合によりますー ポインタの方が良く使うかもしれませんが…
あまり使いたくありませんね…^^; にゃんにゃん
976デフォルトの名無しさん:05/01/06 00:42:52
C++のサンプルコードではよく値型を使っていますが
C#ではC++のポインタ型に似た式です
一人で書いたと思われるソースで
値型とポインタ型を使い分けていた人がいたので
気になったのですが
977デフォルトの名無しさん:05/01/06 01:03:09
>>976
場合によるって書かれてるじゃん
978デフォルトの名無しさん:05/01/06 01:14:33
こう言いましょうかー。
ポインタを使うしかないときだけポインタをつかいましょうー にゃんにゃん
979デフォルトの名無しさん:05/01/06 01:32:08
>>978
>ポインタを使うしかないとき
っていうのは派生クラスのオブジェクトで
基本クラスのメンバ関数を呼び出すときとかのことですよね?
ありがとうございました
980デフォルトの名無しさん:05/01/06 01:34:48
スタックとヒープの使いわけ。
981デフォルトの名無しさん:05/01/06 01:56:14
>>979 ちがうよ。
982969:05/01/06 11:38:16
>>971さん
どうもありがとうございます。ただ、WM_CHARにブレークポイントを設定しても
引っかかってくれません。Spy++で見ると、たしかにWM_CHARは送られているのですが・・・
親ウィンドウでWM_CHARを取得するのに、何かをSendMessageしたりとかしないと
いけないのかなぁと思ったのですが・・・m(_ _)m
983デフォルトの名無しさん:05/01/06 11:41:41
>982
その前にRICHEDITのサブクラス化は?
984969:05/01/06 11:51:39
うわーすいません、サブクラス化というのが必要だったんですね>_<;
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win64.html
を見てうまくやることができました。
>case WM_CHAR:の処理を加工して規定の処理をしたいデータをDefWin~Procに
というのもうまくできました。。どうもありがとうございます☆
985デフォルトの名無しさん:05/01/06 14:43:08
そういえばパナウェーブってどうなったの?
986デフォルトの名無しさん:05/01/06 15:53:34
雪に埋もれてるんじゃない?
987デフォルトの名無しさん:05/01/06 16:18:34
いきなり何の話だ
988デフォルトの名無しさん:05/01/06 16:42:03
スカラー波の波動を計算するプログラムを作ってくれ、って意味じゃない?
989デフォルトの名無しさん:05/01/06 17:16:52
>988
...
#include<math.h>
...
double i,j;
for(i=0;i<20;i+=1){
for(j=0;j<15+15*sin(2*i*M_PI/20);j+=1)putchar(' ');printf("*\n");
}
990デフォルトの名無しさん:05/01/06 17:19:45
ワロタ
991デフォルトの名無しさん:05/01/07 01:25:40
スカラー波の不変条件は?
992デフォルトの名無しさん
パナウェーブに聞いてください