【初心者歓迎】C/C++室 Ver.24【環境依存OK】
げげっ24じゃなくて23だった。次スレも24でお願いしまつ。
>>4 スマソ。スレ立て初めてだったものですから・・・・・
まあいいんじゃないの別に? とりあえずぬるぽ、じゃなくて乙
_
ミ ∠_)
/
/ \\
ウイーン Γ/了 | |
ウイーン |.@| | | ガッガッガッ
| / | . 人
|/ | < >_Λ∩
_/ | //. V`Д´)/←
>>6 (_フ彡 /
8 :
デフォルトの名無しさん :2005/11/11(金) 16:58:11
課題 16−1 自己再生産プログラムを書いてください。これは、入力をとらず、実行すると自分の ソースコードを標準出力に書き出すプログラムです
お帰りください
宿題は宿題スレへ
1つのプロジェクトに複数のプログラムを入れるとコンパイルがうまくいかないのですが みなさんは1プロジェクトに1プログラムという形で行ってるんですか? 新しいプログラム作るのにいちいちプロジェクトも新しく作るのって面倒ですよね? ちなみにBCC Developerを使用しています
フォルダごとコピー
int input( double *xx ); void process( double *xx, int nn, double *ssum, double *mmax, double *mmin ); main(){ 略 n = input( x ); process( x, n, &sum, &max, &min ); avg = sum / n; 略 } int input(double *xx){ int i=0; while(scanf("%lf",xx+i)!=EOF){ i=i+1; } return i; } void process( double *xx, int nn, double *ssum, double *mmax, double *mmin){){ このプログラムが理解できません。 まず、scanfでEOFになるまで、データを読み込んでデータの個数iを main関数に返しますよね。 それからprocessの中で入力されたデータの合計を求めたいんですがどうしたらいいですか?
15 :
はる :2005/11/11(金) 22:27:17
void delay(unsigned int nMilliseconds) { #define CYCLES_PER_MS 260 unsigned long nCycles = nMilliseconds * CYCLES_PER_MS; while(nCycles--); } これがわかりません… 教えてください!!お願いします
なんつー無駄な
独習C++という本を呼んでいるのですが、コピーコンストラクタというのが いまいち理解できません。 なにかアドバイスいただけませんか
何がわからないのか書かなければアドバイスの仕様が無いだろ。 丸投げ厨は(・∀・)カエレ!!
すみませんいま納得できました。 脳みそ逝っちゃってたみたいです
Effecteive C++って読まなくちゃダメ?
内容全部知ってりゃ読まなくてもいい
>>20 初心者が読むにはいい本だな。
しなくていい間違いをおかさなくて済む。
内容知ってるってことは読んだってことだろ。
誰が内容知って言ってんの?
答えになってねぇなw
読んだけどつまんなかったよ マーフィーの法則みたいなもん
突然ですが質問しようとして質問の内容をサイトで確認してたら自己解決してしまいました またなにかあったら来ます
29 :
島野 :2005/11/12(土) 01:20:17
SN比の求め方がわかりません。 pgmファイルの求め方がわかりませんのでプログラムお願いします。 /* SN比*/ g = 0.0; f = 0.0; for (y = 0; y <= ysize ; y++){ for (x = 0; x <= xsize ; x++){ g = g + a[x][y] * a[x][y]; f = f + (a[x][y] - b[x][y]) * (a[x][y] - b[x][y]); } } h = 20 * log(sqrt(g/f)); printf(" %lf\n",h); exit(0); } まではわかります 急いでます
急いでいるからマルチしていいわけではない。
>>30 がどっかのスレで見かけたときに答えてあげればマルチも未然に防げたのにね
>>31 2分9秒で答えられたらな。
つか、両方投稿されたあとに見たんじゃ対処できねーべ?
そんな32さんに質問なんだけどさ、 #include<iostream> using namespace std; class A { int a; public: void seta(); } class B { int a; public: void seta(); } int main() { foo a; foo.seta(2); return 0; } ってソースがあったとして、これを3つ以上に分けるにはどうしたらいいですか?
Class AとClass Bとmain関数で分ければいいんじゃね? ていうか、コンパイルすら通らないし意味不明。
?
>>35 分けられますか?
コンパイルが通らないのはセミコロンがぬけちゃってるからですね
38 :
33 :2005/11/12(土) 03:02:40
自己解決しました。
39 :
デフォルトの名無しさん :2005/11/12(土) 03:04:45
#include<iostream> using namespace std; class A { int a; public: void seta(); } ; class B { int a; public: void seta(); } ; int main() { A a; A.seta(2); B a; B.seta(3); return 0; } こうですね。
40 :
デフォルトの名無しさん :2005/11/12(土) 03:07:25
こうだろ 馬鹿 #include<iostream> using namespace std; class A { int a; public: void seta(); } ; class B { int a; public: void seta(); } ; int main() { A a; a..seta(2); B b; b.seta(3); return 0; }
41 :
デフォルトの名無しさん :2005/11/12(土) 03:42:19
学校に通ってない初心者です。 独習でC++を学びたいと思っています。 C++を覚える前に、Cの基本的な事柄は覚えておこうと思い、「Cの絵本」を読みました。 が、別スレで、「C++を学びたいんなら、最初からC++を勉強するべき」「仏語を習う前に英語を習ったほうがいいですか?、ってな質問」と書いてありました。 初めからC++の本を読んだほうが良いのでしょうか? スタイルとしては、受験の時のように、最初に幹をおさえて、後は実際に手を動かす事で覚えて行きたいと思っています。 (幹:重要な情報) お勧めの本を教えていただけないでしょうか。 どうかお願いします。m(__)m
すみません、C++で数値をバイナリ出力したいんですけど、 ------------------ using namespace std; ofstream tmpout("tmp.out", ios::out | ios::binary); unsigned int tmpint = 256; unsigned char tmpchar = 32 ; tmpout << tmpint << tmpchar; ------------------ とするとtmpintの方がテキスト出力されます。 ぐぐったら cout.write((char*)&x, sizeof(x)); という例が載ってたのですが無理にキャストしてますよね。 このあたりはあきらめてこうしなければならないのでしょうか、 別にエレガントな方法があるのでしょうか。
>>41 推薦図書スレに逝け
テンプレに定番紹介サイトが出てる
C++の入門書は、読者がCを知っていることを前提したもの、全くの入門者を対象にしたものとある
それだけ気をつけて、後は自分で自分に合いそうなのを選べ
44 :
デフォルトの名無しさん :2005/11/12(土) 04:06:59
勉強し始めの初心者です。 CとC++では、アプリを作るにはどちらがベターなんでしょうか?
好きな方からはじめれ。
そんな・・・。 これからP2P関連のソフトが作れると有利かなと思ってるのですが、 CとC++、どちらがいいんでしょうか。 お願いします。
何に有利なんだいったい。 監獄に行くのに有利?
Σの計算を行いたいのですが、お約束というか定番のような書き方はありませんか?
んなもん気にせず好きに書け。
for文
>>42 operator<<()はもともと文字シーケンスに変換して出力するためのもの。
変換せず出力するにはwrite()を使う。
よって別の方法はない。
>>42 バイナリ出力クラスを作り、operator<<をオーバーロードして、その
クラスでラップすればバイナリで出力されるようにするとか。
いろんな型のオブジェクトを受け取るためにコンストラクタの数が膨大に
なりそうだが。
55 :
デフォルトの名無しさん :2005/11/12(土) 17:59:20
typedef struct { int a; int b; }UNKO; void swap(int &x,int &y) { x=y-x; y-=x; x+=y; } int main() { UNKO foo[2]; foo[0].a=1; foo[1].a=2; swap(foo[0].a,foo[1].a); cout<<foo[0].a<<foo[1].a; return 0; } これがなぜかうまくいきません。 なんで?
>>55 試してみたら21と表示されたんだが、何が不満なんだ?
>>55 swap()の中身をもっと素直に書けよ。ロジック間違ってるぞ。
>ロジック間違ってるぞ。 どこが?オーバーフローの危険があるって事?
60 :
58 :2005/11/12(土) 18:32:31
>>59 本当に分からんのだが。解説してくれないか?
>>55 だから、どうしたくて、どううまくいかないんだよ。
Cの前に、人とのコミュニケーションのとり方を学んだ方がいいぞ。
62 :
58 :2005/11/12(土) 18:35:10
63 :
61 :2005/11/12(土) 18:37:54
64 :
58 :2005/11/12(土) 18:40:29
65 :
デフォルトの名無しさん :2005/11/12(土) 18:46:04
for(int i=0;i<10;i++) swap(foo[rand%2].a,foo[rand%2].a); これがまずかったみたいです。
67 :
デフォルトの名無しさん :2005/11/12(土) 19:41:20
a→1←b 1-1=0ヒャッホウってことですか。さんkすう
68 :
デフォルトの名無しさん :2005/11/12(土) 19:44:19
void swap(int &x,int &y) { if(x!=y) { x=y-x; y-=x; x+=y; } } にしたらうまくいきすまた。ありがとう
69 :
42 :2005/11/13(日) 04:27:15
ありがとうございます。 結局無茶キャスト必要なんですね。
組み込み型に対して演算子をオーバーロードすることは可能でしょうか? たとえばint型の()演算子をオーバーロードして、 5(6) = 11; みたいなことはできないでしょうか?
無理。
そうですか。。。ありがとうございました。別の方法を考えます
>>70 最低限どこかにユーザー定義型が関わっている必要がある。
()演算子をオーバーロードする場合は左辺がユーザー定義型である必要があって、 最低限どこかにあれば良いわけではない。
そういう縛りがないと言語の形が変わってしまうからねぇ。
計算誤差が少なくなる
>>78 情報落ちを防ぐための常套手段だな
基本中の基本だから知っておくと吉
Σの計算ってどんな計算だっけ
総和 Σ[n=1→10]f(n)ならf(1)+f(2)+・・・+f(10)
あー、浮動少数点の話か。
>>81 普通のfor文
for(i=0;i<N;i++)
Σにもにたような引数あるっしょ?
operatorはどういった機能を持っているのですか? またどういう時に使えば良いのでしょうか。 ご教授下さい
本買え
>>85 単なるメンバ関数やん。
ただ、式に使う演算子と同じ位置に置けるので、何かと便利。
優先順位も同じ事に注意。
operator int()とかのメンバも作れるよ。 トラブルの元なので、非推奨だけど。 (std::stringがoperator const char *()を持っていないのも、そのため)
変数に_T( )って何のためにつけるのですか? ヘルプ読んでも意味がいまいちわかりません
何がわからないのかわかりません。
変数に_T( )って何のためにつけるのですか?
ヘルプに書いてあるとおりですが
このスレは何のためにあるんですか
あなたは何のために生きているんですか
質問に質問で答えるのは最低な行為です
自分で調べた方が早そうですのでもう結構です
意味不明な質問を超能力で見抜けない人は(質問に答えることは)難しい。 WindowsのUNICODE対応関係?
違う
いやまぁ、超能力者を目指すより 「それだけじゃ何が訊きたいかわからん。もっと詳しく書かんか!」 って補足要求するほうが御互いのためだけど。 そもそも”ヘルプ”って書いただけじゃ何のヘルプなんか誰も分からん。 まぁ、その程度のことも気がつかんレベルの質問者なわけだが。 VBからVCに移行したような人間は、開発環境と言語を分けて考えることが 出来ないので、この手の頓珍漢な質問をする嫌いがあるな。
えっと細かく質問書くのがめんどくさかっただけなんで ささっと答えが返ってくれば儲けもんってかんじですわ それ以上は最初から期待してないから。
首吊ればいいと思うよ(^o^)
_T()T
TCHARに対応したマクロだったと思うが
Cで可変個の動的引数を持つ関数内で、 関数にフォーマットと引数を可変個で渡してさらにその関数内でprintf にそれらを渡すにはどうすればいいですか? うまくいかなかったソースは以下です void Func(char *cpFormat, ...) { va_listargs; /* 引数を取得 */ va_start(args, cpFormat); /* 出力 */ printf(cpFormat, args); return; }
仮に呼び出し側はこんな感じで… int main() { Func("val = %d, str = %s", 10, "値"); return 0; }
printf→vprintfに汁
>>107 ありがとうございます!
ファイル出力もやりたかったんですがvfprintfていうのもあるんですね。
何とかなりそうです。どうもでした。
C++もWindowsもほとんどわかってないのにあるアプリの国際化関連に手を出して嵌まってしまいました。 SDLを使ったゲームです。元はLinuxですがWindows(一応98以上が動作対象)に移植されています。 使ってるライブラリはSDL(net,image.mixer,ttf)とstlportぐらいです。 ゲームデータは内部的にはUTF-8をstringで扱っているようです。 ファイルパスもUTF-8のまま渡すので、たまに特定の文字(日本語)を含むファイルパスが破壊されます。 linuxだと文字化けすることはあってもパスが書き換わってしまうことはないので問題ないのですが、Windowsだとどこかでぶっこわされるようです。 fstreamの生成の時に渡すファイルパスが正しいことは確認してあります。 ここで割り込んでCP932に変換してもいいのですが、できればUnicodeのまま渡したいのです。 前置きが長くなってしまいましたが、UTF-8で保持しているファイルパスを使ってWindowsのファイルを開くにはどうしたらよいのでしょうか? USC2に変換して*W系のAPIを使えばよいのでしょうか?その場合はハンドラをどのようにfstreamに結びつけたらよいのでしょうか? 9x系切り捨てちゃっても大丈夫です。 長くなってしまい申し訳ありませんが、どうかよろしくお願いします。
110 :
109 :2005/11/16(水) 20:12:01
ビルド環境としてはVS TheSpokeを使っています。MinGWでもビルドはできます。
>>109 コンストラクタでUTF-8の文字列を受け取ってUTF-16へ変換し、(ここまではコンストラクタでやるべきではないかもしれないが)
CreateFileWを呼びその戻り値のWindowsのハンドルを保持して、そこへ入出力するような
basic_i/o/iostreamとbasic_streambufの派生クラスを作る。
というのが(おそらく)C++のiostreamで想定されているやり方になると思う。
質問です。 LinuxでGCCつかってプログラム練習しているのですが、 WindowのGetTickCountの様にミリ秒で経過時間が分かる関数は無いでしょうか。
Bcc developer使ってるんですが、リダイレクションのやり方教えて下さい
int n; double x[1000]; double sum, max, min, avg; n = input( x ); int input(double *xx){ int i=0; while(scanf("%lf",xx+i)!=EOF){ i=i+1; } return i; } これってどういう計算をしてますか?配列xを確保して、input関数にとんで、int input(double *xx)のとこがよくわかりません *xxというのはポインタですよね?
115 :
デフォルトの名無しさん :2005/11/16(水) 23:29:59
8f10.6型のデータが書き込まれたテキストファイルから、 数値一つ一つを分けて読み込むにはどうすれば良いんでしょうか?
>>114 ポインタのあたりを勉強しなおせ。
scanf呼び出しの中のxx + iは結局&x[i]を意味することになる。
118 :
デフォルトの名無しさん :2005/11/17(木) 06:54:30
C++で起動させたDOSプロンプトに文字列を送りたいのですが、 よい関数はありませんか? sendMessageなど試したのですが、DOSプロンプトは受信しないので 無理でした。 よろしくお願いします。
>>118 Dosプロンプト?コンソールアプリのこと?
起動した後だと無理じゃね?
起動前ならShellExecuteから呼び出すときに引数に突っ込んでやればいいんじゃね?
C++でコンソールアプリケーションを起動し、そこに文字列を送り込み 反応によって動作を変えようと思ってます。 完成されたコンソールアプリケーションを外部から操作したいのですが、 C++上で処理することは可能でしょうか?
無理
無理
125 :
デフォルトの名無しさん :2005/11/17(木) 09:12:55
>>122 いいえ、
>>122 がバカなのです。
このことは、この先いくら待っても
>>122 の口から
「ではどうすれば可能か」の説明が出てこないことで
証明されることでしょう :-)
要は>120の解釈次第だね。 そのコンソールアプリが標準入力を受け取るようにできているのならpopen()すればいい話だし、 コマンドライン引き数で済むならもっと簡単。 しかし、そうでないならまず操作するのは無理って話だと思うけど。
説明不足ですみませんでした。 DOS版FTPのように、多少引数は取りますが、最初から入力待ちの状態です。 popen()というのを調べてみます。 一般的には、どのような方法が使われているのでしょうか?
>>128 さん
ありがとうございます。サクっと読んでみたところ
>>123 さんの
無名パイプの意味が分かってきました。
もっと簡単に操作できると思ったのですが、意外と複雑でびっくりです。
みなさん、ありがとうございました。
popen()が難しいと思うのならプログラミングなんか止めちまえ。
131 :
112 :2005/11/17(木) 10:46:14
>>117 うまくいきそうです、ありがとうございました。
132 :
109 :2005/11/17(木) 16:26:55
>>111 ありがとうございました。
C++のクラス関係よくわかってないのです。まあヘッダファイルでも追ってググりながらがんばります。
>>115 単純にやるならfscanfとか?
>>115 LinuxならCPUクロック取得できたはずだよ。
Linux タイマとかでググれば必ず出るはず。
gettimeofdayもその系統の関数だけど
FILE *fp;を使って計算txtファイルに出力したいのですが、リダイレクションでデータを入力した時はうまくいくのに、 手動で入力して、手動でEOFを入力した時はtxtファイルは生成されるんですが、中身がありません。 どうしたらいいでしょう? 略 FILE *fp; 略 n = input( x ); printf( "number of data=%d\n", n); printf( "sum=%f, max=%f, min=%f, avg=%f\n", sum, max, min, avg ); fp=fopen("result10-2.txt","wt"); fprintf(fp,"number of data=%d\n", n); fprintf(fp,"sum=%f, max=%f, min=%f, avg=%f\n", sum, max, min, avg ); fclose(fp); int input(double *xx){ int i=0; while(scanf("%lf",xx+i)!=EOF){ i=i+1; } return i; }
134 :
デフォルトの名無しさん :2005/11/17(木) 18:00:20
C++で相談です。 class Base { }; class Parent : public Base { }; class ChildA : public Parent { }; class ChildB : public Parent { }; class ChildC : public Base { }; という構成の時に、BaseクラスのポインタがChildA,ChildB,ChildCを 指し示している時に、これがParentから派生しているかどうかを 判定したいのです。 if(typeid(*base) == typeid(ChildA)) { } とするとChildAを指し示しているかどうかは判定できますが、Parentの 子クラスかどうかはどうやって判定すればいいのでしょうか。
>>134 Parent*にdynamic_castしてみるというのはどうか?
private継承はどうするの?
それぞれのクラスに識別フラグを用意しといたらいいだろ 1ビット目のフラグが立ってるときはParentからの派生で 2ビット目の(略
>>133 >printf( "number of data=%d\n", n);
ではなにが出力されている?
>>139 それは正しく自分の入力した個数だけ出ます
それじゃぁ問題ないはずだ。 ・実際にリダイレクトではOKで手入力ではNGのソースを貼る。 ・デバッガで動かしているなら、プログラムが終わったのを確認してからファイルを見る。 ・諦める。 お好きなのをどうぞ。
>>133 よくわからないけどバッファがフラッシュされてないんじゃね?
明示的にやるならfflush(FILE *fp)をfcloseの前に呼ぶ。
意味ない。
144 :
デフォルトの名無しさん :2005/11/17(木) 20:34:50
cinにstringが使えないのはなぜでしょうか? #include <iostream> using namespace std; int main() { string str; //char str[1327]; cin >> str; cout << str << endl; return 0; }
>>145 うまくいきました
ありがとうございます
このときに数字が1.00000 のように現れてしまうのはどうすれば直るでしょうか。 #include <stdio.h> int main(void) { printf("%f",1.0); printf("%f",2.0 - 1.0); return 0; }
そうなのですか。ありがとうございます。 小数点を第一位までしか表示しないようにするのは難しいのでしょうか。
おまえの使っている参考書はなんだ?相当初心者向けの書籍にも書いてあるぞ。 フォーマット指定子使えないならfputで十分じゃ。
巻末に載っていました、、がまったく使い方がわからないので きっとそのうちわかるようになるでしょう。 ありがとうございました〜
次のように画面に出力するソースコードを、 変数aの値を変数bに代入し、変数aに新しい値を代入することで作成したいのですが 下記のソースコードでは最初のaも2になっちゃうのですがどのようにすれば良いのでしょうか ----------- a=1 b=1 a=2 ----------- /* likemeet2 */ #include <stdio.h> int main(void) { int a; int b; a=1; b=a; a=2; printf("a=%d\n",a); printf("b=%d\n",b); printf("a=%d\n",a); return 0; }
う〜ん。。。ヒントが『aにもう1回代入すれば』とあったので 上記のコードを打ってみたのですが。。。 ごめんなさい無知なもので ><
>>155 つーか、変数ってのは箱だと考えるわけよ。
int a;
って書くと、aって名前の箱が用意されるわけよ。
printf("a=%d\n",a);
の直前で
a=2;
ってやってるから最初に描画される数字が2になっちゃうわけよ。
って考えるとどこで2をaにぶち込むべきか見えてくるんじゃないだろうか?
>>155 あ、重要な文が抜けてたw
箱っちゅーことはそこに入れたり出したりできるわけよ。
a = 1;
でaっちゅー箱に1を入れておく。
次に、
a = 2;
ってやると、aに入ってた1は破棄されて代わりに2が入るわけよ。
説明してて思うんだけど、 a=1; をいれてから、 a=2; をいれた時点でaに入ってた1が綺麗さっぱり消えちまうところが 箱って表現は駄目駄目なんだなw むぅー。どう説明したものか?w
>>156 なるほど〜では最初のaの値を出力してから
再度計算しなおしたものを出力するのですかね
下記のように修正すれば。。。
a=1;
b=a;
printf("a=%d\n",a);
printf("b=%d\n",b);
a=2;
printf("a=%d\n",a);
>>158 新しく中身を入れるとき(その例ではa = 2;を行うとき)には、
前に入っていたものは捨てられると表現してはどうでしょうか。
おぉ^0^できましたっ! ありがとうございます
>>160 そのびっくり箱を理解する前に変数理解してらw
またまた質問なのですが 演算子にて『¥』とは何を示すのでしょうか? 問題の説明不足かもですが。。
%dを表示させるためにはどうすればいいのでしょうか。 普通だと言語の一部になってエラーとなるのですが、 表示させる文字として認識させる方法。。
>>165 えとint型の変数aを使って、下記のように画面に出力するソースコードを書いてください。
という問題のヒントに(演算子『\』を使う)とあったので。。。
90min=1h30m
この二種類ってcharかint(文字コード?)かの違いはわかったのですが、 intの時getchar(a);putchar(a);にできなくて charの時gets(a);puts(a);のようにできるのですか? 逆もまた然り それからgets・putsの「s」は何の略ですか? char a[80]; gets(a); puts(a); _/_/_/_/_/_/_/ int a; a=getchar(); putchar(a);
170 :
デフォルトの名無しさん :2005/11/17(木) 23:57:59
こんばんわ。 アプリケーション自分自身を再起動する実装を行いたいのですが、 どうすればいいのでしょうか? もしくは他アプリケーションに監視させて、 監視先アプリが終了したことを感知して何秒後かに 再起動させる方法でもいいのですが、 監視アプリが受身じゃない為(メッセージを受け取らない)、 どうすればいいのかわかりません。 環境はVC++.NETです。 よろしくおねがいいたします。
>>164 >普通だと言語の一部になってエラーとなるのですが
%dは言語の一部ではない。printf関数の仕様だ。
>>170 A=アプリ, B=Aを起動するだけのプログラム
Aが終了する前にBを起動。
A終了。
BがAを起動する。
174 :
デフォルトの名無しさん :2005/11/18(金) 00:10:28
170です。 ご返答ありがとうございます。 再起動対象アプリはいつ終了するかわからない状態です。 173さんのご回答を実装したく思います。 プロセス監視というのはタスクマネージャを監視することでしょうか? A:再起動対象 B:監視 A→B起動(BはAのハンドルを取得) BはAのハンドルを用いて監視する?
>>169 文字を表すにはchar型で充分だが、それもやはり整数型なので暗黙の型変換などで
しばしばintとして扱われる。また、getchar()の戻り値は異常を示す必要があるために
intとなっている。gets()に渡しているのはcharではなく、charへのポインタであることにも注意。
gets()/puts()のsはstringのsだろう。
但し、gets()はfgets()に置き換えることを強く推奨する。
>>168 それはbasicの演算子ではないのかな?
>>175 すみません。。演算子にも色々あるのですね
まだ独学で勉強はじめたばかりで ><
>>174 プロセスが終了すると、そのプロセスハンドルはシグナル状態になる。
あとプロセスハンドルはプロセス固有なので、そのまま他プロセスに渡しても意味無いぞ。
>>176 独学はいいけど、一体君は何の勉強をしているのかね。
>>178 えと…C言語なるものですが(汗
本を読みながら、メモ帳とGCCというコンパイルソフト(?)で
実際に動かしてます ><
Windowsのプログラムで、 ウィンドウプロシージャやダイアログプロシージャで、 子ウィンドウ(コントロール)上にマウスが載ったときや、離れたとき、どのようなメッセージが送られて来るのですか? (MouseEnterとかMouseLeaveイベントのような) それともマウスが動くたびにコントロールのサイズ内かどうかを調べる他無いのでしょうか。
ここは馬鹿に個人授業するスレでつか?
>181 すみません 寝てました >< 秀和システムが発行している 『世界でいちばん簡単なC言語のe本』 著者:堀江 幸生 この本の90ページにある練習問題3 int型の変数aを使って、次のように画面に出力するソースコードを書いてください。 90min=1h30m ------------ 解答 #include <stdio.h> int main(void) { int a; a=90; printf("%dmin=%dh%dm\n",a,(a\60),(a%60)); return 0; }
もしかすると (a\60)は誤字で(a/60)が正しいのですかね(汗 正直何がわからないのかもわからず 書かれてることを鵜呑みにしちゃうので。。。申し訳ありません ><
うはぁ、すげぇ誤字だ。まぁ、斜線の傾きの違いだけといえば言えなくもないが。
>>斜線の傾きの違いだけといえば言えなくもないが。 すみません。ここですでに理解できないレベルでして。。。汗 傾きによる角度かなにかです?
なるほどぉ そっちでも金マーク入力できたのですね 丁寧にありがとです
これがわかりません。おねがいします。 >次のプログラムがどのような動作をするか考えましょう。 #include <stdio.h> int main(void) { int x, y, z; x = 2; y = 7; z = x >= y;←これがわかりません。x>=yは偽ですがそれでzはどうなるのですか? z = 4; x = y = y > これはまったく見当も。z;←y=y>zとはなんぞや。。 y++;←+1ですよね。 x--;←−1ですよね。 printf("x = %d, y = %d, z = %d\n", x, y, z); return 0; }
全部同じ奴か? 氏ねよ。 以降スルーでよろ。
193 :
191 :2005/11/18(金) 05:58:43
た、多分何かの誤解かと。。
たぶん私と間違えたんだろうね^^; んじゃ私のレベルが上記のコードと見解すると。。。。 >>int x, y, z; これってアリなの?便利でいいね いつも3行にしてたぁ^0^;
って途中でカキコしちゃった^−^; 実際に動作させてみたけど 9行目って >>x = y = y > これはまったく見当も。z;←y=y>zとはなんぞや。。 x = y = y > z; ってことでいいのかな? 結果は『x=0、y=2、z=4』となったよぉ^0^意味わからないけど(汗
てゆうか入門書ぐらい買えよ。
まぁどんな駄レスにもレスをつけない191に教える気は毛頭ないがな
198 :
191 :2005/11/18(金) 08:50:07
林晴比古某のを併読させてもらってるのですが、そこがわからなかったです。 x = y = y > z; のミスです。 以下のようにして地道に調べてみたのですが。。 その不等号が正であれば1で偽であれば0。 x = y = y>z; はxにyの値を代入。y>zは正。yは1。xは1。 という理解でいいのでしょうか? int x,y,z; x=2; y=7; printf("x = %d, y = %d, z = %d\n",x,y,z); z = x>=y; printf("z = x>=y 偽\n"); printf("x = %d, y = %d, z = %d\n",x,y,z); z = x<=y; printf("z = x<=y 正\n"); printf("x = %d, y = %d, z = %d\n",x,y,z); z = 4; printf("z = 4\n"); printf("x = %d, y = %d, z = %d\n",x,y,z); x = y = y>z; printf("x = y = y>z 正\n"); printf("x = %d, y = %d, z = %d\n",x,y,z); y++; printf("y++\n"); printf("x = %d, y = %d, z = %d\n",x,y,z); x--; printf("x--\n"); printf("x = %d, y = %d, z = %d\n",x,y,z); return 0; }
abcすら読めない奴に英語を教えるようなもんだな。
>>191 > z = x >= y;
z に式「x >= y」の値を代入。
式「x>=y」の値は、x>=y の真偽値で、真の時は1で偽の時は0。
> x = y = y > z;
x に式「y = y > z」の値を代入。
式「y = y > z」の値は、y に式「y > z」の値を格納した結果。
つまり、y に格納した値(式「y > z」の値)。
式「y > z」の値は、y > z の真偽値で、真の時は1で偽の時は0。
あーあ、これでまたabcから教えろって奴が寄ってくるぞ。
abcはわかります。更に自分でdefgまで学びました。 続きを教えてください!
204 :
191 :2005/11/18(金) 10:25:50
>>192 -
ありがとうございました。abcもわからない私共奴をどうか何卒宜しく。
日本語もわかってないようだね
質問です。 開発環境は、Microsoft Visual C++ .NETです。 class.group.method()のような記述方法を可能にしたく、 groupを構造体、methodをその構造体内の関数として以下のように宣言しました。 class Test { public: struct a { void b(); }a; }; void Test::a::b() { } これにより、以下のような記述でコンパイルは通りました。 void hoge() { Test tes; tes.a.b(); }
207 :
続き :2005/11/18(金) 11:48:03
しかし、問題がIntelliSenseで、tes.a.までタイプすると、 「. or -> の左側の式を理解できません」と言われ、メソッド一覧が機能してくれません。 (tes.ならば構造体の一覧が出てきます) これは、IntelliSenseのバグなのでしょうか? または、C++でクラス内の構造体の中に関数を置くことは言語仕様上イリーガルなのでしょうか? 他にも、良い方法がありましたら教えていただけると有り難いです。 以上です。よろしくおねがいいたします。
コンパイラよりもIntelliSenseを信用するのか……
>>207 VisualStudioの使い方につきスレ違い。該当スレへどうぞ。
210 :
デフォルトの名無しさん :2005/11/18(金) 11:58:10
>>208-209 レスポンスいただきありがとうございます。
IntelliSenseが狂うということは、言語的におかしい書き方をしたのかと不安になって質問した次第です。
えーと、この書き方は特に問題ないということでしょうか?
それなら良かったです。IntelliSenseについてはVSスレにて聞いてみます。
どうもありがとうございました。
>>206 構造体のタグ名と変数名がどっちも aなのは意味があるのか?
コンパイルは通るがあまり良くはないだろう。
IntelliSenseがとちるのはそのせいでは?
タグ名を変更するか省略するかしたほうが良いと思うが。
213 :
デフォルトの名無しさん :2005/11/18(金) 13:36:01
長方形の右上と左下の座標を取得して 面積の計算をしたいんですけど、どうすればいいですか? 宿題で出ちゃって分からないんです! オブジェクト指向って何・・・
>>213 それにどうオブジェクト指向が関係するかがわからん‥。
>>213 右上座標を(x1, y1)、左下座標を(x2, y2)とする。
このとき、面積はabs(x1 - x2) * abs(y1 - y2)となる。
尚、座標の取得の仕方については何ら情報が与えられていないので了解済みと仮定した。
このスレには教えたがりさんが多いでつね。
教えたがりっつ-か、皮肉屋な希ガス。
219 :
デフォルトの名無しさん :2005/11/18(金) 14:32:13
あと1時間でやらないとだめなんです??? 長方形がある。縦横の辺は垂直水平である。左下および右上の頂点座標を与えて長方形の面積をオブジェクト指向で計算せよって問題でした。
先生が生徒がまったくわからない宿題出すわけが無いだろ。 自業自得。
>>212 ビンゴでした!タグ名を変更したらきちんと一覧可能になりました!
タグ名については、最初タグ無しで書いていたのですが
関数宣言の際に、Test::a::b()とすると
error C2039: 'a' : 'Test' のメンバではありません。
と言われ、どうやらタグ名が実際には使用されるらしく(?)
タグ名に変数名を入れていたのです。
しかしこれが盲点だったのですね。(^^;
いやいや、やっとスッキリしました。どうもありがとうございました!
>オブジェクト指向で計算せよ >オブジェクト指向で計算せよ >オブジェクト指向で計算せよ 難しい問題だ。
質問です。 friend void Hoge(); でフレンド関数が friend class CTest; でフレンドクラスが設定できますが、 フレンドクラス関数というのは設定できないのでしょうか? イメージ的には friend class CTest.run(); といった感じに、クラスの特定の関数にだけフレンド設定したいのです。
>>224 friend void Hoge()に実装を書いて、
そいつをCTest::run()から呼べばいいじゃん。
確かにそれはそのとおりですが、なるべくならClass外を汚したくないものです。
>>224 friend void CTest::run();
>>227 それは試してダメだっ…
どうみても返り値をつけるのを忘れていたからエラーが出てただけです。
本当にありがとうございましたorz
型とか数はどうでもいいんですが、 例えば、int array[10]; と宣言してある場合に、arrayだけ書けばそれは配列のポインタでいいんですよね?
先頭要素へのポインタになる
プログラム自体全くの初心者で、卒論で使うためC++を勉強している者です。 Aクラスのprivateなデータメンバxに対して、Bクラスのある関数からアクセスしたいときに、 Aクラスに戻り値をxとしたxのgetterを作ってそれ経由でアクセスするのは何となく理解できたのですが xが構造体や配列である場合はどのようにしてアクセスすれば宜しいでしょうか? Aクラスのインスタンスが持つ座標や行列を構造体や配列で書いており、それをBクラスのインスタンスが取得したいです。 friendを使うとできそうなのですが、「friendの乱用はよくない」という記述を見かけたので・・・
void A::getter(x* value);とでもすればいいんじゃないかな
>>233 構造体は戻り値として返せる。(が、効率を考えるとconstな参照を返すのが良い)
配列は返せないが、配列の先頭要素へのポインタを返せばよい。(constならなお良い)
構造体やポインタを理解出来ないのならムリしてC++使わなくてもいいんじゃないの?
>227 うわっ、今の今までフレンドメンバ関数?はできないと思ってた。 何でそう刷り込まれていたんだろう?
あまり使い道がないからじゃない?
239 :
233 :2005/11/18(金) 23:43:33
レベルの低い質問にも関わらず
丁寧なアドバイスをいただきありがとうございました。
>>236 さん
教官の前に作った植物の成長シミュレーションモデルを改良しているのですが、
元のコードがC++なので足りない頭ながらも勉強中なのです。
240 :
デフォルトの名無しさん :2005/11/19(土) 00:16:53
>>236 最初は誰だって知らなくて勉強始めるもんだけどな。
オマイはこの世に生を受けた時からC++理解してたか?
241 :
デフォルトの名無しさん :2005/11/19(土) 00:21:49
>>241 そだよな
配列名はその配列の先頭要素へのポインタとして読みかえられる
FAQなんだがなぁ
2005で#includeするフォルダ指定どうやんの?
その話とC/C++とどういう関係があるのかね?
ポインタとアドレスの違いを理解してない奴が居るな
247 :
109 :2005/11/19(土) 01:10:19
時間が取れたので作業再開しているのですが、C++の継承がよくわかりません。 Javaみたいにもろにオーバーライドしてしまえるのかと思ったらそうではないようですね・・・ fstreamに_wfopenを使わせたいのですが、basic_filebufを継承(というより寄生)して template<class _Elem,class _Traits> class filebufw:public std::basic_filebuf { public: filebufw(){}; virtual ~filebufw(){}; filebufw *open_wide(const char *_filename,std::ios_base::openmode _Mode){ wchar_t _wbuf[600]; FILE *_fp; MultiByteToWideChar(CP_UTF8,MB_ERR_INVALID_CHARS,_filename,strlen(_filename)+1,_wbuf,sizeof(_wbuf)); if(_MODE && std::ios_base::in){ fp=_wfopen(_wbuf,L"rb"); }else{ fp=_wfopen(_wbuf,L"wb");} if(fp == NULL){ return 0 } basic_filebuf::_Init(_fp._Openfl); return this; }; }; みたいなの作ってこれとiostreamを継承させたクラスを作り、コンストラクタを適当に作ればいいのでしょうか? まあ長いファイルパス使われると死にますが、その辺はあとで対処する方向で。 VC .NETのテンプレートパックってるので移植性もへったくれもないですね・・・
>>246 ポインタとして使える≠ポインタ
って事が言いたいのか。
初心者スレだってのに。
なんか訂正する気がうせるほどのtypoが含まれていますね。 古いほうのやつをコピーしてしまったようです。スルーをおねがいします。
>>246 >>248 なにが言いたいのかいまいち分からんが、二人そろって変な勘違いしてる可能性が高そうだ
アドレス:メモリ上の番地 ポインタ:型を伴ったアドレス値 ポインタ変数:ポインタを入れる変数 なお、ポインタ変数のことをポインタと呼ぶ場合もある。 例えば、strcpyやmallocはポインタを返すが、ポインタ変数を返すわけではない。
>>252 その一連の処理を、必要なだけ繰り返せばいいのでは?
ちょっとお聞きしたいのですが、 findを使った文字検索で、一文字目に見つかったとき1じゃなくて 0って表示されるのはなぜなんですか? あと検索文字が半角スペースだとうまく検索できません。
>>255 wsprintf(str,"vpncmd\r\n");
WriteFile(hDupPipeP2CW,str,strlen(str),&dwByte,NULL);
wsprintf(str,"2\r\n");
WriteFile(hDupPipeP2CW,str,strlen(str),&dwByte,NULL);
とすると、vpncmdを実行され、終了したのち2が表示されます。
vpncmdを入力した直後のハンドル取得をできれば・・・と思ったのですが
方法が分かりませんでした。
>>257 wsprintf(str,"vpncmd\r\n2\r\n");ではだめか?
260 :
デフォルトの名無しさん :2005/11/19(土) 16:36:36
#include <cstdio>#include <cstdlib>#include <conio.h> #include <windows.h>#include <D3DX9.h> const float SPAN_X0=-1.0f;const float SPAN_Y0=-1.0f;const float SPAN_Z0=0.0f; const float SPAN_X1=1.0f;const float SPAN_Y1=1.0f;const float SPAN_Z1=1.0f; const int SPHERES=1; float g_fdelta=0.1f,g_fvoldelta=0.0f,g_fspr=0.75f; D3DXVECTOR3 g_vec3Sphere[SPHERES]; float g_fSphere[SPHERES][3]={{0.0f,0.0f,0.0f}}; float VolumeSphere(float r){return (4.0f/3.0f*D3DX_PI*r*r*r);} bool Contain(D3DXVECTOR3 vp,float vpr,int n){ vp-=g_vec3Sphere[n]; float f=D3DXVec3Length(&vp)-vpr; return (f<=g_fspr); }
261 :
デフォルトの名無しさん :2005/11/19(土) 16:37:25
int main(){ char ch; float vol,fr; int i; for(i=0;i<SPHERES;i++) g_vec3Sphere[i]=D3DXVECTOR3(g_fSphere[i][0],g_fSphere[i][1],g_fSphere[i][2]); D3DXVECTOR3 vp; printf("vol= %f\n",VolumeSphere(g_fspr)); do{ printf("delta="); scanf("%f",&g_fdelta); g_fvoldelta=g_fdelta*g_fdelta*g_fdelta; fr=g_fdelta/2.0f; //g_fvoldelta=VolumeSphere(fr); vol=0.0f; for(vp.z=SPAN_Z0;vp.z<=SPAN_Z1;vp.z+=g_fdelta){ for(vp.y=SPAN_Y0;vp.y<=SPAN_Y1;vp.y+=g_fdelta){ for(vp.x=SPAN_X0;vp.x<=SPAN_X1;vp.x+=g_fdelta){ if(Contain(vp,fr,0))vol+=g_fvoldelta; }}} printf("vol=%f\n",vol*2.0f);printf("Quit:q\n"); }while((ch=getch())!='q'&&ch!='Q'); return 0; } 上手くいきません。間違い教えてください。
263 :
260 :2005/11/19(土) 16:40:39
球を積分して体積を求めるプログラムです
要所要所で変数内の値を吐き出させたらどこが悪いのか分かるんで無い?
そうではなくて何がうまくいかないのか書けってことだろ?
268 :
260 :2005/11/19(土) 16:59:31
ええと、デルタを小さくすると体積に収束するはずなんですが、 どんどん小さくなっていきます。 ブレークポイントで見ても量が多くてよく分かりません。
269 :
デフォルトの名無しさん :2005/11/19(土) 17:02:07
小生、質問がござる。 ちとこちらのヘルプを見て下され。 ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.en/cpref8/html/T_System_Drawing_Image.htm このように画像にフィルターを掛けたいと思うのじゃが、サンプルプログラムが非常に遅い。 できれば画像を扱っているメモリに直接アクセスしたいのだが、 いかんせんGDI+での情報が見つからぬときたものじゃ。 如何にすればメモリアクセスが可能になるのか、知識のある方にご教授願う次第に候。
270 :
260 :2005/11/19(土) 17:05:22
g_fsprが球の半径 g_vec3Sphereが球の中心座標 です。
271 :
デフォルトの名無しさん :2005/11/19(土) 17:12:36
>>260 殿。
if(Contain(vp,fr,0))vol+=g_fvoldelta;
は半径fr中に入っていればvolに微小単位を累積加算する式と見受けたがよろしいかな?
frはfr=g_fdelta/2.0f; であり、デルタの値によって小さくなるので、
これでは正確な値は求められぬと思われる。
frを球の半径にしてみてはいかがでござるか。
272 :
260 :2005/11/19(土) 17:18:37
bool Contain(D3DXVECTOR3 vp,float vpr,int n){ vp-=g_vec3Sphere[n]; float f=D3DXVec3Length(&vp)-vpr; return (f<=g_fspr); //←ここで、現在位置が球の半径内なら真 } なんですが・・・
273 :
矢崎 :2005/11/19(土) 17:18:40
クリックを自動でやってくれるシステムを作れる方探しています。 私は愛知県名古屋市在住です。 報酬は100万円だします。 腕に自信のある方は連絡下さい。
274 :
>>273 :2005/11/19(土) 17:20:12
RoketMouseがござろう。もしくは百万円で人を雇うが吉。
>>269 ms-helpはローカルのアドレスだから張っても俺らは見れない。
URLから推測するにSystem::Drawing::Imageの話だと思うが,
BitmapクラスのオブジェクトならBitmap::LockBitsメソッドを使えばよい。
そうでない場合は知らない。
276 :
デフォルトの名無しさん :2005/11/19(土) 17:24:16
>>275 氏、かたじけない。
くっ、ms-helpはローカルでござった...申し訳ない。さんまの腹を切ってお詫び申す。
小生のプログラムでは、Bitmapクラスを利用して候。
LockBitsでござるか、なるほど、、、参考にさせ頂きまする。
うざいからその口調やめろ
278 :
デフォルトの名無しさん :2005/11/19(土) 17:36:33
(´ω`)ノ
友人がC/C++で組み込みの開発をしたいとのこと とりあえずEcpliseならC/C++のプラグイン入れればいいんじゃね? 的なこといっても??って感じでした。 おいらもやったことないから分かりませんが、 ・CPUは不明 ・RS485を使い他の聞きと通信を行う としたときに ・開発環境は何が一版良いでしょうか? ・参考となる図書はありますか? 現在進行形で自分でも探しています。 よろしくお願い暇す
>>279 なんで、詳しくも無い君が調べなきゃいけないの?
自分で調べさせれ。
組み込みなんてCPUが決まれば環境も大体決まる。
>>280 友達は全然しらないんです。
それで少し知っているおいらに聞いたんです。
CPUが決まれば環境も大体決まるとありますが、
なんか参考になるサイトがあったら教えてください。
そもそも環境を探す前にCPUを決めれ
たいていgccでクロスコムパイルじゃね?
284 :
デフォルトの名無しさん :2005/11/19(土) 17:50:45
>>260 自作プログラムで試したら、こうなりました。
[float型]
delta = 0.500000 , vol= 2.375000
delta = 0.250000 , vol= 3.171875
delta = 0.125000 , vol= 3.779297
delta = 0.062500 , vol= 3.974365
delta = 0.031250 , vol= 4.083832
delta = 0.015625 , vol= 4.138393
delta = 0.007813 , vol= 4.163671
delta = 0.003906 , vol= 1.000000
delta = 0.001953 , vol= 0.125000
[double型]
delta = 0.500000 , vol= 2.375000
delta = 0.250000 , vol= 3.171875
delta = 0.125000 , vol= 3.779297
delta = 0.062500 , vol= 3.974365
delta = 0.031250 , vol= 4.083832
delta = 0.015625 , vol= 4.138393
delta = 0.007813 , vol= 4.163671
delta = 0.003906 , vol= 4.176482
delta = 0.001953 , vol= 4.182632
285 :
sage :2005/11/19(土) 17:53:18
おそらく、微小単位g_fvoldeltaが 入力されたΔの3乗ですのでfloatで扱いきれない小さい数値に なったものと思われます。 #include <stdio.h> #include <stdlib.h> int main(){ double vol,r=1.0,g_fdelta,x,y,z; // float vol,r=1.0,g_fdelta,x,y,z; for(g_fdelta=0.5;g_fdelta>=0;g_fdelta/=2){ vol=0.0f; for(z=-1.0;z<=1.0;z+=g_fdelta){ for(y=-1.0;y<=1.0;y+=g_fdelta){ for(x=-1.0;x<=1.0;x+=g_fdelta){ if(r*r>x*x+y*y+z*z+g_fdelta/2.0)vol+=g_fdelta*g_fdelta*g_fdelta; }}} printf("delta = %9.6f , vol=%9.6f\n",g_fdelta , vol); }; return 0; }
286 :
260 :2005/11/19(土) 17:54:40
>>284 ありり。
floatじゃ丸められちゃうのかな。
求める球の半径はいくつでやりましたでしょうか?
287 :
260 :2005/11/19(土) 17:57:44
ごめん。リロードミスです。
>>281 知らないのに組み込みの開発?
頭狂ってんじゃねーのか
絶対狂ってますよ
>>288 C/C++をやる前は、知らないのにC/C++の開発?
頭狂っていたんだぁpgr
知らないなら、多少なりでも自分で調べるだろ、真っ先に○投げはしない。
わからなかったから聞いてるんだろ これ以降、下らない煽りは止めて下さい
プギャーm9(^д^)
295 :
279 :2005/11/19(土) 18:11:48
荒れてきてしまいましたな 一応自分でも軽く調べたけど分からなかったんです。 引き続きよろしくお願いします。
本人かどうかわからないが、 CPUがわからずに、どうやって環境探す気だよ。 ネタにしか見えないぞ。
297 :
デフォルトの名無しさん :2005/11/19(土) 18:15:18
ネタじゃありません。 Z80やH8でそんなに環境が違うものなんですか? どの辺りが異なるのか分かりません。
>>298 pcやプレステや家電が、全部同じ環境で開発できると思ってるのか?
ネタ決定
>>297 有難うございます。よさげな感じがしますね。
とりあえず、送ってみます。
いまさらながら、CPU毎にコンパイラが存在しますよね。
そこら辺を環境と皆さん呼んでいたんでしょうか。環境と一言で言われても大きすぎて良く分かりませんでした。
302 :
279 :2005/11/19(土) 18:20:30
>>299 はい。思っていました。だって知らないし。
>>302 CPUや開発環境を紹介してるサイトを一個も見てないって事だろ?
それで何を調べたと?
305 :
デフォルトの名無しさん :2005/11/19(土) 18:26:05
>>いまさらながら、CPU毎にコンパイラが存在しますよね。 CPU毎だったらセリロンとペンチウムで別のコンパイラが必要になるぞ。
アーキテクチャごとだよな。 中間言語に落としてアーキテクチャごとに最適化するコンパイラとかもあるけど。
307 :
297 :2005/11/19(土) 18:32:23
もういいよ お前に教えてたらいくらスレがあっても足らんよ
ということで、次の人どうぞ。
m9(^Д^)プギャー
なんでこのスレはこんなに厨が多いんだ?
312 :
デフォルトの名無しさん :2005/11/19(土) 20:31:30
セマフォをつかって、ある処理に関してロック、アンロックの処理が したい場合、ソースは以下のようなかんじ問題ないですか? ※以下のプログラムを2つ同時に動かした場合、 セマフォの開放は1つ目のプロセスによって行われているので、 2つ目のプロセスはIPC_RMIDの際に、エラーが出てしまいますよね。 これって、基本的にはどうするといいんですかね?
C言語と何の関係が?
314 :
デフォルトの名無しさん :2005/11/19(土) 20:32:38
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/sem.h> union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; }; int lock(int argc, char *argv[]) { union semun semaphore_union; struct sembuf semaphore_buffer; int semaphore_id; semaphore_id = semget((key_t)1000, 1, 0666 | IPC_CREAT); semaphore_union.val=1; //sem init if ( semctl(semaphore_id, 0, SETVAL, semaphore_union) != 0 ) { exit(1); } //lock semaphore_buffer.sem_num = 0; semaphore_buffer.sem_op = -1; semaphore_buffer.sem_flg = SEM_UNDO; if ( semop(semaphore_id, &semaphore_buffer, 1) == -1 ) { exit(1); } sleep(30) // 何かの処理の変わり //unlock semaphore_buffer.sem_num = 0; semaphore_buffer.sem_op = -1; semaphore_buffer.sem_flg = SEM_UNDO; if ( semop(semaphore_id, &semaphore_buffer, 1) == -1 ) { exit(1); } //sem end if ( semctl(semaphore_id, 0, IPC_RMID, semaphore_union) != 0 ) { exit(1); } return(0); }
315 :
デフォルトの名無しさん :2005/11/19(土) 20:34:36
//sem end if ( semctl(semaphore_id, 0, IPC_RMID, semaphore_union) != 0 ) { exit(1); } この際に、一つめのプロセスが既に削除しているので、 2つ目のプロセスでは、エラーが帰ってきてしまいます。 基本的にセマフォの扱いって、どう記述するものなんですか。
316 :
デフォルトの名無しさん :2005/11/19(土) 20:45:23
正しいやり方かはわからないが。 @プロセス1の処理が終わったら、セマフォに「プロセス1終わったよ」書き込む。 A「プロセス1終わったよ」になるまで待機してから、 「プロセス2も終わったよ」を書き込んでから、プロセス2を削除。 B「プロセス2も終わったよ」を確認してから、プロセス1を削除
317 :
315 :2005/11/19(土) 22:00:29
>>316 それぞれのプロセスをIPC_RMIDさせる直前までwait させろってことですよね。
そのケースは、事前に立ち上がるプロセス数(たとえば、自分で
fork して作成したプロセス)が分かっている場合、有効ですよね。
何個のプロセスがあがるか分からないときの手段としては、
IPC_RMID させる時は、手動で打つがいいのかな。
よく読んでないけどマルチスレッドスレで聞くべきじゃないのか?
int x[5]={1,2,3,4,5}; int y[5]; for文を使って配列xの並びを逆順にしたものを配列yにコピーするプログラムを書け。 これなんですけど、自分で考えても思い浮かばなかったので 質問させていただいたのですが、どうやってやればいいのでしょうか?
自分で考えても思い浮かばなかった≠何も考えてない 日本語は正しく使いましょう
おまえがなw
最初のうちは配列の長さの取得とか 添字の活用とか思いつかないもんだよ
コンソールから数値の入力するときってscanfは使わないのが普通というのは聞いたのですが、 ではgetsで文字列で取って、それを atoi とか atof で数値に変換するのが一般的なんですか?
fgetsで取得してsscanfで変換
getsはやばいです、バッファ・オーバーランっていう有名なバグ持ってます、 なので代わりにgetlineとかfgetsとか使います。
getline使うぐらいならscanf_s使え
329 :
324 :2005/11/20(日) 02:05:29
>>325-328 初歩的な質問にご親切にありがとうございます!
>>326 をよく読んでみます。今ローカルに必要そうなページを保存してます。
すいません、あとひとつ、fgetsを使う場合というのは
事前にファイルに必要な値を書いておいてファイルから読み込むということで
いいですか?
stdin
>>329 は最後に気付くだろう。そのページの一番下に「まとめてダウンロード」という言葉があることを・・・。
332 :
324 :2005/11/20(日) 02:18:33
>>330 stdinを引数に渡せば標準入力からインプットできるんですね。
知りませんでした。ありがとうございました。
>>331 いわれて気がついて笑ってしまいました。再度素直にそこから落としました。。orz
テキスト入力で istringstream ist(str); int i = 0; ist >> i; if(i){(略)} なんてやって先頭が数値かどうか判断、条件分岐ってやっていいですか。 なぜかデバッガで一行ずつ動かしてる時だけちゃんと動くプログラムになってしまって。 一応0の入力が無いという前提なんですけど。 atoi()使ったらちゃんと動くようになりました。
334 :
デフォルトの名無しさん :2005/11/20(日) 09:48:07
2005 ってwindows.hついてこないの?
>>327 >getsはやばいです、バッファ・オーバーランっていう有名なバグ持ってます
いいえ。
バグではありません。
Program File内を 検索しても引っかからない
>>337 2005のどのEditionなのかと。
Expressなら自分でPSDK入れろヴォケ。
ていうか、2005って何だよカス。
マジレスすると整数
整数にWindows.hがついてくるかって? 付いてくる訳ねーだおヴォケ!
つ【カルシウム+適度な睡眠】
どうせまたパスの設定が云々ってなるんだから、早く日本語版出せやヴォケ!
/ 冫─' ~  ̄´^- / /ヽ丿彡彡彡彡彡ヽヽ | 丿 Mr.Gates ミ | 彡 ____ ____ ミ/ ゝ_//|-=^=-|⌒|-=^=-|ヽゞ |tゝ \__/_ \__/ | | __________ ヽノ /\_/\ |ノ / ゝ /ヽ───‐ヽ / / うっせーよ、貧乏人ども /|ヽ ヽ──' / < / | \  ̄ / \ / ヽ ‐-  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
../../luna.lib ↑の ../../の意味何? ..フォルダってこと?
>>347 スレ違い甚だしい
回線切って首吊って氏ね
>>348 スレ違いじゃなくね?
>>347 それは現在のフォルダの上ってのを表す。
だから
../../luna.lib
だと
現在いるフォルダ(または基準となるフォルダ)の上の上のフォルダのluna.libを呼びまっせ。
って感じ。つまり、
c:/chinko/luna.lib
にluna.libがあったとして、基準となるフォルダがc:/chinko/unko/mankoだったら
そこからluna.libを使おうとしたらそうやってかかなければならない。
もちろん、c:/chinko/luna.libと書いても同じだがその場合はchinkoフォルダを丸ごと別の場所に
移動したらプログラムを書き変えなければならない。c:/chinchin/chinkoに移動したりしたときだ。
こうなると、ああ、相対パスで書いときゃよかったな。ってなる。
インクルードファイルやらリンク時のライブラリファイルならこの形の方が扱いは楽。
しかし、プログラム実行中だと基準のフォルダがどこになってるのかわからない
(原因のほとんどがPGが糞だからだが)からフルパスに直して使う場合が多い。
キーワード:相対パス、フルパス
で調べて勉強しる!
まちがえ キーワード:相対パス、絶対パス だ。 なんか前の職場の人間が相対パスは相対パスって呼ぶくせに 絶対パスはフルパスって呼ぶから俺もおかしなってきたw
fully qualified path だから別に間違ってないと思うが。
まちがい:まちがえ
thx いい勉強になった
>>349 言語仕様とファイルシステムには、なんの因果関係もない。
よってスレ違い。
そりゃ因果関係はないだろうが… すれ違いだというのは同意。
自分の親ウィンドウのクライアント座標で指定したウィンドウ(コントロール)の矩形を取得するのに、 MapWindowPointsを使うのが一番効率的なんですか?
どこの環境の話だよ
GetWindowRect
ライブラリが無いブラリ
クラスとともに暮らす。
>>359 スマンデス。win32。
>>360 GetWindowRectって、
スクリーン座標を取得するんですよね?
そこからその親ウィンドウのクライアント座標に変換するにはどのような方法が一番良さげですか?
ScreenToClient
366 :
デフォルトの名無しさん :2005/11/21(月) 06:10:50
/*素数を判定して約数を全て表示するプログラム*/ #include <stdio.h> int main(void) { int num,i; printf("数字を入力してください:"); scanf("%d", &num); for(i=2;i<(num/2)+1;i=i+1) if((num%i)==0) printf("%d ", i); return 0; } 独習Cでの問題です。 これでは入力された数字が素数であった場合は、そのまま終了してしまいます。 しかし、素数を入力したら、「素数です」と表示したいのですがどうしたら良いでしょうか? 自分で考えて作ってもどうも上手く行きません。よろしくお願いします。 CPad for Borland Ver.2.31を使用しています。
int yakusu_count=0; for(){ if(){printf("%d",i);yakusu_count++} } if(yakusu_count==0){printf("素敵です");} else{printf("%d個の約数がござる。にんにん",yakusu_count);}
にんにん ↑松井にしか見えん
369 :
デフォルトの名無しさん :2005/11/21(月) 06:52:07
>>367 すいません、for()やらif()ってのは自分の書いたものを突っ込むんでしょうか?
人様に質問するのも初めてで、どういう風に教えてくれているのか理解できません。
申し訳ないんですけど、
>>366 をコピペして足したものを書いていただけないでしょうか?
後々のためにも、
>>366 をコピペして足してもらった物と
>>367 の文を見比べて
>>367 のように教えてもらった時にどうすればいいかを理解したいので…。
簡単な質問な上に、めんどうな事を頼んで申し訳ないですが、なにとぞよろしくお願いします。
自分で考える気がまったくない人はお帰りください。
帰らない
>>369 >>366 のコードが自分でちゃんと理解できていて、その上で
>>367 のコードをよく読めば
どうしたらいいかわかるはずだよ。
わからないならまだ勉強が不足。人に頼る前にしっかりその本を読んで勉強しよう。
373 :
367 :2005/11/21(月) 07:02:32
>>371 は私ではありません。
>>370 さんの言ってる事もその通りだと思います。
本にも「理解できない所があっても最終的にはわかるだろうから飛ばせ」的な事もかいてる
ので、飛ばしても良いんですけどなんか気持ち悪くて…。
374 :
367 :2005/11/21(月) 07:07:02
>>372 そうですか…。
巻末にある回答を見ても
>>366 の通りで正解になっているので
ここは飛ばす事にします。
レスくれたみなさんありがとうございました。
それとスレ汚し失礼しました。
もうすこし修行してからお世話になろうとおもいます。
なんだ、結局
>>367 を理解する努力はしないわけか ┐(´д`)┌
近年稀に見る能力の無さだな
>>376 そうでもない、最近どのスレもこんな奴ばかり。
378 :
デフォルトの名無しさん :2005/11/21(月) 07:27:54
質問も糞も1回入門書のプログラムを通して打ってみようと思わないのか? こいつらは。 アホ、あまりにもアホ。 見込みないからプログラム組むの辞めちゃえよw
>>375 いや、for()やif()、"++"なんかも学んで無くて…
もちろん調べればいいんだろうけど、本の通りに順を追って学びたいなと。
もともと独習Cを持っていない人なんかだと、自分がどれくらいの事を理解しているか
わからないだろうから、知りたい答えは得られないかもと思いながらの質問でしたので。
私のような近年稀に見る能力の無い人間は順を追って学ぼうと思います。
上のは開き直りでは無くて素直に思っています。
もしかしてこういう独習Cを素直にクリアしていくような勉強法は問題ありますか?
もちろん勉強方法は人それぞれなので一概には言えないだろうけど
実体験を元にしたもので良いので参考程度に聞かせてください。
>>379 >いや、for()やif()、"++"なんかも学んで無くて…
マジレス
話にならない。
だったらこれを先に学ぶのが先だろ。
その本は持ってないが、その本が上記のことを理解しているのが前提なら、
上記のことから解説してる本なりサイトをさがす。
わからない所は、わかるまで調べる。
何時間、何日でも。
ほとんどの事は解決する上に、探しながら色々読んでるうちに+αの事まで身に付く。
安易に人に頼ると、その事しか解決しないから上達しない。
次もまた頼ることになる。
>>379 たぶん、あなたには「独習C」は難しすぎる
他のホントに入門者を対象にした本から始めた方が良さそうだ
>>380 そうですか。
始めて1日目なんですけど、始める前にどこだか忘れましたが
「理系の考え方」みたいな記事があって「分からない問題はとりあえず置いておく」
みたいな事が書いてあったんですよ。
なので短絡的に「わかんない所は飛ばしておくかー。」と考えていたんですけど
プログラムを学ぶ上では間違えてるみたいですね。
もう少し自分で努力する事にします。ありがとうございました。
>>381 本の帯に「Cを始めて学ぶのにこの本に出合えたのはラッキーだ」みたいな事が
書いてあったので信じて買いました。書籍スレでの評価も悪く無かったので。
もしかしたら自分には難しいかも知れませんが、今の段階では答えが皆目見当も付かないような
自体も無く、出されている問題には苦労しないので、もう少し頑張ってみようと思います。
アドバイスありがとうございました。
>>382 独習はその名の通り、分からないことは自分でとことん調べて理解できる奴だけを対象にしてる
お前には向いてない
俺は独習C++しか持ってないが、あれの問題は全てそれまでの章でやったor本を読む前提条件として
知っていることしか使われてなかった。
おそらく独習Cも同じだろうから制御構造使う問題なのに制御構造分からんとか話にならん
384 :
380 :2005/11/21(月) 08:01:04
>>382 だから、その本に読み飛ばしてもいいと書いてあって、
その本に合わせて学びたいなら読み飛ばせばいい。
読み進めて理解できるかも知れないし、できないかもしれない。
それは俺にはわからない。
でも、君は読み飛ばしたく無いんだろ?だったら別の何かで調べる必要があるでしょって言ってるの。
1日目って・・一日で全く何も知らない人が、
>>366 を理解できるようになると思ってるなら、
考え直したほうがいいかも。
はじめまして。C++を独学しているものですが質問です。 クラステンプレートを勉強しているのですが、リンクができなくて困っております。 //配列のテンプレートクラス(tarray.h) template <class Type> class TAry { private: Type *_ptr; public: Type& operator[]( int ); }; // tarray.cpp template <class Type> Type& TAry<Type>::operator[]( int i ) { return _ptr[i]; } // main.cpp int main( void ) { TAry<int> int_array( 10 ); // 10個のint型の要素をもつ配列 for ( int i = 0; i < 10; ++i ) { int_array[i] = i; } return 0; } ※コンストラクタなどは省略しました。 これらを別々にコンパイルすると、きちんとオブジェクトファイルができるのですが、 いざリンクとなるとoperator[]がみつからないとコンパイラに怒られてしまいます。 しかし、演算子の定義などをヘッダファイル内でおこなうと、きちんとリンクできます。 「プログラミング講義C++」で勉強しているのですが、 テンプレートの使い方が間違っているのでしょうか? 何かわかるかた、よろしくおねがいします。 環境はg++3.4.4, VC++.net の両方でためしましたが、やはり同じエラーでした。
>>382 なんと言われようと理解できるまでやります。高かったし。
>>384 えっと
>>366 の問題は「素数を入力して約数を表示するプログラムを作れ」って問題なんです。
だから問題自体は出来たんですけど、「これじゃ素数渡された時わかりにくいじゃん」って思って
聞いてみたんです。
だからもう少し進めばやり方が理解できるような問題が出るんじゃないかと思ってます。
質問の意図は、「自分が学んだ範囲内で出来る事を出来なかったらやり直そう」って事なんですよ。
つまり、自分が学んで無いものを必要とするんであれば別に問題ないんです。
途中でも書いたように、独習Cを読んでいる人に聞いたほうが良かったですね。
質問するスレを間違えたと認識しています。
>>385 大半のコンパイラはテンプレートクラスの実装をヘッダに書かないとビルドできません。
(TAry<int>とTAry<short>はオブジェクトファイル上では別々の実体を持つ)
リアルじゃ決して見れない低脳に巡りあえるのが2chの楽しみの一つだな また来るがよろし
駄目な奴は何をやっても駄目
理解はしなくていいから納得しろ。
>>387 早速のレスありがとうございます。
tarray.cppだけをコンパイルした時点では、
クラスの実体ができていないということですね。
その後しらべたところ、宣言と実装を分離したい場合は、
exportキーワードを使用すればいいみたいですが、
これ自体を実装した処理系はないみたいですねw
で、別の策としてはtarray.cpp内で
template class TAry<int>;
template class TAry<short>;
といった風に実体を作ってしまえばおけみたいですね。
でも、これだとテンプレートのありがたみが減ってしまう気が・・・。
やはりヘッダ内で実装してしまうのが、いいんですかね?
なんか、ヘッダ内で実装するのに違和感を覚えてしまいまつ。うーん。
>>392 その違和感は正常な感覚だよ。
でもしょうがない。
コンパイラ(またはコンパイラ実装者)の気持ちになってあげると納得いくんだけどね。
>>393 レスどもです。
コンパイラの気持ちになってw考えてみたところ以前よりはすっきりしました。
別個にコンパイルした場合は、クラスもメンバ関数もインスタンス化されてないから、
できあがったオブジェクトファイルをみても、該当する関数がなく、
コンパイラに怒られたわけですね。
それを回避するために明示的に.cpp内でインスタンス化すれば、
クラスやメンバ関数の実体ができる。そして、それらがコンパイルされ、
できあがったオブジェクトファイルを
参照すれば該当する関数があるわけで、おっけーなわけですな。
または、ヘッダファイル内で実装されていれば、それをインクルードすることで
クラスやメンバ関数をインスタンス化することができると。だから、呼び出すことも
できると。
聞く前よりもかなりすっきりしました。
ありがとうございました!
(間違えてたら指摘してもらえるとうれぴいです)
exportをサポートしたコンパイラが実際に開発されたときは禿もびっくりしたそうな
>>386 #include <stdio.h>
int main(void)
{
int num,i,a,yakusuu_count=0;
printf("数字を入力してください:");
scanf("%d", &num);
for(i=2;i<(num/2)+1;i=i+1)
if((num%i)==0){ printf("%d ", i);
yakusuu_count=yakusuu_count+1; /*yakusuu_count++でも同じ*/
}
if(yakusuu_count==0)
printf("素数です。");
return 0;
}
独学で始めて3日だが
>>367 を見て考えたらこんな感じになった。
要するに約数をカウントする変数を作ればいいって事を言ってんじゃない?
一日でそこまでできたなら、もう一日あればここまでわかると思うよ。
>>365 ありがとう。
まんまな名前でつねw
>>382 確か内容が高度だという話を聞いたような。
同じ初心者という立場から言わせてもらうと、
はじめからやるならば、理解するかどうかよりも、さほど高度ではない本やらサイトやらを用いて、
取りあえず順々はじめからコードを打っていく(コピーするのではない)のが有効だと思う。
やさしいC とか、猫でもわかるC言語プログラミング あたりが良いのではないかな(題名的に"わかりやすい"事をウリにしているもの)。
ちなみに私は猫でも分かる〜を使っていますが、結構わかりやすいですよ。
これらの本は良く読む必要があって、流し読みには向いていないハズ。
"理解する"よりも"感じる"方が近いかもしれない(アレじゃないけど)
とりあえず、いったん"関数"の概念が解説されているところまで読んでみ。
そこまでたどり着けないのならば、使用している本があなたに向いていないのだと思う(なんにしろ相性はある)
基本中の基本をじっくり解説するタイプのものに乗り換えてみては。
その後、今あなたの持っている本をもう一度読めば、面白いぐらいに理解できると思う。
そしてその発展を読み進めることで消して無駄にはならない。
ttp://www.amazon.co.jp/exec/obidos/search-handle-form/250-0280339-8469069 アマゾン、C言語関連の本の売れている順番。
もちろん入門書以外も混じっているから要注意。
398 :
397 :2005/11/22(火) 00:19:10
>>366 ちなみにamazonのレビューですが、
>初心者にはお勧めできない。だけど、入門書で一通り学んだものの自信が無いという人が必要に応じて読み返すには非常によいと思う。
>レベルは、まったくCを勉強したことがない人にはきついかもしれません。実際僕も「やさしいC」というものをやってこれをやってちょうどよかったと思ってます。
>まず最初に、この本を勉強する前に簡単なC言語の入門書みたいなやつをやっておくことをオススメします。
などなど、入門書には使えないことがしっかりかかれているではないですか(笑)
入門書の次に読む本、ということでしょうね。 いずれ必要になるものですよ。
やはり入門書を買っておいた方がよいのでは。
C++のことについて質問なんですが Personというクラスを生成する時に関数内で Person Eric; とした場合インスタンスはスタックに作られて Person* Eric; Eric = new Person; とした場合インスタンスはヒープに作られるといった考えでいいんでしょうか?
>>400 いい。
一応、newで作られるインスタンスが割り当てられる場所は
「フリーストア」と呼ぶことになってるらしいが。
sleep(0)ってUNIX上のプログラムでも効果ありますか?
試してみればよかと
マニュアル読めよ。
//[2.h]//////////////////////////////////////////////////////// //(重複読み込み防止は省略) class hoge{ std::string name; public: void setName(char *); std::string& getName(void); }; //[2.cpp]//////////////////////////////////////////////////////// #include "2.h" void hoge::setName(char *str){ this->name=str; } // ←inline化不可…? std::string& hoge::getName(void){ return this->name; } // ←inline化不可…? //[1.cpp]//////////////////////////////////////////////////////// #include <iostream> #include "2.h" int main(void) { hoge hoge; hoge.setName("林晴比古"); std::cout << "私は" << hoge.getName() << "です。" << std::endl; return 0; } //////////////////////////////////////////////////////////////// 例えば上のようなプログラムを作ってビルドした場合、 hoge::setName()やhoge::getName()をinline指定すると、VC7では以下のエラーがでます。 1.obj : error LNK2019: 未解決の外部シンボル "public: class std::basic_string<cha r,struct std::char_traits<char>,class std::allocator<char> > & __thiscall hoge:: getName(void)" (?getName@hoge@@QAEAAV?$basic_string@DU?$char_traits@D@std@@V?$al locator@D@2@@std@@XZ) が関数 _main で参照されました。 なぜinline化できないんでしょうか…?
inline化は、コンパイル単位で完結するため、1.cppから2.cppの関数が見つからない。 2.cppではなく、2.hに実装を書けばいい。
408 :
デフォルトの名無しさん :2005/11/23(水) 01:44:04
プログラミング言語C++(ソフトバンクパブリッシング)を 見て打ち込んでどうしても分からない点があります。 P317と318のlist13-1と13-2(カウンタクラスのヘッダと利用部。 実行すると1から5までカウントアップしたあと 3までカウントダウンするプログラム)を打ち込んで 一字一句セミコロン等の間違いもコンパイルエラーも無いのですが、 実行すると0の無限ループで本の通りにカウントアップ・ダウンになりません。 本の内容を知っている方にお願いいたします。
>>407 速レスありがとうございました。解決しました。
ただ、実装をヘッダに書くのに抵抗あるんですが、これは仕方ないですよね…。
>410 それとは違うんじゃない? 余計なinlineを書かなければ通るわけだし。 inline化は完全にコンパイル時の問題なんだから、目の届くところに書くのは当然。
ソートするプログラム課題を作成中なのですが、 WindowsのAPIは使うな、と言われてます。どういう意味でしょうか。
>>412 意味はそのままだろ。
理由は課題を出した奴しかわからない。
>>412 どういう意味も何も自分でソートする関数を作れってことだろ。
今度卒論のなかでFFTによる1/fノイズのプログラムが必要になったんですが、 先生に「まずはノイズを表示することからやってみろ」といわれました。 いったいどうやって表示すればよいのか・・・わからないんです。 なにかWEBでいい例とか良い本とかあったりしますかね? 使用しているのはVisual C++ .NET 2003です
>>415 今さらそのレベルの質問かよ。それで卒論書けんのかよ。
418 :
415 :2005/11/23(水) 07:54:56
即レスはありがたいが・・・ そのレベルじゃ書けないから焦ってるんだって。 まあ、また本屋いくしかないか。 この場合は信号処理の方の本ですかね?
>>418 正直な話、教授に参考書を聞きに行ったほうがいいぞ。
教授が嫌なら修士とか博士の連中に聞きにいけ。
下手な本を掴むとただの時間の無駄になるからな。
421 :
415 :2005/11/23(水) 08:15:36
分かったッス。 なんとかやってみますわ〜
>>406 ,407
2.hの宣言部と2.cppの実装部、両方にinline書いちまえよ
バレた
>>412 #include <Windows.h>するなとほぼ同義だと思えばよい。
つかCってなんの役に立つの・・・ 独習C読んで基本的なことは理解できるけど、 なんに使うのかイマイチ。
大多数のGameや周辺機器ドライバや、あとxyzzyも Cで書かれていますが。
>>426 はプログラミング言語を学んでも自分には使い道がないことに気が付いたと言いたいんだよ
習う方向が逆だと大抵が駄目になっちまうんだよな。 だいたいは、たまたまサンプルソースがC言語でかかれていてそれをみるために C言語覚えるとかそういう流れなんだが、 学校の教科にC言語があるからC言語で書いてみるってのはどっかおかしくなっちまうんだよな。 言語の入門書なんて何千冊よんだって何に使うかなんてどこにも書いてない。 これは当然のことだ。
ってか、
>>426 が求めているのはHSPみたいなやつって落ちでしょ
つか
>>426 ってなんの役に立つの・・・
>>426 のレス読んで基本的なことは理解できるけど、
なんに使えるのかイマイチ。
なんかのAPIの知識がなければCの標準ライブラリで出来ることなんて 何もないようにおもえるわな。ウインドウ1個も出せないんだし。 それが気に入らない奴はjavaでもやってろ。ケッ
コンソールアプリなんか作るとへんなメモリ制限あるしね。
>>434 それってC/C++の問題って言うより、処理系の問題なんじゃね?
んだんだ
>>435 いや、だから、やっぱWindows上ではじめは作ってみるもんじゃん?
そのままWinMainもいじらないでC言語の入門書の延長で
何かできること考えたらその辺にぶち当たるじゃん。
>>437 そもそもメモリ制限ってなんだ?
ばかでかい配列を宣言できないとかか?それなら確か何かの
コンパイルオプションで回避できたはずだが
>>437 コンソールだけでも相当のことは出来るんだがな。
Windowsにおけるコンソールアプリケーションってのは、
デフォルトでコンソールを持ってるというだけの差しかないと言うことは置いておくとしても。
いや、ウィンドウズのコンソールアプリってエミュで しか動いてないと思ってたけどちがうんかな(特にXPとか) で、なんか使っていいメモリも設定によって制限なかったっけ?
それはWin32コンソールアプリではなくDOSアプリ。
コンソールアプリを作るとDOSアプリになる時代もあったのかもしれない。 でも、今のVCが生成するコンソールアプリは32bitのwindowsアプリケーションです。 mainとWinMainじゃ引数の形式が違うのでそのへんの変換とかコンソールとの接続を確認したりとかそういった操作をし、そのあとでmainを呼び出すようなWinMainを勝手につけてくれるだけだったような。 うろ覚えなので間違ってたらすまぬ。
443 :
442 :2005/11/24(木) 03:51:40
ごめんよ。書き込んでから気になったので調べたらちがったぽ。 どこでこんなことを覚えてしまったのだろう・・・。
>>443 以前(Win98時代)にVC6で作ったコンソールアプリをWindows起動前に実行させようとしたら動かなくて、
LISC試食版でコンパイルしたら動いた。
ってことがあって、
>>442 みたいな事をしてるんだろうなと思っていたんだけど違うの?
>>444 だからVC6もWin32コンソールアプリを作るからDOS上(Windows起動前)では動けない。
>>444 そりゃカーネル立ち上がる前にWin32アプリが実行できるわけがない。
Win98のDOSはブート時に使ってるだけ。(MeはDOS非使用)
>>447 ダウト。
より隠れただけでMeも起動時にDOSを使っているのは間違いない。
ぶっちゃけどうでもいい
そうやって興味を持つ姿勢をないがしろにしているから 君は成長しないのだよ。
ふーん
必要になったらオベンキョしましょ
PC/AT互換機は起動するときには必ず最初に16bitリアルモードで起動する。
EFIでもそうなんか?
455 :
デフォルトの名無しさん :2005/11/26(土) 14:48:27
質問です。XP、.NET です。 あるダイアログを管理するクラス CHogeDialog を作っています。 ダイアログのコールバック HDProc 関数をメンバ関数にするため、static 宣言にしました。 しかし、CreateDialog では、コールバック関数に値を渡す場所がないため、this ポインタを渡すことができず、 static な HDProc 内ではメンバにアクセスしようにも、インスタンスのポインタを取得することができません。 そこで、SetProp を用いて、ハンドルとオブジェクトを結びつける方法を学んだのですが、 結び付けを行えるのは、CreateDialog が完了した後です。 HDProc が WM_INITDIALOG で呼ばれたときには、まだ結びつけが行われておらず、 オブジェクトのポインタを取得できません。 そのため、WM_INITDIALOG で呼び出されたときの処理において、 メンバにアクセスすることができません。 何か解決方法はないでしょうか。 よろしくお願いします。
>>455 DialogBox/CreateDialogの代わりにDialogBoxParam/CreateDialogParamを使う。
457 :
455 :2005/11/26(土) 15:06:30
質問させてください。いま、Linux上で任意のウィンドウのスクリーンキャプチャを連続で行う簡単なプログラムを書こうと思い、以下のように書きLinuxに用意されているコマンドxwdを呼び出すようにしました。 popen("xwd -name \"xxx\" -nobdrs -silent -out test.xwd ","w"); /* xxxは任意のウィンドウネーム */ これをループさせていこうと思ったのですが、ファイル名を変更できないので上書きされてしまいます。なので、ループごとに変数をインクリメントし、その数値をファイル名にしたいと思うのですがどうすればよいでしょうか?
Cでやる必要ないような...
CreateProcess()でプログラムが終了するまで次の処理を待つように しているのですが、 リダイレクトしようとしても、実行されません。 if( !CreateProcess( NULL, "C:\\Program Files\\Microsoft Baseline Security Analyzer 2\\mbsacli.exe > results.xml", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) ) どうすれば、リダイレクトされるのでしょうか?
>>461 CMD.EXEを通さないとだめなんじゃない?
Win32APIスレへどうぞ
cmdの後に、手入力でパスを打ち込むとなんとかいけました。 残りはwin32APIスレにいてきますorz
465 :
デフォルトの名無しさん :2005/11/27(日) 23:04:28
質問です。XP、.NET です。 あるグローバル変数の値を、常にあるダイアログに表示させたい場合、どのような方法が効果的でしょうか。 例えばダイアログのエディットコントロールに値を表示する場合、 変数の値を更新するたびに Edit_SetText を呼ぶわけにはいきません。 WM_PAINT を受け取るたびに表示しても、ダイアログに触らない限り表示が更新されません。 WM_TIMER を利用して定期的に更新するしかないでしょうか。 それとも、ある変数の値が更新されたときに呼ばれるメッセージなどを定義することができるのでしょうか。 よろしくお願いします。
>>465 > 変数の値を更新するたびに Edit_SetText を呼ぶ
> ある変数の値が更新されたときに呼ばれるメッセージ
同じことな希ガス
467 :
465 :2005/11/27(日) 23:14:42
>>466 前者は手動、後者は自動ってつもりで書きました。
イメージとしては、前者は、変数の値を変更する全ての箇所で Edit_SetText を呼びだし、
後者は、監視する変数のアドレスを登録すると、
そのアドレスの中身が変更されるたびに自動的にメッセージが飛ぶ、って感じです。
>>467 SetterとGetterを作ればいい話では。
クラスでカプセル化してもいいし
>>465 >変数の値を更新するたびに Edit_SetText を呼ぶわけにはいきません。
ダイアログのエディットコントロールってEdit_SetTextで更新されないんだっけ?
470 :
465 :2005/11/27(日) 23:35:13
>>469 更新されます。
変数の値を変更する全ての箇所に Edit_SetText を記述するわけには行かない、という意味でかきました。
>>468 の方法しかなさそうですか。
申し訳ないながら、使用用途を書くのを失念していました。
デバッグウィンドウのようなものを作る予定でした。
汎用的に使えるものは無理そうですので、
>>468 の方法で、今回チェックしたいものに特化したものを作ることにします。
後出しで申し訳ありません。
ありがとうございました。
変数をpublicになんておいておくからそういう事態になるわけだな。 これにこりたら変数はprivateにおいてsetとget関数を作るようにするんだ。
数値計算した結果をグラフィックにする手段としてはどんな物がよく使われているのでしょうか? xlibですか?
自分の都合にあった方法。
Excel
グローバル変数の定義を一つのファイルにまとめられるように Cプログラミング専門課程を参考にして //GlobalDefine.h #ifdef MAIN #define GLOBAL #else #define GLOBAL extern #endif GLOBAL int hoge; というファイルを作ったのですが 二つのファイル(一つはインクルードする前にMAINを#defineして)からこのファイルをインクルード すると二重定義になっているとコンパイラに言われてしまいます・・・ どこがまちがっているのでしょうか?
二つのファイルで二重定義にしているところが間違っている。
>>475 先にMAINをdefineするソースがコンパイルされてしまうと、
後からGlobalDefine.hをincludeするソースでもdefineされていることになるから
その類のことをやりたいならば
#ifdef MAIN
#define GLOBAL
#undef MAIN
#else
・・・
のようにマクロ定義を消してやる必要がある。
それ以前に、普通はそんなややこしいことせずに
Global.h
extern int hoge;
Global.cpp
int hoge;
のようにすりゃいい話。
478 :
475 :2005/11/29(火) 00:04:25
>>477 二つのファイルに分けるといいんですね。ありがとうございました
あと
「先にMAINをdefineするソースがコンパイルされてしまうと、
後からGlobalDefine.hをincludeするソースでもdefineされていることになる」
の部分について質問なんですが
#includeの場合ソースファイルごとに行われる
#defineの場合一つのソースファイルで定義をしたら他の全てのソースでも定義したことになる
という考えでいいんでしょうか?
>>475 >グローバル変数の定義を一つのファイルにまとめられるように
デスマーチに自ら突入する君の勇気に乾杯!
それってー、すべてのcppに#includeする気だろ?
グローバル変数が定義してあるヘッダファイルはマスターヘッダになって
それに1つ変数を追加するとフルビルドがはじまるんだよな。
俺のこれまでの経験で最高記録は10000行のマスターヘッダだ。
フルビルドに40分かかるすさまじい環境だったw
バグってもすべてのcppで#includeされてるもんだから原因の特定にかなりの時間がかかる。
また、マスターヘッダにすべて定義してあるから、責任の分配もないので、
これもバグったときの原因の特定に時間がかかる。
仕事でやれと言われたからしょうがなくやるのか・・・、
その組み方しか知らないからとりあえずやってみるのか・・・。
いずれにしろその組み方が極上の糞であることは知っておかなければならない。
それはわかった上での行動だろうな?
「Cプログラミング専門課程」
テンプレートクラス内で頻繁に使用されるデータ型を、 テンプレートクラス内でtypedefすることは出来ないのでしょうか? 例えば以下のようなケースなのですが、 /////////////////////////////////////////////////// template <class T> class hoge { typedef std::deque<T *> hoge_list; // ←(1) 型の宣言 private: hoge_list list; public: hoge_list& getList(void); void addList(T *); }; template <class T> hoge_list& hoge<T>::getList(void){return this->list;} // ←(2) template <class T> void hoge<T>::addList(T *ptr){this->list.push_back(ptr);} int main(void) { hoge<std::string> ihoge; ihoge.addList( new std::string("あいうえお") ); return 0; } /////////////////////////////////////////////////// クラスの宣言部の(1)で行っている型の宣言は、できればグローバルで 宣言したいものの、未定義の型Tを含むのでクラスの外では宣言できませんよね…? かといって、このままでは(2)の部分で構文エラーが出てしまいます。 どうすれば宜しいのでしょうか。よろしくお願いいたします。
>>481 template <class T>
hoge<T>::hoge_list& hoge<T>::getList(){return this->list;}
とするのが普通だと思う。
483 :
482 :2005/11/29(火) 22:22:33
hoge_listはpublicで定義することにした上で。
>>483 getListがhogeのメンバだからhoge_listがhoge内でprivateだったとしても問題ないよ。
すみません、処理系を書いていませんでした。
VC7を使用しています。
>>482 ,483
教わったとおりに、型の前にクラススコープを付けてみたのですが、
(2)における構文エラーは消えず、新しく以下の警告が加わりました。
warning C4346: 依存名は型ではありません。
型を指定するには、'typename'を含むプレフィックスを使用してください。
そこで以下のように修正してみたところ、コンパイルが通りました。
template <class T>
typename hoge<T>::hoge_list& hoge<T>::getList(void){
return this->list;
}
なぜこれで上手くいくのか良く分かりませんが…。
C++の仕様は複雑ですね…。
レスありがとうございました。
>>484 逆に、publicで型宣言すれば、クラスの外部からも
その型を指定可能になるということですよね。
とりあえずはpublicにしておくことにします。
ありがとうございました。
487 :
奈々 ◆Xl6OTFSLJ2 :2005/11/30(水) 11:14:54
BCC5.5.1を使ってインポートライブラリを作りたいのですが、上手くいきません。
一番分かりやすいサイトを参考にしました。→
ttp://www6.plala.or.jp/mnagaku/cmag/ac20005/ *.dllの作成、そこから*.libの作成までは上手くいきました。
しかし、最終的にライブラリを呼び出すプログラムをコンパイルしようとするとエラーが出ます。
エラーの内容は、「外部シンボル 'DLL内の関数名' が未解決 (なんたら.OBJが参照)」です。
問題箇所が分かる方、よろしくお願いします。
//DLLのソース
#include <stdio.h>
extern "C" __declspec(dllexport) int Test(char *buf){
printf("Aさん「%s」",buf);
return 0;
}
//ヘッダファイル
int Test(char *);
//呼び出すプログラム
#include <stdio.h>
#pragma comment(lib,"test.lib")
#include "test.h"
int main(){
char a[256]="テストです。";
Test(a);
return 0;
}
>>487 //ヘッダファイル
extern "C" __declspec(dllexport) int Test(char *);
待て待て。そのヘッダファイルがtest.hなら、 呼び出すほうからも__declspec(dllexport)になってまずくないか?
windows XPはflockをサポートしてるそうですが、flockを使うにはどうすればいいのでしょうか? windows XP,Platform SDK,bcc32です。
//--------------------------------------------------------------------------- #include <iostream> #include <fstream> //--------------------------------------------------------------------------- typedef unsigned char uchar; using namespace std; struct finish{}; //--------------------------------------------------------------------------- uchar getByte(ifstream &ifs) { if(!ifs) throw finish(); uchar out; ifs.read(reinterpret_cast<uchar *>(&out), sizeof(uchar)); //out = static_cast<uchar>(ifs.get()); //bug return out; } //--------------------------------------------------------------------------- すみません。 これはプログラムの一部ですけど、 //bugの行のコメントをはずすと動作が不定になるみたいなんですけど、 どこがおかしいですか。
>>492 istream::get()が返すのがint_typeだからではないだろうか?
sprintfみたい事したい時に cout.write(lpBuf, 0) << nLine << "文字列 : " << nErrorNum << endl; こんな使い方していいもんなんですか?
つーかSTLスレ行けや?
>>494 もちろんいいさ。そういう使い方もできるように作られているんだから。
>>495 何ゆえ?
498 :
492 :2005/12/04(日) 02:23:23
>493 ども。 int_typeってintと違うのかなと思ったんですけど普通はintっぽいですし、 intの変数に格納してからキャストしても結局ダメで。 結局C++では引数なしget()は使うべきではないのかなと。 引数ありget()だと大丈夫でしたし。 でも引数なしget()はCのget()と基本的に同じって書いてあったから それだとC時代だとどうなってるんだということに。 バイナリでは一字読み取りでもread()の方が無難ですか。 ちなみにgetByteはプログラム中で使ってなくても動作は不定みたいです。 不定って怖いですね。
>>498 引数なしget()がint_typeを返すのはEOF(istream::traits_type::eof)を返すことがあるため。
だからchar型にする前にEOFかどうか調べろ。
>>498 動作が不定って、何のことを言ってるの?
プログラムで使ってないなら、それは getByte() の動作とは関係ないんじゃないの?
501 :
デフォルトの名無しさん :2005/12/04(日) 22:58:32
>>475 GLOBAL int hoge = 0;
みたいに初期化してるところがあるのでは。
>>479 > フルビルドに40分かかる
別にすさまじいとは思わんが、
スコープはちゃんと考えよう、な。
502 :
498 :2005/12/05(月) 03:19:06
>499 EOFはif(!ifs)で代用してたつもりでした。 ただ、intの変数に格納したあとキャストしてもダメだったんでチェックしてもあまり変わらないような気がします。 確かめないと何とも言えません。 というかそれで大丈夫だったらショックなんですけど。 >500 具体的に言いますと1Byteずつ入力してたのがいきなりアドレスが飛んだり CodeGuardは違法なメモリアクセスみたいに言ってる。 件の行をコメント化するだけで解決するので原因はそこだと思うのですけど。 あからさまに挙動がおかしいのでちゃんと書いてるように見えても動作が不定になるような事を書いてるのかなと思ったのです。 不定は何が起きてもおかしくないと言われてますし。 ただ、CodeGuardが実際に文句を言うのは出力の時です。
CodeGuardって適当だから
>>502 アクセス違反の原因は、
大抵はエラーが起こった箇所とは違う場所にある。
506 :
505 :2005/12/05(月) 16:05:49
>>505 他板で解決しました。ご協力頂いた方申し訳ありません。
死ね
std::stringの最初の一文字だけを表示と二文字目以降の文字列を表示ということをやりたいのですが これってどうやるんですか?
>>508 std::string s = "hoge";
std::cout << s[0] << std::endl;
std::cout << s.c_str() + 1 << std::endl;
>>509 あ、なるほど。よくわかりました。
どうもありがとうございました。
511 :
498 :2005/12/06(火) 02:42:48
全体的なソース出さないとあれなんで問題が起こる範囲でまとめてみました。 これでおかしい所がありますか? //--------------------------------------------------------------------------- #include <iostream> #include <fstream> //--------------------------------------------------------------------------- typedef unsigned char uchar; using namespace std; struct finish{}; //--------------------------------------------------------------------------- uchar getByte(ifstream &ifs) { int out; out = ifs.get(); if(out == EOF) throw finish(); return out; } //--------------------------------------------------------------------------- int main(int argc, char **argv){ if(argc != 2) return 1; ofstream output(argv[1]); if(!output) return 1; output << "hoehoe" << endl; return 0; } //---------------------------------------------------------------------------
>>511 getByteがどこからも使われていない。
>>512 使われてるさ。
君のこころの中で。
アマーイ!アマイヨアマスギルヨ!マルデ〜略〜グライアマイヨ!
>>513 残念だが俺の心の中身はどれも1Byte如きで表せるようなものではないのさ。
515 :
515 :2005/12/06(火) 23:26:46
環境:winXP+Cygwin やりたいこと:ある数字が連続的に100回表示される間にカーソルキーを使って その数字を1ずつ変更(増減させる)することです。 cursesを使うとできるかと考えて、以下のようなプログラムを書いてみたのですが、 カーソルキーを打たないと次に進まないプログラムになってしまいました。 アドバイスをいただけないでしょうか?
516 :
515 :2005/12/06(火) 23:27:20
#include <stdio.h> #include <curses.h> int main() { initscr(); noecho(); cbreak(); keypad(stdscr, TRUE); int j, ch; double x; x = 1; for (j=0; j < 100; j++) { while (j < 100) { ch = getch(); switch (ch) { case KEY_LEFT: x -= 1; break; case KEY_RIGHT: x += 1; break; default: break; } break; } printf("%f \r\n", x); } exit(0); echo(); endwin(); }
getch関数使ったらブロッキングされるだろ
処理系によっては、 int a = 5 / 2の時にaは2であったり3であったりするらしいですが、 どんな処理系でも2になるようにするにはどうしたらいいんでしょ?
3返す処理系なんてあるのか‥‥(゚д゚)コワー
>>518 整数型同士の除算の結果は必ず切捨てされる。
問題は負の数が含まれているときにどうなるかが実装依存。
しかしそのときもdiv/ldivなどでは0方向への切捨てと決まっているのでこれを使えばよい。
さらにC99では除算演算子の挙動もdivなどと同じ挙動へ修正された。
5/2が3になるのは規格違反だろ
どうしても、小数点以下の処理を気にせず計算したいなら剰余を減算してから除算しろ
Visual C++ 6.0で、Cを勉強中なんですが helpの設定をどうしたら良いのか良くわからないんです レジストリをいじる様なのは分かるのですが、どうすれば 良いんでしょうか。MSDNライブラリを買うべきでしょうか。 どなたか、助言お願いいたします。
>>523 何を言ってるかさっぱり分からないので、さようなら。
526 :
523 :2005/12/08(木) 20:37:43
申し訳ないです スレちがいだったんすね
527 :
523 :2005/12/08(木) 20:49:52
ところで、教えて欲しいのですが 以下の文でファイル操作を勉強してるところ #include <stdio.h> int main() { char str[] = "abcd"; int count ; for (count = 0 ; str[count] != 0 ; count++) { fputc(str[count] , stdout); } return 0; } のstr[count] != 0での判定が、理解出来ないです。 0以外の値が入ったらfor文終了という文と思ってるんですが 最初のstr[0]の時点で0以外が入ってるとおもうのですが なぜ、コンパイル可能なのでしょうか、教えてください
>>527 str[count] == 0 で for終了です。間違えないよう。
それと、文法的には間違いないので、コンパイルと動作は別。
>>527 話にならない。
思ってるんじゃなくて、確認しろや。
むしろ何故コンパイル不可能だと思うのかがわからない 適当な入門書を買って一から勉強したほうが早そうだ
入門書も読まずに、人に質問して進めて行くのが今の流行です。
末期だな
533 :
527 :2005/12/08(木) 21:15:23
>>528 即答、ありがとうございます
条件式の意味を、不十分に理解していました。
A !=B ならAがBでなければ真というのを、偽と思ってました。
ありがとうございました。
>>528 str[count] == '\0'
のが適切な希ガス
>>534 Cの場合は表現の違いなだけ。
'\0'はint型の0
そうはいっても、ヌル文字は0より\0の方がわかりやすいのは確かだな
>>536 確かに意味的には数字でなく文字だからな
このことがコンパイルの可・不可に関わることだと思ってる誤解のほうは 未だそのまんまだが、まぁ皆にならって放っておこう。
540 :
527 :2005/12/08(木) 23:49:47
すいません。コンパイル可能、不可能に関わることではないというのは、理解しています。 理解してたのに、なぜコンパイル出来るのかと、馬鹿な書き足しをしてしまったのはすいません。 コンパイル不可能ならエラーが出るのに、馬鹿です。 ところで、引き続き質問さして頂きたいです。 例えば char str[]="abcd"; と宣言したらstr[4]に0が入ってたのはしってたのですが、レスを見ると'\0' が入ってると見受けられるのですが、実行して見ても0が表示されるのです。 文字列の最後は0でないといけないと理解してたのですが \0と表示させる方法はあるのでしょうか。 重ね重ね質問して申し訳ありません。
0が表示されるというのは面白いなw
>>540 \0というのは\nみたいなもので、\0という物それ自体が0を示す
\0はあくまでソース中のみの表記。\nが表示されないのと同じ
入門書も読まずに、人に質問して進めて行くのが今の流行です。
>>540 文法エラーと、論理エラーの区別が出来るといいね。
546 :
540 :2005/12/09(金) 00:16:27
>>543 ありがとうございます。
丁寧に説明していただき助かります。
>>545 まだまだ、その区別が出来るのは先だと思います。
文法エラー=コンパイル時にエラーが出る?
論理エラー=実行時にエラーが出る?
初心者の初心者ですので、つっこみ所は多いと思います。
文法エラー: コーヒーが砂糖はミルクの入れて飲む。 論理エラー: コーヒーに塩とミルクを入れて飲む。
549 :
546 :2005/12/09(金) 14:39:00
>>547 書評を見ると、初心者向けというより、ある程度C言語を通して理解した
人が見て便利な本のようなので、いつか買うかもしれません。
基本的に、どんな分野でも高い金を出して知識を吸収するために
本を買うのは、あまり僕は理解出来ないです。
案の定、この前ブックオフで別分野の本を買いました(ラッピングされてるので
中身はみれない)が、中身は、あまり親切ではなかったです。
基本的に、市民図書館、近辺の大学の図書館で本を借りて
かつ、ネットの入門サイト等で勉強してます。
そして、2ちゃんで、質問してるという感じで、help workshopで自分用にhelpを作るつもりです
ちなみに、いま参考書として借りてるのは、”明解C言語 入門編 柴田望洋[著]"です
うわぁ、よりによって……
自己中の見本みたいな奴だなw
知識を得るために高々数千〜1万ちょっとの金を出し惜しみするような奴は しねばいいんでないかな?
>>546 >まだまだ、その区別が出来るのは先だと思います。
こんな考えじゃダメダメ
今すぐにでもできるようになる心構えでやれ
>546 それは大変結構なお考えだと思いますが、ろくに理解できてませんね? ちなみに、受身の姿勢でお勉強するとどんな教材も不親切だと思うぞ
>>549 ちなみに、その本を書いた人達はC言語の中の人なんだが、ご存じない?
その辺のサイトよりも為になると思うぞ
あとな、本を買うか買わないかは自由だと思うが
備忘録くらいは用意しておけよ?C言語の全てを頭に叩き込んでおくのは無理なんだから
別にすべてを頭にたたき込む必要はないけどね。
構文/文法エラー:問題外 なのは間違いない。
enum FLAG { FLAG_DEAD = 0x01, FLAG_LOVE = 0x02 }; FLAG flag; flag |= FLAG_LOVE; とすると、コンパイラエラーになる。 これを避ける方法はflagをint型の変数として定義する以外にない?
>>559 演算子多重定義は列挙型に対してもできる。
FLAG& operator |=(FLAG& x, FLAG y)
{
x = static_cast<FLAG>(x | y);
return x;
}
561 :
559 :2005/12/09(金) 22:42:38
へえ、知らんかった。どうもです。
562 :
546 :2005/12/09(金) 22:46:39
なんか、色々、たたかれてますね俺。 ちなみに、547の本の書評を色々みましたが 初心者に本当に向いてるの?もちろん、Cに関するすべての 事柄を頭に覚え込むなんて無理なのはわかってますが 書評で、星を4つ以上付けてる人の内容は、ある程度Cを 理解した人の書き込みで、新たな発見や、理解度の深遠さが深まる と書いてあり。星一つの人は、複雑で最初からよく分からないと書いてました。 あと、知識を得るために高々数千円〜1万と言いますが、それは人の価値観 による物でしょう。金が無いが、勉強はしたいという人の為に図書館という設備 があるんですよ?金なしは、勉強するなと言うことですか? だから俺は、ウェブページや、本を見ながら、例文等をノートに書いて勉強してます。 レス見てると、ここは、初心者歓迎じゃないんじゃないんですか? もちろん、質問に対して、端的に注釈そえて馬鹿にもせず、答えてくれる方がいます。 その方達には感謝しています。自分の至らなさに申し訳ないとも思います。 しかし、547の本を100回読んでも、ここに来て質問する人は初心者ですか? 質問に対して、冷やかしを言って、肝心の答えやアドバイスをしない人は なにしに来てるんですか? MXのチャット室の初心者歓迎ページと名を表した初心者を馬鹿にするページ と似ているようなレスな気がしてきました。 お願いがあります。 私じゃなくても、質問する人が来るでしょうが、スレッド名通り初心者として みてあげてください、そして馬鹿にしたり冷やかしたりするだけなら書き込まない で下さい。「入門書をもっと良く読め」「話にならない」等の言葉。 それで事たりるなら、どんな質問が来ても私でも答えれます 「入門書百回読んでからもっかい来い」 って言えばすむ話ですから。
>>562 本人かどうか知らんがここはくだすれじゃない。
そして何より長文キモイ
>>562 うんうん、俺もそう思うよ。
何書いてるか知らないけど。
>>562 最後の二行だけ読んだ
入門書百回読んでからもっかい来い
>>562 >妹のめしべはぐっしょりと濡れていた。
まで読んだ。
Cを真面目にやるならK&R(>547の本)は買え。Cの全てが書いてあるから。安いし。 そして100回読んでも初心者スレでバカな質問をするようなら、 それはもうプログラミングに向いてないとしか。
568 :
546 :2005/12/09(金) 23:12:56
そして、もう一つ言わしてくれ 君らの罵詈雑言が、俺をむかつかせ、いらつかせ 「じゃぁ、文句ないような質問できるようになるよう スキルをあげたるわ」と、向上意欲を上げさせられる。 だから、寝ようにもいらつくから、寝れずに、今からまた 勉強します。 ある意味「ありがとう」、ある意味「おめーら死ね」 感謝されて喜んで、死ねと言われてむかついてください。 以上!! これ以上、駄文は書きません。もっと知識を身につけ また質問にこさせて頂きます。納得いく質問用意します。
>>562 2chは初めてかい?坊や
親切に手取り足取り教えて欲しいなら、君の行くWebサイトで聞きなさい
書けば書くほど皆食いつくってのに・・・ ここがどこだかわかってないなぁ。
>>568 病院行ったほうがいいよ。身体じゃなくて心な。
おー、すごいすごい。 これがゆとり世代ってやつ?
ここの回答者の多くは、好奇心の赴くままプログラミングで遊び続けて、 気がついたらここで回答者をやれるレベルになってたって感じだと思うんだよな。 546はそういったあたりの前提がなんかズレてる。
>>562 ここに限らずどこも質問するときには「自分で調べてどうしてもわからなかったら」というのが常識だと思ってほしい。
「どうしても」というのはそれなりに努力した上でということ。
たとえば527や540の質問は547の本でなくとも、どんな入門書でも書かれているほど基礎中の基礎。
図書館でもまあ1冊くらい何かCの本はあるだろうに。そしてそいつをペラリとめくれば書いてあるはず。
それで誰も煩わせずに解決することなんだよ。
このスレは初心者歓迎だよ。だけど、初心者未満は門前払いだからそこんとこよく理解しておいてちょうだい。
あと547の本をもし本当に100回読んだらもはや初心者脱出だろうね。ちなみにここは初心者を超えた人の質問も歓迎だよ。
578 :
568 :2005/12/09(金) 23:34:02
馬鹿だから、こんだけ叩かれてんだよ それぐらいわかれ馬鹿。
馬鹿というより無礼というか自己中心的ですな
小学生なんて大体そんなもんだろ
581 :
578 :2005/12/09(金) 23:47:17
分かりました。精神科に掛かってきます。
>>568 スキルあげてもまだ2ちゃんで質問する側なのかよw
>>568 本人だと信じて。
がんばって優しく初心者に解答してあげられる人間になってください。
>>583 しかし、一向にそういう奴は増えていかない不思議w
IT業界最大の謎。 技術力と人間性反比例の法則を打ち破れ!
技術力に反比例して、
>>568 の人間性が素晴らしいと?
IT業界最大の謎が打ち砕かれたらしい とりあえず記念下記子
>>586 こうやって2ちゃんで荒らす奴ってのは意外とリアルで普通の奴だと思う。
逆に2ちゃんで普通でいられる奴ってのはリアルでヤバゲだと思う。
>>589 つまり一見普通に見えるお前はリアルでヤバゲなのか
>>590 ヤバイよーw
だって、会社で普通に会話できねぇもん。
内戦電話に恐怖を覚えるね。
飲み会だって1人で欠席多いし、ていうか、根本的に飲み会嫌い。
ノリ悪い、会話つまんない、でも技術力はある、の上司にとっては扱いづらいことこの上ないだろうな。
>>568 人間性も糞だから反比例の法則を打ち破ってる
>>562 私でも答えられますって、お前じゃ入門書を読めばわかる内容なのかどうか判断できないだろ
貧乏人は勉強するなとは言わないが一から十二ぐらいまで誰かに教えてもらわなきゃ出来ないような奴は迷惑だから勉強するな
593 :
568 :2005/12/10(土) 01:09:38
一時間半経ったから休憩 おれは、基本的に電気回路系の仕事してた 今は、病気が長続きして失職して、傷病手当で療養中 駄文書かないと書いたが、暇なので駄文を書く。 休憩中の暇つぶしの書き込みです。
なんで、人に頼るのが大前提なんだろう・・・
無意味な数字コテつけてるくせに毎回変えるもんだからNGに登録も出来やしねえ。 これ以上糞吐き続けたいならどっかいくか、コテでもトリでも付けとけ。 こっちであぼーんしとくから。
はいはい、名無しにしますよ
別に人に頼るのが大前提なんて思ってないよ
ただ、俺が質問した一つめは、俺がちゃんと演算子を理解できてなかった
2つめは、文字列の最後の¥0を表示できるかどうかの質問
で、丁寧に回答してくれたのはそれぞれ一人ずつ。
あとは、つっこみと冷やかしで、回答無しが多数。
で、人に頼るのが大前提という前提はいつなされたのかな?
>>596 ID導入してくれれば良いのにね
出来るだけ、ちゃんと回答してくれる人をしっときたいし
おまえみたいなのは、見たくないしね
>>598 懇切丁寧に教えて欲しいんだったら、金払ってそういう施設へ逝け。
人の好意にケチを付ける香具師は来るな。「タダ」とはそういうものだ。
自分が悪いとは微塵も思ってない典型だなw
>>598 ちゃんと教えてくれた人には、ありがとうを言ってるよ?
人の好意にケチをつけるというのは、質問して回答して
もらった内容に文句を言うということだよ?
>>528 さんや
>>543 さんにはちゃんとお礼言ってるけど?
日本語わかる?
おまえに、なにか好意的な文章を俺は頂いたのかな?
ケチをつけられてるのはわかるけど。
ケチを付けて来る人にも君は、好意をいだくのかい?めづらしいね
はは、まちがえた 俺にレスしちまった >599あてだな
>>601 そうか。ならば言わせてもらおう。
君が信じようが信じまいが、俺は
>>528 だ。
君の不遜な言動を今まで黙って見ていたが、君がそういう考えの
持ち主なのなら、もう二度と教えまい。
見ていて不快だ。何ならレス削除の要望を出したっていいぞ。スレ違いだからね。
>>598 一つ目は演算子ではなくfor文に対する誤解
二つ目は文字リテラルに関する無知
>で、丁寧に回答してくれたのはそれぞれ一人ずつ。
既に誰かが答えてて、その内容が適切だったらわざわざ重複して回答したりはしないだろ。必要なら補足ぐらいはするけど
どうして冷やかされるのかを考えてみたほうがいい
>>603 どうぞ削除依頼出してください,見ていて不快なのは
あたりまえです。そういう風に書いたんですから
528があなたならば、それ以降の俺への発言も
「528だが〜した方が良いぞ」と書けば良いでしょ?
ID無いんだから。
あなたにケチを付けていたとしても、あなたと断定出来る
物は無い以上、どの文があなたの文か判断できるわけないでしょ?
その上で人の好意にケチをつけると言ってますが、どの好意ですか?
もちろん528の内容は、助かりましたし、自分の未熟さを見直せました
でも、それ以降にごちゃごちゃ書かれた文の中に好意は感じませんよ
質問して、明確な答えを頂く。感謝する。それ以外は雑音です。
しかし、ありがとうございました
あなたが528であっても無くても、俺が書き込めば誰かがケチ付きレス
が夜中なのに返ってくる。勉強の休憩時に、どう書こうか考えるのが
面白かったですよ。
はい、長文ですよ、読み飛ばしましょうね。
悔しさが文章に滲み出てるなw
>>598 > で、人に頼るのが大前提という前提はいつなされたのかな?
今までのあなたの言動からそうだと判断させていただきました。
おまいら暇だな、こんな馬鹿放っておけばいいのに。
こりゃ、プログラミング以前に、頭の方を何とかしないとだめだな。 今流行のアスペルガー症候群って奴だ。
顔真っ赤にしてキーボード叩いてんなよw 煽り耐性の無い奴だなあ。そんなんじゃ社会に出てもロクに生きていけないぜ?
矢張り強制IDは必要であろうか
漏れはID表示されていようとも煽りと甘やかした回答の両方をするから関係ないな。
いや、これはただの煽り耐性の無さではないような希ガス。 明らかにファビョっている。 という事は、あの国の国籍を持つ者の書き込みかもしれない。
>>612 IDないとブラウザであぼーんできない件について
めづらしい←なぜか変換できない><
弱い子ってたいへんね
アスペル厨UZEEEEEEEEEEEEEEEEEEEEEEEE
618 :
デフォルトの名無しさん :2005/12/10(土) 13:20:44
話の流れをぶった切って、諸兄に質問です。 他の方が作られたWindows95以降向けソフトウェア "Application.exe" があり、 私は、それのプラグイン "plugin.dll" を作っています。 自分の開発環境は Win2000+VC6 ですが、ターゲットはWin95〜XPを想定しています。 95やNT4は面倒なら動作対象外として切り捨てても問題はありません。 開発言語はC/C++で、Win32APIも使用可能です。 Application.exe で特定のコマンドが呼ばれる度に、 プラグインファイルの置かれたディレクトリ ./file/ 内を検索し、そこにある plugin.dll が動的にロードされます。 ただし、ディレクトリ名はユーザによって変更される可能性があります。 このとき、"Application.exe" ←→ "plugin.dll内の関数" 間で渡されるデータ(引数など)は無いとします。 ここで質問です。 plugin.dll の設置ディレクトリを取得したいのですが、どのようにすれば良いでしょうか。
619 :
デフォルトの名無しさん :2005/12/10(土) 13:21:22
こちらで考えた方法は以下の2つです。 (1) GetModuleHandle ( "plugin.dll" ) ; でモジュールのハンドルを取得し、 その後に GetModuleFileName でフルパスを得る。 得られたフルパスからディレクトリ名を抽出する。 # プラグインのファイル名をソース中に埋め込む必要があり # スマートな方法とは思えません。 # また、plugin.dll という名前のプログラムが別の場所で複数動いていた場合、どうなるか自分には予想できません。 (2) _getcwd で Application.exe のカレントディレクトリを取得し、 そこに file/ を付記する # Application.exeのプラグインディレクトリ file/ はユーザによって変更される可能性がある。 #(デフォルトでは file/ 内だが、フルパスでDLLの場所を指定することもできる) # ランチャーなどから Application.exe を起動したとき、カレントディレクトリが Application.exe の場所にならない場合がある。
DllMainのhModuleでGetModuleFileName。
早速の回答、ありがとうございます。 DllMainは無くても動作するらしく、関数自体を見落としておりました。
struct { const char* name; void (__cdecl *func)(); } const funcs[] = { "hoge1", hoge1 "hoge2", hoge2 } void hoge1() { printf("hoge1"); } void hoge2() { printf("hoge2"); } こんな感じの関数ポインタの配列があったとします これをC++でスマートに(BoostやSTLを用いても可)書く方法、ありませんか?
>>622 関数のポインタ配列を作る必要になった動機しだいじゃね?
class Base { virtual function() {} };
class hoge1 : public Base { viratual funcstion() { printf("hoge1"); }
class hoge2 : public Base { viratual funcstion() { printf("hoge2"); }
としといて class Base の配列作れば似たような意味になると思うけど
ゴメン 日本語おかしい。 × 関数のポインタ配列を作る必要になった動機しだいじゃね? 〇 関数のポインタ配列で何をやらせるか次第じゃね?
>>624 何をやらせるか。。。
アプリケーションにマクロ機能を実装することですね。
具体的にはCmdOpenFileとか、CmdPaste、CmdCopyなどという文字列を与えられると
それに対応した関数を実行させるという事です
多分、Cで書くよりスマートにはならないかとも思いますが
C++風に書く方法があれば、教えて頂きたいです
>>622 スマートとは何を意味する?
"hoge1"とhoge1という反復が嫌なのなら
BOOST_PP_STRINGIZEが使える。
もし本当に「hoge1」「hoge2」という関数名で、数値部分の繰り返しを避けたいなら、
BOOST_PP_REPEATが使える。
>>626 自分でも曖昧になってました・・・
前者の反復は気になっていたので、早速取り入れてみようと思います。
質問です Win32環境でGIFアニメーションを表示したいと考えています 今はMFCのCHtmlViewを使ってるんですがスマートな方法とは思えません 何か別の方法があったら教えていただけないでしょうか
>>623 > viratual
英語もおかしい。
>625 文字列から何かを取り出す、ということがしたいならstd::mapかな。
Win32でFlashを再生したいんだが、何使えば良い?
IE
>>631 Macromedia Flash Player
>>631 確かMPCが自前で再生できなかったっけ?
ソース公開されてる筈だから見てみれば?
外部から引っ張って来てるだけかもしれないけど。
質問です。 環境は WinXP Pro SP2、VC++.NETです。 isalpha(int)の引数にEOFまたは0x00〜0xFF以外の値を与えると、 Debug版で走らせた場合にassertが返されて終了してしまいます。 これを回避する方法はないのでしょうか? 私としては、isalphaには「引数がアルファべットであれば真」、そうでない場合は 「引数がEOFまたは0x00〜0xFFの範囲であろうとなかろうと偽」を返すようであって 欲しいのです。isalphaを呼び出す前に、引数がEOFまたは0x00〜0xFFの範囲に あるかどうか、わざわざ自前で調べなければならないのでしょうか? よろしくお願いします。
>>637 >isalphaを呼び出す前に、引数がEOFまたは0x00〜0xFFの範囲に
>あるかどうか、わざわざ自前で調べなければならないのでしょうか?
その通り(7.4の1, ISO/IEC 9899:1999)。
もし必要なら、自分で関数を書くといい。
639 :
637 :2005/12/13(火) 11:56:07
いかに引数の型がintだろうと、普通はchar範囲の値を渡すものだが ワイド文字版でもないのにchar範囲に入らない値を渡すなんてただのバカ
クラス内でenumして使ってる定数があるんですけど、 このクラスのインスタンスをメンバにもつクラスのさらに上のクラスでも この定数の値を使いたいのですが、なにかいい方法はないでしょうか? class CHoge{ enum{ HOGEGE,HOGEGEGE,HOGEEEEEEEEEEEEEEE, } } class CHoger{ CHoge mHoge; } ↓enumの値を使いたいクラス class CHogest{ CHoger mHoger; } というわけなんです。 よろしくおねがいします。
>>641 そのenumをpublicにして
CHoge::HOGEGEなどと使う。
>>642 それだとCHogerではいいんですけど、
CHogestで困ってしまうという状況です。
別に困らない。
>>643 なぜ困るのかその理由が書かれない限り
644のように答えるしかないんだが
他のクラスで使うなら そのenumをpublicにするか 使うクラスをCHogeでfriend指定するかしかない 普通のメンバと同じ話だよ
CHogest::HOGEGE できれば↑こんな感じで呼びたかったんですよ。 上からみればCHogeって誰?って感じじゃないですか?
>>647 だったら、CHogestの中で宣言すればいい。
>>647 CHogeが誰?なのに、CHogeのメンバを使おうとするのはこれ如何に?
えーとですね。
クラスを使う人にはCHogestクラスだけを使ってほしいわけですよ。
でも、enumで宣言されてる定数はCHogeでもCHogestでも使いたいわけですよ。
>>648 CHogestで宣言したら、CHogeで使えないじゃないですか。
まとめるとこんなですよ。
CHoge enumの宣言がされていて、enumの値をクラス内で使っている
CHoger CHogeクラスをメンバにもち、CHogeで宣言されているenumの定数が必要
CHogest CHogerクラスをメンバにもち、CHogestクラスを使う人間はCHogeで宣言されているenumの定数が必要
って状態によくなるわけですよ。
>>651 わざわざまとめなくても分かってないのは君だけだから
>>651 CHogerでCHogeのenumと同等なものを再定義する。
というのが「正しい」解決策だと思う。
>>651 場合によってはenumを名前空間レベルで定義するのがいいかもしれない。
名前空間hogeの中にその列挙とCHoge/CHoger/CHogestを平等に入れる。 これでどうだ。
>>657 それぞれの列挙型同士は別の型。
たとえばCHoge内の列挙型とCHogerの列挙型同士の暗黙的な変換はエラーになる。
変換演算子を作ればよいという問題ではない。
どのクラスにあるかという違いだけで同じものを表す列挙が複数存在するというのが問題。
>>657 Hoge の enum に新しい値を入れたあと Hogest の enum の更新を忘れるかもしれないとかじゃ?
同じ名前空間に入れないんだったらもう include するしかないな
例えばメンバに変数 x をもつ TEST というクラスがあったとして、 TEST test1, test2; test1.x = 1; text2.x = 3; などと x を色々と変更した場合に、引数が x と等しい時に、 その TEST 型のオブジェクトのポインタを返すような関数は作れないでしょうか? 色々考えたんですがどうにも思いつきません。 どうか力をお貸し下さい。
>>659 あぁ、そういう意味か
漏れがアホだった
CHogest と CHoge を互いに隠蔽する必要があるなら、 enum を両者とは独立に定義しなきゃならんのは自明だ
>>659 いやこの場合は違うんじゃまいか?
CHogeとCHogerは独立したクラスであって、
(使い古された例で言えば)CHogerはCHogeを隠蔽しているのだから
要求を満たすために、必ずしもCHogeに依存する必要はない。
仮にCHogeを別の(同じ要求を処理する)クラスに変えた際にインターフェースを変更しないためには
CHogerに別の列挙型があってしかるべきだし、CHogeと同じ物である必要もない。
あくまで別の列挙型として扱い、明示的な変換をすればいいだけの話かと。
>>661 あいまいすぎて、力の貸しようがない
もっとまともな仕様を書け
って書いてたら
>>663 に書かれてしもた(´・ω・`)
>>661 struct TEST {
void f(int arg) { if (arg == x) { /* イクワヨアナター */ throw new TEST; } }
int x;
};
main()
{
TEST test1;
test1.x = 0;
try {
test1.f(0); // バッチコーイ
}
catch (TEST* test) {
// キタ━━━━━━(゚∀゚)━━━━━━ !!
}
>>659 >それぞれの列挙型同士は別の型。
>たとえばCHoge内の列挙型とCHogerの列挙型同士の暗黙的な変換はエラーになる。
>変換演算子を作ればよいという問題ではない。
そんなことは分かっている。
>どのクラスにあるかという違いだけで同じものを表す列挙が複数存在するというのが問題。
CHogerのインターフェースからCHogeを隠蔽している限り、二つのenumは
たまたま同じものを表しているだけで、これはCHogerの実装の詳細。
669 :
668 :2005/12/13(火) 23:56:34
ごめん。たくさんかぶった。
671 :
661 :2005/12/14(水) 00:08:05
>>665 >>667 説明力が足りなくてごめんなさい
あるクラス型のオブジェクトを大量に作ったときに、
それらのオブジェクト群の中から、メンバ変数 x の値が、例えば 3 のものを抜き出したいんです。
static const intの代わりとしてのenumなら class CHogest{ enum {HOGE = CHoge::HOGE} }; とか
673 :
651 :2005/12/14(水) 00:09:21
えーと・・・つまり・・・ CHogeのヘッダあたりにドスンとおいてしまうしかないって感じでいいでしょうか?
>>673 互いに隠蔽している以上、CHogeにもCHogerにもCHogestにも
個別のenum定義を置くのが最善策
少しわからないことがあるので教えていただきたいのですが、 printf("数値をいれてください:");のような文の、「:」について なのですがこのスレで教えてもらったものをコピーで使うと 実行したときに改行されるのですが、自分で「:」を入力すると 「:」が出力されるだけで改行されません、どなたかわかる方 いたらよろしくお願いします。
まさか\nの有無じゃあるまいな
>>673 CHogeでもCHogerでもCHogestでもない別のクラスでpublicメンバとしてenumしてpublic継承すれば?
bool型の変数をfalseならtrueにtrueならfalseにする方法を教えてください bool b = false; b = ~b; // b = trueにしたい としたらコンパイラに警告を受けました。
684 :
682 :2005/12/14(水) 16:03:54
あ、なるほど。
なんでそんなにバカなの?
思考が停止してるから。
687 :
デフォルトの名無しさん :2005/12/15(木) 22:49:51
死ねッ!
void func(const string& str); とかすると、funcの中でstrを変更できない、ということですよね void func(string& const str); とするとどういう意味になるのでしょうか?
それってコンパイル通る?
VC++.net2003で警告が出たけど通りました (warning C4227: 旧形式が使用されています : 参照の修飾子は無視されます) 旧形式というのがよくわかりません。この書き方だと参照になっていないのでしょうか? コードはこんなのです #include <iostream> #include <string> using namespace std; void func(string& const str){ str.append("test"); cout << str << endl; } int main(){ func(string("test")); return 0; }
>>690 ISO確認したけど、今は文法上誤りっぽい。
C++じゃ参照は別名と違って参照先を変えられないしね。
>>690 const string& または string const&。
一時変数を束縛させるのだから、constは前に持ってこないと。
#include <iostream> #include <string> using namespace std; void func(string& s) { string tmp; s = "hoge"; __asm { lea eax, tmp mov s, eax } s = "foo"; cout << tmp << endl; } int main() { string str; func(str); cout << str << endl; }
描画がしたくて色々調べたところ、 UNIX系ではnxgraph.hを使って描画ができるらしいですが WindowsXPではどうすればできるのでしょうか?
#pragma once #include "クラスBが定義されたファイル" クラスAの定義 というソースと #pragma once #include "クラスAが定義されたファイル" クラスBの定義 というソースを使う場合にクラスAのデータメンバにクラスBのインスタンスやポインタ、 クラスBのデータメンバにクラスAのインスタンスやポインタを持とうとするとコンパイル時にエラーが出てしまいます 関数の時はプロトタイプ宣言を使えるんですがクラスの場合はどうしたらいいのでしょうか?
前方宣言
>>695 windows.h
>>696 関数同様、宣言だけ先に置くことができる。但し、不完全型となるのでポインタまたは参照のみ定義することになる。
699 :
695 :2005/12/16(金) 16:37:22
>>698 ありがとうございます!!早速試してみます。
>>698 プロトタイプ宣言って名前だけで探してましたorz
ありがとうございます
701 :
デフォルトの名無しさん :2005/12/16(金) 17:20:58
class test{ }; class testA:public test{ }; class testB:public test{ }; main(){ test* pt = &testA; } この場合はtestクラスのポインタの中にtestAが入っていますが Aが入っているのかBが入っているのかわからないものとして どちらが入っているかスマートに判定する方法はありますか?
>>701 まずはそもそも根本的な解決として、
仮想関数を使ったポリモーフィズムで何とかならないか考えろ。
(どちらが入っているかなんて考えないようにできる)
それで駄目ならdynamic_castを使うことを考えろ。
どうしても駄目なら最後の手段typeidを使うのも仕方がない。
>>702 極力仮想関数は使いたくないなぁと思ってたのですが
typeidとどっちを使おうかこれから迷ってみます
どうもありがとうー
>>703 そんなに仮想関数を嫌がる理由もないだろうに。
それに動的なtypeidはポリモーフィズムを前提としているから、
testに仮想関数が1つもないとtypeid (*pt)は常にtypeid (test)を返してしまい意味ないからな。
705 :
TOM :2005/12/16(金) 18:09:00
こんなこっとてできる? map<key, value>で、mapのkeyがpair<class a, class b>ってできるのかな?
>>703 >極力仮想関数は使いたくないなぁと思ってたのですが
超衝撃的発言
708 :
703 :2005/12/16(金) 19:27:31
>>704 >>707 何か恥ずかしいことを言っちゃったのかしら・・・(*´A`*;)
とにかくこれからは、何でも変に嫌わないで中身が見えてくるまでは使ってみることにします。
いっぱいレスありがとございました
アプリケーションの実行時パスの取得の方法はどうすればいいんでしょうか? iniファイル読み出そうと思ったんですが、フルパス指定じゃないと駄目みたいなんで…。 環境はwindowsXP、VC.NETです。
>>709 コンソールならargvを見る
Win32APIを使うならGetModuleFileName
仮想関数使わなきゃクラス継承なんてやってらんね
>>710 ありがとうございます。
きちんとできました。
検索ワードが悪かった見たいでなかなか見つからなかったので助かりました。
>>703 それは禁じ手。
お前型に不都合があるたびにそうやって誤魔化し続けるのか?
つvoid*使え
WindowsのC++で質問です。 CreateThreadでスレッドを新しく作成し、そのスレッド内で例外が発生した場合、 スレッド内でcatchされなければ、例外はスレッドの作成元へ伝搬されるのでしょうか? そのままunexpected->terminateが呼び出されてしまうのでしょうか。
マルチ宣伝UZEEEEEEEEEEEEEEEEEE!!11!!!!!!
718 :
デフォルトの名無しさん :2005/12/17(土) 20:25:50
遅レスだけど
>>641 ママ!これコンパイルできたよ!ママー!
class CHoge {
public:
enum HOGE {
HOGEHOGE
};
};
class CHogest : public CHoge {
public:
using CHoge::HOGE;
};
int main() {
CHogest::HOGE hoge = CHogest::HOGEHOGE;
}
gcc3.4。文法的に正しいのかは知らん。本来は不正だたらゴメン。
C言語のprintf()関数についてですが10進数を表示する%dと16進%x,8進%oがありますが。 2進数を表示するにはどうすればいいのでしょうか?
>>710 環境によっては %b が存在する可能性もあるけど、
基本的には、一度文字列に変換するしかない。
721 :
720 :2005/12/17(土) 20:43:34
つーか俺はなんでいつも余計な事を言うんだ(;´Д`)
しかもレス番間違えてるよ!
>>719 > 環境によっては %b が存在する可能性もあるけど、
ただし、俺は見た事ない。
722 :
719 :2005/12/17(土) 20:52:28
>>720-721 ありがとうございました。
もし%bが存在しなければ自分で工夫して変換するということなんですね。
何とかしてみます
C++ならstd::bitsetがあるんだがな。
724 :
デフォルトの名無しさん :2005/12/17(土) 21:02:41
>>718 神降臨!
ありがたく使わせていただきます!
C++ならstd::bitsetがあるんだがな。
そりゃ継承してるならusingでいい話だけど、 合成じゃなかったの?
727 :
デフォルトの名無しさん :2005/12/17(土) 21:08:26
>>718 人
(__) ウンコー
(__) 人 ガッ
./) ・∀・)') -=≡●< >__Λ∩
(( / / )) V`Д´)/
し――J / <<718
729 :
719 :2005/12/17(土) 21:59:23
重ね重ねで申し訳ないですが、2進数に変換できるよう書いてみたんですが このコードだと数値が1の場合1111という風になってしまってしまいます。 色々試行錯誤してみましたがわからなかったので何かアドバイスお願いします('A`) #include <stdio.h> void print(short); int main(void) { int ret; ret = 0; short std = 10; std |= 0x0003; print(std); std &= 0xFFF1; print(std); std ^= 0x000E; print(std); return ret; }
730 :
719 :2005/12/17(土) 22:00:17
void print(short st) { int i, j, k; int tmp[16]; printf("%d\n", st); for(i = 0, k = st; ; i++) { tmp[i] = k%2; if(k < 2) { for(j = 0;j <= i; j++) { printf("%d", tmp[j]); } break; } k /= 2; } printf("\n%x\n", st); }
731 :
719 :2005/12/17(土) 22:02:54
>このコードだと数値が1の場合1111という風になってしまってしまいます。 変数の値が1の場合、0001じゃなくて1111という風になってしまってしまいます。
732 :
719 :2005/12/17(土) 22:12:14
むしろ値が1の場合わざわざ0001にしなくてそのまま1を表示でいい気がしてきた(´・ω・`)
>>731 俺がprint(1);を試してみたらきちんと1と表示されたが。
ちなみにtmpをchar配列にしてtmp[i] = k%2;をtmp[i] = '0' + k & 1;にし、
さらに配列の末尾に'\0'を加えればprintf("%s"やputsで出力できるようになる。
734 :
719 :2005/12/17(土) 22:18:57
>>733 ('A`)・・・
その手があったかorz
回答有難うございました
735 :
718 :2005/12/17(土) 22:22:45
今年最高の脱力っぷりorz
>>719 こんなのはどう?負数の扱いがどうなのかは問題だが。
void print(short st) {
int i;
char c[sizeof(short)*4+1];
for (i = 0; i < sizeof(short)*4; ++i) {
if ((st >> (sizeof(short)*4-i-1))&1) c[i]='1'; else c[i] = '0';
}
c[i]='\0';
printf("%s\n", c);
}
つーか、再帰使えよ。 static void print_body(short n) { if(n != 0) { print_body(n >> 1); putchar('0' + (n & 1)); } } void print(unsigned short n) { if(n != 0) { print_body(n); } else { putchar('0'); } }
あ、print_body の方で unsigned 忘れた。
740 :
デフォルトの名無しさん :2005/12/17(土) 23:23:36
テンプレートについて少しご教授願います [CAry.h] template <class Type> class CAry { public: CAry& operator=(const CAry& x); @ Type& operator[](int i); A }; [CAry.cpp] #include "CAry.h" template <class Type>CAry<Type>& CAry<Type>::operator=(const CAry& x) { 〜〜〜〜〜 }
741 :
デフォルトの名無しさん :2005/12/17(土) 23:24:58
すいません Enterする時にシフトが手に当たってしまいました・・・・ AをCAry.cppで定義したいのですが関数定義の仕方が解りません 宜しくお願い致します。
>>719 void print(unsigned short n) {
if(n != 0) {
int i;
for(i = 0; (n & 0x8000) == 0; i++)
n <<= 1;
for(; i < 16; i++, n <<= 1)
putchar('0' + ((n & 0x8000) != 0));
} else
putchar('0');
}
こういうのはどうよ?
効率は少し悪いかもしれないけど、メモリは節約できる。
>>741 そもそも、テンプレートの実装は .cpp に書いてはいけない。
宣言と実装を分離したいのであれば宣言の後に書く必要がある。
ファイルに分けたければ、それを宣言の後でインクルードすべし。
>>743 申し訳ないのですがよく解りません。。。 一般的にテンプレートはヘッダに関数定義など全てを記述するってことですか?
2行目もよく解りません 宣言と実装を分離したいのですがその宣言の後とは
定義をそのまま書くってことですか?
>>744 >一般的にテンプレートはヘッダに関数定義など全てを記述するってことですか?
C++ の仕様上は .cpp に実装を分離するためのキーワード export ってのがあるんだけど、
これをサポートしてるコンパイラってのがほとんどないので、
実際にはテンプレートはヘッダに関数定義など全てを記述する必要がある。
>2行目もよく解りません
ここでいう「宣言」ってのは class CAry 全体の宣言のこと。
つまり、template <class Type> class CAry { ... }; のこと。
そして「実装」ってのは、ここではそれぞれのメンバ関数の実装のこと。
(1) の実装がちゃんと書けてるんだから、
(2) の実装も同じように書けるはず。
>>745 VCを使って書いてます。右クリックでクラスを新規作成するとhとcppができるのでそのままcppに定義使ってますがexportってキーワードはないようでした。
@はテキストそのままとってきただけです。
テキストにAはhに記述してあったのですがcppの方に記述できるなら書きたいと思ったので質問してみました。
@のcpp側ですがなぜ2個目の<Type>がいるのかがよく解りません。
Aの実装も書いていただけますか?
>>746 クラステンプレートの関数を .cpp で定義できる条件は、
1. export がサポートされている。
2. その関数がその .cpp 内でしか使われない。
3. 特定の型に特殊化されている。
場合のみ。
それ以外では .cpp で定義すると使えない。
この場合 1, 3 はないので、
その本が 2 の条件を満たしていれば本は間違ってないし、
満たしていなければ、その本は間違っているので
本のタイトルと作者を速やかに提示すべし。
2つ目の奴の実装は、
template <class Type> Type& CAry<Type>::operator[](int i) { ... }
となる。
(1) と (2) から大体のパターンが分かると思う。
(1) で2つ目の Type が必要なのは、
この地点までの構文解析では
まだこの関数が CAry<Type> のメンバ関数だと分からないので、
テンプレート引数を省略できないから。
CAry<Type> のメンバ関数だと分かった後にある引数の地点では、
<Type> を省略できている(暗黙に <Type> が指定される)。
あ、もう1つ条件があった。 4. .cpp をコンパイルせず、.cpp をインクルードして使う。 でも、こんなことするなよー。 あとは、2. の亜種として、どこでも使われないってのもあるか。
ttp://gamushara.net/ 2のそのcpp内でしか使われてないってことではないみたいですので
5MBの1458,1459に見ているページをうpしましたw
本は 柴田望洋プログラミングシリーズ プログラミング講義C++ です
なるほど リストを作る時と同じですね そういうことも書かれてませんでしたw
後でhppについて調べてみます・・・
>>751 うーむ。
iostream.h も使われていて、拡張子が .c なんて書いてある古い本だから、
この頃だと仕様がこんなだったとかあったのかな??
少なくとも、今ではコンパイルは通っても、リンクで失敗するはず。
一応 tary.c で template Test<int>; と書いて
明示的にインスタンス化すれば通るけど、
使う型が予め決まってないとこうはできないので
テンプレートの意義が大幅に減る。
使う型を制限したいときにはいいかもしれないけど、
インライン関数は結局ヘッダに書かないといけなくて、
それのみを使う分には制限をかけられない点には注意。
>>752 まぁまぁ。
そうですか あ、そういえばこの仕様は古いので#include <iostream>とusing namespace stdをするのを忘れるなとは言われました・・・・すいません。 ついでにhppとはただのヘッダですか?
>>754 そう。C++ のヘッダ。
でも、別に h でも構わない。
開発環境が何か h か hpp かで機能や動作に差があるのであれば
hpp にした方がいいかもしれないけど、
そうでもなければ別に h でも構わないと思う。
iostream.h はまだしも、.c はかなり古い。古すぎる。 別の本かサイトをあたってみるのも手かと。
どうもでした オペレーター関数はヘッダに書くことにしてみます
>>753 × template Test<int>;
○ template CAry<int>;
まあ、分かると思うが。
STLじゃなくてテンプレートについて初歩から詳しく解説してる本ってないでしょうか? プログラミング言語C++やModernC++は理解できませんでしたorz
>>760 参考になりました。ありがとうございます
環境MSVC++2003.NET Excel2000での激しく環境依存の質問です。 恐らく、C++とは直接関係ないかもしれません。 Excelのセル内の値で取り消し線が書いてある文字を取り除こうとしています。 セル内の値で、取り消し線の引いてある文字とそうでない文字を判定するのに どうやらIRengeオブジェクトからGetCharacterメソッドを使用して1文字1文字 ICharacterオブジェクトを取得してから、IFontプロパティを調べなければいけないようです。 これを使用して単純にループで処理を実行した場合、非常に処理が重くなってしまいます。 SAFEARRAYで配列でセルの情報を取得した場合は、IFontの情報は得られません。 一セル単位で1文字1文字判定するしか方法は無いのでしょうか。
VBAで判定ルーチンを書いて、それを起動するってできないかな…… あー、やってできないことはなさそうだ。 ・VBAの入ったブックを用意する。 ・ターゲットファイル名、出力ファイル名の書かれた設定ファイル(固定名)を用意する。 ・上記ブックを起動する。 ・出力ファイルから結果を取り出す。 VBAの処理自体が遅いってんならお手上げだが。
>>763 まずは回答ありがとうございます。
残念ながらVBAで同等の処理を行った結果、処理が遅くて使い物にならなかった為
C++とCOMで操作しています。
同等のアルゴリズムでパフォーマンス比較をすると、30800行×70列のデータで
完了時間 VBA 7時間40分
C&COM 4時間弱
で終わっています。
目標は、約1時間で処理が完了することです。
765 :
デフォルトの名無しさん :2005/12/18(日) 12:36:09
すいません。 asctime() ってどんな仕様なんでしょうか? 使う上で何か問題ありますでしょうか? 日付系の関数なので自分の想定してない問題がありそうでこういう質問でもうしわけありません。
>>762 取り消し線があるかどうか判定する必要はないと思うのだけど。
無条件に全ての文字に対して「取り消し線はない」という書式を設定すれば少しは時間短縮にならないか?
767 :
764 :2005/12/18(日) 12:50:02
悔しいのでCOMにアクセスする処理と、取り消し線判定ロジックを分離。 別スレッドで管理することに。しかし、結果ほとんど変わらず。 CPUがHT対応なので、速度に利くと考えましたが意味なしでした…。 IFontオブジェクトの扱いが重いということは、取り消し線どころか 文字ごとの背景色などの操作もパフォーマンスの制約を受けるということになります。 ExcelのOLB設計者はそこまで馬鹿じゃないと思うので(事実、Excelの手操作でのフォント編集は 遅いとは思わないので)、何か他の方法での扱い方があるんじゃないかと思うのですが…。
768 :
764 :2005/12/18(日) 12:55:35
>>766 回答ありがとうございます。
>無条件に全ての文字に対して「取り消し線はない」という書式を設定すれば
既に文言が入っている文字に対して取り消し線を設定する、という意味でしょうか?
ちょっと詳しく教えて欲しいです。
※今やりたい処理は、たとえば「ABCDEFG」という文字があって、"CDE"に取り消し線が
引いてあった場合、「ABFG」という値にセルを書き換えるという操作を行いたいと思っています。
>>769 すみませんまちがえました。
やりたいことは
通算秒→日付 mktime
日付 ←通算秒 localtime
のようなことをやりたいわけです。
2038年以降できないみたいですけど、いまのところそれは問題なさそうですし。
まあ、いいかなと思ってるのですが、これ、使っても問題ないでしょうか?
771 :
770 :2005/12/18(日) 13:34:10
馬鹿馬鹿俺の馬鹿w 通算秒→日付 mktime 日付 →通算秒 localtime
772 :
766 :2005/12/18(日) 16:33:23
>>768 すまん。その例で行くとABCDEFGはABCDEFGのままで単に取り消し線の書式だけ消したいのかと勘違いした。
Excelの検索(置換)で、文字修飾を検索できれば一発なんだろうけどねぇ。 あれか、HTMLで保存してタグを探すか(無茶)。
774 :
764 :2005/12/18(日) 22:41:39
>>773 色々試してみましたが、選択肢は
・HTMLで保存してタグを探す ←どうも!
・XMLで保存して編集(但しExcel2000ではその機能は無い為、Excel2002以降)
・バイナリ解析
ぐらいしか思い当たりません。
どれも大変そうなので非常に萎えておりますが、一番有望なのがHTMLタグ解析です。
もうちょっと頑張って調べてみます・・・。
# バイナリ解析はOpenOfficeのサイトにフォーマット仕様書とソースがありました。
# これを精査して現アプリに組み込む気力が沸きません。
じゃ、もう一つ選択肢。 ・OpenOfficeでsxc形式で保存、実体はzipなので展開すると出てくるxmlファイル(達)を解析…… ダメだなw
ファイルなんかに構造体を丸々コピーしてもそのまま受け取ることってできませんか?
777 :
764 :2005/12/18(日) 23:12:27
>>775 それでも、現段階では有力な選択肢になります・・・。
情報ありがとうございます。
そして、もうひとつ選択肢
・ExcelCreaterというライブラリパッケージ製品があって、それを購入
もう保守フェーズに移行しているのに、予算降りねぇよヽ(`Д´)ノ
>>776 できます。バイナリを保存してバイナリで読み取って、memsetか何かで合わせてやるだけです。
但し、参照しているアドレスとかもそのままになっています。注意。
>>778 レスありがとうございます。
例えば、
struct BIN{
char bin0;
char bin1;
char bin2;
char bin3;
char bin4;
};
として
BIN b;
write((char*)&b,sizeof(b));
※writeはファイルに書き出す関数
としてもバイナリにそのまま反映されるのでしょうか?
つまり、1バイト目にbin0の内容が必ずあって、5バイト目にbin4の内容が必ずあるということなのでしょうか?
>>780 結果は駄目でした。
どういう法則かよくわからないのですが、0xCCとか0x00とか入ってしまうみたいです。
つ #pragma pack
>>780 駄目という結果がでましたが、
これは駄目という結果でいいのでしょうか?
構造体のファイル書き込みは、定義したバイトで綺麗にそろってるということはなく、
なにか間に入ってしまうということでいいのでしょうか。
これはそもそも構造体単位のファイル書き込みが駄目ということなのでしょうか?
それとも構造体単位で書きこんで構造体単位で読み込む分にはかまわないのでしょうか?
構造体単位でファイルに書き込んで読み込む方はまだ試していません。
>>782 あ、デフォルトは8バイト単位になっているのですね。
ということは構造体→ファイル→構造体でやる分にはとくに問題は無いのですね。
#でも、結構危険ですねw
たしかにそうなっています。
ありがとうございました。
使い方わかりました #pragma pack(push,1) struct BIN{ 略 }; #pragma pack(pop) ってやると間に何もはさまずにいけるわけですね。 でも、受け側のプログラムでもこれをやる必要があって やっぱり構造体でファイルにコピーするのってアレなんですね。
int* NEW() { int *p; p = new int; return p; } という関数を作ったとして、 int *ptr = NEW(); delete ptr; とすれば、ちゃんとメモリは解放されてるんでしょうか? 激素人な質問でごめんなさい どうかお願いします。
ありがとうございます! あとひとつだけ。 逆のパターンなのですけども、 void DELETE(int* p) { delete p; } という関数を作ったとして、 int *ptr = new int; DELETE(ptr); とした場合にもメモリ解放はなされるんでしょうか? 入門書読んでもこういう細かいところがさっぱりで、 どうかお願いします((o_ _)o))
>>788 される。
「変数」がどういうものか理解していれば当然の挙動だと感じると思う。
>>788 大事なのは「pがnewで確保したアドレスを指しているかどうか」だからね。
DELETEの引数pは「ptrの値をコピーした新たなポインタ」で、ptrとは異なる存在だけれど、
同じアドレスを指しているから目的は達成される。
ちなみにこの界隈にはこんな罠があるから注意。
void NEW(int* p)
{
p = new int;
}
int* ptr;
NEW(ptr);
delete ptr; // ヤバスww
>>790 **が無いって話?
>>788 メモリリーク検出コード
#include <crtdbg.h>
int* NEW()
{
int *p;
p = new int;
return p;
}
void DEL(int* p)
{
delete p;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
int *ptr = NEW();
DEL(ptr);
return 0;
}
ところでこの↓コードってメモリリーク検出できないんだけど、 #include <crtdbg.h> int* NEW() { int *p; p = new int[1026]; return p; } void DEL(int* p) { delete p; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); int *ptr = NEW(); DEL(ptr); return 0; } 配列を開放するときって delete [] p; じゃなきゃ駄目だったよねぇ?ちがうっけ?
処理系によっては、たまたま意図した通りに動くこともある ・・・という、おなじみのパターンだと思うですよ。
親クラス class OYA { public: OYA *GetPtr(); } class KO : OYA { } main () { KO k; k.GetPtr(); } でk.GetPtr()の戻り値を親クラスのOYA*型ではなく、子クラスのKO*型として取得したいんですが、 取得時にキャストするとか、事前にオーバーロードでキャストして返す関数を宣言しておく以外に もっときれいな書き方はないですか?
>>794 つか、GetPtrが何を返すものかわからないんだけど。
>>793 なるほど。
正しいのは
delete [] p;
でいいんですよね。
レスありがとうございます。
>>797 不毛な関数だな。
thisじゃわざわざGetPtrなんて作る意味あるのか?
すいません。細かい説明を省こうと思ってthisと言ってしまいましたが 実際はthisじゃないです。要は鎖状リストにするクラスを作るつもりで、 OYA *pNextとOYA *pPrevをメンバ変数に持っています。 class OYA { private OYA *pNext; OYA *pPrev; public: OYA *GetNextPtr() { return pNext;} OYA *GetPrevPtr() { return pPrev;} } class KO : OYA { // 省略 public: void func(); } int main () { KO k; // ここを毎回わざわざキャストせずに k.GetNextPtr->func()と書きたい ((KO *)k.GetNextPtr())->func(); return 0; } としていて、これを親クラスにして使いまわそうと思っているのですが、 GetNextPtr()、GetPrevPtr()を呼ぶたびに子クラスの方ではなく親クラスの型で返ってくるので そのつどキャストするのが面倒くさいし、見た目にもごちゃごちゃしてわかりにくいので もっとすっきりさせたいんです。 実は自分の知識不足で、こういう場合ほかに適切な構文でもあるのかと思ったのですが。。
802 :
794 :2005/12/19(月) 02:26:53
↑794です
OYAにfuncつけるかKOにGetNextPtrつければええやん
804 :
794 :2005/12/19(月) 03:01:43
うーんせっかく親クラスと子クラスに分けてるのでできればそうしたくないのですが…
806 :
794 :2005/12/19(月) 03:54:50
>>804 >>803 で言われているように、OYAにvirtualでfunc()をつけるのが
一番まともだと俺も思う。でなければ、それは設計がおかしい。
809 :
807 :2005/12/19(月) 04:07:48
810 :
794 :2005/12/19(月) 04:31:57
わかってる人いないのでしょうか? 素人ばっかりなのかな(´ρ`)
>>794 に最適なソリューション
class OYA{
class KO *GetNextPtr2() { return (KO*)pNext;}
};
バカばっかだな
>>794 covariant return typeでぐぐれ。現在のC++標準では仮想関数の戻り型
に関しては制限がゆるくなっており、以下のように記述できる。
あんたの持っているコンパイラが対応してるかどうかはしらん。
class OYA {
public:
virtual OYA* GetPrevPtr();
}
class KO: public OYA {
public:
virtual KO* GetPrevPtr();
}
>>814 お前もな。 >803-804 をよく見ろ。
>>814 既にVC2003でも対応されてんだな。コンパイル通るわ。
817 :
816 :2005/12/19(月) 12:14:52
いらんこと言うたわ。そういうわけで
>>814 氏ね。
まあ、OYA に func 付けられないんなら、
>>814 にするか、dynamic_cast するしかないわな。
このままだと。
>GetNextPtr()、GetPrevPtr()を呼ぶたびに子クラスの方ではなく親クラスの型で返ってくるので 子に、親を呼んで子クラスの型で返す GetNextPtr()、GetPrevPtr() を 用意すれば済むのでは?
何回ループすれば気が済むんだ
c言語でフォルダを作ることってできますか? cygwinを使ってますがプログラムで作りたいです。
そりゃ作れるさ。
sys/stat.h の mkdir 関数だな。 まあ、system で mkdir を呼んでもいいけど。 つか、こっちのが楽。-p フラグ付けれるし。
サンクス
クラス関数利用してで複数回処理したい場合 クラス関数内でwhileするか、whileでクラス関数呼ぶのと どちらがまともな実装なんでしょうか?
>>825 whileの内容がクラスのメンバとしてふさわしいかどうかがポイント。
オブジェクト指向的にどうか?
って話になる。
いろんな型をpush,popって出来ますか? shortの次にintを入れたりしたいのですが。
std::vectorです。
>>830 それは型情報も積みたいと言うことかな? やりたいことを詳しく。
つーか、std::vector<int>にshort値を入れること自体はできるわけだが。
質問。 C++だと、構造体でもクラスの様にメンバ関数、private,public宣言などできる。 よって継承以外はクラスと同じ。使い道が有るのか。 有るとすればどのような場面か?
>>833 functorなんかはstructで宣言する事が多くないか?
俺の場合は純粋にタイプ量で選ぶ。
ファンクタや、Pointのような変数自身がインターフェースに なるようなPOD型はstructにしてる
構造体不要ってことかな?でも構造体のほうがクラスより先輩ですので敬ってください。
データ構造にはstructを使い、オブジェクトにはclassを使うようにしている。 #斯くの如く曖昧ではある。
838 :
デフォルトの名無しさん :2005/12/20(火) 19:37:22
typeidを使うプログラムはうんこ設計なんですか?
うんこの定義による
typeidは使うべきではないって事です。
841 :
デフォルトの名無しさん :2005/12/20(火) 21:02:20
C++の演習をしているモレです。 C++のクラスの継承の仕組みは、具体的にどういう応用 を目的に想定しているのでしょうか? 例えば、クラスを、車と見立て、それが部品(データ)と、そ れらを動かすアクチュエータ(関数)と見た場合、 そのクラスの派生クラスとは何でしょうか? より多くの部品と多くの機能を備えた高級車ですか?
のりもの→くるま→えらいひとのくるま
一般的なもの→一般性を崩したけどその分便利なもの
車の例ではないけれど、たとえば標準C++ライブラリでは、 istream/ostreamからそれぞれファイル操作のifstream/ofstreamが派生している。 これのどこが嬉しいかというと、ファイルとの入出力の方法がcin/coutに<<や>>を使うのと全く変わらないということ。 しかもi/ostreamへのポインタ・参照にi/ofstreamへのポインタや変数を入れることもできる。 つまりあたかもi/ofstreamがi/ostreamであるかのように扱えるということ。
基底クラスの設計がボロイと、派生クラスで無理をして、、最終的にちゃぶ台返しを喰らうことがある
しかし規定クラスのしょぼさはちゃぶ台がひっくり返ってから気づくことが多い
847 :
デフォルトの名無しさん :2005/12/21(水) 01:07:06
オブジェクト指向をたとえ話で人に説明するのって、なんか恥ずかしいよね?
>>841 public継承とprivate継承では意味が違うのだが、
(よく使われる)public継承について言えば、
AからBを継承した場合の関係は、
「B is a A」と呼ばれる。日本語で言えば、「BはA(の一種)である」。
BはAにモノ(データや機能)を追加することもできるし、Aの実装(の一部)
を置き換える(オーバーライドする)こともできる。そしてAが提供している
範囲のインタフェースはAとBで共通である。
こうする利点は、似たようなものの差異を文脈に応じて選択的に無視することが
できることだ。
BとAの違いが重要でない場合(BをAとして扱いたい場合)は、そう扱える
(具体的にはAに対する処理を書けば、それはBも扱える。正しく書けばだが)。
BとAの違いが重要である場合は、無論AではなくBに特化した処理を書くことも
できる。
ザクやジムにキャノンインタフェースを実装すると、ザクウキャノン、ジムキャノンになります。
851 :
デフォルトの名無しさん :2005/12/21(水) 01:48:51
デバッグビルドで実行したときはエラーが出ないのに、リリースビルドで実行するとエラーが出るようになるのは何ででしょうか? assart()の類は使っていません。 っていうか何でメンバ変数がいつの間にか勝手にNULLになってたりするの? ポインタの代入も何か変だし…。
するとガンダムは試作機なはずなのに量産型のジムより高性能なのはどういう事?
>>851 配列の範囲外アクセスでもしてんじゃね?
ガンダムが強力なのはその名の通りガンダリウム合金の差だよ
試作機の方が高性能って普通じゃね? デザインからして違うから、量産レベルの試作機には見えないし。
>>853 レスd
でも、おかしな所には配列は絡んでないので、それはないです。
メモリ破壊は破壊したところと全然違うところで死ぬからナ
変数の初期化忘れという線も。
public継承の端的な特徴を表す現象として、スライシングがあるね。 派生クラスを基底クラスに代入した時で、派生クラスで増えた部分が 丸々削られる。それでも構わないのは、子 is 親という意味論がある からだ。 もし、子 is 親でないのに、無理に継承を行った設計をすると、すぐに スライシングの段階で問題が生じる。初歩的なデザインミスだが、OOP を理解してないうちは、「継承なんか糞くらえ」と思ってしまうかもしれない。 これは慣れだね。
D&Eによれば、スライシングに関してはBjarn Stroustrup自身がその有効性を 疑問視しとる。むしろそれを禁じる理由がないからそうしてるだけ、といった ニュアンスだ。 やはり ・間接参照(ポインタorリファレンス)経由でアクセスする ・正しくvirtualを使う のが基本ではあるだろう。
>>860 ま、そうなんだよね。
結局、基底クラスの入れ物には、派生クラスの増分を入れる場所が
ないので、切り捨てているわけだ。
これが原因で、コンテナでOOPをしようとすると、問題が生じる。
それで、boost::ptr_vector、boost::shared_ptr、boost::scoped_ptr
などの使用が推奨される。単にstd::vectorにオブジェクトへのポインタ
を入れてもいいのだが、解放を忘れがちだし、かと言ってstd::auto_ptr
はコンテナには入れられない。
ABCD abcd(); class ABCD { ABCD() { } }; とやると当然なんですがABCD abcd();の部分でエラーが出ます。 久しぶりにC++を使ったのでクラスの定義をどこでやったらいいのか解らないんですが どうやって解決するんでしたっけ;
>>862 class ABCD
{
ABCD()
{
}
};
ABCD abcd();
>863 書き忘れてたんですが実は class ABCDないでグローバル変数abcdを使ってるんです・・・
設計を一から勉強しなおそうな。
>>864 宣言と定義を分ければいい話
そもそもヘッダにグローバル変数を定義するのはどうかと
ついでにABCD abcd();ってABCD型の返値を持つ関数宣言してるだけだろ
まとめると
>>865
>>844 - 以下
dクス。C++のpotentialを感じますた。
まだまだ修行が足りないのもわかりました。
もっと学習しまつ。
>>868 > pb = (struct B*)pa;
何これ?
870 :
デフォルトの名無しさん :2005/12/23(金) 16:31:04
>>869 pa というポインタ変数を pb というポインタ変数に代入しています。
本来なら無茶なやり方と記述されていました
>>870 >なぜ pb->hoge() で 2 2 が出力されるのでしょうか?
あなたの予想は?
>>868 とりあえずmain関数の中にあるstructという語は全て省略可能。
VC++の場合 pb->hoge(); は void B_hoge(B* this_) { cout << "xの値:" << this_->x << " yの値:" << this_->y << endl; } の呼び出しに等しい。 AとBのメンバ構成が等しいのでたまたま動いているが pbが指してるのがAのインスタンスなので鼻から悪魔だし コンパイラによっては違う挙動を示すかもしれない。
鼻から悪魔って好きだなぁw
イディオムですから
877 :
870 :2005/12/23(金) 23:01:10
878 :
デフォルトの名無しさん :2005/12/24(土) 23:51:50
すいません。標準出力とforkについてわからないので教えて下さい。 (m。_。)m オネガイシマス コンパイルと実行環境はcygwin+GCCです。 main() { printf("hoge1"); printf("hoge1\n"); if(fork()){/*親プロセス*/ printf("hoge2"); printf("hoge2\n"); } else{/*子プロセス*/ printf("hoge3");←出力されてない printf("hoge3\n"); } } 実行結果: hoge1hoge1 hoge2hoge2 hoge3 となってしまいます。 子プロセスで改行なしの標準出力がされません。なぜでしょうか? 調べてみると改行があると出力されるようなのですが・・・ また回避策もお願い致します。 (子プロセスの標準出力を親プロセスとのパイプにつなぐとか・・・) どうか御教授の方宜しくお願い致します。
881 :
デフォルトの名無しさん :2005/12/25(日) 00:18:54
882 :
デフォルトの名無しさん :2005/12/25(日) 16:46:27
質問です。XP、.NET です。 リストビューの使い方を学んでいます。 リストビューのあるアイテムを選択したことを受け取るには、LVN_ITEMCHANGED を使うのが一般的なのでしょうか。 NM_CLICK だと、キーボードのカーソルキーで選択を変更したことを受け取れません。 また、カーソルキーで選択を変更したとき、LVN_ITEMCHANGED が3回とんできています。 今まで選んでいたアイテムのが2回、新しく選んだアイテムのが1回です。 選択したアイテムのインデックスを調べるには、NMLISTVIEW の iItem を見ればいいですが、 3回飛んできているうちのどれが新しく選んだアイテムの通知かを調べる方法が分かりません。 uNewState、uOldState を調べれば見当はつくのですが、 この2つの変数の詳細が MSDN マニュアルに見つかりません。 よろしくお願いします。
LVITEMのstateの説明でも見れば?
884 :
デフォルトの名無しさん :2005/12/25(日) 17:04:34
c++で質問です。 ()演算子(?)のオーバーロードで、 operator ()() の意味するところ(というか、動作)が分かりません。 ()を関数呼び出しの演算子と見るとは、どういうことなのでしょうか? よろしくお願いします。
>>884 例えばoperator()()をオーバーライドしたHogeクラスがあった時、
Hoge h;
h(); // h.operator()を呼び出す
のようなことが出来る。
オーバーライド→オーバーロード(´・ω・`)
887 :
884 :2005/12/25(日) 17:23:59
なんとなく分かりました。 ありがとうございました。
888 :
デフォルトの名無しさん :2005/12/25(日) 18:51:49
CかC++用の Socket ライブラリって無いでしょう亞k? コンパクトでクロスプラットフォームなヤツ歓迎。 最低 Windows 環境で使えるヤツプリーズ。
つ それくらい自作しなさい
iostreamで読み書きできるソケットライブラリがないか探したことはある。 いまいちいいのがない。
891 :
デフォルトの名無しさん :2005/12/25(日) 18:57:46
基礎から学ぶCプログラミング って本の p238 プログラム11-1 ってどっか間違ってない? この本誤植多くて困るよ 自分初心者だから余計に 4版
だったら違う本買えよw
893 :
デフォルトの名無しさん :2005/12/25(日) 18:59:27
#include <stdio.h> #include <fcntl.h> #include <io.h> #define OFFSET 35 main(int argc,char *argv[]) { int i; FILE *fp,lp; long rec_no,seek_p; char buf[41]; /* FILE OPEN */ if((fp=fopen("random.txt","r+t")) < 0 ){ printf("ファイルをオープンできません。%d\n",fp); printf("ファイルを確認してください。\n"); exit(1); }
894 :
デフォルトの名無しさん :2005/12/25(日) 19:00:33
rec_no=0; printf("record NO.? : "); scanf("%ld",&rec_no); while(rec_no != -1){ seek_p = (rec_no -1) * OFFSET; if(fseek(fp,seek_p,SEEK_SET) != 0 ){ printf("シークに失敗しました。\n"); exit(1); } if(fscanf(fp,"%35s",buf) < 0 ) { printf("データがありません。\n"); exit(1); } printf("%-35s\n",buf); printf("record NO? : "); scanf("%ld",&rec_no); } if (fclose(fp) < 0){ printf("ファイルを正常にクローズできません。\n"); printf("もう一度はじめから。\n"); exit(1); } return 0; }
>>890 gimite socketが手軽だけどね
機能が少ないのが難点
896 :
888 :2005/12/25(日) 19:23:11
>>889 そこを何とか
>>890 ほしいねほしいね
>>891 #include <stdlib.h> が足りないぐらい?
>>895 いいですね、試してみます。
自分宛のレスじゃないのでこういうのはアレな気がするけど、
ありがとうございます。
引き続き
CかC++用 コンパクトな Socket ライブラリプリーズ
897 :
891 :2005/12/25(日) 19:34:15
>>896 #include <stdlib.h>
足してもダメっす
ちゃんと random.txtもしかるべきところに作ってあるのになあ
001聡美19780525A読書
002聖菜19790215Oひみつ
003晶19781194ABモータースポーツ
↑こんなの テキスト通りに
このコンパイラできるのにexeファイルを実行すると予期せぬエラーがでます。 色々試しましたがどうしても原因がわかりません。 コンパイラ:VC6.0 #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct class_siken { struct class_kumi { int kokugo[3], sugaku[5]; long sugaku_total, kokugo_total; float s_ave, k_ave; short class_juni; }ku1[4][40], ku2[39]; long class_k_total[5], class_s_total[5]; float class_s_ave[5], class_k_ave[5]; short gakunen_juni[4*40+39+1], class_alljuni[5]; }DATE; void kojin_syori(DATE *sp); void class_syori(DATE *sp); void syokika(DATE *sp);
>>898 続き
int main(void)
{
srand((unsigned)time(NULL));
DATE *s = NULL;
syokika(s);
kojin_syori(s);
class_syori(s);
return 0;
}
>>898 続き
void syokika(DATE *sp)
{
int i, j, ii, jj;
/* 1〜4クラスの点数初期化 */
for(i = j = ii = jj = 0; i < 4; i++)
{
for( ; j < 40; j++)
{
sp->ku1[i][j].kokugo[ii] = 0;
sp->ku1[i][j].sugaku[ii] = 0;
sp->ku1[i][j].s_ave = 0;
sp->ku1[i][j].k_ave = 0;
for( ; ii < 3; ii++)
{
sp->ku1[i][j].kokugo[ii] = rand()%101;
}
for( ; jj < 5; jj++)
{
sp->ku1[i][j].sugaku[jj] = rand()%101;
}
}
}
/* 5クラスの点数初期化 */
for(i = 0; i < 39; i++)
{
for(j = 0; j < 3; j++)
{
sp->ku2[i].kokugo[j] = rand()%101;
}
>>898 for(ii = 0; ii < 5; ii++)
{
sp->ku2[i].sugaku[ii] = rand()%101;
}
}
}
void kojin_syori(DATE *sp)
{
int i, j, ii, jj;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 40; j++)
{
for(ii = 0; ii < 3; ii++)
{
sp->ku1[i][j].kokugo_total += sp->ku1[i][j].kokugo[ii];
}
sp->ku1[i][j].k_ave = (float)sp->ku1[i][j].kokugo_total / ii;
for(jj = 0; jj < 5; jj++)
{
sp->ku1[i][j].sugaku_total += sp->ku1[i][j].sugaku[jj];
}
sp->ku1[i][j].s_ave = (float)sp->ku1[i][j].sugaku_total / jj;
}
}
>>901 即レスですか('A`)
レスありがとうございます。
続けざまに質問なのですが、何故NULLだからダメなんでしょうか?
NULLはアクセスしたらだめなアドレスだから。
905 :
901 :2005/12/25(日) 19:50:38
>>903 えーと、単なる初期化忘れじゃなくて天然ですか......
NULLは何も指さないことを示すポインタです。
何も指していないポインタに対して、
関数内で値を書きこめばそりゃヌルポにもなるというわけです。
おそらく、あなたの書きたいコードは
DATE *s = (DATE*)malloc(sizeof DATE);
かな?
デバッガ使えよ
907 :
デフォルトの名無しさん :2005/12/25(日) 19:54:47
>>904-906 回答ありがとうございます。
天然じゃなくて単なる勉強不足です。(´・ω・`)
DATE s;にして関数にsのアドレスを渡したらちゃんと実行できるようになりました。
デバッガは使ってみたんですが理解できず・・orz
908 :
888 :2005/12/25(日) 19:56:46
>>897 J( 'ー`)し たかし、random.txt ファイルに問題があるよ
fseek の意味はわかっているかい?
そのぐらい自己解決できないと誰にも相手にされなくなっちゃうよ
ヒントは #define OFFSET 35
>>895 試してみました。
なかなかよさげです。
パブリックドメインっってところもグー。
909 :
デフォルトの名無しさん :2005/12/25(日) 20:04:17
ヘッダーで namespace a { void f(void); } って、やったら、.cpp の方で、 namespace a { void f(void){ ... }; } って書くのが普通?それとも、 void a::f(void){ ... }; って書くのが普通?
void a::f(void){...} たぶん最後にセミコロンを付けないのが普通
クラスのstaticメンバについて質問なんですが class hoge { static const int num=5; public: hoge(void); ~hoge(void); shownum(void){printf("%d\n",num);return 1;} }; はコンパイルができるんですが class hoge { static const int num=5; public: hoge(void); ~hoge(void); shownum(void){printf("%d\n",num);return 1;} }; const int hoge::num; だとnumが複数回定義されてるとエラーが出てしまいます effective C++だと下の書き方の方が正しいとあるのですが どうして逆の結果になるんでしょうか? コンパイラはVS2003です
>>911 static constな整数型に関してはクラス内スコープのコンパイル時定数に使うということで上の書き方になった。
>>912 よくわかりました。ありがとうございます
・・・effectiveC++だとdefineの代わりにconst使えって言ってるけど
実際にそうしてみたらエラーがでまくるorz
914 :
897 :2005/12/25(日) 21:02:26
>>908 なぜ35バイトずつ増やしているかというと、
003晶19781104ABモータースポーツ
このように34バイト+'\0'の合計35バイトで一人分だからです
ってテキストにあります。
>911 もしかして >const int hoge::num; をヘッダに書いてるとか言うオチ?
ってマジでエラーになるな。
917 :
デフォルトの名無しさん :2005/12/25(日) 22:19:11
Visual Cで、下記のコードを最適化ありReleaseでコンパイルすると 24KBの実行モジュールができるんだけど こんなものかな〜。もっと小さくできないのかな。。 int main(int argc, char* argv[]) { return 0; }
質問です。 ソースプログラムの分け方なんですが func1.h//プロトタイプ func1.cpp//下請け関数 func2.h//プロトタイプ func2.cpp//下請け関数 header.h//全体で使うヘッダーをまとめる main.cpp//メインプログラム と言う感じでソースをわけてるんですが どこからどういう感じでインクルードすれば良いのか分かりません。 externを使えばグチャグチャになりながらもいけたんですが、綺麗じゃないですし・・・。 ちなみに、func1.*で定義している関数は、func2.*からも使われます。 pragma onceを使っても、うまくいかないですし・・・。
普通に必要なヘッダだけインクルードすれば問題ないと思うが。 pragma once使えば、問題ないはずだが。 あと、妙な俺様用語はやめろ。 なんだ下請け関数って。
最近のネットワークプログラミングの本では、結構使われてる気がする。>下請け関数 何故かネットワークプログラミングだが・・・。 昔某有名なx68kの本でも使われてたな、しっかり用語解説に乗せてたしww
>>921 header.hでmain以外の全てのヘッダーをインクルードする。
次にfunc1.cpp、func2.cppからfunc1.h/func2.hをそれぞれインクルード
最後に、main.cppからheader.hをインクルードすりゃOK
もちろん全てのソースにpragma onceを付けろ
サブルーチンを関数化したもの?
そう、サブルーチン 最近のオブジェクトとしての関数に馴染めない昔からの老害が下請け関数って言葉を使ってる気がする。
>>924 それだと、func1.cppとfunc2.cppの関数が重複するようになるぞ
#pragma onceはあくまで1箇所からの多重参照を防ぐだけだし
って、それ以前に
>>924 だとfunc1.cppからfunc2.cppの関数が使えないw
>>921 まず、それぞれのヘッダファイルが
#include"func1.h"
int main(){return 0;}
この様に単一でincludeが出来るように
ヘッダファイル内にincludeを記述する。
あとはcppファイル内で使用している
関数のプロトタイプが定義されているヘッダを全てincludeする。
この時、「ヘッダ内でこのヘッダがincludeされているから…」とかは気にしちゃいけない。
pragma oneceにしろifndefにしろ、インクルードガードは必須な
FLT_EPSILONが定義されていない環境で、FLT_EPSILONの値を 探るにはどうしたら良いのでしょうか。
は?
(゚Д゚)ハァ?
float.h がない環境で、まず浮動小数点は使えるのか? と思うけどまあいいや。 どうせ機械イプシロンは 2 の -n 乗の形してるだろうから、 1 に 2 の -n 乗を足して 1 にならない最大の n を求めればいい。
念のため言っとくけど、 2 の -n 乗求めるのに pow なんか使うなよ? 2 で割っていけばいいんだからね。
ファイルの排他処理について質問。 ・Unix系のOSではflock()が大抵使えると思っていいか。 ・OSを問わず使える排他としては、rename()による方法を使うのが無難か。 後者の方法で、流れを解説した資料があれば在り処を教えてください。 #ソース提示してくれるなら尚嬉しい♪
質問です。 QUE管理プログラムとは具体的にどのようなものでしょうか?
>>935 flock()よりlockf()のがPOSIX的に好ましい
他の汎用的な歯痛手段としてはまあrename()以外にmkdir()なんかも
使えるかな。
「OSを問わず」と書いてるけど主要なUNIX系だけでいいのかな。
C++で、クラスの初期化されていないメンバ変数を読むのをトラップする方法はないですか? さっき未初期化変数使って1時間ハマったので。 Javaみたいに強制的に初期化してくれれば 少々パフォーマンスが落ちようがなんだろうが助かるのに。
>>939 そう思うならJava使っとけ、と言うのが普通の解答だけど
boost::value_initializedがお望みの物じゃないかと。
>>939 そもそもクラスのメンバ変数なら、コンストラクタで
初期化しておけば問題ない(というかそうするべきもの)じゃないか?
メンバを追加したらコンストラクタに初期化を書くクセを付けるべきだな
VCでと未初期化の変数を使うと例外かなんかが起きた気が
>943 んなこたーない
945 :
935 :2005/12/27(火) 09:17:39
>>937 ,
>>938 レスTHX。
なるほどlockf()・mkdir()ね。まぁ、mkdir()もない環境は考えなくていいだろうからそれはいいとして。
そもそもWindowsとUnixで同じにならないかってところがスタートなので、WindowsとPOSIXかな。
#WindowsならCreateFile()で事が足りるって話もあるんだけど。
>>944 コンパイルオプションでデバッグ時にそうなるようにできる。
ほほぉ、ではそのオプションを教えていただこうじゃないか。
950 :
デフォルトの名無しさん :2005/12/27(火) 11:36:51
みなさん、自動変数って初期化して使ってます?
>>950 当然。
何か迷ってるなら悪いことは言わない。全部初期化しろ。
それでやりにくいと思うようなら、初期化できるところで定義しろ。
C++ Coding Standardsでも読め
>>950 C++ではほぼ全部。
Cではできるだけ。
>>950 初期化が必要なものは初期化し、
不要なものは初期化しない。
>>950 C99, C++ではPOD型の全てと参照型の全てとconst型の全てで初期化、それ以外も基本的に初期化。
Cではやむを得ずブロックの先頭で宣言した場合を除き、C99同様。
尚、静的でない配列は一般的に初期化しない。
初期化が不要なものまで全部初期化してしまったら、
>>948 みたいなのが検出できなくなってしまう。
>>945 UNIXでもopen()のO_EXCLが使えるよ。
>>957 nfsで使えないとか制限があるので要注意。
マルチスレッド環境のなかで、 グローバルに参照されるキューを作りたいんですが、 その実装方法でどれが一番最適なのかで悩んでいます。 (排他処理については省いてます) --------------------------------------------------------------------- (1) シングルトンクラスで実装して、 必要なところで適時インスタンスを取得する class HogeQueue { private: static HogeQueue* instance; // 唯一のインスタンス std::queue<あるデータ型のポインタ> hoge_queue; // キュー HogeQueue(){} // コンストラクタ public: HogeQueue& getInstance(void){ if(instance==NULL){ HogeQueue::instance=new HogeQueue(); } else{ return HogeQueue::instance; } } void push(あるデータ型){ } あるデータ型 pop(void){ } 〜他のメソッド〜 }; 必要になったら、適時 HogeQueue* hoge_queue = HogeQueue::getInstance(); ---------------------------------------------------------------------
--------------------------------------------------------------------- (2) どうせ一つしか作られないのなら、 全てstaticなユーティリティクラスのような感じで作る class HogeQueue { private: static std::queue<あるデータ型のポインタ> hoge_queue; // キュー public: static void push(あるデータ型){ } static あるデータ型 pop(void){ } 〜他のメソッド〜 }; --------------------------------------------------------------------- (3) 一つしかインスタンスを生成しないことを念頭において、 普通の参照オブジェクトとして実装する class HogeQueue { private: std::queue<あるデータ型のポインタ> hoge_queue; // キュー public: HogeQueue(){ } // コンストラクタ void push(あるデータ型){ } あるデータ型 pop(void){ } 〜他のメソッド〜 }; ある一つのソース内で実体を定義。 HogeQueue hoge_queue; 他のソースでは、 extern HogeQueue hoge_queue; --------------------------------------------------------------------- 実装手段としては、どれが一般的に良いとされているのでしょうか。 また、他にも手段がありましたら、ご教授お願いいたします。
別にマルチスレッドだからってグローバルに参照されなくてもいいじゃない。 対象スレッドだけに関連ができるようにしろよウンコ。 できなきゃ死ね。
962 :
デフォルトの名無しさん :2005/12/28(水) 10:06:32
Boostフルコンパイルするときに必要なライブラリってありますか? なんかICUが足りないみたいなことが出てたんですが
>>962 エラーメッセージを理解したり、さもなくばここにそれを貼ったりする技術者が必要です。
複数スレッドから使うんでしょ。グローバルにするのは必須じゃないけど。 どれでもいいと思うけど変更らくだから1かな。
VC2005のウィザードでCLRコンソールアプリケーションをつくりました。 Console::WriteLine(L"Hello World"); となったのですが、このLってなんでしょうか。 ヘルプをさがしたのですが分かりませんでした。
966 :
959 :2005/12/28(水) 16:27:46
>>961 回答ありがとうございました。
なるほど! もっと隠蔽性を高められるんじゃないかってことですよね。
対象スレッドのクラス間だけに関連張るというのは考え付きませんでした。
>>964 回答ありがとうございました。
対象スレッドのクラスだけに(1)のインスタンスを持たせることにしようと思います。
>>965 ManagedC++(.netフレームワーク)は該当スレでどうぞ。
>>965 _UNICODEの有無にあわせて_TEXTの有無を切り替えてくれる
>>968 ダウト
>>965 C++言語定義の一部で、L"..." の形式で、ワイド文字列リテラルであること示す接頭辞。
型が const char[] ではなく、const wchar_t[] になる。
int hoge[8][8]という配列があったとして hoge[8][0]のアドレスを知りたい場合 &hoge[8][0]とする以外に方法はありますか?
hoge[8]
hoge+8
hoge[8][1-1]
974 :
970 :2005/12/28(水) 21:22:33
よくわかりました、ありがとうございます
ftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gz を、WindowsXPでdjgppの最新版でコンパイルしようとしているのですが コマンドプロンプトで個別のディレクトリ上(\pmml-0.2p1\compなど)でmakeしようとすると smfout.o:smfout.c:(.text+0x16f1): undefined reference to `__isctype' smfout.o:smfout.c:(.text+0x1711): undefined reference to `__imp____mb_cur_max' smfout.o:smfout.c:(.text+0x171b): undefined reference to `__imp___pctype' smfout.o:smfout.c:(.text+0x1736): undefined reference to `__isctype' ../common/smf.o:smf.c:(.text+0x2d): undefined reference to `__imp___iob' ../common/smf.o:smf.c:(.text+0xb5): undefined reference to `__errno' (中略) collect2: ld returned 1 exit status make.exe: *** [pmml] Error 1 というメッセージが出て止まります。 djgppのFAQにこのようなエラーが出てきたときは\libにある他のライブラリが指定されていない可能性がある、 と書いてあったので-lm -lg -lpc -lemu -ldbg -lgcovと、あるだけ全部指定してみましたが、状況は変わりませんでした。 コンパイルしてバイナリを得たいのですが、どうしたらよいでしょうか。 よろしくお願いします。
>>975 __impってついてるのはDLLの関数じゃなかったっけ?
configureに失敗してるような気がする。
977 :
デフォルトの名無しさん :2005/12/28(水) 23:42:06
vc++6のままだったんでそろそろVC++.net2003でも買おうと思ってたら 2005ExpressEditionとかいうやつが手に入るようになってましたが、 これってVC++.net2003とどう違いますか。 DirectXも使えるしWin32アプリも作れるみたいだし 普通に使えるならパッケージ買う必要もないかと思ってるんですけど、 ここがこうだから使えねぇ〜、とか つかわねぇほうがいい、みたいなところってあったら教えてください。
完全にスレ違いです。
下のプログラムは標準入力から文字を読み込み辞書に対応するならば過去形を 対応しなければ辞書にありませんを出力するプログラムなんですが、 下のプログラムを参考に標準入力から一行入力で英文を入力し、過去形の文章にして 出力するプログラムにしていただきたいです。 I move quickly なら I moved quickly 見たいな感じです。 環境はWindowsXPでBorlandC++を使ってます。 どうかよろしくお願いします。 #include <stdio.h> #include <string.h> main() { int i; char buf[100]; static char *dic[10][2] = { /*辞書*/ {"eat","ate"},{"move","moved"},{"copy","copied"}, {"die","dyed"},{"walk","walked"},{"take","took"}, {"hit","hit"},{"swim","swam"},{"run","ran"},{"play","played"}}; while (scanf("%s",buf) != EOF){ for(i=0; i<10; i++){ if(strcmp(buf,dic[i][0]) == 0) break; } puts(dic[i][1]); dic[10][1] = '\0'; if(i==10) puts("辞書にありません"); } }
>>980 dyedて...w
条件分岐もなんか変。
-------------------------------------------------
/*単語一つずつ読み込み*/
while (EOF != scanf("%s",buf)){
/*辞書を引く*/
for(i=0;i<10;i++){
if(0 == strcmp(dic[i][0],buf))break;
}
/*単語が見つからなかったとき*/
if(i==10) printf("%s ",buf);
/*見つかったとき*/
else printf("%s ",dic[i][1]);
}
>>982 心の底からどうでもいいけど、なんで定数が左?
>dic[10][1] = '\0'; なしますのん。
>なしますのん。 ?
>>983 心の底から聞くけど、本当に理由知らんの?
>>986 一貫してないのにも理由あるん?
> for(i=0;i<10;i++) ←ま、これは微妙
> if(i==10) printf("%s ",buf); ←???
991 :
975 :2005/12/29(木) 10:34:11
>>976 レスありがとうございます。
普通は、configureがついてて、それ実行してmakefileができるみたいなんですね。
でも
>>965 のファイルにはmakefileしかついていませんでした…。
README.jには「DOS/V 6.3 -- gcc 2.6.3(djgpp)」で動作確認済みと書いてあるので
何とかしてコンパイルしたいので、ヒントやキーワードだけでも教えてください。
>>988 その二つは一貫しているように見えるが。
993 :
976 :2005/12/29(木) 11:29:40
>>991 __declspec(dllimport)付きで宣言された関数の実体はDLLにあると解釈される。
だけどdjgppではDLLは扱えないはず。
つまり、ソースコード中で宣言してある関数に__declspec(dllimport)が
付いているのをはずせばよいということ。
includeしているヘッダ内も全部見てみろ。
994 :
975 :2005/12/29(木) 11:32:44
>>993 丁寧に教えてくれてありがとう゜(゚´Д`゚)゜。
がんばります。
996 :
デフォルトの名無しさん :2005/12/29(木) 12:49:48
1000げとー
俺こそ真の1000げっと
999げとー
1000げっと
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。