はきだめC/C++下級者の質問箱

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
はきだめのスレへようこそ

ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。
なお、質問する人は回答はあまり期待しないでください。
2デフォルトの名無しさん:2005/08/17(水) 14:22:45
終了
3デフォルトの名無しさん:2005/08/17(水) 14:45:01
sinekuzu
4デフォルトの名無しさん:2005/08/17(水) 17:28:19
笑える。
5デフォルトの名無しさん:2005/08/17(水) 17:29:13
なにこの良スレ
6デフォルトの名無しさん:2005/08/17(水) 17:46:45
なんで上級者は、

*p++ = *q++;

って、書きたがるのですか?

*p = *q;
p = p + 1;
q = q + 1;

って書いたほうが、間違いがなくて、はるかに分かりやすいと思うけど、
こう書いたら、死ぬほど怒られた・・・
7デフォルトの名無しさん:2005/08/17(水) 17:48:08
>>6
処理が遅くなる
8デフォルトの名無しさん:2005/08/17(水) 17:52:06
>>7
ハハハハハ。
「はきだめC/C++下級者の質問箱」ならではのナイスレスw
9デフォルトの名無しさん:2005/08/17(水) 18:08:01
>>6
プログラム言語c++の165p〜167Pを
立ち読みしてください。
10デフォルトの名無しさん:2005/08/17(水) 18:18:11
屁をしたくなったので思いっきりぶっ放したら、液状便がパンツについてしまいました。
どうすればいいですか?
11デフォルトの名無しさん:2005/08/17(水) 18:21:01
とりあえずにおいを嗅いでそのあと放置
12デフォルトの名無しさん:2005/08/17(水) 19:26:09
>>10
俺ならつりセットして道路に放置、釣れるまで待つwww
13デフォルトの名無しさん:2005/08/17(水) 19:53:41

少なくとも
p=p+1;はやめとこうな。
14デフォルトの名無しさん:2005/08/17(水) 20:05:29
*p++ = *q++;

だと一行に情報が詰まってって、瞬間的にやってることが理解できる。
慣用句みたいなものだし。

*p = *q;
p = p + 1;
q = q + 1;

だと、3行見ないといけないので、理解速度落ちる。
15こえだめ:2005/08/17(水) 22:11:24
コンパイル通らないだろうけど、
敢えて書くとしたら
(*p)++=(*q)++じゃなくて
*(p++)=*(q++)という意味だろう
*型は、入れ物の最初のアドレスを示す
この感覚を持っておくのは、間違いを防ぐために重要だよ
16デフォルトの名無しさん:2005/08/17(水) 22:57:04
>>6
どうせだったら
p[0] = q[0];
p = &p[1];
q = &q[1];
と書いてみてはどうだろう。
きっとその先輩も納得してくれるはず。
17デフォルトの名無しさん:2005/08/17(水) 23:43:53
フリーのC言語コンパイラなんてあんの?
18デフォルトの名無しさん:2005/08/17(水) 23:47:24
>>17
VC7.1
19デフォルトの名無しさん:2005/08/17(水) 23:52:15
>18
レス
アリガトウゴザマス
20デフォルトの名無しさん:2005/08/18(木) 00:02:00
>>19
ここは「通報しますた」と返す所じゃないか?
21デフォルトの名無しさん:2005/08/18(木) 01:17:42
*++p=*++q,*r++?*s++:*++t;
22デフォルトの名無しさん:2005/08/18(木) 01:20:24
>20
皮肉りますた
23デフォルトの名無しさん:2005/08/18(木) 02:40:49
>>21
すごいな。Cプログラマーは、これを一瞬見ただけで理解できるのか・・・
下級者な俺は、カッコとかつけてみて、一個ずつ考えてかないと何やってるのか
サッパリ分からないよ。

こんなの、どうやったら一瞬見ただけで分かるようになるのですか?
てか、なんで上級者は、できるかぎり分かりにくく書くように努めるのですか?
24デフォルトの名無しさん:2005/08/18(木) 02:48:34
>>21
俺も凄いと思った。こんなコードを一瞬で理解できるなんて、天才か基地外の
どちらかだな。どちらかというと後者の方だろうな。
25デフォルトの名無しさん:2005/08/18(木) 02:53:16
むしろアフォ
26デフォルトの名無しさん:2005/08/18(木) 03:37:00
*(p)=*(q),p=p+1,q=q+1,*r,r+=1,?*s++:*++t;
27デフォルトの名無しさん:2005/08/18(木) 08:39:28
stdioはスタジオと読むのですか?
28デフォルトの名無しさん:2005/08/18(木) 09:38:34
#include <studio.h>

だめだ、エラーが出るOrz
29デフォルトの名無しさん:2005/08/18(木) 10:14:52
#include <megadlib.h>

だめだ、エラーが出るOrz
30デフォルトの名無しさん:2005/08/18(木) 10:57:09
>>27
すたんだーどあぃおー
31デフォルトの名無しさん:2005/08/18(木) 11:13:30
何この良スレ
3227:2005/08/18(木) 11:21:25
>>30
由来は知っています。読み方が知りたいです。
33デフォルトの名無しさん:2005/08/18(木) 11:22:04
>>32 いや、>30が読み方だ。
34デフォルトの名無しさん:2005/08/18(木) 11:24:27
僕はすたっどあいおーってよんでる。
上級者向けの本に書いてあった。僕は上級者じゃないけど
35デフォルトの名無しさん:2005/08/18(木) 11:26:35
えすてぃーでぃーあいおー
36デフォルトの名無しさん:2005/08/18(木) 11:54:08
僕は「ストゥドゥアイオー」と読んでいます。
カタカナでは表現しきれない発音なので困っています。
37デフォルトの名無しさん:2005/08/18(木) 12:38:08
>16
コンパイル通らないぞ
>p=&p[1];
>q=&q[1];

だいたい、
p[1]自体、*型のp+1なわけで、
Buhi* pa;
Buhi a[値];
なら、
pa=a;と書けるわけで、
しかし、a=pa;とは書けないわけで、
やりたけりゃ、
charならstrcpy[a,pa]もしくはlstrcpy使えるわけで、
strcpyやlstrcpyがあるのは、
このようにchar配列→char*型に入れられるという存在意義が大きいわけで
38デフォルトの名無しさん:2005/08/18(木) 12:40:45
このようにchar*→char配列に入れられるという存在意義が大きいわけで
39デフォルトの名無しさん:2005/08/18(木) 13:03:43
てことで、
p[値]なとき、pが示すのは、配列の先頭アドレス
*paなとき、paが示すのは、入れ物の先頭アドレス

世の中の本の説明はへたくそだと思う
40デフォルトの名無しさん:2005/08/18(木) 13:10:35
>>37
> コンパイル通らないぞ
配列として宣言するからだろ
41デフォルトの名無しさん:2005/08/18(木) 18:14:25
CってJavaと違ってコンパイラ無いと出来ないの?
42デフォルトの名無しさん:2005/08/18(木) 18:36:44
>>41
Java にもコンパイラ要るだろ?
しかも Java はコンパイラだけじゃなくランタイムまで要るだろ?
43デフォルトの名無しさん:2005/08/18(木) 19:12:40
ランタイムって何ですか?
44デフォルトの名無しさん:2005/08/18(木) 20:03:09
>42
失礼、知人から古いパソごと貰ったものですから・・・
Cみたいな値段するんですか?
45デフォルトの名無しさん:2005/08/18(木) 20:11:33
CもJavaもただで出来るっつうの…
VCのコンパイラもフリーであるし
46デフォルトの名無しさん:2005/08/18(木) 20:16:46
Java?あーあのCPUの性能を1/2以下にする糞言語の事ですか。
プログラマが楽をして、そのツケをユーザー側に押しつける最低言語。
47VCでは:2005/08/18(木) 20:28:31
例えば、MFCwizardでデフォでできてるFlame、Doc、Viewの各クラスは基本的に相互不可侵、
要は、例えば、Viewクラスから、CDoc::〜なんて、関数を使っちゃうことができない
(おそらく、この機能は、それぞれの基本クラスで、protect:指定されて関数が定義されているからではないかと勝手に推測してる)
だが、それでは、困るから、お互いのクラスをアクセスする為の関数が各クラスに少しだけ設けられている
これらを介すれば、例えば、Viewクラスから、Docクラスの関数を全てかどうか分からないが、スコープ(::)で使えなかったあらゆる関数が使えるようになる
で、これらのクラスの関係のしくみをとり仕切っているのがボスであるCWinAppクラス
この派生クラスであるC〜Appクラスでドキュソメントテソプレートというテンプレート(テンプレ自体はC++の機能。おそらく雛型はCWinAppにあると勝手に推測している)というのを使って、
Flame(子も含め)、Doc、Viewの各クラスの関係を定義している
実装は、C〜AppのInitInstanceにある

はきだめらしく、変かもしれない
48デフォルトの名無しさん:2005/08/18(木) 20:30:36
RUNTIME_CLASSの実装は、C〜AppのInitInstanceにある
49デフォルトの名無しさん:2005/08/18(木) 20:41:43
CRuntimeClassのDocTemplete実装は、C〜AppのInitInstanceにある
というのが正しいかもしれない
とにかく、InitInstanceにRUNTIME_CLASS()という関数がある
50デフォルトの名無しさん:2005/08/18(木) 21:36:24
間違い発見
>Viewクラスから、CDoc::〜
C〜Viewクラスから
C〜Doc* pDoc;
pDoc->〜
なんてことはできない
51デフォルトの名無しさん:2005/08/18(木) 23:34:47
>>47
燃やすんですか?<Flame
52デフォルトの名無しさん:2005/08/19(金) 00:17:39
思ったより良スレになる予感
53デフォルトの名無しさん:2005/08/19(金) 00:27:44
実は俺も含め全て>>1の自演。
54奥義のほんの一部だが:2005/08/19(金) 00:33:05
Frame、Doc、Viewは、RUNTIMEでお互いのアクセスをがんじがらめにされている
ある意味、守られたオブジェクト群ともいえる
しかーし、この法の目を抜けて、気ままにお互いアクセスする手段もある
例えば、
同じプロジェクト上で、新規に.hと.cppを作り、Docを派生させてクラスを作ってやる(例えばclass ONEW:public〜)
注)ウィザードの新規クラスでは、コンボになくて、継承できなくなっている、MSがそんな抜け道させない為か・・・
そして、ViewでONEW on;とでも宣言してやれば、あら不思議、
on.〜でViewからDocがGetDocument関数も使わずに自由にアクセスできてしまう
ちなみに、この技、アマグラマーだけに許されている
なぜなら、制限がないだけにプログラマーが、仕事で使うと危ういからだ
ヤケドするぜw
なんちゃって
55デフォルトの名無しさん:2005/08/19(金) 01:02:45
ちなみに、老婆心ながら、試すなら、
ONEWクラスファイルのインクルードを忘れずに

それと、逆にいうと、新規クラスを作るときはRUNTIMEの目が届かない可能性があるから、注意が必要だとも言える
5656:2005/08/19(金) 03:56:46
質問です。
c++についてなのですが、2つcppファイルを作って片方から片方の変数を見る事ができません。
メソッドについてはexternを使えば参照できる事がわかったのですが、変数などが参照できません。
教えてください。よろしくお願いします。
57デフォルトの名無しさん:2005/08/19(金) 07:37:00
>>56
メソッドってなんだろうな…と。
関数は普通に関数宣言で。変数は extern で。
宣言と定義の意味をちゃんと理解しておこう。
58デフォルトの名無しさん:2005/08/19(金) 13:51:19
>>54
ゴチャゴチャしててよく解らんが、もしかして
>そして、ViewでONEW on;とでも宣言してやれば
View に Doc を内包させようとしてる?
そら確かに掃き溜めらしいが…
59デフォルトの名無しさん:2005/08/19(金) 14:29:11
掃き溜めなら掃き溜めらしく外部変数でクラス間通信
60デフォルトの名無しさん:2005/08/19(金) 18:12:58
>>6
せめてこうしようぜ。これなら俺は許す。
*p = *q;
p++;
q++;
61デフォルトの名無しさん:2005/08/19(金) 18:22:20
>>56
クラス宣言に class を使わず struct を使う(最低)。
62デフォルトの名無しさん:2005/08/19(金) 19:04:59
>>56
CとC++では変数のスコープが違っているから注意せよ。
C++はわざわざextern付けないと、グローバルにならない。staticはもはや
classやstruct中でしか使われなくなった。
63デフォルトの名無しさん:2005/08/19(金) 20:31:40
>>62
CでもC++でもグローバル変数の宣言にはexternが必要だが。
64デフォルトの名無しさん:2005/08/19(金) 21:18:04
cout や cin の out や in は分かるんですが、
その上にくっついている、 c って何の意味があるんですか?
command? それとも c++? の略かなんかですか?
65デフォルトの名無しさん:2005/08/19(金) 21:22:07
>>64
Console
66デフォルトの名無しさん:2005/08/20(土) 01:18:14
cprintf の c と同じ
67デフォルトの名無しさん:2005/08/20(土) 08:41:19
下級者って何?
68デフォルトの名無しさん:2005/08/20(土) 16:22:19
下級者:自分が分かってないことを分かってるヤツ
上級者:自分が分かってないことを分かってないヤツ
69デフォルトの名無しさん:2005/08/20(土) 16:33:51
俺:自分が分かってることを分かってるヤツ
70デフォルトの名無しさん:2005/08/20(土) 22:48:38
>>62
関数内
71デフォルトの名無しさん:2005/08/22(月) 14:38:09
ヘッダファイルの必要性を教えてください。なんで.cppに書き込んじゃダメなの?
72デフォルトの名無しさん:2005/08/22(月) 14:48:26
おれは iostream とかも全部 cpp にコピーして使ってるけど全然問題ないよ。
どんなでかいプログラムも一本のファイルになるからお勧めだよ。
73デフォルトの名無しさん:2005/08/22(月) 14:54:10
いかにも掃き溜めっぽい回答乙
74デフォルトの名無しさん:2005/08/22(月) 17:34:13
>>72
俺もそれやってるよ。ヘッダファイルを全部コピペで一本のソースに
貼り付けてる。プログラムを一つも書かなくても、ソースの大きさが100MBを
超えて、すごい快感だよなww
75デフォルトの名無しさん:2005/08/22(月) 18:48:11
俺なんか、毎回iostreamとかvectorとか全部コピーするの手動だとめんどくさいから、
全部1ファイルにマージするツール作ったよ。
GUIフロントエンドから、使用したいクラスを選択すると、関連ソースを全部1ファイルに
してくれるから、あとは自分のコードを追加するだけという優れもの。
76デフォルトの名無しさん:2005/08/22(月) 18:48:37
>>71
例えば、とあるクラス(or構造体)HogeをA.cppに書いたとする。
しかし、別のファイルB.cppでも同じクラスを使いたい場合ってのが出てくる。
そんなとき、ヘッダファイルにHogeクラスの宣言を書いておけば
それをインクルードすることで共通のクラスを使える。

簡単にまとめるとこんな感じ。
-- A.h ----------------------
class CHoge{
 CHoge();
 int Test();
 …
};
-- A.cpp ----------------------
#include "A.h"
CHoge:CHoge(){
 …
}
int CHoge:Test(){
 …
}
-- B.cpp ----------------------
#include "A.h"
void Func()
{
 CHoge hoge;
 hoge.test();
}
------------------------------

もちろん、クラスだけじゃなくてマクロや関数定義でもOK
77デフォルトの名無しさん:2005/08/22(月) 19:48:26
だから逆に全部ヘッダファイルに書いて、 cpp では include のみというのも
いけるよな。
main なんかどんな cpp ファイルでも必要だから、ヘッダファイルに書くのは常識だよ。
78デフォルトの名無しさん:2005/08/22(月) 20:21:07
>>71
まじめに答えると量が多くなってくると面倒くさくなる。
打ち間違いも心配。コピペでもなんとなく不安。
79デフォルトの名無しさん:2005/08/22(月) 20:31:45
>>71
じゃぁ私もまじめに答えよう。
コピーペーストだと、一箇所書き換えると
そこからコピーしたファイル全部を修正する必要がある。
.h にまとめておくと、再コンパイルだけで済むのでミスが少なくなる。
80デフォルトの名無しさん:2005/08/22(月) 23:33:23
--- main.cpp ----
#include "main.h"
81デフォルトの名無しさん:2005/08/23(火) 14:16:14
ということで、
ヘッダファイル → 大盛りネギダク
.cppファイル → 牛鮭定食
という対応はわかったかな? >>71
82デフォルトの名無しさん:2005/08/23(火) 14:53:20
#include "/dev/tty"
83デフォルトの名無しさん:2005/08/24(水) 01:21:30
>>82
処理系依存
84デフォルトの名無しさん:2005/08/24(水) 16:25:12
#include IFILE
// $(CC) -DIFILE=\"....\" ...
85デフォルトの名無しさん:2005/08/27(土) 13:45:39
a
86デフォルトの名無しさん:2005/08/27(土) 14:10:48
あげるなぼけ
87デフォルトの名無しさん:2005/08/27(土) 17:24:43
(>_<) ゴメン!!
88デフォルトの名無しさん:2005/08/27(土) 17:36:01
ええがな!ええがな!
89デフォルトの名無しさん:2005/08/27(土) 18:04:48
C/C++を勉強したいですけど
何が必要ですか?
90デフォルトの名無しさん:2005/08/27(土) 18:13:47
根気と世間体を捨てる勇気
91デフォルトの名無しさん:2005/08/27(土) 18:25:15
たしかに >>90 の言うとおりだが、
他にコンピュータとコンパイラは最低限必要だな。
あぁ、気兼ねなくネットサーフィンできる環境があると
ちょっとした調べごとがさくっとこなせてベター。
92デフォルトの名無しさん:2005/08/27(土) 19:22:45
なぜ世間体を捨てねばならんのだww
93デフォルトの名無しさん:2005/08/27(土) 19:24:56
不思議なことに過去の変態犯罪者にプログラマがいない件
94デフォルトの名無しさん:2005/08/27(土) 23:42:57
根も葉もないなw
95あぼーん:あぼーん
あぼーん
96デフォルトの名無しさん:2005/08/27(土) 23:58:16
>>93
勤め人だったら○○在住 会社員の山田太郎
フリーだったら○○在住 自営業の山田太郎
こうなるからじゃないのか?と思った。
97デフォルトの名無しさん:2005/08/28(日) 05:45:14
「自称プログラマー」ってのが最近あったような気がする
98デフォルトの名無しさん:2005/08/29(月) 12:21:13
カナシス
99デフォルトの名無しさん:2005/08/29(月) 13:53:20
>>97
・駅の点字ブロックに荷物を置いた老人を
 線路に突き落とした自称プログラマ。
・親子でキャッチボールしてる所に車で突っ込んだ後、
 父親を包丁でメッタ刺しした自称プログラマ。
・出張32◆Rb.XJ8VXow。
100デフォルトの名無しさん:2005/08/30(火) 10:38:42
親父メッタ刺しはプログラマだったかww
101デフォルトの名無しさん:2005/08/30(火) 12:54:23
朝鮮人じゃないの?
102デフォルトの名無しさん:2005/08/30(火) 13:19:17
朝鮮人とプログラマは両立しないのか?
103デフォルトの名無しさん:2005/09/12(月) 05:33:53
コマンドラインでコンパイルする際に、いくつもソースが分割されていると面倒なのだけど、何かいい方法はない?
やっぱりmakeファイルを作るしかないの?
104デフォルトの名無しさん:2005/09/12(月) 08:18:00
>>103 そうだよ。
105デフォルトの名無しさん:2005/09/12(月) 10:33:25
>>103
ソース1本で書けばいいジャマイカ
106デフォルトの名無しさん:2005/09/12(月) 11:41:35
newでメモリを2GBほど確保すると、Windows全体の動きがもっさりしてしまいます。
どうすればいいでしょうか?
107デフォルトの名無しさん:2005/09/12(月) 12:01:59
メモリを増設すればいい。
108デフォルトの名無しさん:2005/09/12(月) 12:24:20
確保するメモリを減らすとか。
109デフォルトの名無しさん:2005/09/12(月) 12:38:21
>>107
んー今のマザーボードでは1GBが限界でして。
>>108
少しずつ計算してはまめに書き出す方式に変更する事にしました。
ありがとうございました。
110デフォルトの名無しさん:2005/09/12(月) 13:16:13
2G確保出来る所に驚きだ
111デフォルトの名無しさん:2005/09/12(月) 13:45:58
>>103
bcc32 -eHoge *.h *.c
112デフォルトの名無しさん:2005/09/12(月) 14:44:19
VC++6.0 でOpenGLを使っているのですが、ビルドをすると

fatal error C1083: インクルード ファイルがオープンできません。'GL/glut.h': No such file or directory
cl.exe の実行エラー

このようなエラーがでます。どうしたらいいのでしょうか?
113デフォルトの名無しさん:2005/09/12(月) 14:46:21
ファイルがないんじゃないの?
114蕎麦:2005/09/12(月) 14:51:17
マイコン使って、入力電圧の値によって動作分岐させるプログラムの
ヒントを下さいっ!

こんな感じの動作が理想です。
・入力電圧が1Vなら動作A
・入力電圧が2Vなら動作B
     ・
     ・
     ・
115デフォルトの名無しさん:2005/09/12(月) 15:12:20
ヒント: 分岐命令
116112:2005/09/12(月) 15:22:07
>>113
ありがとうございます。解決できました
117デフォルトの名無しさん:2005/09/12(月) 15:34:13
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
118ぼるじょあ ◆yBEncckFOU :2005/09/12(月) 15:36:46
>>117
(・3・)エェー そんなこと位自分で調べろYO!
119あふぉかばかかと ◆Bdtx2TrI.U :2005/09/12(月) 17:44:56
>>117
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2005-33,GGLG:ja&q=C1010%3A+%EF%BE%8C%EF%BE%9F%EF%BE%98%EF%BD%BA%EF%BE%9D%EF%BE%8A%EF%BE%9F%EF%BD%B2%EF%BE%99%E6%B8%88%E3%81%BF%EF%BE%8D%EF%
BD%AF%EF%BE%80%EF%BE%9E%EF%BD%B0%E3%81%AE%E6%A4%9C%E7%B4%A2%E4%B8%AD%E3%81%AB%E4%BA%88%E6%9C%9F%E3%81%97%E3%81%AA%E3%81%84+EOF+%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82

長いから途中できった。自分でつなげな。。
120デフォルトの名無しさん:2005/09/12(月) 18:07:23
エラーが収まるまでプログラムの最後に ) とか } とか ] とか
適当に閉じ括弧を付け足していけばいつかはなんとかなるかも。
121デフォルトの名無しさん:2005/09/12(月) 19:39:54
>>114
1.5V や 1.98V だったらどうするのかと。
122デフォルトの名無しさん:2005/09/12(月) 20:06:06
newで確保してfreeで解放
またmallocで確保しdeleteで解放するとどうなりますか?
123デフォルトの名無しさん:2005/09/12(月) 20:14:41
バカにされる。
124デフォルトの名無しさん:2005/09/12(月) 21:22:43
malocした後
newしたと同じようにVirtualMethodTable整備など等をこなし、難なくdelete出来るまで揃えられたら、それはそれですごいと言われる。
かと言って尊敬のまなざしは決して向けられない
125デフォルトの名無しさん:2005/09/12(月) 21:36:02
>>124
new(malloc(n)) T
まあdeleteできるかどうかはわからないが。
126デフォルトの名無しさん:2005/09/12(月) 23:09:20
CentOS4入れてるんですが、コンパイルは通るのに
簡単なソケットプログラム実行しようとすると

bind: Socket operation on non-socket とか
connect: Socket operation on non-socket

