【初心者歓迎】C/C++室 Ver.48【環境依存OK】
at TECH
[前50を表示]
100:デフォルトの名無しさん
08/02/07 14:30:57
>>98
厳密に言うとstrict weak orderingを満たすように書く
ことになるが、
struct func : public binary_function
{
bool operator()(const string &a, const string &b) {
return a < b; //辞書順で昇順
}
};
sort( vec.begin(), vec.end(), func() );
とかでどう?
101:デフォルトの名無しさん
08/02/07 14:31:04
質問です。
VC6.0で自前のライブラリをまとめたStatic Link Libraryを作っています。
そのライブラリを実際に他のプロジェクトで使う際、リンクのところで以下のように躓きました。
・すでに LIBCMTD.lib(crt0dat.obj) で定義されています
これを筆頭に、大量にリンク警告がでました。
調べたところ
URLリンク(m--takahashi.com)
libの方はシングルスレッドで。テストプロジェクトのほうはマルチスレッドでコンパイルしているのが問題のようでした。
両方マルチスレッドにしたところ…
・"libcmt.lib" は他のライブラリの使用と競合しています
今度はこれだけでました。
調べたところ
URLリンク(m--takahashi.com)
libがReleaseコンパイルで、テストプロジェクトがDebugコンパイルなのが悪いようでした。
libをRelease版とDebug版の両方をつくり、適切にリンクするようにしたところ、エラーがきえました。
ここで疑問なのですが、今後の汎用性を考えるとlibは
・シングルスレッドDebug版
・シングルスレッドRelease版
・マルチスレッドDebug版
・マルチスレッドRelease版
をそれぞれ用意しておかなければならないのでしょうか?
一般的に用意されている"winmm.lib"などは、何も考えずにstdafx.hに
#pragma comment(lib, "winmm.lib")
と書いておけば、シングルスレッドだろうがマルチスレッドだろうが、DebugだろうがReleaseだろうが適切にリンクされました(警告やエラーでません)
自作のlibも同じくらい気軽に使えるようにするには、どのようにしたら良いのでしょうか?
102:デフォルトの名無しさん
08/02/07 14:32:02
おっと、
>>99を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) {
return a < b; //辞書順で昇順
}
};
か。
103:デフォルトの名無しさん
08/02/07 14:38:33
const が有った方がいいな。
104:デフォルトの名無しさん
08/02/07 14:39:36
ハードディスクへの書き込みで、メモリへのキャッシュを自動で行ってくれる命令ありますか
105:デフォルトの名無しさん
08/02/07 14:52:29
おっと、
>>103を見て
struct func : public binary_function<string, string, bool>
{
bool operator()(const string &a, const string &b) const {
return a < b; //辞書順で昇順
}
};
か。おれはconstをよく忘れる。
106:デフォルトの名無しさん
08/02/07 14:53:31
>>101
・Debug版は公開しちゃいけません
・現行VCはシングルスレッド版ランタイムがありません
>>104
そんな「命令」なんてあるもんですか。
107:デフォルトの名無しさん
08/02/07 14:59:57
>>106
MFC等のデバッグ版DLLの再配布が禁止なだけで
自前ライブラリのデバッグ版配布は禁止じゃねえだろ。
108:デフォルトの名無しさん
08/02/07 15:05:41
>>106
自前でキャッシュ用意しましたよ
109:デフォルトの名無しさん
08/02/07 15:16:46
>>106
101です
お返事ありがとうございます。
>・Debug版は公開しちゃいけません
確かにそもそもDebug版は用意しておく必要ないですよね
ただ、d3d9.lib も、デバッグ版らしき d3d9d.libというものがあります。
もしかして「Debug/Releaseで自動的にリンクを変えている」なんていうのは私の妄想で
d3d9d.libは使われていないのでしょうか?
>・現行VCはシングルスレッド版ランタイムがありません
これはつまり、世の中に配布されてるlibはマルチスレッド版で作られており、
マルチスレッド版libは、シングルスレッドなプロジェクトで利用しても特に問題が起きないということでしょうか?
(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
そもそも「_beginthreadを使うためにはマルチスレッド版にする必要がある」という認識しかもっておらず、
「マルチスレッド版にしないことによる利点」は知らないのです
110:デフォルトの名無しさん
08/02/07 15:21:59
>>109
まず、デバッグ版のlibがあるやつはpragmaで切り替えてるはず。
自分の作ったlibが物によって変わるのは、そいつの中でデバッグ版や
MT版のlibを呼んでるから。
そういうの避けたければスタティックリンクしてしまうといいかも。
111:デフォルトの名無しさん
08/02/07 16:08:21
>>109です
>(実際試してみたところ、シングルプロジェクトからマルチLibを呼び出してもエラーとなりませんでした)
これですが、勘違いでした。
やはり「マルチスレッド版のlibファイル」を「シングルスレッド版のプロジェクト」からリンクすると、
LINK : warning LNK4098: defaultlib "LIBCMTD" は他のライブラリの使用と競合しています; /NODEFAULTLIB:library を使用してください
となってしまいました。
(上のは、Debugマルチ版LibをDebugシングル版のプロジェクトにリンクした場合の警告です)
>>110
なるほど。hファイルあたりで、#ifdef _DEBUG やら色々としているのでしょうか。
>そういうの避けたければスタティックリンクしてしまうといいかも。
ちょっとこの意味合いがわからないのですが、詳しく教えていただけますでしょうか
どこかのサイトへのリンクでも構いません
112:デフォルトの名無しさん
08/02/07 16:26:09
教えてください。
以下の式で、shinが偽になるのはなぜでしょうか?
unsigned int a =10, b = 20;
char shin = ((a - b) < (b - a));
(a - b) = -10, (b - a) = 10 なので、shin = 真になるように思うのですが。。。
113:デフォルトの名無しさん
08/02/07 16:29:04
unsigned同士の演算の結果はunsigned
114:デフォルトの名無しさん
08/02/07 16:32:12
int型変数(-32768〜32767)に-40000とか入れようとしたらどうなると思う?
115:デフォルトの名無しさん
08/02/07 16:32:16
ありがとうございます
116:デフォルトの名無しさん
08/02/07 16:37:11
>>101
コンパイラオプション/ZlってVC6にない?
これはobjファイルにLIBCMTD.LIBとかCRTへの参照を
埋め込まないようにするコンパイラオプション。
1つのlibで全てを賄えるようにもなる。
けど現実的には最適化・デバッグオプションの有無で、
少なくともRelease/Debugの2種用意すべきだと思うけど。
117:デフォルトの名無しさん
08/02/07 16:48:16
>116
Zlオプションを使ったところ、DebugプロジェクトからReleaseLibを使っても警告がでなくなりました。
ありがとうございます。
(最初 Zl が ゼット・アイだと思って混乱しましたw ゼット・エルですね)
しかし、StaticLibraryの作り方を詳しく解説しているサイトって全然見当たりませんね…。
Lib側としては、Releaseだけ用意しておけばいいと思うのですがどうでしょうか?
Libがバグっていないと仮定して利用するのが前提ですけど
118:デフォルトの名無しさん
08/02/07 16:51:38
>>101
winmm.libってwinmm.dllの単なるインポートライブラリでは?
VCのランタイムをリンクしないライブラリならそういった問題は当然起きない
119:デフォルトの名無しさん
08/02/07 16:52:47
別にReleaseだけでもいいと思う。
DLLだとデバッグ版も提供なんて話聞かないし。
120:デフォルトの名無しさん
08/02/07 17:02:19
>>118
あ、なるほど。そういえばlibにはもうひとつ「DLLとリンクするためのインポートライブラリ」という役目がありましたね。
winmmはそっちですか。
(拡張子変えればいいのになぁ…)
>>119
了解しました。
>ALL
大変参考になりました。
ありがとうございました!
121:デフォルトの名無しさん
08/02/07 17:19:25
デバッグ版のlibを提供するのはlibをデバッグしてもらおうということじゃなくて、
それを使ったプログラムもLibのソースをトレースできるようにだよw
122:デフォルトの名無しさん
08/02/07 17:23:39
>121
誰への返事だ??
123:デフォルトの名無しさん
08/02/07 17:26:13
環境依存のレスはすべてスルーしてます
124:デフォルトの名無しさん
08/02/07 17:36:05
スレタイももちろんスルーです
125:デフォルトの名無しさん
08/02/07 18:04:43
template<typename T>
void foo() {
T x = T();
}
intやint*などの基本型に対してテンプレートでのデフォルト初期化
を可能にするために上のような表記が許されておりint*ポインタも渡せます。
(NULLポインタに初期化されている)
しかし、以下のポインタの初期化は許されていないのでしょうか?
int* p = int*(); //コンパイルNGでした
int i = int(); //OK
126:デフォルトの名無しさん
08/02/07 18:05:37
ISO 9660ファイルを参照できるDLLとかありませんか
127:デフォルトの名無しさん
08/02/07 18:28:40
>>125
それはできないけど、これならできる。
typedef int* pint;
template<typename T>
struct identity
{
typedef T type;
};
int* p1 = pint();
int* p2 = identity<int*>::type();
128:デフォルトの名無しさん
08/02/07 19:05:06
メモリが解放されてるかどうか確認する方法ってなんかあるかな?
void a( void* p ) {
if( rand() %2 ) delete p;
}
void main () {
char*pc = new char[100];
a(pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}
みたいな。
129:デフォルトの名無しさん
08/02/07 19:08:34
すまん誤爆った・・・ってここでもいいのかなこれ
130:デフォルトの名無しさん
08/02/07 19:13:57
>>127
typedefで可能ということは単なるシンタックスの問題だという
ことですかね。だとしてもfoo<int*>()は結果的に
int*()となるからNGのような気もしますがね。
131:デフォルトの名無しさん
08/02/07 19:31:29
リスト管理の時
リストのアイテムをdeleteしたとき、自動的に所属するリストからはずれる機能は、
stlでvectorとかlistとか使って所属リストを覚えて、リストからはずすより、
前後のポインタを持った、自己連結クラスのほうが速度的に早いですか?
というか、deleteしたとき、自動的に所属するリストから外れるtemplateみたいなもの
STLみたいな標準ライブラリにありますか?
132:デフォルトの名無しさん
08/02/07 19:34:12
>>130
単純にシンタックスの問題っぽいよ
>postfix-expression:
> simple-type-specifier ( expression-listopt )
(略)
>simple-type-specifier:
> ::opt nested-name-specifieropt type-name
> ::opt nested-name-specifier template template-id
> char
> wchar_t
> bool
> short
> int
(略)
>type-name:
> class-name
> enum-name
> typedef-name
>class-name:
> identifier
> template-id
intやクラス名やtypedef名はOKだけどint*は構文に合致しないっていう・・
133:デフォルトの名無しさん
08/02/07 20:03:47
>>128
そういうクラスでも用意しない限り、ありません。
つーか、そんな阿呆なメモリ管理戦略はありえません。
>>131
逆に、リストにあるオブジェクトをremoveするときにdeleteしては?
134:デフォルトの名無しさん
08/02/07 20:22:12
1904年の日露戦争の際に、ロシア正教会は全教会をあげて日本に天罰を
下すように神に祈りをささげた。結局なにも天罰は降りず、ロシアは負けた。
20年後、日本で関東大震災が発生。ロシアの物理学者カピッツァはこの事実から
「神はわれわれから9光年以内にいる」と結論を下したという。
135:デフォルトの名無しさん
08/02/07 20:47:14
お、おかしいアル・・・
/'⌒`ヽ、 5年後の世界に行ったらチューゴクがなかったアル・・・
ヽ、┗ ノ
`ーー' γ⌒`ヽ /'⌒⌒ヽ、
,-ーー-、 .|| ̄ ̄ ( ┃ ⌒ヽ
/ ┃ ) || ∧_∧ \ ━┛ )
.(. ┃ ) ||. ( `ハ´;)
ヽ、__,ノ || _(つ¶¶と)__
/||'''''| 三 | |'(⌒)
/ '―――`  ̄ \
`============'
136:デフォルトの名無しさん
08/02/07 20:51:06
>>132
なるほど。まあテンプレートのときのために用意されてる
規則なので、そのときだけ利用します。
ありがとうございました。
ところで、みなさんは原文の規格を持ってるんですか?
買うと4万近かったので高くてとても買えません。
137:デフォルトの名無しさん
08/02/07 21:14:24
JISならオンラインで読めるじゃん。画像だけど。
138:デフォルトの名無しさん
08/02/07 21:17:09
Visual C++ 6.0を使っているんですけど
C++のプログラムを実行すると
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2143: 構文エラー : ';' が '<class-head>' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\new(16) : error C2501: '_STD_BEGIN' : 識別名を宣言するのに、型が指定されていません。
c:\program files\microsoft visual studio\vc98\include\new(16) : fatal error C1004: 予期せぬ EOF が検出されました。
と出てしまいます。
どんなプログラムでもこのエラーが出てしまい実行できません…
どのようにすればこのエラーはなくなりますか?
139:デフォルトの名無しさん
08/02/07 21:18:22
>>137
そこでドラフトですよ。
若干現規格と違うけど、
古いドラフトだとまあまあ現規格に近いから十分参考にはなる。
140:デフォルトの名無しさん
08/02/07 21:25:29
>>138
必要なものが入ってないか入れる設定にしていない。
_STD_BEGINってのはSTLが使う宣言だからSTLが使えないんだろう。
(vectorでも使ってるんかね?)
俺はSTL使ってないんで後はぐーぐる先生か他の人にまかすわ
141:デフォルトの名無しさん
08/02/07 21:37:29
>>137
>>139
あれ検索できないから不便ですよね。まあ無料なのでたまに見ますが。
正式版を無料で配布して欲しいですね。
142:デフォルトの名無しさん
08/02/07 22:03:32
>>138
Visual C++ 2008 Expressとかだとどうなる?
143:デフォルトの名無しさん
08/02/07 22:50:19
>>105
(遅くなりましたが)
ありがとうございました。
144:デフォルトの名無しさん
08/02/07 23:20:56
>>128
標準では用意されていないので、人によっては解放したらその領域を指
していたポインタ変数を (* 自分で *) NULL にしておくようにしてい
る人もいる。
どっちかって言うと、バグってた時の二重解放除けとか、変な領域を壊さ
ないようにと言う防御策だが。
void a( void** p ) {
if( rand() %2 ) delete *p;
}
void main () {
char*pc = new char[100];
a(&pc);
// pcが解放されてなかったら解放
if( soreppoino( pc ) ) delete pc;
}
145:デフォルトの名無しさん
08/02/08 01:48:10
確保していないのにdeleteするとバグるんですが対処法ありますか
146:デフォルトの名無しさん
08/02/08 01:50:44
単独ではつかわないでコンストラクタ、デストラクタ内で使えば安全かなあ
147:デフォルトの名無しさん
08/02/08 01:59:05
void a( void** p ) {
if( rand() %2 ){
delete *p;
*p = NULL; // delete後はNULLを入れておく
}
}
void main () {
char*pc = NULL; // ポインタは普通NULLで初期化しておく
if( rand() %2 )
new char[100];
a(&pc);
delete pc; // pcがNULLなら何もしない
}
148:デフォルトの名無しさん
08/02/08 01:59:41
while (cin) {
...
}
という処理についてなんですが、cinって最初はとりあえずtrueになるのですか?
すると、いつfalseになるんですか?
エラーフラグがたってればfalse、それ以外はtrueになるのかな?
cinで何かデータを読み込んだ後だけtrueになるのかと思ってました。
149:デフォルトの名無しさん
08/02/08 02:00:03
> new char[100];
pc = new char[100] でした。
150:デフォルトの名無しさん
08/02/08 02:04:09
スタート
↓
標準入力からデータがcinに行く
↓
cinがtrueになる
↓
while(cin)が評価される
というかんじなんじゃね?
151:デフォルトの名無しさん
08/02/08 02:12:09
>>147
C++では汎用ポインタへのポインタって合法だったっけ。
152:デフォルトの名無しさん
08/02/08 03:44:28
問題ない。
153:デフォルトの名無しさん
08/02/08 03:55:20
coutとfstream(適当なファイルに対してオープン済みのもの)とのそれぞれに、ほぼ同じ処理を書くのですが、
1つの関数にまとめたいと思うのですが、どうすればいいでしょうか?
void print((型が分からない) stream) {
stream << "hogehoge" << endl;
...
}
こんなのも考えてみたのですが、コンパイルできず、ダメでした。
template<class T>
void print(char *filename) {
T outStream;
if (filename) outStream.open(filename);
outStream << "hogehoge" << endl;
...
}
どうかよろしくお願いします。
154:デフォルトの名無しさん
08/02/08 07:25:40
>>138
new ヘッダをインクルードする前に
new をマクロで置き換えてないか?
155:デフォルトの名無しさん
08/02/08 10:49:42
>>153
std::ostream
156:デフォルトの名無しさん
08/02/08 11:53:19
サクラエディタのソースコードを眺めていたのですが、コメント部でよくわからない表記があります。
@param などはなんとなく想像がつくのですが、「//!<」や「/*! */」は何を意図しているのでしょうか。
どなたか教えてください。
157:デフォルトの名無しさん
08/02/08 11:57:37
>>156
つ[Doxygen]
158:デフォルトの名無しさん
08/02/08 11:59:11
まさに、それですね。
ありがとうございました。
159:デフォルトの名無しさん
08/02/08 13:23:53
例外処理の使い方がいまいち分かりません
例外を投げたらその処理の中で解決した方が良いのか
それとも解決方法を使う側に投げっぱなしにしてしまうのか
例外をどういう形でthrowするのがいいのか
なんというか感覚的に掴みにくいというかなんというか
160:デフォルトの名無しさん
08/02/08 13:25:33
無用物
161:デフォルトの名無しさん
08/02/08 13:32:44
参照を返すとオブジェクトが捨てられたときに
帰ってきたものも向こうに?
162:デフォルトの名無しさん
08/02/08 13:34:05
>>159
自関数の中でリカバリできるならcatchして処理すればよい
そうでないなら呼び出し元にまかせる
普通のエラー処理と同じようなもんだ
自分で処理できるならして、処理できないなら呼び出し元にエラーコードなりなんなりをreturnするだろう
エラーコードのreturnが例外のthrowに変わるだけ
163:デフォルトの名無しさん
08/02/08 13:34:37
>>161
日本語で
164:デフォルトの名無しさん
08/02/08 13:48:01
>>162
そういう感じで良いんですか
気軽に使えるなら使ってみようかな・・・
165:デフォルトの名無しさん
08/02/08 14:03:21
とある3種類の計測器をモニターするプログラムなんですが
似てるけど若干ちがう命令が3つあるとします
この場合
クラス分けをしていくとき
計器の共通化持つクラスを基底として、それぞれの機能をもつ派生クラスを作るか
機能の共通処理をもつクラスを基底として、それぞれの計器にあわせて派生クラスを作るか
どちらが今後計器が増える可能性を加味したとき、よい設計でしょうか
166:デフォルトの名無しさん
08/02/08 14:07:41
>>165
その計測器メーカに合わせるのが一番。
あるメーカは旧型機種の機能を改変しつつ新機能を作るかもしれないし、
あるメーカは旧型機種の機能を残しつつ新機能を作るかもしれない。
なんてことは兎も角、使い易いように作れば?
167:138
08/02/08 15:05:04
返信遅くなってすいません!
>>140
STLは使ってなくてもこのエラーなんですよ…
Hello Worldみたいな文字を出力するだけのプログラムでも
実行できないです。
>>142
Visual C++ 2008 Express Editionで実行したらできました!
ありがとうございます。
>>154
マクロも使ってないので違うと思うのですが…
Visual C++ 6.0を使い慣れているので
どうにかして実行させたいのですが・・・
168:デフォルトの名無しさん
08/02/08 15:22:22
class Fruit;
class Apple : Fruit;
std::vector<Fruit> fruits;を作ると
抽象クラスをインスタンス化できません。
と言われるです。どうするですか?
169:デフォルトの名無しさん
08/02/08 15:23:31
Fruit がそういうつくりになってるんじゃないの?
170:デフォルトの名無しさん
08/02/08 15:24:38
>>168
class Fruitを具体化してください。
171:デフォルトの名無しさん
08/02/08 15:36:19
std::vector<Fruit*> fruits;
172:デフォルトの名無しさん
08/02/08 16:14:45
コンパイラにBCCを使って数値計算をしているのですが、
しばらくプログラム実行していると、EXP: OVERFLOW ERRORと出ます。
これは、exp関数に入れた値がexp関数の扱える値(doubleの範囲)よりも大きいと言うことでしょうか?
173:デフォルトの名無しさん
08/02/08 16:23:52
>>167
俺、解決方法知ってるんだが…
174:デフォルトの名無しさん
08/02/08 16:25:09
vevtorにvcの_com_ptrは入りますか?
175:デフォルトの名無しさん
08/02/08 16:59:55
コピー初期化もコピー代入もできるから問題ないはず。
176:デフォルトの名無しさん
08/02/08 22:22:37
すいませんちょっとお聞きしたいんですが、
#include <iostream>
using namespace std;
int main(){
char ss[80] = "これは文字列です";
cout << ss[0] << ss[1];
return 0;
}
ってやって、coutで「こ」って表示されないのは、どういう理屈でしょうか??
177:デフォルトの名無しさん
08/02/08 22:24:09
UTF-8 なら3バイト必要だが、そういうわけではなくて?
178:デフォルトの名無しさん
08/02/08 22:34:20
>>176
ひょっとしてなんか変な文字がでたりしてるか?
179:176
08/02/08 22:34:23
ぐは、そうだったんですね・・2バイトでいいんだと思ってました汗
cout << ss[0] << ss[1] << ss[2];
とやったらちゃんと表示されました。
ありがとうございましたm(_ _)m
180:デフォルトの名無しさん
08/02/08 22:40:31
ちなみにWindows上だと>>176のコードで「こ」はちゃんと出た。(bcc32 / gcc@cygwin)
181:デフォルトの名無しさん
08/02/08 22:44:58
それはお前がソースをSJISで書いてるだけ
182:デフォルトの名無しさん
08/02/08 22:55:36
>>175
ども。
183:デフォルトの名無しさん
08/02/08 23:42:34
UTF-8 だと全て3バイトって訳じゃないのが面倒なところだよな。
184:デフォルトの名無しさん
08/02/08 23:43:11
>>181
UTF-16 でも出るがな。
185:デフォルトの名無しさん
08/02/09 00:17:28
他で聞いてきます
186:デフォルトの名無しさん
08/02/09 00:20:35
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません
とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか
187:デフォルトの名無しさん
08/02/09 00:33:08
ファイルはあるの?
188:デフォルトの名無しさん
08/02/09 00:40:25
pathの設定はしたか?
189:デフォルトの名無しさん
08/02/09 01:58:17
More Exceptional C++が届いたんだが
いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。
190:デフォルトの名無しさん
08/02/09 02:00:08
ちなみにコレ
VC++2008 g++ 4.0 でも不可
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
(argc > 2
? ofstream(argv[2], ios::out | ios::binary)
: cout)
<<
(argc > 1
? ifstream(argv[1], ios::in | ios::binary)
: cin )
.rdbuf();
return 0;
}
191:デフォルトの名無しさん
08/02/09 02:06:46
全く問題ないけど。まさかとは思うが、>190って2バイト空白入れたままで悪態ついているお馬鹿さん?
192:デフォルトの名無しさん
08/02/09 02:15:25
コンパイルできないときはエラーメッセージを書こう
なんてのは宿題スレでも徹底されてるような気がする。
193:デフォルトの名無しさん
08/02/09 02:17:41
gcc 4 で通らないな。
まあ当たり前だな。
右辺値の ofstream と左辺値の ostream(cout) だと
片方が右辺値なので右辺値にキャストして型を揃えようとするが、
この2つじゃどうやっても型を揃えられない。
194:デフォルトの名無しさん
08/02/09 02:20:34
VC だと右辺値の ofstream を
テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能)
コンパイル通るかもしれん。
195:デフォルトの名無しさん
08/02/09 04:37:38
たぶん、ここでしか聞けないのかなと思い書き込みさせてください!
File1.cppで定義・使用している複数配列 double a[10][5] を他の
ファイル(File2.cpp)でも共有して使用したいときって
(File2.cpp)
void CGridDlg::OnGdraw() //中で使用したい関数です
{
extern double a[10][5];
・・・・・・・・
}
と定義すれば使用できるものなのでしょうか。単配列(a[10]等)の時は同様の
方法で使用できたのですが。複数配列になると上記ではリンクエラー
(LNK2001)がでてしまいます。環境はVC6++(MFCダイヤログベース)です。
超初心者です。Cの本を見てポインタなり、externなりが関係しそうかなと思った
のですが、なかなかいい兆しが見えなくて助けを借りたい次第です。
196:デフォルトの名無しさん
08/02/09 07:49:02
>>191
ここに見やすく貼るために全角にしてるんよ
>>192
VC++2008でのエラーメッセージだがprivateメンバーにアクセスしようとしてる
らしい。
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ
(クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスで
きません。
>>193
ostream(cout)の意味が分からないんですが。3項演算子 A ? B : C
のBがrvalueでCがlvalueだからC(ここではcout)を右辺値にしようと
するということかな?
>>194
昔の規格なりコンパイラではOKだったのかもしれんです。
197:デフォルトの名無しさん
08/02/09 08:25:12
>>191
198:デフォルトの名無しさん
08/02/09 08:27:28
空白orタブ <-> /**/
の置換スクリプトを希望
199:デフォルトの名無しさん
08/02/09 08:28:26
>>197
>昔の規格なりコンパイラではOKだったのかもしれんです。
200:デフォルトの名無しさん
08/02/09 08:55:15
>>196
左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。
201:デフォルトの名無しさん
08/02/09 09:50:51
>>195
externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。
202:デフォルトの名無しさん
08/02/09 09:59:52
>>195
CGridDlg の private メンバ変数にして、
a の取得関数を用意すれ。
class CGridDlg {
public:
typedef double Hoge[5];
Hoge* GetA() { return m_a; }
const Hoge* GetA() const { return m_a; }
private:
Hoge m_a[10];
};
Hoge* a = grid_dlg.GetA();
a[0][0] = 1;
203:デフォルトの名無しさん
08/02/09 10:37:35
猫でもわかるを買ったんですが、
超初心者の俺にはさっぱりわかりません。
何かわかりやすい本などあったら教えてください。お願いします。
204:デフォルトの名無しさん
08/02/09 10:39:09
>>203
ちなみにC言語です。よろしくお願いします。
205:デフォルトの名無しさん
08/02/09 10:41:09
>>203
その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください
それより多少分かりやすいと評判のものもありますが、大差はありません
それとも環境が用意できないとかそういうことですか?
206:デフォルトの名無しさん
08/02/09 11:54:33
>>203
その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。
手で入力して試すのが肝心。
付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。
207:デフォルトの名無しさん
08/02/09 13:26:37
>>200
なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?
208:デフォルトの名無しさん
08/02/09 13:37:27
コピーしようとすると見るエラーだな
209:デフォルトの名無しさん
08/02/09 13:55:53
>>207
ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。
210:デフォルトの名無しさん
08/02/09 14:04:36
>>207
static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる
211:デフォルトの名無しさん
08/02/09 15:06:27
>>209
>>210
ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
212:デフォルトの名無しさん
08/02/09 15:07:47
ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。
は>>208さんへのレスでした。
213:デフォルトの名無しさん
08/02/09 15:24:28
coutをコピーするというのは意味がわからん、ってのもあるかもね
コンソール自体が2個に増えるわけじゃあるまいし
214:デフォルトの名無しさん
08/02/09 15:33:48
>>198
つかってやってください
スレリンク(unix板:55番)
215:デフォルトの名無しさん
08/02/09 16:41:15
>>205
環境が用意できないです。
それでもあきらめた方がいいですか?
216:デフォルトの名無しさん
08/02/09 16:49:08
>>203
そのままの意味が分からないけど、HDVも圧縮された素材ですよ。
H.264とは異なる方式で。
Wikipedia項目リンク
217:デフォルトの名無しさん
08/02/09 16:52:43
あ、なんかすげー誤爆ってた。失礼orz
218:デフォルトの名無しさん
08/02/09 16:58:08
環境が用意できないっつー意味がわからん。
Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?
219:203
08/02/09 17:03:06
すいません。アフォで…
自分は今、第二章で止まってます。
と言うのも、いきなり「では、ソースを見てみましょう」となり、
「開発環境によってコンパイルの手順が異なります」
↑この時点でわかりません。
自分には向いてないのかな…orz
220:デフォルトの名無しさん
08/02/09 17:05:32
void hoge(const char* name){ char* piyo = name + (sizeof(char) * 5); }
こんなようなことはなんで出来ないんでしょうか?
文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
error C2440: '=' : 'const char *' から 'char *' に変換できません。
このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです
221:デフォルトの名無しさん
08/02/09 17:12:11
const char *piyo
222:デフォルトの名無しさん
08/02/09 17:13:49
>>220
書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。
223:デフォルトの名無しさん
08/02/09 17:14:36
char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。
hoge内で文字列を弄りたいなら引数をchar *にするべき。
引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)
224:220
08/02/09 17:17:20
>>221-223
ありがとうございます。
よく考えたらいじる必要はないのでpiyo側をconstにしました
225:デフォルトの名無しさん
08/02/09 17:18:01
>>219
とりあえず、なにか揮発環境は持っているのか?
226:デフォルトの名無しさん
08/02/09 17:18:34
> name + (sizeof(char) * 5)
彼は大丈夫だろうか。
227:デフォルトの名無しさん
08/02/09 17:19:23
>>225
はい。
ジクロルボスは揮発するので大丈夫です。
228:デフォルトの名無しさん
08/02/09 17:22:30
俺のチームのメンバも先週揮発したぜ。
229:デフォルトの名無しさん
08/02/09 17:23:57
ちょっと待て、それは「蒸発」じゃないのか?
230:デフォルトの名無しさん
08/02/09 17:24:28
>>226
それって問題あるのか?パッと見わからん
231:デフォルトの名無しさん
08/02/09 17:26:23
>>230
char であるときには問題にはならないが int とかになると…
232:デフォルトの名無しさん
08/02/09 17:26:24
>>230
>220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです
233:デフォルトの名無しさん
08/02/09 17:26:31
>>229
そうだな。揮発は性質で、蒸発は現象だからな。
234:デフォルトの名無しさん
08/02/09 17:27:47
>>231
いや、だいじょうぶだろw
ちゃんとintの大きさに対応してくれるよw
235:デフォルトの名無しさん
08/02/09 17:27:55
>>230
ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?
236:デフォルトの名無しさん
08/02/09 17:28:25
>>234
ごめん間違えた
237:デフォルトの名無しさん
08/02/09 17:28:46
ConceptGCCで、190のコードのofstreamとifstreamを
ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、
エラーだったorz。右辺値参照はライブラリまで及んでいなかった。
238:デフォルトの名無しさん
08/02/09 17:29:06
sizeof(*name)にするべきとか。
239:デフォルトの名無しさん
08/02/09 17:29:46
>>238
阿呆ですか?
240:デフォルトの名無しさん
08/02/09 17:30:00
>>219
適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ
241:203
08/02/09 17:46:21
>>225
>>240
すいません。もう一度調べなおしてみます。
242:デフォルトの名無しさん
08/02/09 17:47:29
>>238-239
&5[name] でいいだろ。
243:デフォルトの名無しさん
08/02/09 17:49:48
>>242
>232
244:デフォルトの名無しさん
08/02/09 17:58:03
char ch='a';
cout <<(int) ch << '\n'; // 97
int dt=97;
cout << (char)dt<< '\n'; // 'a'
とできるのに、
wchar_t ch1='あ';
cout <<(int) ch1 << '\n'; // 33340
int dt1=33440;
cout << (wchar_t)dt1<< '\n'; // 0x82a0
と'あ'がでないで、82a0が出るのはなぜですか?
(82a0は33440の16進です)
245:デフォルトの名無しさん
08/02/09 18:03:03
class test{
char* str;
int len;
public:
test(const char* str);
};
test::test(const char* str0){
len = strlen(str0);
str = new char[len+1];
}
とすると
(msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccc0 を読み込み中にアクセス違反が発生しました。
こんなようなエラーがでます、いろいろとコメントアウトして試してみていたのですが
str = new char[len+1];部分でエラーが出ているようです、これを
str = new char[256];のようにするとエラーはでないのですが、定数でなければならないとかないですよね?
一体なんででしょうか?
246:デフォルトの名無しさん
08/02/09 18:10:38
書いてないところのバグを見つけろって言う話?
247:デフォルトの名無しさん
08/02/09 18:10:39
>>245
そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。
248:デフォルトの名無しさん
08/02/09 18:10:53
>>245
その部分は問題ないように見える。
256にするとエラーが出ないところからみて、
どこかでバッファオーバーフローしてるんじゃない?
249:245
08/02/09 18:12:34
>>246-247
えっとすみません、str0には固定の文字を入れるようにして試しています
16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。
また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます
250:245
08/02/09 18:15:42
main内に
char* buff = "abcdefghijklmnop";
test hoge(buff);
これだけです
余計な部分を全てコメントアウトしてるのでこれでコードは全てです
251:デフォルトの名無しさん
08/02/09 18:16:08
実行部分をみせろ。
test test1("abcdabcdabcdabcd");
ならまったく問題ないはず。
252:251
08/02/09 18:22:16
ごめん、違うな
253:デフォルトの名無しさん
08/02/09 18:23:47
>>245
そこを変えたら動くからといって、バグの出元がそこだとは限らない
ぜんぜん関係なさそうな別の場所も疑う必要がある
254:デフォルトの名無しさん
08/02/09 18:24:42
strにはアクセスしないの?
test内でstrcpyしなくていいのか?
なにがやりたいんだ?
255:245
08/02/09 18:36:41
>>253
提示した部分以外をコメントアウトしているのですがエラーが出る状態です
>>254
その部分が原因かとも疑ってコメントアウトさせているのですがエラーが出る状態です
test::test(const char* str0){
len = strlen(str0);
str = new char[len+1];
strcpy_s(str, len+1, str0);
printf("%s\n", str0);
printf("%d\n", len);
printf("%s\n", str);
}
こんな具合にしますと
abcdefghijklmnop
16
abcdefghijklmnop
と表示されますがしっかりエラーがでます
256:デフォルトの名無しさん
08/02/09 18:44:34
mainってことは、MFCとかは使ってないわけか……
リビルドしたら直るとか言う落ちはないよな?
257:デフォルトの名無しさん
08/02/09 18:44:45
>>255
余計なincludeもコメントアウト。
さらにエラーが無くなるまでコメントアウト。
新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。
258:デフォルトの名無しさん
08/02/09 18:44:52
おかしいなあ、ちゃんと動くぞよ。
259:デフォルトの名無しさん
08/02/09 18:46:07
class test{
char* str;
int len;
public:
test(const char* str);
};
test::test(const char* str0){
len = strlen(str0);
str = new char[len+1];
}
int main(int, char**)
{
char* buff = "abcdefghijklmnop";
test hoge(buff);
return 0;
}
これで、エラーになるって事?
260:デフォルトの名無しさん
08/02/09 18:53:05
少なくともうちでは落ちない。
VC++ 2005 Express Edition SP1 + Win2KSP4
261:デフォルトの名無しさん
08/02/09 18:59:59
>>255
どの行で例外発生してるか突き止めたのか?
262:244
08/02/09 19:00:55
こちらもヨロ
263:デフォルトの名無しさん
08/02/09 19:02:03
>>262
wchar_tがただのtypedefの環境ではそうなる。
VC++6とか。
264:244
08/02/09 19:05:57
>>263
はい、VC++2005EEですので、
そういうものなのですね。
どうもでした。
265:デフォルトの名無しさん
08/02/09 19:06:46
2005はさすがにtypedefじゃないんじゃないか?
266:244
08/02/09 19:10:30
どうすれば確かめられますか?
267:デフォルトの名無しさん
08/02/09 19:14:15
>>266
wchat_tとsizeofが一致するいろんな組み込み型とで、オーバーロードしてみる。
268:デフォルトの名無しさん
08/02/09 19:15:47
wchar_tを組み込み型として扱うコンパイルオプションがあったはず
269:244
08/02/09 19:25:45
>>267
すいません、よくわかりません。
>>268
MSDN
------
Visual C++ コンパイラ オプション
/Zc:wchar_t (wchar_t をネイティブ型として認識)
/Zc:wchar_t を指定しない場合は、wchar_t を定義するか、または
wchar_t が定義された多数のヘッダー ファイルのいずれか
(wchar.h など) をインクルードする必要があります。
通常、wchar_t は unsigned short として定義されます。
----
とあったので、このオプションをON/OFFしてみましたが、
結果は変わりませんでした。
270:デフォルトの名無しさん
08/02/09 19:50:27
namespace hoge
{
int main(int argc, char *argv[])
{
}
}
これをコンパイルすると、↓と言われます。どうすればいいですか?
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
271:デフォルトの名無しさん
08/02/09 19:51:37
>>244
coutはワイド文字に対応していない。
wcoutを使えば良い。
wcout.imbue(locale(""));
wchar_t ch1= L'あ';
wcout << (int)ch1 << L'\n';
int dt1 = 12354;
wcout << (wchar_t)dt1 << L'\n';
272:デフォルトの名無しさん
08/02/09 19:52:06
>>270 何がしたいのか考え直すといいです。
273:デフォルトの名無しさん
08/02/09 20:03:51
>>270
namespace hoge
{
extern "C" int main(int argc, char *argv[])
{
}
}
274:デフォルトの名無しさん
08/02/09 20:18:31
テラ反則w
275:244
08/02/09 20:24:00
>>271
動きました。
私のだと、いろいろな点で駄目でしたね。
ありがとうございました!
276:デフォルトの名無しさん
08/02/09 20:29:58
ちょっとお尋ねしたいのですが、
char *p
というポインタに、なにかしらのアドレスが格納されていて、
cout << p;
とした時に、仮に
ss[100] = {a b, c ...}; (ss[100] = \0 とする)
p = ss;
だった場合は、ss[0]から順に\0が出てくるまで走査して、
cout << p;
で、abc... と表示するわけですよね。つまり配列の要素100個分順番に読み込んでるってことですよね。
では、もしポインタpに格納されているアドレスが普通の変数のアドレス
p = &a
みたいな場合だった時は、
cout << p;
では、単純に変数aのアドレスが出力されるだけですよね。
で、ここで疑問なのですが、
p = &a;
cout << p;
だった時、処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
「配列」のポインタの場合もあるので、何かしらの方法で判断していると思うのですが、
「メモリを順番に走査して\0が出てこなかったら変数のポインタ」だとしたら
毎回\0が出てくるまで番地を順番に走査していかなくてはならないので(\0が出て来ないかもしれないのに(変数の場合))何か違う気がします。
ポインタには、アドレスや型の情報だけではなくて、そのアドレスが変数のアドレスか、それとも配列の先頭アドレスかという情報も入っているんでしょうか?
277:デフォルトの名無しさん
08/02/09 20:30:49
>>274
正しい。
278:デフォルトの名無しさん
08/02/09 20:43:53
>>276
単に何の型のポインタになっているかで決まる。
型が char* のときとそれ以外の T* について
operator<< のオーバーロードが違うだけ。
char a = 'A';
char* p = &a;
cout << p << '\n'
とすると確保されていない領域まで突き抜けて文字列が表示される (はず) 。
279:デフォルトの名無しさん
08/02/09 20:43:57
>>276
コンパイルするときに決まる。
それがconst char*だったら文字列、void*だったらアドレスを表示する。
その他のポインタ型は多重定義解決の規則に従って、上のどっちかに振り分けられる。
280:デフォルトの名無しさん
08/02/09 20:47:05
>>276
> p = &a
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
(aがたとえば int であるとして。)
それは間違い。
> p = &a
これをやった時点でコンパイラは型が違うとエラーにする。
p = reinterpret_cast<&a>として無理やりキャストをしてpに int * の値を入れることは可能。
>処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
pを宣言する際に、その型を char* と指定しているから、pが実際にさす先に実際にあるものが
charの配列であっても、int型の値であっても、コンパイラはcharの文字列であると扱う。
aの値がたまたま有効な文字の文字コードと'\0'が並んだ物となっていれば、該当する文字列として表示されるし、
そうでなければ制御コードを出力したり文字化けしたりする。
281:デフォルトの名無しさん
08/02/09 20:58:25
>>276は一貫してpをchar*として話しているのでは。
そうすると、
> p = &a
> みたいな場合だった時は、
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
は間違い。
aが存在するメモリ位置から始めて、それ以降にたまたま存在するデータを、
無理やり文字列と解釈して出力するだけ。
282:176
08/02/09 21:37:59
そーかそもそも文字列を扱うのはchar型だけだから、
<< がオーバーロードを利用してconst char*型だけ特別に扱うようにしている、ということですね。
ありがとうございましたm(_ _)m
283:デフォルトの名無しさん
08/02/09 23:57:11
こんにちは。角度の比較のよい方法が思いつかずに苦労しています。
角度A,B,Cがあって、BがAとCの中に入っているがを判定する式で悩んでいます。
角度系は時計の3時が0度、反時計回りに360まであります。
(CはAから見て反時計方向に92度離れています)
単純な比較式
A<B && B<C
とすると、A=350度、B=0度、C=30度のときうまく成立しません。
A,B,Cそれぞれがどの象限にいるかによって
判別式を変えることも考えたのですが、組み合わせを考えるとあまりスマートな方法とも思えません。
何か簡単な式などでBがはさまれていることを知る方法があれば教えていただけませんか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4991日前に更新/249 KB
担当:undef