- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/
- 477 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:45:38 ]
- おま・・・。
せめてdo-while #define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0) で、ソレは俺も質問見たとき考えたけど、マクロの意味というか役割というかが変わってるから、 「なんでエラーメッセージをマクロにしたいのか」が分からないと使えるかどうか分からなかった。 個人的には、ストリングテーブル的に↓とかで十分かな、と思う。 #define ABC "ABCの時のメッセージ( %s )." (共通な文字列リテラルの切り出し。日本語版やら英語版やらを作るときに使う)
- 478 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:56:29 ]
- >>477
do whileハックを使わないといけないのは、古いコンパイラ。
- 479 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:33:37 ]
- >>478
それはすまない。俺の勉強不足のようだ。 ついては↓のコードがエラー無くコンパイル通るような 「新しいCコンパイラ」は何かを教えてくれないか? #include <stdio.h> #define macro(x) {puts(x);} int main() { if(1) macro("str1"); else macro("str2"); return 0; }
- 480 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:56:42 ]
- >>479
そういう{}のないif文は、コーディング規約で禁止。
- 481 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:00:58 ]
- マクロには;をつけないっていう選択肢はなし?
- 482 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:32:53 ]
- どう考えてもバグの原因になるだろ。
- 483 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:58:42 ]
- 小細工禁止!
マクロによる関数もどきはダメ。 インライン関数やテンプレート関数を使うべし。
- 484 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:06:06 ]
- コンパイルに5分かかるプログラムを作ったら一人前ですか
- 485 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:07:23 ]
- そうだねえ。
再帰テンプレートとか作ると簡単に5分超えるね。 練習にはいいんじゃない?
- 486 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:10:36 ]
- で、規約やら小細工やら良いんだけど
>do whileハックを使わないといけないのは、古いコンパイラ。 誰かコレを解説して貰えんか? コンパイラの新旧が、マクロを括るブロックにdo-whileを使うことと どう関係してんだ?
- 487 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:11:40 ]
- 勘弁してやれw 勘違いだろw
- 488 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:42:09 ]
- 制御文なしに中括弧だけを書くとエラーになるような古いコンパイラがあったんじゃないか。
- 489 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:31:08 ]
- >>475
それだとABC(data);って書いたら駄目だわなw #define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0) こうだな まあ受け売りだが てか一回sprintf経由する必要はあるの? #define ABC(i_code) printf("ABCの時のメッセージ( %d ).\n", i_code) これじゃ駄目なんかいな
- 490 名前:489 mailto:sage [2007/10/21(日) 20:33:43 ]
- やべ、俺リロードしなさすぎw
吊ってくるww
- 491 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:34:54 ]
- エラーメッセージを生成するのと、表示するのは、分離したほうがいいと思う。
- 492 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 10:50:35 ]
- つーか、元質はデバッグ出力関数に渡す引き数を生成したいんじゃないかな?
だとしたら、>475以下はダメだろう。
- 493 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:39:51 ]
- C言語に関して質問です。
構造体の各要素に添え字を使ってアクセスすることはできないのでしょうか? 例えば struct OBJ{ int x; int y; char c; char str[10]; }; main() { struct OBJ tmp; tmp.[0] ← xのこと tmp.[1] ← yのこと tmp.[2] ← cのこと tmp.[3] ← str[]のこと } といった感じのことがしたいのです。実現可能な方法があれば是非お願いします。
- 494 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:43:42 ]
- unionを使えば出来ないことはないけど、正直お勧めしない。
- 495 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:44:02 ]
- C++なら・・・無理か。
型もバラバラだしな。 添え字に変数を使って tmp.[i] ってしたとき、何型で扱うつもりなんだ
- 496 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:44:13 ]
- >>493
限定的にはunionを使えばできる。 ややこしくはなるがポインタをキャストしてもできる。 どちらにしろ、サイズの違う型を統一的には扱えない。
- 497 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:19:14 ]
- >>493
なんで、そんな変なことをしたいの?
- 498 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:22:08 ]
- テンプレートクラスでtemplate <Type T>のTにクラスを入れることが可能なのですか?
int型などを入れるメリットは分かるのですが具体的にどんなクラスを入れれば役に立つのか教えていただけないでしょうか?
- 499 名前:493 mailto:sage [2007/10/22(月) 20:29:47 ]
- 回答して下さった方々有難う御座います。
for文のインデックスを利用出来たらと思いました。 しかし型などが違うのでその都度場合わけをしないといけないので出来たとしても結局のところ手間は増えますね。
- 500 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:33:51 ]
- >>498
可能です。 STLのvector<T> はTの配列と置き換えられる動的な再配置も可能なクラスですが 当然組み込み型以外でもvectorを使うことが出来ます。
- 501 名前:デフォルトの名無しさん [2007/10/22(月) 21:15:25 ]
- float a;
a=1; print("%d",a); を実行すると 1072693248っていう数がでてくる。 これってどういうこと?
- 502 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 21:24:52 ]
- >>501
言語およびコンパイラは何? "%f" を使うべきである事は知っていて、なぜそうなるのかが知りたいということ?
- 503 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:53:01 ]
- >>501
printfの引数の2つ目以降の型って決まってないよね。 だから、printfにとっては、どんな型の値を引数に渡されたのか、わからない。 そのため、書式文字列に%dとあれば、intだと思って処理するわけ。
- 504 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:54:09 ]
- >>498
可能。 int型を入れるのと同じメリットが、stringクラスを入れるのにもあると思うのだが。 stringの配列なんて使う機会ないか? ないなら、まぁ仕方ない。
- 505 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:58:36 ]
- list<vector<string> >
とかな。
- 506 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:28:17 ]
- >>505
そんなこと、したことないぞ。 まず、stringのように重いものを、ポインタや参照ではなく値として持つvectorに格納するのが、乱暴だ。 次に、vector<string>を直にlistに格納するのも、乱暴だ。 vector<string>に何か意味があるのであれば、それなりのクラスにすべきだ。
- 507 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:35:45 ]
- 乱暴ってのが何を意味してるかわからんが、
別にstringは重くないしvector<string>も十分に速いぞ
- 508 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:36:17 ]
- あほすぎる・・・
- 509 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:46:20 ]
- >>506が何を言いたいのかワカンネ
乱暴ってどういう意味? vector<string>を使うなって言ってるの?
- 510 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:57:05 ]
- vector<string>を内包したオブジェクトつくって
インターフェースをきちんとしたオブジェクト指向な作り方しろってことか…。 C++だからって必ずオブジェクト指向で作らんでもいいだろ…
- 511 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:00:22 ]
- >>506は「そんなこと、したことないぞ」と言っている通り、思い込みで書き込んでいるんだよ。
- 512 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:02:01 ]
- vector<string> に何か意味をもたせるとして、所詮 vector 程度なら変数名で十分示せると思う。
vector<string> はオブジェクト指向だよ。
- 513 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:27:02 ]
- >>507
それは実装依存だな。 どーでもいい場所なら乱暴なコーディングをしても構わないし、すべきだろうが、 重くないとか十分に速いとか言ってるようじゃ、C++使う意味がないんじゃないか。 >>509 文字どおりさ。 動けば何でもいい、そういうやりかた。 >>510 何らかの意味があるのだからtypedefすべきだし、 大抵の場合は何か付随したデータがあるわけで、 それと本体のvector<string>を別管理するのは、 不適切だと思う。 >>512 オブジェクト志向と言いながら、 BASICやスクリプト言語のように、型にルーズでどうしようもない代物を作る人を、見てきたわけだが。 彼らは万能ナイフを作ることに喜びを感じているようだが。
- 514 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 08:58:30 ]
- ふ〜ん。君はそういう事に喜びを感じているんだね。
- 515 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:02:19 ]
- そこでboost::ptr_vector, ptr_list
内部ではvoid*として保持されているためコードサイズ膨張対策にもなる 重いオブジェクトのコンテナならこれで決まり☆
- 516 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:21:21 ]
- >>513 のやり方を推し進めたら、プログラム中に出てくる概念全部を
typedefなりクラス化なりすることになるな アホとしか思えん いちいち型を定義してたら型がむやみに大量発生するし、 そのせいでtypedefされた型の元の型がわからなくなって どういう操作ができるのかいちいち調べる羽目になる 名前の一覧は vector<string> names; で十分 過度の抽象化は毒であると知れ
- 517 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:44:09 ]
- >>516の書き込みをみて
VC++が頭をよぎった。 ふとよぎった。
- 518 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:50:52 ]
- >>513は早すぎる最適化をやっちゃうタイプだな
- 519 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:51:54 ]
- >>516
> 名前の一覧は vector<string> names; で十分 名前だけで単独なんだ・・・どういう場合?
- 520 名前:デフォルトの名無しさん [2007/10/23(火) 15:36:35 ]
- スイッチを押すと外部割り込みでInterrupt関数が呼び出されて、スイッチを押した回数を数えて変数countに保存し、
タイマ割り込みで一定時間ごとにTimer関数を呼んで押した回数ごとに行動を変えるプログラムを作りたいです。 グローバル変数を使う以外に二つの関数の間でcount変数の値を渡す方法はありますか?
- 521 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:04:40 ]
- つまり、二つの割り込み関数からそれぞれ設定と参照を行いたいわけだな。
グローバル変数の代わりに、それらの関数をメンバとして持つクラスを作ってそのメンバとしてcountを持てばいい。 勿論、そのクラスの生存期間に注意が必要。
- 522 名前:520 [2007/10/23(火) 16:23:07 ]
- せっかく回答してくれたのにすみません。
C++ではなくCで行う方法を教えてください。
- 523 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:37:47 ]
- >>520
設定も参照もどちらも割り込みルーチンから行なうのなら、 グローバル変数にしておくのが無難だがなぁ。 グローバル変数にしたくない理由は?
- 524 名前:デフォルトの名無しさん [2007/10/23(火) 16:44:44 ]
- メインで変数作ってポインタ渡せば?
グローバルと同じような物だけど
- 525 名前:520 [2007/10/23(火) 17:49:50 ]
- >>523
やはりグローバル変数がいいですか・・・。 プログラム作ってる途中でよくわからなくなることが多くて個人的にあまり好きじゃないだけです。
- 526 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:12:44 ]
- >>520
gccなら関数内関数で外側のローカル変数を参照出来るはず。 グローバル変数以上に問題のあるコードかもしれんが。
- 527 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 19:13:25 ]
- >>524
割り込み処理だと渡しようがないと思うんだ。
- 528 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/10/23(火) 21:52:40 ]
- >>520
>>525 1.割り込みマスク外した後ならsignal関数では? 2.共通の割り込みハンドラで割り込みを1箇所で受けられるかな?
- 529 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:25:37 ]
- ここで聞いてよいのかわからないのですが・・・
CPadてVistaでも使えるものなんでしょうか? とりあえず実行すると〜.exeが見つかりません〜てなエラーが出てきます。 これはOSとCPadとの相性が悪いのか、自分が何かミスを犯しているのか、どちらなのでしょう?
- 530 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:29:32 ]
- 調べてみたら自己解決できそうなので、自分で調べてみます。
- 531 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:32:45 ]
- 解決、スレ消費申し訳ありませんでした。
- 532 名前:デフォルトの名無しさん [2007/10/25(木) 16:20:24 ]
- VCでコントロール(仮にオリジナルのペイントソフト)を作成して
それをVB.NETから呼び出して、VBで作成したインターフェース内に埋め込みたいのですが VCで作ったものをDLLにまとめることくらいしか現在わかっていません。 何に対応(例えば継承させるクラス)させればよいのかなどおおまかに教えていただけないでしょうか?
- 533 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 16:23:09 ]
- VBのスレで聞いたら?
- 534 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 18:26:14 ]
- >>532
> 何に対応させればよいのか ↓ > コントロール 自分で書いていて気がつかないとは。
- 535 名前:デフォルトの名無しさん [2007/10/25(木) 19:31:24 ]
- ABのどっちが好き?
#include <iostream.h> void f(unsigned int u){ printf("%u", u); } main(int argc, char **argv){ unsigned int u = 0; if(argc > 1){ A u = static_cast<unsigned int>(atoi(argv[1])); B sscanf(static_cast<const char *>(argv[1]), "%u", &u); } f(u); }
- 536 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:32:55 ]
- lexical_cast<>
- 537 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:55:07 ]
- qa3457974
- 538 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 01:33:48 ]
- >>535
エラー処理してない点は同じなのでどちらも却下。 だ が 敢 え て 言 わ せ て も ら う if(1 < argc){ だと!
- 539 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 06:44:04 ]
- >>538
if(argc > 1) より if(1 < argc) の方がいい理由も添えて書いてくれ。
- 540 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:33:39 ]
- いまどきiostream.hって・・・
- 541 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:57:17 ]
- .h
- 542 名前:デフォルトの名無しさん [2007/10/26(金) 14:13:27 ]
- bf
- 543 名前:538 mailto:sage [2007/10/26(金) 17:15:12 ]
- >>539
半分冗談だったんだけどね(^^; 適当に流して欲しかったんだけど。 単に俺のスタイルなだけ。 例えば、『aが1よりおおきくて、かつ10より小さい』という命題について if(1 < a && a < 10) と書くと、常に右が大きくなるでしょ。 完全に主観だけど、あとでソースを見返すとき分かりやすいんですよ。 (数学の)実数線も右が大きいし、なんとなくそういうクセをつけました。 それだけ。
- 544 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:36:45 ]
- >>543
俺もそう書く 理由も同じ
- 545 名前:デフォルトの名無しさん [2007/10/26(金) 21:27:52 ]
- vectorは「動的配列」という事なのですが、
これは、 void init_vct() { vector< vector<int> > v; v.resize(3); for(int i=0; i<v.size(); ++i) v[i].resize(5); int array[] = { 0, 1, 2, 3, 4}; } int main() { init_vct(); return 0; } としたときに、init_vct()関数を抜けても、 int型配列 arrayと違って、vector< vector<int> >型配列 vは、 メモリ上から消されないということですか? //初歩的な質問で申し訳ありません。
- 546 名前:デフォルトの名無しさん [2007/10/26(金) 21:33:34 ]
- 消えるだろ ふつう
- 547 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:37:01 ]
- >>545
関数中のvはスコープから抜ける時デストラクタが呼ばれ、 確保された領域は開放される。 v.push_back(i)などで、どんどん追加でき、 サイズが動的に拡張されていく配列。
- 548 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:57:37 ]
- >>543
if( x==0xFF ) などと比較したいのに、誤って代入文 if( x=0xFF ) と 書いてしまう凡ミスを防ぐために変数を右に つまりif( 0xFF==x ) と 書くと良い みたいなことがドコカの本で書かれていた記憶がある
- 549 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:00:36 ]
- >>548
ぱっと見て「ヘタだなぁ」と思うコード その6 pc11.2ch.net/test/read.cgi/tech/1193250955/l50 ここで今、思いっきりその話になってます。
- 550 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 22:33:42 ]
- >>543
俺は『aが1よりおおき』いなら、 if(a > 1) と書くな。『1がa未満』なら逆に書くけど。 俺も一時期>>543と同じ書き方してたけど、 仕事でプログラム書き始めてからは仕様書通りに書く癖が付いた。
- 551 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:35:50 ]
- sscanf()はバッファオーバーフローがあるから
使ってはいけないんじゃなかったっけ? 普通atoi()だろ。
- 552 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 23:39:02 ]
- どちらでも仕様書どおりだよ。
- 553 名前:デフォルトの名無しさん [2007/10/26(金) 23:50:21 ]
- >>545です。
>>546さんありがとうございます。 以下のようなプログラムを書いたのですが、 正しく表示されるのはたまたまメモリに残っているせい? #include<iostream> #include<vector> using namespace std; class VEC{ private: public: vector< vector<int> > vec; VEC(int num); VEC(){}; }; VEC::VEC(int num) { vec.resize(3); for(int i=0; i<3; ++i) vec[i].resize(5); for(int i=0; i<vec.size(); ++i){ for(int j=0; j<vec[i].size(); ++j){ vec[i][j] = num+j; } num+=vec[i].size(); } }
- 554 名前:デフォルトの名無しさん [2007/10/26(金) 23:50:58 ]
- class A{
private: public: A(); void Show(); vector<VEC> v; }; A::A() { int j=0; for(int i=0; i<10; ++i){ v.push_back(VEC(j)); j+=10; } }
- 555 名前:デフォルトの名無しさん [2007/10/26(金) 23:51:55 ]
- void A::Show()
{ for(int i=0; i<v.size(); ++i){ for(int j=0; j<(v[i].vec.size()); ++j){ for(int k=0; k<(v[i].vec[j].size()); ++k){ cout << v[i].vec[j][k] << " "; } cout << endl; } cout << endl; } } int main() { A aa; aa.Show(); return 0; }
- 556 名前:デフォルトの名無しさん [2007/10/26(金) 23:52:44 ]
- >>553
関数抜けた時点で解放され、別の値に変わる可能性はある ゴミ箱の中身消したけど復活できるかどうかと同じ事だ
- 557 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:04:16 ]
- >>553-555
別にどこもおかしなようには見えないが、どこに問題があると思ってるの?
- 558 名前:デフォルトの名無しさん [2007/10/27(土) 00:49:51 ]
- >>545です。
>>546 >>547 >>556 さんのご指摘もありますが、 newで確保されていないvector配列の中身(vector< vector<int> > vec)が、 最後まで保持されていること・・・ についてです。 vecはクラスの中で宣言はされているものの、 VEC()で代入される中身は局所的なもので、 VEC()を出たらvec配列の中身は、開放されるのかなぁと。 サイトで「vectorは"動的"配列」というのを目にしたのですが、 これは配列のサイズを"動的"に確保するだけで、 newのメモリの"動的"確保とは別物なのではないか? と思ったので、試しています。
- 559 名前:デフォルトの名無しさん [2007/10/27(土) 00:51:53 ]
- >>545です。
かなりトンチンカンなこと言ってると思いますが、 ご指導お願いいたします。m(_ _)m
- 560 名前:デフォルトの名無しさん [2007/10/27(土) 00:57:53 ]
- >>559
クラス内の関数は、抜けても値は保持される 常識だろう vectorとか関係なし
- 561 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:59:15 ]
- >>559
基本的なことが、いくつも、理解できていない気配がする。 泥縄的に教えてもしょーがないので、ちゃんとC++の基本を勉強したほうがいいよ、としか言えない。
- 562 名前:デフォルトの名無しさん [2007/10/27(土) 00:59:20 ]
- オブジェクト指向っていうのは、データに対してあれこれ作業をするって事だ
あれこれ作業するごとにデータが消えていたら駄目だろ
- 563 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:00:16 ]
- v.push_back(VEC(j));
の VEC(j)はどこいっちゃったの? ってこと?
- 564 名前:デフォルトの名無しさん [2007/10/27(土) 01:20:13 ]
- >>545です。
みなさん、レスありがとうございます。 クラスの中でサイズを指定しないと配列の宣言てできませんよね。 もしコンストラクタの引数の値を配列のサイズにしたいときには、 データメンバに、 int a*; を入れて、 コンストラクタの中で、 a=new int[コンストラクタの引数の値]; と(私は)します。 だから、私はvector配列をクラスのデータメンバとするときも、 配列のサイズを指定しないから、 どこかでnewすることでvector配列の領域を確保しなければ ダメなのかぁと思ってしまったわけです。 newをせずに、ただ値を代入しただけでは、 局所な値を代入しているに過ぎないなどと思ってしまいました。 色々考えているうちに、頭の中がごちゃごちゃになってしまいました。 己の力の無さを改めて自覚しました。
- 565 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:31:07 ]
- >>564
vectorの中でnew/deleteしてる。
- 566 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:32:02 ]
- コンストラクタとデストラクタで何か表示するクラス作って
vectorにpush_backしてると何か閃くかもしれない
- 567 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:38:24 ]
- クソッタレな本に引っかかってしまった可哀想な犠牲者なんだろうな。
きちんとした本を読んでいれば間違わないような誤解してるんだもの。
- 568 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:50:13 ]
- これからプログラムを勉強する俺に是非教えてほしい。
ちょっとしたアプリケーションを作りたくて なんとなく、適当に参考書見て、高校の頃少し勉強した、デルファイに似てるような気がしたから VBの参考書買って、MSからVS2008bata2をダウンロードしてサンプルプログラムを作っては 自分なりに書き換えて違う結果を出力させたりと、少しずつ理解してきてる・・つもり。 けど、VBとC++はどのスレ見てもVBは糞ってよく見るんだけど、それはなぜですか? 自分は結構VBがなじんできてるしこの頃。。 実際、プログラムの組みやすさ、軽さ、ほか色々。 ここで聞くのはどうかと思うけど、できれば教えてほしい もし、VBはやめとけ!と言うならばお勧めの言語を教えていただきたい。
- 569 名前:デフォルトの名無しさん [2007/10/27(土) 01:54:18 ]
- すいません、教えていただけないでしょうか。
C言語で、2つのスレッドが交互にグローバル変数を参照→インクリメントして、 決められた値になったら終了する。という処理を作りました。 ここからグローバル変数を用いずにスレッド間でデータを渡しあうことで同様の処理を 実現したいのですが、どうすればいいでしょうか。 自分で調べたところ、スレッド間ではお互いのメッセージキューへ格納→読み出しを行えば データを渡せることがわかったのですが、見当違いな考えかもしれません…。 どのような方法・関数を用いればいいか、ご教授のほど宜しくお願いします。
- 570 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 01:59:25 ]
- OSぐらい書けよ
- 571 名前:デフォルトの名無しさん [2007/10/27(土) 02:02:14 ]
- >>570
申し訳ありませんでしたorz 作成環境は以下のとおりです。 OS:Windows XP コンパイラ:Microsoft Visual C++ 2005 Express Edition
- 572 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:03:22 ]
- VBが糞と言われる理由
1. VB自体ではなく、VB使いが糞であるため 2. VBでプログラミングを勉強すると糞になるため 3. VBが適切な手段の場合には良いが、そうではないのにVBを使う糞がたくさんいるから 4. VB.NETではないVBは既に終わっており、なおかつ、VB.NETをやるならC#をやるべきだから
- 573 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:05:35 ]
- >>569
質問が抽象的すぎる。 もっと具体的に詳しく。 また、なぜ、グローバル変数をやめようと考えているのか、その理由も。
- 574 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:16:09 ]
- ∧_∧ クワッ!
∩`iWi´∩ ヽ |m| .ノ |. ̄| U⌒U
- 575 名前:デフォルトの名無しさん [2007/10/27(土) 02:17:26 ]
- >>574
それ何か可愛いな。
- 576 名前:デフォルトの名無しさん [2007/10/27(土) 02:25:48 ]
- >>573
色々と足りない部分が多くて申し訳ありません。 初心者の為、処理が的確ではないかもしれませんが現在の処理は以下のとおりです。 unsigned __stdcall thread0(void *lpx) { /*排他制御にミューテックスを使っています*/ HANDLE hM; hM = *(HANDLE*)lpx; while ( 100 > nCnt ) { WaitForSingleObject( hM, INFINITE ); nCnt++; printf("nCnt = %d", nCnt); ReleaseMutex( hM ); } printf("thread0 END"); return 0; } これと同様の処理を行うスレッドがもう一つありまして、 交互にグローバル変数nCntをインクリメントして、100になったら終了させるようにします。 このnCntをグローバル変数ではなく、ローカル変数にしてスレッド間で値を渡し合うことで、 同様の処理ができるようにしてみたいのです。 グローバル変数を使わない理由ですが、現在C言語を勉強中で、 様々な処理方法を試してみたいと思ったからです。
- 577 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 02:33:47 ]
- そのスレッドに渡すlpxでミューテックスと一緒に共有したいデータを渡すとか。
struct thread_data { HANDLE hM; int nCnt; }; unsigned __stdcall thread0(void *lpx) { struct thread_data *data = lpx; /*排他制御にミューテックスを使っています*/ HANDLE hM; hM = data->hM; while ( 100 > data->nCnt ) 以下略
|

|