エラーがでます。これって何が原因ですか?
127デフォルトの名無しさん:2005/09/12(月) 23:12:38
Packet socketがオフでコンパイルされてるカーネルだったらプギャー
128126:2005/09/12(月) 23:17:32
即レスさんくすです。
プギャー ですか。了解。
129デフォルトの名無しさん:2005/09/12(月) 23:23:54
socketが-1返してるとか(w
130デフォルトの名無しさん:2005/09/13(火) 02:56:59
会社の研修に落ちこぼれつつあるC初心者です。
ポインタがわからず、本を何冊も読みあさっていたら
今度は普通の変数がわからなくなりました。
変数とは一体何なんでしょうか。
メモリのどこかにあるデータを変数名で参照できるということは、
普通の変数も実体はメモリアドレスを表すポインタなのではないかと
いう気がします。

例えば int x = 100; とした場合
メモリのどこかに100というデータが入るわけですが
xという変数は、そのメモリのアドレスを持っていて
プログラムで変数名を書くと暗黙的に*が付いて
アドレスの示す先のメモリデータを参照している
のでしょうか。だとしたらポインタの存在意義は?
頭がおかしくなりそうです。
131デフォルトの名無しさん:2005/09/13(火) 03:24:21
ポインタはメモリアドレスと型情報を格納する変数だと思えば?
132デフォルトの名無しさん:2005/09/13(火) 04:15:23
>>130
> 変数とは一体何なんでしょうか。
値を格納するためのもの、なんだけど、130にあわせて言うと
「プログラマがアドレスを指定する手間を省くためのもの」と言った方がいいのかな。

アセンブリレベルで見れば、変数への読み書きは特定のアドレスに対する読み書きそのものなんだけど
重要なのは、そのアドレスが「どこか」をプログラマが知らなくていいこと。
仮に変数がなかったら、プログラマが「メモリのどこに書き込むか」を指定しなきゃいけなくなる。

C言語のような高級言語がない時代には、実際にそういう作業をしていた。
けど格納するべき値が1000個や2000個になってくると、アドレスを管理するのも大変になる。
それが面倒だってんで、アドレスの管理をコンパイラに押しつけて
プログラマは名前(変数名)だけ管理すればよくなった。これが変数の意義。
130に書いてある通り、メモリ操作さえできれば、変数なんてなくても計算結果を格納することはできるけど、
それじゃ面倒だから変数というものを導入した、と考えてみては。

> ポインタの存在意義は?
ポインタの存在意義は、メモリの直接操作ができること。
変数の導入で、プログラマはアドレスの管理からは解放されたけど、
同時にメモリを直接操作することができなくなってしまった。
(普通の変数のアドレスはコンパイラが勝手に管理してしまうから、プログラマが手を出せない)
OSや組み込み系のプログラムに使う場合は特にだけど、
普通のアプリケーションでも効率を上げるためにメモリを直接弄ることはままある。
これは困った、というわけで、ポインタというものを導入して、メモリを操作する抜け道を造った。

という流れで理解してみたらどうでしょう。
かなり説明のためにハショったりねじ曲げてる箇所があるから
真面目に説明する人からはお叱りを貰いそうだけど・・・

長文・乱文スマソ
133デフォルトの名無しさん:2005/09/13(火) 04:28:58
>>130
ふつう。
int x;
としたら、xにアドレスは入れない。

int *p; としたら、pを整数格納用途には使わない。
134デフォルトの名無しさん:2005/09/13(火) 04:30:21
今年の初めからコンピュータ言語を勉強し始めた者ですが・・・・。

WINAPIをかじったおかげで、画面になにかを表示するには機械語でOSに指示を
だせばよい、ということは理解できました。

ただ、じゃあOSはどうやってブラウン管の電子銃に指示をだしてるのか(液晶なら
電荷関係の支持をどうやってだしているのか)、その結びつきがわかりません。

明日大きな本屋にいっていろいろ調べてみるつもりですが・・
一応、ここにも書き込みをさせていただきました。

たとえばですが・・OSの介在なしに、ブラウン管の電子銃に指示をだす・・
なんてことは可能なのでしょうか??
135ぼるじょあ ◆yBEncckFOU :2005/09/13(火) 06:26:12
>>134
VGAに直接指示を出す。しかしディスプレイドライバが組み込まれているので、
直接I/O命令を出すと、OSにトラップされてエラーが出るぞ。OS無しなら可能。
OSでもMSDOSでしかも仮想86モードを使ってないような状態なら可能。
136デフォルトの名無しさん:2005/09/13(火) 06:27:09
うわっぼるじょあのままだった。
137デフォルトの名無しさん:2005/09/13(火) 07:05:43
DOS 上だと、わりとVGAいじりやすいんだけどね。
昔はビデオモード設定して16色BMP表示とか、みんなやってたよ。
138デフォルトの名無しさん:2005/09/13(火) 16:30:55
電子銃そのものにソフトから命令できんのか?
せいぜい走査線割り込みジャマイカ。
139デフォルトの名無しさん:2005/09/13(火) 17:03:41
私書箱100番っていうのがあるわな?
メモリ上にはいっぱい私書箱があるわけで、私書箱100番、がポインタ。
私書箱100番、のなかに入ってる12345とかいう数値の書かれた手紙が変数の値。
どよ?
140デフォルトの名無しさん:2005/09/13(火) 17:12:34
>>139
>>130はポインタの動作を理解してないわけじゃなくて
コンパイラによる変数の実装と、言語仕様としてのポインタを混同してるだけだと思われ
141デフォルトの名無しさん:2005/09/13(火) 17:13:43
>>138
ソフトで出来るのはどう頑張っても VRAM への書き込みまでですな。
そこから先はハードウェアの仕事。
142139:2005/09/13(火) 17:26:01
よく読んでなかったスマソ
143デフォルトの名無しさん:2005/09/13(火) 17:28:24
変数の中には値が入っていて、ポインタの中にはアドレスが入っている
単純にコレじゃ納得いかんのか

ただしC言語で配列はポインタって言ったら怒られそうだな…
int tmp[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("%d", 2[tmp]);
printf("%d", tmp[2]);
これで上と下は同じ結果になるからやってミホ
144デフォルトの名無しさん:2005/09/13(火) 19:43:46
配列とポインタは別物だ、ボケ。
ただ文脈によって「特例で」おなじに見せているだけだ。
145デフォルトの名無しさん:2005/09/13(火) 20:19:02
シュガシュガルーンってやつですね
146デフォルトの名無しさん:2005/09/13(火) 22:15:48
式の中ではむしろポインタと配列の違いが見せ付けられるときが特例。
147デフォルトの名無しさん:2005/09/15(木) 14:13:33
辞書をひいたら、

「まんこ」→「おめこ」
「おめこ」→「まんこ」

と永久ループになっていて埒があきません。どうすればいいでしょうか?
148デフォルトの名無しさん:2005/09/15(木) 14:43:04
>>147

答えは>>147に載っています
149デフォルトの名無しさん:2005/09/15(木) 15:09:14
関西ってまんこと言っても何の事か通じないヤツもいるらしいな
150デフォルトの名無しさん:2005/09/15(木) 15:17:10
main関数はなぜint main()なの?
void main()じゃだめなの?
151デフォルトの名無しさん:2005/09/15(木) 17:17:33
152デフォルトの名無しさん:2005/09/15(木) 17:18:17
void mainが仕様で認められなくなったの何時からだったっけ
C99?
153デフォルトの名無しさん:2005/09/15(木) 17:59:42
>>152
別に認められてないわけじゃなくて、C89の時から
「その他処理系依存のプロトタイプ」に分類されてて、規格違反というわけではない。
非推奨だから警告が出るけど。
154デフォルトの名無しさん:2005/09/22(木) 13:56:48

155デフォルトの名無しさん:2005/09/23(金) 04:44:34
いまだに>12の意味がわからない
156デフォルトの名無しさん:2005/09/23(金) 05:05:28
有識者の人へ。
Windows上のC言語でお勧めの環境はどれですか?
いろんな前提要件抜きでバシッとマジレス希望。
或いは、各々の特徴を述べ立てて比較検討希望。
よろしくお願いします。マジでお願いします。
157デフォルトの名無しさん:2005/09/23(金) 05:53:14
#define Str(x) #x
#define Xstr(x) Str(x)
#define OP plus
char *opname = Xstr(OP);

main() {
printf("%s\n", opname);
}

これで
plus
が出力される理屈を教えてください。

OP -> plusはいつ変換されるんですか?
158デフォルトの名無しさん:2005/09/23(金) 06:36:43
>>157

char *opname = Xstr(OP);
↓ #define OP plus
char *opname = Xstr(plus);
↓ #define Xstr(x) Str(x)
char *opname = Str(plus);
↓ #define Str(x) #x
char *opname = "plus";

OPは一番最初に展開される
(ISO/IEC 14882 16.3.1 : 実引数を代入する前に、実引数中の全てのマクロを展開する)
ので、Xstr(OP); ではまずOPが展開される。
ただし、#や##に対応する仮引数は先に展開されない(同 16.3.1)から、

#define Str(x) #x
#define OP plus
char *opname = Str(OP);

としてしまうと、(Str(x)のxが先に展開されないでそのまま代入されるので)
"OP"が出力されてしまうはず。
それを避けるためにXstrマクロをワンクッション置いて使ってるのかと。
ていうか使い道のないコードだな。
159デフォルトの名無しさん:2005/09/23(金) 07:00:22
(ISO/IEC 14882 16.3.1 : 実引数を代入する前に、実引数中の全てのマクロを展開する)
ので、Xstr(OP); ではまずOPが展開される。
ただし、#や##に対応する仮引数は先に展開されない(同 16.3.1)から、

うあw、酷い仕様ですね
160デフォルトの名無しさん:2005/09/23(金) 07:05:07
>>158
ありがとうございmさいた。
161デフォルトの名無しさん:2005/09/23(金) 07:58:10
>>159
実際、この展開規則をまともに実装するとなると骨だよ。
仮引数を見つつ、#に関係する引数については評価から外さなきゃいけない。
つまり2パス。
162デフォルトの名無しさん:2005/09/23(金) 08:10:24
何のためにそういう仕様になってるのだろう?
教えて偉い人
163デフォルトの名無しさん:2005/09/23(金) 08:26:44
>>162
それがどんなものであれ、無いよりは有った方が良い。
それを不要だと主張する者は、それを使わなければ良い。
という考え方が根底にあるからw
164デフォルトの名無しさん:2005/09/23(金) 08:31:03
不要とかではなくて、なぜ1パスで処理してしまわないのか疑問だなぁと。
先に評価しておく必要性があるんでしょうか。
165デフォルトの名無しさん:2005/09/23(金) 11:11:59
>>156
ANSI C
166デフォルトの名無しさん:2005/09/23(金) 11:56:15
>>164
#のない頃のプリプロセッサとの互換性をなんとか維持しようとした苦肉の策だった気がするが、具体的なことは忘れた。
167デフォルトの名無しさん:2005/09/23(金) 16:25:12
>>166
ナンギな都合があるんですね(´・ω・`)
ありがとうございます。
168デフォルトの名無しさん:2005/09/24(土) 20:38:01
>>156
はじめてみて、やっぱりあきらめようかなと思った時は、
無料の方がふん切りがつきやすいんじゃないかな?
お試し版の C とかあったよね。
あと、DEVC++とかの日本語化がされてないやつとかはあきらめやすいんじゃ
ないかな?
169デフォルトの名無しさん:2005/10/04(火) 18:06:46
   〇_〇             ヘ⌒ヽフ
   ( ・(ェ)・)  <クマー       ( ;・ω・) アワワ
  /J ▽J             ⊂   O
  し―-J              (   /
                 ≡ ⊂\_)
170デフォルトの名無しさん:2005/10/04(火) 19:26:26
>>168
無料だと、又やってみようかな?って思うぞ
金払ってるともう2度とこんな無駄金払ってられないってなるよ
171デフォルトの名無しさん:2005/10/04(火) 20:35:04
>>170
ということは、自分の時給換算ができる人は有償の C 言語を検討した方が、
身のほどを知った時無駄な時間を失わずに済むってことですね。
172デフォルトの名無しさん:2005/10/04(火) 21:41:59
ただいま独学でC++勉強してますが、
&や、*のせいで挫折しそうです。
なんか、こうイメージ的にわかりやすく説明してください。宣言の時と使用時
173デフォルトの名無しさん:2005/10/04(火) 21:51:17
>>172
int *p;って宣言は「式の中で*pと書くとint型の値が得られる」と読む、っていうのはよく言われる。
174デフォルトの名無しさん:2005/10/04(火) 22:43:46
C++ って * はあんまりいらないんじゃないの?
イテレータからコンテナの中身を取り出す時だけ?
& は関数宣言で引数におまじないで付ける位に考えておけばいいんじゃないの?
175デフォルトの名無しさん:2005/10/04(火) 22:49:19
頼むから参照使う時はconstと非constを使い分けてくれ。
あれで何人が壊れたことか。
176デフォルトの名無しさん:2005/10/04(火) 22:53:08
>>174
こらこら、余計混乱するようなことを書くな。
177デフォルトの名無しさん:2005/10/05(水) 00:25:54
C++で自プログラムを強制終了させるにはどうやるんですか?
DelphiでいうHaltみたいなやつです。
ググってみたところexit関数という物があるようなんですが、
C++では使うなといったような事が書いてあって、よくわからない状態です…。
178デフォルトの名無しさん:2005/10/05(水) 01:33:38
main 関数の最後にラベルを定義しておいて goto で飛ばすとか。
179デフォルトの名無しさん:2005/10/05(水) 07:39:33
ローカル変数のデストラクタを自分で走らせてやればいいんじゃないの?
180デフォルトの名無しさん:2005/10/05(水) 08:33:47
>>177
C++でもexitは使える。
ローカル変数のデストラクタが呼ばれるように気をつけて使えば全然問題ない。
181デフォルトの名無しさん:2005/10/05(水) 08:53:37
責任放棄でassert。
182デフォルトの名無しさん:2005/10/05(水) 10:31:07
なにか例外を投げつけてそれをmainでキャッチする。
183デフォルトの名無しさん:2005/10/06(木) 21:06:48
MacOSX使ってるんだけどmath.hのfmodlって使えないのか?
184デフォルトの名無しさん:2005/10/06(木) 21:24:43
int f( int x, ... )みたいな可変数の引数とる関数作りたいんだけど、
まぁ普通にva_start〜va_arg〜va_end使えばいい話だろうけど、
これって最後に末尾を示すコード(たとえば-1とか)入れる必要出てくるじゃん。

sprintfとか見るとそういうの一切ないけど、ああいう実装はどうやってやるんだろ?
185デフォルトの名無しさん:2005/10/06(木) 21:33:20
>>184
通常の実装であれば、formatに完全に依存してる。
formatを1文字ずつパースしていって、可変引数からの値が必要になるような
%dや%fといった文字列が出てきた時に逐一va_argで取り出すから、末端を識別する必要がない。
その代わり、可変引数の数より多く指定してしまったりすると暴走する。
186デフォルトの名無しさん:2005/10/06(木) 21:48:16
あぁ、そう言うトリックだったか。サンクスコ
187デフォルトの名無しさん:2005/10/07(金) 16:26:23
CreateThreadでスレッドを生成すると、スレッドが終了してもメモリの使用量が減りません・・・
うまくスレッドが終了できてないのでしょうか?
188デフォルトの名無しさん:2005/10/07(金) 16:50:24
スレッドが終了されてるかはメモリ使用量を見るより、
タスクマネージャのメニューの「表示」→「列の表示」→「スレッドの数」をチェック
して調べた方がいい、あと仮想メモリの方が事実上の使用されているメモリ使用量なんだっけ?
189デフォルトの名無しさん:2005/10/07(金) 17:49:33
>>187
スレッド終了して減る量なんて TLS の分くらいだべ?
190189:2005/10/07(金) 17:50:12
あ、違。CreateThread か。
そりゃ減らんでしょ。
191デフォルトの名無しさん:2005/10/07(金) 19:07:06
>>188
タスクマネージャにこんな機能があったのかー。初めて知りました。
調べてみたら、スレッドは正しく終了してるみたいです。

>>190
beginthreadの方が良いのですか?
192デフォルトの名無しさん:2005/10/08(土) 00:41:46
>>191
Cランタイムをリンクしてるならbeginthreadex使わないとリークするぜ。
使わないだけじゃだめ。
CランタイムをリンクしないならCreateThreadでおけ。
193デフォルトの名無しさん:2005/11/07(月) 16:16:38
SSEが使えるかどうかを判別するにはどうしたらよいのでしょうか?環境はgcc4.0.2、Fedora core4です。
194デフォルトの名無しさん:2005/11/07(月) 16:29:10
>>193
cat /proc/cpuinfo
直接cpuidで調べるのは面倒だな
OSサポートのチェックもあるしな
195デフォルトの名無しさん:2005/11/07(月) 17:11:13
istream::readでバイナリファイルを読み込むと最大文字数も指定しているのに途中までしか読み込まれないのですが
バイナリファイルは読み込むとまずいのでしょうか?
バイナリpgmファイルを読み込みたいので1バイトづつで調度いいと思ったのですが他の関数にしたほうがいいのでしょうか?

winXP VC++6.0です
196デフォルトの名無しさん:2005/11/07(月) 17:14:29
>>195
バイナリモードで開いたか?
197デフォルトの名無しさん:2005/11/08(火) 15:44:00
classをnewで確保しているのですが、newって0で初期化してくれるんですか?
してくれるクラスとしてくれないクラスがあり、どっちか分からないです。

してくれないクラスは、全て0xcdcdcdcdで埋まっています。
VCの初期化していない状態だったはずですが、ならば0で初期化されているクラスはどうしてされているのか謎です。

コンストラクタでZeroMemory(this, sizeof(クラス))したら一応通りましたが、どうも危険な気がしています。
classをnewで確保する場合、どう0に初期化するのが適切なのでしょうか?
ご教授よろしくお願いします
198デフォルトの名無しさん:2005/11/08(火) 15:53:15
面倒臭がらず変数1コ1コ愛情込めて初期化してやれ
199デフォルトの名無しさん:2005/11/08(火) 16:03:36
仮想関数テーブルポインタまで真っ白けな悪寒
200デフォルトの名無しさん:2005/11/08(火) 18:58:14
私は怖いので初期化必要なのはコンストラクタで一個一個初期化する。
そうすればどこでnewしても安心だし。
ZeroMemoryとかmemsetとかはヤバいって話を聞くな・・
201デフォルトの名無しさん:2005/11/08(火) 19:19:55
>>200
>>199
使わないのが当然。
202デフォルトの名無しさん:2005/11/09(水) 07:31:08
というか「使ってはいけない」。
203デフォルトの名無しさん:2005/11/09(水) 13:52:09
一律ダメと言われても。struct でもダメなのか?
204デフォルトの名無しさん:2005/11/09(水) 13:56:20
重要なのはstructであるかどうかではなくPODであるか否か
205197:2005/11/09(水) 14:20:29
意見ありがとうございます。

ZeroMemoryは止めました。
初期化しないと明らかにバグるものやポインタだけ初期化することにしました。
さすがに全部のメンバはやってられないです。
初期化していないとどうも気持ち悪いんですが、C++はそういうもんだと思っておきます。
206デフォルトの名無しさん:2005/11/09(水) 14:47:08
>>205
初期化してないとどうも気持ち悪いのは当然。
その感覚を欺いてはいけない。
方法(ZeroMemoryやmemsetで初期化すること)が間違っているだけ。
正しい方法はコンストラクタで

Class::Class()
  : m_IntegralMember(0)
  , m_FloatingPointMember(0.0)
  , m_pObject(NULL)
{
}

このように初期化リストで逐一指定すること。
これがC++の作法であり流儀。
207デフォルトの名無しさん:2005/11/09(水) 15:02:47
カッコで初期化するのか
俺イコールで代入してた
208デフォルトの名無しさん:2005/11/09(水) 17:25:22
初期化テンプレートをつくって、変数タイプネームを囲んでしまえばいい。
209デフォルトの名無しさん:2005/11/09(水) 18:03:22
>207
コンストラクタ内部でイコールで代入すると
はデフォルトコンストラクタが走ってから
さらに代入演算子が走るから効率が良くない悪寒
POD型なら最適化で変わらないかもしれないけど
210デフォルトの名無しさん:2005/11/10(木) 04:43:51
>>205
仮令Cであっても0で埋めるのはナンセンス。
折角コンパイラがゴミ値を埋めてくれるのを邪魔してデバッグを却って困難にしかねない。
過去に私の周囲でバッファオーバランのバグを生み出した香具師に限って0埋めの習慣があったくらいだ。
211デフォルトの名無しさん:2005/11/10(木) 16:53:20
>>206
その方法で初期化で例外発生したやつを捕捉したい場合どうするんですか?
212デフォルトの名無しさん:2005/11/10(木) 16:55:24
どうにもC++のコンストラクタって穴だらけな気がするんですがage
213デフォルトの名無しさん:2005/11/10(木) 16:56:03
>さすがに全部のメンバはやってられないです。
単にクラスが巨大過ぎじゃ無いのか?
214デフォルトの名無しさん:2005/11/10(木) 16:59:31
C++ってクソだね^^
215デフォルトの名無しさん:2005/11/10(木) 17:23:26
>>211
A::A()
try
  : mem(0)
{
}
catch(...)
{
  throw something;
}
キャッチした例外を握りつぶそうとすると自動的に再投されるので注意。
216デフォルトの名無しさん:2005/11/10(木) 17:30:04
テラキモスww
217デフォルトの名無しさん:2005/11/10(木) 17:39:56
>>215
これやるぐらいならメンバにRAIIを徹底するか、例外安全なコンストラクタを持った
基底クラスの初期化に分割した方が良い気はするけれど。
218デフォルトの名無しさん:2005/11/10(木) 17:40:22
初期化リストは、そうじゃないと初期化できないメンバにしか
使わないなあ。
219デフォルトの名無しさん:2005/11/10(木) 17:45:08
>>205
クラスメンバのうち、0初期化したいメンバだけprivateな構造体にまとめれば、
コンストラクタの初期化ではその構造体をまとめて初期化できるようになる。

こんな感じ。
class hoge
{
public:
  hoge() : data(), w(1)
  {
  }
private:
  struct Data
  {
    int x, y, z;
  };

  Data data;
  int w;
};

ほかにもboost::value_initializedなんて手もあるな。
220デフォルトの名無しさん:2005/11/10(木) 19:59:13
>>211
初期化で例外投げなきゃならない設計が糞。
さすがは掃き溜め。
221デフォルトの名無しさん:2005/11/10(木) 20:31:27
>>220
たとえば初期化でnewするときにはどうする?
std::nothrowを指定するとしても、そいつがヌルを返してきたらどうする?
222デフォルトの名無しさん:2005/11/10(木) 20:57:26
223デフォルトの名無しさん:2005/11/11(金) 01:20:31
newが失敗するような末期的状態で
例外なんかがまともに動作するのかねえ
224デフォルトの名無しさん:2005/11/12(土) 11:19:15
>>220
RAII って知ってる?

>>223
例外処理自体は追加でメモリを必要としないから大丈夫。
例外オブジェクトを保持するメモリが必要となるかもしれないが、
std::bad_alloc のインスタンスを静的に持つような実装も考えられる。
225デフォルトの名無しさん:2005/11/12(土) 11:39:12
>>224
知ってる。それが何か?
226デフォルトの名無しさん:2005/11/12(土) 12:06:55
>>225
ということはつまり、リソースの要求処理が失敗したときに例外を投げるのも設計が糞だと?
227デフォルトの名無しさん:2005/11/12(土) 12:39:02
>>226
コンストラクタの例外リークは面倒だぞ?
228デフォルトの名無しさん:2005/11/12(土) 12:41:09
>>227
はて?思い当たらないが、どんなところが面倒になるの?
229デフォルトの名無しさん:2005/11/12(土) 13:12:58
例外を、単なる別のエラー処理技法のように扱ってはいけません。
エラー コードを返したり、グローバル変数の設定したりすることと
同レベルだと思ってはいけません。例外は、それを取り巻くコードの
構造と意味を、根底から覆します。例外は、プログラムの実行時
セマンティックを一時的に繋ぎ変え、通常実行しているコードを迂回し、
こういう状況でなければ決して実行されないコードを動作させます。
例外は、エラー状態を認知させ、プログラムの死という罰則を用いて
その状態を改めようとします。

このように、例外には単純なエラー処理を超えた特性があります。
これらの特性を必要としない、理解しない、あるいは文書化したく
ないなら、例外をスローしてはいけません。
例外以外のエラー処理技法を探してください。
230デフォルトの名無しさん:2005/11/12(土) 13:25:58
>>229 そんな古い文書コピペして、なんのつもりだ?
231デフォルトの名無しさん:2005/11/12(土) 13:54:37
>>228
本当に思い当たらないの?
232デフォルトの名無しさん:2005/11/13(日) 06:13:04
>>227
「コンストラクタの例外リーク」って何?
単純にコンストラクタから例外が飛んでくるだけなら、>>228
233デフォルトの名無しさん:2005/11/15(火) 18:29:06
「コンストラクタの初期化リスト」の話が、いつの間にか
「コンストラクタ内での初期化」の話になっているのは
ここがはきだめだからでしょうか?
234デフォルトの名無しさん:2005/11/17(木) 00:26:09
>>233 どこがそんな話になっている?
235デフォルトの名無しさん:2005/11/21(月) 00:28:05
なあ適当に作らせたsin波がやけに歪んでるんだけどなんでだろう
専用ソフトで作ると滑らかなのに

一応こんな感じで16bitで作ってるつもりなんだが
for(dwCount)
dwWave = (short)(100*sin(2*PI*100*dwCount/SamplingRate));

// PI = 2*atan(1)
236デフォルトの名無しさん:2005/11/21(月) 00:51:32
いつからPIは2 * atan(1)になったんだ?
237デフォルトの名無しさん:2005/11/21(月) 00:55:18
あすみません
こっちへの書き込みだけヴォケましたプログラム上は4*atan(1)でした
238デフォルトの名無しさん:2005/11/21(月) 01:03:56
sin()の結果に100を掛けたくらいだと、高々±100しか振れないから
16ビット帯域から見ると振幅が非常に狭いし分解能も悪くなるわけだが。
#音として歪むかどうかまでは知らん。
239デフォルトの名無しさん:2005/11/21(月) 01:30:07
その辺も大丈夫っぽいんです
つか*2しただけでピークピーク値が500くらいって何だよこれ(;'A`)
240デフォルトの名無しさん:2005/11/21(月) 07:31:27
いつからsin()は1〜-1以外の値を返すようになったんだ?
241デフォルトの名無しさん:2005/11/21(月) 12:26:06
うはwwww結局sinにdoubleで値渡したらうまくいきましたwwwww
おまいらサンクスコ
242デフォルトの名無しさん:2005/11/21(月) 12:56:46
>>241
おいこら、PI = 4 * atan(1)って書いてあるから当然にdoubleになっていると思ったじゃねぇか。
243デフォルトの名無しさん:2005/11/21(月) 12:56:56
ちゃんと<math.h>をincludeしろよ
244243:2005/11/21(月) 12:57:31
ごめん。勘違い。
245デフォルトの名無しさん:2005/11/21(月) 13:08:56
>>244
案外あたっているかも知らん。
246デフォルトの名無しさん:2005/12/07(水) 22:04:39
C++で関数ポインタってどうやるんですか?
今調べた限りだと、メンバ関数ポインタ?のようなのを使うのかな?
もしくは使うべきじゃないのかな?
こうやるのがスマートみたいなのがあれば、教えて下さいー。
247246:2005/12/07(水) 22:05:48
使うべきじゃないというのは、関数ポインタよりもっと良い方法があるから、C++だったらそっちを使うのべきって意味です。
248デフォルトの名無しさん:2005/12/07(水) 22:06:24
>>246
メンバ関数ならメンバ関数ポインタを使う
そうでないなら関数ポインタを使う
249デフォルトの名無しさん:2005/12/22(木) 12:28:39
c/c++を使ったプログラムの計算結果を
CADなどに図で出力することはできますか?
250デフォルトの名無しさん:2005/12/22(木) 12:43:56
>>249
出来ますよ。そう作れば。
251249:2005/12/22(木) 12:54:21
即レスありがとうございます。
図々しいですがもしご存知でしたら
詳しいサイトなど教えて頂けませんでしょうか?
252デフォルトの名無しさん:2005/12/22(木) 12:57:19
>>249
CADじゃないけど、出力をExcelでグラフにするのはよくやってますよ。
ファイルにCSV形式で出力して、後はExcel側で読んでグラフにするだけ。
253249:2005/12/22(木) 13:05:49
ありがとうございます!
今回は構造物の変形を条件を変えてCADで見たかったんですが
それも便利ですね、勉強してみます。
254デフォルトの名無しさん:2005/12/22(木) 15:46:57
1)
char (*a)[5]={"ああああ","いいいい","うううう"};
2)
char (*a)[9]={"ああああ","いいいい","うううう"};
3)
char *a[]={"ああああ","いいいい","うううう"};
4)
char a[5][9]={"ああああ","いいいい","うううう"};
5)
char *a[3]={"ああああ","いいいい","うううう"};
6)
char *a[9]={"ああああ","いいいい","うううう"};

上の中から同じものを選べ
255デフォルトの名無しさん:2005/12/22(木) 17:57:22
3,5だな。
しかし、文字列リテラルはconst char *で参照するべきだ。
256教えてください:2005/12/23(金) 07:46:28
Q1 海は死にますか?
Q2 山は死にますか?
Q3 風はどうですか?
Q4 空もそうですか?
257デフォルトの名無しさん:2005/12/23(金) 08:18:44
お前は死ぬ
それだけは間違いない
258教えてください:2005/12/23(金) 08:53:49
ポインタに格納されているアドレス値が有効な値かどうかを厳密に調べる方法はありますか?
259デフォルトの名無しさん:2005/12/23(金) 09:00:46
>>258
厳密に言語仕様だけで考えると、ポインタにアドレス値が格納されているとは限らない。
アドレスが格納されているとしても、「有効な値」とは何かを定義しないとわからない。
260訓えてください:2005/12/23(金) 09:11:52
>>259
当然、初期化されていない場合などは値は不定だったりするわけですが、
少なくとも(明示的に割り当てが行われて結果かどうかは不問として)
参照可能な領域(ユーザー空間)を指しているかどうかを調べたいのです。
261デフォルトの名無しさん:2005/12/23(金) 09:13:58
>>260
じゃぁ OS に訊け。
262訓えてください:2005/12/23(金) 09:36:59
C/C++のライブラリ関数では、チェックを行うための関数が無いようなので
システム情報を調べてチェックを行うようにしました。
ありがとうございました。
263デフォルトの名無しさん:2005/12/23(金) 17:21:17
#include <iostream.h>
struct A {
int a;
};
struct B {
int b;
};

int main( void ) {
struct A *pa = new struct A;
struct B *pb;
pa->a = 10;
pb = (struct B*)pa; // pb には pa のアドレスが代入される
cout << &pa->a << endl;
cout << &pb->b << endl;
cout << pb->b; // それで問題のここ
}

pa のアドレスに b のメンバは無いのに、どうして 10 が代入されている…
のもなんですが、そもそもどうしてアクセスが出来るのかわからなくなりました
264デフォルトの名無しさん:2005/12/23(金) 17:24:29
>>263
メモリ配置が同じだから。
265デフォルトの名無しさん:2005/12/23(金) 17:37:17
struct B {
int b;
int c;
};
のようにメモリ配置を変えてみたのにこれはなぜ良いのですか?
266デフォルトの名無しさん:2005/12/23(金) 17:42:32
>>263
判ったからマルチすなや。
http://pc8.2ch.net/test/read.cgi/tech/1131691023/868
267265:2005/12/23(金) 17:46:47
いちおう問題は変えたつもりなのですが…マルチは言われるの覚悟でしました すみません
まだよくわかんないです 決してネタじゃないです
268デフォルトの名無しさん:2005/12/23(金) 17:57:09
>>267
C++のキャスト演算子使う習慣付けた方がいい。
そういうキャストはまずいってすぐにわかるから。
269デフォルトの名無しさん:2005/12/23(金) 18:05:57
>>268
レスありがとう!!
reinterpret_cast<struct B*>(pa) これでいいのでしょうか?

まずいのは承知なんですが、どうして代入できるのでしすか? メモリ配置が同じって言っても
struct A の a.a と struct B の b.b 配置されているアドレスは別物じゃないんですか?
270デフォルトの名無しさん:2005/12/23(金) 18:20:31
>>269
reinterpret_castを使わないとコンパイルできないだろ。
これを使うという事は、何が起きても自己責任で、という意味だ。

上のプログラムがたまたま動くのを理解するには、ポインタの知識が
あればよい。従って、ポインタを勉強しなおしましょう。
271デフォルトの名無しさん:2005/12/23(金) 19:31:42
>>270
>>269は今まさにその「ポインタの勉強」をしてるんだと思うが。
272266:2005/12/23(金) 21:40:37
>>269
要は、無理矢理キャスト(reinterpret_cast)したと言うことは違うものを同じモノと見做すことになる。
詰まり、そういう結果になることが予測つかないのならやるな、ということだ。
273266:2005/12/23(金) 21:49:07
やっぱりマルチに回答するんじゃなかった……
指摘されても更にマルチを繰り返し、レスに対して碌に礼もせず誘導もせず。
ここまで微妙にコピペじゃなくマルチするなんて、荒らしと一緒じゃないか。

はきだめC/C++下級者の質問箱
http://pc8.2ch.net/test/read.cgi/tech/1124256027/263

【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/868

C言語なら俺に聞け! Part 119
http://pc8.2ch.net/test/read.cgi/tech/1135077848/133
274263:2005/12/23(金) 22:33:57
>>273
なんか皆様の大変な怒りを買ったみたいで申し訳ありません。
「スミマセン」「申し訳ありません」としか書きようがなくこれでスレ消費するのも
結構考え物だと思ったりする訳です。

