はきだめのスレへようこそ ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。 なお、質問する人は回答はあまり期待しないでください。
終了
sinekuzu
4 :
デフォルトの名無しさん :2005/08/17(水) 17:28:19
笑える。
なにこの良スレ
6 :
デフォルトの名無しさん :2005/08/17(水) 17:46:45
なんで上級者は、 *p++ = *q++; って、書きたがるのですか? *p = *q; p = p + 1; q = q + 1; って書いたほうが、間違いがなくて、はるかに分かりやすいと思うけど、 こう書いたら、死ぬほど怒られた・・・
8 :
デフォルトの名無しさん :2005/08/17(水) 17:52:06
>>7 ハハハハハ。
「はきだめC/C++下級者の質問箱」ならではのナイスレスw
>>6 プログラム言語c++の165p〜167Pを
立ち読みしてください。
屁をしたくなったので思いっきりぶっ放したら、液状便がパンツについてしまいました。 どうすればいいですか?
とりあえずにおいを嗅いでそのあと放置
12 :
デフォルトの名無しさん :2005/08/17(水) 19:26:09
>>10 俺ならつりセットして道路に放置、釣れるまで待つwww
少なくとも p=p+1;はやめとこうな。
*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言語コンパイラなんてあんの?
19 :
デフォルトの名無しさん :2005/08/17(水) 23:52:15
>18 レス アリガトウゴザマス
>>19 ここは「通報しますた」と返す所じゃないか?
*++p=*++q,*r++?*s++:*++t;
22 :
デフォルトの名無しさん :2005/08/18(木) 01:20:24
>20 皮肉りますた
>>21 すごいな。Cプログラマーは、これを一瞬見ただけで理解できるのか・・・
下級者な俺は、カッコとかつけてみて、一個ずつ考えてかないと何やってるのか
サッパリ分からないよ。
こんなの、どうやったら一瞬見ただけで分かるようになるのですか?
てか、なんで上級者は、できるかぎり分かりにくく書くように努めるのですか?
>>21 俺も凄いと思った。こんなコードを一瞬で理解できるなんて、天才か基地外の
どちらかだな。どちらかというと後者の方だろうな。
むしろアフォ
*(p)=*(q),p=p+1,q=q+1,*r,r+=1,?*s++:*++t;
27 :
デフォルトの名無しさん :2005/08/18(木) 08:39:28
stdioはスタジオと読むのですか?
#include <studio.h> だめだ、エラーが出るOrz
#include <megadlib.h> だめだ、エラーが出るOrz
何この良スレ
32 :
27 :2005/08/18(木) 11:21:25
>>30 由来は知っています。読み方が知りたいです。
僕はすたっどあいおーってよんでる。 上級者向けの本に書いてあった。僕は上級者じゃないけど
えすてぃーでぃーあいおー
僕は「ストゥドゥアイオー」と読んでいます。 カタカナでは表現しきれない発音なので困っています。
>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配列に入れられるという存在意義が大きいわけで
てことで、 p[値]なとき、pが示すのは、配列の先頭アドレス *paなとき、paが示すのは、入れ物の先頭アドレス 世の中の本の説明はへたくそだと思う
>>37 > コンパイル通らないぞ
配列として宣言するからだろ
41 :
デフォルトの名無しさん :2005/08/18(木) 18:14:25
CってJavaと違ってコンパイラ無いと出来ないの?
>>41 Java にもコンパイラ要るだろ?
しかも Java はコンパイラだけじゃなくランタイムまで要るだろ?
43 :
デフォルトの名無しさん :2005/08/18(木) 19:12:40
ランタイムって何ですか?
44 :
デフォルトの名無しさん :2005/08/18(木) 20:03:09
>42 失礼、知人から古いパソごと貰ったものですから・・・ Cみたいな値段するんですか?
CもJavaもただで出来るっつうの… VCのコンパイラもフリーであるし
Java?あーあのCPUの性能を1/2以下にする糞言語の事ですか。 プログラマが楽をして、そのツケをユーザー側に押しつける最低言語。
47 :
VCでは :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にある はきだめらしく、変かもしれない
RUNTIME_CLASSの実装は、C〜AppのInitInstanceにある
49 :
デフォルトの名無しさん :2005/08/18(木) 20:41:43
CRuntimeClassのDocTemplete実装は、C〜AppのInitInstanceにある というのが正しいかもしれない とにかく、InitInstanceにRUNTIME_CLASS()という関数がある
間違い発見 >Viewクラスから、CDoc::〜 C〜Viewクラスから C〜Doc* pDoc; pDoc->〜 なんてことはできない
思ったより良スレになる予感
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 なんちゃって
ちなみに、老婆心ながら、試すなら、 ONEWクラスファイルのインクルードを忘れずに それと、逆にいうと、新規クラスを作るときはRUNTIMEの目が届かない可能性があるから、注意が必要だとも言える
56 :
56 :2005/08/19(金) 03:56:46
質問です。 c++についてなのですが、2つcppファイルを作って片方から片方の変数を見る事ができません。 メソッドについてはexternを使えば参照できる事がわかったのですが、変数などが参照できません。 教えてください。よろしくお願いします。
>>56 メソッドってなんだろうな…と。
関数は普通に関数宣言で。変数は extern で。
宣言と定義の意味をちゃんと理解しておこう。
>>54 ゴチャゴチャしててよく解らんが、もしかして
>そして、ViewでONEW on;とでも宣言してやれば
View に Doc を内包させようとしてる?
そら確かに掃き溜めらしいが…
掃き溜めなら掃き溜めらしく外部変数でクラス間通信
>>6 せめてこうしようぜ。これなら俺は許す。
*p = *q;
p++;
q++;
>>56 クラス宣言に class を使わず struct を使う(最低)。
>>56 CとC++では変数のスコープが違っているから注意せよ。
C++はわざわざextern付けないと、グローバルにならない。staticはもはや
classやstruct中でしか使われなくなった。
>>62 CでもC++でもグローバル変数の宣言にはexternが必要だが。
cout や cin の out や in は分かるんですが、 その上にくっついている、 c って何の意味があるんですか? command? それとも c++? の略かなんかですか?
cprintf の c と同じ
67 :
デフォルトの名無しさん :2005/08/20(土) 08:41:19
下級者って何?
下級者:自分が分かってないことを分かってるヤツ 上級者:自分が分かってないことを分かってないヤツ
俺:自分が分かってることを分かってるヤツ
71 :
デフォルトの名無しさん :2005/08/22(月) 14:38:09
ヘッダファイルの必要性を教えてください。なんで.cppに書き込んじゃダメなの?
おれは iostream とかも全部 cpp にコピーして使ってるけど全然問題ないよ。 どんなでかいプログラムも一本のファイルになるからお勧めだよ。
73 :
デフォルトの名無しさん :2005/08/22(月) 14:54:10
いかにも掃き溜めっぽい回答乙
>>72 俺もそれやってるよ。ヘッダファイルを全部コピペで一本のソースに
貼り付けてる。プログラムを一つも書かなくても、ソースの大きさが100MBを
超えて、すごい快感だよなww
俺なんか、毎回iostreamとかvectorとか全部コピーするの手動だとめんどくさいから、 全部1ファイルにマージするツール作ったよ。 GUIフロントエンドから、使用したいクラスを選択すると、関連ソースを全部1ファイルに してくれるから、あとは自分のコードを追加するだけという優れもの。
>>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
だから逆に全部ヘッダファイルに書いて、 cpp では include のみというのも いけるよな。 main なんかどんな cpp ファイルでも必要だから、ヘッダファイルに書くのは常識だよ。
>>71 まじめに答えると量が多くなってくると面倒くさくなる。
打ち間違いも心配。コピペでもなんとなく不安。
>>71 じゃぁ私もまじめに答えよう。
コピーペーストだと、一箇所書き換えると
そこからコピーしたファイル全部を修正する必要がある。
.h にまとめておくと、再コンパイルだけで済むのでミスが少なくなる。
--- main.cpp ---- #include "main.h"
ということで、
ヘッダファイル → 大盛りネギダク
.cppファイル → 牛鮭定食
という対応はわかったかな?
>>71
#include "/dev/tty"
#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
根気と世間体を捨てる勇気
たしかに
>>90 の言うとおりだが、
他にコンピュータとコンパイラは最低限必要だな。
あぁ、気兼ねなくネットサーフィンできる環境があると
ちょっとした調べごとがさくっとこなせてベター。
92 :
デフォルトの名無しさん :2005/08/27(土) 19:22:45
なぜ世間体を捨てねばならんのだww
不思議なことに過去の変態犯罪者にプログラマがいない件
94 :
デフォルトの名無しさん :2005/08/27(土) 23:42:57
根も葉もないなw
あぼーん
>>93 勤め人だったら○○在住 会社員の山田太郎
フリーだったら○○在住 自営業の山田太郎
こうなるからじゃないのか?と思った。
「自称プログラマー」ってのが最近あったような気がする
カナシス
>>97 ・駅の点字ブロックに荷物を置いた老人を
線路に突き落とした自称プログラマ。
・親子でキャッチボールしてる所に車で突っ込んだ後、
父親を包丁でメッタ刺しした自称プログラマ。
・出張32◆Rb.XJ8VXow。
100 :
デフォルトの名無しさん :2005/08/30(火) 10:38:42
親父メッタ刺しはプログラマだったかww
朝鮮人じゃないの?
朝鮮人とプログラマは両立しないのか?
103 :
デフォルトの名無しさん :2005/09/12(月) 05:33:53
コマンドラインでコンパイルする際に、いくつもソースが分割されていると面倒なのだけど、何かいい方法はない? やっぱりmakeファイルを作るしかないの?
105 :
デフォルトの名無しさん :2005/09/12(月) 10:33:25
106 :
デフォルトの名無しさん :2005/09/12(月) 11:41:35
newでメモリを2GBほど確保すると、Windows全体の動きがもっさりしてしまいます。 どうすればいいでしょうか?
メモリを増設すればいい。
確保するメモリを減らすとか。
>>107 んー今のマザーボードでは1GBが限界でして。
>>108 少しずつ計算してはまめに書き出す方式に変更する事にしました。
ありがとうございました。
110 :
デフォルトの名無しさん :2005/09/12(月) 13:16:13
2G確保出来る所に驚きだ
>>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 の実行エラー このようなエラーがでます。どうしたらいいのでしょうか?
ファイルがないんじゃないの?
114 :
蕎麦 :2005/09/12(月) 14:51:17
マイコン使って、入力電圧の値によって動作分岐させるプログラムの ヒントを下さいっ! こんな感じの動作が理想です。 ・入力電圧が1Vなら動作A ・入力電圧が2Vなら動作B ・ ・ ・
ヒント: 分岐命令
116 :
112 :2005/09/12(月) 15:22:07
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
>>117 (・3・)エェー そんなこと位自分で調べろYO!
エラーが収まるまでプログラムの最後に ) とか } とか ] とか 適当に閉じ括弧を付け足していけばいつかはなんとかなるかも。
>>114 1.5V や 1.98V だったらどうするのかと。
122 :
デフォルトの名無しさん :2005/09/12(月) 20:06:06
newで確保してfreeで解放 またmallocで確保しdeleteで解放するとどうなりますか?
バカにされる。
124 :
デフォルトの名無しさん :2005/09/12(月) 21:22:43
malocした後 newしたと同じようにVirtualMethodTable整備など等をこなし、難なくdelete出来るまで揃えられたら、それはそれですごいと言われる。 かと言って尊敬のまなざしは決して向けられない
>>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 エラーがでます。これって何が原因ですか?
Packet socketがオフでコンパイルされてるカーネルだったらプギャー
128 :
126 :2005/09/12(月) 23:17:32
即レスさんくすです。 プギャー ですか。了解。
socketが-1返してるとか(w
会社の研修に落ちこぼれつつあるC初心者です。 ポインタがわからず、本を何冊も読みあさっていたら 今度は普通の変数がわからなくなりました。 変数とは一体何なんでしょうか。 メモリのどこかにあるデータを変数名で参照できるということは、 普通の変数も実体はメモリアドレスを表すポインタなのではないかと いう気がします。 例えば int x = 100; とした場合 メモリのどこかに100というデータが入るわけですが xという変数は、そのメモリのアドレスを持っていて プログラムで変数名を書くと暗黙的に*が付いて アドレスの示す先のメモリデータを参照している のでしょうか。だとしたらポインタの存在意義は? 頭がおかしくなりそうです。
131 :
デフォルトの名無しさん :2005/09/13(火) 03:24:21
ポインタはメモリアドレスと型情報を格納する変数だと思えば?
>>130 > 変数とは一体何なんでしょうか。
値を格納するためのもの、なんだけど、130にあわせて言うと
「プログラマがアドレスを指定する手間を省くためのもの」と言った方がいいのかな。
アセンブリレベルで見れば、変数への読み書きは特定のアドレスに対する読み書きそのものなんだけど
重要なのは、そのアドレスが「どこか」をプログラマが知らなくていいこと。
仮に変数がなかったら、プログラマが「メモリのどこに書き込むか」を指定しなきゃいけなくなる。
C言語のような高級言語がない時代には、実際にそういう作業をしていた。
けど格納するべき値が1000個や2000個になってくると、アドレスを管理するのも大変になる。
それが面倒だってんで、アドレスの管理をコンパイラに押しつけて
プログラマは名前(変数名)だけ管理すればよくなった。これが変数の意義。
130に書いてある通り、メモリ操作さえできれば、変数なんてなくても計算結果を格納することはできるけど、
それじゃ面倒だから変数というものを導入した、と考えてみては。
> ポインタの存在意義は?
ポインタの存在意義は、メモリの直接操作ができること。
変数の導入で、プログラマはアドレスの管理からは解放されたけど、
同時にメモリを直接操作することができなくなってしまった。
(普通の変数のアドレスはコンパイラが勝手に管理してしまうから、プログラマが手を出せない)
OSや組み込み系のプログラムに使う場合は特にだけど、
普通のアプリケーションでも効率を上げるためにメモリを直接弄ることはままある。
これは困った、というわけで、ポインタというものを導入して、メモリを操作する抜け道を造った。
という流れで理解してみたらどうでしょう。
かなり説明のためにハショったりねじ曲げてる箇所があるから
真面目に説明する人からはお叱りを貰いそうだけど・・・
長文・乱文スマソ
>>130 ふつう。
int x;
としたら、xにアドレスは入れない。
int *p; としたら、pを整数格納用途には使わない。
今年の初めからコンピュータ言語を勉強し始めた者ですが・・・・。 WINAPIをかじったおかげで、画面になにかを表示するには機械語でOSに指示を だせばよい、ということは理解できました。 ただ、じゃあOSはどうやってブラウン管の電子銃に指示をだしてるのか(液晶なら 電荷関係の支持をどうやってだしているのか)、その結びつきがわかりません。 明日大きな本屋にいっていろいろ調べてみるつもりですが・・ 一応、ここにも書き込みをさせていただきました。 たとえばですが・・OSの介在なしに、ブラウン管の電子銃に指示をだす・・ なんてことは可能なのでしょうか??
>>134 VGAに直接指示を出す。しかしディスプレイドライバが組み込まれているので、
直接I/O命令を出すと、OSにトラップされてエラーが出るぞ。OS無しなら可能。
OSでもMSDOSでしかも仮想86モードを使ってないような状態なら可能。
うわっぼるじょあのままだった。
DOS 上だと、わりとVGAいじりやすいんだけどね。 昔はビデオモード設定して16色BMP表示とか、みんなやってたよ。
電子銃そのものにソフトから命令できんのか? せいぜい走査線割り込みジャマイカ。
私書箱100番っていうのがあるわな? メモリ上にはいっぱい私書箱があるわけで、私書箱100番、がポインタ。 私書箱100番、のなかに入ってる12345とかいう数値の書かれた手紙が変数の値。 どよ?
>>139 >>130 はポインタの動作を理解してないわけじゃなくて
コンパイラによる変数の実装と、言語仕様としてのポインタを混同してるだけだと思われ
>>138 ソフトで出来るのはどう頑張っても VRAM への書き込みまでですな。
そこから先はハードウェアの仕事。
142 :
139 :2005/09/13(火) 17:26:01
よく読んでなかったスマソ
変数の中には値が入っていて、ポインタの中にはアドレスが入っている 単純にコレじゃ納得いかんのか ただしC言語で配列はポインタって言ったら怒られそうだな… int tmp[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; printf("%d", 2[tmp]); printf("%d", tmp[2]); これで上と下は同じ結果になるからやってミホ
配列とポインタは別物だ、ボケ。 ただ文脈によって「特例で」おなじに見せているだけだ。
シュガシュガルーンってやつですね
式の中ではむしろポインタと配列の違いが見せ付けられるときが特例。
147 :
デフォルトの名無しさん :2005/09/15(木) 14:13:33
辞書をひいたら、 「まんこ」→「おめこ」 「おめこ」→「まんこ」 と永久ループになっていて埒があきません。どうすればいいでしょうか?
148 :
デフォルトの名無しさん :2005/09/15(木) 14:43:04
関西ってまんこと言っても何の事か通じないヤツもいるらしいな
main関数はなぜint main()なの? void main()じゃだめなの?
void mainが仕様で認められなくなったの何時からだったっけ C99?
>>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はいつ変換されるんですか?
>>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マクロをワンクッション置いて使ってるのかと。
ていうか使い道のないコードだな。
(ISO/IEC 14882 16.3.1 : 実引数を代入する前に、実引数中の全てのマクロを展開する) ので、Xstr(OP); ではまずOPが展開される。 ただし、#や##に対応する仮引数は先に展開されない(同 16.3.1)から、 うあw、酷い仕様ですね
160 :
デフォルトの名無しさん :2005/09/23(金) 07:05:07
>>159 実際、この展開規則をまともに実装するとなると骨だよ。
仮引数を見つつ、#に関係する引数については評価から外さなきゃいけない。
つまり2パス。
何のためにそういう仕様になってるのだろう? 教えて偉い人
>>162 それがどんなものであれ、無いよりは有った方が良い。
それを不要だと主張する者は、それを使わなければ良い。
という考え方が根底にあるからw
不要とかではなくて、なぜ1パスで処理してしまわないのか疑問だなぁと。 先に評価しておく必要性があるんでしょうか。
>>164 #のない頃のプリプロセッサとの互換性をなんとか維持しようとした苦肉の策だった気がするが、具体的なことは忘れた。
>>166 ナンギな都合があるんですね(´・ω・`)
ありがとうございます。
>>156 はじめてみて、やっぱりあきらめようかなと思った時は、
無料の方がふん切りがつきやすいんじゃないかな?
お試し版の C とかあったよね。
あと、DEVC++とかの日本語化がされてないやつとかはあきらめやすいんじゃ
ないかな?
169 :
デフォルトの名無しさん :2005/10/04(火) 18:06:46
〇_〇 ヘ⌒ヽフ ( ・(ェ)・) <クマー ( ;・ω・) アワワ /J ▽J ⊂ O し―-J ( / ≡ ⊂\_)
170 :
デフォルトの名無しさん :2005/10/04(火) 19:26:26
>>168 無料だと、又やってみようかな?って思うぞ
金払ってるともう2度とこんな無駄金払ってられないってなるよ
>>170 ということは、自分の時給換算ができる人は有償の C 言語を検討した方が、
身のほどを知った時無駄な時間を失わずに済むってことですね。
172 :
デフォルトの名無しさん :2005/10/04(火) 21:41:59
ただいま独学でC++勉強してますが、 &や、*のせいで挫折しそうです。 なんか、こうイメージ的にわかりやすく説明してください。宣言の時と使用時
>>172 int *p;って宣言は「式の中で*pと書くとint型の値が得られる」と読む、っていうのはよく言われる。
C++ って * はあんまりいらないんじゃないの? イテレータからコンテナの中身を取り出す時だけ? & は関数宣言で引数におまじないで付ける位に考えておけばいいんじゃないの?
頼むから参照使う時はconstと非constを使い分けてくれ。 あれで何人が壊れたことか。
>>174 こらこら、余計混乱するようなことを書くな。
177 :
デフォルトの名無しさん :2005/10/05(水) 00:25:54
C++で自プログラムを強制終了させるにはどうやるんですか? DelphiでいうHaltみたいなやつです。 ググってみたところexit関数という物があるようなんですが、 C++では使うなといったような事が書いてあって、よくわからない状態です…。
main 関数の最後にラベルを定義しておいて goto で飛ばすとか。
ローカル変数のデストラクタを自分で走らせてやればいいんじゃないの?
>>177 C++でもexitは使える。
ローカル変数のデストラクタが呼ばれるように気をつけて使えば全然問題ない。
責任放棄でassert。
なにか例外を投げつけてそれを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とか見るとそういうの一切ないけど、ああいう実装はどうやってやるんだろ?
>>184 通常の実装であれば、formatに完全に依存してる。
formatを1文字ずつパースしていって、可変引数からの値が必要になるような
%dや%fといった文字列が出てきた時に逐一va_argで取り出すから、末端を識別する必要がない。
その代わり、可変引数の数より多く指定してしまったりすると暴走する。
あぁ、そう言うトリックだったか。サンクスコ
187 :
デフォルトの名無しさん :2005/10/07(金) 16:26:23
CreateThreadでスレッドを生成すると、スレッドが終了してもメモリの使用量が減りません・・・ うまくスレッドが終了できてないのでしょうか?
スレッドが終了されてるかはメモリ使用量を見るより、 タスクマネージャのメニューの「表示」→「列の表示」→「スレッドの数」をチェック して調べた方がいい、あと仮想メモリの方が事実上の使用されているメモリ使用量なんだっけ?
>>187 スレッド終了して減る量なんて TLS の分くらいだべ?
190 :
189 :2005/10/07(金) 17:50:12
あ、違。CreateThread か。 そりゃ減らんでしょ。
191 :
デフォルトの名無しさん :2005/10/07(金) 19:07:06
>>188 タスクマネージャにこんな機能があったのかー。初めて知りました。
調べてみたら、スレッドは正しく終了してるみたいです。
>>190 beginthreadの方が良いのですか?
>>191 Cランタイムをリンクしてるならbeginthreadex使わないとリークするぜ。
使わないだけじゃだめ。
CランタイムをリンクしないならCreateThreadでおけ。
193 :
デフォルトの名無しさん :2005/11/07(月) 16:16:38
SSEが使えるかどうかを判別するにはどうしたらよいのでしょうか?環境はgcc4.0.2、Fedora core4です。
>>193 cat /proc/cpuinfo
直接cpuidで調べるのは面倒だな
OSサポートのチェックもあるしな
195 :
デフォルトの名無しさん :2005/11/07(月) 17:11:13
istream::readでバイナリファイルを読み込むと最大文字数も指定しているのに途中までしか読み込まれないのですが バイナリファイルは読み込むとまずいのでしょうか? バイナリpgmファイルを読み込みたいので1バイトづつで調度いいと思ったのですが他の関数にしたほうがいいのでしょうか? winXP VC++6.0です
197 :
デフォルトの名無しさん :2005/11/08(火) 15:44:00
classをnewで確保しているのですが、newって0で初期化してくれるんですか? してくれるクラスとしてくれないクラスがあり、どっちか分からないです。 してくれないクラスは、全て0xcdcdcdcdで埋まっています。 VCの初期化していない状態だったはずですが、ならば0で初期化されているクラスはどうしてされているのか謎です。 コンストラクタでZeroMemory(this, sizeof(クラス))したら一応通りましたが、どうも危険な気がしています。 classをnewで確保する場合、どう0に初期化するのが適切なのでしょうか? ご教授よろしくお願いします
面倒臭がらず変数1コ1コ愛情込めて初期化してやれ
仮想関数テーブルポインタまで真っ白けな悪寒
私は怖いので初期化必要なのはコンストラクタで一個一個初期化する。 そうすればどこでnewしても安心だし。 ZeroMemoryとかmemsetとかはヤバいって話を聞くな・・
というか「使ってはいけない」。
一律ダメと言われても。struct でもダメなのか?
重要なのはstructであるかどうかではなくPODであるか否か
205 :
197 :2005/11/09(水) 14:20:29
意見ありがとうございます。 ZeroMemoryは止めました。 初期化しないと明らかにバグるものやポインタだけ初期化することにしました。 さすがに全部のメンバはやってられないです。 初期化していないとどうも気持ち悪いんですが、C++はそういうもんだと思っておきます。
>>205 初期化してないとどうも気持ち悪いのは当然。
その感覚を欺いてはいけない。
方法(ZeroMemoryやmemsetで初期化すること)が間違っているだけ。
正しい方法はコンストラクタで
Class::Class()
: m_IntegralMember(0)
, m_FloatingPointMember(0.0)
, m_pObject(NULL)
{
}
このように初期化リストで逐一指定すること。
これがC++の作法であり流儀。
カッコで初期化するのか 俺イコールで代入してた
初期化テンプレートをつくって、変数タイプネームを囲んでしまえばいい。
>207 コンストラクタ内部でイコールで代入すると はデフォルトコンストラクタが走ってから さらに代入演算子が走るから効率が良くない悪寒 POD型なら最適化で変わらないかもしれないけど
>>205 仮令Cであっても0で埋めるのはナンセンス。
折角コンパイラがゴミ値を埋めてくれるのを邪魔してデバッグを却って困難にしかねない。
過去に私の周囲でバッファオーバランのバグを生み出した香具師に限って0埋めの習慣があったくらいだ。
>>206 その方法で初期化で例外発生したやつを捕捉したい場合どうするんですか?
212 :
デフォルトの名無しさん :2005/11/10(木) 16:55:24
どうにもC++のコンストラクタって穴だらけな気がするんですがage
>さすがに全部のメンバはやってられないです。 単にクラスが巨大過ぎじゃ無いのか?
C++ってクソだね^^
>>211 A::A()
try
: mem(0)
{
}
catch(...)
{
throw something;
}
キャッチした例外を握りつぶそうとすると自動的に再投されるので注意。
テラキモスww
>>215 これやるぐらいならメンバにRAIIを徹底するか、例外安全なコンストラクタを持った
基底クラスの初期化に分割した方が良い気はするけれど。
初期化リストは、そうじゃないと初期化できないメンバにしか 使わないなあ。
>>205 クラスメンバのうち、0初期化したいメンバだけprivateな構造体にまとめれば、
コンストラクタの初期化ではその構造体をまとめて初期化できるようになる。
こんな感じ。
class hoge
{
public:
hoge() : data(), w(1)
{
}
private:
struct Data
{
int x, y, z;
};
Data data;
int w;
};
ほかにもboost::value_initializedなんて手もあるな。
>>211 初期化で例外投げなきゃならない設計が糞。
さすがは掃き溜め。
>>220 たとえば初期化でnewするときにはどうする?
std::nothrowを指定するとしても、そいつがヌルを返してきたらどうする?
newが失敗するような末期的状態で 例外なんかがまともに動作するのかねえ
>>220 RAII って知ってる?
>>223 例外処理自体は追加でメモリを必要としないから大丈夫。
例外オブジェクトを保持するメモリが必要となるかもしれないが、
std::bad_alloc のインスタンスを静的に持つような実装も考えられる。
>>225 ということはつまり、リソースの要求処理が失敗したときに例外を投げるのも設計が糞だと?
>>226 コンストラクタの例外リークは面倒だぞ?
>>227 はて?思い当たらないが、どんなところが面倒になるの?
例外を、単なる別のエラー処理技法のように扱ってはいけません。 エラー コードを返したり、グローバル変数の設定したりすることと 同レベルだと思ってはいけません。例外は、それを取り巻くコードの 構造と意味を、根底から覆します。例外は、プログラムの実行時 セマンティックを一時的に繋ぎ変え、通常実行しているコードを迂回し、 こういう状況でなければ決して実行されないコードを動作させます。 例外は、エラー状態を認知させ、プログラムの死という罰則を用いて その状態を改めようとします。 このように、例外には単純なエラー処理を超えた特性があります。 これらの特性を必要としない、理解しない、あるいは文書化したく ないなら、例外をスローしてはいけません。 例外以外のエラー処理技法を探してください。
>>229 そんな古い文書コピペして、なんのつもりだ?
>>227 「コンストラクタの例外リーク」って何?
単純にコンストラクタから例外が飛んでくるだけなら、
>>228
「コンストラクタの初期化リスト」の話が、いつの間にか 「コンストラクタ内での初期化」の話になっているのは ここがはきだめだからでしょうか?
なあ適当に作らせたsin波がやけに歪んでるんだけどなんでだろう 専用ソフトで作ると滑らかなのに 一応こんな感じで16bitで作ってるつもりなんだが for(dwCount) dwWave = (short)(100*sin(2*PI*100*dwCount/SamplingRate)); // PI = 2*atan(1)
いつからPIは2 * atan(1)になったんだ?
あすみません こっちへの書き込みだけヴォケましたプログラム上は4*atan(1)でした
sin()の結果に100を掛けたくらいだと、高々±100しか振れないから 16ビット帯域から見ると振幅が非常に狭いし分解能も悪くなるわけだが。 #音として歪むかどうかまでは知らん。
その辺も大丈夫っぽいんです つか*2しただけでピークピーク値が500くらいって何だよこれ(;'A`)
いつからsin()は1〜-1以外の値を返すようになったんだ?
うはwwww結局sinにdoubleで値渡したらうまくいきましたwwwww おまいらサンクスコ
>>241 おいこら、PI = 4 * atan(1)って書いてあるから当然にdoubleになっていると思ったじゃねぇか。
ちゃんと<math.h>をincludeしろよ
244 :
243 :2005/11/21(月) 12:57:31
ごめん。勘違い。
246 :
デフォルトの名無しさん :2005/12/07(水) 22:04:39
C++で関数ポインタってどうやるんですか? 今調べた限りだと、メンバ関数ポインタ?のようなのを使うのかな? もしくは使うべきじゃないのかな? こうやるのがスマートみたいなのがあれば、教えて下さいー。
247 :
246 :2005/12/07(水) 22:05:48
使うべきじゃないというのは、関数ポインタよりもっと良い方法があるから、C++だったらそっちを使うのべきって意味です。
>>246 メンバ関数ならメンバ関数ポインタを使う
そうでないなら関数ポインタを使う
249 :
デフォルトの名無しさん :2005/12/22(木) 12:28:39
c/c++を使ったプログラムの計算結果を CADなどに図で出力することはできますか?
251 :
249 :2005/12/22(木) 12:54:21
即レスありがとうございます。 図々しいですがもしご存知でしたら 詳しいサイトなど教えて頂けませんでしょうか?
>>249 CADじゃないけど、出力をExcelでグラフにするのはよくやってますよ。
ファイルにCSV形式で出力して、後はExcel側で読んでグラフにするだけ。
253 :
249 :2005/12/22(木) 13:05:49
ありがとうございます! 今回は構造物の変形を条件を変えてCADで見たかったんですが それも便利ですね、勉強してみます。
1) char (*a)[5]={"ああああ","いいいい","うううう"}; 2) char (*a)[9]={"ああああ","いいいい","うううう"}; 3) char *a[]={"ああああ","いいいい","うううう"}; 4) char a[5][9]={"ああああ","いいいい","うううう"}; 5) char *a[3]={"ああああ","いいいい","うううう"}; 6) char *a[9]={"ああああ","いいいい","うううう"}; 上の中から同じものを選べ
3,5だな。 しかし、文字列リテラルはconst char *で参照するべきだ。
Q1 海は死にますか? Q2 山は死にますか? Q3 風はどうですか? Q4 空もそうですか?
お前は死ぬ それだけは間違いない
ポインタに格納されているアドレス値が有効な値かどうかを厳密に調べる方法はありますか?
>>258 厳密に言語仕様だけで考えると、ポインタにアドレス値が格納されているとは限らない。
アドレスが格納されているとしても、「有効な値」とは何かを定義しないとわからない。
>>259 当然、初期化されていない場合などは値は不定だったりするわけですが、
少なくとも(明示的に割り当てが行われて結果かどうかは不問として)
参照可能な領域(ユーザー空間)を指しているかどうかを調べたいのです。
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 が代入されている… のもなんですが、そもそもどうしてアクセスが出来るのかわからなくなりました
struct B { int b; int c; }; のようにメモリ配置を変えてみたのにこれはなぜ良いのですか?
267 :
265 :2005/12/23(金) 17:46:47
いちおう問題は変えたつもりなのですが…マルチは言われるの覚悟でしました すみません まだよくわかんないです 決してネタじゃないです
268 :
デフォルトの名無しさん :2005/12/23(金) 17:57:09
>>267 C++のキャスト演算子使う習慣付けた方がいい。
そういうキャストはまずいってすぐにわかるから。
>>268 レスありがとう!!
reinterpret_cast<struct B*>(pa) これでいいのでしょうか?
まずいのは承知なんですが、どうして代入できるのでしすか? メモリ配置が同じって言っても
struct A の a.a と struct B の b.b 配置されているアドレスは別物じゃないんですか?
270 :
デフォルトの名無しさん :2005/12/23(金) 18:20:31
>>269 reinterpret_castを使わないとコンパイルできないだろ。
これを使うという事は、何が起きても自己責任で、という意味だ。
上のプログラムがたまたま動くのを理解するには、ポインタの知識が
あればよい。従って、ポインタを勉強しなおしましょう。
272 :
266 :2005/12/23(金) 21:40:37
>>269 要は、無理矢理キャスト(reinterpret_cast)したと言うことは違うものを同じモノと見做すことになる。
詰まり、そういう結果になることが予測つかないのならやるな、ということだ。
273 :
266 :2005/12/23(金) 21:49:07
274 :
263 :2005/12/23(金) 22:33:57
>>273 なんか皆様の大変な怒りを買ったみたいで申し訳ありません。
「スミマセン」「申し訳ありません」としか書きようがなくこれでスレ消費するのも
結構考え物だと思ったりする訳です。
マルチしてしまった事も自分なりに考えがあっての事です。
初めは 【初心者歓迎】C/C++室 Ver.24【環境依存OK】 で書き込みしたのですが、
レベルが低すぎたと思い はきだめC/C++下級者の質問箱 に移行。
それから、やっぱり低レベルな(アセンブリ的?)話だろうと思ったから
C言語なら俺に聞け! Part 119 に移動しただけです。
質問を微妙に変えたのにだって、単なるコピペじゃそれこそ馬鹿にしてるみたいで失礼じゃないですか。
「ありがとう」とレスしたい所だったのですが、それだって同じ言葉の繰り返しで結構考えたりするんですよ(;д;)
気に障った方々すみません。
初心者だから鬱陶しいのは重々理解しております。けれど、自分みたいな馬鹿は誰かの助けを借りないと先にも進めなかったり
するんですよ。
教えてくれる人も周りに居ず、ぶっちゃけここぐらいしか頼るとこがなくて一杯一杯なんです。
だから煽って頂くのは別に構わないのです。ただ、恩義に思っていない訳ではないというのをご理解ください。
長々とすみません。今回のマルチポストに関する無礼はこれにてお許しいただきますようお願いします。
>>274 その3つのスレを、今は初心者スレ、後でC言語スレ、っていう風に巡回している人間の立場を考えてみてください。
現に>266さんは>272を書き込んだ後8.5分後に>273を書き込んだわけで、その間に恐らくC言語スレの派生質問を見たのでしょう。
>266さんじゃなくても例えば初心者スレで最初に書き込みを見つけて、レスをつけたところ全く同じ回答がCスレであったとしたらどう思うと思います?
コピペじゃないことで、「マルチじゃない」と言い逃れをするように見えて、却って失礼と言うものです。
そもそも最初の質問が適切であれば、そこから派生した質問は同じスレで多少スレ違ってきても続けるのは普通です。
それを断りもなく他に行けば、「あんた等の回答には不満だから他に行くよ」と言うようなもんですよ。
どうしてもと言うならそれを両方で一言書いておけばいいだけのことですし。
結局のところ、他人のことを考えているようで自分のことしか考えてないあなたに問題があるのでしょう。
#なんてC言語スレで書いたら荒れそうだけどw
はきだめの方が荒れてないってのも興味深いなぁ。
>>274 移動する旨一言残してから移動すればいい。
改善する気がありそうなので次から気を付ければいいよ。
と今来た俺が言ってみるテスツ
>>274 はぁ? マルチした理由がそれ? ふざけんな。
移動するのなら最低でも移動する趣旨を書いてからにしろ。
お前の問題を何人にも解かして人的リソースの無駄遣いをさせるな。
初心者だから鬱陶しい?
初心者を言い訳にするな。初心者でも態度がまともなら問題ない。
てめぇの勘違いした行動が最低なだけなんじゃボケ。
# 煽って頂くのは別に構わないらしいので煽ってみる
初心者なのとマナーが悪いのとは別だな
今日はクリスマス☆イブなんだから許してやれよ。
私も皆さんと同じように、クリスマスイブだというのに一日中家に引きこもっている上に童貞なので馬鹿を煽るくらいしかすることがないんです。
MACRO({ ...; ...; }); これに対するcppの動作って規格で保障されてますか?
>>282 その文のなかに裸のコンマ(ふつうは逐次演算子)がなければ大丈夫。
C++でWINDOWSプログラミング教えてくれるサイトないですか CじゃなくC++で
MSDN
腐るほどあると思うが。大抵MFCは使っているだろうけど。 そもそも、C++はほぼCの上位互換だし。
Qt はC++じゃなかったっけ
>>285 まずC++だけを勉強しろ。
次にWindowsプログラミングだけ勉強しろ。
最後にその2つの知識を応用してC++でWindowsプログラミングをしろ。Windows関連のクラスライブラリの勉強も良かろう。
MFCってただで使えるのか?
むりぽ
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がフリーで使えるから、出来るんじゃない?
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++に制限を掛けるプログラムを開発します。 具体的に言いますと、多重継承とか名前空間を使えなくするシステムです。 宜しくお願いします。
それより名前空間って訳語なんとかならない? ミ ゚ д゚ミ
>>297 仮想関数も禁止というのはどうでしょう?
>>298 名前宇宙。
まぁ、名付き宣言場所とか?
>>297 なぜそのような制限が必要?
逆に言えば多重継承や名前空間はC++にとって必要だったからC++に導入されたのだ。
それを制限するというからには何か深いわけがあるはずだ。
>>297 C++ をシンプルにというコンセプトだから、名前も思い切って++とかを取って
C とか名付けると良いでしょう。
いや、小文字にしちゃおう。cゞミ^0 ^ *ミ チッチャイー カワイー
石化されそうで嫌だ
>>298 namespace 名前空間
になんか違和感あるかな?
至極無難な訳語だと思うけど。
JAVA風に"パッケージ"じゃ駄目?
"namespace"を"パッケージ"って訳すのか?
>>297 組み込み用のC++ってそういう感じの規格だよ
パックアゲ
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <こいつは最高に アホ 彡、 |∪| / / __ ヽノ / (___) /
>>305 いや……だから……英語で space つったら隙間(0x20)
や広がり(宇宙)みたいな意味を含むんだろうけど、
日本語で空間つったら、明らかに3次元の含意。
「単語と単語の間に空間を空ける」
とはゆわないもん。名前が3次元に配置されてもなあ。
名前面積
数学的な意味の空間は3次元だけじゃないぞ
もうネームスペースでいいじゃん!!
「名前が含まれる空間」で名前空間。実に明確な名前だと思うがなあ。
さあ、みんなで variable=変数 の訳語の変さについて語り合おう
変か・・・?「可変子」とか? むしろ関数のほうがワケワカメ。あと引数も。添え字ももうちょっとなんとかなりそうだ。
virtual 仮想モナ
>>316-317 添え字以外は、C/C++ができるよりもずっと前に数学用語でそう訳されたものなのだから、
その是非をC/C++のスレで論ずるのはどうかと思う。
数学の訳語を流用するなという話ならともかくだけど。
バカばっかだな ここ スレタイどおりだw
321 :
317 :2005/12/31(土) 13:32:51
>>319 いや、それはわかってるけど。
ネタレスだと思って勘弁してください。
数学用語といえば添え字もそうだとおもってたけど違うんかな。
悪かった。よく考えるとメモリー空間とかアドレス空間とか言うので慣れの問題だった。 でもまあ名前は順列組合せなので一次元だし、メモリーもアドレスも一次元だし、 単に名簿でよかったじゃん ミノд ; ミ シクッ
関数オブジェクトですか?わかりません><;
むしろ引数が湯桶読みな件のほうが
どんな問題
インライン関数でクラスのプライベートメンバを帰す場合 きちんとインライン展開されますか? つまり class Foo { private: int value ... public int GetValue(){return value; } }; という風にクラスFooを定義した場合 GetValueはインライン展開されるのかどうか、ということです
インライン展開そのものが処理系に判断を委ねられているものだからなんとも。 インライン関数はその呼び出しのコストを出来るだけ抑える努力をする関数ってだけだし。
>>328 コンパイラにもよるが、最適化を一切しない設定の場合は一切インライン展開しないか、
インライン版と関数版の両方のコードを含む。
>>329-330 レスさんくすです
つまり処理系と最適化オプションによる、というわけですか
作られる関数郡はあまり頻繁に用いられるものではないですが
1行、2行のものはできるだけインラインにしたいなと思いまして
普通はインライン展開されると信じる。
>>332 「普通」とか、自分にしか通じない基準を論拠にするものではない。
>>333 「普通はインライン展開される」と信じる。
じゃないの。
#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使ってます
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のみ?
>>340 %fもdouble。
というより、printfを呼び出すときに
引数のfloatをdoubleに暗黙的に変換するので、
float用のフォーマットは無い。
ただ、scanfでは%fがfloat、%lfがdoubleなので、
うっかり、printfでもdoubleを使うときに%lfを使う人が続出したので
C99で%lfもdoubleになったという経緯がある。
ゆえにC99以前ではprintfで%lfは間違いなので互換性を気にするなら使わないほうが無難
>>339 char と同じサイズの整数。
char は符号を持つ場合があり、
unsigned char は符号を持たないかわりに
char よりも大きい値が使える場合がある。
片手落ちやな。 そこまで説明するならsigned charとの違いも説明せな。
>>343 >339 へのレスなんだから、これでいいだろ。
>char と同じサイズの整数。 この辺りが微妙。
342じゃないけど 文句があるんだったら黙って補足すればいいのにw
unsignedであることを説明せんと。
unsigned
unsignedであるとはツンデレラであるということだ
>>339 char c = 0x80;
unsigned char c = 0x80;
前者は警告が出るが後者は出ない。
てことはsignedはデレデレか
質問です。 特定のファイルがあるかどうか調べるにはどうすればいいのでしょうか? 今は、fopenでそのファイルを開き、NULLが返ってくるかどうかで判別しているのですが、 あまりスマートなやり方で無い気もします。 もし他に良い方法があれば教えてください。
>>353 裏表あるって意味でsignedのがツンデレっぽいなw
どうでもいいか
>>354 Windowsっていう縛りがあっていいならAPI呼び出し。
Windows95でIE3以前だとDLLは入っていない。
#include <shlwapi.h>
BOOL PathFileExists(LPCTSTR Path);
>>354 大抵の環境で使えるという程度の互換性でいいのなら、stat()でいいと思う。
fopen(..., "r")は、ファイルの存在検査ではなくファイルの可読性の検査になるということに注意。
つまり、unixなどでは存在するのに読めないファイルに対してどうするべきか検討する必要がある。
大抵は「読める」≒「在る」だろうけれど、「なかったら作る」という状況ではそれは拙いかも知れない。
>>352 char c = '\x80';で問題ない。
もっと言えばchar型が9ビット以上あれば0x80でも警告は出ないだろう。
>>358 struct stat 作るのまんどくさいので fopen("
>>358 ","r") でよさげ。
読めないけど書きこめるへんなファイルなんてこわしちゃってよさげ。
>>359 バイトが 8 ビットでないかもしれないなんて考えないでよさげ。
>>360 >読めないけど書きこめるへんなファイルなんてこわしちゃってよさげ。
読めも書けもしないファイルかも知れず。
つーか、他人が読み書きできないだけでそのファイルのオーナには読めるかもしれないわけで。
#もしかして、シングルユーザな環境しかご存知ない?
つまり考え出すときりがない。
>>361 君は疲れてるんだよ。はやくねなさい。
>>360 は、
>>358 の結部「『なかったら作る』という状況」を受けてるので、
「読めも書けもしないファイル」があったら、
"r" でエラー → 無さげと判定 → "w" でエラー → あら実はあったのね
"w" でえららなかったらあぼうんでよさげ。
364 :
デフォルトの名無しさん :2006/01/30(月) 08:22:20
ウインドウズに挑戦してる超初心者なんだけど、おまいら教えてください。 wprintfをつかったら出力はどこに表示されるの?
標準出力に表示されます
「どうしてコテってのは莫迦ばっかりなのはなぜ?」 とかいうスレをマ板辺りに勃てたくなってきた。
>>366 俺は『どうして〜〜なぜ』
という明らかに変な日本語を書く
>>1 の方がたぶん莫迦、と真っ先にレスするな
>>354 > 特定のファイルがあるかどうか調べる
access()
>>364 ちなみにもしもwsprintfのことなら、それはCのsprintfと同じで文字列に書き出される。
370 :
デフォルトの名無しさん :2006/01/30(月) 17:48:13
ベクタのend()は一度イテレータ宣言してそこに記憶させておいた方が高速ですか? それとも、いちいちループ終了判定の度にend()呼び出しても変わりませんか?
>いちいちループ終了判定の度end() for_each()の方がよくないか?
>>364 超初心者ってことは、「通常の状態では黒っぽい窓に出力される」とか答えたほうがいいかもしれない。
黒っぽいものが表示されなかったら、標準出力がファイルとか別のところに割り当てられている。
黒っぽいものが表示されて、すぐ消えるんだったら、正常。
間に合わせでよければ、次の方法。
wprintfの次の行に、getc(stdin);とでも書いておけば、Enterキー押されるまでは表示されつづけるよ。
printf();とかってなんであんな複雑な引数取れるんですか? 第二引数がintだったりcharだったりetc etc... 不思議でならない
printfの関数の内部で引数が何であるかチェックしているからですよ。
どーやって?void *とかで受けて後はどーやってチェックするのん? 後引数の数が違っても平気なのもスゴいと思う
>>375 %dとかの書式指定を当てにしている。
だから書式指定と違う型を引数にするとまずいことになる。
(たまたまうまくいってしまうことも多いが)
>>373 stdarg.hを調べると良いと思う。
>>376 そーなんだ…
そういえば間違えてセグメンテーション違反とか言われた事あるなぁ…
>>377 すげぇ、ちょっと感動した そーなのかー
380 :
デフォルトの名無しさん :2006/02/02(木) 04:17:16
インテルコンパイラはAMDのプロセッサに対してもちゃんと最適化されますか?
382 :
デフォルトの名無しさん :2006/02/02(木) 17:20:56
配列の個数を求めるにはどうしたらいいですか?
>>382 配列の名前をAとすると
sizeof(A)/sizeof(A[0])
但しAがポインタの時には上手く動作しないので注意
>>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 どうもそれで動かないなぁと思ったらポインタのせいでした・・・
他の変数に数を代入します。
>>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;}
size_tってunsigned int だろ? 別に%dでも%uでもよくね?
size_tはunsigned intだとは限らないから、%uでも%dでも受けられない。 unsignedにキャストして%uで受けるべき。
389 :
388 :2006/02/02(木) 18:53:23
C99では%zで受ける。
%zじゃなくて%zuね。
intとlongは32bit。ポインタとsize_tは64bitかもしれない
リスト構造って、プロはすぐに、プログラムの流れを想像設計して、打ちこんだり できるもんなんですか? 自分が見てる本の例題のソース書くと糞長くなるので書かないですが 「ここで、構造体のメンバでポインタ使って、つぎに構造体のメンバの 構造体の構造体ポインタ変数にこれを代入して、次のポインタ・・・・」って、 ソースを読むとなんとなくわかるけど、結局俺は、40%くらいしか理解できてないだろうから 100%理解できてないなら、理解度0%だろうと思ってるし・・・ やっぱ、数ある良い例題プログラムを覚えても理解できてないなら、暗記しただけだし ああ、わかんねぇ・・・ 入門書の次に読めばさらに理解度が深まる本はないですかね
心配しなくてもそのうち解かるようになる
>>392 最早C++ならいちいちそんなことを意識する必要がないので、ずっと気楽だがな。
395 :
デフォルトの名無しさん :2006/02/02(木) 20:40:24
>>392 最初は分からないでいいよ
ざっと読むだけじゃなくてここはどうしてこんなことしてるのかな?とか考えながら読んでいけばそのうち分かってる
入門書の次はそういうテクニックを網羅してるアルゴリズム本がおすすめ
>>391 intとlongだって64bitあるかもしれない。
冷蔵庫に牛乳があたかもしれない
398 :
392 :2006/02/02(木) 23:48:59
一言いわして。 ありがとう。 はげまされて、うれしくなっちゃった。 精進します。
それなんてヨーグルト?
401 :
デフォルトの名無しさん :2006/02/03(金) 10:08:28
すいません、 linuxで、フォルダ内のファイルを次々に読み込む、というプログラムを作りたいのですが、 どのようにすれば良いでしょうか?
man opendir
>>396 正確な定義
char<short<=int<=long
404 :
デフォルトの名無しさん :2006/02/03(金) 22:17:47
つfindfirst, whileループ, findnext, findclose, fopen
405 :
404 :2006/02/03(金) 22:19:53
すまん。UNIXには移植できないと書いてあった。DOSとWindowsだけだ。
>>401 boost::filesystem::directory_iterator
初めまして C言語を勉強し始めたばかりの下級者です 質問なのですが whileの終了条件をbreakで決めた場合、そのwhile構文の中身をN回繰り返すにはどうしたらいいのでしょうか? forやwhileを↑のwhile文の外につけてみてもN回繰り返すプログラムが出来てないみたいなんです。 説明ベタでごめんなさい、お願いしますm(_ _)m
n=0; while(1){//無限ループ if(n>=5)break;//nが5以上になればbreak n++;//n加算 } 5回繰り返す
>>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 えと・・・聞くのが恐いんですが・・・私何かとてつもなくおトンチンカンなことしてますでしょうか・・・?
>X==20となって終えるという行為を、30回繰り返したい これだけ考えて答えるけど while(1){ if(j==30)break; while(1){ if(n==20)break; n++; } j++; } 外のwhile文で中の20回繰り返すwhile文を30回呼び出してる 回数指定→for 条件に達するまで→whileと使い分けた方がいい
( ゚д゚)ポカーン 久々に激アツなコード見た。
>>412 ありがとうございます!
breakは適用されると下に行くんですね。だから下に「j++;」を入れるのですか。
すごいすっきりしました。ありがとうございます。
余談ですが、教えていただいた通り直しても、なぜかプログラムが思うような結果にならず泣きそうになりました・・・
きっとどこか違うとこがあるのだと思うので、頑張ってやってみます。
お世話になりましたm(_ _)m
ヒント1:x==20の条件を満たすのは1回だけ ヒント2:x==20の条件を満たしたからwhile()ループを抜けているわけではない
>>414 ごめんnを0にするの忘れてた
while(1){
if(j==30)break;
n=0;//0にする
while(1){
if(n==20)break;
n++;
}
j++;
}
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' : スタティック メンバ関数内の不正なデータ メンバへの参照です」 です。よろしくお願いします。
>>417 operator newは常にstaticなメンバ関数だから、
非staticなメンバ変数を使うことはできない。
そもそも、メンバにアクセスできたとして、いったいどのインスタンスのメンバにアクセスするつもりなんだ。
>>417 どういう理解をしてると、CTest::operator new()のcount++より
CTest::CTest()のcount = 0の方が先に実行されると思えるのか
あと、どうでもいいけど、値を評価するのでない限り
後置++じゃなくて前置++を書く習慣をつけた方がいいよ。
K&Rの影響で、何でもかんでも後置にする奴がやたら多いんだけど。
420 :
414 :2006/02/04(土) 01:06:25
>>415-416 な、なるほど・・・!
内側の変数をbreakが終わった後リセットしないといけないんですね。
これでなんとか様になってきたようで嬉しいです。
でもまだ出来てないみたいなので必死に頑張ってみます。ありがとうございました!
421 :
デフォルトの名無しさん :2006/02/04(土) 06:14:05
C言語始めたばっかりで幼稚な質問なんですけど、91を素数かどうか判定するプログラム教えてください!
return 0;
// 素数なら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; }
>>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;
}
>>424-425 乙
1は素数じゃないよ。だって、1の約数は、自分を含めて1個しかないでしょ?
2は素数。偶数で唯一の素数。
3以上は上のプログラムでOK。どうやったら高速化できるか、工夫してみて下さい。
あと、間違って0以下の数が入力された場合は、どうしたらいいでしょうか?
もちろん、これは、
>>421 さんへの宿題になります。
ちなみに、1を素数にしちゃうと、素因数分解が何通りもできることになる。6=2*3*1*1*1*1*1
>>426 424,425ともに2は素数としているがな
1が素数かどうかはルールの決め方でどっちとも取れる。 ただしどっちにしろ、結局1は特別扱いすることになるが。
1は素数に含めないのが一般的だと思う。
>>425 約数の探索範囲は、2〜nじゃなくて2〜sqrt(n)だよ。
>>430 424はそうしている。
425はそれを知った上で簡略化のためにn−1まで回しているに過ぎない。
432 :
426 :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です。みんな真剣に考えてくれてありがとう!!とても参考になりました☆
C言語の文法を教えて下さい><
>>436 なるほど!><
つまり画面に「こんにちは」と出したい時は
class J2ch
{
public static void main(String args[])
{
System.out.println("こんにちは");
}
}
てやればいいんですね!><
>>438 それは間違っている。
伝統を重んじて"hello, world"を画面に出すことから始めないとうまくいかない。
(V)(´Д` )(V) あ、うんこ漏れそう
>>439 突っ込みどころはそこではなくてclass名が「J2ch」という変な名前のところだと思うのだがどうか
いや、printf或いはputsを使っていないことのほうが。 それにManaged C++でもC++/CLIでもクラス内のstatic void mainから始まることはないというのも。
>>441 いや、きっとたぶん
>>438 はコレをコピペしてもらいたかったのだろう。
∧ ∧ ちんぽっぽ こないでください
_ (*‘ω‘*) __ _ ( ;><) __
/ ( ( つ┳つノ \ / ( ( つ┳つノ \
/ l ̄ ̄ ̄ ̄ l ヽ / \ ̄ ̄ ̄ / ヽ
| ● ● | | \ / |
| * (_人_) * .| | / \ |
ヽ ノ ヽ ./ \ ノ
〜〜〜 ◎――――――――◎ 〜〜〜 ◎――――――――◎
ねぇそろそろマジ突っ込み入れていい?
半音sageでお願いします
入れちゃお^^
>>438 それはJavaじゃあぁぁぁぁぁぁぁぁぁぁぁぁ!!!!!!
ナ ゝ ナ ゝ / 十_" ー;=‐ |! |! 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
う、うむ・・・
ΩΩ Ω<ナ, C#じゃなかったのか
>402,404,405,406 遅くなりましたけど、ありがとうございました。
すっごいくだらないかもしれませんが C と C++の違いってなんですか?
親と子の違い
C→非オブジェクト指向プログラミング言語 C++→C派生オブジェクト指向プログラミング言語 オブジェクト指向ってのは関数とかデータの部品化 Cでテレビを作るとしたら入力関数、出力関数、表示中データを別々に置かなくてはならないが C++ならデータや関数を一つの箱に入れてテレビ型の部品として管理できる テレビとパソコンをつなげばテレビパソコンになる
>>453 いろいろツッコミたいところだが、
かといって突っ込んでたら本一冊くらいになるのであえて何も言わない俺って凄い
C++:Cの上位、Cと互換性を保ちつつオブジェクト指向を取り入れた様なもの
詳しくは本一冊嫁
C++: Cの派生系、templateを用いたgenericsなプログラミングが特徴 あと、大したことではないがオブジェクト指向も出来ないこともない。
気分的に違う
どうせC++なんてCもどきくらいにしか使えない 精々Classでまとめて便利〜とか思うだけ
Cしか使ったこと無いだろ
C++でSTLとboostを使うようになってからは、 個人的にはalgorithmとか標準のコンテナが存在しないCにはもう戻れなー
type-safe linkageテラモエス
アルゴリズムを書けない子供達
アルゴリズムの再利用性を考えずに毎回一からご丁寧に書く大人達
ブラックBOXはブラックのままでいいんだよ なんでもかんでも1から作る古き良き時代は終わりました
string arg = accumulate(argv,argv+argc,string()); Cだとこの程度の作業も長々と書かないといけないから嫌い。
CにStringなんてあったかな
C++では
>>465 のように書けるが、Cでは多くのコードを書かなきゃいけないってことだろ?
じゃあCにstring型作るか
469 :
465 :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; }
手間というほどか
まぁC++でしか使えないものもあるしC++に興味を持っていて暇なら勉強してみるのが良いかもね
Cでstringあっても使い物にならん オペレータをオーバーラップできなきゃなぁ・・・
C++ = ベタな C
C++ = きんたまみたいな存在
しかし、俺の周りではC++はよく表にでてくるのにObjective Cはあんまり聞かないなぁ C++の方がエッチが言語だということは分かるが
>>475 Mac OS XとかNEXTSTEP関連触れればObjective-Cも出てくるんじゃないか?
Windowsアプリケーションを作りたくてプログラムを始めました。 Cの入門書終えたんだけど、次は 独習C++と Visual C++〈1〉はじめてのWindowsプログラミング どちらを先に勉強した方がいいのでしょうか?
479 :
478 :2006/02/10(金) 00:17:19
あと、ゲームのプログラムも組んでみたいです。 2Dシューティングゲームみたいなものを。
Cからの移行ならC++はあまり覚えること無いからまずはC++に入ってからWinAPIかな C++のクラスは完全に理解しなくても大丈夫 仮想関数とかフレンド関数とかサッパリ
481 :
478 :2006/02/10(金) 00:40:52
レス有難うございます。 独習C++ > はじめてのWindowsプログラミング の順で取り組んでみようと思います。
>>480 (純粋)仮想関数はインタフェイス表現するのに必要だよな。
フレンド関数はクラス渡り歩くときに必要・・・か?
フレンドはあまり使わない。 たまにあって便利だなと思うことはあるけれど。
インナークラスがあればいいのに。
>>484 class Outer
{
class Inner
{
Outer& outer_;
Inner( Outer& outer ) : outer_( outer ){}
};
};
Javaの実装もそうなってるだけらしいな
>>486 おまえ6日以上前のレスに「そう」は無いだろ・・・
それは他のスレも見てから言ってもらいたい
いやこれも2日後だったw
>>486 javaの実装は全部privateなのか
訊かれていることがよくわからんが Javaの"新"機能は仮想マシンの互換性のためなんだろうけど プリプロセッサでなんとかしている
492 :
デフォルトの名無しさん :2006/03/12(日) 01:34:33
すいません、今VisualStudio.NETを使って、C++でダイアログを表示するプログラムを作成したのですが、 ダイアログが表示される前に、コマンドライン画面が出現してしまいます。出現しないようにするには どうすれば良いのでしょうか?
>>492 一番上の行にこれいれとけ
#pragma comment(linker,"/SUBSYSTEM:WINDOWS")
494 :
デフォルトの名無しさん :2006/03/12(日) 10:05:33
>>493 コマンドラインを出さずに実行できました。
ありがとうございました。
C++で 関数呼び出すときに、戻り値の型を明示してやらないと駄目ですよね?
496 :
デフォルトの名無しさん :2006/03/12(日) 11:50:40
Cなら、戻り値を明示しない関数はint型と解釈されるから C++でもそうなんじゃねぇの? っていうか、適当に関数作って試してみれば良いじゃん
>>496 C++は型安全性のため暗黙のintは禁止。宣言時には戻り値の型も必要。
でも呼び出すときには必要ないよ。
499 :
495 :2006/03/12(日) 15:31:47
500 :
495 :2006/03/12(日) 15:39:24
間違えて書き込み押してしまいました 戻り値を宣言するのは、分かりましたが 関数内で戻り値の変数定義して、値を代入しても 本体(呼び出し側)で定義されていませんとエラーが出ます あらためて、本体側で再定義してやっても当然の結果ですが 中身はありません。 これって当然の結果なんでしょうか?
501 :
デフォルトの名無しさん :2006/03/12(日) 15:43:39
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
http://pc8.2ch.net/test/read.cgi/prog/1140616676/
>>500 Cの変数にはスコープがある。
それを知っている立場から見ると当然の結果。
503 :
495 :2006/03/12(日) 16:00:53
>>502 さん
どうもです
関数内で広域的(グローバル)に変数宣言するような方法は無いのでしょうか?
環境はVCでSDKです。(MFCは使ってはダメ) 入力された日付(YYYYMMDD)が正しいかどうかチェックしたいのですが、 チェックする関数が見当たりません。 フォーマットが正しいかどうかなら自分でチェックすればできますが、 カレンダーにない日付もチェックしたいです。(2006/02/30はエラーみたいな) チェック方法をしっている方おられました教えてやってください。
>>503 extern で宣言はできる。
だがおそらく必要ではない。もっとマシな方法がある。
>>500 何か話が噛み合っていないような気がする。
コードを晒してみろ。
>>500 そうそう
単純な問題っぽいから
ソース出したれ
508 :
504 :2006/03/12(日) 20:11:13
509 :
デフォルトの名無しさん :2006/03/14(火) 07:33:02
リバースイテレータの存在意義が理解できません>< デクリメントすればいいじゃないですか!
>>509 <algorithm>の関数を初めとして、イテレータの操作はインクリメント前提で作られているから。
>>509 この板で見つけたサンプル。
--
typedef std::string::reverse_iterator riter;
std::string s = "abcdefg";
for ( riter r = s.rbegin(); r != s.rend(); r ++ )
std::cout << * r;
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
じゃあ自分で設計する時は逆戻りにリバースイテレータなんて要らないんですね? デクリメントで恥ずかしくないですね?
515 :
デフォルトの名無しさん :2006/03/14(火) 11:55:42
恥ずかしいんですか。 速度は変わりませんよね?
516 :
デフォルトの名無しさん :2006/03/14(火) 12:13:23
じゃあ僕も流行に乗ってリバースイテレータ使います><
>>513 リバースイテレータがあれば1つの関数で順方向、逆方向の両方に対応できるという利点がある。
お前は要らなくても、そんなに特殊なものでもないから誰か使うやつはいるだろう。
>>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にしようか、
いつも迷ってしょうがないんだけど、どっちにすべき?
boost:spirit で構文解析
521 :
デフォルトの名無しさん :2006/03/18(土) 14:40:20
正規表現は?
>>519 sscanf(p, "%d/%d/%d", &y, &m, &d);
523 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 18:29:50
TextSS の64bit化おながいします もしくは64bitにネイティブ対応した置換ソフトないですか?
>>520 >>521 >>522 トンクス。
やっぱり、字句解析の視点を入れてコード書かなきゃだめか。
yaccとかlexとか、ちょっと大げさかな…と思うけど、
今度からは、Bのようなコーディングで統一することにします。
sprintfのscanf版があったなんて、今知った。勉強しなきゃ。
>>523 32bitアプリって互換性ないの?
何も考えずに64bit版Windowsなんか買うからw
そんなわけねー。 32bitアプリの互換性無かったら、64bit版Windowsなんか買うやついないって。
526 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/19(日) 03:19:09
マルチも大変だな
ネイティブだよ。CPUが32ビットモードになって動く。 (そのCPU内部では32ビットの動作をエミュレートしているんだというのは認めない)
529 :
524 :2006/03/19(日) 16:38:44
てゆうか、VBソフトで、ネイティブだとかネイティブじゃないとか…w
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++; }
>>532 配列をうまく使うと、コードが本当にすっきりするよね。
>>532 p++とi++の場所を交換した方がいいと思う。
ファイルを開いてほかのプロセスに使用されないようロックしています。 このファイルをremove()で削除したいのですが、下記のようにその前にfcloseを呼び出すと、ロックも解除されてしまいます。 fclose(fp); remove("foo"); fclose(fp)とremove("foo")の間に、ほかのプロセスがこのファイルをロックしてしまうのを防ぎたいのですが、どうしたらよいのでしょうか? fcloseの前にremoveを呼び出しても問題ないでしょうか?
537 :
536 :2006/03/28(火) 18:02:57
Win32 Console Applicationで作ってるんですが実行時に"Press any key to continue"と表示しないようにする方法ないですか?
>>538 F5キーを押すなどのデバッガ付きで実行したり、コマンドプロンプトなどからEXEを直接実行したりすればよい。
>>536 ファイルロック自体が移植性が低いので、ある程度割り切ってしまっていいと思う。
Unix系なら先にremove()することで完全に他のプロセスの目からファイルを隠せる。
#但し、remove()してからfclose()の間に他のプロセスにファイルを作られてしまう問題はある。
>>539 今、VisualC++で作っているのですが、プログラムが出来上がってEXEを作った後は表示されないということでいいのでしょうか?
Enterキーを押すと画面が切り替わるようなものを作りたいのですが、 Enterキーを押すというのは、どういう条件式を作れば良いのでしょうか? if(end == 'Enter') {
… } ではさすがにだめですよね。
getch() ? 環境書けよ、 end にはどうやって入れたんだ?
scanf("%d",&end);です。
%cなら\nが読み取れそうな気がしなくも無い。
getch()つかえ
getch()を使うのは分かりましたが、enter以外の入力を弾くためにはどうすればいいのですか?
while(getch()!='\n');
どーせ、getchはenterが来るまで戻ってこない。
( ゚д゚)ポカーン
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 ]; だけなんですが そもそも変数や引数を添字にして配列を宣言することは不可能なんでしょうか
>>556 C89では(つまり、VS.NETやVC6では)不可能。
558 :
デフォルトの名無しさん :2006/04/02(日) 18:55:37
C99でも不可能
>>556 C++ で std::vector 使え。
561 :
556 :2006/04/03(月) 00:37:44
結局、よく判らないので配列は諦めてリスト構造にしてしまいました・・・ レス返してくれた人、ごめんなさい
test1に関していうと、たまたま今回はfunc(10)しか呼び出されていないが、 普通は、別のところでfunc(20)とかfunc(30)とか呼び出される可能性がある。 ↓ コンパイラは、<<コンパイルする時に>>配列を何バイト確保していいのか分からないから、 コードに埋め込めない。 ↓ <<プログラムを実行する時に>>動的にメモリを確保するためには、 mallocやnew、std::vectorを使えという話になる。 test2やtest3もダメなのか…。test2は、const int var=20;にしたらどうだろ?
なるほど、理屈が判りました >const int var=20; これは確かに動きました。でも void func( const int arg ){... とか int test1[ (const int)arg ]; あたりは悪あがきの様で、挫折しました
564 :
562 :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でもいいけどね。
配列にするのか、リストにするのか、
また、別にデータ構造にするのかの選択は、きちんと目的を持って!!
それこそallocaの出番じゃねーの。標準じゃねーけど。
566 :
デフォルトの名無しさん :2006/04/03(月) 03:37:57
constにすれば高速になりますか?
コンパイラ依存
568 :
デフォルトの名無しさん :2006/04/03(月) 03:57:18
bcc32です
環境依存
570 :
デフォルトの名無しさん :2006/04/03(月) 05:35:59
windows2000です PC9821V200s7cです。
クラス間でデータを共有したい場合はどういう手法がありますか。 できればクラス間の依存のない形で実現したいと思っています。
>>571 どういう目的でどういうクラスの間でどんなデータを共有するかによる
>>572 目的は自分のためのフレームワークの製作です。
できれば汎用的な形で実現したかったのですが。
うむー。
汎用的なアプリのシステムとOS系のシステムのうまい融合と可読性の維持を当面の目標としています。
>>573 データの持ち方なんてのはその使われ方に依存するもんだから、
そんな抽象的なことをいったって全く意味が無い。
最も顕著なのはアクセス制限で、たとえば
・任意のクラスに許すか、特定のクラスに許すか。
・任意のインスタンスに許すか、特定のインスタンスに許すか。
・読み込みのみ許すか、書き込みも許すか、その組合せか。
の組合せで適切な方法は変わってくるし、
アクセス頻度の多少やデータのサイズ、データにアクセスできる
期間などによっても変わってくる。
というわけでもっと具体的に言わんと、なんともいえん。
>>567 >>569 あえて釣られてみました。
constは、高速化させるためにあるんじゃねーよ。
高速化ったって、たかが知れてるよw
どうしてもってんなら、100万回ループで実行時間でも計れ。
>>571 本屋逝って「デザインパターン」についての解説書を…ってほどのものじゃねーなw
最初は、テケトーにstatic変数でも使って書いとれ。
あと、friendにして、どちらかに相手側のポインタ持たせるとかな。
または、共有部分だけ別のクラスにして、インスタンスを1つだけ生成させるとかな。
慣れてきたら書き直しゃいーんだよ。
>>575 ループなんてしなくとも
int main() {
const int a0 = 0;
const int a1 = 1;
// ...
const int a100000 = 100000;
}
みたいなコードは定数畳み込みをするコンパイラでは
コードが全て消えるので、顕著に速度差が出る。
>>576 const つけて無くても不要変数の削除や定数の畳み込みは効くだろ。
main()からsub()にとぶときに、 main()で表示させていたprintf文を消したのですが、 画面を移動するときに、画面を初期化する方法を教えてください。 環境はANSI Cです。
× main()で表示させていたprintf文を消したのですが ○ main()で表示させていたprintf文を消したいのですが よろしくお願いします。
>>580 言語の範囲内にはないだろうな。
環境に合わせてコンソール制御用のライブラリを探すといいよ。
>>580 めんどくさいからputchar('\r');でも試してみてよ。
cls
ネタですが、 for (int i=0;i<100;i++) printf("\n"); clrscr()という関数もあるにはありますが、 DOSやWindowsでしか使えないとか書いてありました。
>>583 ご名答!!
だけど、バックスペースは、 ¥r じゃなくって ¥b
むしろ悪い度胸。
589 :
583 :2006/04/03(月) 18:02:01
いや、バックスペースの積もりなんて更々ないから。
590 :
デフォルトの名無しさん :2006/04/03(月) 23:09:41
X a(1); と X a = X(1); って、同じか?
処理系依存だってきいたことがあるようなないような。
>>590 後者は一時オブジェクトが生成されますがな。
>>590 後者はコピーコンストラクタが使用される。
12.8.15を考えればコピーが省略されることもありうる。
それでも、例えばコピーコンストラクタを private にしてしまうと
>>590 の後者はコンパイルできない。
596 :
デフォルトの名無しさん :2006/04/04(火) 08:08:33
空ベクタに内容のあるベクタを代入するとどうなりますか? ちゃんと空ベクタは代入元と同サイズ確保されてから要素のコピーが行われるのですか?
>>596 処理の順序は決まってないが、結果は代入元と同じサイズになり、すべての要素がコピーされる。
598 :
デフォルトの名無しさん :2006/04/04(火) 08:23:16
599 :
デフォルトの名無しさん :2006/04/05(水) 16:26:52
char words[3]=""; *words++ = 'a'; こう書いた時の2行目の動作について教えてください。 words++ならば次の要素を指す事になりますが、*words++=なので・・・どうなるのか。 確か++を後ろにつけると後から評価されるのだと思いましたが、 (*words)++='a';として評価される事になり++の効果がアドレス移動ではなくなってしまうのでしょうか?
>>599 *words++は*(words++)と解釈される。
words++でwordsは次の要素を指すように変更されるけど、
値は変更される前のもの。
それを*で間接参照しているから、このとき参照されるのは、wordsが最初に指していた要素。
それから、その例はコンパイルできないかと。
601 :
599 :2006/04/05(水) 16:57:18
602 :
デフォルトの名無しさん :2006/04/07(金) 07:29:00
関数の引数に使われる const aaa& の&ってどういう意味ですか? 例えば、 xref(istream& in,vector<string> find_words(const string&) = split) という文がある解説本にあるのですが、引数に二つある&の意味が解説されていません。 それと、find_wordsの二つ目の引数は型のタイプだけ指定して変数名を明確にしてませんが良いんでしょうか。
603 :
602 :2006/04/07(金) 07:32:51
×find_wordsの二つ目の引数は ○find_wordsの引数は
605 :
602 :2006/04/07(金) 07:43:44
すみません自己解決しました。 アドレスを引数に取る場合はint *の様にするのだとおもってましたが それはCだけの事だったのですね。
606 :
602 :2006/04/07(金) 07:52:14
>>604 レスありがとうございました。
あれ・・・参照とポインタって違うんですね、また勘違いしているようです。
参照は独自のアドレスを持たない、ということは占有しているメモリ領域が無いということですか?
参照先のアドレスを持ってるからメモリ領域はあるが?
クラスのインスタンスを動的に複数作成、管理するにはどうすればいいでしょうか? 作成するのはCreateInstanceでできると思うのですが、 それぞれにどうアクセスすればいいかわからないのです。 for(i=0;i<=j;i++){ 新しいインスタンスを作成 } で、j個のインスタンスを作成する…みたいなことをしたいのですが。
>>608 CreateInstanceって、なんですか?
610 :
デフォルトの名無しさん :2006/04/07(金) 11:35:01
スレッドプログラミングの解説書を提示して下さい。
ぐぐれ
>>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; // エラー: 必ずどこかを指してないといけない
>>608 個数を指定するんだから配列でいいんですよね?
for(i=0;i<=j;i++){
sorezore[i]=CreateInstance();
}
でいいんじゃないですか?
amazonでプログラミング言語Cを注文したんですけど、他に買っといたほうがいいC関連の本ありますか?
>>605 *のポインタはもちろんC++でも使える。
参照は独自のアドレスを持たないというより、
持っていてもC++のソースコードからは得られないという感じ。
>>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 )" とエラーがでる。 } なぜでしょうか?教えてください。
620 :
619 :2006/04/07(金) 20:26:20
9行目の"右"は無視してください。すいません
intがstruct boardを返すと定義されているのに、0を返したから。
間違えた(w なんだよ、intが0を返すって。 mainが、だな。
624 :
619 :2006/04/07(金) 20:33:37
すいません、結局何を返せばいいのでしょうか?
626 :
619 :2006/04/07(金) 20:37:59
値を返すべき っていう警告が出るんですけどそれでもですか?
ねらってやっているなら、return a; ねらってないなら、struct board{...} と main(){ の間にセミコロン。
628 :
619 :2006/04/07(金) 20:42:33
できましたありがとうございます。 でも ねらう ってどういうことですか?
うけを狙うのさ。
いや〜、はきだめって本当に糞ですね。
631 :
619 :2006/04/08(土) 00:13:28
うけ狙いか。。。まぁいいや。ありがとうございました。
vectorとかって便利ですけど、 普通の静的配列を使ったプログラムと混在で使うのはやはりやめるべきでしょうか? たとえばある関数の引数に静的配列のポインタを指定する場合、 for (int i=0; i<v.size(); i++) { a[i] = v[i]; } のように一度変換しなければいけないと思うのですが・・・。 何か他にいい方法でもあるんですかね?
>>632 引き数で、「静的配列のポインタ」かただの「ポインタ」かの区別を必要とするとは珍しい関数だな。
>633も書いているが、単に連続領域へのポインタが必要なら変換の必要はない。
仮に変換しなければいけないとしても、要素を一つずつコピーするのはナンセンス。
>>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
せっかくテンプレートクラスにしたのに、 自分だけしか使わなかったよ! しかも一箇所だけで・・・
すみません。一つ質問させてください。 new演算子を使うと、ヒープメモリの確保と、オブジェクトの初期化をやってくれますが、 メモリは確保しないで、オブジェクトの初期化だけやるには、どうしたらいいんでしょうか? 例えば、mallocなり配列なりで、sizeof(TMyClass)のメモリがあらかじめ、 どこかに確保されているとします。 この状態で、コンストラクタだけを呼び出して、 そのメモリ上にTMyClassのオブジェクトを作成したいのです。 前々から疑問だったので、よろしくお願いします。
>>638 placement newという構文を使う。
void *p = malloc(sizeof(TMyClass));
TMyClass *i = new(p) TMyClass;
640 :
638 :2006/04/16(日) 22:45:56
ありがとうございました。長年の疑問が解けました。
641 :
638 :2006/04/16(日) 23:13:57
「placement new」でググったら、いろいろ分かりました。 名前だけはよく聞く「配置構文」ってのが、これだったのですね。 STLの「アロケータ」とか、何に使うのか分からなかったのですが、 これも、メモリへの配置に使うオブジェクトだったんですね。 本当にありがとうございました。
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
>>642 あ、r=1のときのx=2ではなくてx=cとかで。
if (p=1) x=1; else if (q=2) x=2; else if (r=1) x=2; else x=0;
>>642 単純に
p=1;
x=1;
ret;
でいいんじゃないの?
if 文はいらないと思うし。
>>645 書いたヤツは多分その意味わからんだろうなw
647 :
デフォルトの名無しさん :2006/04/26(水) 16:10:43
>>642 全部関数に書いて、gotoの代わりにreturnではどうだ。
>647 do { } while(0); の中に書いて break; するって言うのもあるっけ。
VCはデフォルトだと警告出してくれない。BCCは出す。
fwriteでビットマップの画像表示させたいんだけど、 画像が斜めに表示される場合は何が原因ですか?ヘッダー情報が悪い??
構造体の配列なんだけど、 struct A a[i]; ↑みたいな感じで配列に変数ふることはできないんですか? ビルドするとerror C2143: 構文エラー : ';' が '[' の前に必要です。 って書かれるんだが・・・
>>651 何がしたいんだかよくわからんけど、
ラスタのバイト数が4の倍数になってないとか。
Cの新しい規格 C99で検索すれば解説サイトがみつかると思う
657 :
652 :2006/04/27(木) 00:31:48
>>655 は自己解決しました。
開発言語がANSI-Cなんですが、できますか?
658 :
652 :2006/04/27(木) 00:32:37
レス書いてるうちに656きてましたね。 すみません。
>>652 俺も通ったな
つーかそのエラーメッセージ、多分MSのやつだよな?
660 :
652 :2006/04/27(木) 02:59:28
>>659 Microsoft Visual C++です。
これでANSI-Cのをしてます。
ANSI-Cでやるように仕様書に書いてあるので・・・
>>660 C99 も C89 も ANSI になってたとおもうが、
まぁ MSVC なら C89 ってことになるんだろうな。
ほんとに ANSI C89 でやりたいんなら、 malloc() するしかないだろう。
>>660 多分前後のコードおかしいからちょっとさらしてみ?
前の行に;が抜けてるだけじゃね?
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は変更可能ですか?
666 :
652 :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; } こんな感じ
667 :
652 :2006/04/27(木) 08:10:30
書いてること違ったかも・・・ struct member[num]; 上の部分mallocなどで構造体の配列の領域確保しようとしてたのに変に書いてしまった。 正しい解答どなたか書いてみてくれませんか?
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]; コンパイルできないので間違っているのは確かなのですが…
671 :
デフォルトの名無しさん :2006/04/27(木) 11:30:54
そこを何とか…
std::vector<std::string> vec(100, "baka");
std::vector<string*> str; for (int i=0; i<100; i++) str.push_back(new string("test"));
string* str = (string*)new char[ sizeof(string)*100 ]; for( int i = 0; i < 100; i++ ){ new (str + i) string( "test" ); } でも placement new はトリッキーよね。
extern "チラシの裏" { さて、Effective C++ 第3版フライング発売探してくる。 }
何が追加されてるんだっけ?
>>674 それをやると、オブジェクトの解体とメモリの解放が非常に面倒になる
678 :
674 :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 ***** **** *** ** * 教えてエロイ人!!
1 から 10 位までは if 文で分岐してベタで書いて、 それ以上は無限ループにすればいいんじゃないか?
>>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 を使ってみました!
684 :
683 :2006/04/27(木) 16:58:24
…ゴメン、あんま面白くなかった。
とりあえずツッコミ ×scanf("%d", n); ○scanf("%d",&n);
これが精一杯。 #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; }
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です。
>>687 ・初心者、慣れていないプログラマはブロックを省略せずに書こう。
#1行野郎なんて未だ早過ぎる。
・main()の仕様は規格に則って正確に。
#>687のような書き方は何に由来する? 本の通りならその本は棄てるべき。
#include <stdio.h> main(){ int a=9; puts(a&1?"奇数":"偶数"); } 書き直してあげた
間違いは3カ所 ×if (a%2 == 0); ○if (a%2 == 0) ×printf("%dは奇数です。\n"); ○printf("%dは奇数です。\n",a); return 0;が無い
691 :
690 :2006/04/27(木) 18:43:58
打ってる間に>688-689が指摘してくれてるな。 >本の通りならその本は棄てるべき。 捨てるのももったいないから古本屋に売って新しい本を買え。
>688-690 ご助言ありがとうございます。 解決できました。 わたしの中で勝手に脳内変換されてしまったようで、 >690さんのように書き換えたら うまくできました。 こんな質問に答えていただき、感謝します。 これだけで、1時間近く悩んでしまったものですから;; 今後気をつけます。
693 :
683 :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
プ
697 :
デフォルトの名無しさん :2006/04/28(金) 14:15:43
プ
こんばんわ、C歴一ヶ月の初心者です。 この度仕事でCを使う事になり、悩んでおります(´・ω・`) 固定長80バイトのファイルを読んで エラーチェック→構造体に保存する処理なのですが、 下記の様なファイルがあった場合 <----------ファイル 80バイト---------> NAME=NURUPO ADRESS=TOKYO KANRINO=1234,5678 【前提条件】 ・レコードは左詰になっており空白は入らない。 ・順番は決まっておりNAME→ADRESS→KANRINOの順。 'NAME='の場合は'='以降に続く文字が48文字以内の時に保存 'ADRESS='の場合は'='以降に続く文字が48文字以内の時に保存 'TEL'の場合は'='以降に続く数値をNUMERICチェック、 ','より手前を番号1に保存、','より後を番号2に保存 とりあえず'='手前の文字列を取得して whichとかで'XXXX'の時だったらエラーチェック処理→構造体に保存 の様ににやるのが良いのかな、、と思ってます。 情けないのですが'='以降の文字列取得に手間取っており、 ガチャガチャやってる内に処理が混乱してきてしまったので 宜しければご教授願います。
699 :
698 :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); /* ↓↓↓↓この辺りからエラー処理とか続ける予定です↓↓↓ */ } } }
>>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行取得
}
701 :
698 :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ります。 今日はさすがに眠いのでオヤスミなさいませ。
>>700 さん
ご回答感謝です!
しばらく考え込みながら見入ってました。。(´・ω・`)
fgetsとかstrtok等初めて見る関数もあるのですが、
調べて試してみたいと思います。
(コメントがわかりやすく書いてるが嬉しいっす)
ちなみにNUMERICチェックと言うのは
数字でないとエラーにする事で、英語とかが入るとダメみたいです。
703 :
698 :2006/04/29(土) 02:58:21
ぬぁ、自分で説明を間違ってたのですね。スミマセン。 ○ 'KANRINO'の場合は'='以降に続く数値をNUMERICチェック、 ','より手前を番号1に保存、','より後を番号2に保存 × 'TEL'の場合は'='以降に続く数値をNUMERICチェック、 ','より手前を番号1に保存、','より後を番号2に保存 それでは今度こそおやすみなさいませ(´・ω・`)
>>698 ・行単位の処理ならfread()よりfgets()を使うべき。
・大抵はferror(), feof()を使わずともfgets()の戻り値をチェックすればことが足りる。
・規約で決まっているのでもなければ、memset()はしない方がいい。
#予め領域をクリアしてしまうことで潜在的なバグを隠してしまう可能性がある。
#こういうのを「安全志向のプログラミング」とする向きもあるが、
#実態は「後ろ向きの安全志向(≒危険)」と考えるべき。
・文字列のコピーは、部分か全体化を問わず自前で書かない。
#strcpy()、strcat()、sprintf()があれば事が足りる。
・strtok()よりはsscanf()がお勧め。strtol()も数字文字のチェックに使えるぞ。
#strtok()はスレッドセーフではない、領域を破壊する、点で要注意。
なので、>699や>701は捨てて書き直すことお勧め。
ここは宿題スレでもないから敢えて漏れのコードは今は載せない。
それにしても、丁度四月入社かなにかでC歴一ヶ月なのだろうけど、
一ヶ月でこのレベルなのだとしたら余程教え方か教わり方が悪いと思う。
正直GWで身の振り方を考えたほうがいいと思う。
C歴一ヶ月の人間にスレッドセーフ云々なんて言及してもしょうがないだろ 習得期間なんて個人差があるんだから気にするな 一年やってそれならヤバいけど
706 :
698 :2006/04/29(土) 13:25:10
>>704 なるほど、参考になります。
規約と言う点では
・str〜系の関数よりmem〜系の関数推奨(今規約が手元に無いのでうろ覚え)
・ホストと呼ばれる古い環境なので読むファイルに改行コード\n'等の意識が無い
固定長'80'のレコードが延々と続きます。
文字列の終わりを示す'\0'も(恐らくですが)入っていない。
(参考にした処理がfgetsでは無くfreadを使っていたのも理由があるのでしょうか・・?)
>> 一ヶ月でこのレベルなのだとしたら余程教え方か教わり方が悪いと思う。
鋭いです。くぅ、やはりそうですか(´・ω・`)
実はC歴一ヶ月と言うのは誰からも教わらずに、
入門用のCの本を自分で読んで一ヶ月独学の状態です。
なのでコーディングする際に何がダメで何が良いのかを指摘して頂けるのは非常に助かります。
とりあえず1から見直して作り直しまふ。
707 :
704 :2006/04/29(土) 17:05:44
うーむ。 >規約と言う点では >・str〜系の関数よりmem〜系の関数推奨(今規約が手元に無いのでうろ覚え) おいおい…… #この手の規約の悪いところは、memcpy()を使う前にstrlen()で長さを調べるなど、 #本質を見失った運用になりがちな点などが挙げられる。 #何故そういう規約なのか誰も知らないようならマジやばいぞ。 >・ホストと呼ばれる古い環境なので読むファイルに改行コード\n'等の意識が無い > 固定長'80'のレコードが延々と続きます。 あーすまん。行単位だとばかり思ってミスリードした。 #しかし、ホスト環境だからといって改行のないデータって…… #なんだかアナクロで不毛な環境のメンテナンスでもするのか? > 文字列の終わりを示す'\0'も(恐らくですが)入っていない。 そういうことなら普通入れないだろうねぇ。 > (参考にした処理がfgetsでは無くfreadを使っていたのも理由があるのでしょうか・・?) それなら確かにfread()だろうね。fread()してsscanf()でばらすのが一番楽で比較的安全かな。 >実はC歴一ヶ月と言うのは誰からも教わらずに、 >入門用のCの本を自分で読んで一ヶ月独学の状態です。 正直すまんかった。 自力でやっているならそんなもんかな。 >なのでコーディングする際に何がダメで何が良いのかを指摘して頂けるのは非常に助かります。 いやまぁ、こちらは大した手間じゃないから。 >とりあえず1から見直して作り直しまふ。 作り直しもいいけど、一ヶ月も自習させて放置するような会社と心中したいか考えたほうがいい希ガス。
708 :
698 :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); } }
709 :
698 :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; }
710 :
698 :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; } }
711 :
698 :2006/04/30(日) 22:41:52
>>704 さんへ
>> #何故そういう規約なのか誰も知らないようならマジやばいぞ。
ちょっと規約関係については確認してきます。
ただ現場でC言語を扱える人が1人しかいないので(その人はGW中はオヤスミ)
若干調べるのは遅くなりそうです。
>> #なんだかアナクロで不毛な環境のメンテナンスでもするのか?
ええ、巨大さ故に下手に手を入れられず古い環境のまま残っているシステムです。
今回の場合ですとI/F部分のみに手を入れて現行ホストシステムはそのまま流用します。
>> 作り直しもいいけど、一ヶ月も自習させて放置するような会社と心中したいか考えたほうがいい希ガス。
ご心配有り難う御座います。
ただ今回の件に関しては自ら首を突っ込んで「Cでやります」的な経緯があるので、
自業自得なのです。他言語の勉強も兼ねてって事で(´・ω・`)
そんなこんなで今日早速2冊目の本を買ってきました。
「図解C言語 ポインタの極意」とか言う本です。
1冊目がやけにわかりにくかったのですが、こっちはわかりやすいです。
そして、わざわざレスを下さった
>>700 さん、
>>704 さん、
>>705 さん感謝です。
str関数,strlokを使用したままなのでスレッドセーフ云々については
今後の勉強の課題としておきます。
聞く人がいない環境で一人で作っていると詰まった時に
かなり無駄な時間を取る事が多く、今回ここに来てホント助かりました。
仕事中はネットは出来ないので
平日昼間のレスは出来ませんがまたきます(´・ω・`)ノ
712 :
704 :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); } } } }
713 :
698 :2006/04/30(日) 23:30:18
>>704 さん
BOOL型(初めて見る名前だったのでとりあえずググって調べてきました)と
fgets、sscanfで実行してるのですね。
まだ完全に理解出来てないので暫く追ってみますが、
明日ホストの方で色々やってみたいと思いまふ(´・ω・`)
ホント有り難う御座います。
714 :
超初心者 :2006/05/01(月) 14:13:00
すみません 上級者の方にお聞きしたいです(ノд・。) Borland TurboC++5.0Jという化石物のソフトで書いて コンパイルはいくんですが実行してプロセスが作成できないとエラーになります。 昨日は実はエディタが開いて実行できたんですけど なんかできなくなりました。 どうしたら治るんでしょうか?教えてください宜しくお願いします。 m(_ _)m
たぶん、原因がわかれば治るんじゃないかなぁ。
・初心者とわざわざ書く ・エラーメッセージを貼らない ・環境をキチンと書かない
コンピュータがいかれたかも知れないから、 どっかから別の 98 を調達して来た方がいいんじゃないか?
コンパイルはともかく、リンクは成功したの? (EXEファイルはできてる?) あと、プロセスが生きてると、EXEファイルに上書きできない。 これが一番典型的なオバカパターン。 パソコンの再起動はしたよね?
720 :
698 :2006/05/02(火) 00:00:27
>>718 今日も今日とて職場で紙出ししたソースを家に帰って手打ちして実行です。
(FD等の外部機器が一切使用禁止の為)
久しぶりにガンガッテマス。
そちらも頑張って(´・ω・`)ノ
>>720 持ち出しちゃ駄目なんだろ?禁止されてる理由を考えろ。
>>720 一応念のために聞くが、会社(アカウント)から自宅(アカウント)へのメールも禁止されているということでいいか?
ますます自分の身を削ってまで付き合うべき会社とは思えなくなってきたのだが。
724 :
698 :2006/05/02(火) 00:36:42
>>721 うーむ、その話は派生すると長くなりそうですが、
とりあえずキレイ事言ってたら終わらないってのがあります。
>>722 外部へは一切アクセス不可です、何とも不便です
>>723 健気って程でも無いですよ〜。
ただ自分でやると言ったからやってる、、って所でしょうか(´・ω・`)。
>>724 仕事が終わらなくなるような規則を施工しているやつらに責任を取らせろ。
そんな規則があっても何とかなると思われちゃ、迷惑だ。
自分からやらないやつはやらせたって使い物にならん。 自分でやると言う人間を支援するのが会社と言う組織だ。 支援せずに足枷ばかり与える組織は、強制労働所くらいで沢山だ。
727 :
698 :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;
}
}
>周囲に助けが求められないからこそ、ここに来たのですよ〜(´・ω・`) 企業人としては失格だな。 それ以前に企業自体が失格っぽいが。
C言語の勉強をしているとき、本やウェブサイトでは プロトタイプ宣言が ”宣言” で関数本体は ”定義” という表現がされていたように思います。 C++になると、クラスの中に一行書くのが ”定義” で つらつらと中身を記すのは ”実装” と表現されるのが一般的な気がします。 私の勘違いかもしれませんが、CとC++では 定義 という言葉の位置づけが逆転しているような気します。 何か理由があるのでしょうか?
>C言語の勉強をしているとき、本やウェブサイトでは >プロトタイプ宣言が ”宣言” で関数本体は ”定義” という表現がされていたように思います。 これはCでもC++でも正しい。(ただし定義は全て宣言でもある) >C++になると、クラスの中に一行書くのが ”定義” で >つらつらと中身を記すのは ”実装” と表現されるのが一般的な気がします。 classキーワードに続けて書くのが「クラスの」定義で、 処理の中身を記すのは「クラスの」実装。 クラスの定義中にはメンバ関数の宣言が含まれるし、 クラスの実装とはすなわちメンバ関数の定義の事。
ああ、なるほど 判りました ありがとうございます
ふむふむ
言葉遊びみたいだ脳。 試験に出されたら絶対点落とすわ、漏れ。
宣言でも、定義でも、実装でも何でもいいや。 プログラマならコードで語る。これ最強
思考停止が最凶?
if (data == 2412 || data == 2430 || data == 2514 || data == 2521 || data == 2539 || data == 2554 || 以下、数十行続く・・・ { 処理 } data にはファイルを1行毎に読み込んだ数値があって、その数値は分秒を表してる。 その特定の分秒だけの時に処理部分を実行したかったからこんなんなったんだけど、 これ以外思い浮かばないよ。何かいい案ないですか?
>>736 とりあえずチェックルーチンは関数化したら?
739 :
736 :2006/05/06(土) 16:22:05
>>739 配列定義して検索すれば?
と思ったけど、行数が不満なら解決にならんな。
741 :
736 :2006/05/06(土) 16:34:20
「特定の分秒」が何の規則性も無い時点で仕方ないのかな
>>741 行数がヤダってんなら1行にいっぱい書けよ。
>>736 その整数値を配列に入れて、ループでチェックすればいいじゃん。
いっそその数値をファイルに入れちゃえよ。
少なくとも、数十行の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番まで検索汁
746 :
736 :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]){
処理
}
}
ソレダ。すげーなんかスッキリした。ありがとうありがとう。他のみんなのも検討してみる。
747 :
745 :2006/05/06(土) 17:04:07
書いてるうちにすごいかぶった…。orz
748 :
736 :2006/05/06(土) 17:06:57
>>747 書いてる途中はリロードして確かめてが書き込み直前でリロードするの忘れてたw
ファイルから読ませるのも検討してみる。ありがとうありがとう。
749 :
740 :2006/05/06(土) 17:12:18
なんで俺はスルーされたんだろう。
750 :
736 :2006/05/06(土) 17:15:54
>>749 いや、ちとレベルが高そうだったので・・・
751 :
740 :2006/05/06(土) 17:33:52
なんだそりゃ?まぁいいや。 線形サーチを見ると bsearch() とか std::binary_search() とかしたくなるな。 配列をソートした状態で入力するか、事前にソートできればの話だけど。 毎秒1回の処理ならどうでもいいか。
752 :
736 :2006/05/06(土) 17:59:31
>>751 なんかサーチ使ういい機会に思えてきた。二分木検索使ってみる。
Class hoge{ なんたらどうたら }; がエラーでルーとやけ酒のみながらやってたら Class じゃなくて class なのに気が付いたorz
754 :
デフォルトの名無しさん :2006/05/30(火) 18:50:39
ソースの解析を進めていく上でよくわからない箇所 があるのでお尋ねします。 読んで行く上で「_T(ほにゃらら)」というのをよく 見かけるのですが、Webで使い方について調べてみて いるのですが調べ方が悪いのかうまく見つけられません。 そもそもこれは何なのか。またどのような使われ方を するのか教えていただければ幸いです。
756 :
デフォルトの名無しさん :2006/05/30(火) 23:56:37
>>753 予約語を強調表示しないの? エディタ/IDEは何使ってるの?
C/C++ってC言語とC++の両方という意味なんですか?
両方或いはどちらか一方。
クラスHogeがあって Hoge hogeって宣言するのと Hoge *hogeって宣言してnewするのだったらどっちがいいですか?
必要がないならわざわざnewしてdeleteする手間を掛けることもない。
>>759 ヒント:
int matrix[1024 * 1024]; と宣言するのと
int *matrix = malloc(sizeof(int) * 1024 * 1024); と
どっちがいいと思う?
答え:
ちんこ
ちんことうんこはいつでも言えるがまんこはキー叩くのにも躊躇する俺様がご光臨ですよ。 new する必要があるのは ・スタックが足りない等のメモリ上の都合がある場合 ・直前までサイズがわからず動的確保に頼るしかない場合 など、必要に駆られて行うのが普通。 必要なければしないのが吉。
>>762 >・スタックが足りない等のメモリ上の都合がある場合
こっちはいいとして、
>・直前までサイズがわからず動的確保に頼るしかない場合
その場合はstd::vector使えばいい気もす。
で、一つ追加。
・クラスライブラリの設計者がJava上がりなどの理由でnewするように設計されている場合
必ずしもC++ではnewするって訳でもなく、臨機応変に対応しろってことですか。
C++の奇妙な点の一つで、new および delete は予約語の癖して、
実装はライブラリレベルで行われてるんだよ。
で、new は動的なメモリ確保と、割り当てられたメモリへのコンストラクタ呼び出しを行い、
delete はデストラクタの呼び出しとメモリの開放を行う仕掛け。
極端な話、中では malloc と free ないしは類似のメモリ確保関数が呼び出されとるのが普通。
よって回答は
>>761 = ちんこ。
>>765 実装はコンパイラレベルだろ。
別に奇妙でも何でもないと思うが。
でも確かにメモリ確保・解放はoperator new/delete ([])が担っているのは事実。
ライブラリレベルでもコンパイラレベルでもどっちでもいいけど libstdc++をリンクしないと、リンク時に undefined reference to `operator delete(void*)' のようなエラーが出るのには驚いた
割り算がこっそりライブラリコールになってるようなもんだろ。
コンパイラレベルでやってる処理系は見たこと無いな。 まあどーでもいいんだけどね。
そもそもコンパイラレベルとかライブラリレベルとか、どういう区別だ?
コンパイラレベルだと吐き出されるコードと直結することになる。 ライブラリレベルなら文字通り責任はライブラリにあることになる。 たとえば仮想関数がvtableで実装されてるのはコンパイラレベル。 で、コンパイラが司るところの言語仕様の枠から見ると、 専用の例外が用意されてたりlibstdc++のリンクを必要とする newやdeleteは、ある意味鬼子。 これはnewやdeleteの実装が処理系によって大きく変わってくることを意味したりもするので、 使用に際してライブラリの癖…メモリ確保の効率とか確保のために必要なCPU時間とか… にまで気を回さなければならない状況も考えられないわけじゃない。 自前でnewやdeleteを作ろうとした場合、<new>の実装内容に首を突っ込まなければ ならない場合なんてのも往々にしてある。 C++を使う上での一般的な知識の枠の外を要求されることも無いではないあたり、 パラノイア的に粘着するなら、newもdeleteも標準ライブラリ扱いの項目でこそあれ、 組み込み予約語の枠に収まってるのは少々おかしいくらいだぞ、と。 まあ、そんな毒にも薬にもならない話。
>>772 特定の実装の話を言語一般の話のように言うなよ。
あんまり例外ないと思うけど?
比較的古いコンパイラなんかは例外のうちかな。 bad_alloc 例外投げる以前の奴とかがそうだ。 new がライブラリ実装に以降したのには歴史的な事情もあって、 単にメモリ枯渇の時にゼロ返すだけじゃ色々不都合だってんで 例外を投げるようにしたんだが、旧来の方式との互換も保ちたい、 それもコンパイラオプションで切り替えられるとかのレベルじゃなく ひとつのコード内でどちらも選択可能にするためにコンパイラの中から 追い出した、なんてのがあるよ。
>>772 g++ 使えば -lstdc++ なんて要らない。
これならコンパイラレベルだね。
最近は new の引数チェックをコンパイラがやったり、 一概にどっちって言い切れる存在じゃないみたいだね。
言語自体から見ればどっちでもコンパイラの実装の一部。 気にしないで済めばそれでいい。
779 :
768 :2006/06/25(日) 01:21:43
>>776 俺が使ったのめっちゃg++だったんですけど。
勝手にリンクされただけじゃなくて?
>>779 g++ なら勝手にリンクされるから、自分で libstdc++ を指定する必要は無いはずだよ。
781 :
768 :2006/06/25(日) 02:04:52
>>780 ごめんね。
その当時のMakefileを見直したらリンカに$(CC)を指定してた。
今g++に変更してみたら自分で指定しなくても勝手にstdlibc++はリンクされたよ。
でも、これでコンパイラレベルと言えるとは思わないなぁ。
あ、いや、どっちでもいいんだけど。
typoごめん
コンパイラ系からライブラリを簡単に引きへがせるかっていうと、そう簡単なもんじゃないからね。 g++みたいに少々特殊な経緯をもつコンパイラならなおの事。 少し話がずれるけど、テンプレートみたいな実装の難しい部分に関しては ライブラリ側が大きく引きずられたりもするし。 new の内部で何やってるのかを知っておくのは、operator new のオーバーライドなんかを 必要としたときに役に立つわけだし、悪いトピックじゃなかった。
C++はどの位置でも変数が生成できるけど、これってnewしてるからなん? そうすると関数の頭で宣言するCの時とコスト的に差が無いのか気になる。
>>784 C99でもそうだけど、あくまでもその場所で生成すると言う意味ではなく
その場所で生成したかのごとく振舞うと言うこと。
つまり、POD型なら関数入り口でスタックフレームを形成するので全く同じコードになる。
#コンストラクタが必要な場合でも、特に不利になるわけではない。
787 :
785 :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) これらポリモルフィズムの関数ポインタをそれぞれ取得するにはどうしたらよいでしょうか。
代入する先の型に合わせて自動的に選択されるはず。
790 :
デフォルトの名無しさん :2006/07/07(金) 20:49:40
WINDOW2k+VisualCを使っています。 TCP/IPで受信した文字列の中から空行を見つけたいのですが、 どうすればよいですか? お願いします。
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にしてみました。
"\r\n\r\n" とかそういうオチだったりする? しないか。
しそうだ!
796 :
デフォルトの名無しさん :2006/07/08(土) 11:39:39
new で確保したサイズとアドレスってどうすればわかりますか?
わかりません。
グローバルなoperator newをオーバーロードして、 アドレスと確保されたサイズをリンクリストあたりに保存しておけば?
799 :
デフォルトの名無しさん :2006/07/08(土) 12:31:04
newした時、class A{省略}; A *a; a = new A; とした時に確保されるサイズの求め方とアドレスの求め方を聞きたいです。
>>799 処理系の実装次第なんで、そのままだと無理だよ。
系によってはメモリマネージャにデバッグ用途向けのアナライズ機能を用意してる
(つーか大抵ある)ので、その辺をこねくり回せば入手できるかもね。
それが無理なら
>>797-798 が正解。
つーか何でそんな情報が必要なのかね。 生アドレスが必要な状況ってよっぽど限られてると思うんだけど。
802 :
デフォルトの名無しさん :2006/07/08(土) 12:44:03
アドレスは無理ならばいらないけど確保されるサイズはクラスや構造体・変数 どれでもsizeof(〜)のサイズが確保されるんでしょうか?
最低sizeofのサイズ。 実際には4バイト境界に揃えられたりして必ずしもそのサイズじゃない場合あり。 ついでに言うとメモリを確保する際にはヒープツリーの接続情報やらデバッグ情報やらも 一緒に確保されるのが普通なんで、オブジェクトのサイズよりもはるかに大きなサイズが 確保される場合がある。 もっと言うとオブジェクトの内部でnewとかしてたら、sizeofで得られるサイズは 実際に確保されるサイズとは何の関係もない値になる。 アドレスが欲しければ、無理やりキャストしてunsignedにでも放り込めば。
え?sizeofって境界整列後の値でしょ? まあ、最低値がその値というのはそうなんだけど。
>>804 sizeofが4バイト単位になっていても、メモリ確保のときは16バイト単位になるかもしれない。
コンパイラの設定次第じゃね? 通常は境界整列後のサイズだろうけど、pragma pack とか付けば変わってくるし。 作法的には妄信は微妙な気が。
>>805 sizeofは境界整列後の値であるということには同意するんだよね?
>>806 話がずれてる。
808 :
805 :2006/07/08(土) 13:04:53
同意も何も、私は昔からそう言って回っているが。
いや、それならいいです。
なんだお前らw
811 :
デフォルトの名無しさん :2006/07/08(土) 13:25:47
質問したものですがクラスの正確なサイズはsizeofでは得られないでOK?
「クラスの正確なサイズ」の定義による。
813 :
デフォルトの名無しさん :2006/07/08(土) 13:54:11
クラスの正確なサイズというよりnewで確保されるサイズです。
>>802 試しにoperator newを定義してみれば、
どれだけのメモリが確保されるかはわかるから、自分で試してみろ。
>>815 それで試して「やっぱり sizeof() と同じだね」って結論にもできないだろ。
「少なくともリクエストされるサイズはsizeofと同じ」で一般的には十分だと思うが。
>>817 十分って何だよ?結局それに依存したコードはNGだぞ。
「少なくとも同じ」
>>819 「十分」の意味がわかんねぇっつってんだろ。
まさにはきだめの議論ですな。
sizeofってvtblの分も含んだ値になるっけ?
>>823 一応なるよー。
大抵の処理系ではvtableひとつにつき1ポインタ長増える。
もちろん多重継承かますとその分だけ増えていく。
ところで何でそんなに消費量が必要なのかね?
デバッグ目的?
Delphiではクラス型はポインタと同じ扱いができたのですが、 C++ではクラス型とポインタの扱いが違うのはなぜですか?
>>826 違うものの扱いが違うのは不思議じゃないだろ。
むしろ「Delphi では同じ扱いができるのはなぜですか?」って気分だ。
828 :
826 :2006/07/09(日) 17:50:19
>>827 クラス型がポインタ以外の用途で使われる場面がよくわからないんです…
日本語でおk
そもそもC++には、クラス型なるものは存在しないのですが。
>>830 C++ では class, struct, union で定義するのがクラス型だよ。
Delphi のはまた違うんだろうけどな。
クラスのインスタンスをポインタで参照する場合と実体で参照する場合が あることのことを言ってるのなら、それはCの名残。
Cの名残ってことは別段何かメリットを見越して意図的にそうしたというわけではないの?
どうにも争点がわからんのだが。 リファレンスの存在意義がわからんってことなのか?
>>794 \r\n\r\nで動きました
ありがとうです
>>832 は釣りだろ。でも、「それはCの名残」これ、なかなかいいな。
main関数について質問です。 int main() { ・・・ if(){エラー処理; return 1; } ・・・ return 0; } main関数はint型なので、return 1 はreturn 100でもint型なら何でもいいんでしょうか。 処理の最後だから、数字を返したところが main関数の終わりっていうことでよかったでしょうか。
>>838 main() の戻り値および exit() の引数は OS などの環境によって
いくらか意味づけが行われていることがあるが、言語の範囲では
0 と EXIT_SUCCESS が成功、 EXIT_FAILURE が失敗決まっているだけ。
これ以外の 100 などの数値がどう解釈されるかは環境ごとに
異なる可能性がある。
return で関数が終了するのは main() でも他の関数でも変わらない。
main() の場合はプログラムも終了するけど。
>>839 おいおい、デタラメ教えるなよ。
成功/失敗時にreturnする値は決まってるわけではなく、ただの慣習。
>>840 ISO C 7.20.4.3 "The exit function" 5
>>839 0,1,EXIT_SUCCESS,EXIT_FAILURE
で実行してみたんですが、プログラム自体は
正常に動きました。
成功、失敗の意味合いはあるんですね。
みなさん回答ありがとうございました。
頼むからマイナス返すのだけは止めてくれ。
大抵のコマンドインタプリタはマイナスの値を利用できないから。
そういうこと言ってると非ゼロは-1教信者が
8bitしか有効じゃないコマンドインタプリタだと、exit(-1)すると255になるね。
受け取るのがコマンドラインインタプリタだと決め付けてるのは何故なんだろう
誰か決め付けてるの? 困った香具師だなぁ。 敢えてコマンドインタプリタと断っているのだから、 負の戻り値を利用できるケースがあることも承知しているのだろうよ。
でもまあ、大抵食わせるのはコマンドラインインタプリタだよね。
俺はウンコ食べるよ!
そういう時はマイナスの方がいいね。
俺はオシッコ飲むよ!
そういう時はプラスの方がいいね。
お前らはえの素かよ
ユー アー ナンバーワン シープラプラ プログラマー イエーッ!!バッバッバッバッバッバッバッバッバッ
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は使えないような気がします。 よろしくお願いします。
>>858 TCP/IPの場合、分割されようがなにしようが、受信側で巧いこと組み立てるしかない。
また、受信できる限りは受信し続けなければならない。
つーか、どう失敗したの?
>>859 recv==0で受信するループを抜けようとしたのですが、
最後の文字が送られてきてからrecv=0が送られてくるまでに
5〜10秒無駄に時間が空きます。
HTTP1.0でGETリクエストしたときは無駄な時間の空きがなく
素直にrecv=0が送られてきて終わりにできました。
もはやC++と何の関係もないがキーワードを教えてやる あとは自分で頑張りな 持続的接続 (persistent connections) Connection ヘッダフィールド
つぎはきっと、Chunked-Transfer-Encodingにハまるとみた。
どなたかお願いします。 ファイルの行数を求めるプログラムを作っています。 1行の文字数が不定のファイルの、全体の行数を求めるときはどんな風にすればよいですか? VC++を使っています。
宿題スレに行った方がいいと思うが、fgetcして\r\nの数数えたら。
'\n'だけ解釈すれば充分だろ。 何で'\r'なんか数えるんだ?
なんとなく。
fgetsで適当に読み込めば楽勝。
>>867 fgets()で指定したバッファ超より長い行があると、結局二度手間になると思うけど。
素直にfgetc()で読み流した方が速いんでない?
869 :
デフォルトの名無しさん :2006/07/19(水) 10:03:22
開発者の囲い込み。 オープンソース陣営が勢力を増してるので対抗するためにやむなく、という うがった見方もあるにはあり。
ExpressEdition自体はフルスペックのツールじゃないしなあ。 個人でさわってる分にはいいけど、VSSとの連携もないし、 すぐにStandrdEdition以上が欲しくなる罠。 つまりMSの壮大な釣り。
872 :
デフォルトの名無しさん :2006/07/19(水) 10:11:40
なるほど、お試し版の配布のようなものですね。 ありがとうございます。
863です。 fgetcの方向で考えてみます。 ありがとうございます
>>861 調べてみたけどやっぱり難しいようですね
ありがとうございます。
ネットワーク相談室にも行ってみます。
入門書一冊読み終わったところなんですが、 C/C++って、ファイルをオープンするときに perlのように、排他制御しなくてもいいんですか? 勝手にロックとかしてくれているんでしょうか。
>>875 入門書に排他制御のことが書いてないのは正常です。
C/C++の世界では、排他制御なんて、C/C++自体の話ではなく、OSなどの環境に依存した話になる。
perlでだって、CGIでも無きゃ排他制御なんて滅多にしないよ。
>>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
>>880 自分で課題ができないということはテストに不合格となるわけだ。
何も不思議ではないし、とても理にかなっている。安心しろ。
>>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;
}
マジでワケワカメ。
上の「次数のカウントのプログラム 」って何よ? 文字数のカウントのプログラム? いらねーよ。 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);
884 :
883 :2006/07/22(土) 02:16:06
かぶった。
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; }
いっそのこと #include <stack>
すいません。ポインタについて質問です。 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 単位オワタ
>>889 演算子が多重定義されているから。
つまり、渡されたのがvoid*かchar*かで別の関数が呼ばれる。
なので、この場合void*型にキャストすればアドレスが出力される。はず。
"0x"を付けたければ「マニピュレーター」を調べてくれ。
892 :
デフォルトの名無しさん :2006/07/22(土) 07:52:10
俺の実力よくしっている先生に887出してくる
API使わずにコマンドライン上で文字列を一定時間表示したいんだけど、 そのときのタイマー(例えば文字列を表示して5秒でクリアスクリーン) とかってfor文で無駄な処理をさせて無理やり時間とる以外に方法ってある? 低脳な質問でスマソ
あ、ごめんなさい、C++です…orz
dくす、やってみまつ
>>891 ありがとうございます。
早速、マニピュレーター調べてみます。
899 :
デフォルトの名無しさん :2006/07/23(日) 00:07:35
ブーストって有料?
901 :
デフォルトの名無しさん :2006/07/23(日) 00:17:19
よくわかんね フリーソフト作るならただで使っていいけど 商用開発ならロイヤリティよこせ みたいな感じ?
大事なのは最後の全て大文字で書かれている部分。 ようするに何やってもいいというようなことが書いてある。
どちらかというと どんな事になっても文句たれるな って書いてある
一番重要(というか他の多くのソフトウェアライセンスと確実に一線を画する)部分は
真ん中の 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 に書いてあります.
英語屋さ〜ん!
boost はそのうち標準化される事を目標にしてるんじゃなかったっけ? 緩くて当たり前。
逆にboostからC++標準になったコンポネントってなんかあったっけ。 arrayとかなったんだっけ?
>>909 C++標準との関係は boost のトップページに書いてある。
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++標準自体のアップデートって具体的に何時なのよ。
あいあい、移動しまっす。 2009年かー。 どうなることやら。
質問です。 httpで以下のような文字列をrecvしたとき、 Accept-Ranges: bytes\r\nContent-Length: 214\r\n この文字列に含まれている、 Content-Lengthの次から\rまでの数字だけを int型の変数に入れるにはどうやったらよいのでしょう? よろしくお願いします。
>>915 Content-Lengthより前の部分の文字列の長さが不定だったので、
sscanfの書式に合わなくて変な値を取りました。
他にやり方はありますか?
>>916 Content-Lengthをstrstr()で探しておいて、その続きからsscanf()。
>>917 strstrでContent-Lengthを探してポインタを取ったんですが
sscanfでどうやって取得したポインタを使えばいいのでしょう?
>>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);
}
あまりやらないかと言えばたしかにそうだが、 やっていることは基礎的な事柄を組み合わせているだけだから、簡単に思い付くはず。 わざわざ載せるまでもないというやつ。
こういう人はこういう使い方も思いつかなかったりするのかな? 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);}
わりりり、俺もするっとは出てこないや。
読んだらああなるほどねぇとは思えるんだが すぐに思いつくかと言われると難しいな
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');} でもいいが。
>>926 肝はフォーマット文字列も文字列リテラルに限定されないってことを示したかっただけなんだから勘弁してね。
勘弁ならねぇ!
じゃあ俺は検便する。
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の動き方が わからないのですが教えてください。 よろしくお願いします。
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'でした。 すみません。
あっ、 ”memsetの代わりに”って言う日本語も変でした。 どうしてこうバカなんだか。 不快になられた方本当に申し訳ございません。
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';
>>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()を使うのは避けた方がいいかもしれない。
こうすることも出来るyp mecpy(&obj, "7777777\07777777\07777777\0", 24);
思いっきり間違えてたyp orz memset(&obj, "yyyyyyy\0yyyyyyy\0yyyyyyy\0", 24);
guha 欝出し脳 memset->memcpy
>>937 それだったら未だ
strcpy(& obj, "yyyyyyy\0yyyyyyy\0yyyyyyy");
の方が素直な希ガス。
>>934 丁寧な解説、ありがとうございます。
できました。
>>935 勉強はじめたばかりで、ナル文字とか実はあんまり慣れてないです。
sizeof(obj.hoge_a) - 1は、-1すると
なぜかゴミがなくなったので、-1してみました。
ナル文字も勉強してきちんと書くようにします。
構造体ってメモリ上でこんな形で保存してあるんですね。
"7777777\07777777\07777777\0"
ttp://www.bohyoh.com/CandCPP/C/Library/memset.html このページの意味がやっとわかりました。
まさに、オブジェクトのポインタに同じ文字を
入れて初期化していくんですね。
はじめは、見えないところで特別な動きをして
構造体のメンバ変数ひとつずつにmemsetをやっていくのかと
思ってました。
みなさんありがとうございました。
ちなみに、構造体のメンバーがcharだけのばあいは、みっしり詰まっているが、 shortやintやdoubleなどが混在するとすかすかになったりするからね。 この話は勉強してればそのうち出てくると思うよ。(境界整列のはなし)
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言語に連想配列って無いみたいなんです。 よろしくお願いします。
struct _file { char *name; unsigned long size; } *file; file->sizeで比較
>>994 アドバイスありがとうございます。
初心者なのでちょっと心配な部分もありますが、
なんとなくわかりました。
がんばってみます。
>>943 fopen >> fseek >> ftell >> fclose
今までクラスを使うときはなんとなくすべてポインタ変数を使っていたのですが、 ポインタを使わなくてもいい場合というのはどういうときでしょうか。
全部 new してるって意味か?
>>947 ポインタ使わないといけない場合の反対。
950 :
947 :2006/08/09(水) 01:42:47
//
>>950 #include <iostream>
#include <string>
int main()
{
std::string foo = "bar";
std::cout << foo;
return 0;
}
>>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もいらない。
>>953 スタック上につくられてるからnewはいらないというのは、おかしな説明だな。
まあ…そうだね。
ていうかまあ、
>>949 でFAなんだよな。
すまんかった。
いろんなソースコードを読んで勉強したいんですが、 C/C++版のcpanみたいなサイトご存じないでしょうか。
sourceforge google code
構造体のワードアライメントって未だに考慮しないとならないんだな。 ちょっといじってサイズが4分の1になってびっくりした。 そろそろ自動で解決してくれよと思う。
>>959 「ちょっといじって」が何のことかわからんが、大抵の場合は
規格に従う限り無理だろう。
BYTE、DWORD、char、LONG、BYTE・・・みたいな感じに並んでた BYTE、char、boolなどを全部前方にまとめてみただけだけ。 詳しい規格は知らないけど単に2パスしてくれれば いいような気もするが難しいのかな?
構造体は「集合」じゃないんですが。
構造体の順番勝手に変えられたらまずいだろ。
packしろ
>>961 既にメンバの並び順に依存した規定が標準として定められてしまっている。
互換性を考えると無理。
昔は並び替えちまうコンパイラもあったような… まあ、今は昔の話だ罠
コンパイラ依存で #pragma 使ってサポートできなくはないだろうね。
windowsで、ファイルのコピーするときですが、 コピーしている途中のデータにアクセスして、 リアルタイムでその容量を知ることってできますか? その容量がわかると、 ・現在何M中何Mです。 とか、速度を計算して ・後何秒で終わります とかできそうなんですが。 よろしくお願いします。
>>968 エクスプローラを見ていれば判ることですが、殆ど意味がありません。
そもそも、「書き込み中のファイル」は検出できるかもしれませんが
「読み込み中のファイル」を検出できないので無理です。
>>969 >>970 ありがとうございます。
ネットの環境がなかったのでお礼遅れました。
CopyFileExで検索したら、msdnのページの
詳しい解説が出てきました。
質問ばかりで申し訳なんですが、疑問が出てきました。
自前でこういう関数は作れるんでしょうか?
「コピー中のファイルを検出して1秒ごとに表示」
というサンプル作ってみたんですが、
コピー中のファイル検出できましたが、
容量は毎回同じ"全部の容量"しか表示されませんでした。
たとえば、ファイル形式の変更(gif->jpgなど)、圧縮
符号化などのソフトをみると、作成中のファイルの容量を調べて
処理過程を表示させているような気がしてます。
よろしくお願いします。
気がするだけ
たぶん、自前で作れると思うけど、君には無理なんじゃないかな?
俺も興味ある。 符号化先のリアルタイムの容量って 知ることできないの? コピーしてる途中のファイルをdirコマンドで 見たら全部の容量が表示されたんだが。 処理系経過って普通のアプリについてるもんだから スキルいらんと思うだが。 そういう俺はスキルないけどな!
他のアプリがコピー中のファイルの、処理済み容量を知ることはできないと思うが。 OSによっては、ディスクに書き出した時点でファイルサイズが決まるから経過は見えるけどバッファサイズ単位でしか増えないし。
for (i = 0; i < 100; i++) { fread(buf, filesize / 100); fwrite(buf) printf("%d %%\n", i + 1); }
>>977 ありがとうございます。
freadってこういう風につかえるんですね。
調べて書いてみます。
↓「>977のソースがコンパイルできません」かな?w
>>978 実際に作るなら、100分割とかにはしないで、最小コピーサイズで分割しろ。
1MBごととか、4MBごととかな。512bytesの倍数にしろよ。
>>980 なんで?
バッファリングされているから何の意味もないと思うのだけど。
>>981 何によってバッファリングされ、そしてそのサイズはいくつ?
983 :
980 :2006/08/22(火) 00:07:27
>>981 あれ?俺何に突っ込まれてる?
512の倍数にしろってとこかな?
>>983 言ってること全体だと思われ。
そんなんに気を回さなきゃならんくらいなら、ファイルストリームの意味無いじゃんよう。
985 :
980 :2006/08/22(火) 01:38:40
>>984 そうかなー?CopyFileに肉薄するためには、何かを考えないといけないと思うんだけど。
小さく分けても、HDDの読み書き速度が20〜60MB/sだから意味ないし、
大きくしすぎても、メモリを圧迫する可能性があるし。
どこかに妥当な「最小コピーサイズ」があるとは思わない?
そりゃチューンの話で、もっと言えば実装依存の話じゃないか。
妥当な最小コピーサイズは確かにあるだろうし、
具体的な数字の目処もある程度予想は着けられるかもしれないが、
アプローチの方向は根本的に間違ってるかと思われ。
それ以前の問題で
>>977 のfilesize/100は高確率で100バイトずれるバグをはらんでるはずだから
そのままじゃ受け入れられないけどさ…。
987 :
980 :2006/08/22(火) 02:13:25
FFCでググったらフットサルチームしか引っかかってきませんでした。 俺の負けでいいです。
989 :
980 :2006/08/22(火) 02:21:58
Fire File Copy
…根本的に齟齬があることがわかりました。 ちゃんとチューンするなら、そりゃマストのアプローチです。 でもそれならfreadとかfwriteとか使わない。 俺はそう申し上げたかった。
991 :
980 :2006/08/22(火) 02:32:54
バッファのサイズを考えることは、単にチューン目的だけじゃなくて、 アーキテクチャの面もあると思うんだけど、話したくなさそうなのでもういい。
何でそこにアーキテクチャが顔を出すのかは正直理解が及ばないけど、とりあえずお疲れ様でした。
993 :
980 :2006/08/22(火) 02:53:30
>>992 OSのファイルキャッシュを汚染する/しないとか、HDDのシークを減らすとか、
ヒープを取り過ぎないようにするとか。
これらってアーキテクチャだと思うんですが、どうでもいいです。
>>993 それは全然アーキテクチャじゃないと思われ…
アーキ語るなら、せめて内側のことと外側のことは分けて考えようぜ
な?
なぜかここでFCB
それがはきだめクオリティ 踏み台
@
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。