はきだめC/C++下級者の質問箱
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/08/17(水) 14:20:27ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。
なお、質問する人は回答はあまり期待しないでください。
0002デフォルトの名無しさん
2005/08/17(水) 14:22:450003デフォルトの名無しさん
2005/08/17(水) 14:45:010004デフォルトの名無しさん
2005/08/17(水) 17:28:190005デフォルトの名無しさん
2005/08/17(水) 17:29:130006デフォルトの名無しさん
2005/08/17(水) 17:46:45*p++ = *q++;
って、書きたがるのですか?
*p = *q;
p = p + 1;
q = q + 1;
って書いたほうが、間違いがなくて、はるかに分かりやすいと思うけど、
こう書いたら、死ぬほど怒られた・・・
0007デフォルトの名無しさん
2005/08/17(水) 17:48:08処理が遅くなる
0008デフォルトの名無しさん
2005/08/17(水) 17:52:06ハハハハハ。
「はきだめC/C++下級者の質問箱」ならではのナイスレスw
0009デフォルトの名無しさん
2005/08/17(水) 18:08:01プログラム言語c++の165p〜167Pを
立ち読みしてください。
0010デフォルトの名無しさん
2005/08/17(水) 18:18:11どうすればいいですか?
0011デフォルトの名無しさん
2005/08/17(水) 18:21:010012デフォルトの名無しさん
2005/08/17(水) 19:26:09俺ならつりセットして道路に放置、釣れるまで待つwww
0013デフォルトの名無しさん
2005/08/17(水) 19:53:41少なくとも
p=p+1;はやめとこうな。
0014デフォルトの名無しさん
2005/08/17(水) 20:05:29だと一行に情報が詰まってって、瞬間的にやってることが理解できる。
慣用句みたいなものだし。
*p = *q;
p = p + 1;
q = q + 1;
だと、3行見ないといけないので、理解速度落ちる。
0015こえだめ
2005/08/17(水) 22:11:24敢えて書くとしたら
(*p)++=(*q)++じゃなくて
*(p++)=*(q++)という意味だろう
*型は、入れ物の最初のアドレスを示す
この感覚を持っておくのは、間違いを防ぐために重要だよ
0016デフォルトの名無しさん
2005/08/17(水) 22:57:04どうせだったら
p[0] = q[0];
p = &p[1];
q = &q[1];
と書いてみてはどうだろう。
きっとその先輩も納得してくれるはず。
0017デフォルトの名無しさん
2005/08/17(水) 23:43:530018デフォルトの名無しさん
2005/08/17(水) 23:47:24VC7.1
0019デフォルトの名無しさん
2005/08/17(水) 23:52:15レス
アリガトウゴザマス
0020デフォルトの名無しさん
2005/08/18(木) 00:02:00ここは「通報しますた」と返す所じゃないか?
0021デフォルトの名無しさん
2005/08/18(木) 01:17:420022デフォルトの名無しさん
2005/08/18(木) 01:20:24皮肉りますた
0023デフォルトの名無しさん
2005/08/18(木) 02:40:49すごいな。Cプログラマーは、これを一瞬見ただけで理解できるのか・・・
下級者な俺は、カッコとかつけてみて、一個ずつ考えてかないと何やってるのか
サッパリ分からないよ。
こんなの、どうやったら一瞬見ただけで分かるようになるのですか?
てか、なんで上級者は、できるかぎり分かりにくく書くように努めるのですか?
0024デフォルトの名無しさん
2005/08/18(木) 02:48:34俺も凄いと思った。こんなコードを一瞬で理解できるなんて、天才か基地外の
どちらかだな。どちらかというと後者の方だろうな。
0025デフォルトの名無しさん
2005/08/18(木) 02:53:160026デフォルトの名無しさん
2005/08/18(木) 03:37:000027デフォルトの名無しさん
2005/08/18(木) 08:39:280028デフォルトの名無しさん
2005/08/18(木) 09:38:34だめだ、エラーが出るOrz
0029デフォルトの名無しさん
2005/08/18(木) 10:14:52だめだ、エラーが出るOrz
0030デフォルトの名無しさん
2005/08/18(木) 10:57:09すたんだーどあぃおー
0031デフォルトの名無しさん
2005/08/18(木) 11:13:30003227
2005/08/18(木) 11:21:25由来は知っています。読み方が知りたいです。
0033デフォルトの名無しさん
2005/08/18(木) 11:22:040034デフォルトの名無しさん
2005/08/18(木) 11:24:27上級者向けの本に書いてあった。僕は上級者じゃないけど
0035デフォルトの名無しさん
2005/08/18(木) 11:26:350036デフォルトの名無しさん
2005/08/18(木) 11:54:08カタカナでは表現しきれない発音なので困っています。
0037デフォルトの名無しさん
2005/08/18(木) 12:38:08コンパイル通らないぞ
>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*型に入れられるという存在意義が大きいわけで
0038デフォルトの名無しさん
2005/08/18(木) 12:40:450039デフォルトの名無しさん
2005/08/18(木) 13:03:43p[値]なとき、pが示すのは、配列の先頭アドレス
*paなとき、paが示すのは、入れ物の先頭アドレス
世の中の本の説明はへたくそだと思う
0040デフォルトの名無しさん
2005/08/18(木) 13:10:35> コンパイル通らないぞ
配列として宣言するからだろ
0041デフォルトの名無しさん
2005/08/18(木) 18:14:250042デフォルトの名無しさん
2005/08/18(木) 18:36:44Java にもコンパイラ要るだろ?
しかも Java はコンパイラだけじゃなくランタイムまで要るだろ?
0043デフォルトの名無しさん
2005/08/18(木) 19:12:400044デフォルトの名無しさん
2005/08/18(木) 20:03:09失礼、知人から古いパソごと貰ったものですから・・・
Cみたいな値段するんですか?
0045デフォルトの名無しさん
2005/08/18(木) 20:11:33VCのコンパイラもフリーであるし
0046デフォルトの名無しさん
2005/08/18(木) 20:16:46プログラマが楽をして、そのツケをユーザー側に押しつける最低言語。
0047VCでは
2005/08/18(木) 20:28:31要は、例えば、Viewクラスから、CDoc::〜なんて、関数を使っちゃうことができない
(おそらく、この機能は、それぞれの基本クラスで、protect:指定されて関数が定義されているからではないかと勝手に推測してる)
だが、それでは、困るから、お互いのクラスをアクセスする為の関数が各クラスに少しだけ設けられている
これらを介すれば、例えば、Viewクラスから、Docクラスの関数を全てかどうか分からないが、スコープ(::)で使えなかったあらゆる関数が使えるようになる
で、これらのクラスの関係のしくみをとり仕切っているのがボスであるCWinAppクラス
この派生クラスであるC〜Appクラスでドキュソメントテソプレートというテンプレート(テンプレ自体はC++の機能。おそらく雛型はCWinAppにあると勝手に推測している)というのを使って、
Flame(子も含め)、Doc、Viewの各クラスの関係を定義している
実装は、C〜AppのInitInstanceにある
はきだめらしく、変かもしれない
0048デフォルトの名無しさん
2005/08/18(木) 20:30:360049デフォルトの名無しさん
2005/08/18(木) 20:41:43というのが正しいかもしれない
とにかく、InitInstanceにRUNTIME_CLASS()という関数がある
0050デフォルトの名無しさん
2005/08/18(木) 21:36:24>Viewクラスから、CDoc::〜
C〜Viewクラスから
C〜Doc* pDoc;
pDoc->〜
なんてことはできない
0051デフォルトの名無しさん
2005/08/18(木) 23:34:47燃やすんですか?<Flame
0052デフォルトの名無しさん
2005/08/19(金) 00:17:390053デフォルトの名無しさん
2005/08/19(金) 00:27:440054奥義のほんの一部だが
2005/08/19(金) 00:33:05ある意味、守られたオブジェクト群ともいえる
しかーし、この法の目を抜けて、気ままにお互いアクセスする手段もある
例えば、
同じプロジェクト上で、新規に.hと.cppを作り、Docを派生させてクラスを作ってやる(例えばclass ONEW:public〜)
注)ウィザードの新規クラスでは、コンボになくて、継承できなくなっている、MSがそんな抜け道させない為か・・・
そして、ViewでONEW on;とでも宣言してやれば、あら不思議、
on.〜でViewからDocがGetDocument関数も使わずに自由にアクセスできてしまう
ちなみに、この技、アマグラマーだけに許されている
なぜなら、制限がないだけにプログラマーが、仕事で使うと危ういからだ
ヤケドするぜw
なんちゃって
0055デフォルトの名無しさん
2005/08/19(金) 01:02:45ONEWクラスファイルのインクルードを忘れずに
それと、逆にいうと、新規クラスを作るときはRUNTIMEの目が届かない可能性があるから、注意が必要だとも言える
005656
2005/08/19(金) 03:56:46c++についてなのですが、2つcppファイルを作って片方から片方の変数を見る事ができません。
メソッドについてはexternを使えば参照できる事がわかったのですが、変数などが参照できません。
教えてください。よろしくお願いします。
0057デフォルトの名無しさん
2005/08/19(金) 07:37:00メソッドってなんだろうな…と。
関数は普通に関数宣言で。変数は extern で。
宣言と定義の意味をちゃんと理解しておこう。
0058デフォルトの名無しさん
2005/08/19(金) 13:51:19ゴチャゴチャしててよく解らんが、もしかして
>そして、ViewでONEW on;とでも宣言してやれば
View に Doc を内包させようとしてる?
そら確かに掃き溜めらしいが…
0059デフォルトの名無しさん
2005/08/19(金) 14:29:110060デフォルトの名無しさん
2005/08/19(金) 18:12:58せめてこうしようぜ。これなら俺は許す。
*p = *q;
p++;
q++;
0061デフォルトの名無しさん
2005/08/19(金) 18:22:20クラス宣言に class を使わず struct を使う(最低)。
0062デフォルトの名無しさん
2005/08/19(金) 19:04:59CとC++では変数のスコープが違っているから注意せよ。
C++はわざわざextern付けないと、グローバルにならない。staticはもはや
classやstruct中でしか使われなくなった。
0063デフォルトの名無しさん
2005/08/19(金) 20:31:40CでもC++でもグローバル変数の宣言にはexternが必要だが。
0064デフォルトの名無しさん
2005/08/19(金) 21:18:04その上にくっついている、 c って何の意味があるんですか?
command? それとも c++? の略かなんかですか?
0065デフォルトの名無しさん
2005/08/19(金) 21:22:07Console
0066デフォルトの名無しさん
2005/08/20(土) 01:18:140067デフォルトの名無しさん
2005/08/20(土) 08:41:190068デフォルトの名無しさん
2005/08/20(土) 16:22:19上級者:自分が分かってないことを分かってないヤツ
0069デフォルトの名無しさん
2005/08/20(土) 16:33:510070デフォルトの名無しさん
2005/08/20(土) 22:48:38関数内
0071デフォルトの名無しさん
2005/08/22(月) 14:38:090072デフォルトの名無しさん
2005/08/22(月) 14:48:26どんなでかいプログラムも一本のファイルになるからお勧めだよ。
0073デフォルトの名無しさん
2005/08/22(月) 14:54:100074デフォルトの名無しさん
2005/08/22(月) 17:34:13俺もそれやってるよ。ヘッダファイルを全部コピペで一本のソースに
貼り付けてる。プログラムを一つも書かなくても、ソースの大きさが100MBを
超えて、すごい快感だよなww
0075デフォルトの名無しさん
2005/08/22(月) 18:48:11全部1ファイルにマージするツール作ったよ。
GUIフロントエンドから、使用したいクラスを選択すると、関連ソースを全部1ファイルに
してくれるから、あとは自分のコードを追加するだけという優れもの。
0076デフォルトの名無しさん
2005/08/22(月) 18:48:37例えば、とあるクラス(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
0077デフォルトの名無しさん
2005/08/22(月) 19:48:26いけるよな。
main なんかどんな cpp ファイルでも必要だから、ヘッダファイルに書くのは常識だよ。
0078デフォルトの名無しさん
2005/08/22(月) 20:21:07まじめに答えると量が多くなってくると面倒くさくなる。
打ち間違いも心配。コピペでもなんとなく不安。
0079デフォルトの名無しさん
2005/08/22(月) 20:31:45じゃぁ私もまじめに答えよう。
コピーペーストだと、一箇所書き換えると
そこからコピーしたファイル全部を修正する必要がある。
.h にまとめておくと、再コンパイルだけで済むのでミスが少なくなる。
0080デフォルトの名無しさん
2005/08/22(月) 23:33:23#include "main.h"
0081デフォルトの名無しさん
2005/08/23(火) 14:16:14ヘッダファイル → 大盛りネギダク
.cppファイル → 牛鮭定食
という対応はわかったかな? >>71
0082デフォルトの名無しさん
2005/08/23(火) 14:53:200083デフォルトの名無しさん
2005/08/24(水) 01:21:30処理系依存
0084デフォルトの名無しさん
2005/08/24(水) 16:25:12// $(CC) -DIFILE=\"....\" ...
0085デフォルトの名無しさん
2005/08/27(土) 13:45:390086デフォルトの名無しさん
2005/08/27(土) 14:10:480087デフォルトの名無しさん
2005/08/27(土) 17:24:430088デフォルトの名無しさん
2005/08/27(土) 17:36:010089デフォルトの名無しさん
2005/08/27(土) 18:04:48何が必要ですか?
0090デフォルトの名無しさん
2005/08/27(土) 18:13:470091デフォルトの名無しさん
2005/08/27(土) 18:25:15他にコンピュータとコンパイラは最低限必要だな。
あぁ、気兼ねなくネットサーフィンできる環境があると
ちょっとした調べごとがさくっとこなせてベター。
0092デフォルトの名無しさん
2005/08/27(土) 19:22:450093デフォルトの名無しさん
2005/08/27(土) 19:24:560094デフォルトの名無しさん
2005/08/27(土) 23:42:570095あぼーん
NGNG0096デフォルトの名無しさん
2005/08/27(土) 23:58:16勤め人だったら○○在住 会社員の山田太郎
フリーだったら○○在住 自営業の山田太郎
こうなるからじゃないのか?と思った。
0097デフォルトの名無しさん
2005/08/28(日) 05:45:140098デフォルトの名無しさん
2005/08/29(月) 12:21:130099デフォルトの名無しさん
2005/08/29(月) 13:53:20・駅の点字ブロックに荷物を置いた老人を
線路に突き落とした自称プログラマ。
・親子でキャッチボールしてる所に車で突っ込んだ後、
父親を包丁でメッタ刺しした自称プログラマ。
・出張32◆Rb.XJ8VXow。
0100デフォルトの名無しさん
2005/08/30(火) 10:38:420101デフォルトの名無しさん
2005/08/30(火) 12:54:230102デフォルトの名無しさん
2005/08/30(火) 13:19:170103デフォルトの名無しさん
2005/09/12(月) 05:33:53やっぱりmakeファイルを作るしかないの?
0104デフォルトの名無しさん
2005/09/12(月) 08:18:000105デフォルトの名無しさん
2005/09/12(月) 10:33:25ソース1本で書けばいいジャマイカ
0106デフォルトの名無しさん
2005/09/12(月) 11:41:35どうすればいいでしょうか?
0107デフォルトの名無しさん
2005/09/12(月) 12:01:590108デフォルトの名無しさん
2005/09/12(月) 12:24:200109デフォルトの名無しさん
2005/09/12(月) 12:38:21んー今のマザーボードでは1GBが限界でして。
>>108
少しずつ計算してはまめに書き出す方式に変更する事にしました。
ありがとうございました。
0110デフォルトの名無しさん
2005/09/12(月) 13:16:130111デフォルトの名無しさん
2005/09/12(月) 13:45:58bcc32 -eHoge *.h *.c
0112デフォルトの名無しさん
2005/09/12(月) 14:44:19fatal error C1083: インクルード ファイルがオープンできません。'GL/glut.h': No such file or directory
cl.exe の実行エラー
このようなエラーがでます。どうしたらいいのでしょうか?
0113デフォルトの名無しさん
2005/09/12(月) 14:46:210114蕎麦
2005/09/12(月) 14:51:17ヒントを下さいっ!
こんな感じの動作が理想です。
・入力電圧が1Vなら動作A
・入力電圧が2Vなら動作B
・
・
・
0115デフォルトの名無しさん
2005/09/12(月) 15:12:200116112
2005/09/12(月) 15:22:07ありがとうございます。解決できました
0117デフォルトの名無しさん
2005/09/12(月) 15:34:13とかいうエラーが出るんだけどこれってどうすればいいの?
0119あふぉかばかかと ◆Bdtx2TrI.U
2005/09/12(月) 17:44:56http://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
長いから途中できった。自分でつなげな。。
0120デフォルトの名無しさん
2005/09/12(月) 18:07:23適当に閉じ括弧を付け足していけばいつかはなんとかなるかも。
0121デフォルトの名無しさん
2005/09/12(月) 19:39:541.5V や 1.98V だったらどうするのかと。
0122デフォルトの名無しさん
2005/09/12(月) 20:06:06またmallocで確保しdeleteで解放するとどうなりますか?
0123デフォルトの名無しさん
2005/09/12(月) 20:14:410124デフォルトの名無しさん
2005/09/12(月) 21:22:43newしたと同じようにVirtualMethodTable整備など等をこなし、難なくdelete出来るまで揃えられたら、それはそれですごいと言われる。
かと言って尊敬のまなざしは決して向けられない
0125デフォルトの名無しさん
2005/09/12(月) 21:36:02new(malloc(n)) T
まあdeleteできるかどうかはわからないが。
0126デフォルトの名無しさん
2005/09/12(月) 23:09:20簡単なソケットプログラム実行しようとすると
bind: Socket operation on non-socket とか
connect: Socket operation on non-socket
エラーがでます。これって何が原因ですか?
0127デフォルトの名無しさん
2005/09/12(月) 23:12:380128126
2005/09/12(月) 23:17:32プギャー ですか。了解。
0129デフォルトの名無しさん
2005/09/12(月) 23:23:540130デフォルトの名無しさん
2005/09/13(火) 02:56:59ポインタがわからず、本を何冊も読みあさっていたら
今度は普通の変数がわからなくなりました。
変数とは一体何なんでしょうか。
メモリのどこかにあるデータを変数名で参照できるということは、
普通の変数も実体はメモリアドレスを表すポインタなのではないかと
いう気がします。
例えば int x = 100; とした場合
メモリのどこかに100というデータが入るわけですが
xという変数は、そのメモリのアドレスを持っていて
プログラムで変数名を書くと暗黙的に*が付いて
アドレスの示す先のメモリデータを参照している
のでしょうか。だとしたらポインタの存在意義は?
頭がおかしくなりそうです。
0131デフォルトの名無しさん
2005/09/13(火) 03:24:210132デフォルトの名無しさん
2005/09/13(火) 04:15:23> 変数とは一体何なんでしょうか。
値を格納するためのもの、なんだけど、130にあわせて言うと
「プログラマがアドレスを指定する手間を省くためのもの」と言った方がいいのかな。
アセンブリレベルで見れば、変数への読み書きは特定のアドレスに対する読み書きそのものなんだけど
重要なのは、そのアドレスが「どこか」をプログラマが知らなくていいこと。
仮に変数がなかったら、プログラマが「メモリのどこに書き込むか」を指定しなきゃいけなくなる。
C言語のような高級言語がない時代には、実際にそういう作業をしていた。
けど格納するべき値が1000個や2000個になってくると、アドレスを管理するのも大変になる。
それが面倒だってんで、アドレスの管理をコンパイラに押しつけて
プログラマは名前(変数名)だけ管理すればよくなった。これが変数の意義。
130に書いてある通り、メモリ操作さえできれば、変数なんてなくても計算結果を格納することはできるけど、
それじゃ面倒だから変数というものを導入した、と考えてみては。
> ポインタの存在意義は?
ポインタの存在意義は、メモリの直接操作ができること。
変数の導入で、プログラマはアドレスの管理からは解放されたけど、
同時にメモリを直接操作することができなくなってしまった。
(普通の変数のアドレスはコンパイラが勝手に管理してしまうから、プログラマが手を出せない)
OSや組み込み系のプログラムに使う場合は特にだけど、
普通のアプリケーションでも効率を上げるためにメモリを直接弄ることはままある。
これは困った、というわけで、ポインタというものを導入して、メモリを操作する抜け道を造った。
という流れで理解してみたらどうでしょう。
かなり説明のためにハショったりねじ曲げてる箇所があるから
真面目に説明する人からはお叱りを貰いそうだけど・・・
長文・乱文スマソ
0133デフォルトの名無しさん
2005/09/13(火) 04:28:58ふつう。
int x;
としたら、xにアドレスは入れない。
int *p; としたら、pを整数格納用途には使わない。
0134デフォルトの名無しさん
2005/09/13(火) 04:30:21WINAPIをかじったおかげで、画面になにかを表示するには機械語でOSに指示を
だせばよい、ということは理解できました。
ただ、じゃあOSはどうやってブラウン管の電子銃に指示をだしてるのか(液晶なら
電荷関係の支持をどうやってだしているのか)、その結びつきがわかりません。
明日大きな本屋にいっていろいろ調べてみるつもりですが・・
一応、ここにも書き込みをさせていただきました。
たとえばですが・・OSの介在なしに、ブラウン管の電子銃に指示をだす・・
なんてことは可能なのでしょうか??
0135ぼるじょあ ◆yBEncckFOU
2005/09/13(火) 06:26:12VGAに直接指示を出す。しかしディスプレイドライバが組み込まれているので、
直接I/O命令を出すと、OSにトラップされてエラーが出るぞ。OS無しなら可能。
OSでもMSDOSでしかも仮想86モードを使ってないような状態なら可能。
0136デフォルトの名無しさん
2005/09/13(火) 06:27:090137デフォルトの名無しさん
2005/09/13(火) 07:05:43昔はビデオモード設定して16色BMP表示とか、みんなやってたよ。
0138デフォルトの名無しさん
2005/09/13(火) 16:30:55せいぜい走査線割り込みジャマイカ。
0139デフォルトの名無しさん
2005/09/13(火) 17:03:41メモリ上にはいっぱい私書箱があるわけで、私書箱100番、がポインタ。
私書箱100番、のなかに入ってる12345とかいう数値の書かれた手紙が変数の値。
どよ?
0140デフォルトの名無しさん
2005/09/13(火) 17:12:34>>130はポインタの動作を理解してないわけじゃなくて
コンパイラによる変数の実装と、言語仕様としてのポインタを混同してるだけだと思われ
0141デフォルトの名無しさん
2005/09/13(火) 17:13:43ソフトで出来るのはどう頑張っても VRAM への書き込みまでですな。
そこから先はハードウェアの仕事。
0142139
2005/09/13(火) 17:26:010143デフォルトの名無しさん
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]);
これで上と下は同じ結果になるからやってミホ
0144デフォルトの名無しさん
2005/09/13(火) 19:43:46ただ文脈によって「特例で」おなじに見せているだけだ。
0145デフォルトの名無しさん
2005/09/13(火) 20:19:020146デフォルトの名無しさん
2005/09/13(火) 22:15:480147デフォルトの名無しさん
2005/09/15(木) 14:13:33「まんこ」→「おめこ」
「おめこ」→「まんこ」
と永久ループになっていて埒があきません。どうすればいいでしょうか?
0149デフォルトの名無しさん
2005/09/15(木) 15:09:140150デフォルトの名無しさん
2005/09/15(木) 15:17:10void main()じゃだめなの?
0151デフォルトの名無しさん
2005/09/15(木) 17:17:330152デフォルトの名無しさん
2005/09/15(木) 17:18:17C99?
0153デフォルトの名無しさん
2005/09/15(木) 17:59:42別に認められてないわけじゃなくて、C89の時から
「その他処理系依存のプロトタイプ」に分類されてて、規格違反というわけではない。
非推奨だから警告が出るけど。
0154デフォルトの名無しさん
2005/09/22(木) 13:56:480155デフォルトの名無しさん
2005/09/23(金) 04:44:340156デフォルトの名無しさん
2005/09/23(金) 05:05:28Windows上のC言語でお勧めの環境はどれですか?
いろんな前提要件抜きでバシッとマジレス希望。
或いは、各々の特徴を述べ立てて比較検討希望。
よろしくお願いします。マジでお願いします。
0157デフォルトの名無しさん
2005/09/23(金) 05:53:14#define Xstr(x) Str(x)
#define OP plus
char *opname = Xstr(OP);
main() {
printf("%s\n", opname);
}
これで
plus
が出力される理屈を教えてください。
OP -> plusはいつ変換されるんですか?
0158デフォルトの名無しさん
2005/09/23(金) 06:36:43char *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マクロをワンクッション置いて使ってるのかと。
ていうか使い道のないコードだな。
0159デフォルトの名無しさん
2005/09/23(金) 07:00:22ので、Xstr(OP); ではまずOPが展開される。
ただし、#や##に対応する仮引数は先に展開されない(同 16.3.1)から、
うあw、酷い仕様ですね
0160デフォルトの名無しさん
2005/09/23(金) 07:05:07ありがとうございmさいた。
0161デフォルトの名無しさん
2005/09/23(金) 07:58:10実際、この展開規則をまともに実装するとなると骨だよ。
仮引数を見つつ、#に関係する引数については評価から外さなきゃいけない。
つまり2パス。
0162デフォルトの名無しさん
2005/09/23(金) 08:10:24教えて偉い人
0163デフォルトの名無しさん
2005/09/23(金) 08:26:44それがどんなものであれ、無いよりは有った方が良い。
それを不要だと主張する者は、それを使わなければ良い。
という考え方が根底にあるからw
0164デフォルトの名無しさん
2005/09/23(金) 08:31:03先に評価しておく必要性があるんでしょうか。
0165デフォルトの名無しさん
2005/09/23(金) 11:11:59ANSI C
0166デフォルトの名無しさん
2005/09/23(金) 11:56:15#のない頃のプリプロセッサとの互換性をなんとか維持しようとした苦肉の策だった気がするが、具体的なことは忘れた。
0167デフォルトの名無しさん
2005/09/23(金) 16:25:12ナンギな都合があるんですね(´・ω・`)
ありがとうございます。
0168デフォルトの名無しさん
2005/09/24(土) 20:38:01はじめてみて、やっぱりあきらめようかなと思った時は、
無料の方がふん切りがつきやすいんじゃないかな?
お試し版の C とかあったよね。
あと、DEVC++とかの日本語化がされてないやつとかはあきらめやすいんじゃ
ないかな?
0169デフォルトの名無しさん
2005/10/04(火) 18:06:46( ・(ェ)・) <クマー ( ;・ω・) アワワ
/J ▽J ⊂ O
し―-J ( /
≡ ⊂\_)
0170デフォルトの名無しさん
2005/10/04(火) 19:26:26無料だと、又やってみようかな?って思うぞ
金払ってるともう2度とこんな無駄金払ってられないってなるよ
0171デフォルトの名無しさん
2005/10/04(火) 20:35:04ということは、自分の時給換算ができる人は有償の C 言語を検討した方が、
身のほどを知った時無駄な時間を失わずに済むってことですね。
0172デフォルトの名無しさん
2005/10/04(火) 21:41:59&や、*のせいで挫折しそうです。
なんか、こうイメージ的にわかりやすく説明してください。宣言の時と使用時
0173デフォルトの名無しさん
2005/10/04(火) 21:51:17int *p;って宣言は「式の中で*pと書くとint型の値が得られる」と読む、っていうのはよく言われる。
0174デフォルトの名無しさん
2005/10/04(火) 22:43:46イテレータからコンテナの中身を取り出す時だけ?
& は関数宣言で引数におまじないで付ける位に考えておけばいいんじゃないの?
0175デフォルトの名無しさん
2005/10/04(火) 22:49:19あれで何人が壊れたことか。
0176デフォルトの名無しさん
2005/10/04(火) 22:53:08こらこら、余計混乱するようなことを書くな。
0177デフォルトの名無しさん
2005/10/05(水) 00:25:54DelphiでいうHaltみたいなやつです。
ググってみたところexit関数という物があるようなんですが、
C++では使うなといったような事が書いてあって、よくわからない状態です…。
0178デフォルトの名無しさん
2005/10/05(水) 01:33:380179デフォルトの名無しさん
2005/10/05(水) 07:39:330180デフォルトの名無しさん
2005/10/05(水) 08:33:47C++でもexitは使える。
ローカル変数のデストラクタが呼ばれるように気をつけて使えば全然問題ない。
0181デフォルトの名無しさん
2005/10/05(水) 08:53:370182デフォルトの名無しさん
2005/10/05(水) 10:31:070183デフォルトの名無しさん
2005/10/06(木) 21:06:480184デフォルトの名無しさん
2005/10/06(木) 21:24:43まぁ普通にva_start〜va_arg〜va_end使えばいい話だろうけど、
これって最後に末尾を示すコード(たとえば-1とか)入れる必要出てくるじゃん。
sprintfとか見るとそういうの一切ないけど、ああいう実装はどうやってやるんだろ?
0185デフォルトの名無しさん
2005/10/06(木) 21:33:20通常の実装であれば、formatに完全に依存してる。
formatを1文字ずつパースしていって、可変引数からの値が必要になるような
%dや%fといった文字列が出てきた時に逐一va_argで取り出すから、末端を識別する必要がない。
その代わり、可変引数の数より多く指定してしまったりすると暴走する。
0186デフォルトの名無しさん
2005/10/06(木) 21:48:160187デフォルトの名無しさん
2005/10/07(金) 16:26:23うまくスレッドが終了できてないのでしょうか?
0188デフォルトの名無しさん
2005/10/07(金) 16:50:24タスクマネージャのメニューの「表示」→「列の表示」→「スレッドの数」をチェック
して調べた方がいい、あと仮想メモリの方が事実上の使用されているメモリ使用量なんだっけ?
0189デフォルトの名無しさん
2005/10/07(金) 17:49:33スレッド終了して減る量なんて TLS の分くらいだべ?
0190189
2005/10/07(金) 17:50:12そりゃ減らんでしょ。
0191デフォルトの名無しさん
2005/10/07(金) 19:07:06タスクマネージャにこんな機能があったのかー。初めて知りました。
調べてみたら、スレッドは正しく終了してるみたいです。
>>190
beginthreadの方が良いのですか?
0192デフォルトの名無しさん
2005/10/08(土) 00:41:46Cランタイムをリンクしてるならbeginthreadex使わないとリークするぜ。
使わないだけじゃだめ。
CランタイムをリンクしないならCreateThreadでおけ。
0193デフォルトの名無しさん
2005/11/07(月) 16:16:380194デフォルトの名無しさん
2005/11/07(月) 16:29:10cat /proc/cpuinfo
直接cpuidで調べるのは面倒だな
OSサポートのチェックもあるしな
0195デフォルトの名無しさん
2005/11/07(月) 17:11:13バイナリファイルは読み込むとまずいのでしょうか?
バイナリpgmファイルを読み込みたいので1バイトづつで調度いいと思ったのですが他の関数にしたほうがいいのでしょうか?
winXP VC++6.0です
0196デフォルトの名無しさん
2005/11/07(月) 17:14:29バイナリモードで開いたか?
0197デフォルトの名無しさん
2005/11/08(火) 15:44:00してくれるクラスとしてくれないクラスがあり、どっちか分からないです。
してくれないクラスは、全て0xcdcdcdcdで埋まっています。
VCの初期化していない状態だったはずですが、ならば0で初期化されているクラスはどうしてされているのか謎です。
コンストラクタでZeroMemory(this, sizeof(クラス))したら一応通りましたが、どうも危険な気がしています。
classをnewで確保する場合、どう0に初期化するのが適切なのでしょうか?
ご教授よろしくお願いします
0198デフォルトの名無しさん
2005/11/08(火) 15:53:150199デフォルトの名無しさん
2005/11/08(火) 16:03:360200デフォルトの名無しさん
2005/11/08(火) 18:58:14そうすればどこでnewしても安心だし。
ZeroMemoryとかmemsetとかはヤバいって話を聞くな・・
0201デフォルトの名無しさん
2005/11/08(火) 19:19:55>>199
使わないのが当然。
0202デフォルトの名無しさん
2005/11/09(水) 07:31:080203デフォルトの名無しさん
2005/11/09(水) 13:52:090204デフォルトの名無しさん
2005/11/09(水) 13:56:200205197
2005/11/09(水) 14:20:29ZeroMemoryは止めました。
初期化しないと明らかにバグるものやポインタだけ初期化することにしました。
さすがに全部のメンバはやってられないです。
初期化していないとどうも気持ち悪いんですが、C++はそういうもんだと思っておきます。
0206デフォルトの名無しさん
2005/11/09(水) 14:47:08初期化してないとどうも気持ち悪いのは当然。
その感覚を欺いてはいけない。
方法(ZeroMemoryやmemsetで初期化すること)が間違っているだけ。
正しい方法はコンストラクタで
Class::Class()
: m_IntegralMember(0)
, m_FloatingPointMember(0.0)
, m_pObject(NULL)
{
}
このように初期化リストで逐一指定すること。
これがC++の作法であり流儀。
0207デフォルトの名無しさん
2005/11/09(水) 15:02:47俺イコールで代入してた
0208デフォルトの名無しさん
2005/11/09(水) 17:25:220209デフォルトの名無しさん
2005/11/09(水) 18:03:22コンストラクタ内部でイコールで代入すると
はデフォルトコンストラクタが走ってから
さらに代入演算子が走るから効率が良くない悪寒
POD型なら最適化で変わらないかもしれないけど
0210デフォルトの名無しさん
2005/11/10(木) 04:43:51仮令Cであっても0で埋めるのはナンセンス。
折角コンパイラがゴミ値を埋めてくれるのを邪魔してデバッグを却って困難にしかねない。
過去に私の周囲でバッファオーバランのバグを生み出した香具師に限って0埋めの習慣があったくらいだ。
0211デフォルトの名無しさん
2005/11/10(木) 16:53:20その方法で初期化で例外発生したやつを捕捉したい場合どうするんですか?
0212デフォルトの名無しさん
2005/11/10(木) 16:55:240213デフォルトの名無しさん
2005/11/10(木) 16:56:03単にクラスが巨大過ぎじゃ無いのか?
0214デフォルトの名無しさん
2005/11/10(木) 16:59:310215デフォルトの名無しさん
2005/11/10(木) 17:23:26A::A()
try
: mem(0)
{
}
catch(...)
{
throw something;
}
キャッチした例外を握りつぶそうとすると自動的に再投されるので注意。
0216デフォルトの名無しさん
2005/11/10(木) 17:30:040217デフォルトの名無しさん
2005/11/10(木) 17:39:56これやるぐらいならメンバにRAIIを徹底するか、例外安全なコンストラクタを持った
基底クラスの初期化に分割した方が良い気はするけれど。
0218デフォルトの名無しさん
2005/11/10(木) 17:40:22使わないなあ。
0219デフォルトの名無しさん
2005/11/10(木) 17:45:08クラスメンバのうち、0初期化したいメンバだけprivateな構造体にまとめれば、
コンストラクタの初期化ではその構造体をまとめて初期化できるようになる。
こんな感じ。
class hoge
{
public:
hoge() : data(), w(1)
{
}
private:
struct Data
{
int x, y, z;
};
Data data;
int w;
};
ほかにもboost::value_initializedなんて手もあるな。
0220デフォルトの名無しさん
2005/11/10(木) 19:59:13初期化で例外投げなきゃならない設計が糞。
さすがは掃き溜め。
0221デフォルトの名無しさん
2005/11/10(木) 20:31:27たとえば初期化でnewするときにはどうする?
std::nothrowを指定するとしても、そいつがヌルを返してきたらどうする?
0222デフォルトの名無しさん
2005/11/10(木) 20:57:26>>217
0223デフォルトの名無しさん
2005/11/11(金) 01:20:31例外なんかがまともに動作するのかねえ
0224デフォルトの名無しさん
2005/11/12(土) 11:19:15RAII って知ってる?
>>223
例外処理自体は追加でメモリを必要としないから大丈夫。
例外オブジェクトを保持するメモリが必要となるかもしれないが、
std::bad_alloc のインスタンスを静的に持つような実装も考えられる。
0225デフォルトの名無しさん
2005/11/12(土) 11:39:12知ってる。それが何か?
0226デフォルトの名無しさん
2005/11/12(土) 12:06:55ということはつまり、リソースの要求処理が失敗したときに例外を投げるのも設計が糞だと?
0227デフォルトの名無しさん
2005/11/12(土) 12:39:02コンストラクタの例外リークは面倒だぞ?
0228デフォルトの名無しさん
2005/11/12(土) 12:41:09はて?思い当たらないが、どんなところが面倒になるの?
0229デフォルトの名無しさん
2005/11/12(土) 13:12:58エラー コードを返したり、グローバル変数の設定したりすることと
同レベルだと思ってはいけません。例外は、それを取り巻くコードの
構造と意味を、根底から覆します。例外は、プログラムの実行時
セマンティックを一時的に繋ぎ変え、通常実行しているコードを迂回し、
こういう状況でなければ決して実行されないコードを動作させます。
例外は、エラー状態を認知させ、プログラムの死という罰則を用いて
その状態を改めようとします。
このように、例外には単純なエラー処理を超えた特性があります。
これらの特性を必要としない、理解しない、あるいは文書化したく
ないなら、例外をスローしてはいけません。
例外以外のエラー処理技法を探してください。
0230デフォルトの名無しさん
2005/11/12(土) 13:25:580231デフォルトの名無しさん
2005/11/12(土) 13:54:37本当に思い当たらないの?
0232デフォルトの名無しさん
2005/11/13(日) 06:13:04「コンストラクタの例外リーク」って何?
単純にコンストラクタから例外が飛んでくるだけなら、>>228
0233デフォルトの名無しさん
2005/11/15(火) 18:29:06「コンストラクタ内での初期化」の話になっているのは
ここがはきだめだからでしょうか?
0234デフォルトの名無しさん
2005/11/17(木) 00:26:090235デフォルトの名無しさん
2005/11/21(月) 00:28:05専用ソフトで作ると滑らかなのに
一応こんな感じで16bitで作ってるつもりなんだが
for(dwCount)
dwWave = (short)(100*sin(2*PI*100*dwCount/SamplingRate));
// PI = 2*atan(1)
0236デフォルトの名無しさん
2005/11/21(月) 00:51:320237デフォルトの名無しさん
2005/11/21(月) 00:55:18こっちへの書き込みだけヴォケましたプログラム上は4*atan(1)でした
0238デフォルトの名無しさん
2005/11/21(月) 01:03:5616ビット帯域から見ると振幅が非常に狭いし分解能も悪くなるわけだが。
#音として歪むかどうかまでは知らん。
0239デフォルトの名無しさん
2005/11/21(月) 01:30:07つか*2しただけでピークピーク値が500くらいって何だよこれ(;'A`)
0240デフォルトの名無しさん
2005/11/21(月) 07:31:270241デフォルトの名無しさん
2005/11/21(月) 12:26:06おまいらサンクスコ
0242デフォルトの名無しさん
2005/11/21(月) 12:56:46おいこら、PI = 4 * atan(1)って書いてあるから当然にdoubleになっていると思ったじゃねぇか。
0243デフォルトの名無しさん
2005/11/21(月) 12:56:560244243
2005/11/21(月) 12:57:310245デフォルトの名無しさん
2005/11/21(月) 13:08:56案外あたっているかも知らん。
0246デフォルトの名無しさん
2005/12/07(水) 22:04:39今調べた限りだと、メンバ関数ポインタ?のようなのを使うのかな?
もしくは使うべきじゃないのかな?
こうやるのがスマートみたいなのがあれば、教えて下さいー。
0247246
2005/12/07(水) 22:05:480248デフォルトの名無しさん
2005/12/07(水) 22:06:24メンバ関数ならメンバ関数ポインタを使う
そうでないなら関数ポインタを使う
0249デフォルトの名無しさん
2005/12/22(木) 12:28:39CADなどに図で出力することはできますか?
0250デフォルトの名無しさん
2005/12/22(木) 12:43:56出来ますよ。そう作れば。
0251249
2005/12/22(木) 12:54:21図々しいですがもしご存知でしたら
詳しいサイトなど教えて頂けませんでしょうか?
0252デフォルトの名無しさん
2005/12/22(木) 12:57:19CADじゃないけど、出力をExcelでグラフにするのはよくやってますよ。
ファイルにCSV形式で出力して、後はExcel側で読んでグラフにするだけ。
0253249
2005/12/22(木) 13:05:49今回は構造物の変形を条件を変えてCADで見たかったんですが
それも便利ですね、勉強してみます。
0254デフォルトの名無しさん
2005/12/22(木) 15:46:57char (*a)[5]={"ああああ","いいいい","うううう"};
2)
char (*a)[9]={"ああああ","いいいい","うううう"};
3)
char *a[]={"ああああ","いいいい","うううう"};
4)
char a[5][9]={"ああああ","いいいい","うううう"};
5)
char *a[3]={"ああああ","いいいい","うううう"};
6)
char *a[9]={"ああああ","いいいい","うううう"};
上の中から同じものを選べ
0255デフォルトの名無しさん
2005/12/22(木) 17:57:22しかし、文字列リテラルはconst char *で参照するべきだ。
0256教えてください
2005/12/23(金) 07:46:28Q2 山は死にますか?
Q3 風はどうですか?
Q4 空もそうですか?
0257デフォルトの名無しさん
2005/12/23(金) 08:18:44それだけは間違いない
0258教えてください
2005/12/23(金) 08:53:490259デフォルトの名無しさん
2005/12/23(金) 09:00:46厳密に言語仕様だけで考えると、ポインタにアドレス値が格納されているとは限らない。
アドレスが格納されているとしても、「有効な値」とは何かを定義しないとわからない。
0260訓えてください
2005/12/23(金) 09:11:52当然、初期化されていない場合などは値は不定だったりするわけですが、
少なくとも(明示的に割り当てが行われて結果かどうかは不問として)
参照可能な領域(ユーザー空間)を指しているかどうかを調べたいのです。
0261デフォルトの名無しさん
2005/12/23(金) 09:13:58じゃぁ OS に訊け。
0262訓えてください
2005/12/23(金) 09:36:59システム情報を調べてチェックを行うようにしました。
ありがとうございました。
0263デフォルトの名無しさん
2005/12/23(金) 17:21:17struct 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 が代入されている…
のもなんですが、そもそもどうしてアクセスが出来るのかわからなくなりました
0264デフォルトの名無しさん
2005/12/23(金) 17:24:29メモリ配置が同じだから。
0265デフォルトの名無しさん
2005/12/23(金) 17:37:17int b;
int c;
};
のようにメモリ配置を変えてみたのにこれはなぜ良いのですか?
0266デフォルトの名無しさん
2005/12/23(金) 17:42:32判ったからマルチすなや。
http://pc8.2ch.net/test/read.cgi/tech/1131691023/868
0267265
2005/12/23(金) 17:46:47まだよくわかんないです 決してネタじゃないです
0268デフォルトの名無しさん
2005/12/23(金) 17:57:09C++のキャスト演算子使う習慣付けた方がいい。
そういうキャストはまずいってすぐにわかるから。
0269デフォルトの名無しさん
2005/12/23(金) 18:05:57レスありがとう!!
reinterpret_cast<struct B*>(pa) これでいいのでしょうか?
まずいのは承知なんですが、どうして代入できるのでしすか? メモリ配置が同じって言っても
struct A の a.a と struct B の b.b 配置されているアドレスは別物じゃないんですか?
0270デフォルトの名無しさん
2005/12/23(金) 18:20:31reinterpret_castを使わないとコンパイルできないだろ。
これを使うという事は、何が起きても自己責任で、という意味だ。
上のプログラムがたまたま動くのを理解するには、ポインタの知識が
あればよい。従って、ポインタを勉強しなおしましょう。
0271デフォルトの名無しさん
2005/12/23(金) 19:31:42>>269は今まさにその「ポインタの勉強」をしてるんだと思うが。
0272266
2005/12/23(金) 21:40:37要は、無理矢理キャスト(reinterpret_cast)したと言うことは違うものを同じモノと見做すことになる。
詰まり、そういう結果になることが予測つかないのならやるな、ということだ。
0273266
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
0274263
2005/12/23(金) 22:33:57なんか皆様の大変な怒りを買ったみたいで申し訳ありません。
「スミマセン」「申し訳ありません」としか書きようがなくこれでスレ消費するのも
結構考え物だと思ったりする訳です。
マルチしてしまった事も自分なりに考えがあっての事です。
初めは 【初心者歓迎】C/C++室 Ver.24【環境依存OK】 で書き込みしたのですが、
レベルが低すぎたと思い はきだめC/C++下級者の質問箱 に移行。
それから、やっぱり低レベルな(アセンブリ的?)話だろうと思ったから
C言語なら俺に聞け! Part 119 に移動しただけです。
質問を微妙に変えたのにだって、単なるコピペじゃそれこそ馬鹿にしてるみたいで失礼じゃないですか。
「ありがとう」とレスしたい所だったのですが、それだって同じ言葉の繰り返しで結構考えたりするんですよ(;д;)
気に障った方々すみません。
初心者だから鬱陶しいのは重々理解しております。けれど、自分みたいな馬鹿は誰かの助けを借りないと先にも進めなかったり
するんですよ。
教えてくれる人も周りに居ず、ぶっちゃけここぐらいしか頼るとこがなくて一杯一杯なんです。
だから煽って頂くのは別に構わないのです。ただ、恩義に思っていない訳ではないというのをご理解ください。
長々とすみません。今回のマルチポストに関する無礼はこれにてお許しいただきますようお願いします。
0275デフォルトの名無しさん
2005/12/23(金) 22:46:57その3つのスレを、今は初心者スレ、後でC言語スレ、っていう風に巡回している人間の立場を考えてみてください。
現に>266さんは>272を書き込んだ後8.5分後に>273を書き込んだわけで、その間に恐らくC言語スレの派生質問を見たのでしょう。
>266さんじゃなくても例えば初心者スレで最初に書き込みを見つけて、レスをつけたところ全く同じ回答がCスレであったとしたらどう思うと思います?
コピペじゃないことで、「マルチじゃない」と言い逃れをするように見えて、却って失礼と言うものです。
そもそも最初の質問が適切であれば、そこから派生した質問は同じスレで多少スレ違ってきても続けるのは普通です。
それを断りもなく他に行けば、「あんた等の回答には不満だから他に行くよ」と言うようなもんですよ。
どうしてもと言うならそれを両方で一言書いておけばいいだけのことですし。
結局のところ、他人のことを考えているようで自分のことしか考えてないあなたに問題があるのでしょう。
#なんてC言語スレで書いたら荒れそうだけどw
0276デフォルトの名無しさん
2005/12/23(金) 22:57:340277デフォルトの名無しさん
2005/12/23(金) 22:59:49移動する旨一言残してから移動すればいい。
改善する気がありそうなので次から気を付ければいいよ。
と今来た俺が言ってみるテスツ
0278デフォルトの名無しさん
2005/12/23(金) 23:03:23はぁ? マルチした理由がそれ? ふざけんな。
移動するのなら最低でも移動する趣旨を書いてからにしろ。
お前の問題を何人にも解かして人的リソースの無駄遣いをさせるな。
初心者だから鬱陶しい?
初心者を言い訳にするな。初心者でも態度がまともなら問題ない。
てめぇの勘違いした行動が最低なだけなんじゃボケ。
# 煽って頂くのは別に構わないらしいので煽ってみる
0279デフォルトの名無しさん
2005/12/24(土) 12:02:070280デフォルトの名無しさん
2005/12/24(土) 12:30:070281デフォルトの名無しさん
2005/12/24(土) 15:32:300282デフォルトの名無しさん
2005/12/27(火) 03:48:02...;
...;
});
これに対するcppの動作って規格で保障されてますか?
0283デフォルトの名無しさん
2005/12/27(火) 11:17:21その文のなかに裸のコンマ(ふつうは逐次演算子)がなければ大丈夫。
0284デフォルトの名無しさん
2005/12/27(火) 19:09:44ありがとうございます。
0285デフォルトの名無しさん
2005/12/29(木) 01:23:22CじゃなくC++で
0286デフォルトの名無しさん
2005/12/29(木) 04:36:200287デフォルトの名無しさん
2005/12/29(木) 06:00:42MFCが知りたいって事?
0288デフォルトの名無しさん
2005/12/29(木) 06:01:31そもそも、C++はほぼCの上位互換だし。
0289デフォルトの名無しさん
2005/12/29(木) 08:47:180290デフォルトの名無しさん
2005/12/29(木) 09:42:26まずC++だけを勉強しろ。
次にWindowsプログラミングだけ勉強しろ。
最後にその2つの知識を応用してC++でWindowsプログラミングをしろ。Windows関連のクラスライブラリの勉強も良かろう。
0291デフォルトの名無しさん
2005/12/30(金) 01:43:400292デフォルトの名無しさん
2005/12/30(金) 02:24:340293デフォルトの名無しさん
2005/12/30(金) 02:26:260294デフォルトの名無しさん
2005/12/30(金) 02:27:220295デフォルトの名無しさん
2005/12/30(金) 02:40:33VC++2005がフリーで使えるから、出来るんじゃない?
0296デフォルトの名無しさん
2005/12/30(金) 03:02:22いいえ、MFC と ATL は Visual C++ 2005 Express Edition には含まれません。MFC と ATL は、その他のすべての Visual Studio 2005 エディションに含まれる予定です。
(´・ω・`)
0297デフォルトの名無しさん
2005/12/30(金) 07:40:23具体的に言いますと、多重継承とか名前空間を使えなくするシステムです。
宜しくお願いします。
0298魚チョコ
2005/12/30(金) 08:26:190299デフォルトの名無しさん
2005/12/30(金) 09:44:48仮想関数も禁止というのはどうでしょう?
0300デフォルトの名無しさん
2005/12/30(金) 10:10:56名前宇宙。
まぁ、名付き宣言場所とか?
0301デフォルトの名無しさん
2005/12/30(金) 10:19:30なぜそのような制限が必要?
逆に言えば多重継承や名前空間はC++にとって必要だったからC++に導入されたのだ。
それを制限するというからには何か深いわけがあるはずだ。
0302デフォルトの名無しさん
2005/12/30(金) 10:21:23C++ をシンプルにというコンセプトだから、名前も思い切って++とかを取って
C とか名付けると良いでしょう。
0303魚チョコ
2005/12/30(金) 13:14:530304デフォルトの名無しさん
2005/12/30(金) 13:34:240305デフォルトの名無しさん
2005/12/30(金) 13:51:51namespace 名前空間
になんか違和感あるかな?
至極無難な訳語だと思うけど。
0306デフォルトの名無しさん
2005/12/30(金) 16:05:470307デフォルトの名無しさん
2005/12/30(金) 16:14:080308デフォルトの名無しさん
2005/12/30(金) 17:47:10組み込み用のC++ってそういう感じの規格だよ
0309デフォルトの名無しさん
2005/12/30(金) 18:36:240310デフォルトの名無しさん
2005/12/30(金) 20:32:28〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ <こいつは最高に アホ
彡、 |∪| /
/ __ ヽノ /
(___) /
0311魚チョコ
2005/12/30(金) 21:57:46いや……だから……英語で space つったら隙間(0x20)
や広がり(宇宙)みたいな意味を含むんだろうけど、
日本語で空間つったら、明らかに3次元の含意。
「単語と単語の間に空間を空ける」
とはゆわないもん。名前が3次元に配置されてもなあ。
0312デフォルトの名無しさん
2005/12/30(金) 22:58:020313デフォルトの名無しさん
2005/12/30(金) 23:04:530314デフォルトの名無しさん
2005/12/30(金) 23:05:500315デフォルトの名無しさん
2005/12/31(土) 05:04:030316デフォルトの名無しさん
2005/12/31(土) 08:15:260317デフォルトの名無しさん
2005/12/31(土) 10:51:39むしろ関数のほうがワケワカメ。あと引数も。添え字ももうちょっとなんとかなりそうだ。
0318デフォルトの名無しさん
2005/12/31(土) 13:08:200319デフォルトの名無しさん
2005/12/31(土) 13:09:49添え字以外は、C/C++ができるよりもずっと前に数学用語でそう訳されたものなのだから、
その是非をC/C++のスレで論ずるのはどうかと思う。
数学の訳語を流用するなという話ならともかくだけど。
0320デフォルトの名無しさん
2005/12/31(土) 13:23:53スレタイどおりだw
0322名前空間 魚チョコ;
2005/12/31(土) 15:32:15でもまあ名前は順列組合せなので一次元だし、メモリーもアドレスも一次元だし、
単に名簿でよかったじゃん ミノд ; ミ シクッ
0324デフォルトの名無しさん
2005/12/31(土) 19:00:560325デフォルトの名無しさん
2006/01/01(日) 10:05:440326デフォルトの名無しさん
2006/01/01(日) 23:34:10慣れの問題。
0327デフォルトの名無しさん
2006/01/02(月) 00:03:400328デフォルトの名無しさん
2006/01/24(火) 00:25:29きちんとインライン展開されますか?
つまり
class Foo
{
private:
int value
...
public
int GetValue(){return value; }
};
という風にクラスFooを定義した場合
GetValueはインライン展開されるのかどうか、ということです
0329デフォルトの名無しさん
2006/01/24(火) 00:50:24インライン関数はその呼び出しのコストを出来るだけ抑える努力をする関数ってだけだし。
0330デフォルトの名無しさん
2006/01/24(火) 00:56:14コンパイラにもよるが、最適化を一切しない設定の場合は一切インライン展開しないか、
インライン版と関数版の両方のコードを含む。
0331デフォルトの名無しさん
2006/01/24(火) 03:09:37レスさんくすです
つまり処理系と最適化オプションによる、というわけですか
作られる関数郡はあまり頻繁に用いられるものではないですが
1行、2行のものはできるだけインラインにしたいなと思いまして
0332デフォルトの名無しさん
2006/01/24(火) 23:31:300333デフォルトの名無しさん
2006/01/25(水) 00:05:50「普通」とか、自分にしか通じない基準を論拠にするものではない。
0334デフォルトの名無しさん
2006/01/25(水) 00:40:25「普通はインライン展開される」と信じる。
じゃないの。
0335デフォルトの名無しさん
2006/01/25(水) 00:47:440336デフォルトの名無しさん
2006/01/26(木) 00:40:56#include<stdio.h>
main(){
long double x;
x=pow(900,2);
printf("%le",x);
return 0;
}
これ実行すると-1.052249e+28とかいうわけのわからない値がでてくるんだけど
なんでかわかる人います?borland c++ 5.5使ってます
0337デフォルトの名無しさん
2006/01/26(木) 01:03:50bccはlong doubleは%Leでいけるのかな?
0338デフォルトの名無しさん
2006/01/26(木) 02:08:18できました。ありがとう。
%leはdoubleなんですね
0339デフォルトの名無しさん
2006/01/26(木) 02:10:59「unsigned char」ってどんな役割を果たすんでしょうか?
0340デフォルトの名無しさん
2006/01/26(木) 02:12:210341デフォルトの名無しさん
2006/01/26(木) 02:44:55%fもdouble。
というより、printfを呼び出すときに
引数のfloatをdoubleに暗黙的に変換するので、
float用のフォーマットは無い。
ただ、scanfでは%fがfloat、%lfがdoubleなので、
うっかり、printfでもdoubleを使うときに%lfを使う人が続出したので
C99で%lfもdoubleになったという経緯がある。
ゆえにC99以前ではprintfで%lfは間違いなので互換性を気にするなら使わないほうが無難
0342デフォルトの名無しさん
2006/01/26(木) 02:53:09char と同じサイズの整数。
char は符号を持つ場合があり、
unsigned char は符号を持たないかわりに
char よりも大きい値が使える場合がある。
0343デフォルトの名無しさん
2006/01/26(木) 09:23:23そこまで説明するならsigned charとの違いも説明せな。
0344デフォルトの名無しさん
2006/01/26(木) 09:43:59>339 へのレスなんだから、これでいいだろ。
0345デフォルトの名無しさん
2006/01/26(木) 09:47:00この辺りが微妙。
0346デフォルトの名無しさん
2006/01/26(木) 13:03:59文句があるんだったら黙って補足すればいいのにw
0347デフォルトの名無しさん
2006/01/26(木) 15:02:54詳しく訊きたいなら素直に訊けばいいのにw
0348デフォルトの名無しさん
2006/01/26(木) 15:40:58実質整数みたいなもんじゃん中身
0349デフォルトの名無しさん
2006/01/27(金) 01:00:520350デフォルトの名無しさん
2006/01/27(金) 07:54:030351デフォルトの名無しさん
2006/01/27(金) 08:00:010352デフォルトの名無しさん
2006/01/28(土) 03:16:28char c = 0x80;
unsigned char c = 0x80;
前者は警告が出るが後者は出ない。
0353デフォルトの名無しさん
2006/01/28(土) 03:20:420354デフォルトの名無しさん
2006/01/29(日) 11:55:16特定のファイルがあるかどうか調べるにはどうすればいいのでしょうか?
今は、fopenでそのファイルを開き、NULLが返ってくるかどうかで判別しているのですが、
あまりスマートなやり方で無い気もします。
もし他に良い方法があれば教えてください。
0355デフォルトの名無しさん
2006/01/29(日) 12:03:57裏表あるって意味でsignedのがツンデレっぽいなw
どうでもいいか
0356デフォルトの名無しさん
2006/01/29(日) 12:04:28俺もそうやる
他の方法しらない
0357デフォルトの名無しさん
2006/01/29(日) 14:18:22Windowsっていう縛りがあっていいならAPI呼び出し。
Windows95でIE3以前だとDLLは入っていない。
#include <shlwapi.h>
BOOL PathFileExists(LPCTSTR Path);
0358デフォルトの名無しさん
2006/01/29(日) 18:03:28大抵の環境で使えるという程度の互換性でいいのなら、stat()でいいと思う。
fopen(..., "r")は、ファイルの存在検査ではなくファイルの可読性の検査になるということに注意。
つまり、unixなどでは存在するのに読めないファイルに対してどうするべきか検討する必要がある。
大抵は「読める」≒「在る」だろうけれど、「なかったら作る」という状況ではそれは拙いかも知れない。
0359デフォルトの名無しさん
2006/01/29(日) 23:22:49char c = '\x80';で問題ない。
もっと言えばchar型が9ビット以上あれば0x80でも警告は出ないだろう。
0360魚チョコ
2006/01/30(月) 00:09:52struct stat 作るのまんどくさいので fopen(">>358","r") でよさげ。
読めないけど書きこめるへんなファイルなんてこわしちゃってよさげ。
>>359
バイトが 8 ビットでないかもしれないなんて考えないでよさげ。
0361デフォルトの名無しさん
2006/01/30(月) 00:15:23>読めないけど書きこめるへんなファイルなんてこわしちゃってよさげ。
読めも書けもしないファイルかも知れず。
つーか、他人が読み書きできないだけでそのファイルのオーナには読めるかもしれないわけで。
#もしかして、シングルユーザな環境しかご存知ない?
0362デフォルトの名無しさん
2006/01/30(月) 00:37:270363魚チョコ
2006/01/30(月) 01:00:06>>360 は、>>358 の結部「『なかったら作る』という状況」を受けてるので、
「読めも書けもしないファイル」があったら、
"r" でエラー → 無さげと判定 → "w" でエラー → あら実はあったのね
"w" でえららなかったらあぼうんでよさげ。
0364デフォルトの名無しさん
2006/01/30(月) 08:22:20wprintfをつかったら出力はどこに表示されるの?
0365デフォルトの名無しさん
2006/01/30(月) 08:31:390366デフォルトの名無しさん
2006/01/30(月) 13:19:48とかいうスレをマ板辺りに勃てたくなってきた。
0367デフォルトの名無しさん
2006/01/30(月) 13:28:59俺は『どうして〜〜なぜ』
という明らかに変な日本語を書く>>1の方がたぶん莫迦、と真っ先にレスするな
0368デフォルトの名無しさん
2006/01/30(月) 15:00:39> 特定のファイルがあるかどうか調べる
access()
0369デフォルトの名無しさん
2006/01/30(月) 17:13:11ちなみにもしもwsprintfのことなら、それはCのsprintfと同じで文字列に書き出される。
0370デフォルトの名無しさん
2006/01/30(月) 17:48:13それとも、いちいちループ終了判定の度にend()呼び出しても変わりませんか?
0371デフォルトの名無しさん
2006/01/30(月) 17:53:55for_each()の方がよくないか?
0372デフォルトの名無しさん
2006/01/30(月) 17:58:40超初心者ってことは、「通常の状態では黒っぽい窓に出力される」とか答えたほうがいいかもしれない。
黒っぽいものが表示されなかったら、標準出力がファイルとか別のところに割り当てられている。
黒っぽいものが表示されて、すぐ消えるんだったら、正常。
間に合わせでよければ、次の方法。
wprintfの次の行に、getc(stdin);とでも書いておけば、Enterキー押されるまでは表示されつづけるよ。
0373デフォルトの名無しさん
2006/01/30(月) 18:09:17第二引数がintだったりcharだったりetc etc...
不思議でならない
0374デフォルトの名無しさん
2006/01/30(月) 18:23:380375デフォルトの名無しさん
2006/01/30(月) 19:15:58後引数の数が違っても平気なのもスゴいと思う
0376デフォルトの名無しさん
2006/01/30(月) 19:18:45%dとかの書式指定を当てにしている。
だから書式指定と違う型を引数にするとまずいことになる。
(たまたまうまくいってしまうことも多いが)
0377デフォルトの名無しさん
2006/01/30(月) 19:21:40stdarg.hを調べると良いと思う。
0378デフォルトの名無しさん
2006/01/30(月) 19:50:53速度が気になるなら実測しろ。
0379デフォルトの名無しさん
2006/01/30(月) 19:52:57そーなんだ…
そういえば間違えてセグメンテーション違反とか言われた事あるなぁ…
>>377
すげぇ、ちょっと感動した そーなのかー
0380デフォルトの名無しさん
2006/02/02(木) 04:17:160381デフォルトの名無しさん
2006/02/02(木) 09:32:47ttp://pc8.2ch.net/test/read.cgi/tech/1084676298/459
0382デフォルトの名無しさん
2006/02/02(木) 17:20:560383デフォルトの名無しさん
2006/02/02(木) 17:32:20配列の名前をAとすると
sizeof(A)/sizeof(A[0])
但しAがポインタの時には上手く動作しないので注意
0384デフォルトの名無しさん
2006/02/02(木) 17:32:44それが配列である限り、静的に個数を求めることはできる。
但し、関数に配列を(配列としてそのまま)渡すことはできない点に注意。
以下にサンプルをもって説明とする。
int chs[] = {1, 3, 4, 6, 8, 10, 12,};
printf("東京で見られるVHF TV局数は%d。\n", sizeof(chs) / sizeof(* chs));
0385デフォルトの名無しさん
2006/02/02(木) 17:40:23丁寧にありがとうprintfとかの使い方は大丈夫です
>>383
どうもそれで動かないなぁと思ったらポインタのせいでした・・・
他の変数に数を代入します。
0386デフォルトの名無しさん
2006/02/02(木) 18:02:07sizeofはsize_t型だろうから、%dではなく%uで受けるべきだろうな。
>>385
C++なら要素数を返すテンプレート関数を作ることができるよ。
template<typename T, std::size_t N> static inline std::size_t numberof(T (&)[N]) {return N;}
0387デフォルトの名無しさん
2006/02/02(木) 18:21:14別に%dでも%uでもよくね?
0388デフォルトの名無しさん
2006/02/02(木) 18:52:23unsignedにキャストして%uで受けるべき。
0389388
2006/02/02(木) 18:53:230390デフォルトの名無しさん
2006/02/02(木) 18:59:450391デフォルトの名無しさん
2006/02/02(木) 19:56:060392デフォルトの名無しさん
2006/02/02(木) 20:17:24できるもんなんですか?
自分が見てる本の例題のソース書くと糞長くなるので書かないですが
「ここで、構造体のメンバでポインタ使って、つぎに構造体のメンバの
構造体の構造体ポインタ変数にこれを代入して、次のポインタ・・・・」って、
ソースを読むとなんとなくわかるけど、結局俺は、40%くらいしか理解できてないだろうから
100%理解できてないなら、理解度0%だろうと思ってるし・・・
やっぱ、数ある良い例題プログラムを覚えても理解できてないなら、暗記しただけだし
ああ、わかんねぇ・・・
入門書の次に読めばさらに理解度が深まる本はないですかね
0393デフォルトの名無しさん
2006/02/02(木) 20:27:200394デフォルトの名無しさん
2006/02/02(木) 20:30:09最早C++ならいちいちそんなことを意識する必要がないので、ずっと気楽だがな。
0395デフォルトの名無しさん
2006/02/02(木) 20:40:24最初は分からないでいいよ
ざっと読むだけじゃなくてここはどうしてこんなことしてるのかな?とか考えながら読んでいけばそのうち分かってる
入門書の次はそういうテクニックを網羅してるアルゴリズム本がおすすめ
0396デフォルトの名無しさん
2006/02/02(木) 21:19:56intとlongだって64bitあるかもしれない。
0397デフォルトの名無しさん
2006/02/02(木) 22:24:580398392
2006/02/02(木) 23:48:59ありがとう。
はげまされて、うれしくなっちゃった。
精進します。
0399デフォルトの名無しさん
2006/02/03(金) 01:08:25もう腐ってるよ
0400デフォルトの名無しさん
2006/02/03(金) 01:13:170401デフォルトの名無しさん
2006/02/03(金) 10:08:28linuxで、フォルダ内のファイルを次々に読み込む、というプログラムを作りたいのですが、
どのようにすれば良いでしょうか?
0402デフォルトの名無しさん
2006/02/03(金) 19:49:120403デフォルトの名無しさん
2006/02/03(金) 22:01:58正確な定義
char<short<=int<=long
0404デフォルトの名無しさん
2006/02/03(金) 22:17:470405404
2006/02/03(金) 22:19:530406デフォルトの名無しさん
2006/02/03(金) 22:44:03boost::filesystem::directory_iterator
0407デフォルトの名無しさん
2006/02/03(金) 23:29:53C言語を勉強し始めたばかりの下級者です
質問なのですが
whileの終了条件をbreakで決めた場合、そのwhile構文の中身をN回繰り返すにはどうしたらいいのでしょうか?
forやwhileを↑のwhile文の外につけてみてもN回繰り返すプログラムが出来てないみたいなんです。
説明ベタでごめんなさい、お願いしますm(_ _)m
0408デフォルトの名無しさん
2006/02/03(金) 23:33:01while(1){//無限ループ
if(n>=5)break;//nが5以上になればbreak
n++;//n加算
}
5回繰り返す
0409デフォルトの名無しさん
2006/02/03(金) 23:46:48説明が不十分でした・・・
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;
}
}
0410デフォルトの名無しさん
2006/02/03(金) 23:48:350411デフォルトの名無しさん
2006/02/03(金) 23:53:17えと・・・聞くのが恐いんですが・・・私何かとてつもなくおトンチンカンなことしてますでしょうか・・・?
0412デフォルトの名無しさん
2006/02/04(土) 00:00:39これだけ考えて答えるけど
while(1){
if(j==30)break;
while(1){
if(n==20)break;
n++;
}
j++;
}
外のwhile文で中の20回繰り返すwhile文を30回呼び出してる
回数指定→for
条件に達するまで→whileと使い分けた方がいい
0413デフォルトの名無しさん
2006/02/04(土) 00:15:39久々に激アツなコード見た。
0414デフォルトの名無しさん
2006/02/04(土) 00:25:58ありがとうございます!
breakは適用されると下に行くんですね。だから下に「j++;」を入れるのですか。
すごいすっきりしました。ありがとうございます。
余談ですが、教えていただいた通り直しても、なぜかプログラムが思うような結果にならず泣きそうになりました・・・
きっとどこか違うとこがあるのだと思うので、頑張ってやってみます。
お世話になりましたm(_ _)m
0415デフォルトの名無しさん
2006/02/04(土) 00:31:58ヒント2:x==20の条件を満たしたからwhile()ループを抜けているわけではない
0416デフォルトの名無しさん
2006/02/04(土) 00:34:49ごめんnを0にするの忘れてた
while(1){
if(j==30)break;
n=0;//0にする
while(1){
if(n==20)break;
n++;
}
j++;
}
0417デフォルトの名無しさん
2006/02/04(土) 00:41:25でも以下のコードでオーバーロードした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' : スタティック メンバ関数内の不正なデータ メンバへの参照です」
です。よろしくお願いします。
0418デフォルトの名無しさん
2006/02/04(土) 00:57:18operator newは常にstaticなメンバ関数だから、
非staticなメンバ変数を使うことはできない。
そもそも、メンバにアクセスできたとして、いったいどのインスタンスのメンバにアクセスするつもりなんだ。
0419デフォルトの名無しさん
2006/02/04(土) 01:02:06どういう理解をしてると、CTest::operator new()のcount++より
CTest::CTest()のcount = 0の方が先に実行されると思えるのか
あと、どうでもいいけど、値を評価するのでない限り
後置++じゃなくて前置++を書く習慣をつけた方がいいよ。
K&Rの影響で、何でもかんでも後置にする奴がやたら多いんだけど。
0420414
2006/02/04(土) 01:06:25な、なるほど・・・!
内側の変数をbreakが終わった後リセットしないといけないんですね。
これでなんとか様になってきたようで嬉しいです。
でもまだ出来てないみたいなので必死に頑張ってみます。ありがとうございました!
0421デフォルトの名無しさん
2006/02/04(土) 06:14:050422デフォルトの名無しさん
2006/02/04(土) 07:15:370423デフォルトの名無しさん
2006/02/04(土) 08:29:50あらmain()終わってしまったw
0424デフォルトの名無しさん
2006/02/04(土) 09:08:25// ./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;
}
0425デフォルトの名無しさん
2006/02/04(土) 10:23:20424で完璧だけどね、はじめたばかりということで
//素数かどうか判定する関数(素数なら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;
}
0426デフォルトの名無しさん
2006/02/04(土) 14:31:521は素数じゃないよ。だって、1の約数は、自分を含めて1個しかないでしょ?
2は素数。偶数で唯一の素数。
3以上は上のプログラムでOK。どうやったら高速化できるか、工夫してみて下さい。
あと、間違って0以下の数が入力された場合は、どうしたらいいでしょうか?
もちろん、これは、>>421さんへの宿題になります。
ちなみに、1を素数にしちゃうと、素因数分解が何通りもできることになる。6=2*3*1*1*1*1*1
0427デフォルトの名無しさん
2006/02/04(土) 14:47:45424,425ともに2は素数としているがな
0428デフォルトの名無しさん
2006/02/04(土) 14:51:35ただしどっちにしろ、結局1は特別扱いすることになるが。
0429デフォルトの名無しさん
2006/02/04(土) 15:29:310430デフォルトの名無しさん
2006/02/04(土) 15:32:35約数の探索範囲は、2〜nじゃなくて2〜sqrt(n)だよ。
0431デフォルトの名無しさん
2006/02/04(土) 15:54:05424はそうしている。
425はそれを知った上で簡略化のためにn−1まで回しているに過ぎない。
0432426
2006/02/04(土) 17:28:23>>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; //それ以外
}
だったりして。
0433デフォルトの名無しさん
2006/02/04(土) 17:55:400434デフォルトの名無しさん
2006/02/04(土) 18:04:190435デフォルトの名無しさん
2006/02/04(土) 18:08:28(V)(´Д`)(V) ヤダ
0436デフォルトの名無しさん
2006/02/04(土) 18:08:41http://lists.canonical.org/pipermail/kragen-hacks/1999-October/000201.html
0437デフォルトの名無しさん
2006/02/04(土) 18:11:39(V)( ´Д`)(V) ウヒョー
0438デフォルトの名無しさん
2006/02/04(土) 18:19:24なるほど!><
つまり画面に「こんにちは」と出したい時は
class J2ch
{
public static void main(String args[])
{
System.out.println("こんにちは");
}
}
てやればいいんですね!><
0439デフォルトの名無しさん
2006/02/04(土) 18:21:30それは間違っている。
伝統を重んじて"hello, world"を画面に出すことから始めないとうまくいかない。
0440デフォルトの名無しさん
2006/02/04(土) 18:22:110441デフォルトの名無しさん
2006/02/04(土) 18:22:58突っ込みどころはそこではなくてclass名が「J2ch」という変な名前のところだと思うのだがどうか
0442デフォルトの名無しさん
2006/02/04(土) 18:25:40それにManaged C++でもC++/CLIでもクラス内のstatic void mainから始まることはないというのも。
0443デフォルトの名無しさん
2006/02/04(土) 18:25:56いや、きっとたぶん>>438はコレをコピペしてもらいたかったのだろう。
∧ ∧ ちんぽっぽ こないでください
_ (*‘ω‘*) __ _ ( ;><) __
/ ( ( つ┳つノ \ / ( ( つ┳つノ \
/ l ̄ ̄ ̄ ̄ l ヽ / \ ̄ ̄ ̄ / ヽ
| ● ● | | \ / |
| * (_人_) * .| | / \ |
ヽ ノ ヽ ./ \ ノ
〜〜〜 ◎――――――――◎ 〜〜〜 ◎――――――――◎
0444デフォルトの名無しさん
2006/02/04(土) 18:33:280445デフォルトの名無しさん
2006/02/04(土) 18:35:320446デフォルトの名無しさん
2006/02/04(土) 18:37:29>>438
それはJavaじゃあぁぁぁぁぁぁぁぁぁぁぁぁ!!!!!!
0447デフォルトの名無しさん
2006/02/04(土) 18:53:32cト 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
0448デフォルトの名無しさん
2006/02/04(土) 19:23:310449デフォルトの名無しさん
2006/02/04(土) 19:28:38C#じゃなかったのか
0450デフォルトの名無しさん
2006/02/06(月) 07:01:30遅くなりましたけど、ありがとうございました。
0451デフォルトの名無しさん
2006/02/07(火) 15:59:19C と C++の違いってなんですか?
0452デフォルトの名無しさん
2006/02/07(火) 16:17:580453デフォルトの名無しさん
2006/02/07(火) 16:22:15C++→C派生オブジェクト指向プログラミング言語
オブジェクト指向ってのは関数とかデータの部品化
Cでテレビを作るとしたら入力関数、出力関数、表示中データを別々に置かなくてはならないが
C++ならデータや関数を一つの箱に入れてテレビ型の部品として管理できる
テレビとパソコンをつなげばテレビパソコンになる
0454デフォルトの名無しさん
2006/02/07(火) 16:24:28いろいろツッコミたいところだが、
かといって突っ込んでたら本一冊くらいになるのであえて何も言わない俺って凄い
C++:Cの上位、Cと互換性を保ちつつオブジェクト指向を取り入れた様なもの
詳しくは本一冊嫁
0455デフォルトの名無しさん
2006/02/07(火) 16:26:52Cの派生系、templateを用いたgenericsなプログラミングが特徴
あと、大したことではないがオブジェクト指向も出来ないこともない。
0456デフォルトの名無しさん
2006/02/07(火) 16:28:36字が違う
0457デフォルトの名無しさん
2006/02/07(火) 16:47:420458デフォルトの名無しさん
2006/02/07(火) 17:08:47精々Classでまとめて便利〜とか思うだけ
0459デフォルトの名無しさん
2006/02/07(火) 17:12:170460デフォルトの名無しさん
2006/02/07(火) 17:17:50個人的にはalgorithmとか標準のコンテナが存在しないCにはもう戻れなー
0461デフォルトの名無しさん
2006/02/07(火) 17:26:010462デフォルトの名無しさん
2006/02/07(火) 17:26:380463デフォルトの名無しさん
2006/02/07(火) 17:29:120464デフォルトの名無しさん
2006/02/07(火) 17:42:36なんでもかんでも1から作る古き良き時代は終わりました
0465デフォルトの名無しさん
2006/02/07(火) 17:45:05Cだとこの程度の作業も長々と書かないといけないから嫌い。
0466デフォルトの名無しさん
2006/02/07(火) 17:51:000467デフォルトの名無しさん
2006/02/07(火) 17:52:160468デフォルトの名無しさん
2006/02/07(火) 17:56:300469465
2006/02/07(火) 18:03:57(実際にはエラー処理を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;
}
0470デフォルトの名無しさん
2006/02/07(火) 19:20:350471デフォルトの名無しさん
2006/02/07(火) 19:39:480472デフォルトの名無しさん
2006/02/07(火) 20:11:37オペレータをオーバーラップできなきゃなぁ・・・
0473デフォルトの名無しさん
2006/02/07(火) 23:32:170474デフォルトの名無しさん
2006/02/07(火) 23:33:590475デフォルトの名無しさん
2006/02/07(火) 23:35:23C++の方がエッチが言語だということは分かるが
0476デフォルトの名無しさん
2006/02/08(水) 20:39:18Mac OS XとかNEXTSTEP関連触れればObjective-Cも出てくるんじゃないか?
0477デフォルトの名無しさん
2006/02/09(木) 18:32:13化粧落とせばただのCじゃんあれ
0478デフォルトの名無しさん
2006/02/10(金) 00:15:23Cの入門書終えたんだけど、次は
独習C++と
Visual C++〈1〉はじめてのWindowsプログラミング
どちらを先に勉強した方がいいのでしょうか?
0479478
2006/02/10(金) 00:17:192Dシューティングゲームみたいなものを。
0480デフォルトの名無しさん
2006/02/10(金) 00:33:30C++のクラスは完全に理解しなくても大丈夫
仮想関数とかフレンド関数とかサッパリ
0481478
2006/02/10(金) 00:40:52独習C++ > はじめてのWindowsプログラミング
の順で取り組んでみようと思います。
0482デフォルトの名無しさん
2006/02/10(金) 00:41:01(純粋)仮想関数はインタフェイス表現するのに必要だよな。
フレンド関数はクラス渡り歩くときに必要・・・か?
0483デフォルトの名無しさん
2006/02/10(金) 07:51:49たまにあって便利だなと思うことはあるけれど。
0484デフォルトの名無しさん
2006/02/11(土) 08:40:260485デフォルトの名無しさん
2006/02/11(土) 15:32:54class Outer
{
class Inner
{
Outer& outer_;
Inner( Outer& outer ) : outer_( outer ){}
};
};
0486デフォルトの名無しさん
2006/02/17(金) 01:05:330487デフォルトの名無しさん
2006/02/17(金) 01:07:11おまえ6日以上前のレスに「そう」は無いだろ・・・
0488デフォルトの名無しさん
2006/02/19(日) 13:23:190489デフォルトの名無しさん
2006/02/19(日) 13:23:550490デフォルトの名無しさん
2006/02/19(日) 18:17:53javaの実装は全部privateなのか
0491デフォルトの名無しさん
2006/02/23(木) 15:03:20Javaの"新"機能は仮想マシンの互換性のためなんだろうけど
プリプロセッサでなんとかしている
0492デフォルトの名無しさん
2006/03/12(日) 01:34:33ダイアログが表示される前に、コマンドライン画面が出現してしまいます。出現しないようにするには
どうすれば良いのでしょうか?
一番上の行にこれいれとけ
#pragma comment(linker,"/SUBSYSTEM:WINDOWS")
0494デフォルトの名無しさん
2006/03/12(日) 10:05:33コマンドラインを出さずに実行できました。
ありがとうございました。
0495デフォルトの名無しさん
2006/03/12(日) 11:06:50関数呼び出すときに、戻り値の型を明示してやらないと駄目ですよね?
0496デフォルトの名無しさん
2006/03/12(日) 11:50:40C++でもそうなんじゃねぇの?
っていうか、適当に関数作って試してみれば良いじゃん
0497デフォルトの名無しさん
2006/03/12(日) 13:19:32C++は型安全性のため暗黙のintは禁止。宣言時には戻り値の型も必要。
0498デフォルトの名無しさん
2006/03/12(日) 14:34:160500495
2006/03/12(日) 15:39:24戻り値を宣言するのは、分かりましたが
関数内で戻り値の変数定義して、値を代入しても
本体(呼び出し側)で定義されていませんとエラーが出ます
あらためて、本体側で再定義してやっても当然の結果ですが
中身はありません。
これって当然の結果なんでしょうか?
0501デフォルトの名無しさん
2006/03/12(日) 15:43:39アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
アドレスとポインタの差なんて、ちゃんと勉強した奴なら誰でも知ってるよ。
http://pc8.2ch.net/test/read.cgi/prog/1140616676/
0502デフォルトの名無しさん
2006/03/12(日) 15:49:00Cの変数にはスコープがある。
それを知っている立場から見ると当然の結果。
0504デフォルトの名無しさん
2006/03/12(日) 16:04:37入力された日付(YYYYMMDD)が正しいかどうかチェックしたいのですが、
チェックする関数が見当たりません。
フォーマットが正しいかどうかなら自分でチェックすればできますが、
カレンダーにない日付もチェックしたいです。(2006/02/30はエラーみたいな)
チェック方法をしっている方おられました教えてやってください。
0505デフォルトの名無しさん
2006/03/12(日) 16:04:37extern で宣言はできる。
だがおそらく必要ではない。もっとマシな方法がある。
0506デフォルトの名無しさん
2006/03/12(日) 16:38:10何か話が噛み合っていないような気がする。
コードを晒してみろ。
0507デフォルトの名無しさん
2006/03/12(日) 19:48:17そうそう
単純な問題っぽいから
ソース出したれ
0508504
2006/03/12(日) 20:11:13ttp://pc8.2ch.net/test/read.cgi/tech/1139931895/
0509デフォルトの名無しさん
2006/03/14(火) 07:33:02デクリメントすればいいじゃないですか!
0510デフォルトの名無しさん
2006/03/14(火) 08:21:26<algorithm>の関数を初めとして、イテレータの操作はインクリメント前提で作られているから。
0511デフォルトの名無しさん
2006/03/14(火) 09:00:58この板で見つけたサンプル。
--
typedef std::string::reverse_iterator riter;
std::string s = "abcdefg";
for ( riter r = s.rbegin(); r != s.rend(); r ++ )
std::cout << * r;
0512デフォルトの名無しさん
2006/03/14(火) 09:32:25std::string s = "abcdefg";
for ( iter r = s.end(); r != s.begin();)
std::cout << *--r;
0513デフォルトの名無しさん
2006/03/14(火) 09:59:44デクリメントで恥ずかしくないですね?
0514デフォルトの名無しさん
2006/03/14(火) 10:18:59恥ずかしい。
0515デフォルトの名無しさん
2006/03/14(火) 11:55:42速度は変わりませんよね?
0516デフォルトの名無しさん
2006/03/14(火) 12:13:230517デフォルトの名無しさん
2006/03/14(火) 17:57:29リバースイテレータがあれば1つの関数で順方向、逆方向の両方に対応できるという利点がある。
お前は要らなくても、そんなに特殊なものでもないから誰か使うやつはいるだろう。
0518デフォルトの名無しさん
2006/03/17(金) 11:29:151週間前の質問で、しかも、スレ違いかどうかかなり微妙な質問だが、自分で書け。
SDKには、普通、そんな気の利いたAPIはない。
自分で書くのは面倒だろうが、難しくはない。
特に、1バイト文字でYYYY/MM/DDと分かっているなら、なおさら。
まあ、最近のWindowsなら、正規表現とか探せばあるかもしれんけど、
日付チェックまでやるなら、複雑になるので、正規表現はあまりおすすめできない。
0519デフォルトの名無しさん
2006/03/18(土) 13:03:54int 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にしようか、
いつも迷ってしょうがないんだけど、どっちにすべき?
0520デフォルトの名無しさん
2006/03/18(土) 14:12:420521デフォルトの名無しさん
2006/03/18(土) 14:40:200522デフォルトの名無しさん
2006/03/18(土) 17:06:54sscanf(p, "%d/%d/%d", &y, &m, &d);
0523http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 18:29:50もしくは64bitにネイティブ対応した置換ソフトないですか?
0524デフォルトの名無しさん
2006/03/18(土) 21:14:39トンクス。
やっぱり、字句解析の視点を入れてコード書かなきゃだめか。
yaccとかlexとか、ちょっと大げさかな…と思うけど、
今度からは、Bのようなコーディングで統一することにします。
sprintfのscanf版があったなんて、今知った。勉強しなきゃ。
>>523
32bitアプリって互換性ないの?
何も考えずに64bit版Windowsなんか買うからw
0525デフォルトの名無しさん
2006/03/18(土) 22:26:4132bitアプリの互換性無かったら、64bit版Windowsなんか買うやついないって。
0526http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/19(日) 03:19:09互換性あるけど、ネイティブ動作しない
0527デフォルトの名無しさん
2006/03/19(日) 06:22:330528デフォルトの名無しさん
2006/03/19(日) 09:54:56(そのCPU内部では32ビットの動作をエミュレートしているんだというのは認めない)
0529524
2006/03/19(日) 16:38:440530デフォルトの名無しさん
2006/03/19(日) 16:41:48m9(^Д^)プギャー
0531デフォルトの名無しさん
2006/03/20(月) 18:02:02puxtu
0532デフォルトの名無しさん
2006/03/24(金) 12:00:31int 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++;
}
0533デフォルトの名無しさん
2006/03/27(月) 02:05:210534デフォルトの名無しさん
2006/03/28(火) 13:33:13p++とi++の場所を交換した方がいいと思う。
0535デフォルトの名無しさん
2006/03/28(火) 13:36:27そうするとロジックが変わるが。
0536デフォルトの名無しさん
2006/03/28(火) 17:57:22このファイルをremove()で削除したいのですが、下記のようにその前にfcloseを呼び出すと、ロックも解除されてしまいます。
fclose(fp);
remove("foo");
fclose(fp)とremove("foo")の間に、ほかのプロセスがこのファイルをロックしてしまうのを防ぎたいのですが、どうしたらよいのでしょうか?
fcloseの前にremoveを呼び出しても問題ないでしょうか?
0537536
2006/03/28(火) 18:02:57ここによると、オープンされているファイルを削除しても問題ないOSもあるとのことですが、
できれば、より汎用性のある方法を使いたいのですが、何かよい方法はないでしょうか?
いったんファイルをロックした後は、ほかのプロセスにロックされないようにして、削除してしまいたい
これがやりたいことです。
0538デフォルトの名無しさん
2006/03/28(火) 18:04:150539デフォルトの名無しさん
2006/03/28(火) 19:39:32F5キーを押すなどのデバッガ付きで実行したり、コマンドプロンプトなどからEXEを直接実行したりすればよい。
0540デフォルトの名無しさん
2006/03/28(火) 21:31:19ファイルロック自体が移植性が低いので、ある程度割り切ってしまっていいと思う。
Unix系なら先にremove()することで完全に他のプロセスの目からファイルを隠せる。
#但し、remove()してからfclose()の間に他のプロセスにファイルを作られてしまう問題はある。
0541デフォルトの名無しさん
2006/03/28(火) 21:58:46今、VisualC++で作っているのですが、プログラムが出来上がってEXEを作った後は表示されないということでいいのでしょうか?
0542デフォルトの名無しさん
2006/03/29(水) 00:33:41そういうこと。
0543デフォルトの名無しさん
2006/03/29(水) 02:52:54ありがとうございました。
0544デフォルトの名無しさん
2006/03/29(水) 14:55:28Enterキーを押すというのは、どういう条件式を作れば良いのでしょうか?
if(end == 'Enter')
{
0545デフォルトの名無しさん
2006/03/29(水) 14:55:59}
ではさすがにだめですよね。
0546デフォルトの名無しさん
2006/03/29(水) 18:01:120547デフォルトの名無しさん
2006/03/29(水) 18:17:220548デフォルトの名無しさん
2006/03/29(水) 18:22:060549デフォルトの名無しさん
2006/03/29(水) 18:24:390550デフォルトの名無しさん
2006/03/30(木) 13:10:060551デフォルトの名無しさん
2006/03/30(木) 13:13:250552デフォルトの名無しさん
2006/03/31(金) 07:25:040553デフォルトの名無しさん
2006/03/31(金) 12:06:590554デフォルトの名無しさん
2006/03/31(金) 14:02:51はきだめでは普通。
0555デフォルトの名無しさん
2006/03/32(土) 14:09:550556デフォルトの名無しさん
2006/04/02(日) 18:48:36>定数式が必要です
>サイズが不明です
>サイズが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 ]; だけなんですが
そもそも変数や引数を添字にして配列を宣言することは不可能なんでしょうか
0557デフォルトの名無しさん
2006/04/02(日) 18:49:39C89では(つまり、VS.NETやVC6では)不可能。
0558デフォルトの名無しさん
2006/04/02(日) 18:55:370559デフォルトの名無しさん
2006/04/02(日) 18:59:080560デフォルトの名無しさん
2006/04/02(日) 18:59:44C++ で std::vector 使え。
0561556
2006/04/03(月) 00:37:44レス返してくれた人、ごめんなさい
0562デフォルトの名無しさん
2006/04/03(月) 00:42:29普通は、別のところでfunc(20)とかfunc(30)とか呼び出される可能性がある。
↓
コンパイラは、<<コンパイルする時に>>配列を何バイト確保していいのか分からないから、
コードに埋め込めない。
↓
<<プログラムを実行する時に>>動的にメモリを確保するためには、
mallocやnew、std::vectorを使えという話になる。
test2やtest3もダメなのか…。test2は、const int var=20;にしたらどうだろ?
0563デフォルトの名無しさん
2006/04/03(月) 00:49:17>const int var=20;
これは確かに動きました。でも
void func( const int arg ){... とか int test1[ (const int)arg ]; あたりは悪あがきの様で、挫折しました
0564562
2006/04/03(月) 00:57:08func(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でもいいけどね。
配列にするのか、リストにするのか、
また、別にデータ構造にするのかの選択は、きちんと目的を持って!!
0565デフォルトの名無しさん
2006/04/03(月) 01:11:410566デフォルトの名無しさん
2006/04/03(月) 03:37:570567デフォルトの名無しさん
2006/04/03(月) 03:46:470568デフォルトの名無しさん
2006/04/03(月) 03:57:180569デフォルトの名無しさん
2006/04/03(月) 04:30:550570デフォルトの名無しさん
2006/04/03(月) 05:35:59PC9821V200s7cです。
0571デフォルトの名無しさん
2006/04/03(月) 05:40:13できればクラス間の依存のない形で実現したいと思っています。
0572デフォルトの名無しさん
2006/04/03(月) 05:49:41どういう目的でどういうクラスの間でどんなデータを共有するかによる
0573デフォルトの名無しさん
2006/04/03(月) 06:15:51目的は自分のためのフレームワークの製作です。
できれば汎用的な形で実現したかったのですが。
うむー。
汎用的なアプリのシステムとOS系のシステムのうまい融合と可読性の維持を当面の目標としています。
0574デフォルトの名無しさん
2006/04/03(月) 08:55:06データの持ち方なんてのはその使われ方に依存するもんだから、
そんな抽象的なことをいったって全く意味が無い。
最も顕著なのはアクセス制限で、たとえば
・任意のクラスに許すか、特定のクラスに許すか。
・任意のインスタンスに許すか、特定のインスタンスに許すか。
・読み込みのみ許すか、書き込みも許すか、その組合せか。
の組合せで適切な方法は変わってくるし、
アクセス頻度の多少やデータのサイズ、データにアクセスできる
期間などによっても変わってくる。
というわけでもっと具体的に言わんと、なんともいえん。
0575デフォルトの名無しさん
2006/04/03(月) 09:35:22あえて釣られてみました。
constは、高速化させるためにあるんじゃねーよ。
高速化ったって、たかが知れてるよw
どうしてもってんなら、100万回ループで実行時間でも計れ。
>>571
本屋逝って「デザインパターン」についての解説書を…ってほどのものじゃねーなw
最初は、テケトーにstatic変数でも使って書いとれ。
あと、friendにして、どちらかに相手側のポインタ持たせるとかな。
または、共有部分だけ別のクラスにして、インスタンスを1つだけ生成させるとかな。
慣れてきたら書き直しゃいーんだよ。
0576デフォルトの名無しさん
2006/04/03(月) 10:00:05ループなんてしなくとも
int main() {
const int a0 = 0;
const int a1 = 1;
// ...
const int a100000 = 100000;
}
みたいなコードは定数畳み込みをするコンパイラでは
コードが全て消えるので、顕著に速度差が出る。
0577デフォルトの名無しさん
2006/04/03(月) 10:11:30const つけて無くても不要変数の削除や定数の畳み込みは効くだろ。
0578デフォルトの名無しさん
2006/04/03(月) 10:49:43環境によって変わる。
0579デフォルトの名無しさん
2006/04/03(月) 11:07:020580デフォルトの名無しさん
2006/04/03(月) 11:18:14main()で表示させていたprintf文を消したのですが、
画面を移動するときに、画面を初期化する方法を教えてください。
環境はANSI Cです。
0581デフォルトの名無しさん
2006/04/03(月) 11:19:12○ main()で表示させていたprintf文を消したいのですが
よろしくお願いします。
0582デフォルトの名無しさん
2006/04/03(月) 11:20:03言語の範囲内にはないだろうな。
環境に合わせてコンソール制御用のライブラリを探すといいよ。
0583デフォルトの名無しさん
2006/04/03(月) 12:31:30めんどくさいからputchar('\r');でも試してみてよ。
0584デフォルトの名無しさん
2006/04/03(月) 12:52:420585デフォルトの名無しさん
2006/04/03(月) 14:08:57for (int i=0;i<100;i++) printf("\n");
clrscr()という関数もあるにはありますが、
DOSやWindowsでしか使えないとか書いてありました。
0586デフォルトの名無しさん
2006/04/03(月) 14:14:53だけど、バックスペースは、 ¥r じゃなくって ¥b
0587デフォルトの名無しさん
2006/04/03(月) 14:25:24人が答えてやってるというのにマルチとはいい度胸だ
http://pc8.2ch.net/test/read.cgi/tech/1142302804/
0588デフォルトの名無しさん
2006/04/03(月) 15:57:350589583
2006/04/03(月) 18:02:010590デフォルトの名無しさん
2006/04/03(月) 23:09:41と
X a = X(1);
って、同じか?
0591デフォルトの名無しさん
2006/04/03(月) 23:29:320592デフォルトの名無しさん
2006/04/04(火) 00:06:46後者は一時オブジェクトが生成されますがな。
0593デフォルトの名無しさん
2006/04/04(火) 00:09:52後者はコピーコンストラクタが使用される。
0594デフォルトの名無しさん
2006/04/04(火) 01:15:020595デフォルトの名無しさん
2006/04/04(火) 01:23:530596デフォルトの名無しさん
2006/04/04(火) 08:08:33ちゃんと空ベクタは代入元と同サイズ確保されてから要素のコピーが行われるのですか?
0597デフォルトの名無しさん
2006/04/04(火) 08:11:23処理の順序は決まってないが、結果は代入元と同じサイズになり、すべての要素がコピーされる。
0598デフォルトの名無しさん
2006/04/04(火) 08:23:16あり^^
0599デフォルトの名無しさん
2006/04/05(水) 16:26:52*words++ = 'a';
こう書いた時の2行目の動作について教えてください。
words++ならば次の要素を指す事になりますが、*words++=なので・・・どうなるのか。
確か++を後ろにつけると後から評価されるのだと思いましたが、
(*words)++='a';として評価される事になり++の効果がアドレス移動ではなくなってしまうのでしょうか?
0600デフォルトの名無しさん
2006/04/05(水) 16:39:01*words++は*(words++)と解釈される。
words++でwordsは次の要素を指すように変更されるけど、
値は変更される前のもの。
それを*で間接参照しているから、このとき参照されるのは、wordsが最初に指していた要素。
それから、その例はコンパイルできないかと。
0602デフォルトの名無しさん
2006/04/07(金) 07:29:00const aaa&
の&ってどういう意味ですか?
例えば、
xref(istream& in,vector<string> find_words(const string&) = split)
という文がある解説本にあるのですが、引数に二つある&の意味が解説されていません。
それと、find_wordsの二つ目の引数は型のタイプだけ指定して変数名を明確にしてませんが良いんでしょうか。
0603602
2006/04/07(金) 07:32:51○find_wordsの引数は
0604デフォルトの名無しさん
2006/04/07(金) 07:41:53その&は参照と言う。
ttp://wisdom.sakura.ne.jp/programming/cpp/cpp11.html
2つめの引数は、const string&を引数に取り、vector<string>を返す関数型だが、
find_wordsという名前が付いている。splitはデフォルト引数。
(勿論Cと同じく仮引数が関数型なら、それは関数へのポインタ型に調整される)
ただしC++で関数の仮引数の名前を省略することは可能。
0605602
2006/04/07(金) 07:43:44アドレスを引数に取る場合はint *の様にするのだとおもってましたが
それはCだけの事だったのですね。
0606602
2006/04/07(金) 07:52:14レスありがとうございました。
あれ・・・参照とポインタって違うんですね、また勘違いしているようです。
参照は独自のアドレスを持たない、ということは占有しているメモリ領域が無いということですか?
0607デフォルトの名無しさん
2006/04/07(金) 08:16:430608デフォルトの名無しさん
2006/04/07(金) 08:38:40作成するのはCreateInstanceでできると思うのですが、
それぞれにどうアクセスすればいいかわからないのです。
for(i=0;i<=j;i++){
新しいインスタンスを作成
}
で、j個のインスタンスを作成する…みたいなことをしたいのですが。
0609デフォルトの名無しさん
2006/04/07(金) 08:59:30CreateInstanceって、なんですか?
0610デフォルトの名無しさん
2006/04/07(金) 11:35:010611デフォルトの名無しさん
2006/04/07(金) 11:38:270612デフォルトの名無しさん
2006/04/07(金) 12:51:29引数に使ったとき
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; // エラー: 必ずどこかを指してないといけない
0613デフォルトの名無しさん
2006/04/07(金) 13:38:44個数を指定するんだから配列でいいんですよね?
for(i=0;i<=j;i++){
sorezore[i]=CreateInstance();
}
でいいんじゃないですか?
0614デフォルトの名無しさん
2006/04/07(金) 14:55:420615デフォルトの名無しさん
2006/04/07(金) 15:23:07必需品
つhttp://www.amazon.co.jp/exec/obidos/ASIN/4774104329
0616デフォルトの名無しさん
2006/04/07(金) 16:00:59ありがとうございます
0617デフォルトの名無しさん
2006/04/07(金) 16:49:39*のポインタはもちろんC++でも使える。
参照は独自のアドレスを持たないというより、
持っていてもC++のソースコードからは得られないという感じ。
0618デフォルトの名無しさん
2006/04/07(金) 19:53:32あ、なるほど。
ありがとうございます。
0619デフォルトの名無しさん
2006/04/07(金) 20:23:51struct board {
int p;
int h;
}
main() {
struct board a = { 0, 0 };
printf("%d,%d,%c", a.p, a.h);
return 0; //右この部分に "互換でない型変換(関数 main )" とエラーがでる。
}
なぜでしょうか?教えてください。
0620619
2006/04/07(金) 20:26:200621デフォルトの名無しさん
2006/04/07(金) 20:28:10intを返してるからじゃね?
0622デフォルトの名無しさん
2006/04/07(金) 20:28:580623デフォルトの名無しさん
2006/04/07(金) 20:29:44mainが、だな。
0624619
2006/04/07(金) 20:33:370625デフォルトの名無しさん
2006/04/07(金) 20:34:46return;
でいいのでは?
0626619
2006/04/07(金) 20:37:590627デフォルトの名無しさん
2006/04/07(金) 20:39:06ねらってないなら、struct board{...} と main(){
の間にセミコロン。
0628619
2006/04/07(金) 20:42:33でも ねらう ってどういうことですか?
0629デフォルトの名無しさん
2006/04/07(金) 21:27:360630デフォルトの名無しさん
2006/04/07(金) 22:39:360631619
2006/04/08(土) 00:13:280632デフォルトの名無しさん
2006/04/11(火) 03:17:07普通の静的配列を使ったプログラムと混在で使うのはやはりやめるべきでしょうか?
たとえばある関数の引数に静的配列のポインタを指定する場合、
for (int i=0; i<v.size(); i++) {
a[i] = v[i];
}
のように一度変換しなければいけないと思うのですが・・・。
何か他にいい方法でもあるんですかね?
0633デフォルトの名無しさん
2006/04/11(火) 03:29:080634デフォルトの名無しさん
2006/04/11(火) 06:56:41引き数で、「静的配列のポインタ」かただの「ポインタ」かの区別を必要とするとは珍しい関数だな。
>633も書いているが、単に連続領域へのポインタが必要なら変換の必要はない。
仮に変換しなければいけないとしても、要素を一つずつコピーするのはナンセンス。
0635デフォルトの名無しさん
2006/04/11(火) 07:21:42&*v.begin()
&v.front()
&v[0]
の中から好きなのをどうぞ。
vectorは連続領域だと規格で定められている。
# vector<bool>は例外なのがあれだけど
0636デフォルトの名無しさん
2006/04/11(火) 17:40:44コンストラクタあるいはstd::copy+std::back_inserter
0637デフォルトの名無しさん
2006/04/12(水) 22:24:32自分だけしか使わなかったよ!
しかも一箇所だけで・・・
0638デフォルトの名無しさん
2006/04/16(日) 22:05:40new演算子を使うと、ヒープメモリの確保と、オブジェクトの初期化をやってくれますが、
メモリは確保しないで、オブジェクトの初期化だけやるには、どうしたらいいんでしょうか?
例えば、mallocなり配列なりで、sizeof(TMyClass)のメモリがあらかじめ、
どこかに確保されているとします。
この状態で、コンストラクタだけを呼び出して、
そのメモリ上にTMyClassのオブジェクトを作成したいのです。
前々から疑問だったので、よろしくお願いします。
0639デフォルトの名無しさん
2006/04/16(日) 22:08:35placement newという構文を使う。
void *p = malloc(sizeof(TMyClass));
TMyClass *i = new(p) TMyClass;
0640638
2006/04/16(日) 22:45:560641638
2006/04/16(日) 23:13:57名前だけはよく聞く「配置構文」ってのが、これだったのですね。
STLの「アロケータ」とか、何に使うのか分からなかったのですが、
これも、メモリへの配置に使うオブジェクトだったんですね。
本当にありがとうございました。
0642デフォルトの名無しさん
2006/04/26(水) 13:39:47if (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
0643デフォルトの名無しさん
2006/04/26(水) 13:41:25あ、r=1のときのx=2ではなくてx=cとかで。
0644デフォルトの名無しさん
2006/04/26(水) 14:35:47x=1;
else if (q=2)
x=2;
else if (r=1)
x=2;
else x=0;
0645デフォルトの名無しさん
2006/04/26(水) 14:38:10単純に
p=1;
x=1;
ret;
でいいんじゃないの?
if 文はいらないと思うし。
0646デフォルトの名無しさん
2006/04/26(水) 15:18:400647デフォルトの名無しさん
2006/04/26(水) 16:10:43全部関数に書いて、gotoの代わりにreturnではどうだ。
0648デフォルトの名無しさん
2006/04/26(水) 17:32:35do { } while(0); の中に書いて break; するって言うのもあるっけ。
0649デフォルトの名無しさん
2006/04/26(水) 18:48:13理解するのに2分かかったw
>>642はHSPばっかやってたんだろうなあ。
0650デフォルトの名無しさん
2006/04/26(水) 19:24:290651デフォルトの名無しさん
2006/04/26(水) 23:36:19画像が斜めに表示される場合は何が原因ですか?ヘッダー情報が悪い??
0652デフォルトの名無しさん
2006/04/27(木) 00:15:31struct A a[i];
↑みたいな感じで配列に変数ふることはできないんですか?
ビルドするとerror C2143: 構文エラー : ';' が '[' の前に必要です。
って書かれるんだが・・・
0653デフォルトの名無しさん
2006/04/27(木) 00:23:17何がしたいんだかよくわからんけど、
ラスタのバイト数が4の倍数になってないとか。
0654デフォルトの名無しさん
2006/04/27(木) 00:28:57C99ならできるよ
0655デフォルトの名無しさん
2006/04/27(木) 00:30:16すみません。C99って・・・?
0656デフォルトの名無しさん
2006/04/27(木) 00:31:41C99で検索すれば解説サイトがみつかると思う
0658652
2006/04/27(木) 00:32:37すみません。
0659デフォルトの名無しさん
2006/04/27(木) 00:54:53俺も通ったな
つーかそのエラーメッセージ、多分MSのやつだよな?
0660652
2006/04/27(木) 02:59:28Microsoft Visual C++です。
これでANSI-Cのをしてます。
ANSI-Cでやるように仕様書に書いてあるので・・・
0661デフォルトの名無しさん
2006/04/27(木) 03:04:19C99 も C89 も ANSI になってたとおもうが、
まぁ MSVC なら C89 ってことになるんだろうな。
ほんとに ANSI C89 でやりたいんなら、 malloc() するしかないだろう。
0662デフォルトの名無しさん
2006/04/27(木) 03:12:180663デフォルトの名無しさん
2006/04/27(木) 04:27:350664デフォルトの名無しさん
2006/04/27(木) 05:54:560665デフォルトの名無しさん
2006/04/27(木) 06:39:14int 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は変更可能ですか?
0666652
2006/04/27(木) 07:58:34struct 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;
}
こんな感じ
0667652
2006/04/27(木) 08:10:30struct member[num];
上の部分mallocなどで構造体の配列の領域確保しようとしてたのに変に書いてしまった。
正しい解答どなたか書いてみてくれませんか?
0668デフォルトの名無しさん
2006/04/27(木) 10:38:27なぜ自分で書いてみない?
0669デフォルトの名無しさん
2006/04/27(木) 11:03:26パラメーターを渡す事はできるのでしょうか?
例えば、
string* str = new string("test"); // stringを一つだけ作成、"test"をパラメーターとして渡す
string* str = new string[100]; // stringを100個作成、パラメーターは無し
は分かるのですが、
こうゆう事はできますか?
string* str = new string("test")[100];
コンパイルできないので間違っているのは確かなのですが…
0670デフォルトの名無しさん
2006/04/27(木) 11:12:19仕様上、できません。
0671デフォルトの名無しさん
2006/04/27(木) 11:30:540672デフォルトの名無しさん
2006/04/27(木) 11:50:430673デフォルトの名無しさん
2006/04/27(木) 11:54:27for (int i=0; i<100; i++) str.push_back(new string("test"));
0674デフォルトの名無しさん
2006/04/27(木) 11:58:20for( int i = 0; i < 100; i++ ){ new (str + i) string( "test" ); }
でも placement new はトリッキーよね。
0675デフォルトの名無しさん
2006/04/27(木) 12:01:25さて、Effective C++ 第3版フライング発売探してくる。
}
0676デフォルトの名無しさん
2006/04/27(木) 12:17:060677デフォルトの名無しさん
2006/04/27(木) 13:40:54それをやると、オブジェクトの解体とメモリの解放が非常に面倒になる
0678674
2006/04/27(木) 14:01:30for( int i = 0; i < 100; i++ ){ (str + i)->~string(); }
delete (char*)str;
まぁやめた方がいいわね。
0679デフォルトの名無しさん
2006/04/27(木) 15:54:110680デフォルトの名無しさん
2006/04/27(木) 15:59:51入力した数の分だけの三角形を作成するプログラムを作成しなさい。
実行例
数値を入力してください。
5
*****
****
***
**
*
教えてエロイ人!!
0681デフォルトの名無しさん
2006/04/27(木) 16:29:08それ以上は無限ループにすればいいんじゃないか?
0682デフォルトの名無しさん
2006/04/27(木) 16:40:040683デフォルトの名無しさん
2006/04/27(木) 16:57:40int 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 を使ってみました!
0684683
2006/04/27(木) 16:58:240685デフォルトの名無しさん
2006/04/27(木) 17:34:29×scanf("%d", n);
○scanf("%d",&n);
0686デフォルトの名無しさん
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;
}
0687デフォルトの名無しさん
2006/04/27(木) 18:28:58#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です。
0688デフォルトの名無しさん
2006/04/27(木) 18:35:23・初心者、慣れていないプログラマはブロックを省略せずに書こう。
#1行野郎なんて未だ早過ぎる。
・main()の仕様は規格に則って正確に。
#>687のような書き方は何に由来する? 本の通りならその本は棄てるべき。
0689デフォルトの名無しさん
2006/04/27(木) 18:36:58main(){
int a=9;
puts(a&1?"奇数":"偶数");
}
書き直してあげた
0690デフォルトの名無しさん
2006/04/27(木) 18:38:50×if (a%2 == 0);
○if (a%2 == 0)
×printf("%dは奇数です。\n");
○printf("%dは奇数です。\n",a);
return 0;が無い
0691690
2006/04/27(木) 18:43:58>本の通りならその本は棄てるべき。
捨てるのももったいないから古本屋に売って新しい本を買え。
0692デフォルトの名無しさん
2006/04/27(木) 18:51:12ご助言ありがとうございます。
解決できました。
わたしの中で勝手に脳内変換されてしまったようで、
>690さんのように書き換えたら
うまくできました。
こんな質問に答えていただき、感謝します。
これだけで、1時間近く悩んでしまったものですから;;
今後気をつけます。
0694デフォルトの名無しさん
2006/04/28(金) 09:52:430695デフォルトの名無しさん
2006/04/28(金) 11:09:020696デフォルトの名無しさん
2006/04/28(金) 12:21:000697デフォルトの名無しさん
2006/04/28(金) 14:15:430698デフォルトの名無しさん
2006/04/29(土) 01:56:44この度仕事でCを使う事になり、悩んでおります(´・ω・`)
固定長80バイトのファイルを読んで
エラーチェック→構造体に保存する処理なのですが、
下記の様なファイルがあった場合
<----------ファイル 80バイト--------->
NAME=NURUPO
ADRESS=TOKYO
KANRINO=1234,5678
【前提条件】
・レコードは左詰になっており空白は入らない。
・順番は決まっておりNAME→ADRESS→KANRINOの順。
'NAME='の場合は'='以降に続く文字が48文字以内の時に保存
'ADRESS='の場合は'='以降に続く文字が48文字以内の時に保存
'TEL'の場合は'='以降に続く数値をNUMERICチェック、
','より手前を番号1に保存、','より後を番号2に保存
とりあえず'='手前の文字列を取得して
whichとかで'XXXX'の時だったらエラーチェック処理→構造体に保存
の様ににやるのが良いのかな、、と思ってます。
情けないのですが'='以降の文字列取得に手間取っており、
ガチャガチャやってる内に処理が混乱してきてしまったので
宜しければご教授願います。
0699698
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);
/* ↓↓↓↓この辺りからエラー処理とか続ける予定です↓↓↓ */
}
}
}
0700デフォルトの名無しさん
2006/04/29(土) 02:39:31取りあえず、ファイル読み込みとか、よくあるエラーとか書かないけど。
あとは仕様が分かる範囲で。
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行取得
}
0701698
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ります。
今日はさすがに眠いのでオヤスミなさいませ。
0702デフォルトの名無しさん
2006/04/29(土) 02:54:43ご回答感謝です!
しばらく考え込みながら見入ってました。。(´・ω・`)
fgetsとかstrtok等初めて見る関数もあるのですが、
調べて試してみたいと思います。
(コメントがわかりやすく書いてるが嬉しいっす)
ちなみにNUMERICチェックと言うのは
数字でないとエラーにする事で、英語とかが入るとダメみたいです。
0703698
2006/04/29(土) 02:58:21○
'KANRINO'の場合は'='以降に続く数値をNUMERICチェック、
','より手前を番号1に保存、','より後を番号2に保存
×
'TEL'の場合は'='以降に続く数値をNUMERICチェック、
','より手前を番号1に保存、','より後を番号2に保存
それでは今度こそおやすみなさいませ(´・ω・`)
0704デフォルトの名無しさん
2006/04/29(土) 04:53:36・行単位の処理ならfread()よりfgets()を使うべき。
・大抵はferror(), feof()を使わずともfgets()の戻り値をチェックすればことが足りる。
・規約で決まっているのでもなければ、memset()はしない方がいい。
#予め領域をクリアしてしまうことで潜在的なバグを隠してしまう可能性がある。
#こういうのを「安全志向のプログラミング」とする向きもあるが、
#実態は「後ろ向きの安全志向(≒危険)」と考えるべき。
・文字列のコピーは、部分か全体化を問わず自前で書かない。
#strcpy()、strcat()、sprintf()があれば事が足りる。
・strtok()よりはsscanf()がお勧め。strtol()も数字文字のチェックに使えるぞ。
#strtok()はスレッドセーフではない、領域を破壊する、点で要注意。
なので、>699や>701は捨てて書き直すことお勧め。
ここは宿題スレでもないから敢えて漏れのコードは今は載せない。
それにしても、丁度四月入社かなにかでC歴一ヶ月なのだろうけど、
一ヶ月でこのレベルなのだとしたら余程教え方か教わり方が悪いと思う。
正直GWで身の振り方を考えたほうがいいと思う。
0705デフォルトの名無しさん
2006/04/29(土) 11:35:01習得期間なんて個人差があるんだから気にするな
一年やってそれならヤバいけど
0706698
2006/04/29(土) 13:25:10なるほど、参考になります。
規約と言う点では
・str〜系の関数よりmem〜系の関数推奨(今規約が手元に無いのでうろ覚え)
・ホストと呼ばれる古い環境なので読むファイルに改行コード\n'等の意識が無い
固定長'80'のレコードが延々と続きます。
文字列の終わりを示す'\0'も(恐らくですが)入っていない。
(参考にした処理がfgetsでは無くfreadを使っていたのも理由があるのでしょうか・・?)
>> 一ヶ月でこのレベルなのだとしたら余程教え方か教わり方が悪いと思う。
鋭いです。くぅ、やはりそうですか(´・ω・`)
実はC歴一ヶ月と言うのは誰からも教わらずに、
入門用のCの本を自分で読んで一ヶ月独学の状態です。
なのでコーディングする際に何がダメで何が良いのかを指摘して頂けるのは非常に助かります。
とりあえず1から見直して作り直しまふ。
0707704
2006/04/29(土) 17:05:44>規約と言う点では
>・str〜系の関数よりmem〜系の関数推奨(今規約が手元に無いのでうろ覚え)
おいおい……
#この手の規約の悪いところは、memcpy()を使う前にstrlen()で長さを調べるなど、
#本質を見失った運用になりがちな点などが挙げられる。
#何故そういう規約なのか誰も知らないようならマジやばいぞ。
>・ホストと呼ばれる古い環境なので読むファイルに改行コード\n'等の意識が無い
> 固定長'80'のレコードが延々と続きます。
あーすまん。行単位だとばかり思ってミスリードした。
#しかし、ホスト環境だからといって改行のないデータって……
#なんだかアナクロで不毛な環境のメンテナンスでもするのか?
> 文字列の終わりを示す'\0'も(恐らくですが)入っていない。
そういうことなら普通入れないだろうねぇ。
> (参考にした処理がfgetsでは無くfreadを使っていたのも理由があるのでしょうか・・?)
それなら確かにfread()だろうね。fread()してsscanf()でばらすのが一番楽で比較的安全かな。
>実はC歴一ヶ月と言うのは誰からも教わらずに、
>入門用のCの本を自分で読んで一ヶ月独学の状態です。
正直すまんかった。
自力でやっているならそんなもんかな。
>なのでコーディングする際に何がダメで何が良いのかを指摘して頂けるのは非常に助かります。
いやまぁ、こちらは大した手間じゃないから。
>とりあえず1から見直して作り直しまふ。
作り直しもいいけど、一ヶ月も自習させて放置するような会社と心中したいか考えたほうがいい希ガス。
0708698
2006/04/30(日) 22:32:38freadでの処理は上においてやっているので
ホストで使えるかはわかりませんが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);
}
}
0709698
2006/04/30(日) 22:34:14if( 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;
}
0710698
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;
}
}
0711698
2006/04/30(日) 22:41:52>> #何故そういう規約なのか誰も知らないようならマジやばいぞ。
ちょっと規約関係については確認してきます。
ただ現場でC言語を扱える人が1人しかいないので(その人はGW中はオヤスミ)
若干調べるのは遅くなりそうです。
>> #なんだかアナクロで不毛な環境のメンテナンスでもするのか?
ええ、巨大さ故に下手に手を入れられず古い環境のまま残っているシステムです。
今回の場合ですとI/F部分のみに手を入れて現行ホストシステムはそのまま流用します。
>> 作り直しもいいけど、一ヶ月も自習させて放置するような会社と心中したいか考えたほうがいい希ガス。
ご心配有り難う御座います。
ただ今回の件に関しては自ら首を突っ込んで「Cでやります」的な経緯があるので、
自業自得なのです。他言語の勉強も兼ねてって事で(´・ω・`)
そんなこんなで今日早速2冊目の本を買ってきました。
「図解C言語 ポインタの極意」とか言う本です。
1冊目がやけにわかりにくかったのですが、こっちはわかりやすいです。
そして、わざわざレスを下さった
>>700さん、>>704さん、>>705さん感謝です。
str関数,strlokを使用したままなのでスレッドセーフ云々については
今後の勉強の課題としておきます。
聞く人がいない環境で一人で作っていると詰まった時に
かなり無駄な時間を取る事が多く、今回ここに来てホント助かりました。
仕事中はネットは出来ないので
平日昼間のレスは出来ませんがまたきます(´・ω・`)ノ
0712704
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);
}
}
}
}
0713698
2006/04/30(日) 23:30:18BOOL型(初めて見る名前だったのでとりあえずググって調べてきました)と
fgets、sscanfで実行してるのですね。
まだ完全に理解出来てないので暫く追ってみますが、
明日ホストの方で色々やってみたいと思いまふ(´・ω・`)
ホント有り難う御座います。
0714超初心者
2006/05/01(月) 14:13:00Borland TurboC++5.0Jという化石物のソフトで書いて
コンパイルはいくんですが実行してプロセスが作成できないとエラーになります。
昨日は実はエディタが開いて実行できたんですけど なんかできなくなりました。
どうしたら治るんでしょうか?教えてください宜しくお願いします。
m(_ _)m
0715デフォルトの名無しさん
2006/05/01(月) 16:39:000716デフォルトの名無しさん
2006/05/01(月) 19:55:58・エラーメッセージを貼らない
・環境をキチンと書かない
0717デフォルトの名無しさん
2006/05/01(月) 20:01:38どっかから別の 98 を調達して来た方がいいんじゃないか?
0718デフォルトの名無しさん
2006/05/01(月) 23:33:26似た境遇だ・・・お互いがんばろうぜ
0719デフォルトの名無しさん
2006/05/01(月) 23:56:32(EXEファイルはできてる?)
あと、プロセスが生きてると、EXEファイルに上書きできない。
これが一番典型的なオバカパターン。
パソコンの再起動はしたよね?
0720698
2006/05/02(火) 00:00:27今日も今日とて職場で紙出ししたソースを家に帰って手打ちして実行です。
(FD等の外部機器が一切使用禁止の為)
久しぶりにガンガッテマス。
そちらも頑張って(´・ω・`)ノ
0721デフォルトの名無しさん
2006/05/02(火) 00:09:14持ち出しちゃ駄目なんだろ?禁止されてる理由を考えろ。
0722デフォルトの名無しさん
2006/05/02(火) 00:10:55一応念のために聞くが、会社(アカウント)から自宅(アカウント)へのメールも禁止されているということでいいか?
ますます自分の身を削ってまで付き合うべき会社とは思えなくなってきたのだが。
0723デフォルトの名無しさん
2006/05/02(火) 00:16:460724698
2006/05/02(火) 00:36:42うーむ、その話は派生すると長くなりそうですが、
とりあえずキレイ事言ってたら終わらないってのがあります。
>>722
外部へは一切アクセス不可です、何とも不便です
>>723
健気って程でも無いですよ〜。
ただ自分でやると言ったからやってる、、って所でしょうか(´・ω・`)。
0725デフォルトの名無しさん
2006/05/02(火) 00:52:40仕事が終わらなくなるような規則を施工しているやつらに責任を取らせろ。
そんな規則があっても何とかなると思われちゃ、迷惑だ。
0726デフォルトの名無しさん
2006/05/02(火) 01:13:54自分でやると言う人間を支援するのが会社と言う組織だ。
支援せずに足枷ばかり与える組織は、強制労働所くらいで沢山だ。
0727698
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;
}
}
0728デフォルトの名無しさん
2006/05/02(火) 10:43:01企業人としては失格だな。
それ以前に企業自体が失格っぽいが。
0729デフォルトの名無しさん
2006/05/03(水) 16:14:13プロトタイプ宣言が ”宣言” で関数本体は ”定義” という表現がされていたように思います。
C++になると、クラスの中に一行書くのが ”定義” で
つらつらと中身を記すのは ”実装” と表現されるのが一般的な気がします。
私の勘違いかもしれませんが、CとC++では
定義 という言葉の位置づけが逆転しているような気します。
何か理由があるのでしょうか?
0730デフォルトの名無しさん
2006/05/03(水) 16:28:37>プロトタイプ宣言が ”宣言” で関数本体は ”定義” という表現がされていたように思います。
これはCでもC++でも正しい。(ただし定義は全て宣言でもある)
>C++になると、クラスの中に一行書くのが ”定義” で
>つらつらと中身を記すのは ”実装” と表現されるのが一般的な気がします。
classキーワードに続けて書くのが「クラスの」定義で、
処理の中身を記すのは「クラスの」実装。
クラスの定義中にはメンバ関数の宣言が含まれるし、
クラスの実装とはすなわちメンバ関数の定義の事。
0731デフォルトの名無しさん
2006/05/03(水) 16:33:01判りました
ありがとうございます
0732デフォルトの名無しさん
2006/05/04(木) 08:24:160733デフォルトの名無しさん
2006/05/04(木) 11:30:24試験に出されたら絶対点落とすわ、漏れ。
0734デフォルトの名無しさん
2006/05/05(金) 14:36:03プログラマならコードで語る。これ最強
0735デフォルトの名無しさん
2006/05/05(金) 23:59:270736デフォルトの名無しさん
2006/05/06(土) 15:43:42data == 2430 ||
data == 2514 ||
data == 2521 ||
data == 2539 ||
data == 2554 ||
以下、数十行続く・・・
{
処理
}
data にはファイルを1行毎に読み込んだ数値があって、その数値は分秒を表してる。
その特定の分秒だけの時に処理部分を実行したかったからこんなんなったんだけど、
これ以外思い浮かばないよ。何かいい案ないですか?
0737デフォルトの名無しさん
2006/05/06(土) 16:08:12とりあえずチェックルーチンは関数化したら?
0738デフォルトの名無しさん
2006/05/06(土) 16:18:51何が不満なの?
0740デフォルトの名無しさん
2006/05/06(土) 16:26:29配列定義して検索すれば?
と思ったけど、行数が不満なら解決にならんな。
0741736
2006/05/06(土) 16:34:200742デフォルトの名無しさん
2006/05/06(土) 16:40:54行数がヤダってんなら1行にいっぱい書けよ。
0743デフォルトの名無しさん
2006/05/06(土) 16:42:59その整数値を配列に入れて、ループでチェックすればいいじゃん。
0744デフォルトの名無しさん
2006/05/06(土) 16:46:080745デフォルトの名無しさん
2006/05/06(土) 17:02:12規則性のないデータなら、短くすることは、原理的に無理。(圧縮とかは別にして。)
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番まで検索汁
0746736
2006/05/06(土) 17:03:11int trigger[] = {2412, 2430, ・・・・};
for (int i = 0; i < sizeof(trigger)/sizeof(int); i++){
if (data == trigger[i]){
処理
}
}
ソレダ。すげーなんかスッキリした。ありがとうありがとう。他のみんなのも検討してみる。
0747745
2006/05/06(土) 17:04:070748736
2006/05/06(土) 17:06:57書いてる途中はリロードして確かめてが書き込み直前でリロードするの忘れてたw
ファイルから読ませるのも検討してみる。ありがとうありがとう。
0749740
2006/05/06(土) 17:12:180751740
2006/05/06(土) 17:33:52線形サーチを見ると bsearch() とか std::binary_search() とかしたくなるな。
配列をソートした状態で入力するか、事前にソートできればの話だけど。
毎秒1回の処理ならどうでもいいか。
0753デフォルトの名無しさん
2006/05/10(水) 01:20:11なんたらどうたら
};
がエラーでルーとやけ酒のみながらやってたら
Class じゃなくて class なのに気が付いたorz
0754デフォルトの名無しさん
2006/05/30(火) 18:50:39があるのでお尋ねします。
読んで行く上で「_T(ほにゃらら)」というのをよく
見かけるのですが、Webで使い方について調べてみて
いるのですが調べ方が悪いのかうまく見つけられません。
そもそもこれは何なのか。またどのような使われ方を
するのか教えていただければ幸いです。
0755デフォルトの名無しさん
2006/05/30(火) 19:01:15ttp://www.ruche-home.net/program/tips/tchar.php
0756デフォルトの名無しさん
2006/05/30(火) 23:56:37予約語を強調表示しないの? エディタ/IDEは何使ってるの?
0757デフォルトの名無しさん
2006/05/31(水) 08:43:450758デフォルトの名無しさん
2006/05/31(水) 08:57:560759デフォルトの名無しさん
2006/06/23(金) 14:44:43Hoge hogeって宣言するのと
Hoge *hogeって宣言してnewするのだったらどっちがいいですか?
0760デフォルトの名無しさん
2006/06/23(金) 17:18:270761デフォルトの名無しさん
2006/06/23(金) 21:29:11ヒント:
int matrix[1024 * 1024]; と宣言するのと
int *matrix = malloc(sizeof(int) * 1024 * 1024); と
どっちがいいと思う?
答え:
ちんこ
0762デフォルトの名無しさん
2006/06/23(金) 22:26:26new する必要があるのは
・スタックが足りない等のメモリ上の都合がある場合
・直前までサイズがわからず動的確保に頼るしかない場合
など、必要に駆られて行うのが普通。
必要なければしないのが吉。
0763デフォルトの名無しさん
2006/06/24(土) 07:32:42>・スタックが足りない等のメモリ上の都合がある場合
こっちはいいとして、
>・直前までサイズがわからず動的確保に頼るしかない場合
その場合はstd::vector使えばいい気もす。
で、一つ追加。
・クラスライブラリの設計者がJava上がりなどの理由でnewするように設計されている場合
0764デフォルトの名無しさん
2006/06/24(土) 14:26:420765デフォルトの名無しさん
2006/06/24(土) 14:48:59実装はライブラリレベルで行われてるんだよ。
で、new は動的なメモリ確保と、割り当てられたメモリへのコンストラクタ呼び出しを行い、
delete はデストラクタの呼び出しとメモリの開放を行う仕掛け。
極端な話、中では malloc と free ないしは類似のメモリ確保関数が呼び出されとるのが普通。
よって回答は >>761 = ちんこ。
0766デフォルトの名無しさん
2006/06/24(土) 17:42:02実装はコンパイラレベルだろ。
別に奇妙でも何でもないと思うが。
0767デフォルトの名無しさん
2006/06/24(土) 18:39:030768デフォルトの名無しさん
2006/06/24(土) 18:40:46libstdc++をリンクしないと、リンク時に undefined reference to `operator delete(void*)'
のようなエラーが出るのには驚いた
0769デフォルトの名無しさん
2006/06/24(土) 18:49:100770デフォルトの名無しさん
2006/06/24(土) 22:11:43まあどーでもいいんだけどね。
0771デフォルトの名無しさん
2006/06/24(土) 22:40:280772デフォルトの名無しさん
2006/06/25(日) 00:04:02ライブラリレベルなら文字通り責任はライブラリにあることになる。
たとえば仮想関数がvtableで実装されてるのはコンパイラレベル。
で、コンパイラが司るところの言語仕様の枠から見ると、
専用の例外が用意されてたりlibstdc++のリンクを必要とする
newやdeleteは、ある意味鬼子。
これはnewやdeleteの実装が処理系によって大きく変わってくることを意味したりもするので、
使用に際してライブラリの癖…メモリ確保の効率とか確保のために必要なCPU時間とか…
にまで気を回さなければならない状況も考えられないわけじゃない。
自前でnewやdeleteを作ろうとした場合、<new>の実装内容に首を突っ込まなければ
ならない場合なんてのも往々にしてある。
C++を使う上での一般的な知識の枠の外を要求されることも無いではないあたり、
パラノイア的に粘着するなら、newもdeleteも標準ライブラリ扱いの項目でこそあれ、
組み込み予約語の枠に収まってるのは少々おかしいくらいだぞ、と。
まあ、そんな毒にも薬にもならない話。
0773デフォルトの名無しさん
2006/06/25(日) 00:14:46特定の実装の話を言語一般の話のように言うなよ。
0774デフォルトの名無しさん
2006/06/25(日) 00:17:100775デフォルトの名無しさん
2006/06/25(日) 00:22:07bad_alloc 例外投げる以前の奴とかがそうだ。
new がライブラリ実装に以降したのには歴史的な事情もあって、
単にメモリ枯渇の時にゼロ返すだけじゃ色々不都合だってんで
例外を投げるようにしたんだが、旧来の方式との互換も保ちたい、
それもコンパイラオプションで切り替えられるとかのレベルじゃなく
ひとつのコード内でどちらも選択可能にするためにコンパイラの中から
追い出した、なんてのがあるよ。
0776デフォルトの名無しさん
2006/06/25(日) 00:30:18g++ 使えば -lstdc++ なんて要らない。
これならコンパイラレベルだね。
0777デフォルトの名無しさん
2006/06/25(日) 00:44:24一概にどっちって言い切れる存在じゃないみたいだね。
0778デフォルトの名無しさん
2006/06/25(日) 01:08:17気にしないで済めばそれでいい。
0780デフォルトの名無しさん
2006/06/25(日) 01:23:18g++ なら勝手にリンクされるから、自分で libstdc++ を指定する必要は無いはずだよ。
0781768
2006/06/25(日) 02:04:52ごめんね。
その当時のMakefileを見直したらリンカに$(CC)を指定してた。
今g++に変更してみたら自分で指定しなくても勝手にstdlibc++はリンクされたよ。
でも、これでコンパイラレベルと言えるとは思わないなぁ。
あ、いや、どっちでもいいんだけど。
0782デフォルトの名無しさん
2006/06/25(日) 02:06:100783デフォルトの名無しさん
2006/06/25(日) 11:29:54g++みたいに少々特殊な経緯をもつコンパイラならなおの事。
少し話がずれるけど、テンプレートみたいな実装の難しい部分に関しては
ライブラリ側が大きく引きずられたりもするし。
new の内部で何やってるのかを知っておくのは、operator new のオーバーライドなんかを
必要としたときに役に立つわけだし、悪いトピックじゃなかった。
0784デフォルトの名無しさん
2006/06/26(月) 18:07:51そうすると関数の頭で宣言するCの時とコスト的に差が無いのか気になる。
0785デフォルトの名無しさん
2006/06/26(月) 18:11:59C99でもそうだけど、あくまでもその場所で生成すると言う意味ではなく
その場所で生成したかのごとく振舞うと言うこと。
つまり、POD型なら関数入り口でスタックフレームを形成するので全く同じコードになる。
#コンストラクタが必要な場合でも、特に不利になるわけではない。
0786デフォルトの名無しさん
2006/06/27(火) 11:34:15�d。勉強になりました。
0787785
2006/06/27(火) 11:42:58>785を一部訂正。
POD型なら常に同じコードと言うわけではなく、例えば次のようなコードの場合
よりタイトなコードになる可能性がある。
void func()
{
if (...) {
int a;
...;
} else {
int b;
...;
}
}
関数の先頭でint a, b;とすると二つの領域が確保される可能性が高いが、
このように書くとaとbが同時に存在しないことが保証されるので一つの領域を
使い回してくれる可能性がある。
#より賢いコンパイラでは結局同じになるかもしれないが。
勿論、オブジェクトの場合は別のコードになる筈だが。
0788デフォルトの名無しさん
2006/07/07(金) 11:52:34classA::func()
classA::func(string)
これらポリモルフィズムの関数ポインタをそれぞれ取得するにはどうしたらよいでしょうか。
0789デフォルトの名無しさん
2006/07/07(金) 13:02:070790デフォルトの名無しさん
2006/07/07(金) 20:49:40TCP/IPで受信した文字列の中から空行を見つけたいのですが、
どうすればよいですか?
お願いします。
0791デフォルトの名無しさん
2006/07/07(金) 22:02:49文字列の中から特定の文字を除去したいならstrstrとかを使いなされ。
0792デフォルトの名無しさん
2006/07/08(土) 03:20:02HTMLのサムネイルを作りたくてWindows/System32フォルダ内のWebvw.dllをActiveXで使おうと考えています
MFCプロジェクトにてActiveXコンポーネントの取り込み→ラッパークラスを作成したのですが
そこで作られたメソッドなどの使用方法がわかりません
MSDNにも載っておらず、ネットでも探したつもりですが、わかりませんでした
他の人はどうやってこういったActiveXを使っているのでしょうか
使用方法などどうすればよいのでしょうか?
よろしくお願いします
0793デフォルトの名無しさん
2006/07/08(土) 04:24:47回答どうもです。
while(1)
{
if (strstr(buffer,"\n\n") != NULL) //buffer=受信した文字列
{
printf("END") ; break;
}
}
このようにしても無限ループから抜け出せないのですがなぜなんでしょう。
空行は改行が連続している場所だと思うの\n\nにしてみました。
0794デフォルトの名無しさん
2006/07/08(土) 07:38:060795デフォルトの名無しさん
2006/07/08(土) 11:11:460796デフォルトの名無しさん
2006/07/08(土) 11:39:390797デフォルトの名無しさん
2006/07/08(土) 11:51:400798デフォルトの名無しさん
2006/07/08(土) 12:16:18アドレスと確保されたサイズをリンクリストあたりに保存しておけば?
0799デフォルトの名無しさん
2006/07/08(土) 12:31:04A *a;
a = new A;
とした時に確保されるサイズの求め方とアドレスの求め方を聞きたいです。
0800デフォルトの名無しさん
2006/07/08(土) 12:40:34処理系の実装次第なんで、そのままだと無理だよ。
系によってはメモリマネージャにデバッグ用途向けのアナライズ機能を用意してる
(つーか大抵ある)ので、その辺をこねくり回せば入手できるかもね。
それが無理なら>>797-798が正解。
0801デフォルトの名無しさん
2006/07/08(土) 12:41:22生アドレスが必要な状況ってよっぽど限られてると思うんだけど。
0802デフォルトの名無しさん
2006/07/08(土) 12:44:03どれでもsizeof(〜)のサイズが確保されるんでしょうか?
0803デフォルトの名無しさん
2006/07/08(土) 12:51:01実際には4バイト境界に揃えられたりして必ずしもそのサイズじゃない場合あり。
ついでに言うとメモリを確保する際にはヒープツリーの接続情報やらデバッグ情報やらも
一緒に確保されるのが普通なんで、オブジェクトのサイズよりもはるかに大きなサイズが
確保される場合がある。
もっと言うとオブジェクトの内部でnewとかしてたら、sizeofで得られるサイズは
実際に確保されるサイズとは何の関係もない値になる。
アドレスが欲しければ、無理やりキャストしてunsignedにでも放り込めば。
0804デフォルトの名無しさん
2006/07/08(土) 12:54:13まあ、最低値がその値というのはそうなんだけど。
0805デフォルトの名無しさん
2006/07/08(土) 12:57:38sizeofが4バイト単位になっていても、メモリ確保のときは16バイト単位になるかもしれない。
0806デフォルトの名無しさん
2006/07/08(土) 13:00:04通常は境界整列後のサイズだろうけど、pragma pack とか付けば変わってくるし。
作法的には妄信は微妙な気が。
0807デフォルトの名無しさん
2006/07/08(土) 13:02:24sizeofは境界整列後の値であるということには同意するんだよね?
>>806
話がずれてる。
0808805
2006/07/08(土) 13:04:530809デフォルトの名無しさん
2006/07/08(土) 13:08:370810デフォルトの名無しさん
2006/07/08(土) 13:23:460811デフォルトの名無しさん
2006/07/08(土) 13:25:470812デフォルトの名無しさん
2006/07/08(土) 13:30:390813デフォルトの名無しさん
2006/07/08(土) 13:54:110814デフォルトの名無しさん
2006/07/08(土) 14:49:52>>803
Windowsなら「CRT デバッグ ヒープ」でググれ。
0815デフォルトの名無しさん
2006/07/08(土) 15:05:59試しにoperator newを定義してみれば、
どれだけのメモリが確保されるかはわかるから、自分で試してみろ。
0816デフォルトの名無しさん
2006/07/08(土) 16:45:33それで試して「やっぱり sizeof() と同じだね」って結論にもできないだろ。
0817デフォルトの名無しさん
2006/07/08(土) 19:21:530818デフォルトの名無しさん
2006/07/08(土) 19:24:07十分って何だよ?結局それに依存したコードはNGだぞ。
0819デフォルトの名無しさん
2006/07/08(土) 19:26:02十分じゃない場合を例示して貰いたい
0820デフォルトの名無しさん
2006/07/08(土) 19:26:100821デフォルトの名無しさん
2006/07/08(土) 19:28:39「十分」の意味がわかんねぇっつってんだろ。
0822デフォルトの名無しさん
2006/07/08(土) 19:29:420823デフォルトの名無しさん
2006/07/08(土) 19:30:410824デフォルトの名無しさん
2006/07/08(土) 19:33:27何故自分で確かめない?
0825デフォルトの名無しさん
2006/07/08(土) 20:05:40一応なるよー。
大抵の処理系ではvtableひとつにつき1ポインタ長増える。
もちろん多重継承かますとその分だけ増えていく。
ところで何でそんなに消費量が必要なのかね?
デバッグ目的?
0826デフォルトの名無しさん
2006/07/09(日) 17:35:26C++ではクラス型とポインタの扱いが違うのはなぜですか?
0827デフォルトの名無しさん
2006/07/09(日) 17:41:38違うものの扱いが違うのは不思議じゃないだろ。
むしろ「Delphi では同じ扱いができるのはなぜですか?」って気分だ。
0829デフォルトの名無しさん
2006/07/09(日) 17:55:220830デフォルトの名無しさん
2006/07/09(日) 18:10:080831デフォルトの名無しさん
2006/07/09(日) 18:12:56C++ では class, struct, union で定義するのがクラス型だよ。
Delphi のはまた違うんだろうけどな。
0832デフォルトの名無しさん
2006/07/09(日) 18:17:44あることのことを言ってるのなら、それはCの名残。
0833デフォルトの名無しさん
2006/07/09(日) 21:10:390834デフォルトの名無しさん
2006/07/09(日) 21:39:00リファレンスの存在意義がわからんってことなのか?
0835デフォルトの名無しさん
2006/07/10(月) 14:44:53\r\n\r\nで動きました
ありがとうです
0836デフォルトの名無しさん
2006/07/10(月) 16:20:00C/C++を勉強しろ。
>>834
別に議論してるわけじゃなくて、ただのQ&Aだよ。
0837デフォルトの名無しさん
2006/07/12(水) 04:27:340838デフォルトの名無しさん
2006/07/14(金) 07:39:11int
main()
{
・・・
if(){エラー処理; return 1; }
・・・
return 0;
}
main関数はint型なので、return 1
はreturn 100でもint型なら何でもいいんでしょうか。
処理の最後だから、数字を返したところが
main関数の終わりっていうことでよかったでしょうか。
0839デフォルトの名無しさん
2006/07/14(金) 08:22:22main() の戻り値および exit() の引数は OS などの環境によって
いくらか意味づけが行われていることがあるが、言語の範囲では
0 と EXIT_SUCCESS が成功、 EXIT_FAILURE が失敗決まっているだけ。
これ以外の 100 などの数値がどう解釈されるかは環境ごとに
異なる可能性がある。
return で関数が終了するのは main() でも他の関数でも変わらない。
main() の場合はプログラムも終了するけど。
0840デフォルトの名無しさん
2006/07/14(金) 08:46:54おいおい、デタラメ教えるなよ。
成功/失敗時にreturnする値は決まってるわけではなく、ただの慣習。
0841デフォルトの名無しさん
2006/07/14(金) 09:21:23ISO C 7.20.4.3 "The exit function" 5
0842デフォルトの名無しさん
2006/07/14(金) 09:46:220,1,EXIT_SUCCESS,EXIT_FAILURE
で実行してみたんですが、プログラム自体は
正常に動きました。
成功、失敗の意味合いはあるんですね。
みなさん回答ありがとうございました。
0843デフォルトの名無しさん
2006/07/14(金) 11:45:150844デフォルトの名無しさん
2006/07/14(金) 11:59:45なんで?
0845デフォルトの名無しさん
2006/07/14(金) 12:04:010846デフォルトの名無しさん
2006/07/14(金) 13:34:110847デフォルトの名無しさん
2006/07/15(土) 00:07:570848デフォルトの名無しさん
2006/07/15(土) 00:15:190849デフォルトの名無しさん
2006/07/15(土) 00:25:10敢えてコマンドインタプリタと断っているのだから、
負の戻り値を利用できるケースがあることも承知しているのだろうよ。
0850デフォルトの名無しさん
2006/07/15(土) 01:02:060851デフォルトの名無しさん
2006/07/15(土) 02:03:12そうでもない
0852デフォルトの名無しさん
2006/07/15(土) 02:28:470853デフォルトの名無しさん
2006/07/15(土) 02:40:110854デフォルトの名無しさん
2006/07/15(土) 04:42:440855デフォルトの名無しさん
2006/07/15(土) 04:52:470856デフォルトの名無しさん
2006/07/15(土) 05:06:220857デフォルトの名無しさん
2006/07/15(土) 05:12:57イエーッ!!バッバッバッバッバッバッバッバッバッ
0858デフォルトの名無しさん
2006/07/18(火) 01:53:04HTTP1.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は使えないような気がします。
よろしくお願いします。
0859デフォルトの名無しさん
2006/07/18(火) 02:18:37TCP/IPの場合、分割されようがなにしようが、受信側で巧いこと組み立てるしかない。
また、受信できる限りは受信し続けなければならない。
つーか、どう失敗したの?
0860デフォルトの名無しさん
2006/07/18(火) 02:53:20recv==0で受信するループを抜けようとしたのですが、
最後の文字が送られてきてからrecv=0が送られてくるまでに
5〜10秒無駄に時間が空きます。
HTTP1.0でGETリクエストしたときは無駄な時間の空きがなく
素直にrecv=0が送られてきて終わりにできました。
0861デフォルトの名無しさん
2006/07/18(火) 05:11:05あとは自分で頑張りな
持続的接続 (persistent connections)
Connection ヘッダフィールド
0862デフォルトの名無しさん
2006/07/18(火) 07:09:240863デフォルトの名無しさん
2006/07/19(水) 04:06:11ファイルの行数を求めるプログラムを作っています。
1行の文字数が不定のファイルの、全体の行数を求めるときはどんな風にすればよいですか?
VC++を使っています。
0864デフォルトの名無しさん
2006/07/19(水) 07:30:430865デフォルトの名無しさん
2006/07/19(水) 08:05:07何で'\r'なんか数えるんだ?
0866デフォルトの名無しさん
2006/07/19(水) 08:14:350867デフォルトの名無しさん
2006/07/19(水) 09:09:450868デフォルトの名無しさん
2006/07/19(水) 09:44:32fgets()で指定したバッファ超より長い行があると、結局二度手間になると思うけど。
素直にfgetc()で読み流した方が速いんでない?
0869デフォルトの名無しさん
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
0870デフォルトの名無しさん
2006/07/19(水) 10:07:40オープンソース陣営が勢力を増してるので対抗するためにやむなく、という
うがった見方もあるにはあり。
0871デフォルトの名無しさん
2006/07/19(水) 10:09:17個人でさわってる分にはいいけど、VSSとの連携もないし、
すぐにStandrdEdition以上が欲しくなる罠。
つまりMSの壮大な釣り。
0872デフォルトの名無しさん
2006/07/19(水) 10:11:40ありがとうございます。
0873デフォルトの名無しさん
2006/07/19(水) 15:25:14fgetcの方向で考えてみます。
ありがとうございます
0874デフォルトの名無しさん
2006/07/19(水) 18:01:17調べてみたけどやっぱり難しいようですね
ありがとうございます。
ネットワーク相談室にも行ってみます。
0875デフォルトの名無しさん
2006/07/19(水) 22:46:19C/C++って、ファイルをオープンするときに
perlのように、排他制御しなくてもいいんですか?
勝手にロックとかしてくれているんでしょうか。
0876デフォルトの名無しさん
2006/07/19(水) 22:53:57入門書に排他制御のことが書いてないのは正常です。
0877デフォルトの名無しさん
2006/07/19(水) 23:42:500878デフォルトの名無しさん
2006/07/20(木) 06:53:290879デフォルトの名無しさん
2006/07/21(金) 11:26:02>>877
>>878
返事遅れました。ありがとうございます。
マルチスレッドで、ファイル共有、メモリ共有
するときなどの話になるんですね。
ちょっとずつわかってくると燃えてきますね。
ん〜、プログラミングできるようになりたい。
0880デフォルトの名無しさん
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
0881デフォルトの名無しさん
2006/07/22(土) 01:40:51自分で課題ができないということはテストに不合格となるわけだ。
何も不思議ではないし、とても理にかなっている。安心しろ。
0882デフォルトの名無しさん
2006/07/22(土) 02:04:11#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;
}
マジでワケワカメ。
0883デフォルトの名無しさん
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);
0884883
2006/07/22(土) 02:16:060885ひまでしょうがない883
2006/07/22(土) 02:45:33int 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]);
0886デフォルトの名無しさん
2006/07/22(土) 02:50:06>>883
ありがとございます〜!!!
883やばいです。やばいです、マジ参考にします!!!
マジで助かります!!!多分単位は落とすけど・・・・orz
授業も出てないし、課題4つあって一つも提出してない><
0887どうしてもひまでひまでしょうがない883
2006/07/22(土) 03:47:20880の能力をよくご存知の先生は、腰を抜かして仰天するはず。
#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;
}
0888デフォルトの名無しさん
2006/07/22(土) 05:05:25#include <stack>
0889デフォルトの名無しさん
2006/07/22(土) 05:28:07char* str = "hello";
charのポインタなんですが、下記をcoutしてみました。
*str→h str[1]→e str→hello
*str先頭を指す
str[1]は2番目をさす
これは納得できました。
strがhelloなのがよくわかりません。
0x×××じゃないのが不思議です。
ポインタは変数のアドレスを指す場合と
上記のように、文字列そのものを指す時がある
っていうふうに理解すればよいでしょうか。
あと、helloの0x×××のようなアドレスは
今回の場合どうやって出力するんでしょうか?
よろしくお願いします。
0890デフォルトの名無しさん
2006/07/22(土) 07:23:11単位オワタ
0891デフォルトの名無しさん
2006/07/22(土) 07:35:45演算子が多重定義されているから。
つまり、渡されたのがvoid*かchar*かで別の関数が呼ばれる。
なので、この場合void*型にキャストすればアドレスが出力される。はず。
"0x"を付けたければ「マニピュレーター」を調べてくれ。
0892デフォルトの名無しさん
2006/07/22(土) 07:52:100893デフォルトの名無しさん
2006/07/22(土) 09:04:45そのときのタイマー(例えば文字列を表示して5秒でクリアスクリーン)
とかってfor文で無駄な処理をさせて無理やり時間とる以外に方法ってある?
低脳な質問でスマソ
0894デフォルトの名無しさん
2006/07/22(土) 09:17:060895デフォルトの名無しさん
2006/07/22(土) 09:17:18環境に見合ったスリープ関数を呼ぶ。
0896デフォルトの名無しさん
2006/07/22(土) 09:17:57っboost::timer
0897デフォルトの名無しさん
2006/07/22(土) 09:25:110898デフォルトの名無しさん
2006/07/22(土) 11:05:18ありがとうございます。
早速、マニピュレーター調べてみます。
0899デフォルトの名無しさん
2006/07/23(日) 00:07:350900デフォルトの名無しさん
2006/07/23(日) 00:10:55http://www.boost.org/LICENSE_1_0.txt
0901デフォルトの名無しさん
2006/07/23(日) 00:17:19フリーソフト作るならただで使っていいけど
商用開発ならロイヤリティよこせ
みたいな感じ?
0902デフォルトの名無しさん
2006/07/23(日) 00:18:01ちがう。
どう読んだらそうなるんだ?
0903デフォルトの名無しさん
2006/07/23(日) 00:56:26ようするに何やってもいいというようなことが書いてある。
0904デフォルトの名無しさん
2006/07/23(日) 01:07:50何やってもいいってわけじゃない。
0905デフォルトの名無しさん
2006/07/23(日) 03:57:32どんな事になっても文句たれるな
って書いてある
0906デフォルトの名無しさん
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
に書いてあります.
0907デフォルトの名無しさん
2006/07/23(日) 11:58:190908デフォルトの名無しさん
2006/07/23(日) 12:12:50緩くて当たり前。
0909デフォルトの名無しさん
2006/07/23(日) 13:27:37arrayとかなったんだっけ?
0910デフォルトの名無しさん
2006/07/23(日) 13:35:37C++標準との関係は boost のトップページに書いてある。
0911デフォルトの名無しさん
2006/07/23(日) 15:05:57Library Technical Report ( TR1) as a step toward becoming part of a future C++ Standard.
これとかか。
C++標準自体のアップデートって具体的に何時なのよ。
0912デフォルトの名無しさん
2006/07/23(日) 15:12:22詳しくはこちらへどうぞ。
ttp://pc8.2ch.net/test/read.cgi/tech/1149440647/l50
0913デフォルトの名無しさん
2006/07/23(日) 15:32:422009年かー。
どうなることやら。
0914デフォルトの名無しさん
2006/07/26(水) 03:22:46httpで以下のような文字列をrecvしたとき、
Accept-Ranges: bytes\r\nContent-Length: 214\r\n
この文字列に含まれている、
Content-Lengthの次から\rまでの数字だけを
int型の変数に入れるにはどうやったらよいのでしょう?
よろしくお願いします。
0915デフォルトの名無しさん
2006/07/26(水) 04:37:520916デフォルトの名無しさん
2006/07/26(水) 17:30:22Content-Lengthより前の部分の文字列の長さが不定だったので、
sscanfの書式に合わなくて変な値を取りました。
他にやり方はありますか?
0917デフォルトの名無しさん
2006/07/26(水) 17:40:25Content-Lengthをstrstr()で探しておいて、その続きからsscanf()。
0918デフォルトの名無しさん
2006/07/26(水) 18:55:14strstrでContent-Lengthを探してポインタを取ったんですが
sscanfでどうやって取得したポインタを使えばいいのでしょう?
0919デフォルトの名無しさん
2006/07/26(水) 19:20:05Ex.
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);
}
0920デフォルトの名無しさん
2006/07/26(水) 23:10:11できました。ありがとうございます。
sscanf(p + strlen("Content-Length:"), "%d", & len);
という使い方は下のマニュアルに載っていませんでしたが、特殊なのですか?
http://www9.plala.or.jp/sgwr-t/lib/sscanf.html
0921デフォルトの名無しさん
2006/07/26(水) 23:15:38やっていることは基礎的な事柄を組み合わせているだけだから、簡単に思い付くはず。
わざわざ載せるまでもないというやつ。
0922デフォルトの名無しさん
2006/07/26(水) 23:38:44なるほど
ありがとうございます
0923デフォルトの名無しさん
2006/07/27(木) 04:40:16char * 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);}
0924デフォルトの名無しさん
2006/07/28(金) 00:18:150925デフォルトの名無しさん
2006/07/28(金) 14:38:33すぐに思いつくかと言われると難しいな
0926デフォルトの名無しさん
2006/07/28(金) 14:43:38は
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');}
でもいいが。
0927デフォルトの名無しさん
2006/07/28(金) 14:50:09肝はフォーマット文字列も文字列リテラルに限定されないってことを示したかっただけなんだから勘弁してね。
0928デフォルトの名無しさん
2006/07/28(金) 19:29:250929デフォルトの名無しさん
2006/07/28(金) 19:39:15勘弁する。
0930デフォルトの名無しさん
2006/08/01(火) 12:52:580931デフォルトの名無しさん
2006/08/01(火) 14:17:37//構造体です。
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の動き方が
わからないのですが教えてください。
よろしくお願いします。
0932デフォルトの名無しさん
2006/08/01(火) 14:24:58memset(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'でした。
すみません。
0933デフォルトの名無しさん
2006/08/01(火) 14:28:49”memsetの代わりに”って言う日本語も変でした。
どうしてこうバカなんだか。
不快になられた方本当に申し訳ございません。
0934デフォルトの名無しさん
2006/08/01(火) 14:32:43なので最初の書き方だと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';
0935デフォルトの名無しさん
2006/08/01(火) 14:34:49charの配列を文字列として使うためには文字列の最後にナル文字を置かないといけない。
つまり、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()を使うのは避けた方がいいかもしれない。
0936デフォルトの名無しさん
2006/08/01(火) 14:37:07mecpy(&obj, "7777777\07777777\07777777\0", 24);
0937デフォルトの名無しさん
2006/08/01(火) 14:38:21memset(&obj, "yyyyyyy\0yyyyyyy\0yyyyyyy\0", 24);
0938デフォルトの名無しさん
2006/08/01(火) 14:38:54memset->memcpy
0939デフォルトの名無しさん
2006/08/01(火) 14:44:16それだったら未だ
strcpy(& obj, "yyyyyyy\0yyyyyyy\0yyyyyyy");
の方が素直な希ガス。
0940デフォルトの名無しさん
2006/08/01(火) 15:09:55丁寧な解説、ありがとうございます。
できました。
>>935
勉強はじめたばかりで、ナル文字とか実はあんまり慣れてないです。
sizeof(obj.hoge_a) - 1は、-1すると
なぜかゴミがなくなったので、-1してみました。
ナル文字も勉強してきちんと書くようにします。
構造体ってメモリ上でこんな形で保存してあるんですね。
"7777777\07777777\07777777\0"
ttp://www.bohyoh.com/CandCPP/C/Library/memset.html
このページの意味がやっとわかりました。
まさに、オブジェクトのポインタに同じ文字を
入れて初期化していくんですね。
はじめは、見えないところで特別な動きをして
構造体のメンバ変数ひとつずつにmemsetをやっていくのかと
思ってました。
みなさんありがとうございました。
0941デフォルトの名無しさん
2006/08/01(火) 15:15:23shortやintやdoubleなどが混在するとすかすかになったりするからね。
この話は勉強してればそのうち出てくると思うよ。(境界整列のはなし)
0942デフォルトの名無しさん
2006/08/01(火) 15:31:13>935の最後の行もお忘れなく。
0943デフォルトの名無しさん
2006/08/08(火) 04:36:043つのファイル名をファイルの大きさ(容量)によって
小さい順番にprintfでファイル名を出力したいと思います。
#include<stdlib.h>
void qsort(void *base, size_t n, size_t size,
int (*cmp)(const void *arg1, const void *arg2))
比較関数を作ってqsort関数を使うやり方と、
ファイルの容量を調べ方はわかりました。
ただ数字をソートするのはわかりますが、
ファイルの容量とファイル名を結びつけて、
考えるというのが難しいです。
連想配列みたいにすればよいのかと思ったのですが、
C言語に連想配列って無いみたいなんです。
よろしくお願いします。
0944デフォルトの名無しさん
2006/08/08(火) 04:56:48char *name;
unsigned long size;
} *file;
file->sizeで比較
0945デフォルトの名無しさん
2006/08/08(火) 05:02:28アドバイスありがとうございます。
初心者なのでちょっと心配な部分もありますが、
なんとなくわかりました。
がんばってみます。
0946デフォルトの名無しさん
2006/08/08(火) 07:36:22fopen >> fseek >> ftell >> fclose
0947デフォルトの名無しさん
2006/08/08(火) 17:40:18ポインタを使わなくてもいい場合というのはどういうときでしょうか。
0948デフォルトの名無しさん
2006/08/08(火) 19:02:530949デフォルトの名無しさん
2006/08/08(火) 22:40:27ポインタ使わないといけない場合の反対。
0951デフォルトの名無しさん
2006/08/09(水) 01:46:48もう少し具体的な質問をお願いします。
0952デフォルトの名無しさん
2006/08/09(水) 01:55:49#include <iostream>
#include <string>
int main()
{
std::string foo = "bar";
std::cout << foo;
return 0;
}
0953デフォルトの名無しさん
2006/08/09(水) 02:01:07ポインタ取っ払って直接インスタンス持つ様にできる状況を考えてみれ。
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もいらない。
0954デフォルトの名無しさん
2006/08/09(水) 05:47:53スタック上につくられてるからnewはいらないというのは、おかしな説明だな。
0955デフォルトの名無しさん
2006/08/10(木) 00:57:46ていうかまあ、>>949でFAなんだよな。
すまんかった。
0956デフォルトの名無しさん
2006/08/10(木) 12:09:39C/C++版のcpanみたいなサイトご存じないでしょうか。
0957デフォルトの名無しさん
2006/08/10(木) 22:57:02google code
0958デフォルトの名無しさん
2006/08/11(金) 02:01:08ありがとー。
さっそく見てみます。
0959デフォルトの名無しさん
2006/08/11(金) 11:02:38ちょっといじってサイズが4分の1になってびっくりした。
そろそろ自動で解決してくれよと思う。
0960デフォルトの名無しさん
2006/08/11(金) 11:44:41「ちょっといじって」が何のことかわからんが、大抵の場合は
規格に従う限り無理だろう。
0961デフォルトの名無しさん
2006/08/11(金) 14:37:16BYTE、char、boolなどを全部前方にまとめてみただけだけ。
詳しい規格は知らないけど単に2パスしてくれれば
いいような気もするが難しいのかな?
0962デフォルトの名無しさん
2006/08/11(金) 14:48:060963デフォルトの名無しさん
2006/08/11(金) 15:48:570964デフォルトの名無しさん
2006/08/11(金) 16:18:470965デフォルトの名無しさん
2006/08/11(金) 23:48:52既にメンバの並び順に依存した規定が標準として定められてしまっている。
互換性を考えると無理。
0966デフォルトの名無しさん
2006/08/12(土) 00:52:37まあ、今は昔の話だ罠
0967デフォルトの名無しさん
2006/08/12(土) 09:46:230968デフォルトの名無しさん
2006/08/18(金) 23:57:02コピーしている途中のデータにアクセスして、
リアルタイムでその容量を知ることってできますか?
その容量がわかると、
・現在何M中何Mです。
とか、速度を計算して
・後何秒で終わります
とかできそうなんですが。
よろしくお願いします。
0969デフォルトの名無しさん
2006/08/19(土) 00:04:14エクスプローラを見ていれば判ることですが、殆ど意味がありません。
そもそも、「書き込み中のファイル」は検出できるかもしれませんが
「読み込み中のファイル」を検出できないので無理です。
0970デフォルトの名無しさん
2006/08/19(土) 00:06:180971デフォルトの名無しさん
2006/08/19(土) 00:21:48恥ずかしすぎる
0972デフォルトの名無しさん
2006/08/21(月) 13:00:18>>970
ありがとうございます。
ネットの環境がなかったのでお礼遅れました。
CopyFileExで検索したら、msdnのページの
詳しい解説が出てきました。
質問ばかりで申し訳なんですが、疑問が出てきました。
自前でこういう関数は作れるんでしょうか?
「コピー中のファイルを検出して1秒ごとに表示」
というサンプル作ってみたんですが、
コピー中のファイル検出できましたが、
容量は毎回同じ"全部の容量"しか表示されませんでした。
たとえば、ファイル形式の変更(gif->jpgなど)、圧縮
符号化などのソフトをみると、作成中のファイルの容量を調べて
処理過程を表示させているような気がしてます。
よろしくお願いします。
0973デフォルトの名無しさん
2006/08/21(月) 13:24:050974デフォルトの名無しさん
2006/08/21(月) 13:48:100975デフォルトの名無しさん
2006/08/21(月) 14:10:01符号化先のリアルタイムの容量って
知ることできないの?
コピーしてる途中のファイルをdirコマンドで
見たら全部の容量が表示されたんだが。
処理系経過って普通のアプリについてるもんだから
スキルいらんと思うだが。
そういう俺はスキルないけどな!
0976デフォルトの名無しさん
2006/08/21(月) 14:19:26OSによっては、ディスクに書き出した時点でファイルサイズが決まるから経過は見えるけどバッファサイズ単位でしか増えないし。
0977デフォルトの名無しさん
2006/08/21(月) 15:49:20fread(buf, filesize / 100);
fwrite(buf)
printf("%d %%\n", i + 1);
}
0978デフォルトの名無しさん
2006/08/21(月) 18:27:20ありがとうございます。
freadってこういう風につかえるんですね。
調べて書いてみます。
0979デフォルトの名無しさん
2006/08/21(月) 18:35:020980デフォルトの名無しさん
2006/08/21(月) 18:43:31実際に作るなら、100分割とかにはしないで、最小コピーサイズで分割しろ。
1MBごととか、4MBごととかな。512bytesの倍数にしろよ。
0981デフォルトの名無しさん
2006/08/21(月) 19:20:22なんで?
バッファリングされているから何の意味もないと思うのだけど。
0982デフォルトの名無しさん
2006/08/21(月) 23:27:11何によってバッファリングされ、そしてそのサイズはいくつ?
0984デフォルトの名無しさん
2006/08/22(火) 01:27:08言ってること全体だと思われ。
そんなんに気を回さなきゃならんくらいなら、ファイルストリームの意味無いじゃんよう。
0985980
2006/08/22(火) 01:38:40そうかなー?CopyFileに肉薄するためには、何かを考えないといけないと思うんだけど。
小さく分けても、HDDの読み書き速度が20〜60MB/sだから意味ないし、
大きくしすぎても、メモリを圧迫する可能性があるし。
どこかに妥当な「最小コピーサイズ」があるとは思わない?
0986デフォルトの名無しさん
2006/08/22(火) 02:02:29妥当な最小コピーサイズは確かにあるだろうし、
具体的な数字の目処もある程度予想は着けられるかもしれないが、
アプローチの方向は根本的に間違ってるかと思われ。
それ以前の問題で>>977のfilesize/100は高確率で100バイトずれるバグをはらんでるはずだから
そのままじゃ受け入れられないけどさ…。
0988デフォルトの名無しさん
2006/08/22(火) 02:15:51俺の負けでいいです。
0989980
2006/08/22(火) 02:21:580990デフォルトの名無しさん
2006/08/22(火) 02:25:42ちゃんとチューンするなら、そりゃマストのアプローチです。
でもそれならfreadとかfwriteとか使わない。
俺はそう申し上げたかった。
0991980
2006/08/22(火) 02:32:54アーキテクチャの面もあると思うんだけど、話したくなさそうなのでもういい。
0992デフォルトの名無しさん
2006/08/22(火) 02:36:580993980
2006/08/22(火) 02:53:30OSのファイルキャッシュを汚染する/しないとか、HDDのシークを減らすとか、
ヒープを取り過ぎないようにするとか。
これらってアーキテクチャだと思うんですが、どうでもいいです。
0994デフォルトの名無しさん
2006/08/22(火) 02:58:12どうでもいいならレスすんな、馬鹿
0995デフォルトの名無しさん
2006/08/22(火) 03:10:52それは全然アーキテクチャじゃないと思われ…
アーキ語るなら、せめて内側のことと外側のことは分けて考えようぜ
な?
0996デフォルトの名無しさん
2006/08/22(火) 03:32:170997デフォルトの名無しさん
2006/08/22(火) 05:09:44アーキテクチャでしょ
0998デフォルトの名無しさん
2006/08/22(火) 09:22:04http://pc8.2ch.net/test/read.cgi/tech/1156206091/
0999デフォルトの名無しさん
2006/08/22(火) 10:26:12踏み台
1000デフォルトの名無しさん
2006/08/22(火) 10:28:0210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。