マルチしてしまった事も自分なりに考えがあっての事です。
初めは 【初心者歓迎】C/C++室 Ver.24【環境依存OK】 で書き込みしたのですが、
レベルが低すぎたと思い はきだめC/C++下級者の質問箱 に移行。
それから、やっぱり低レベルな(アセンブリ的?)話だろうと思ったから
C言語なら俺に聞け! Part 119 に移動しただけです。

質問を微妙に変えたのにだって、単なるコピペじゃそれこそ馬鹿にしてるみたいで失礼じゃないですか。
「ありがとう」とレスしたい所だったのですが、それだって同じ言葉の繰り返しで結構考えたりするんですよ(;д;)
気に障った方々すみません。
初心者だから鬱陶しいのは重々理解しております。けれど、自分みたいな馬鹿は誰かの助けを借りないと先にも進めなかったり
するんですよ。
教えてくれる人も周りに居ず、ぶっちゃけここぐらいしか頼るとこがなくて一杯一杯なんです。
だから煽って頂くのは別に構わないのです。ただ、恩義に思っていない訳ではないというのをご理解ください。

長々とすみません。今回のマルチポストに関する無礼はこれにてお許しいただきますようお願いします。
275デフォルトの名無しさん:2005/12/23(金) 22:46:57
>>274
その3つのスレを、今は初心者スレ、後でC言語スレ、っていう風に巡回している人間の立場を考えてみてください。
現に>266さんは>272を書き込んだ後8.5分後に>273を書き込んだわけで、その間に恐らくC言語スレの派生質問を見たのでしょう。
>266さんじゃなくても例えば初心者スレで最初に書き込みを見つけて、レスをつけたところ全く同じ回答がCスレであったとしたらどう思うと思います?
コピペじゃないことで、「マルチじゃない」と言い逃れをするように見えて、却って失礼と言うものです。

そもそも最初の質問が適切であれば、そこから派生した質問は同じスレで多少スレ違ってきても続けるのは普通です。
それを断りもなく他に行けば、「あんた等の回答には不満だから他に行くよ」と言うようなもんですよ。
どうしてもと言うならそれを両方で一言書いておけばいいだけのことですし。
結局のところ、他人のことを考えているようで自分のことしか考えてないあなたに問題があるのでしょう。

#なんてC言語スレで書いたら荒れそうだけどw
276デフォルトの名無しさん:2005/12/23(金) 22:57:34
はきだめの方が荒れてないってのも興味深いなぁ。
277デフォルトの名無しさん:2005/12/23(金) 22:59:49
>>274
移動する旨一言残してから移動すればいい。
改善する気がありそうなので次から気を付ければいいよ。



と今来た俺が言ってみるテスツ
278デフォルトの名無しさん:2005/12/23(金) 23:03:23
>>274
はぁ? マルチした理由がそれ? ふざけんな。

移動するのなら最低でも移動する趣旨を書いてからにしろ。
お前の問題を何人にも解かして人的リソースの無駄遣いをさせるな。

初心者だから鬱陶しい?
初心者を言い訳にするな。初心者でも態度がまともなら問題ない。
てめぇの勘違いした行動が最低なだけなんじゃボケ。

# 煽って頂くのは別に構わないらしいので煽ってみる
279デフォルトの名無しさん:2005/12/24(土) 12:02:07
初心者なのとマナーが悪いのとは別だな
280デフォルトの名無しさん:2005/12/24(土) 12:30:07
今日はクリスマス☆イブなんだから許してやれよ。
281デフォルトの名無しさん:2005/12/24(土) 15:32:30
私も皆さんと同じように、クリスマスイブだというのに一日中家に引きこもっている上に童貞なので馬鹿を煽るくらいしかすることがないんです。
282デフォルトの名無しさん:2005/12/27(火) 03:48:02
MACRO({
 ...;
 ...;
});

これに対するcppの動作って規格で保障されてますか?
283デフォルトの名無しさん:2005/12/27(火) 11:17:21
>>282
その文のなかに裸のコンマ(ふつうは逐次演算子)がなければ大丈夫。
284デフォルトの名無しさん:2005/12/27(火) 19:09:44
>>283
ありがとうございます。
285デフォルトの名無しさん:2005/12/29(木) 01:23:22
C++でWINDOWSプログラミング教えてくれるサイトないですか
CじゃなくC++で
286デフォルトの名無しさん:2005/12/29(木) 04:36:20
MSDN
287デフォルトの名無しさん:2005/12/29(木) 06:00:42
>>285
MFCが知りたいって事?
288デフォルトの名無しさん:2005/12/29(木) 06:01:31
腐るほどあると思うが。大抵MFCは使っているだろうけど。
そもそも、C++はほぼCの上位互換だし。
289デフォルトの名無しさん:2005/12/29(木) 08:47:18
Qt はC++じゃなかったっけ
290デフォルトの名無しさん:2005/12/29(木) 09:42:26
>>285
まずC++だけを勉強しろ。
次にWindowsプログラミングだけ勉強しろ。
最後にその2つの知識を応用してC++でWindowsプログラミングをしろ。Windows関連のクラスライブラリの勉強も良かろう。
291デフォルトの名無しさん:2005/12/30(金) 01:43:40
MFCってただで使えるのか?
292デフォルトの名無しさん:2005/12/30(金) 02:24:34
むりぽ
293デフォルトの名無しさん:2005/12/30(金) 02:26:26
MFCは使うな。この犬糞ども。
294デフォルトの名無しさん:2005/12/30(金) 02:27:22
犬糞どもは健全な若者を洗脳して犬糞にしてしまうのか・・嘆かわしい
295デフォルトの名無しさん:2005/12/30(金) 02:40:33
>>291
VC++2005がフリーで使えるから、出来るんじゃない?
296デフォルトの名無しさん:2005/12/30(金) 03:02:22
Visual C++ 2005 Express Edition には MFC と ATL が含まれますか。

いいえ、MFC と ATL は Visual C++ 2005 Express Edition には含まれません。MFC と ATL は、その他のすべての Visual Studio 2005 エディションに含まれる予定です。

(´・ω・`)
297デフォルトの名無しさん:2005/12/30(金) 07:40:23
C++に制限を掛けるプログラムを開発します。
具体的に言いますと、多重継承とか名前空間を使えなくするシステムです。
宜しくお願いします。
298魚チョコ:2005/12/30(金) 08:26:19
それより名前空間って訳語なんとかならない? ミ ゚ д゚ミ
299デフォルトの名無しさん:2005/12/30(金) 09:44:48
>>297
仮想関数も禁止というのはどうでしょう?
300デフォルトの名無しさん:2005/12/30(金) 10:10:56
>>298
名前宇宙。
まぁ、名付き宣言場所とか?
301デフォルトの名無しさん:2005/12/30(金) 10:19:30
>>297
なぜそのような制限が必要?

逆に言えば多重継承や名前空間はC++にとって必要だったからC++に導入されたのだ。
それを制限するというからには何か深いわけがあるはずだ。
302デフォルトの名無しさん:2005/12/30(金) 10:21:23
>>297
C++ をシンプルにというコンセプトだから、名前も思い切って++とかを取って
C とか名付けると良いでしょう。
303魚チョコ:2005/12/30(金) 13:14:53
いや、小文字にしちゃおう。cゞミ^0 ^ *ミ チッチャイー カワイー
304デフォルトの名無しさん:2005/12/30(金) 13:34:24
石化されそうで嫌だ
305デフォルトの名無しさん:2005/12/30(金) 13:51:51
>>298
namespace 名前空間
になんか違和感あるかな?
至極無難な訳語だと思うけど。
306デフォルトの名無しさん:2005/12/30(金) 16:05:47
JAVA風に"パッケージ"じゃ駄目?
307デフォルトの名無しさん:2005/12/30(金) 16:14:08
"namespace"を"パッケージ"って訳すのか?
308デフォルトの名無しさん:2005/12/30(金) 17:47:10
>>297
組み込み用のC++ってそういう感じの規格だよ
309デフォルトの名無しさん:2005/12/30(金) 18:36:24
パックアゲ
310デフォルトの名無しさん:2005/12/30(金) 20:32:28
            ∩_ 
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ <こいつは最高に アホ
 彡、   |∪|  /
/ __  ヽノ /
(___)   /
311魚チョコ:2005/12/30(金) 21:57:46
>>305
いや……だから……英語で space つったら隙間(0x20)
や広がり(宇宙)みたいな意味を含むんだろうけど、
日本語で空間つったら、明らかに3次元の含意。

「単語と単語の間に空間を空ける」

とはゆわないもん。名前が3次元に配置されてもなあ。
312デフォルトの名無しさん:2005/12/30(金) 22:58:02
名前面積
313デフォルトの名無しさん:2005/12/30(金) 23:04:53
数学的な意味の空間は3次元だけじゃないぞ
314デフォルトの名無しさん:2005/12/30(金) 23:05:50
もうネームスペースでいいじゃん!!
315デフォルトの名無しさん:2005/12/31(土) 05:04:03
「名前が含まれる空間」で名前空間。実に明確な名前だと思うがなあ。
316デフォルトの名無しさん:2005/12/31(土) 08:15:26
さあ、みんなで variable=変数 の訳語の変さについて語り合おう
317デフォルトの名無しさん:2005/12/31(土) 10:51:39
変か・・・?「可変子」とか?
むしろ関数のほうがワケワカメ。あと引数も。添え字ももうちょっとなんとかなりそうだ。
318デフォルトの名無しさん:2005/12/31(土) 13:08:20
virtual 仮想モナ
319デフォルトの名無しさん:2005/12/31(土) 13:09:49
>>316-317
添え字以外は、C/C++ができるよりもずっと前に数学用語でそう訳されたものなのだから、
その是非をC/C++のスレで論ずるのはどうかと思う。

数学の訳語を流用するなという話ならともかくだけど。
320デフォルトの名無しさん:2005/12/31(土) 13:23:53
バカばっかだな ここ
スレタイどおりだw 
321317:2005/12/31(土) 13:32:51
>>319
いや、それはわかってるけど。
ネタレスだと思って勘弁してください。
数学用語といえば添え字もそうだとおもってたけど違うんかな。
322名前空間 魚チョコ;:2005/12/31(土) 15:32:15
悪かった。よく考えるとメモリー空間とかアドレス空間とか言うので慣れの問題だった。

でもまあ名前は順列組合せなので一次元だし、メモリーもアドレスも一次元だし、
単に名簿でよかったじゃん ミノд ; ミ シクッ
323電電板住人:2005/12/31(土) 18:17:39
>>322
イキロ、モドッテコイ
324デフォルトの名無しさん:2005/12/31(土) 19:00:56
関数オブジェクトですか?わかりません><;
325デフォルトの名無しさん:2006/01/01(日) 10:05:44
むしろ引数が湯桶読みな件のほうが
326デフォルトの名無しさん:2006/01/01(日) 23:34:10
>>325
慣れの問題。
327デフォルトの名無しさん:2006/01/02(月) 00:03:40
どんな問題
328デフォルトの名無しさん:2006/01/24(火) 00:25:29
インライン関数でクラスのプライベートメンバを帰す場合
きちんとインライン展開されますか?
つまり
class Foo
{
 private:
  int value
  ...
 public
  int GetValue(){return value; }
};

という風にクラスFooを定義した場合
GetValueはインライン展開されるのかどうか、ということです
329デフォルトの名無しさん:2006/01/24(火) 00:50:24
インライン展開そのものが処理系に判断を委ねられているものだからなんとも。
インライン関数はその呼び出しのコストを出来るだけ抑える努力をする関数ってだけだし。
330デフォルトの名無しさん:2006/01/24(火) 00:56:14
>>328
コンパイラにもよるが、最適化を一切しない設定の場合は一切インライン展開しないか、
インライン版と関数版の両方のコードを含む。
331デフォルトの名無しさん:2006/01/24(火) 03:09:37
>>329-330

レスさんくすです

つまり処理系と最適化オプションによる、というわけですか
作られる関数郡はあまり頻繁に用いられるものではないですが
1行、2行のものはできるだけインラインにしたいなと思いまして
332デフォルトの名無しさん:2006/01/24(火) 23:31:30
普通はインライン展開されると信じる。
333デフォルトの名無しさん:2006/01/25(水) 00:05:50
>>332
「普通」とか、自分にしか通じない基準を論拠にするものではない。
334デフォルトの名無しさん:2006/01/25(水) 00:40:25
>>333
「普通はインライン展開される」と信じる。
じゃないの。
335デフォルトの名無しさん:2006/01/25(水) 00:47:44
>>334 >333
336デフォルトの名無しさん:2006/01/26(木) 00:40:56
#include<math.h>
#include<stdio.h>

main(){
long double x;
x=pow(900,2);
printf("%le",x);
return 0;
}

これ実行すると-1.052249e+28とかいうわけのわからない値がでてくるんだけど
なんでかわかる人います?borland c++ 5.5使ってます
337デフォルトの名無しさん:2006/01/26(木) 01:03:50
long doubleなのにdoubleを指定してるからだろ。
bccはlong doubleは%Leでいけるのかな?
338デフォルトの名無しさん:2006/01/26(木) 02:08:18
>>337
できました。ありがとう。
%leはdoubleなんですね
339デフォルトの名無しさん:2006/01/26(木) 02:10:59
C言語(プログラミング言語)のことで質問です
「unsigned char」ってどんな役割を果たすんでしょうか?
340デフォルトの名無しさん:2006/01/26(木) 02:12:21
%fってfloatのみ?
341デフォルトの名無しさん:2006/01/26(木) 02:44:55
>>340
%fもdouble。
というより、printfを呼び出すときに
引数のfloatをdoubleに暗黙的に変換するので、
float用のフォーマットは無い。

ただ、scanfでは%fがfloat、%lfがdoubleなので、
うっかり、printfでもdoubleを使うときに%lfを使う人が続出したので
C99で%lfもdoubleになったという経緯がある。
ゆえにC99以前ではprintfで%lfは間違いなので互換性を気にするなら使わないほうが無難
342デフォルトの名無しさん:2006/01/26(木) 02:53:09
>>339
char と同じサイズの整数。

char は符号を持つ場合があり、
unsigned char は符号を持たないかわりに
char よりも大きい値が使える場合がある。
343デフォルトの名無しさん:2006/01/26(木) 09:23:23
片手落ちやな。
そこまで説明するならsigned charとの違いも説明せな。
344デフォルトの名無しさん:2006/01/26(木) 09:43:59
>>343
>339 へのレスなんだから、これでいいだろ。
345デフォルトの名無しさん:2006/01/26(木) 09:47:00
>char と同じサイズの整数。
この辺りが微妙。
346デフォルトの名無しさん:2006/01/26(木) 13:03:59
342じゃないけど
文句があるんだったら黙って補足すればいいのにw
347デフォルトの名無しさん:2006/01/26(木) 15:02:54
>>343-345 じゃないけど
詳しく訊きたいなら素直に訊けばいいのにw
348デフォルトの名無しさん:2006/01/26(木) 15:40:58
>>345
実質整数みたいなもんじゃん中身
349デフォルトの名無しさん:2006/01/27(金) 01:00:52
unsignedであることを説明せんと。
350デフォルトの名無しさん:2006/01/27(金) 07:54:03
unsigned
351デフォルトの名無しさん:2006/01/27(金) 08:00:01
unsignedであるとはツンデレラであるということだ
352デフォルトの名無しさん:2006/01/28(土) 03:16:28
>>339
char c = 0x80;
unsigned char c = 0x80;

前者は警告が出るが後者は出ない。
353デフォルトの名無しさん:2006/01/28(土) 03:20:42
てことはsignedはデレデレか
354デフォルトの名無しさん:2006/01/29(日) 11:55:16
質問です。

特定のファイルがあるかどうか調べるにはどうすればいいのでしょうか?
今は、fopenでそのファイルを開き、NULLが返ってくるかどうかで判別しているのですが、
あまりスマートなやり方で無い気もします。
もし他に良い方法があれば教えてください。

355デフォルトの名無しさん:2006/01/29(日) 12:03:57
>>353
裏表あるって意味でsignedのがツンデレっぽいなw
どうでもいいか
356デフォルトの名無しさん:2006/01/29(日) 12:04:28
>>354
俺もそうやる
他の方法しらない
357デフォルトの名無しさん:2006/01/29(日) 14:18:22
>>354
Windowsっていう縛りがあっていいならAPI呼び出し。
Windows95でIE3以前だとDLLは入っていない。

#include <shlwapi.h>
BOOL PathFileExists(LPCTSTR Path);
358デフォルトの名無しさん:2006/01/29(日) 18:03:28
>>354
大抵の環境で使えるという程度の互換性でいいのなら、stat()でいいと思う。
fopen(..., "r")は、ファイルの存在検査ではなくファイルの可読性の検査になるということに注意。
つまり、unixなどでは存在するのに読めないファイルに対してどうするべきか検討する必要がある。
大抵は「読める」≒「在る」だろうけれど、「なかったら作る」という状況ではそれは拙いかも知れない。
359デフォルトの名無しさん:2006/01/29(日) 23:22:49
>>352
char c = '\x80';で問題ない。
もっと言えばchar型が9ビット以上あれば0x80でも警告は出ないだろう。
360魚チョコ:2006/01/30(月) 00:09:52
>>358
struct stat 作るのまんどくさいので fopen(">>358","r") でよさげ。
読めないけど書きこめるへんなファイルなんてこわしちゃってよさげ。

>>359
バイトが 8 ビットでないかもしれないなんて考えないでよさげ。
361デフォルトの名無しさん:2006/01/30(月) 00:15:23
>>360
>読めないけど書きこめるへんなファイルなんてこわしちゃってよさげ。
読めも書けもしないファイルかも知れず。
つーか、他人が読み書きできないだけでそのファイルのオーナには読めるかもしれないわけで。
#もしかして、シングルユーザな環境しかご存知ない?
362デフォルトの名無しさん:2006/01/30(月) 00:37:27
つまり考え出すときりがない。
363魚チョコ:2006/01/30(月) 01:00:06
>>361 君は疲れてるんだよ。はやくねなさい。
 >>360 は、>>358 の結部「『なかったら作る』という状況」を受けてるので、
「読めも書けもしないファイル」があったら、

"r" でエラー → 無さげと判定 → "w" でエラー → あら実はあったのね

"w" でえららなかったらあぼうんでよさげ。
364デフォルトの名無しさん:2006/01/30(月) 08:22:20
ウインドウズに挑戦してる超初心者なんだけど、おまいら教えてください。 

wprintfをつかったら出力はどこに表示されるの? 
365デフォルトの名無しさん:2006/01/30(月) 08:31:39
標準出力に表示されます
366デフォルトの名無しさん:2006/01/30(月) 13:19:48
「どうしてコテってのは莫迦ばっかりなのはなぜ?」
とかいうスレをマ板辺りに勃てたくなってきた。
367デフォルトの名無しさん:2006/01/30(月) 13:28:59
>>366
俺は『どうして〜〜なぜ』
という明らかに変な日本語を書く>>1の方がたぶん莫迦、と真っ先にレスするな
368デフォルトの名無しさん:2006/01/30(月) 15:00:39
>>354
> 特定のファイルがあるかどうか調べる

access()
369デフォルトの名無しさん:2006/01/30(月) 17:13:11
>>364
ちなみにもしもwsprintfのことなら、それはCのsprintfと同じで文字列に書き出される。
370デフォルトの名無しさん:2006/01/30(月) 17:48:13
ベクタのend()は一度イテレータ宣言してそこに記憶させておいた方が高速ですか?
それとも、いちいちループ終了判定の度にend()呼び出しても変わりませんか?
371デフォルトの名無しさん:2006/01/30(月) 17:53:55
>いちいちループ終了判定の度end()
for_each()の方がよくないか?
372デフォルトの名無しさん:2006/01/30(月) 17:58:40
>>364
超初心者ってことは、「通常の状態では黒っぽい窓に出力される」とか答えたほうがいいかもしれない。
黒っぽいものが表示されなかったら、標準出力がファイルとか別のところに割り当てられている。

黒っぽいものが表示されて、すぐ消えるんだったら、正常。
間に合わせでよければ、次の方法。
wprintfの次の行に、getc(stdin);とでも書いておけば、Enterキー押されるまでは表示されつづけるよ。

373デフォルトの名無しさん:2006/01/30(月) 18:09:17
printf();とかってなんであんな複雑な引数取れるんですか?
第二引数がintだったりcharだったりetc etc...
不思議でならない
374デフォルトの名無しさん:2006/01/30(月) 18:23:38
printfの関数の内部で引数が何であるかチェックしているからですよ。
375デフォルトの名無しさん:2006/01/30(月) 19:15:58
どーやって?void *とかで受けて後はどーやってチェックするのん?
後引数の数が違っても平気なのもスゴいと思う
376デフォルトの名無しさん:2006/01/30(月) 19:18:45
>>375
%dとかの書式指定を当てにしている。
だから書式指定と違う型を引数にするとまずいことになる。
(たまたまうまくいってしまうことも多いが)
377デフォルトの名無しさん:2006/01/30(月) 19:21:40
>>373
stdarg.hを調べると良いと思う。
378デフォルトの名無しさん:2006/01/30(月) 19:50:53
>>370
速度が気になるなら実測しろ。
379デフォルトの名無しさん:2006/01/30(月) 19:52:57
>>376
そーなんだ…
そういえば間違えてセグメンテーション違反とか言われた事あるなぁ…

>>377
すげぇ、ちょっと感動した そーなのかー
380デフォルトの名無しさん:2006/02/02(木) 04:17:16
インテルコンパイラはAMDのプロセッサに対してもちゃんと最適化されますか?
381デフォルトの名無しさん:2006/02/02(木) 09:32:47
C、C++の最適化について語るスレ
ttp://pc8.2ch.net/test/read.cgi/tech/1084676298/459
382デフォルトの名無しさん:2006/02/02(木) 17:20:56
配列の個数を求めるにはどうしたらいいですか?
383デフォルトの名無しさん:2006/02/02(木) 17:32:20
>>382
配列の名前をAとすると
sizeof(A)/sizeof(A[0])

但しAがポインタの時には上手く動作しないので注意
384デフォルトの名無しさん:2006/02/02(木) 17:32:44
>>382
それが配列である限り、静的に個数を求めることはできる。
但し、関数に配列を(配列としてそのまま)渡すことはできない点に注意。
以下にサンプルをもって説明とする。

int chs[] = {1, 3, 4, 6, 8, 10, 12,};
printf("東京で見られるVHF TV局数は%d。\n", sizeof(chs) / sizeof(* chs));
385デフォルトの名無しさん:2006/02/02(木) 17:40:23
>>384
丁寧にありがとうprintfとかの使い方は大丈夫です
>>383
どうもそれで動かないなぁと思ったらポインタのせいでした・・・

他の変数に数を代入します。
386デフォルトの名無しさん:2006/02/02(木) 18:02:07
>>384
sizeofはsize_t型だろうから、%dではなく%uで受けるべきだろうな。

>>385
C++なら要素数を返すテンプレート関数を作ることができるよ。
template<typename T, std::size_t N> static inline std::size_t numberof(T (&)[N]) {return N;}
387デフォルトの名無しさん:2006/02/02(木) 18:21:14
size_tってunsigned int だろ?
別に%dでも%uでもよくね?
388デフォルトの名無しさん:2006/02/02(木) 18:52:23
size_tはunsigned intだとは限らないから、%uでも%dでも受けられない。
unsignedにキャストして%uで受けるべき。
389388:2006/02/02(木) 18:53:23
C99では%zで受ける。
390デフォルトの名無しさん:2006/02/02(木) 18:59:45
%zじゃなくて%zuね。
391デフォルトの名無しさん:2006/02/02(木) 19:56:06
intとlongは32bit。ポインタとsize_tは64bitかもしれない
392デフォルトの名無しさん :2006/02/02(木) 20:17:24
リスト構造って、プロはすぐに、プログラムの流れを想像設計して、打ちこんだり
できるもんなんですか?
自分が見てる本の例題のソース書くと糞長くなるので書かないですが
「ここで、構造体のメンバでポインタ使って、つぎに構造体のメンバの
構造体の構造体ポインタ変数にこれを代入して、次のポインタ・・・・」って、
ソースを読むとなんとなくわかるけど、結局俺は、40%くらいしか理解できてないだろうから
100%理解できてないなら、理解度0%だろうと思ってるし・・・
やっぱ、数ある良い例題プログラムを覚えても理解できてないなら、暗記しただけだし
ああ、わかんねぇ・・・
入門書の次に読めばさらに理解度が深まる本はないですかね

393デフォルトの名無しさん:2006/02/02(木) 20:27:20
心配しなくてもそのうち解かるようになる
394デフォルトの名無しさん:2006/02/02(木) 20:30:09
>>392
最早C++ならいちいちそんなことを意識する必要がないので、ずっと気楽だがな。
395デフォルトの名無しさん:2006/02/02(木) 20:40:24
>>392
最初は分からないでいいよ
ざっと読むだけじゃなくてここはどうしてこんなことしてるのかな?とか考えながら読んでいけばそのうち分かってる
入門書の次はそういうテクニックを網羅してるアルゴリズム本がおすすめ
396デフォルトの名無しさん:2006/02/02(木) 21:19:56
>>391
intとlongだって64bitあるかもしれない。
397デフォルトの名無しさん:2006/02/02(木) 22:24:58
冷蔵庫に牛乳があたかもしれない
398392:2006/02/02(木) 23:48:59
一言いわして。

ありがとう。

はげまされて、うれしくなっちゃった。
精進します。
399デフォルトの名無しさん:2006/02/03(金) 01:08:25
>>397
もう腐ってるよ
400デフォルトの名無しさん:2006/02/03(金) 01:13:17
それなんてヨーグルト?
401デフォルトの名無しさん:2006/02/03(金) 10:08:28
すいません、
linuxで、フォルダ内のファイルを次々に読み込む、というプログラムを作りたいのですが、
どのようにすれば良いでしょうか?
402デフォルトの名無しさん:2006/02/03(金) 19:49:12
man opendir
403デフォルトの名無しさん:2006/02/03(金) 22:01:58
>>396
正確な定義
char<short<=int<=long
404デフォルトの名無しさん:2006/02/03(金) 22:17:47
つfindfirst, whileループ, findnext, findclose, fopen
405404:2006/02/03(金) 22:19:53
すまん。UNIXには移植できないと書いてあった。DOSとWindowsだけだ。
406デフォルトの名無しさん:2006/02/03(金) 22:44:03
>>401
boost::filesystem::directory_iterator
407デフォルトの名無しさん:2006/02/03(金) 23:29:53
初めまして
C言語を勉強し始めたばかりの下級者です
質問なのですが
whileの終了条件をbreakで決めた場合、そのwhile構文の中身をN回繰り返すにはどうしたらいいのでしょうか?
forやwhileを↑のwhile文の外につけてみてもN回繰り返すプログラムが出来てないみたいなんです。

説明ベタでごめんなさい、お願いしますm(_ _)m
408デフォルトの名無しさん:2006/02/03(金) 23:33:01
n=0;

while(1){//無限ループ
  if(n>=5)break;//nが5以上になればbreak
  n++;//n加算
}

5回繰り返す
409デフォルトの名無しさん:2006/02/03(金) 23:46:48
>>408 ごめんなさい
説明が不十分でした・・・

while(1){
  r = (rand()%100) + 1;
if (r >20) x = x ++;
  if(x==20)break;
}  

↑のように、既にbreakの条件にどうしてもしたい条件を入れてるんです。
このwhileの中のX==20となって終えるという行為を、30回繰り返したいんです。
色々本を読んで調べてみたのですが、どうも物分りが悪い私にはさっぱりで・・・
すみませんが、お願いいたしますm(_ _)m

↓これだとダメみたいなんです

for(h=0; h<=60; h++){
while(1){
  r = (rand()%100) + 1;
if (r >20) x = x ++;
  if(x==20) h=h ++; break;
} 
}
410デフォルトの名無しさん:2006/02/03(金) 23:48:35
( ゚д゚)ポカーン
411デフォルトの名無しさん:2006/02/03(金) 23:53:17
>>410
えと・・・聞くのが恐いんですが・・・私何かとてつもなくおトンチンカンなことしてますでしょうか・・・?
412デフォルトの名無しさん:2006/02/04(土) 00:00:39
>X==20となって終えるという行為を、30回繰り返したい
これだけ考えて答えるけど
while(1){
  if(j==30)break;
  while(1){
   if(n==20)break;
   n++;
  }
 j++;
}

外のwhile文で中の20回繰り返すwhile文を30回呼び出してる
回数指定→for
条件に達するまで→whileと使い分けた方がいい
413デフォルトの名無しさん:2006/02/04(土) 00:15:39
( ゚д゚)ポカーン

久々に激アツなコード見た。
414デフォルトの名無しさん:2006/02/04(土) 00:25:58
>>412
ありがとうございます!
breakは適用されると下に行くんですね。だから下に「j++;」を入れるのですか。
すごいすっきりしました。ありがとうございます。

余談ですが、教えていただいた通り直しても、なぜかプログラムが思うような結果にならず泣きそうになりました・・・
きっとどこか違うとこがあるのだと思うので、頑張ってやってみます。
お世話になりましたm(_ _)m
415デフォルトの名無しさん:2006/02/04(土) 00:31:58
ヒント1:x==20の条件を満たすのは1回だけ
ヒント2:x==20の条件を満たしたからwhile()ループを抜けているわけではない
416デフォルトの名無しさん:2006/02/04(土) 00:34:49
>>414
ごめんnを0にするの忘れてた
while(1){
  if(j==30)break;
  n=0;//0にする
  while(1){
   if(n==20)break;
   n++;
  }
 j++;
}
417デフォルトの名無しさん:2006/02/04(土) 00:41:25
new演算子をオーバーロードして、何回newされたかをカウントする機能をつけようと思ってます。
でも以下のコードでオーバーロードしたnewとdeleteでは
クラスのメンバにアクセスできないみたいなんです。
「+」や「-」など他の演算子をオーバーロードしたときはメンバにアクセスできるのですが。
なんとかしてオーバーロードしたnewでメンバにアクセスできないでしょうか?

class CTest{
private:
  int count;
public:
  CTest(){
    count = 0;
  }
  void *operator new(size_t t){
    void *pt = malloc(t);
    count++;
    return pt;
  }
};

ちなみにVC6.0でのエラーメッセージは
「'CTest::count' : スタティック メンバ関数内の不正なデータ メンバへの参照です」
です。よろしくお願いします。
418デフォルトの名無しさん:2006/02/04(土) 00:57:18
>>417
operator newは常にstaticなメンバ関数だから、
非staticなメンバ変数を使うことはできない。

そもそも、メンバにアクセスできたとして、いったいどのインスタンスのメンバにアクセスするつもりなんだ。
419デフォルトの名無しさん:2006/02/04(土) 01:02:06
>>417
どういう理解をしてると、CTest::operator new()のcount++より
CTest::CTest()のcount = 0の方が先に実行されると思えるのか

あと、どうでもいいけど、値を評価するのでない限り
後置++じゃなくて前置++を書く習慣をつけた方がいいよ。
K&Rの影響で、何でもかんでも後置にする奴がやたら多いんだけど。
420414:2006/02/04(土) 01:06:25
>>415-416
な、なるほど・・・!
内側の変数をbreakが終わった後リセットしないといけないんですね。
これでなんとか様になってきたようで嬉しいです。

でもまだ出来てないみたいなので必死に頑張ってみます。ありがとうございました!
421デフォルトの名無しさん:2006/02/04(土) 06:14:05
C言語始めたばっかりで幼稚な質問なんですけど、91を素数かどうか判定するプログラム教えてください!
422デフォルトの名無しさん:2006/02/04(土) 07:15:37
return 0;
423デフォルトの名無しさん:2006/02/04(土) 08:29:50
>>422
あらmain()終わってしまったw
424デフォルトの名無しさん:2006/02/04(土) 09:08:25
// 素数なら0を返し、合成数なら1、エラーなら2を返すプロセス
// ./a.out 91 ; echo $status とでもすれば判定結果がわかる
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
if (argc < 2) {
fprintf(stderr, "Usage:%s <number for test>.\n", argv[0]);
return 2;
}
int val = atoi(argv[1]);
if (val % 2 == 0) {
return 1;
}
for (int ic = 3; ic * ic <= val; ic += 2) {
if (val % ic == 0) {
return 1;
}
}
return 0;
}
425デフォルトの名無しさん:2006/02/04(土) 10:23:20
>>421
424で完璧だけどね、はじめたばかりということで

//素数かどうか判定する関数(素数なら1、素でないなら0)
#include <stdio.h>

int isPrim(int n){
int a;
if ( n==1 )return 1;
for(a=2;a<n;a++) if (n%a == 0)return 0;
return 1;
}

//91がどうかやってみるサンプル
int main(){
int n;
n=91;
if(isPrim(n))printf(" %d is Prim. \n",n);
else printf(" %d is nonPrim. \n",n);
return 0;
}
426デフォルトの名無しさん:2006/02/04(土) 14:31:52
>>424-425 乙

1は素数じゃないよ。だって、1の約数は、自分を含めて1個しかないでしょ?
2は素数。偶数で唯一の素数。
3以上は上のプログラムでOK。どうやったら高速化できるか、工夫してみて下さい。
あと、間違って0以下の数が入力された場合は、どうしたらいいでしょうか?

もちろん、これは、>>421さんへの宿題になります。

ちなみに、1を素数にしちゃうと、素因数分解が何通りもできることになる。6=2*3*1*1*1*1*1
427デフォルトの名無しさん:2006/02/04(土) 14:47:45
>>426
424,425ともに2は素数としているがな
428デフォルトの名無しさん:2006/02/04(土) 14:51:35
1が素数かどうかはルールの決め方でどっちとも取れる。
ただしどっちにしろ、結局1は特別扱いすることになるが。
429デフォルトの名無しさん:2006/02/04(土) 15:29:31
1は素数に含めないのが一般的だと思う。
430デフォルトの名無しさん:2006/02/04(土) 15:32:35
>>425
約数の探索範囲は、2〜nじゃなくて2〜sqrt(n)だよ。

431デフォルトの名無しさん:2006/02/04(土) 15:54:05
>>430
424はそうしている。
425はそれを知った上で簡略化のためにn−1まで回しているに過ぎない。
432426:2006/02/04(土) 17:28:23
毎度お騒がせな426です。
>>424は、実行してみましたが、0と2は合成数になってしまいますよ。

プログラムとしてみた場合、1は素数とする実装もあると思いますし、
x<0ならPrim(-x)を返す実装もありかとは思いますが。
ただ、1が数学的にみて素数というのはアリなんでしょうか?
理系の方、フォローお願いします。

ちなみに、一番楽なのは、
int isCompositeNumber(int n) {
for (a=2;a*a<=n;a++) if (n%a==0) return 1; //合成数
return 0; //それ以外
}
だったりして。
433デフォルトの名無しさん:2006/02/04(土) 17:55:40
421です。みんな真剣に考えてくれてありがとう!!とても参考になりました☆
434デフォルトの名無しさん:2006/02/04(土) 18:04:19
C言語の文法を教えて下さい><
435デフォルトの名無しさん:2006/02/04(土) 18:08:28
>>434
(V)(´Д`)(V) ヤダ
436デフォルトの名無しさん:2006/02/04(土) 18:08:41
437デフォルトの名無しさん:2006/02/04(土) 18:11:39
>>436
(V)( ´Д`)(V) ウヒョー
438デフォルトの名無しさん:2006/02/04(土) 18:19:24
>>436
なるほど!><
つまり画面に「こんにちは」と出したい時は
class J2ch
{
public static void main(String args[])
{
System.out.println("こんにちは");
}
}
てやればいいんですね!><
439デフォルトの名無しさん:2006/02/04(土) 18:21:30
>>438
それは間違っている。
伝統を重んじて"hello, world"を画面に出すことから始めないとうまくいかない。
440デフォルトの名無しさん:2006/02/04(土) 18:22:11
(V)(´Д` )(V) あ、うんこ漏れそう
441デフォルトの名無しさん:2006/02/04(土) 18:22:58
>>439
突っ込みどころはそこではなくてclass名が「J2ch」という変な名前のところだと思うのだがどうか
442デフォルトの名無しさん:2006/02/04(土) 18:25:40
いや、printf或いはputsを使っていないことのほうが。
それにManaged C++でもC++/CLIでもクラス内のstatic void mainから始まることはないというのも。
443デフォルトの名無しさん:2006/02/04(土) 18:25:56
>>441
いや、きっとたぶん>>438はコレをコピペしてもらいたかったのだろう。
            ∧ ∧  ちんぽっぽ                 こないでください
          _ (*‘ω‘*) __              _ ( ;><)  __
        / ( ( つ┳つノ   \          / ( ( つ┳つノ   \
       /    l ̄ ̄ ̄ ̄  l    ヽ        /   \ ̄ ̄ ̄   /  ヽ
       |    ●      ●    |        |     \    /    |
       | *    (_人_)  * .|        |     /    \    |
       ヽ               ノ        ヽ   ./       \  ノ
  〜〜〜  ◎――――――――◎    〜〜〜  ◎――――――――◎
444デフォルトの名無しさん:2006/02/04(土) 18:33:28
ねぇそろそろマジ突っ込み入れていい?
445デフォルトの名無しさん:2006/02/04(土) 18:35:32
半音sageでお願いします
446デフォルトの名無しさん:2006/02/04(土) 18:37:29
入れちゃお^^

>>438
それはJavaじゃあぁぁぁぁぁぁぁぁぁぁぁぁ!!!!!!
447デフォルトの名無しさん:2006/02/04(土) 18:53:32
         ナ ゝ   ナ ゝ /    十_"    ー;=‐         |! |!
          cト    cト /^、_ノ  | 、.__ つ  (.__    ̄ ̄ ̄ ̄   ・ ・
ミミ:::;,!      u       `゙"~´   ヾ彡::l/VvVw、 ,yvヾNヽ  ゞヾ  ,. ,. ,. 、、ヾゝヽr=ヾ
ミ::::;/   ゙̄`ー-.、     u  ;,,;   j   ヾk'! ' l / 'レ ^ヽヘ\   ,r゙ゞ゙-"、ノ / l! !ヽ 、、 |
ミ/    J   ゙`ー、   " ;, ;;; ,;; ゙  u ヾi    ,,./ , ,、ヾヾ   | '-- 、..,,ヽ  j  ! | Nヾ|
'"       _,,.. -─ゝ.、   ;, " ;;   _,,..._ゞイ__//〃 i.! ilヾゞヽ  | 、  .r. ヾ-、;;ノ,.:-一'"i
  j    /   ,.- 、  ヾヽ、 ;; ;; _,-<  //_,,\' "' !| :l ゙i !_,,ヽ.l `ー─--  エィ' (. 7 /
      :    ' ・丿   ̄≠Ξイ´,-、 ヽ /イ´ r. `ー-'メ ,.-´、  i     u  ヾ``ー' イ
       \_    _,,......::   ´゙i、 `¨ / i ヽ.__,,... '  u ゙l´.i・j.冫,イ゙l  / ``-、..- ノ :u l
   u      ̄ ̄  彡"   、ヾ ̄``ミ::.l  u   j  i、`ー' .i / /、._    `'y   /
              u      `ヽ  ゙:l   ,.::- 、,, ,. ノ ゙ u ! /_   ̄ ー/ u /
           _,,..,,_    ,.ィ、  /   |  /__   ``- 、_    l l  ``ーt、_ /  /
  ゙   u  ,./´ "  ``- 、_J r'´  u 丿 .l,... `ー一''/   ノ  ト 、,,_____ ゙/ /
        ./__        ー7    /、 l   '゙ ヽ/  ,. '"  \`ー--- ",.::く、
       /;;;''"  ̄ ̄ ───/  ゙  ,::'  \ヾニ==='"/ `- 、   ゙ー┬ '´ / \..,,__
、      .i:⌒`─-、_,....    l   /     `ー┬一'      ヽ    :l  /  , ' `ソヽ
ヾヽ     l      `  `ヽ、 l  ./  ヽ      l         )  ,; /   ,'    '^i

448デフォルトの名無しさん:2006/02/04(土) 19:23:31
う、うむ・・・
449デフォルトの名無しさん:2006/02/04(土) 19:28:38
ΩΩ Ω<ナ,

C#じゃなかったのか
450デフォルトの名無しさん:2006/02/06(月) 07:01:30
>402,404,405,406
遅くなりましたけど、ありがとうございました。
451デフォルトの名無しさん:2006/02/07(火) 15:59:19
すっごいくだらないかもしれませんが
C と C++の違いってなんですか?
452デフォルトの名無しさん:2006/02/07(火) 16:17:58
親と子の違い
453デフォルトの名無しさん:2006/02/07(火) 16:22:15
C→非オブジェクト指向プログラミング言語
C++→C派生オブジェクト指向プログラミング言語
オブジェクト指向ってのは関数とかデータの部品化
Cでテレビを作るとしたら入力関数、出力関数、表示中データを別々に置かなくてはならないが
C++ならデータや関数を一つの箱に入れてテレビ型の部品として管理できる
テレビとパソコンをつなげばテレビパソコンになる
454デフォルトの名無しさん:2006/02/07(火) 16:24:28
>>453
いろいろツッコミたいところだが、
かといって突っ込んでたら本一冊くらいになるのであえて何も言わない俺って凄い

C++:Cの上位、Cと互換性を保ちつつオブジェクト指向を取り入れた様なもの
   詳しくは本一冊嫁
455デフォルトの名無しさん:2006/02/07(火) 16:26:52
C++:
    Cの派生系、templateを用いたgenericsなプログラミングが特徴
    あと、大したことではないがオブジェクト指向も出来ないこともない。
456デフォルトの名無しさん:2006/02/07(火) 16:28:36
>>451
字が違う
457デフォルトの名無しさん:2006/02/07(火) 16:47:42
気分的に違う
458デフォルトの名無しさん:2006/02/07(火) 17:08:47
どうせC++なんてCもどきくらいにしか使えない
精々Classでまとめて便利〜とか思うだけ
459デフォルトの名無しさん:2006/02/07(火) 17:12:17
Cしか使ったこと無いだろ
460デフォルトの名無しさん:2006/02/07(火) 17:17:50
C++でSTLとboostを使うようになってからは、
個人的にはalgorithmとか標準のコンテナが存在しないCにはもう戻れなー
461デフォルトの名無しさん:2006/02/07(火) 17:26:01
type-safe linkageテラモエス
462デフォルトの名無しさん:2006/02/07(火) 17:26:38
アルゴリズムを書けない子供達
463デフォルトの名無しさん:2006/02/07(火) 17:29:12
アルゴリズムの再利用性を考えずに毎回一からご丁寧に書く大人達
464デフォルトの名無しさん:2006/02/07(火) 17:42:36
ブラックBOXはブラックのままでいいんだよ
なんでもかんでも1から作る古き良き時代は終わりました
465デフォルトの名無しさん:2006/02/07(火) 17:45:05
string arg = accumulate(argv,argv+argc,string());
Cだとこの程度の作業も長々と書かないといけないから嫌い。
466デフォルトの名無しさん:2006/02/07(火) 17:51:00
CにStringなんてあったかな
467デフォルトの名無しさん:2006/02/07(火) 17:52:16
C++では>>465のように書けるが、Cでは多くのコードを書かなきゃいけないってことだろ?
468デフォルトの名無しさん:2006/02/07(火) 17:56:30
じゃあCにstring型作るか
469465:2006/02/07(火) 18:03:57
Cで適当に書くとこんな感じかな?
(実際にはエラー処理をabortで手を抜いているのでもっと手間がかかる)

char*arg=(char*)calloc(1,1);
int i,len=1;
if(!arg){
    abort();
}
for(i=0;i<argc;++i){
    int t_len = strlen(argv[i]);
    arg = (char*)realloc(arg,len+t_len);
    if(!arg){
        abort();
    }
    memcpy(arg+len-1,argv[i],t_len+1);
    len += t_len;
}
470デフォルトの名無しさん:2006/02/07(火) 19:20:35
手間というほどか
471デフォルトの名無しさん:2006/02/07(火) 19:39:48
まぁC++でしか使えないものもあるしC++に興味を持っていて暇なら勉強してみるのが良いかもね
472デフォルトの名無しさん:2006/02/07(火) 20:11:37
Cでstringあっても使い物にならん
オペレータをオーバーラップできなきゃなぁ・・・
473デフォルトの名無しさん:2006/02/07(火) 23:32:17
C++ = ベタな C
474デフォルトの名無しさん:2006/02/07(火) 23:33:59
C++ = きんたまみたいな存在
475デフォルトの名無しさん:2006/02/07(火) 23:35:23
しかし、俺の周りではC++はよく表にでてくるのにObjective Cはあんまり聞かないなぁ
C++の方がエッチが言語だということは分かるが
476デフォルトの名無しさん:2006/02/08(水) 20:39:18
>>475
Mac OS XとかNEXTSTEP関連触れればObjective-Cも出てくるんじゃないか?
477デフォルトの名無しさん:2006/02/09(木) 18:32:13
>>475
化粧落とせばただのCじゃんあれ
478デフォルトの名無しさん:2006/02/10(金) 00:15:23
Windowsアプリケーションを作りたくてプログラムを始めました。
Cの入門書終えたんだけど、次は
独習C++と
Visual C++〈1〉はじめてのWindowsプログラミング
どちらを先に勉強した方がいいのでしょうか?
479478:2006/02/10(金) 00:17:19
あと、ゲームのプログラムも組んでみたいです。
2Dシューティングゲームみたいなものを。
480デフォルトの名無しさん:2006/02/10(金) 00:33:30
Cからの移行ならC++はあまり覚えること無いからまずはC++に入ってからWinAPIかな
C++のクラスは完全に理解しなくても大丈夫
仮想関数とかフレンド関数とかサッパリ
481478:2006/02/10(金) 00:40:52
レス有難うございます。
独習C++ > はじめてのWindowsプログラミング
の順で取り組んでみようと思います。
482デフォルトの名無しさん:2006/02/10(金) 00:41:01
>>480
(純粋)仮想関数はインタフェイス表現するのに必要だよな。
フレンド関数はクラス渡り歩くときに必要・・・か?
483デフォルトの名無しさん:2006/02/10(金) 07:51:49
フレンドはあまり使わない。
たまにあって便利だなと思うことはあるけれど。
484デフォルトの名無しさん:2006/02/11(土) 08:40:26
インナークラスがあればいいのに。
485デフォルトの名無しさん:2006/02/11(土) 15:32:54
>>484

class Outer
{
  class Inner
  {
    Outer& outer_;
    Inner( Outer& outer ) : outer_( outer ){}
  };
};
486デフォルトの名無しさん:2006/02/17(金) 01:05:33
Javaの実装もそうなってるだけらしいな
487デフォルトの名無しさん:2006/02/17(金) 01:07:11
>>486
おまえ6日以上前のレスに「そう」は無いだろ・・・
488デフォルトの名無しさん:2006/02/19(日) 13:23:19
それは他のスレも見てから言ってもらいたい
489デフォルトの名無しさん:2006/02/19(日) 13:23:55
いやこれも2日後だったw
490デフォルトの名無しさん:2006/02/19(日) 18:17:53
>>486
javaの実装は全部privateなのか
491デフォルトの名無しさん:2006/02/23(木) 15:03:20
訊かれていることがよくわからんが
Javaの"新"機能は仮想マシンの互換性のためなんだろうけど
プリプロセッサでなんとかしている
492デフォルトの名無しさん:2006/03/12(日) 01:34:33
すいません、今VisualStudio.NETを使って、C++でダイアログを表示するプログラムを作成したのですが、
ダイアログが表示される前に、コマンドライン画面が出現してしまいます。出現しないようにするには
どうすれば良いのでしょうか?
493 ◆Tama6VwrN. :2006/03/12(日) 03:48:59
>>492
一番上の行にこれいれとけ
#pragma comment(linker,"/SUBSYSTEM:WINDOWS")
494デフォルトの名無しさん:2006/03/12(日) 10:05:33
>>493
コマンドラインを出さずに実行できました。
ありがとうございました。
495デフォルトの名無しさん:2006/03/12(日) 11:06:50
C++で
関数呼び出すときに、戻り値の型を明示してやらないと駄目ですよね?
496デフォルトの名無しさん :2006/03/12(日) 11:50:40
Cなら、戻り値を明示しない関数はint型と解釈されるから
C++でもそうなんじゃねぇの?
っていうか、適当に関数作って試してみれば良いじゃん
497デフォルトの名無しさん:2006/03/12(日) 13:19:32
>>496
C++は型安全性のため暗黙のintは禁止。宣言時には戻り値の型も必要。
498デフォルトの名無しさん:2006/03/12(日) 14:34:16
でも呼び出すときには必要ないよ。
499495:2006/03/12(日) 15:31:47
>>496->>498
どうもです
500495:2006/03/12(日) 15:39:24
間違えて書き込み押してしまいました
戻り値を宣言するのは、分かりましたが
関数内で戻り値の変数定義して、値を代入しても
本体(呼び出し側)で定義されていませんとエラーが出ます
あらためて、本体側で再定義してやっても当然の結果ですが
中身はありません。
これって当然の結果なんでしょうか?
501デフォルトの名無しさん:2006/03/12(日) 15:43:39
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。

http://pc8.2ch.net/test/read.cgi/prog/1140616676/
502デフォルトの名無しさん:2006/03/12(日) 15:49:00
>>500
Cの変数にはスコープがある。
それを知っている立場から見ると当然の結果。
503495:2006/03/12(日) 16:00:53
>>502さん
どうもです
関数内で広域的(グローバル)に変数宣言するような方法は無いのでしょうか?
504デフォルトの名無しさん:2006/03/12(日) 16:04:37
環境はVCでSDKです。(MFCは使ってはダメ)
入力された日付(YYYYMMDD)が正しいかどうかチェックしたいのですが、
チェックする関数が見当たりません。
フォーマットが正しいかどうかなら自分でチェックすればできますが、
カレンダーにない日付もチェックしたいです。(2006/02/30はエラーみたいな)
チェック方法をしっている方おられました教えてやってください。
505デフォルトの名無しさん:2006/03/12(日) 16:04:37
>>503
extern で宣言はできる。
だがおそらく必要ではない。もっとマシな方法がある。
506デフォルトの名無しさん:2006/03/12(日) 16:38:10
>>500
何か話が噛み合っていないような気がする。
コードを晒してみろ。
507デフォルトの名無しさん :2006/03/12(日) 19:48:17
>>500
そうそう
単純な問題っぽいから
ソース出したれ
508504:2006/03/12(日) 20:11:13
スレ違いっぽいのでこっちのスレできくことにします。
ttp://pc8.2ch.net/test/read.cgi/tech/1139931895/
509デフォルトの名無しさん:2006/03/14(火) 07:33:02
リバースイテレータの存在意義が理解できません><
デクリメントすればいいじゃないですか!
510デフォルトの名無しさん:2006/03/14(火) 08:21:26
>>509
<algorithm>の関数を初めとして、イテレータの操作はインクリメント前提で作られているから。
511デフォルトの名無しさん:2006/03/14(火) 09:00:58
>>509
この板で見つけたサンプル。
--
typedef std::string::reverse_iterator riter;
std::string s = "abcdefg";

for ( riter r = s.rbegin(); r != s.rend(); r ++ )
std::cout << * r;
512デフォルトの名無しさん:2006/03/14(火) 09:32:25
typedef std::string::iterator iter; 
std::string s = "abcdefg"; 

for ( iter r = s.end(); r != s.begin();) 
std::cout << *--r; 
513デフォルトの名無しさん:2006/03/14(火) 09:59:44
じゃあ自分で設計する時は逆戻りにリバースイテレータなんて要らないんですね?
デクリメントで恥ずかしくないですね?
514デフォルトの名無しさん:2006/03/14(火) 10:18:59
>>513
恥ずかしい。
515デフォルトの名無しさん:2006/03/14(火) 11:55:42
恥ずかしいんですか。
速度は変わりませんよね?
516デフォルトの名無しさん:2006/03/14(火) 12:13:23
じゃあ僕も流行に乗ってリバースイテレータ使います><
517デフォルトの名無しさん:2006/03/14(火) 17:57:29
>>513
リバースイテレータがあれば1つの関数で順方向、逆方向の両方に対応できるという利点がある。

お前は要らなくても、そんなに特殊なものでもないから誰か使うやつはいるだろう。
518デフォルトの名無しさん:2006/03/17(金) 11:29:15
>>504
1週間前の質問で、しかも、スレ違いかどうかかなり微妙な質問だが、自分で書け。
SDKには、普通、そんな気の利いたAPIはない。
自分で書くのは面倒だろうが、難しくはない。
特に、1バイト文字でYYYY/MM/DDと分かっているなら、なおさら。
まあ、最近のWindowsなら、正規表現とか探せばあるかもしれんけど、
日付チェックまでやるなら、複雑になるので、正規表現はあまりおすすめできない。
519デフォルトの名無しさん:2006/03/18(土) 13:03:54
char* str = "2006/3/18";
int y=0, m=0, d=0;
(つまり、文字列を解析して、y,m,dにそれぞれ2006,3,18を代入するプログラム)
というのが与えられたとして、おまいら、どう解析する?

A.最初から1文字ずつ読んで、y,m,dに入れてく?
char* p = str;
int* tmp = &y; //現在の状態を「年」に設定
while (*p) {
if (*p>='0' && *p<='9') { *tmp = *tmp * 10 + (*p-'0'); } //数字
else if (tmp==&y) tmp = &m; //区切り文字で年→月に遷移
else if (tmp==&m) tmp = &d; //区切り文字で月→日に遷移
p++;
}
B.それとも次のように、二重ループで読んでいく?
char* p = str;
int* tmp = &y; //現在の状態を「年」に設定
while (*p) {
while (*p>='0' && *p<='9') { *tmp = *tmp * 10 + (*p-'0'); p++; } //二重ループ
if (tmp==&y) tmp = &m; //区切り文字で年→月に遷移
else if (tmp==&m) tmp = &d; //区切り文字で月→日に遷移
p++;
}

>>504のようなプログラム、おいら、Aにしようか、Bにしようか、
いつも迷ってしょうがないんだけど、どっちにすべき?
520デフォルトの名無しさん:2006/03/18(土) 14:12:42
boost:spirit で構文解析
521デフォルトの名無しさん:2006/03/18(土) 14:40:20
正規表現は?
522デフォルトの名無しさん:2006/03/18(土) 17:06:54
>>519
sscanf(p, "%d/%d/%d", &y, &m, &d);
523http://www.vector.co.jp/soft/win95/util/se072729.html:2006/03/18(土) 18:29:50
TextSS の64bit化おながいします

もしくは64bitにネイティブ対応した置換ソフトないですか?


524デフォルトの名無しさん:2006/03/18(土) 21:14:39
>>520 >>521 >>522
トンクス。
やっぱり、字句解析の視点を入れてコード書かなきゃだめか。
yaccとかlexとか、ちょっと大げさかな…と思うけど、
今度からは、Bのようなコーディングで統一することにします。
sprintfのscanf版があったなんて、今知った。勉強しなきゃ。

>>523
32bitアプリって互換性ないの?
何も考えずに64bit版Windowsなんか買うからw
525デフォルトの名無しさん:2006/03/18(土) 22:26:41
そんなわけねー。
32bitアプリの互換性無かったら、64bit版Windowsなんか買うやついないって。
526http://www.vector.co.jp/soft/win95/util/se072729.html:2006/03/19(日) 03:19:09
>>524
互換性あるけど、ネイティブ動作しない
527デフォルトの名無しさん:2006/03/19(日) 06:22:33
マルチも大変だな
528デフォルトの名無しさん:2006/03/19(日) 09:54:56
ネイティブだよ。CPUが32ビットモードになって動く。
(そのCPU内部では32ビットの動作をエミュレートしているんだというのは認めない)
529524:2006/03/19(日) 16:38:44
てゆうか、VBソフトで、ネイティブだとかネイティブじゃないとか…w
530デフォルトの名無しさん:2006/03/19(日) 16:41:48
>>529
m9(^Д^)プギャー
531デフォルトの名無しさん:2006/03/20(月) 18:02:02
>>529
puxtu
532デフォルトの名無しさん:2006/03/24(金) 12:00:31
char* str = "2006/3/18";
int i,y=0, m=0, d=0;
char* p = str;
int* tmp[3];
tmp[0] = &y;
tmp[1] = &m;
tmp[2] = &d;

for (i=0; i<3; p++) {
if (*p>='0' && *p<='9')
*tmp[i] = *tmp[i] * 10 + (*p-'0');
else
i++;
}
533デフォルトの名無しさん:2006/03/27(月) 02:05:21
>>532 配列をうまく使うと、コードが本当にすっきりするよね。
534デフォルトの名無しさん:2006/03/28(火) 13:33:13
>>532
p++とi++の場所を交換した方がいいと思う。
535デフォルトの名無しさん:2006/03/28(火) 13:36:27
>>534
そうするとロジックが変わるが。
536デフォルトの名無しさん:2006/03/28(火) 17:57:22
ファイルを開いてほかのプロセスに使用されないようロックしています。
このファイルをremove()で削除したいのですが、下記のようにその前にfcloseを呼び出すと、ロックも解除されてしまいます。

fclose(fp);
remove("foo");

fclose(fp)とremove("foo")の間に、ほかのプロセスがこのファイルをロックしてしまうのを防ぎたいのですが、どうしたらよいのでしょうか?
fcloseの前にremoveを呼び出しても問題ないでしょうか?
537536:2006/03/28(火) 18:02:57
http://www.bohyoh.com/CandCPP/C/Library/remove.html
ここによると、オープンされているファイルを削除しても問題ないOSもあるとのことですが、
できれば、より汎用性のある方法を使いたいのですが、何かよい方法はないでしょうか?

いったんファイルをロックした後は、ほかのプロセスにロックされないようにして、削除してしまいたい
これがやりたいことです。
538デフォルトの名無しさん:2006/03/28(火) 18:04:15
Win32 Console Applicationで作ってるんですが実行時に"Press any key to continue"と表示しないようにする方法ないですか?
539デフォルトの名無しさん:2006/03/28(火) 19:39:32
>>538
F5キーを押すなどのデバッガ付きで実行したり、コマンドプロンプトなどからEXEを直接実行したりすればよい。
540デフォルトの名無しさん:2006/03/28(火) 21:31:19
>>536
ファイルロック自体が移植性が低いので、ある程度割り切ってしまっていいと思う。
Unix系なら先にremove()することで完全に他のプロセスの目からファイルを隠せる。
#但し、remove()してからfclose()の間に他のプロセスにファイルを作られてしまう問題はある。
541デフォルトの名無しさん:2006/03/28(火) 21:58:46
>>539
今、VisualC++で作っているのですが、プログラムが出来上がってEXEを作った後は表示されないということでいいのでしょうか?
542デフォルトの名無しさん:2006/03/29(水) 00:33:41
>>541
そういうこと。
543デフォルトの名無しさん:2006/03/29(水) 02:52:54
>>542
ありがとうございました。
544デフォルトの名無しさん:2006/03/29(水) 14:55:28
Enterキーを押すと画面が切り替わるようなものを作りたいのですが、
Enterキーを押すというのは、どういう条件式を作れば良いのでしょうか?

if(end == 'Enter')
{
545デフォルトの名無しさん:2006/03/29(水) 14:55:59
 …
}

ではさすがにだめですよね。
546デフォルトの名無しさん:2006/03/29(水) 18:01:12
getch() ? 環境書けよ、 end にはどうやって入れたんだ?
547デフォルトの名無しさん:2006/03/29(水) 18:17:22
scanf("%d",&end);です。
548デフォルトの名無しさん:2006/03/29(水) 18:22:06
%cなら\nが読み取れそうな気がしなくも無い。
549デフォルトの名無しさん:2006/03/29(水) 18:24:39
getch()つかえ
550デフォルトの名無しさん:2006/03/30(木) 13:10:06
getch()を使うのは分かりましたが、enter以外の入力を弾くためにはどうすればいいのですか?
551デフォルトの名無しさん:2006/03/30(木) 13:13:25
while(getch()!='\n');
552デフォルトの名無しさん:2006/03/31(金) 07:25:04
どーせ、getchはenterが来るまで戻ってこない。
553デフォルトの名無しさん:2006/03/31(金) 12:06:59
( ゚д゚)ポカーン
554デフォルトの名無しさん:2006/03/31(金) 14:02:51
>>553
はきだめでは普通。
555デフォルトの名無しさん:2006/03/32(土) 14:09:55
Enter 押したときに getch() がどんな値返してるか見ればいいのに。
556デフォルトの名無しさん:2006/04/02(日) 18:48:36
VS.NETと、前のバージョンのVC++6で確認したのですが、配列を宣言する際に
>定数式が必要です
>サイズが不明です
>サイズが0の配列を宣言しようとしました
というエラーが3個ずつ(計9個)出てしまいコンパイルが通りません。

#include <stdio.h>
#include <stdlib.h>

int r()
{
 return 30;
}

void func( int arg )
{
 int var = 20;

 int test1[ arg ];
 int test2[ var ];
 int test3[ r() ];
}

void main()
{
 func( 10 );
}

こんなコードです。本当にやりたいのは int test1[ arg ]; だけなんですが
そもそも変数や引数を添字にして配列を宣言することは不可能なんでしょうか
557デフォルトの名無しさん:2006/04/02(日) 18:49:39
>>556
C89では(つまり、VS.NETやVC6では)不可能。
558デフォルトの名無しさん:2006/04/02(日) 18:55:37
C99でも不可能
559デフォルトの名無しさん:2006/04/02(日) 18:59:08
>>558 え? C99 ではいけるだろ?
560デフォルトの名無しさん:2006/04/02(日) 18:59:44
>>556
C++ で std::vector 使え。
561556:2006/04/03(月) 00:37:44
結局、よく判らないので配列は諦めてリスト構造にしてしまいました・・・
レス返してくれた人、ごめんなさい
562デフォルトの名無しさん:2006/04/03(月) 00:42:29
test1に関していうと、たまたま今回はfunc(10)しか呼び出されていないが、
普通は、別のところでfunc(20)とかfunc(30)とか呼び出される可能性がある。

コンパイラは、<<コンパイルする時に>>配列を何バイト確保していいのか分からないから、
コードに埋め込めない。

<<プログラムを実行する時に>>動的にメモリを確保するためには、
mallocやnew、std::vectorを使えという話になる。


test2やtest3もダメなのか…。test2は、const int var=20;にしたらどうだろ?
563デフォルトの名無しさん:2006/04/03(月) 00:49:17
なるほど、理屈が判りました

>const int var=20;
これは確かに動きました。でも
void func( const int arg ){... とか int test1[ (const int)arg ]; あたりは悪あがきの様で、挫折しました
564562:2006/04/03(月) 00:57:08
const int var=20っていうのは、単に編集不可にするだけじゃなくて、最初にデータ埋め込んじゃうの。
func(const int arg)は、関数の中で、引数のデータを変更しませんって意思表示。
(※(const int* arg)とかじゃないと、意味ないけどね。)
int test1[(const int)arg]は、ただのこじ付け。編集可を編集不可にキャストしたところで…。

intで20ヶくらいだったら、
#include <memory.h>
int* test1 = (int*)malloc(arg*sizeof(int));
使うときは普通に、test1[10] = unko;
使い終わったら、free((void*)test1);

リスト構造でも、>>560さんのvectorでもいいけどね。
配列にするのか、リストにするのか、
また、別にデータ構造にするのかの選択は、きちんと目的を持って!!
565デフォルトの名無しさん:2006/04/03(月) 01:11:41
それこそallocaの出番じゃねーの。標準じゃねーけど。
566デフォルトの名無しさん:2006/04/03(月) 03:37:57
constにすれば高速になりますか?
567デフォルトの名無しさん:2006/04/03(月) 03:46:47
コンパイラ依存
568デフォルトの名無しさん:2006/04/03(月) 03:57:18
bcc32です
569デフォルトの名無しさん:2006/04/03(月) 04:30:55
環境依存
570デフォルトの名無しさん:2006/04/03(月) 05:35:59
windows2000です
PC9821V200s7cです。
571デフォルトの名無しさん:2006/04/03(月) 05:40:13
クラス間でデータを共有したい場合はどういう手法がありますか。
できればクラス間の依存のない形で実現したいと思っています。
572デフォルトの名無しさん:2006/04/03(月) 05:49:41
>>571
どういう目的でどういうクラスの間でどんなデータを共有するかによる
573デフォルトの名無しさん:2006/04/03(月) 06:15:51
>>572
目的は自分のためのフレームワークの製作です。
できれば汎用的な形で実現したかったのですが。
うむー。
汎用的なアプリのシステムとOS系のシステムのうまい融合と可読性の維持を当面の目標としています。
574デフォルトの名無しさん:2006/04/03(月) 08:55:06
>>573
データの持ち方なんてのはその使われ方に依存するもんだから、
そんな抽象的なことをいったって全く意味が無い。

最も顕著なのはアクセス制限で、たとえば
・任意のクラスに許すか、特定のクラスに許すか。
・任意のインスタンスに許すか、特定のインスタンスに許すか。
・読み込みのみ許すか、書き込みも許すか、その組合せか。
の組合せで適切な方法は変わってくるし、
アクセス頻度の多少やデータのサイズ、データにアクセスできる
期間などによっても変わってくる。

というわけでもっと具体的に言わんと、なんともいえん。
575デフォルトの名無しさん:2006/04/03(月) 09:35:22
>>567 >>569
あえて釣られてみました。
constは、高速化させるためにあるんじゃねーよ。
高速化ったって、たかが知れてるよw
どうしてもってんなら、100万回ループで実行時間でも計れ。

>>571
本屋逝って「デザインパターン」についての解説書を…ってほどのものじゃねーなw
最初は、テケトーにstatic変数でも使って書いとれ。
あと、friendにして、どちらかに相手側のポインタ持たせるとかな。
または、共有部分だけ別のクラスにして、インスタンスを1つだけ生成させるとかな。
慣れてきたら書き直しゃいーんだよ。
576デフォルトの名無しさん:2006/04/03(月) 10:00:05
>>575
ループなんてしなくとも
int main() {
const int a0 = 0;
const int a1 = 1;
// ...
const int a100000 = 100000;
}
みたいなコードは定数畳み込みをするコンパイラでは
コードが全て消えるので、顕著に速度差が出る。
577デフォルトの名無しさん:2006/04/03(月) 10:11:30
>>576
const つけて無くても不要変数の削除や定数の畳み込みは効くだろ。
578デフォルトの名無しさん:2006/04/03(月) 10:49:43
>>577
環境によって変わる。
579デフォルトの名無しさん:2006/04/03(月) 11:07:02
>>578 576にも言ってやれよ。
580デフォルトの名無しさん:2006/04/03(月) 11:18:14
main()からsub()にとぶときに、
main()で表示させていたprintf文を消したのですが、
画面を移動するときに、画面を初期化する方法を教えてください。
環境はANSI Cです。
581デフォルトの名無しさん:2006/04/03(月) 11:19:12
× main()で表示させていたprintf文を消したのですが
○ main()で表示させていたprintf文を消したいのですが

よろしくお願いします。
582デフォルトの名無しさん:2006/04/03(月) 11:20:03
>>580
言語の範囲内にはないだろうな。
環境に合わせてコンソール制御用のライブラリを探すといいよ。
583デフォルトの名無しさん:2006/04/03(月) 12:31:30
>>580
めんどくさいからputchar('\r');でも試してみてよ。
584デフォルトの名無しさん:2006/04/03(月) 12:52:42
cls
585デフォルトの名無しさん:2006/04/03(月) 14:08:57
ネタですが、
for (int i=0;i<100;i++) printf("\n");

clrscr()という関数もあるにはありますが、
DOSやWindowsでしか使えないとか書いてありました。
586デフォルトの名無しさん:2006/04/03(月) 14:14:53
>>583 ご名答!!
だけど、バックスペースは、 ¥r じゃなくって ¥b
587デフォルトの名無しさん:2006/04/03(月) 14:25:24
>>581
人が答えてやってるというのにマルチとはいい度胸だ

http://pc8.2ch.net/test/read.cgi/tech/1142302804/
588デフォルトの名無しさん:2006/04/03(月) 15:57:35
むしろ悪い度胸。
589583:2006/04/03(月) 18:02:01
いや、バックスペースの積もりなんて更々ないから。
590デフォルトの名無しさん:2006/04/03(月) 23:09:41
X a(1);

X a = X(1);

って、同じか?
591デフォルトの名無しさん:2006/04/03(月) 23:29:32
処理系依存だってきいたことがあるようなないような。
592デフォルトの名無しさん:2006/04/04(火) 00:06:46
>>590
後者は一時オブジェクトが生成されますがな。
593デフォルトの名無しさん:2006/04/04(火) 00:09:52
>>590
後者はコピーコンストラクタが使用される。
594デフォルトの名無しさん:2006/04/04(火) 01:15:02
12.8.15を考えればコピーが省略されることもありうる。
595デフォルトの名無しさん:2006/04/04(火) 01:23:53
それでも、例えばコピーコンストラクタを private にしてしまうと >>590 の後者はコンパイルできない。
596デフォルトの名無しさん:2006/04/04(火) 08:08:33
空ベクタに内容のあるベクタを代入するとどうなりますか?
ちゃんと空ベクタは代入元と同サイズ確保されてから要素のコピーが行われるのですか?
597デフォルトの名無しさん:2006/04/04(火) 08:11:23
>>596
処理の順序は決まってないが、結果は代入元と同じサイズになり、すべての要素がコピーされる。
598デフォルトの名無しさん:2006/04/04(火) 08:23:16
>>596
あり^^
599デフォルトの名無しさん:2006/04/05(水) 16:26:52
char words[3]="";
*words++ = 'a';

こう書いた時の2行目の動作について教えてください。
words++ならば次の要素を指す事になりますが、*words++=なので・・・どうなるのか。
確か++を後ろにつけると後から評価されるのだと思いましたが、
(*words)++='a';として評価される事になり++の効果がアドレス移動ではなくなってしまうのでしょうか?
600デフォルトの名無しさん:2006/04/05(水) 16:39:01
>>599
*words++は*(words++)と解釈される。
words++でwordsは次の要素を指すように変更されるけど、
値は変更される前のもの。
それを*で間接参照しているから、このとき参照されるのは、wordsが最初に指していた要素。

それから、その例はコンパイルできないかと。
601599:2006/04/05(水) 16:57:18
>>600
レスありがとうございました。
602デフォルトの名無しさん:2006/04/07(金) 07:29:00
関数の引数に使われる
const aaa&
の&ってどういう意味ですか?
例えば、
xref(istream& in,vector<string> find_words(const string&) = split)
という文がある解説本にあるのですが、引数に二つある&の意味が解説されていません。
それと、find_wordsの二つ目の引数は型のタイプだけ指定して変数名を明確にしてませんが良いんでしょうか。
603602:2006/04/07(金) 07:32:51
×find_wordsの二つ目の引数は
○find_wordsの引数は
604デフォルトの名無しさん:2006/04/07(金) 07:41:53
>>602
その&は参照と言う。
ttp://wisdom.sakura.ne.jp/programming/cpp/cpp11.html

2つめの引数は、const string&を引数に取り、vector<string>を返す関数型だが、
find_wordsという名前が付いている。splitはデフォルト引数。
(勿論Cと同じく仮引数が関数型なら、それは関数へのポインタ型に調整される)

ただしC++で関数の仮引数の名前を省略することは可能。
605602:2006/04/07(金) 07:43:44
すみません自己解決しました。
アドレスを引数に取る場合はint *の様にするのだとおもってましたが
それはCだけの事だったのですね。
606602:2006/04/07(金) 07:52:14
>>604
レスありがとうございました。
あれ・・・参照とポインタって違うんですね、また勘違いしているようです。
参照は独自のアドレスを持たない、ということは占有しているメモリ領域が無いということですか?
607デフォルトの名無しさん:2006/04/07(金) 08:16:43
参照先のアドレスを持ってるからメモリ領域はあるが?
608デフォルトの名無しさん:2006/04/07(金) 08:38:40
クラスのインスタンスを動的に複数作成、管理するにはどうすればいいでしょうか?
作成するのはCreateInstanceでできると思うのですが、
それぞれにどうアクセスすればいいかわからないのです。
for(i=0;i<=j;i++){
新しいインスタンスを作成
}
で、j個のインスタンスを作成する…みたいなことをしたいのですが。
609デフォルトの名無しさん:2006/04/07(金) 08:59:30
>>608
CreateInstanceって、なんですか?
610デフォルトの名無しさん:2006/04/07(金) 11:35:01
スレッドプログラミングの解説書を提示して下さい。
611デフォルトの名無しさん:2006/04/07(金) 11:38:27
ぐぐれ
612デフォルトの名無しさん:2006/04/07(金) 12:51:29
>>606
引数に使ったとき

  void sub1(hoge* a)
  {
    a->member = 0; // "->" でアクセスする
  }
  void sub2(hoge& a)
  {
    a.member = 0;   // "." でアクセスする
  }
     :
  {
    hoge obj;
    sub1(&obj); // ポインタ渡し
    sub2(obj);  // 参照渡し

普通に変数として使ったとき

    hoge* obj1;    // どこを指しているかわからない
    hoge* obj2 = 0;  // NULLポインタ: どこも指していない
    hoge& obj3;    // エラー: 必ずどこかを指してないといけない
613デフォルトの名無しさん:2006/04/07(金) 13:38:44
>>608
個数を指定するんだから配列でいいんですよね?
for(i=0;i<=j;i++){
sorezore[i]=CreateInstance();
}
でいいんじゃないですか?
614デフォルトの名無しさん:2006/04/07(金) 14:55:42
amazonでプログラミング言語Cを注文したんですけど、他に買っといたほうがいいC関連の本ありますか?
615デフォルトの名無しさん:2006/04/07(金) 15:23:07
616デフォルトの名無しさん:2006/04/07(金) 16:00:59
>>615
ありがとうございます
617デフォルトの名無しさん:2006/04/07(金) 16:49:39
>>605
*のポインタはもちろんC++でも使える。
参照は独自のアドレスを持たないというより、
持っていてもC++のソースコードからは得られないという感じ。
618デフォルトの名無しさん:2006/04/07(金) 19:53:32
>>613
あ、なるほど。
ありがとうございます。
619デフォルトの名無しさん:2006/04/07(金) 20:23:51
#include <stdio.h>
struct board {
int p;
int h;
}

main() {
struct board a = { 0, 0 };
printf("%d,%d,%c", a.p, a.h);
return 0; //右この部分に "互換でない型変換(関数 main )" とエラーがでる。
}

なぜでしょうか?教えてください。
620619:2006/04/07(金) 20:26:20
9行目の"右"は無視してください。すいません
621デフォルトの名無しさん:2006/04/07(金) 20:28:10
>>619
intを返してるからじゃね?
622デフォルトの名無しさん:2006/04/07(金) 20:28:58
intがstruct boardを返すと定義されているのに、0を返したから。
623デフォルトの名無しさん:2006/04/07(金) 20:29:44
間違えた(w なんだよ、intが0を返すって。
mainが、だな。
624619:2006/04/07(金) 20:33:37
すいません、結局何を返せばいいのでしょうか?
625デフォルトの名無しさん:2006/04/07(金) 20:34:46
>>624
return;
でいいのでは?
626619:2006/04/07(金) 20:37:59
値を返すべき っていう警告が出るんですけどそれでもですか?
627デフォルトの名無しさん:2006/04/07(金) 20:39:06
ねらってやっているなら、return a;
ねらってないなら、struct board{...} と main(){
の間にセミコロン。
628619:2006/04/07(金) 20:42:33
できましたありがとうございます。
でも ねらう ってどういうことですか?
629デフォルトの名無しさん:2006/04/07(金) 21:27:36
うけを狙うのさ。
630デフォルトの名無しさん:2006/04/07(金) 22:39:36
いや〜、はきだめって本当に糞ですね。
631619:2006/04/08(土) 00:13:28
うけ狙いか。。。まぁいいや。ありがとうございました。
632デフォルトの名無しさん:2006/04/11(火) 03:17:07
vectorとかって便利ですけど、
普通の静的配列を使ったプログラムと混在で使うのはやはりやめるべきでしょうか?

たとえばある関数の引数に静的配列のポインタを指定する場合、

for (int i=0; i<v.size(); i++) {
 a[i] = v[i];
}

のように一度変換しなければいけないと思うのですが・・・。
何か他にいい方法でもあるんですかね?
633デフォルトの名無しさん:2006/04/11(火) 03:29:08
>>632 変換不要。
634デフォルトの名無しさん:2006/04/11(火) 06:56:41
>>632
引き数で、「静的配列のポインタ」かただの「ポインタ」かの区別を必要とするとは珍しい関数だな。
>633も書いているが、単に連続領域へのポインタが必要なら変換の必要はない。
仮に変換しなければいけないとしても、要素を一つずつコピーするのはナンセンス。
635デフォルトの名無しさん:2006/04/11(火) 07:21:42
>>632
&*v.begin()
&v.front()
&v[0]
の中から好きなのをどうぞ。
vectorは連続領域だと規格で定められている。
# vector<bool>は例外なのがあれだけど
636デフォルトの名無しさん:2006/04/11(火) 17:40:44
>>632
コンストラクタあるいはstd::copy+std::back_inserter
637デフォルトの名無しさん:2006/04/12(水) 22:24:32
せっかくテンプレートクラスにしたのに、
自分だけしか使わなかったよ!
しかも一箇所だけで・・・
638デフォルトの名無しさん:2006/04/16(日) 22:05:40
すみません。一つ質問させてください。
new演算子を使うと、ヒープメモリの確保と、オブジェクトの初期化をやってくれますが、
メモリは確保しないで、オブジェクトの初期化だけやるには、どうしたらいいんでしょうか?

例えば、mallocなり配列なりで、sizeof(TMyClass)のメモリがあらかじめ、
どこかに確保されているとします。
この状態で、コンストラクタだけを呼び出して、
そのメモリ上にTMyClassのオブジェクトを作成したいのです。

前々から疑問だったので、よろしくお願いします。
639デフォルトの名無しさん:2006/04/16(日) 22:08:35
>>638
placement newという構文を使う。
void *p = malloc(sizeof(TMyClass));
TMyClass *i = new(p) TMyClass;
640638:2006/04/16(日) 22:45:56
ありがとうございました。長年の疑問が解けました。
641638:2006/04/16(日) 23:13:57
「placement new」でググったら、いろいろ分かりました。
名前だけはよく聞く「配置構文」ってのが、これだったのですね。

STLの「アロケータ」とか、何に使うのか分からなかったのですが、
これも、メモリへの配置に使うオブジェクトだったんですね。

本当にありがとうございました。
642デフォルトの名無しさん:2006/04/26(水) 13:39:47
Cでgoto文使うとヘタれとか罵られます……
if (p=1) {
 x=1;
 goto ret;
}
if (q=2) {
 x=2;
 goto ret;
}
if (r=1) {
 x=2;
 goto ret;
}
x=0;
ret:
こういうのをgoto文使わないで綺麗に書くにはどうしたらorz
643デフォルトの名無しさん:2006/04/26(水) 13:41:25
>>642
あ、r=1のときのx=2ではなくてx=cとかで。
644デフォルトの名無しさん:2006/04/26(水) 14:35:47
if (p=1)
 x=1;
else if (q=2)
 x=2;
else if (r=1)
 x=2;
else x=0;
645デフォルトの名無しさん:2006/04/26(水) 14:38:10
>>642
単純に
p=1;
x=1;
ret;
でいいんじゃないの?
if 文はいらないと思うし。
646デフォルトの名無しさん:2006/04/26(水) 15:18:40
>>645 書いたヤツは多分その意味わからんだろうなw
647デフォルトの名無しさん:2006/04/26(水) 16:10:43
>>642
全部関数に書いて、gotoの代わりにreturnではどうだ。
648デフォルトの名無しさん:2006/04/26(水) 17:32:35
>647
do { } while(0); の中に書いて break; するって言うのもあるっけ。
649デフォルトの名無しさん:2006/04/26(水) 18:48:13
>>645,646
理解するのに2分かかったw

>>642はHSPばっかやってたんだろうなあ。
650デフォルトの名無しさん:2006/04/26(水) 19:24:29
VCはデフォルトだと警告出してくれない。BCCは出す。
651デフォルトの名無しさん:2006/04/26(水) 23:36:19
fwriteでビットマップの画像表示させたいんだけど、
画像が斜めに表示される場合は何が原因ですか?ヘッダー情報が悪い??
652デフォルトの名無しさん:2006/04/27(木) 00:15:31
構造体の配列なんだけど、
struct A a[i];
↑みたいな感じで配列に変数ふることはできないんですか?
ビルドするとerror C2143: 構文エラー : ';' が '[' の前に必要です。
って書かれるんだが・・・
653デフォルトの名無しさん:2006/04/27(木) 00:23:17
>>651
何がしたいんだかよくわからんけど、
ラスタのバイト数が4の倍数になってないとか。
654デフォルトの名無しさん:2006/04/27(木) 00:28:57
>>652
C99ならできるよ
655デフォルトの名無しさん:2006/04/27(木) 00:30:16
>>654
すみません。C99って・・・?
656デフォルトの名無しさん:2006/04/27(木) 00:31:41
Cの新しい規格
C99で検索すれば解説サイトがみつかると思う
657652:2006/04/27(木) 00:31:48
>>655は自己解決しました。

開発言語がANSI-Cなんですが、できますか?
658652:2006/04/27(木) 00:32:37
レス書いてるうちに656きてましたね。
すみません。
659デフォルトの名無しさん:2006/04/27(木) 00:54:53
>>652
俺も通ったな
つーかそのエラーメッセージ、多分MSのやつだよな?
660652:2006/04/27(木) 02:59:28
>>659
Microsoft Visual C++です。
これでANSI-Cのをしてます。
ANSI-Cでやるように仕様書に書いてあるので・・・
661デフォルトの名無しさん:2006/04/27(木) 03:04:19
>>660
C99 も C89 も ANSI になってたとおもうが、
まぁ MSVC なら C89 ってことになるんだろうな。

ほんとに ANSI C89 でやりたいんなら、 malloc() するしかないだろう。
662デフォルトの名無しさん:2006/04/27(木) 03:12:18
>>660 多分前後のコードおかしいからちょっとさらしてみ?
663デフォルトの名無しさん:2006/04/27(木) 04:27:35
前の行に;が抜けてるだけじゃね?
664デフォルトの名無しさん:2006/04/27(木) 05:54:56
mutableにするとconst関数内でも、const_iteratorが指す先だったとしても変更可能なの?
665デフォルトの名無しさん:2006/04/27(木) 06:39:14
struct unko{
 int amount;
 mutable float smell;
 unko(n=0,f=0){
  amount=n;
  smell=f;
 };
}
class Anus{
 unko kuso;
 Anus(){ koso=unko(5,5.0);};
 void BlowUnko() const {kuso.smell-=.1;};
 void Blow(const unko&shit){ shit.smell-=.1;};
}


どちらもsmellは変更可能ですか?
666652:2006/04/27(木) 07:58:34
#include <stdio.h>

struct member{
long id;
char name[20];
char kana[20];
char tel[10];
};

int main(){
int i;
int num;

scanf("%d", &num);

if(1 <= num && num <= 50){
for(i = 0; i < num; i++){
       struct member[num];
}
}
else{
printf("×\n");
}

return 0;
}

こんな感じ
667652:2006/04/27(木) 08:10:30
書いてること違ったかも・・・
struct member[num];
上の部分mallocなどで構造体の配列の領域確保しようとしてたのに変に書いてしまった。
正しい解答どなたか書いてみてくれませんか?
668デフォルトの名無しさん:2006/04/27(木) 10:38:27
>>667
なぜ自分で書いてみない?
669デフォルトの名無しさん:2006/04/27(木) 11:03:26
C++でnewを使ってとあるクラスの配列を作りたいのですが、その際に
パラメーターを渡す事はできるのでしょうか?

例えば、
string* str = new string("test"); // stringを一つだけ作成、"test"をパラメーターとして渡す
string* str = new string[100]; // stringを100個作成、パラメーターは無し

は分かるのですが、
こうゆう事はできますか?

string* str = new string("test")[100];

コンパイルできないので間違っているのは確かなのですが…
670デフォルトの名無しさん:2006/04/27(木) 11:12:19
>>669
仕様上、できません。
671デフォルトの名無しさん:2006/04/27(木) 11:30:54
そこを何とか…
672デフォルトの名無しさん:2006/04/27(木) 11:50:43
std::vector<std::string> vec(100, "baka");
673デフォルトの名無しさん:2006/04/27(木) 11:54:27
std::vector<string*> str;
for (int i=0; i<100; i++) str.push_back(new string("test"));
674デフォルトの名無しさん:2006/04/27(木) 11:58:20
string* str = (string*)new char[ sizeof(string)*100 ];
for( int i = 0; i < 100; i++ ){ new (str + i) string( "test" ); }
でも placement new はトリッキーよね。
675デフォルトの名無しさん:2006/04/27(木) 12:01:25
extern "チラシの裏" {
 さて、Effective C++ 第3版フライング発売探してくる。
}
676デフォルトの名無しさん:2006/04/27(木) 12:17:06
何が追加されてるんだっけ?
677デフォルトの名無しさん:2006/04/27(木) 13:40:54
>>674
それをやると、オブジェクトの解体とメモリの解放が非常に面倒になる
678674:2006/04/27(木) 14:01:30
上の場合、後処理はこうね。
for( int i = 0; i < 100; i++ ){ (str + i)->~string(); }
delete (char*)str;
まぁやめた方がいいわね。
679デフォルトの名無しさん:2006/04/27(木) 15:54:11
GETRVALUEとか遅くない?
680デフォルトの名無しさん:2006/04/27(木) 15:59:51
これが解けません、助けて↓
入力した数の分だけの三角形を作成するプログラムを作成しなさい。

実行例
数値を入力してください。
5
*****
****
***
**
*
教えてエロイ人!!
681デフォルトの名無しさん:2006/04/27(木) 16:29:08
1 から 10 位までは if 文で分岐してベタで書いて、
それ以上は無限ループにすればいいんじゃないか?
682デフォルトの名無しさん:2006/04/27(木) 16:40:04
>>666 お茶吹いた
683デフォルトの名無しさん:2006/04/27(木) 16:57:40
>>680
int main(int argc, char* argv[])
{
  int n;
  printf("数値を入力して下さい。\n");
  scanf("%d", n);
  switch (n) {
    case 5:
      printf("*****\n");
          // fall through
    case 4:
      printf("****\n");
          // fall through
    case 3:
      printf("***\n");
          // fall through
    case 2:
      printf("**\n");
          // fall through
    case 1:
      printf("*\n");
      break;
  }
  printf("教えてエロイ人!!\n");
}
最新技術 fall through を使ってみました!
684683:2006/04/27(木) 16:58:24
…ゴメン、あんま面白くなかった。
685デフォルトの名無しさん:2006/04/27(木) 17:34:29
とりあえずツッコミ
×scanf("%d", n);
○scanf("%d",&n);
686デフォルトの名無しさん:2006/04/27(木) 18:17:35
これが精一杯。

#include <stdio.h>

void put_a(int n){
char mes[2] = "*\n";
printf("%1.1c",mes[(0 < n--)? 0 : 1]);
}

#define put_m(funcname1,funcname2) \
void funcname1(int n){ \
funcname2(n--); \
if(0<=n){ \
funcname1(n); \
}else{ \
return; \
} \
}

put_m(put_b,put_a);
put_m(put,put_b);

int main(){
int n;
printf("数値を入力して下さい。\n");
scanf("%d",&n);
put(n);
return 0;
}
687デフォルトの名無しさん:2006/04/27(木) 18:28:58
CPadを使って

#include <stdio.h>

main()
{
int a = 9;
if (a%2 == 0);
printf("%dは偶数です。\n", a);
else
printf("%dは奇数です。\n");
}

と、書いてコンパイルしようとしたのですが、メッセージの欄に
警告 W8019 p46.c 7: コードは効果を持たない(関数 main )
エラー E2054 p46.c 9: else の位置が誤っている(関数 main )
警告 W8070 p46.c 11: 関数は値を返すべき(関数 main )
*** 1 errors in Compile ***
と表示されてしまいます。さらに、もう一度コンパイルしようとすると、
実行画面で 9は偶数です と表示されます。
どなたか原因の分かる方、助言をお願いいたします。
当方、XP、CPadのバージョンは2.31です。
688デフォルトの名無しさん:2006/04/27(木) 18:35:23
>>687
・初心者、慣れていないプログラマはブロックを省略せずに書こう。
#1行野郎なんて未だ早過ぎる。
・main()の仕様は規格に則って正確に。
#>687のような書き方は何に由来する? 本の通りならその本は棄てるべき。
689デフォルトの名無しさん:2006/04/27(木) 18:36:58
#include <stdio.h>

main(){
int a=9;
puts(a&1?"奇数":"偶数");
}

書き直してあげた
690デフォルトの名無しさん:2006/04/27(木) 18:38:50
間違いは3カ所

×if (a%2 == 0);
○if (a%2 == 0)

×printf("%dは奇数です。\n");
○printf("%dは奇数です。\n",a);

return 0;が無い

691690:2006/04/27(木) 18:43:58
打ってる間に>688-689が指摘してくれてるな。
>本の通りならその本は棄てるべき。
捨てるのももったいないから古本屋に売って新しい本を買え。
692デフォルトの名無しさん:2006/04/27(木) 18:51:12
>688-690
ご助言ありがとうございます。
解決できました。
わたしの中で勝手に脳内変換されてしまったようで、
>690さんのように書き換えたら
うまくできました。
こんな質問に答えていただき、感謝します。
これだけで、1時間近く悩んでしまったものですから;;
今後気をつけます。
693683:2006/04/27(木) 20:31:51
>>685
うぁぁ…ここ10年使ってない関数を使うとコレだ。
指摘thx。
694デフォルトの名無しさん:2006/04/28(金) 09:52:43
scanfなんて大学でしか使わない罠。
695デフォルトの名無しさん:2006/04/28(金) 11:09:02
高速に動作させたきゃscanf
696デフォルトの名無しさん:2006/04/28(金) 12:21:00
プ
697デフォルトの名無しさん:2006/04/28(金) 14:15:43
プ
698デフォルトの名無しさん:2006/04/29(土) 01:56:44
こんばんわ、C歴一ヶ月の初心者です。
この度仕事でCを使う事になり、悩んでおります(´・ω・`)

固定長80バイトのファイルを読んで
エラーチェック→構造体に保存する処理なのですが、

下記の様なファイルがあった場合
<----------ファイル 80バイト--------->
NAME=NURUPO
ADRESS=TOKYO
KANRINO=1234,5678


【前提条件】
・レコードは左詰になっており空白は入らない。
・順番は決まっておりNAME→ADRESS→KANRINOの順。

'NAME='の場合は'='以降に続く文字が48文字以内の時に保存
'ADRESS='の場合は'='以降に続く文字が48文字以内の時に保存
'TEL'の場合は'='以降に続く数値をNUMERICチェック、
','より手前を番号1に保存、','より後を番号2に保存

とりあえず'='手前の文字列を取得して
whichとかで'XXXX'の時だったらエラーチェック処理→構造体に保存
の様ににやるのが良いのかな、、と思ってます。

情けないのですが'='以降の文字列取得に手間取っており、
ガチャガチャやってる内に処理が混乱してきてしまったので
宜しければご教授願います。
699698:2006/04/29(土) 02:17:58
とりあえず自分で出来る範囲でやっつけ。

ファイル読んで処理する辺り。

long func_fread(FILE *fp ,char parm[48]){
  char in[80+1];   /* 入力レコード */
  char temp[60+1];  /* 編集用レコード */
  int  i;       /* 添え字 */

  while(1){
    memset(in ,0 ,sizeof(in) ); /* 入力ファイル初期化 */
    memset(temp ,0 ,sizeof(temp) ); /* 編集用初期化 */

    fread(in ,80 ,1 ,fp);
    if(ferror(fp)){      /*ファイルreadエラー*/
      printf("File read error\n");
      return CON_ERROR;
    }
    if(feof(fp)){       /*ファイルEOF時*/
      printf("File is at end\n");
      return CON_EOF;
    }
    else{           /*レコード処理*/
      printf("in  = %s\n",in);
      for( i=0 ; in[i] != '=' ; i++ ){
        temp[i] = in[i];
      }
      printf("temp =%s \n",temp);
    /* ↓↓↓↓この辺りからエラー処理とか続ける予定です↓↓↓ */
    }
  }
}
700デフォルトの名無しさん:2006/04/29(土) 02:39:31
>>698-699
取りあえず、ファイル読み込みとか、よくあるエラーとか書かないけど。
あとは仕様が分かる範囲で。

fgets(in, sizeof(in), fp); // 最初の行を取得
while( !eof(fp) ) {
char *pName, *pValue;

pName = strtok(in, "="); // =より前の部分
pValue = strtok(NULL, "\n"); // =より後の部分

if( strcmp(pName, "NAME") == 0 ) {
if( strlen(pValue) <= 48 ) { /* 保存処理 */ }
} else if( strcmp(pName, "ADRESS") == 0 ) { // きっと ADDRESS
if( strlen(pValue) <= 48 ) { /* 保存処理 */ }
} else if( strcmp(pName, "TEL") == 0 ) { // KANRINOは?
// NUMERICチェックの意味が分からん
}
fgets(in, sizeof(in), fp); // 次の処理のために1行取得
}
701698:2006/04/29(土) 02:40:48
/*レコード処理*/ 以下の部分を覚え立てのポインタ版にしてみました。
後続の処理に繋げるにはどっちが良いのやら(´・ω・`)

  char temp[80+1]; /*編集用レコード60→80(´・ω・`)*/
  char *pin;
  char *ptemp;
  pin = in; /* 入力ファイルのアドレスをポインタに*/
  ptemp = temp; /* 編集用ファイルのアドレスをポインタに*/

      pin = in;
      ptemp = temp;
      for( ; *pin != '=' ; pin++,ptemp++ ){
        *ptemp = *pin
      }

続きを書いたら自分でもうpります。
今日はさすがに眠いのでオヤスミなさいませ。
702デフォルトの名無しさん:2006/04/29(土) 02:54:43
>>700さん
ご回答感謝です!

しばらく考え込みながら見入ってました。。(´・ω・`)
fgetsとかstrtok等初めて見る関数もあるのですが、
調べて試してみたいと思います。
(コメントがわかりやすく書いてるが嬉しいっす)

ちなみにNUMERICチェックと言うのは
数字でないとエラーにする事で、英語とかが入るとダメみたいです。
703698:2006/04/29(土) 02:58:21
ぬぁ、自分で説明を間違ってたのですね。スミマセン。


'KANRINO'の場合は'='以降に続く数値をNUMERICチェック、
','より手前を番号1に保存、','より後を番号2に保存

×
'TEL'の場合は'='以降に続く数値をNUMERICチェック、
','より手前を番号1に保存、','より後を番号2に保存

それでは今度こそおやすみなさいませ(´・ω・`)
704デフォルトの名無しさん:2006/04/29(土) 04:53:36
>>698
・行単位の処理ならfread()よりfgets()を使うべき。
・大抵はferror(), feof()を使わずともfgets()の戻り値をチェックすればことが足りる。
・規約で決まっているのでもなければ、memset()はしない方がいい。
#予め領域をクリアしてしまうことで潜在的なバグを隠してしまう可能性がある。
#こういうのを「安全志向のプログラミング」とする向きもあるが、
#実態は「後ろ向きの安全志向(≒危険)」と考えるべき。
・文字列のコピーは、部分か全体化を問わず自前で書かない。
#strcpy()、strcat()、sprintf()があれば事が足りる。
・strtok()よりはsscanf()がお勧め。strtol()も数字文字のチェックに使えるぞ。
#strtok()はスレッドセーフではない、領域を破壊する、点で要注意。

なので、>699や>701は捨てて書き直すことお勧め。
ここは宿題スレでもないから敢えて漏れのコードは今は載せない。

それにしても、丁度四月入社かなにかでC歴一ヶ月なのだろうけど、
一ヶ月でこのレベルなのだとしたら余程教え方か教わり方が悪いと思う。
正直GWで身の振り方を考えたほうがいいと思う。
705デフォルトの名無しさん:2006/04/29(土) 11:35:01
C歴一ヶ月の人間にスレッドセーフ云々なんて言及してもしょうがないだろ
習得期間なんて個人差があるんだから気にするな
一年やってそれならヤバいけど
706698:2006/04/29(土) 13:25:10
>>704
なるほど、参考になります。

規約と言う点では
・str〜系の関数よりmem〜系の関数推奨(今規約が手元に無いのでうろ覚え)
・ホストと呼ばれる古い環境なので読むファイルに改行コード\n'等の意識が無い
  固定長'80'のレコードが延々と続きます。
  文字列の終わりを示す'\0'も(恐らくですが)入っていない。
 (参考にした処理がfgetsでは無くfreadを使っていたのも理由があるのでしょうか・・?)

>> 一ヶ月でこのレベルなのだとしたら余程教え方か教わり方が悪いと思う。
鋭いです。くぅ、やはりそうですか(´・ω・`)

実はC歴一ヶ月と言うのは誰からも教わらずに、
入門用のCの本を自分で読んで一ヶ月独学の状態です。
なのでコーディングする際に何がダメで何が良いのかを指摘して頂けるのは非常に助かります。

とりあえず1から見直して作り直しまふ。
707704:2006/04/29(土) 17:05:44
うーむ。
>規約と言う点では
>・str〜系の関数よりmem〜系の関数推奨(今規約が手元に無いのでうろ覚え)
おいおい……
#この手の規約の悪いところは、memcpy()を使う前にstrlen()で長さを調べるなど、
#本質を見失った運用になりがちな点などが挙げられる。
#何故そういう規約なのか誰も知らないようならマジやばいぞ。

>・ホストと呼ばれる古い環境なので読むファイルに改行コード\n'等の意識が無い
>  固定長'80'のレコードが延々と続きます。
あーすまん。行単位だとばかり思ってミスリードした。
#しかし、ホスト環境だからといって改行のないデータって……
#なんだかアナクロで不毛な環境のメンテナンスでもするのか?

>  文字列の終わりを示す'\0'も(恐らくですが)入っていない。
そういうことなら普通入れないだろうねぇ。

> (参考にした処理がfgetsでは無くfreadを使っていたのも理由があるのでしょうか・・?)
それなら確かにfread()だろうね。fread()してsscanf()でばらすのが一番楽で比較的安全かな。

>実はC歴一ヶ月と言うのは誰からも教わらずに、
>入門用のCの本を自分で読んで一ヶ月独学の状態です。
正直すまんかった。
自力でやっているならそんなもんかな。

>なのでコーディングする際に何がダメで何が良いのかを指摘して頂けるのは非常に助かります。
いやまぁ、こちらは大した手間じゃないから。

>とりあえず1から見直して作り直しまふ。
作り直しもいいけど、一ヶ月も自習させて放置するような会社と心中したいか考えたほうがいい希ガス。
708698:2006/04/30(日) 22:32:38
とりあえず(´・ω・`)
freadでの処理は上においてやっているので
ホストで使えるかはわかりませんがfgetsを使用してます。

long func_fread(FILE *fp ,char parm[48]){

  char in[60+1];
  char temp[60+1];
  int i;
  long chkrtn;
  char *pin; /* 入力ファイルのポインタ*/
  char *ptemp; /* 編集ファイルのポインタ*/
  char *pName , *pValue1 , *pValue2;
  pin = in; /* 入力ファイルのアドレスをポインタに*/
  ptemp = temp; /* 編集用ファイルのアドレスをポインタに*/

  while (fgets(in, sizeof(in), fp) != NULL){
    pName = strtok(in, "="); /* =より前の部分を取得 */
    pValue1 = strtok(NULL, " ,\n"); /* '='以降の部分を' 'と'\n'まで取得 */
    pValue2 = strtok(NULL, ",, ,\n"); /* '='以降の部分を','と' 'と'\n'まで取得 */

    /* NAMEの処理 */
    if( strcmp(pName, "NAME") == 0 ) {
      if( strlen(pValue1) <= 48 ) {
        printf("NAME = %s\n", pValue1);
      }
    }
709698:2006/04/30(日) 22:34:14
    /* ADDRESSの処理 */
    if( strcmp(pName, "ADRESS") == 0 ){
      if( strlen(pValue1) <= 48 ) {
        printf("ADRESS = %s", pValue1);
      }
    }
    /* KANRINOの処理 */
    if( strcmp(pName, "KANRINO") == 0 ){
      if ( (chkrtn = func_isdigit(pValue1)) != 0 ){ /* KANRINO1の数字チェック */
        printf("KANRINO1は数字です = %s\n", pValue1);
      }
      else{
        printf("KANRINO1は数字ではありません = %s\n", pValue1);
      }
      if ( (chkrtn = func_isdigit(pValue2)) != 0 ){ /* KANRINO2の数字チェック */
        printf("KANRINO2は数字です = %s\n", pValue2);
      }
      else{
        printf("KANRINO2は数字ではありません = %s\n", pValue2);
      }
    }
  }
  return CON_NORMAL;
}
710698:2006/04/30(日) 22:35:19
/************************************************/
/* func_isdigit
  処理概要:NUMERICチェック処理
      文字数分NUMERICチェックを行う
  I/O
    char *cheak_obj (i/ ) チェック対象文字列
    戻り値 0:数字以外 */
/************************************************/
long func_isdigit(char *cheak_obj){

  long isdigit_rtn;
  unsigned long i; /* 添え字(文字数分) */
  unsigned long cLength; /* チェックする文字列の長さ */

  cLength = strlen(cheak_obj); /* チェックする文字列の長さを取得 */

  for ( i=0 ; isdigit_rtn == 0 || i <= cLength ; i++ ) {
    if (isdigit(cheak_obj[i]) == 0 ) { /*チェック文字列に数字以外がある場合*/
      return 0;
    }
    return 1;
  }
}
711698:2006/04/30(日) 22:41:52
>>704さんへ
>> #何故そういう規約なのか誰も知らないようならマジやばいぞ。
ちょっと規約関係については確認してきます。
ただ現場でC言語を扱える人が1人しかいないので(その人はGW中はオヤスミ)
若干調べるのは遅くなりそうです。

>> #なんだかアナクロで不毛な環境のメンテナンスでもするのか?
ええ、巨大さ故に下手に手を入れられず古い環境のまま残っているシステムです。
今回の場合ですとI/F部分のみに手を入れて現行ホストシステムはそのまま流用します。

>> 作り直しもいいけど、一ヶ月も自習させて放置するような会社と心中したいか考えたほうがいい希ガス。
ご心配有り難う御座います。
ただ今回の件に関しては自ら首を突っ込んで「Cでやります」的な経緯があるので、
自業自得なのです。他言語の勉強も兼ねてって事で(´・ω・`)

そんなこんなで今日早速2冊目の本を買ってきました。
「図解C言語 ポインタの極意」とか言う本です。
1冊目がやけにわかりにくかったのですが、こっちはわかりやすいです。

そして、わざわざレスを下さった
>>700さん、>>704さん、>>705さん感謝です。
str関数,strlokを使用したままなのでスレッドセーフ云々については
今後の勉強の課題としておきます。

聞く人がいない環境で一人で作っていると詰まった時に
かなり無駄な時間を取る事が多く、今回ここに来てホント助かりました。

仕事中はネットは出来ないので
平日昼間のレスは出来ませんがまたきます(´・ω・`)ノ
712704:2006/04/30(日) 23:08:37
// 適当に組んでみた。関数が一つ足りないけどそこは適当に。
// boolがないならtypedeef enum {false, true} bool;とでもしてくれ。
bool isStringNumber(const char * str) {
char * ptr;
strtol(str, & ptr, 0);
return * ptr == '\0';
}
bool getKeyWordAndValue(const char * str, char * keyWord, char * value) {
return sscanf(str, "%[^=]=%[^\n]", keyWord, value) == 2;
}
void parseName(const char * value) {
if (strlen(value) <= 48) printf("NAME = %s\n", value);
}
void parseKanri(const char * value) {
char value1[81], value2[81];
if (sscanf(value, "%[^,]s,%[^\n]", value1, value2) == 2) {
printf("KANRINO1 is %s. KANRINO1 = %s\n", isStringNumber(value1) ? "legal" : "illegal", value1);
printf("KANRINO2 is %s. KANRINO2 = %s\n", isStringNumber(value2) ? "legal" : "illegal", value2);
}
}
void parse(FILE * fp) {
char buf[81];
while (fgets(buf, sizeof(buf), fp) != NULL) {
char keyWord[81], value[81];
if (getKeyWordAndValue(buf, keyWord, value)) {
if (strcmp(keyWord, "NAME") == 0) { parseName(value);
} else if (strcmp(keyWord, "ADRESS") == 0) { parseAdress(value);
} else if (strcmp(keyWord, "KANRINO") == 0) { parseKanri(value);
}
}
}
}
713698:2006/04/30(日) 23:30:18
>>704さん

BOOL型(初めて見る名前だったのでとりあえずググって調べてきました)と
fgets、sscanfで実行してるのですね。

まだ完全に理解出来てないので暫く追ってみますが、
明日ホストの方で色々やってみたいと思いまふ(´・ω・`)

ホント有り難う御座います。
714超初心者:2006/05/01(月) 14:13:00
すみません 上級者の方にお聞きしたいです(ノд・。)
Borland TurboC++5.0Jという化石物のソフトで書いて
コンパイルはいくんですが実行してプロセスが作成できないとエラーになります。
昨日は実はエディタが開いて実行できたんですけど なんかできなくなりました。
どうしたら治るんでしょうか?教えてください宜しくお願いします。
m(_ _)m
715デフォルトの名無しさん:2006/05/01(月) 16:39:00
たぶん、原因がわかれば治るんじゃないかなぁ。
716デフォルトの名無しさん:2006/05/01(月) 19:55:58
・初心者とわざわざ書く
・エラーメッセージを貼らない
・環境をキチンと書かない
717デフォルトの名無しさん:2006/05/01(月) 20:01:38
コンピュータがいかれたかも知れないから、
どっかから別の 98 を調達して来た方がいいんじゃないか?
718デフォルトの名無しさん:2006/05/01(月) 23:33:26
>>698
似た境遇だ・・・お互いがんばろうぜ
719デフォルトの名無しさん:2006/05/01(月) 23:56:32
コンパイルはともかく、リンクは成功したの?
(EXEファイルはできてる?)

あと、プロセスが生きてると、EXEファイルに上書きできない。
これが一番典型的なオバカパターン。
パソコンの再起動はしたよね?
720698:2006/05/02(火) 00:00:27
>>718
今日も今日とて職場で紙出ししたソースを家に帰って手打ちして実行です。
(FD等の外部機器が一切使用禁止の為)

久しぶりにガンガッテマス。
そちらも頑張って(´・ω・`)ノ
721デフォルトの名無しさん:2006/05/02(火) 00:09:14
>>720
持ち出しちゃ駄目なんだろ?禁止されてる理由を考えろ。
722デフォルトの名無しさん:2006/05/02(火) 00:10:55
>>720
一応念のために聞くが、会社(アカウント)から自宅(アカウント)へのメールも禁止されているということでいいか?
ますます自分の身を削ってまで付き合うべき会社とは思えなくなってきたのだが。
723デフォルトの名無しさん:2006/05/02(火) 00:16:46
どうして>>698はけなげに仕事してるん?
724698:2006/05/02(火) 00:36:42
>>721
うーむ、その話は派生すると長くなりそうですが、
とりあえずキレイ事言ってたら終わらないってのがあります。

>>722
外部へは一切アクセス不可です、何とも不便です

>>723
健気って程でも無いですよ〜。
ただ自分でやると言ったからやってる、、って所でしょうか(´・ω・`)。
725デフォルトの名無しさん:2006/05/02(火) 00:52:40
>>724
仕事が終わらなくなるような規則を施工しているやつらに責任を取らせろ。
そんな規則があっても何とかなると思われちゃ、迷惑だ。
726デフォルトの名無しさん:2006/05/02(火) 01:13:54
自分からやらないやつはやらせたって使い物にならん。
自分でやると言う人間を支援するのが会社と言う組織だ。
支援せずに足枷ばかり与える組織は、強制労働所くらいで沢山だ。
727698:2006/05/02(火) 01:48:00
周囲に助けが求められないからこそ、ここに来たのですよ〜(´・ω・`)
規則を変えるのは非常に難しいですが、
お陰様でこのソースを作る事なら何とか出来そうです。

とりあえず昨日>>710にて上げたNUMERICチェックですが、
isdigit関数がint型なのでchar型をチェックする場合
unsigned char型にキャストする必要がありました。
一応訂正しておきます。

  unsigned long i; /* 添え字(文字数分) */
  unsigned long cLength; /* チェックする文字列の長さ */
  
  cLength = strlen(cheak_obj);

  for ( i=0 ; i <= cLength ; i++ ) {
    if (isdigit((unsigned char)cheak_obj[i]) == 0 ) { /* unsigned char型にキャスト */
      return 0;
    }
    return 1;
    }
  }
728デフォルトの名無しさん:2006/05/02(火) 10:43:01
>周囲に助けが求められないからこそ、ここに来たのですよ〜(´・ω・`)
企業人としては失格だな。
それ以前に企業自体が失格っぽいが。
729デフォルトの名無しさん:2006/05/03(水) 16:14:13
C言語の勉強をしているとき、本やウェブサイトでは
プロトタイプ宣言が ”宣言” で関数本体は ”定義” という表現がされていたように思います。
C++になると、クラスの中に一行書くのが ”定義” で
つらつらと中身を記すのは ”実装” と表現されるのが一般的な気がします。

私の勘違いかもしれませんが、CとC++では
定義 という言葉の位置づけが逆転しているような気します。
何か理由があるのでしょうか?
730デフォルトの名無しさん:2006/05/03(水) 16:28:37
>C言語の勉強をしているとき、本やウェブサイトでは
>プロトタイプ宣言が ”宣言” で関数本体は ”定義” という表現がされていたように思います。
これはCでもC++でも正しい。(ただし定義は全て宣言でもある)

>C++になると、クラスの中に一行書くのが ”定義” で
>つらつらと中身を記すのは ”実装” と表現されるのが一般的な気がします。
classキーワードに続けて書くのが「クラスの」定義で、
処理の中身を記すのは「クラスの」実装。

クラスの定義中にはメンバ関数の宣言が含まれるし、
クラスの実装とはすなわちメンバ関数の定義の事。
731デフォルトの名無しさん:2006/05/03(水) 16:33:01
ああ、なるほど
判りました
ありがとうございます
732デフォルトの名無しさん:2006/05/04(木) 08:24:16
ふむふむ
733デフォルトの名無しさん:2006/05/04(木) 11:30:24
言葉遊びみたいだ脳。
試験に出されたら絶対点落とすわ、漏れ。
734デフォルトの名無しさん:2006/05/05(金) 14:36:03
宣言でも、定義でも、実装でも何でもいいや。
プログラマならコードで語る。これ最強
735デフォルトの名無しさん:2006/05/05(金) 23:59:27
思考停止が最凶?
736デフォルトの名無しさん:2006/05/06(土) 15:43:42
if (data == 2412 ||
data == 2430 ||
data == 2514 ||
data == 2521 ||
data == 2539 ||
data == 2554 ||
以下、数十行続く・・・
{
処理
}

data にはファイルを1行毎に読み込んだ数値があって、その数値は分秒を表してる。
その特定の分秒だけの時に処理部分を実行したかったからこんなんなったんだけど、
これ以外思い浮かばないよ。何かいい案ないですか?
737デフォルトの名無しさん:2006/05/06(土) 16:08:12
>>736
とりあえずチェックルーチンは関数化したら?
738デフォルトの名無しさん:2006/05/06(土) 16:18:51
>>736
何が不満なの?
739736:2006/05/06(土) 16:22:05
>>737
う、うーん
>>738
これだけで80行逝っちゃってるからなんかヤダ
740デフォルトの名無しさん:2006/05/06(土) 16:26:29
>>739
配列定義して検索すれば?
と思ったけど、行数が不満なら解決にならんな。
741736:2006/05/06(土) 16:34:20
「特定の分秒」が何の規則性も無い時点で仕方ないのかな
742デフォルトの名無しさん:2006/05/06(土) 16:40:54
>>741
行数がヤダってんなら1行にいっぱい書けよ。
743デフォルトの名無しさん:2006/05/06(土) 16:42:59
>>736
その整数値を配列に入れて、ループでチェックすればいいじゃん。
744デフォルトの名無しさん:2006/05/06(土) 16:46:08
いっそその数値をファイルに入れちゃえよ。
745デフォルトの名無しさん:2006/05/06(土) 17:02:12
少なくとも、数十行のif文がかっこ悪いことだけは確か。

規則性のないデータなら、短くすることは、原理的に無理。(圧縮とかは別にして。)
int80個の配列だったら、ソースで5〜6行、コンパイルしても320バイトだろ?
腹くくったら?
それと、この「特定の分秒」が何を示しているのかしらんが、
場合によっては、ファイルから読むべき性質の値かもしれん。

#ゲームでのキャラの移動パターンか何かと推測するが、
#それだったら、配列かファイル。if文イクナイ。
#俺はデータ類はハードコードせずにファイルから読ませる派だが。どっちでもいい。

const int table[80] = { 2412,2430,…}; //配列をメモリに作成
for (int i=0;i<80;++i) { if (table[i]==data) { 処理してみそ; break; } } //1番から80番まで検索汁
746736:2006/05/06(土) 17:03:11
>>743!!

int trigger[] = {2412, 2430, ・・・・};

for (int i = 0; i < sizeof(trigger)/sizeof(int); i++){
if (data == trigger[i]){
処理
}
}

ソレダ。すげーなんかスッキリした。ありがとうありがとう。他のみんなのも検討してみる。
747745:2006/05/06(土) 17:04:07
書いてるうちにすごいかぶった…。orz
748736:2006/05/06(土) 17:06:57
>>747
書いてる途中はリロードして確かめてが書き込み直前でリロードするの忘れてたw
ファイルから読ませるのも検討してみる。ありがとうありがとう。
749740:2006/05/06(土) 17:12:18
なんで俺はスルーされたんだろう。
750736:2006/05/06(土) 17:15:54
>>749
いや、ちとレベルが高そうだったので・・・
751740:2006/05/06(土) 17:33:52
なんだそりゃ?まぁいいや。

線形サーチを見ると bsearch() とか std::binary_search() とかしたくなるな。
配列をソートした状態で入力するか、事前にソートできればの話だけど。

毎秒1回の処理ならどうでもいいか。
752736:2006/05/06(土) 17:59:31
>>751
なんかサーチ使ういい機会に思えてきた。二分木検索使ってみる。
753デフォルトの名無しさん:2006/05/10(水) 01:20:11
Class hoge{
 なんたらどうたら
};

がエラーでルーとやけ酒のみながらやってたら
Class じゃなくて class なのに気が付いたorz
754デフォルトの名無しさん:2006/05/30(火) 18:50:39
ソースの解析を進めていく上でよくわからない箇所
があるのでお尋ねします。

読んで行く上で「_T(ほにゃらら)」というのをよく
見かけるのですが、Webで使い方について調べてみて
いるのですが調べ方が悪いのかうまく見つけられません。

そもそもこれは何なのか。またどのような使われ方を
するのか教えていただければ幸いです。
755デフォルトの名無しさん:2006/05/30(火) 19:01:15
756デフォルトの名無しさん:2006/05/30(火) 23:56:37
>>753

予約語を強調表示しないの? エディタ/IDEは何使ってるの?
757デフォルトの名無しさん:2006/05/31(水) 08:43:45
C/C++ってC言語とC++の両方という意味なんですか?
758デフォルトの名無しさん:2006/05/31(水) 08:57:56
両方或いはどちらか一方。
759デフォルトの名無しさん:2006/06/23(金) 14:44:43
クラスHogeがあって

Hoge hogeって宣言するのと
Hoge *hogeって宣言してnewするのだったらどっちがいいですか?
760デフォルトの名無しさん:2006/06/23(金) 17:18:27
必要がないならわざわざnewしてdeleteする手間を掛けることもない。
761デフォルトの名無しさん:2006/06/23(金) 21:29:11
>>759
ヒント:
int matrix[1024 * 1024]; と宣言するのと
int *matrix = malloc(sizeof(int) * 1024 * 1024); と
どっちがいいと思う?

答え:
ちんこ
762デフォルトの名無しさん:2006/06/23(金) 22:26:26
ちんことうんこはいつでも言えるがまんこはキー叩くのにも躊躇する俺様がご光臨ですよ。

new する必要があるのは
・スタックが足りない等のメモリ上の都合がある場合
・直前までサイズがわからず動的確保に頼るしかない場合
など、必要に駆られて行うのが普通。

必要なければしないのが吉。
763デフォルトの名無しさん:2006/06/24(土) 07:32:42
>>762
>・スタックが足りない等のメモリ上の都合がある場合
こっちはいいとして、
>・直前までサイズがわからず動的確保に頼るしかない場合
その場合はstd::vector使えばいい気もす。

で、一つ追加。
・クラスライブラリの設計者がJava上がりなどの理由でnewするように設計されている場合
764デフォルトの名無しさん:2006/06/24(土) 14:26:42
必ずしもC++ではnewするって訳でもなく、臨機応変に対応しろってことですか。
765デフォルトの名無しさん:2006/06/24(土) 14:48:59
C++の奇妙な点の一つで、new および delete は予約語の癖して、
実装はライブラリレベルで行われてるんだよ。

で、new は動的なメモリ確保と、割り当てられたメモリへのコンストラクタ呼び出しを行い、
delete はデストラクタの呼び出しとメモリの開放を行う仕掛け。

極端な話、中では malloc と free ないしは類似のメモリ確保関数が呼び出されとるのが普通。

よって回答は >>761 = ちんこ。
766デフォルトの名無しさん:2006/06/24(土) 17:42:02
>>765
実装はコンパイラレベルだろ。
別に奇妙でも何でもないと思うが。
767デフォルトの名無しさん:2006/06/24(土) 18:39:03
でも確かにメモリ確保・解放はoperator new/delete ([])が担っているのは事実。
768デフォルトの名無しさん:2006/06/24(土) 18:40:46
ライブラリレベルでもコンパイラレベルでもどっちでもいいけど
libstdc++をリンクしないと、リンク時に undefined reference to `operator delete(void*)'
のようなエラーが出るのには驚いた
769デフォルトの名無しさん:2006/06/24(土) 18:49:10
割り算がこっそりライブラリコールになってるようなもんだろ。
770デフォルトの名無しさん:2006/06/24(土) 22:11:43
コンパイラレベルでやってる処理系は見たこと無いな。
まあどーでもいいんだけどね。
771デフォルトの名無しさん:2006/06/24(土) 22:40:28
そもそもコンパイラレベルとかライブラリレベルとか、どういう区別だ?
772デフォルトの名無しさん:2006/06/25(日) 00:04:02
コンパイラレベルだと吐き出されるコードと直結することになる。
ライブラリレベルなら文字通り責任はライブラリにあることになる。

たとえば仮想関数がvtableで実装されてるのはコンパイラレベル。

で、コンパイラが司るところの言語仕様の枠から見ると、
専用の例外が用意されてたりlibstdc++のリンクを必要とする
newやdeleteは、ある意味鬼子。

これはnewやdeleteの実装が処理系によって大きく変わってくることを意味したりもするので、
使用に際してライブラリの癖…メモリ確保の効率とか確保のために必要なCPU時間とか…
にまで気を回さなければならない状況も考えられないわけじゃない。

自前でnewやdeleteを作ろうとした場合、<new>の実装内容に首を突っ込まなければ
ならない場合なんてのも往々にしてある。

C++を使う上での一般的な知識の枠の外を要求されることも無いではないあたり、
パラノイア的に粘着するなら、newもdeleteも標準ライブラリ扱いの項目でこそあれ、
組み込み予約語の枠に収まってるのは少々おかしいくらいだぞ、と。

まあ、そんな毒にも薬にもならない話。
773デフォルトの名無しさん:2006/06/25(日) 00:14:46
>>772
特定の実装の話を言語一般の話のように言うなよ。
774デフォルトの名無しさん:2006/06/25(日) 00:17:10
あんまり例外ないと思うけど?
775デフォルトの名無しさん:2006/06/25(日) 00:22:07
比較的古いコンパイラなんかは例外のうちかな。
bad_alloc 例外投げる以前の奴とかがそうだ。

new がライブラリ実装に以降したのには歴史的な事情もあって、
単にメモリ枯渇の時にゼロ返すだけじゃ色々不都合だってんで
例外を投げるようにしたんだが、旧来の方式との互換も保ちたい、
それもコンパイラオプションで切り替えられるとかのレベルじゃなく
ひとつのコード内でどちらも選択可能にするためにコンパイラの中から
追い出した、なんてのがあるよ。
776デフォルトの名無しさん:2006/06/25(日) 00:30:18
>>772
g++ 使えば -lstdc++ なんて要らない。
これならコンパイラレベルだね。
777デフォルトの名無しさん:2006/06/25(日) 00:44:24
最近は new の引数チェックをコンパイラがやったり、
一概にどっちって言い切れる存在じゃないみたいだね。
778デフォルトの名無しさん:2006/06/25(日) 01:08:17
言語自体から見ればどっちでもコンパイラの実装の一部。
気にしないで済めばそれでいい。
779768:2006/06/25(日) 01:21:43
>>776
俺が使ったのめっちゃg++だったんですけど。
勝手にリンクされただけじゃなくて?
780デフォルトの名無しさん:2006/06/25(日) 01:23:18
>>779
g++ なら勝手にリンクされるから、自分で libstdc++ を指定する必要は無いはずだよ。
781768:2006/06/25(日) 02:04:52
>>780
ごめんね。
その当時のMakefileを見直したらリンカに$(CC)を指定してた。
今g++に変更してみたら自分で指定しなくても勝手にstdlibc++はリンクされたよ。

でも、これでコンパイラレベルと言えるとは思わないなぁ。
あ、いや、どっちでもいいんだけど。
782デフォルトの名無しさん:2006/06/25(日) 02:06:10
typoごめん
783デフォルトの名無しさん:2006/06/25(日) 11:29:54
コンパイラ系からライブラリを簡単に引きへがせるかっていうと、そう簡単なもんじゃないからね。
g++みたいに少々特殊な経緯をもつコンパイラならなおの事。
少し話がずれるけど、テンプレートみたいな実装の難しい部分に関しては
ライブラリ側が大きく引きずられたりもするし。

new の内部で何やってるのかを知っておくのは、operator new のオーバーライドなんかを
必要としたときに役に立つわけだし、悪いトピックじゃなかった。
784デフォルトの名無しさん:2006/06/26(月) 18:07:51
C++はどの位置でも変数が生成できるけど、これってnewしてるからなん?
そうすると関数の頭で宣言するCの時とコスト的に差が無いのか気になる。
785デフォルトの名無しさん:2006/06/26(月) 18:11:59
>>784
C99でもそうだけど、あくまでもその場所で生成すると言う意味ではなく
その場所で生成したかのごとく振舞うと言うこと。
つまり、POD型なら関数入り口でスタックフレームを形成するので全く同じコードになる。
#コンストラクタが必要な場合でも、特に不利になるわけではない。
786デフォルトの名無しさん:2006/06/27(火) 11:34:15
>>785
d。勉強になりました。
787785:2006/06/27(火) 11:42:58
>>786
>785を一部訂正。
POD型なら常に同じコードと言うわけではなく、例えば次のようなコードの場合
よりタイトなコードになる可能性がある。
void func()
{
if (...) {
int a;
...;
} else {
int b;
...;
}
}
関数の先頭でint a, b;とすると二つの領域が確保される可能性が高いが、
このように書くとaとbが同時に存在しないことが保証されるので一つの領域を
使い回してくれる可能性がある。
#より賢いコンパイラでは結局同じになるかもしれないが。
勿論、オブジェクトの場合は別のコードになる筈だが。
788デフォルトの名無しさん:2006/07/07(金) 11:52:34
関数ポインタについて質問です。

classA::func()
classA::func(string)

これらポリモルフィズムの関数ポインタをそれぞれ取得するにはどうしたらよいでしょうか。
789デフォルトの名無しさん:2006/07/07(金) 13:02:07
代入する先の型に合わせて自動的に選択されるはず。
790デフォルトの名無しさん:2006/07/07(金) 20:49:40
WINDOW2k+VisualCを使っています。

TCP/IPで受信した文字列の中から空行を見つけたいのですが、
どうすればよいですか?
お願いします。
791デフォルトの名無しさん:2006/07/07(金) 22:02:49
TCP-IP関係なくね?
文字列の中から特定の文字を除去したいならstrstrとかを使いなされ。
792デフォルトの名無しさん:2006/07/08(土) 03:20:02
XP+Visual Studio .NET 2003を使用してます
HTMLのサムネイルを作りたくてWindows/System32フォルダ内のWebvw.dllをActiveXで使おうと考えています

MFCプロジェクトにてActiveXコンポーネントの取り込み→ラッパークラスを作成したのですが
そこで作られたメソッドなどの使用方法がわかりません
MSDNにも載っておらず、ネットでも探したつもりですが、わかりませんでした

他の人はどうやってこういったActiveXを使っているのでしょうか
使用方法などどうすればよいのでしょうか?
よろしくお願いします
793デフォルトの名無しさん:2006/07/08(土) 04:24:47
>>791
回答どうもです。

while(1)
{
if (strstr(buffer,"\n\n") != NULL) //buffer=受信した文字列
{
printf("END") ; break;
}
}

このようにしても無限ループから抜け出せないのですがなぜなんでしょう。
空行は改行が連続している場所だと思うの\n\nにしてみました。
794デフォルトの名無しさん:2006/07/08(土) 07:38:06
"\r\n\r\n" とかそういうオチだったりする? しないか。
795デフォルトの名無しさん:2006/07/08(土) 11:11:46
しそうだ!
796デフォルトの名無しさん:2006/07/08(土) 11:39:39
new で確保したサイズとアドレスってどうすればわかりますか?
797デフォルトの名無しさん:2006/07/08(土) 11:51:40
わかりません。
798デフォルトの名無しさん:2006/07/08(土) 12:16:18
グローバルなoperator newをオーバーロードして、
アドレスと確保されたサイズをリンクリストあたりに保存しておけば?
799デフォルトの名無しさん:2006/07/08(土) 12:31:04
newした時、class A{省略};
A *a;
a = new A;
とした時に確保されるサイズの求め方とアドレスの求め方を聞きたいです。
800デフォルトの名無しさん:2006/07/08(土) 12:40:34
>>799
処理系の実装次第なんで、そのままだと無理だよ。
系によってはメモリマネージャにデバッグ用途向けのアナライズ機能を用意してる
(つーか大抵ある)ので、その辺をこねくり回せば入手できるかもね。
それが無理なら>>797-798が正解。
801デフォルトの名無しさん:2006/07/08(土) 12:41:22
つーか何でそんな情報が必要なのかね。
生アドレスが必要な状況ってよっぽど限られてると思うんだけど。
802デフォルトの名無しさん:2006/07/08(土) 12:44:03
アドレスは無理ならばいらないけど確保されるサイズはクラスや構造体・変数
どれでもsizeof(〜)のサイズが確保されるんでしょうか?
803デフォルトの名無しさん:2006/07/08(土) 12:51:01
最低sizeofのサイズ。
実際には4バイト境界に揃えられたりして必ずしもそのサイズじゃない場合あり。
ついでに言うとメモリを確保する際にはヒープツリーの接続情報やらデバッグ情報やらも
一緒に確保されるのが普通なんで、オブジェクトのサイズよりもはるかに大きなサイズが
確保される場合がある。

もっと言うとオブジェクトの内部でnewとかしてたら、sizeofで得られるサイズは
実際に確保されるサイズとは何の関係もない値になる。


アドレスが欲しければ、無理やりキャストしてunsignedにでも放り込めば。
804デフォルトの名無しさん:2006/07/08(土) 12:54:13
え?sizeofって境界整列後の値でしょ?
まあ、最低値がその値というのはそうなんだけど。
805デフォルトの名無しさん:2006/07/08(土) 12:57:38
>>804
sizeofが4バイト単位になっていても、メモリ確保のときは16バイト単位になるかもしれない。
806デフォルトの名無しさん:2006/07/08(土) 13:00:04
コンパイラの設定次第じゃね?
通常は境界整列後のサイズだろうけど、pragma pack とか付けば変わってくるし。
作法的には妄信は微妙な気が。
807デフォルトの名無しさん:2006/07/08(土) 13:02:24
>>805
sizeofは境界整列後の値であるということには同意するんだよね?

>>806
話がずれてる。
808805:2006/07/08(土) 13:04:53
同意も何も、私は昔からそう言って回っているが。
809デフォルトの名無しさん:2006/07/08(土) 13:08:37
いや、それならいいです。
810デフォルトの名無しさん:2006/07/08(土) 13:23:46
なんだお前らw
811デフォルトの名無しさん:2006/07/08(土) 13:25:47
質問したものですがクラスの正確なサイズはsizeofでは得られないでOK?
812デフォルトの名無しさん:2006/07/08(土) 13:30:39
「クラスの正確なサイズ」の定義による。
813デフォルトの名無しさん:2006/07/08(土) 13:54:11
クラスの正確なサイズというよりnewで確保されるサイズです。
814デフォルトの名無しさん:2006/07/08(土) 14:49:52
>>813
>>803

Windowsなら「CRT デバッグ ヒープ」でググれ。
815デフォルトの名無しさん:2006/07/08(土) 15:05:59
>>802
試しにoperator newを定義してみれば、
どれだけのメモリが確保されるかはわかるから、自分で試してみろ。
816デフォルトの名無しさん:2006/07/08(土) 16:45:33
>>815
それで試して「やっぱり sizeof() と同じだね」って結論にもできないだろ。
817デフォルトの名無しさん:2006/07/08(土) 19:21:53
「少なくともリクエストされるサイズはsizeofと同じ」で一般的には十分だと思うが。
818デフォルトの名無しさん:2006/07/08(土) 19:24:07
>>817
十分って何だよ?結局それに依存したコードはNGだぞ。
819デフォルトの名無しさん:2006/07/08(土) 19:26:02
>>818
十分じゃない場合を例示して貰いたい
820デフォルトの名無しさん:2006/07/08(土) 19:26:10
「少なくとも同じ」
821デフォルトの名無しさん:2006/07/08(土) 19:28:39
>>819
「十分」の意味がわかんねぇっつってんだろ。
822デフォルトの名無しさん:2006/07/08(土) 19:29:42
まさにはきだめの議論ですな。
823デフォルトの名無しさん:2006/07/08(土) 19:30:41
sizeofってvtblの分も含んだ値になるっけ?
824デフォルトの名無しさん:2006/07/08(土) 19:33:27
>>823
何故自分で確かめない?
825デフォルトの名無しさん:2006/07/08(土) 20:05:40
>>823
一応なるよー。
大抵の処理系ではvtableひとつにつき1ポインタ長増える。
もちろん多重継承かますとその分だけ増えていく。

ところで何でそんなに消費量が必要なのかね?
デバッグ目的?
826デフォルトの名無しさん:2006/07/09(日) 17:35:26
Delphiではクラス型はポインタと同じ扱いができたのですが、
C++ではクラス型とポインタの扱いが違うのはなぜですか?
827デフォルトの名無しさん:2006/07/09(日) 17:41:38
>>826
違うものの扱いが違うのは不思議じゃないだろ。
むしろ「Delphi では同じ扱いができるのはなぜですか?」って気分だ。
828826:2006/07/09(日) 17:50:19
>>827
クラス型がポインタ以外の用途で使われる場面がよくわからないんです…
829デフォルトの名無しさん:2006/07/09(日) 17:55:22
日本語でおk
830デフォルトの名無しさん:2006/07/09(日) 18:10:08
そもそもC++には、クラス型なるものは存在しないのですが。
831デフォルトの名無しさん:2006/07/09(日) 18:12:56
>>830
C++ では class, struct, union で定義するのがクラス型だよ。
Delphi のはまた違うんだろうけどな。
832デフォルトの名無しさん:2006/07/09(日) 18:17:44
クラスのインスタンスをポインタで参照する場合と実体で参照する場合が
あることのことを言ってるのなら、それはCの名残。
833デフォルトの名無しさん:2006/07/09(日) 21:10:39
Cの名残ってことは別段何かメリットを見越して意図的にそうしたというわけではないの?
834デフォルトの名無しさん:2006/07/09(日) 21:39:00
どうにも争点がわからんのだが。
リファレンスの存在意義がわからんってことなのか?
835デフォルトの名無しさん:2006/07/10(月) 14:44:53
>>794
\r\n\r\nで動きました
ありがとうです
836デフォルトの名無しさん:2006/07/10(月) 16:20:00
>>833
C/C++を勉強しろ。

>>834
別に議論してるわけじゃなくて、ただのQ&Aだよ。
837デフォルトの名無しさん:2006/07/12(水) 04:27:34
>>832 は釣りだろ。でも、「それはCの名残」これ、なかなかいいな。
838デフォルトの名無しさん:2006/07/14(金) 07:39:11
main関数について質問です。

int
main()
{
・・・
if(){エラー処理; return 1; }
・・・
return 0;
}
main関数はint型なので、return 1
はreturn 100でもint型なら何でもいいんでしょうか。

処理の最後だから、数字を返したところが
main関数の終わりっていうことでよかったでしょうか。
839デフォルトの名無しさん:2006/07/14(金) 08:22:22
>>838
main() の戻り値および exit() の引数は OS などの環境によって
いくらか意味づけが行われていることがあるが、言語の範囲では
0 と EXIT_SUCCESS が成功、 EXIT_FAILURE が失敗決まっているだけ。
これ以外の 100 などの数値がどう解釈されるかは環境ごとに
異なる可能性がある。

return で関数が終了するのは main() でも他の関数でも変わらない。
main() の場合はプログラムも終了するけど。
840デフォルトの名無しさん:2006/07/14(金) 08:46:54
>>839
おいおい、デタラメ教えるなよ。
成功/失敗時にreturnする値は決まってるわけではなく、ただの慣習。
841デフォルトの名無しさん:2006/07/14(金) 09:21:23
>>840
ISO C 7.20.4.3 "The exit function" 5
842デフォルトの名無しさん:2006/07/14(金) 09:46:22
>>839
0,1,EXIT_SUCCESS,EXIT_FAILURE
で実行してみたんですが、プログラム自体は
正常に動きました。

成功、失敗の意味合いはあるんですね。
みなさん回答ありがとうございました。
843デフォルトの名無しさん:2006/07/14(金) 11:45:15
頼むからマイナス返すのだけは止めてくれ。
844デフォルトの名無しさん:2006/07/14(金) 11:59:45
>>843
なんで?
845デフォルトの名無しさん:2006/07/14(金) 12:04:01
大抵のコマンドインタプリタはマイナスの値を利用できないから。
846デフォルトの名無しさん:2006/07/14(金) 13:34:11
そういうこと言ってると非ゼロは-1教信者が
847デフォルトの名無しさん:2006/07/15(土) 00:07:57
8bitしか有効じゃないコマンドインタプリタだと、exit(-1)すると255になるね。
848デフォルトの名無しさん:2006/07/15(土) 00:15:19
受け取るのがコマンドラインインタプリタだと決め付けてるのは何故なんだろう
849デフォルトの名無しさん:2006/07/15(土) 00:25:10
誰か決め付けてるの? 困った香具師だなぁ。

敢えてコマンドインタプリタと断っているのだから、
負の戻り値を利用できるケースがあることも承知しているのだろうよ。
850デフォルトの名無しさん:2006/07/15(土) 01:02:06
でもまあ、大抵食わせるのはコマンドラインインタプリタだよね。
851デフォルトの名無しさん:2006/07/15(土) 02:03:12
>>850
そうでもない
852デフォルトの名無しさん:2006/07/15(土) 02:28:47
俺はウンコ食べるよ!
853デフォルトの名無しさん:2006/07/15(土) 02:40:11
そういう時はマイナスの方がいいね。
854デフォルトの名無しさん:2006/07/15(土) 04:42:44
俺はオシッコ飲むよ!
855デフォルトの名無しさん:2006/07/15(土) 04:52:47
そういう時はプラスの方がいいね。
856デフォルトの名無しさん:2006/07/15(土) 05:06:22
お前らはえの素かよ
857デフォルトの名無しさん:2006/07/15(土) 05:12:57
ユー アー ナンバーワン シープラプラ プログラマー


イエーッ!!バッバッバッバッバッバッバッバッバッ
858デフォルトの名無しさん:2006/07/18(火) 01:53:04
VsualC6.0、Win2kでHTTP1.1のHTTPクライアントを作っているのですが、
HTTP1.1の場合は、サーバから送られてくるHTMLの終端は
Content-Lengthで判断するのでしょうか?
HTTP1.0と同じようにrecv==0で判断したら失敗しました。

またその場合、例えば以下のようにヘッダが送られてきたとすると、
・・・
Content-Type: text/html
Accept-Ranges: bytes
Content-Length: 214
ETag: "447c88f6-d6"
・・・
これらからContent-Lengthの大きさを取り出すのはどうやるのでしょうか?
strstrで考えてみたのですが、受信バッファの大きさによって
受信する文字が「ges: bytes\r\nCont」、「-Length: 214\r\nET」のように
文字列が分割されてしまうので、strstrは使えないような気がします。

よろしくお願いします。
859デフォルトの名無しさん:2006/07/18(火) 02:18:37
>>858
TCP/IPの場合、分割されようがなにしようが、受信側で巧いこと組み立てるしかない。
また、受信できる限りは受信し続けなければならない。
つーか、どう失敗したの?
860デフォルトの名無しさん:2006/07/18(火) 02:53:20
>>859
recv==0で受信するループを抜けようとしたのですが、
最後の文字が送られてきてからrecv=0が送られてくるまでに
5〜10秒無駄に時間が空きます。
HTTP1.0でGETリクエストしたときは無駄な時間の空きがなく
素直にrecv=0が送られてきて終わりにできました。
861デフォルトの名無しさん:2006/07/18(火) 05:11:05
もはやC++と何の関係もないがキーワードを教えてやる
あとは自分で頑張りな

持続的接続 (persistent connections)
Connection ヘッダフィールド
862デフォルトの名無しさん:2006/07/18(火) 07:09:24
つぎはきっと、Chunked-Transfer-Encodingにハまるとみた。
863デフォルトの名無しさん:2006/07/19(水) 04:06:11
どなたかお願いします。
ファイルの行数を求めるプログラムを作っています。
1行の文字数が不定のファイルの、全体の行数を求めるときはどんな風にすればよいですか?
VC++を使っています。
864デフォルトの名無しさん:2006/07/19(水) 07:30:43
宿題スレに行った方がいいと思うが、fgetcして\r\nの数数えたら。
865デフォルトの名無しさん:2006/07/19(水) 08:05:07
'\n'だけ解釈すれば充分だろ。
何で'\r'なんか数えるんだ?
866デフォルトの名無しさん:2006/07/19(水) 08:14:35
なんとなく。
867デフォルトの名無しさん:2006/07/19(水) 09:09:45
fgetsで適当に読み込めば楽勝。
868デフォルトの名無しさん:2006/07/19(水) 09:44:32
>>867
fgets()で指定したバッファ超より長い行があると、結局二度手間になると思うけど。
素直にfgetc()で読み流した方が速いんでない?
869デフォルトの名無しさん:2006/07/19(水) 10:03:22
質問です。
マイクロソフトは現在、Visual C++ 2005 Express Edition を無料で配布しています。
なぜ自分たちが作った商品を無料で配布しますか。
マイクロソフトに何の利益があるのか、理解できません。

http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
http://ja.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B
870デフォルトの名無しさん:2006/07/19(水) 10:07:40
開発者の囲い込み。
オープンソース陣営が勢力を増してるので対抗するためにやむなく、という
うがった見方もあるにはあり。
871デフォルトの名無しさん:2006/07/19(水) 10:09:17
ExpressEdition自体はフルスペックのツールじゃないしなあ。
個人でさわってる分にはいいけど、VSSとの連携もないし、
すぐにStandrdEdition以上が欲しくなる罠。
つまりMSの壮大な釣り。
872デフォルトの名無しさん:2006/07/19(水) 10:11:40
なるほど、お試し版の配布のようなものですね。
ありがとうございます。
873デフォルトの名無しさん:2006/07/19(水) 15:25:14
863です。
fgetcの方向で考えてみます。
ありがとうございます
874デフォルトの名無しさん:2006/07/19(水) 18:01:17
>>861
調べてみたけどやっぱり難しいようですね
ありがとうございます。
ネットワーク相談室にも行ってみます。
875デフォルトの名無しさん:2006/07/19(水) 22:46:19
入門書一冊読み終わったところなんですが、
C/C++って、ファイルをオープンするときに
perlのように、排他制御しなくてもいいんですか?
勝手にロックとかしてくれているんでしょうか。
876デフォルトの名無しさん:2006/07/19(水) 22:53:57
>>875
入門書に排他制御のことが書いてないのは正常です。
877デフォルトの名無しさん:2006/07/19(水) 23:42:50
C/C++の世界では、排他制御なんて、C/C++自体の話ではなく、OSなどの環境に依存した話になる。
878デフォルトの名無しさん:2006/07/20(木) 06:53:29
perlでだって、CGIでも無きゃ排他制御なんて滅多にしないよ。
879デフォルトの名無しさん:2006/07/21(金) 11:26:02
>>876
>>877
>>878
返事遅れました。ありがとうございます。
マルチスレッドで、ファイル共有、メモリ共有
するときなどの話になるんですね。

ちょっとずつわかってくると燃えてきますね。
ん〜、プログラミングできるようになりたい。
880デフォルトの名無しさん:2006/07/22(土) 01:18:26
数値を入力し、入力されたデータ数をカウントして、そのデータを逆順にして、表示するプログラムを書け。
ただし、データ入力の終了は0(zero)の入力とする
って課題が出たんですけど。マジでワケワカメ。しかも明日テスト><

次数のカウントのプログラム
int main(void) {
char s[80];
int i=0,len=0;

scanf("%s",s);
while(s[i]!=0){
len++;
i++;
}
printf("文字数は%d\n",len);

数値を3つ入力して順番を逆にして表示するプログラム
int main(void) {
int a[3];
int i=0;

for(i=0;i<3;i++)
scanf("%d",&a[i]);

for(i=0;i<3;i++)
printf("%d\t",a[2-i]);
printf("\n");

の2つのプログラムを合わせるらしいんですが、全くさっぱりなんです。誰か、教えてください;;
もう時間がないorz
881デフォルトの名無しさん:2006/07/22(土) 01:40:51
>>880
自分で課題ができないということはテストに不合格となるわけだ。
何も不思議ではないし、とても理にかなっている。安心しろ。
882デフォルトの名無しさん:2006/07/22(土) 02:04:11
>>880

#include<stdio.h>
#include<stdlib.h>

int main( void ){
int*buff = NULL, temp = NULL;
intnum, cnt, max;

max = 0;
for( ;; ){
scanf( "%d", &num );
if( num == 0)break;

temp = buff;
buff = (int*)realloc( buff, sizeof(int) * (max + 1) );
if( buff == NULL ){
if( temp )free( temp );
exit(1);
}
buff[max] = num;
max++;
}

for( cnt = 0; cnt < max; cnt ++ ){
printf( "%d\n", buff[(max-1) - cnt] );
}
if( buff )free( buff );
return 0;
}

マジでワケワカメ。
883デフォルトの名無しさん:2006/07/22(土) 02:15:25
上の「次数のカウントのプログラム 」って何よ?
文字数のカウントのプログラム?
いらねーよ。
2番目の関数だけ書き換えろ。
(それにしても汚い関数だな。)

答え教えるわけにいかないから、ヒントだけやる。
試しに下のコード打ち込んで、[1][Enter][3][Enter][5][Enter][7][Enter][9][Enter][0][Enter]
とでも押してみろ。パターンを変えてみろ。最後にはゼロを入力するんだ。

これで分からなかったら、早めに学校逝って(土曜日授業あるの!?)先生にでも聞け。

int a[100]; //←いくつ入力されるかわからんから、適当に100個くらい用意しとけ
int i=0;
int suuji_no_kazu = 0;
for(i=0;;i++) //←無限ループにしろ
{
scanf("%d",&a[i]);
if (a[i]==0) break;
suuji_no_kazu++;
}
printf("数字の数=%d\n",suuji_no_kazu);
884883:2006/07/22(土) 02:16:06
かぶった。
885ひまでしょうがない883:2006/07/22(土) 02:45:33
printf("数値を3つ入力して占いをするプログラム\n");
int a[3];
int i=0;
for(i=0;i<3;i++)
scanf("%d",&a[i]);
int tmp = a[0] + 3 * a[1] + 11 * a[2];
char* uranai[7] = { "大吉/点数が来た","中吉/オワター","吉/テストダメでした","小吉/残念",
"小凶/赤点","中凶/また来年","大凶/人生だめぽ"};
printf("占いの結果:%s\n",uranai[tmp%7]);
886デフォルトの名無しさん:2006/07/22(土) 02:50:06
>>882
>>883
ありがとございます〜!!!
883やばいです。やばいです、マジ参考にします!!!
マジで助かります!!!多分単位は落とすけど・・・・orz
授業も出てないし、課題4つあって一つも提出してない><
どうせなら、このプログラム持ってくと、
880の能力をよくご存知の先生は、腰を抜かして仰天するはず。

#include <stdio.h>
//数値逆回転関数(最初に呼び出すときはnを0にして呼び出せ)
void suzumiya_haruhi(int n)
{
int buf = 0;
scanf("%d",&buf);
if (buf==0) { printf("%d個の数値が入力されたですよイヒヒ\n",n); return; } //←再帰脱出
suzumiya_haruhi(n+1); //←再帰
printf("%d\n",buf);
}
//メイン関数
int main(void)
{
printf("数値逆回転ですよイヒヒ\n");
suzumiya_haruhi(0);
printf("おわりましたよイヒヒ\n");
return 0;
}
888デフォルトの名無しさん:2006/07/22(土) 05:05:25
いっそのこと
#include <stack>
889デフォルトの名無しさん:2006/07/22(土) 05:28:07
すいません。ポインタについて質問です。
char* str = "hello";
charのポインタなんですが、下記をcoutしてみました。
*str→h str[1]→e str→hello

*str先頭を指す
str[1]は2番目をさす
これは納得できました。

strがhelloなのがよくわかりません。
0x×××じゃないのが不思議です。

ポインタは変数のアドレスを指す場合と
上記のように、文字列そのものを指す時がある
っていうふうに理解すればよいでしょうか。

あと、helloの0x×××のようなアドレスは
今回の場合どうやって出力するんでしょうか?
よろしくお願いします。
890デフォルトの名無しさん:2006/07/22(土) 07:23:11
うはwwwwwwwww寝てたwwwwwwwwwwwww


単位オワタ
891デフォルトの名無しさん:2006/07/22(土) 07:35:45
>>889
演算子が多重定義されているから。
つまり、渡されたのがvoid*かchar*かで別の関数が呼ばれる。
なので、この場合void*型にキャストすればアドレスが出力される。はず。

"0x"を付けたければ「マニピュレーター」を調べてくれ。
892デフォルトの名無しさん:2006/07/22(土) 07:52:10
俺の実力よくしっている先生に887出してくる
893デフォルトの名無しさん:2006/07/22(土) 09:04:45
API使わずにコマンドライン上で文字列を一定時間表示したいんだけど、
そのときのタイマー(例えば文字列を表示して5秒でクリアスクリーン)
とかってfor文で無駄な処理をさせて無理やり時間とる以外に方法ってある?
低脳な質問でスマソ
894デフォルトの名無しさん:2006/07/22(土) 09:17:06
あ、ごめんなさい、C++です…orz
895デフォルトの名無しさん:2006/07/22(土) 09:17:18
>>893
環境に見合ったスリープ関数を呼ぶ。
896デフォルトの名無しさん:2006/07/22(土) 09:17:57
>>893
っboost::timer
897デフォルトの名無しさん:2006/07/22(土) 09:25:11
dくす、やってみまつ
898デフォルトの名無しさん:2006/07/22(土) 11:05:18
>>891
ありがとうございます。
早速、マニピュレーター調べてみます。
899デフォルトの名無しさん:2006/07/23(日) 00:07:35
ブーストって有料?
900デフォルトの名無しさん:2006/07/23(日) 00:10:55
901デフォルトの名無しさん:2006/07/23(日) 00:17:19
よくわかんね
フリーソフト作るならただで使っていいけど
商用開発ならロイヤリティよこせ
みたいな感じ?
902デフォルトの名無しさん:2006/07/23(日) 00:18:01
>>901
ちがう。
どう読んだらそうなるんだ?
903デフォルトの名無しさん:2006/07/23(日) 00:56:26
大事なのは最後の全て大文字で書かれている部分。
ようするに何やってもいいというようなことが書いてある。
904デフォルトの名無しさん:2006/07/23(日) 01:07:50
>>903
何やってもいいってわけじゃない。
905デフォルトの名無しさん:2006/07/23(日) 03:57:32
どちらかというと
どんな事になっても文句たれるな
って書いてある
906デフォルトの名無しさん:2006/07/23(日) 10:50:59
一番重要(というか他の多くのソフトウェアライセンスと確実に一線を画する)部分は
真ん中の restriction だと思うんですが…….特に

unless such copies or derivative works are solely in the form of
machine-executable object code generated by a source language processor.

な部分.これはたとえ商用開発だろうが適用されます.限りなく緩いです.この結果

The Boost license permits the creation of derivative works for commercial
or non-commercial use with no legal requirement to release your source code.

となります.このライセンスの history, rationale などは

http://www.boost.org/more/license_info.html

に書いてあります.
907デフォルトの名無しさん:2006/07/23(日) 11:58:19
英語屋さ〜ん!
908デフォルトの名無しさん:2006/07/23(日) 12:12:50
boost はそのうち標準化される事を目標にしてるんじゃなかったっけ?
緩くて当たり前。
909デフォルトの名無しさん:2006/07/23(日) 13:27:37
逆にboostからC++標準になったコンポネントってなんかあったっけ。
arrayとかなったんだっけ?
910デフォルトの名無しさん:2006/07/23(日) 13:35:37
>>909
C++標準との関係は boost のトップページに書いてある。
911デフォルトの名無しさん:2006/07/23(日) 15:05:57
Ten Boost libraries are already included in the C++ Standards Committee's
Library Technical Report ( TR1) as a step toward becoming part of a future C++ Standard.

これとかか。
C++標準自体のアップデートって具体的に何時なのよ。
912デフォルトの名無しさん:2006/07/23(日) 15:12:22
次のC++の規格はC++0xとなっております。
詳しくはこちらへどうぞ。
ttp://pc8.2ch.net/test/read.cgi/tech/1149440647/l50
913デフォルトの名無しさん:2006/07/23(日) 15:32:42
あいあい、移動しまっす。

2009年かー。
どうなることやら。
914デフォルトの名無しさん:2006/07/26(水) 03:22:46
質問です。
httpで以下のような文字列をrecvしたとき、

Accept-Ranges: bytes\r\nContent-Length: 214\r\n

この文字列に含まれている、
Content-Lengthの次から\rまでの数字だけを
int型の変数に入れるにはどうやったらよいのでしょう?
よろしくお願いします。
915デフォルトの名無しさん:2006/07/26(水) 04:37:52
>>914 sscanf()
916デフォルトの名無しさん:2006/07/26(水) 17:30:22
>>915
Content-Lengthより前の部分の文字列の長さが不定だったので、
sscanfの書式に合わなくて変な値を取りました。
他にやり方はありますか?
917デフォルトの名無しさん:2006/07/26(水) 17:40:25
>>916
Content-Lengthをstrstr()で探しておいて、その続きからsscanf()。
918デフォルトの名無しさん:2006/07/26(水) 18:55:14
>>917
strstrでContent-Lengthを探してポインタを取ったんですが
sscanfでどうやって取得したポインタを使えばいいのでしょう?
919デフォルトの名無しさん:2006/07/26(水) 19:20:05
>>918
Ex.
char * p = strstr("Accept-Ranges: bytes\r\nContent-Length: 214\r\n", "Content-Length:");
if (p) {
int len;
sscanf(p + strlen("Content-Length:"), "%d", & len);
}
920デフォルトの名無しさん:2006/07/26(水) 23:10:11
>>919
できました。ありがとうございます。
sscanf(p + strlen("Content-Length:"), "%d", & len);
という使い方は下のマニュアルに載っていませんでしたが、特殊なのですか?

http://www9.plala.or.jp/sgwr-t/lib/sscanf.html
921デフォルトの名無しさん:2006/07/26(水) 23:15:38
あまりやらないかと言えばたしかにそうだが、
やっていることは基礎的な事柄を組み合わせているだけだから、簡単に思い付くはず。
わざわざ載せるまでもないというやつ。
922デフォルトの名無しさん:2006/07/26(水) 23:38:44
>>921
なるほど
ありがとうございます
923デフォルトの名無しさん:2006/07/27(木) 04:40:16
こういう人はこういう使い方も思いつかなかったりするのかな?
char * stringAddValue(char * buf, int val) {sprintf(strchr(buf, '\0'), "%d", val); return buf;}
こういう使い方とか。
for (int ic = 0; ic < width; ++ic) {printf(ic < width - 1 ? "%d," : "%d\n", ic);}
924デフォルトの名無しさん:2006/07/28(金) 00:18:15
わりりり、俺もするっとは出てこないや。
925デフォルトの名無しさん:2006/07/28(金) 14:38:33
読んだらああなるほどねぇとは思えるんだが
すぐに思いつくかと言われると難しいな
926デフォルトの名無しさん:2006/07/28(金) 14:43:38
for (int ic = 0; ic < width; ++ic) {printf(ic < width - 1 ? "%d," : "%d\n", ic);}

for (int ic = 0; ic < width; ++ic) {printf("%d%c", ic, ic < width - 1 ? ',' : '\n');}
の方が、%d を二度書かなくていい。
for (int ic = 0; ic < width; ++ic) {printf("%d", ic); putchar(ic < width - 1 ? ',' : '\n');}
でもいいが。
927デフォルトの名無しさん:2006/07/28(金) 14:50:09
>>926
肝はフォーマット文字列も文字列リテラルに限定されないってことを示したかっただけなんだから勘弁してね。
928デフォルトの名無しさん:2006/07/28(金) 19:29:25
勘弁ならねぇ!
929デフォルトの名無しさん:2006/07/28(金) 19:39:15
>>927
勘弁する。
930デフォルトの名無しさん:2006/08/01(火) 12:52:58
じゃあ俺は検便する。
931デフォルトの名無しさん:2006/08/01(火) 14:17:37
memsetで構造体を初期化するときの質問です。
//構造体です。
struct hoge {
char hoge_a[8];
char hoge_b[8];
char hoge_c[8];
};
struct hoge obj;
memset(&obj,'y',sizeof(obj)-1);
//構造体の3つの変数出力しました。
fprintf(stderr,"obj.hoge_a=%s\n obj.hoge_b=%s\n obj.hoge_c=%s\n\n",
obj.hoge_a, obj.hoge_b, obj.hoge_c);

----結果----
obj.hoge_a=yyyyyyyyyyyyyyyyyyyyyyy
obj.hoge_b=yyyyyyyyyyyyyyy
obj.hoge_c=yyyyyyy

全部yが7個出力されると思ったのですが、上から
23個、15個、7個っていう結果になりました。
memsetの代わりに、ひとつずつ
memset(obj.hoge_a,'h',sizeof(obj.hoge_a)-1);
memset(obj.hoge_b,'h',sizeof(obj.hoge_b)-1);
memset(obj.hoge_c,'h',sizeof(obj.hoge_c)-1);
すると7個ずつ出力されました。

いろんなページ見たのですが、memsetの動き方が
わからないのですが教えてください。
よろしくお願いします。
932デフォルトの名無しさん:2006/08/01(火) 14:24:58
931です。
memset(obj.hoge_a,'h',sizeof(obj.hoge_a)-1);
memset(obj.hoge_b,'h',sizeof(obj.hoge_b)-1);
memset(obj.hoge_c,'h',sizeof(obj.hoge_c)-1);
まちがいで、'h'は、'y'でした。
すみません。
933デフォルトの名無しさん:2006/08/01(火) 14:28:49
あっ、
”memsetの代わりに”って言う日本語も変でした。
どうしてこうバカなんだか。
不快になられた方本当に申し訳ございません。
934デフォルトの名無しさん:2006/08/01(火) 14:32:43
memsetは、第一引数に対して、第三引数ぶん第二引数で埋めるということをする。
なので最初の書き方だとobjを23個のyで埋めるということをする。

一方、「文字列」はヌル文字で終わるものをいう。obj.hoge_aを文字列として
扱いたいのであれば、obj.hoge_a[7] = '\0'としなければならない。
これは、memset(&obj, 'y', sizeof obj - 1)では実現できない。
なぜなら、memsetはobjの先頭(=obj.hoge_aの先頭)から23個'y'を設定するので
obj.hoge_a[7]も'y'になってしまうからだ。

結論としては、期待する結果を得たい場合には以下のようにする必要がある。
今回'\0'を設定しなくてもよかったのは「たまたま」で、普通はゴミが入ったりする。

memset(obj.hoge_a, 'y', 7);
obj.hoge_a[7] = '\0';
memset(obj.hoge_b, 'y', 7);
obj.hoge_b[7] = '\0';
memset(obj.hoge_c, 'y', 7);
obj.hoge_c[7] = '\0';

まとめて書くこともできる。
memset(&obj, 'y', sizeof obj);
obj.hoge_a[7] = '\0';
obj.hoge_b[7] = '\0';
obj.hoge_c[7] = '\0';

'7'が気にいらなければ、次のようにも書ける。
obj.hoge_a[sizeof obj.hoge_a - 1] = '\0';

935デフォルトの名無しさん:2006/08/01(火) 14:34:49
>>933
charの配列を文字列として使うためには文字列の最後にナル文字を置かないといけない。
つまり、memset(obj.hoge_a, 'y', sizeof(obj.hoge_a) - 1);ではその最後のナル文字が書き込まれないので要注意。

さて、>931の問題はもう一つあって、obj全体を一つのchar配列であるかのように扱ってしまっている。
つまり、obj.hoge_a[0]〜obj.hoge_a[7]まで全て'y'で埋め尽くしているわけだ。
偶偶その構造体ではhoge_a, hoge_b, hoge_cが連続していたので、fprintf()のときに
sizeof(hoge_a) + sizeof(hoge_b) + sizeof(hoge_c) - 1の23文字が出力されたと言うわけ。
その辺りのことに慣れない内はmemset()を使うのは避けた方がいいかもしれない。
936デフォルトの名無しさん:2006/08/01(火) 14:37:07
こうすることも出来るyp
mecpy(&obj, "7777777\07777777\07777777\0", 24);
937デフォルトの名無しさん:2006/08/01(火) 14:38:21
思いっきり間違えてたyp orz

memset(&obj, "yyyyyyy\0yyyyyyy\0yyyyyyy\0", 24);
938デフォルトの名無しさん:2006/08/01(火) 14:38:54
guha 欝出し脳

memset->memcpy
939デフォルトの名無しさん:2006/08/01(火) 14:44:16
>>937
それだったら未だ
strcpy(& obj, "yyyyyyy\0yyyyyyy\0yyyyyyy");
の方が素直な希ガス。
940デフォルトの名無しさん:2006/08/01(火) 15:09:55
>>934
丁寧な解説、ありがとうございます。
できました。
>>935
勉強はじめたばかりで、ナル文字とか実はあんまり慣れてないです。
sizeof(obj.hoge_a) - 1は、-1すると
なぜかゴミがなくなったので、-1してみました。
ナル文字も勉強してきちんと書くようにします。

構造体ってメモリ上でこんな形で保存してあるんですね。
"7777777\07777777\07777777\0"

ttp://www.bohyoh.com/CandCPP/C/Library/memset.html
このページの意味がやっとわかりました。
まさに、オブジェクトのポインタに同じ文字を
入れて初期化していくんですね。
はじめは、見えないところで特別な動きをして
構造体のメンバ変数ひとつずつにmemsetをやっていくのかと
思ってました。

みなさんありがとうございました。
941デフォルトの名無しさん:2006/08/01(火) 15:15:23
ちなみに、構造体のメンバーがcharだけのばあいは、みっしり詰まっているが、
shortやintやdoubleなどが混在するとすかすかになったりするからね。
この話は勉強してればそのうち出てくると思うよ。(境界整列のはなし)
942デフォルトの名無しさん:2006/08/01(火) 15:31:13
>>940
>935の最後の行もお忘れなく。
943デフォルトの名無しさん:2006/08/08(火) 04:36:04
a.txt b.txt c.txt
3つのファイル名をファイルの大きさ(容量)によって
小さい順番にprintfでファイル名を出力したいと思います。

#include<stdlib.h>
void qsort(void *base, size_t n, size_t size,
int (*cmp)(const void *arg1, const void *arg2))
比較関数を作ってqsort関数を使うやり方と、
ファイルの容量を調べ方はわかりました。

ただ数字をソートするのはわかりますが、
ファイルの容量とファイル名を結びつけて、
考えるというのが難しいです。

連想配列みたいにすればよいのかと思ったのですが、
C言語に連想配列って無いみたいなんです。

よろしくお願いします。
944デフォルトの名無しさん:2006/08/08(火) 04:56:48
struct _file {
 char *name;
 unsigned long size;
} *file;

file->sizeで比較
945デフォルトの名無しさん:2006/08/08(火) 05:02:28
>>994
アドバイスありがとうございます。
初心者なのでちょっと心配な部分もありますが、
なんとなくわかりました。

がんばってみます。
946デフォルトの名無しさん:2006/08/08(火) 07:36:22
>>943
fopen >> fseek >> ftell >> fclose
947デフォルトの名無しさん:2006/08/08(火) 17:40:18
今までクラスを使うときはなんとなくすべてポインタ変数を使っていたのですが、
ポインタを使わなくてもいい場合というのはどういうときでしょうか。
948デフォルトの名無しさん:2006/08/08(火) 19:02:53
全部 new してるって意味か?
949デフォルトの名無しさん:2006/08/08(火) 22:40:27
>>947
ポインタ使わないといけない場合の反対。
950947:2006/08/09(水) 01:42:47
>>948
そうです

>>949
もう少し具体的な解答をお願いします。
951デフォルトの名無しさん:2006/08/09(水) 01:46:48
>>950
もう少し具体的な質問をお願いします。
952デフォルトの名無しさん:2006/08/09(水) 01:55:49
// >>950
#include <iostream>
#include <string>
int main()
{
std::string foo = "bar";
std::cout << foo;
return 0;
}
953デフォルトの名無しさん:2006/08/09(水) 02:01:07
>>950
ポインタ取っ払って直接インスタンス持つ様にできる状況を考えてみれ。
new してるってことは動的にメモリを確保してるってことで、それに用が無いなら、new も delete も必要ない。

class A {
int dummyMember;
public:
A():
dummyMember(0)
{}
~A(){}
};

class B {
A a0;
A a1;
A array[10];
public:
B(){}
~B(){}
}

int main(int argc, char* argv) {
A instanceA;
B instanceB;
return 0;
}

上のコードでは、instanceAもinstanceBもスタック上に作られてるからnewはいらない。
クラスBの中身の a0, a1, array[] は、Bの中に含まれている。個別にnewする必要はない。
instanceAもinstanceBもreturnで抜ける際に勝手にそれぞれのデストラクタが呼び出される。
当然deleteもいらない。
954デフォルトの名無しさん:2006/08/09(水) 05:47:53
>>953
スタック上につくられてるからnewはいらないというのは、おかしな説明だな。
955デフォルトの名無しさん:2006/08/10(木) 00:57:46
まあ…そうだね。

ていうかまあ、>>949でFAなんだよな。
すまんかった。
956デフォルトの名無しさん:2006/08/10(木) 12:09:39
いろんなソースコードを読んで勉強したいんですが、
C/C++版のcpanみたいなサイトご存じないでしょうか。
957デフォルトの名無しさん:2006/08/10(木) 22:57:02
sourceforge
google code
958デフォルトの名無しさん:2006/08/11(金) 02:01:08
>>957
ありがとー。
さっそく見てみます。
959デフォルトの名無しさん:2006/08/11(金) 11:02:38
構造体のワードアライメントって未だに考慮しないとならないんだな。
ちょっといじってサイズが4分の1になってびっくりした。
そろそろ自動で解決してくれよと思う。
960デフォルトの名無しさん:2006/08/11(金) 11:44:41
>>959
「ちょっといじって」が何のことかわからんが、大抵の場合は
規格に従う限り無理だろう。
961デフォルトの名無しさん:2006/08/11(金) 14:37:16
BYTE、DWORD、char、LONG、BYTE・・・みたいな感じに並んでた
BYTE、char、boolなどを全部前方にまとめてみただけだけ。
詳しい規格は知らないけど単に2パスしてくれれば
いいような気もするが難しいのかな?
962デフォルトの名無しさん:2006/08/11(金) 14:48:06
構造体は「集合」じゃないんですが。
963デフォルトの名無しさん:2006/08/11(金) 15:48:57
構造体の順番勝手に変えられたらまずいだろ。
964デフォルトの名無しさん:2006/08/11(金) 16:18:47
packしろ
965デフォルトの名無しさん:2006/08/11(金) 23:48:52
>>961
既にメンバの並び順に依存した規定が標準として定められてしまっている。
互換性を考えると無理。
966デフォルトの名無しさん:2006/08/12(土) 00:52:37
昔は並び替えちまうコンパイラもあったような…
まあ、今は昔の話だ罠
967デフォルトの名無しさん:2006/08/12(土) 09:46:23
コンパイラ依存で #pragma 使ってサポートできなくはないだろうね。
968デフォルトの名無しさん:2006/08/18(金) 23:57:02
windowsで、ファイルのコピーするときですが、
コピーしている途中のデータにアクセスして、
リアルタイムでその容量を知ることってできますか?

その容量がわかると、
・現在何M中何Mです。
とか、速度を計算して
・後何秒で終わります
とかできそうなんですが。

よろしくお願いします。
969デフォルトの名無しさん:2006/08/19(土) 00:04:14
>>968
エクスプローラを見ていれば判ることですが、殆ど意味がありません。
そもそも、「書き込み中のファイル」は検出できるかもしれませんが
「読み込み中のファイル」を検出できないので無理です。
970デフォルトの名無しさん:2006/08/19(土) 00:06:18
>>968 CopyFileEx
971デフォルトの名無しさん:2006/08/19(土) 00:21:48
>>969
恥ずかしすぎる
972デフォルトの名無しさん:2006/08/21(月) 13:00:18
>>969
>>970
ありがとうございます。
ネットの環境がなかったのでお礼遅れました。

CopyFileExで検索したら、msdnのページの
詳しい解説が出てきました。

質問ばかりで申し訳なんですが、疑問が出てきました。
自前でこういう関数は作れるんでしょうか?
「コピー中のファイルを検出して1秒ごとに表示」
というサンプル作ってみたんですが、
コピー中のファイル検出できましたが、
容量は毎回同じ"全部の容量"しか表示されませんでした。

たとえば、ファイル形式の変更(gif->jpgなど)、圧縮
符号化などのソフトをみると、作成中のファイルの容量を調べて
処理過程を表示させているような気がしてます。
よろしくお願いします。
973デフォルトの名無しさん:2006/08/21(月) 13:24:05
気がするだけ
974デフォルトの名無しさん:2006/08/21(月) 13:48:10
たぶん、自前で作れると思うけど、君には無理なんじゃないかな?
975デフォルトの名無しさん:2006/08/21(月) 14:10:01
俺も興味ある。
符号化先のリアルタイムの容量って
知ることできないの?

コピーしてる途中のファイルをdirコマンドで
見たら全部の容量が表示されたんだが。

処理系経過って普通のアプリについてるもんだから
スキルいらんと思うだが。
そういう俺はスキルないけどな!
976デフォルトの名無しさん:2006/08/21(月) 14:19:26
他のアプリがコピー中のファイルの、処理済み容量を知ることはできないと思うが。
OSによっては、ディスクに書き出した時点でファイルサイズが決まるから経過は見えるけどバッファサイズ単位でしか増えないし。
977デフォルトの名無しさん:2006/08/21(月) 15:49:20
for (i = 0; i < 100; i++) {
fread(buf, filesize / 100);
fwrite(buf)
printf("%d %%\n", i + 1);
}
978デフォルトの名無しさん:2006/08/21(月) 18:27:20
>>977
ありがとうございます。
freadってこういう風につかえるんですね。
調べて書いてみます。
979デフォルトの名無しさん:2006/08/21(月) 18:35:02
↓「>977のソースがコンパイルできません」かな?w
980デフォルトの名無しさん:2006/08/21(月) 18:43:31
>>978
実際に作るなら、100分割とかにはしないで、最小コピーサイズで分割しろ。
1MBごととか、4MBごととかな。512bytesの倍数にしろよ。
981デフォルトの名無しさん:2006/08/21(月) 19:20:22
>>980
なんで?
バッファリングされているから何の意味もないと思うのだけど。
982デフォルトの名無しさん:2006/08/21(月) 23:27:11
>>981
何によってバッファリングされ、そしてそのサイズはいくつ?
983980:2006/08/22(火) 00:07:27
>>981
あれ?俺何に突っ込まれてる?
512の倍数にしろってとこかな?
984デフォルトの名無しさん:2006/08/22(火) 01:27:08
>>983
言ってること全体だと思われ。
そんなんに気を回さなきゃならんくらいなら、ファイルストリームの意味無いじゃんよう。
985980:2006/08/22(火) 01:38:40
>>984
そうかなー?CopyFileに肉薄するためには、何かを考えないといけないと思うんだけど。
小さく分けても、HDDの読み書き速度が20〜60MB/sだから意味ないし、
大きくしすぎても、メモリを圧迫する可能性があるし。
どこかに妥当な「最小コピーサイズ」があるとは思わない?
986デフォルトの名無しさん:2006/08/22(火) 02:02:29
そりゃチューンの話で、もっと言えば実装依存の話じゃないか。
妥当な最小コピーサイズは確かにあるだろうし、
具体的な数字の目処もある程度予想は着けられるかもしれないが、
アプローチの方向は根本的に間違ってるかと思われ。

それ以前の問題で>>977のfilesize/100は高確率で100バイトずれるバグをはらんでるはずだから
そのままじゃ受け入れられないけどさ…。
987980:2006/08/22(火) 02:13:25
>>986
そう?FFCのアプローチはそうだよ?
988デフォルトの名無しさん:2006/08/22(火) 02:15:51
FFCでググったらフットサルチームしか引っかかってきませんでした。
俺の負けでいいです。
989980:2006/08/22(火) 02:21:58
Fire File Copy
990デフォルトの名無しさん:2006/08/22(火) 02:25:42
…根本的に齟齬があることがわかりました。
ちゃんとチューンするなら、そりゃマストのアプローチです。
でもそれならfreadとかfwriteとか使わない。
俺はそう申し上げたかった。
991980:2006/08/22(火) 02:32:54
バッファのサイズを考えることは、単にチューン目的だけじゃなくて、
アーキテクチャの面もあると思うんだけど、話したくなさそうなのでもういい。
992デフォルトの名無しさん:2006/08/22(火) 02:36:58
何でそこにアーキテクチャが顔を出すのかは正直理解が及ばないけど、とりあえずお疲れ様でした。
993980:2006/08/22(火) 02:53:30
>>992
OSのファイルキャッシュを汚染する/しないとか、HDDのシークを減らすとか、
ヒープを取り過ぎないようにするとか。
これらってアーキテクチャだと思うんですが、どうでもいいです。
994デフォルトの名無しさん:2006/08/22(火) 02:58:12
>>993
どうでもいいならレスすんな、馬鹿
995デフォルトの名無しさん:2006/08/22(火) 03:10:52
>>993
それは全然アーキテクチャじゃないと思われ…
アーキ語るなら、せめて内側のことと外側のことは分けて考えようぜ
な?
996デフォルトの名無しさん:2006/08/22(火) 03:32:17
なぜかここでFCB
997デフォルトの名無しさん:2006/08/22(火) 05:09:44
>>995
アーキテクチャでしょ
998デフォルトの名無しさん:2006/08/22(火) 09:22:04
次スレ:はきだめC/C++下級者の質問箱 2
http://pc8.2ch.net/test/read.cgi/tech/1156206091/
999デフォルトの名無しさん:2006/08/22(火) 10:26:12
それがはきだめクオリティ

踏み台
1000デフォルトの名無しさん:2006/08/22(火) 10:28:02
@
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。