■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
C++相談室 part41
251
名前:
デフォルトの名無しさん
:2005/07/18(月) 13:48:42
>>247
全加算機実装するのに引き算を使ってるのはいかがなものか
252
名前:
246
:2005/07/18(月) 14:08:12
typedef unsigned short T;
T fadd2(T a, T b)
{
while (b) {
T carry = a & b;
a = (a ^ b);
b = carry << 1;
}
return a;
}
これで目的のものができそうです。thx all
253
名前:
デフォルトの名無しさん
:2005/07/18(月) 14:44:09
floatやdoubleの符号を低コストで変える方法ってあるのでしょうか
符号付き整数型ならば、確か一番上のbitを上げ下げするだけで可能だと、習った気がします
今は単に
float f;
f *= -1.0f;
とかやってます
254
名前:
デフォルトの名無しさん
:2005/07/18(月) 14:46:45
>>253
コンパイラがその程度の最適化もできないとお思いか。
下手の最適化休むに似たりじゃ。いや最悪状況が悪くなる場合まである。
255
名前:
デフォルトの名無しさん
:2005/07/18(月) 14:47:31
>>253
f = -f; としてやれば、まともなコンパイラなら一番低コストな方法に
変換してくれる希ガス。
256
名前:
デフォルトの名無しさん
:2005/07/18(月) 14:53:51
>>253
整数だって同じだぞ。
最上位ビットの上げ下げで済むならコンパイラがそうするってことで
そういうコードを書けってことではない。
大体2の補数だとそれじゃダメだ。
257
名前:
デフォルトの名無しさん
:2005/07/18(月) 14:57:22
(´-`).。oO(Gems3に色々載ってたな……)
258
名前:
デフォルトの名無しさん
:2005/07/18(月) 15:01:43
ていうか一番上のビットの上げ下げで符号を変えれるのはむしろfloatとdoubleだろ。
まぁ、そんなコードをコンパイラに頼らずに一々書くやつは抹殺したくなるが。
259
名前:
デフォルトの名無しさん
:2005/07/18(月) 15:02:08
>>257
C++ Gems? 3なんてあったっけ? とかいってみたり
260
名前:
253
:2005/07/18(月) 15:13:14
皆さんありがとうございます
257さんが気になりますが、コンパイラに任せて255さんのやり方でいきます
261
名前:
デフォルトの名無しさん
:2005/07/19(火) 05:26:54
floatなのが気になって眠れない……
262
名前:
デフォルトの名無しさん
:2005/07/19(火) 08:54:27
ゲーム屋とかじゃないの?
263
名前:
デフォルトの名無しさん
:2005/07/19(火) 13:11:34
あのさ、特定のプログラムがUnicodeに対応しているかを取得する方法ってあるの?
バージョン情報じゃないみたいだし、
検索してみたけど検索キーワードがヘタレなのかヒットしない (;´Д`)
いっそのこと、ファイル名のOEM外の文字を"_"とかに置き換えようかな・・・。
264
名前:
デフォルトの名無しさん
:2005/07/19(火) 13:34:51
Unicodeに対応しているという言葉の意味が不明なのでなんともいえない。
そもそも環境依存の話ならスレ違いだが。
265
名前:
デフォルトの名無しさん
:2005/07/19(火) 13:37:03
OEMという言葉からしてWindows固有の話っぽいな
266
名前:
デフォルトの名無しさん
:2005/07/19(火) 14:18:18
>>264
, 265
VC++のスレだと思い込んでました(゚∀゚;) 逝ってきま
267
名前:
デフォルトの名無しさん
:2005/07/19(火) 16:13:52
>>266
DependencyWalkerでUnicodeAPI呼んでるか見たら?^^;;;
268
名前:
デフォルトの名無しさん
:2005/07/19(火) 21:16:56
親1、子多数で、子がまた親になりうる様な、
そんな一般的なTree構造を実現しているtemplateのうち、
比較的標準のものがあったら、教えて頂けないでしょうか
269
名前:
デフォルトの名無しさん
:2005/07/20(水) 09:29:10
Compositeパターンでググれ
270
名前:
デフォルトの名無しさん
:2005/07/20(水) 12:27:16
例えばCompositeパターンを実装するにしても
いくつか共通のメソッドが出てくると思うのですが(addChile的やシーク関連等)
その辺のtemplate(!=パターンの)があればなと
271
名前:
デフォルトの名無しさん
:2005/07/20(水) 16:02:10
配列の参照ってどうやったら引数に取れるのか教えてください。
*&charで宣言はいいんだが、呼び出し側の記述がワカラソ…
272
名前:
デフォルトの名無しさん
:2005/07/20(水) 16:32:37
>>271
template <int N>
char (&array)[N] とか。BCCだと通らんぞ。
273
名前:
デフォルトの名無しさん
:2005/07/20(水) 16:41:29
BCCだとそんなのすら通んないの?
274
名前:
271
:2005/07/20(水) 17:01:00
ごめん、言ってる意味がわかんなかった。出直してくる、
275
名前:
デフォルトの名無しさん
:2005/07/20(水) 17:03:37
普通に
void f(char (&array)[20]);
で取れるが。呼び出すときは、
char x[20];
f(x);
276
名前:
デフォルトの名無しさん
:2005/07/20(水) 17:07:15
いやいや、あらは初新車に難しいだろ〜と
吹き込む2ch宗教だから。
*(onagai_mite + 3); でおk;
「c 参照渡し」とかでぐぐれ。
と、静観してたヤシが言ってみる。
277
名前:
デフォルトの名無しさん
:2005/07/20(水) 17:21:13
>>271
g++/bccでテスト。
#include <all> // :P
void f(int* const & array) {
for (int i = 0; i < 10; ++i) array[i] = i;
};
int main() {
int array[10];
f(array);
for (int i = 0; i < 10; ++i) cout << array[i] << endl;
}
278
名前:
デフォルトの名無しさん
:2005/07/20(水) 18:09:19
>>277
それが配列の参照か?
279
名前:
デフォルトの名無しさん
:2005/07/20(水) 18:33:53
>>278
違うかもしれんw
スマソ、配列を使うことがない(万が一使うとしてもnewしてポインタを受け取る)ので
ANSI/ISO IEC14882見ながら適当に書きました。
一応、reference to pointer版:
void f(int*& array) {}
int main() {
int* pointer_to_array_of_int = new int[10];
f(pointer_to_array_of_int);
};
280
名前:
デフォルトの名無しさん
:2005/07/20(水) 18:40:14
配列の参照ってなにいってんの?
ただのintへのポインタの参照じゃん
int* p = nullpo;
f(p);
281
名前:
デフォルトの名無しさん
:2005/07/20(水) 19:37:42
単にポインタと要素数の2つか、あるいはイテレータをfirstとlastの2つを引数にとればいいんじゃないか?
282
名前:
デフォルトの名無しさん
:2005/07/20(水) 20:17:34
なぜわざわざcharの配列に限定するのかわからんな
string使え。string&で受け取れ。書き換えないならconstをつけろ。
>>280
配列への参照と、配列の先頭アドレスへのポインタへの参照は別物だぞ
283
名前:
デフォルトの名無しさん
:2005/07/20(水) 20:42:40
とはいえ、プロも歳をとれば油断する。
大事故になりかねない。
若い奴でも調子に乗ればとんでもない殺人を犯すことになる。
プロでも酒を飲めば3人の高校生の命を奪ってしまう最近の交通事故のように
なることもありうるのだ。
JR西日本のような列車事故は焦ったために起きたことだ。
焦りに焦ってバグで人を殺すようなプログラミングをすることは許されない。
私はC++を医療器や航空機に使うことは反対だ。
C++は使い方を誤ると誤って患者や旅客の命を奪いかねない言語だからだ。
だから人の命を奪う恐れが高いC++は普及させないほうがいいと思っている。
時間とかければいいとはいえ、顧客は容赦しない、
「他の言語でやすくできるならなぜC++では安くできないのか?」
と問いつめてくるのだ。そうなると大抵の企業はものを「お客様は絶対的な神様だ」と称して
ものを速く完成させようとすると。すると徹夜残業が増える。徹夜残業しても間に合わないので
C++にしかできないとんでもないスパゲティコードが生まれる。
そしてC++のコードが世に増えれば増えるほど無駄に徹夜する時間が増えてしまう。
C++のコードを貰い受け、引き継ぎ、苦労する後継者が増える。
そして焦りが人の命を奪う。
だから、私はC++だけで作られた自動操縦システムを開発することに反対する。
JR西日本のような列車事故を二度と起こさないためにも。
少なくともC++に厳重なルールとC++の規格が統一されるまでは
C++は普及させないほうがいいだろう。人々の命を救うためにも。
284
名前:
デフォルトの名無しさん
:2005/07/20(水) 20:50:54
void array_callee(int (&array)[10]) {
cout << sizeof array/sizeof array[0] << endl;
for (int i = 0; i < 10; ++i) array[i] = i;
};
void array_caller()
{
int array[10];
cout << sizeof array/sizeof array[0] << endl;
array_callee(array);
for (int i = 0; i < 10; ++i) cout << array[i] << endl;
}
void vector_callee(vector<int>& array) {
cout << array.size() << endl;
for (int i = 0; i < array.size(); ++i) array[i] = i;
}
void vector_caller()
{
vector<int> array(10);
cout << array.size() << endl;
vector_callee(array);
for (int i = 0; i < array.size(); ++i) cout << array[i] << endl;
}
285
名前:
デフォルトの名無しさん
:2005/07/20(水) 22:14:50
string string_rep() const; // Expression of character string
void char_rep(char s[]) const; // Expression of C style character string
286
名前:
デフォルトの名無しさん
:2005/07/20(水) 22:20:09
よく分かります
287
名前:
デフォルトの名無しさん
:2005/07/20(水) 23:19:44
>>284
そこはこうしようよ。
template<typename Iterator>
void array_callee(Iterator first, Iterator last)
{
cout << distance(first, last) << endl;
for (int i = 0; first != last; ++first, ++i)
*first = i;
}
template<std::size_t N> inline void array_callee(int (&array)[N])
{
array_callee(array, array + N);
}
inline void vector_callee(vector<int>& array)
{
array_callee(array.begin(), array.end());
}
288
名前:
284
:2005/07/21(木) 00:42:58
>>287
惚れた
289
名前:
デフォルトの名無しさん
:2005/07/21(木) 12:33:43
void f( int* i ); と void f( int i[] ); って同義でしょ?
つまり配列の参照は使い道がないってことでOK?
290
名前:
デフォルトの名無しさん
:2005/07/21(木) 12:42:08
>>289
ハァ?
291
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:15:31
>>289
>void f( int* i ); と void f( int i[] ); って同義でしょ?
は確かにそのとおりだけれど
>つまり配列の参照は使い道がない
はなぜ?
292
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:22:25
>>291
横レスだけど、配列って元々値渡しじゃないうえ、outパラメータにも
ならないわけだから、積極的に参照を使う理由に乏しいような気がする。
293
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:30:05
>>289
=
>>292
低脳は一人で十分
294
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:37:27
>>293
使用例プリーズ
295
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:41:51
template <class T, unsigned N>
void print_array(const T (&t)[N])
{
for (unsigned i = 0; i < N; ++i) {
std::cout << t[i] << std::endl;
}
}
せめてこのくらいは思いつかないの?バカ?
296
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:54:23
>>295
そのケース、参照にしてると何が嬉しいのか教えてください。
297
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:58:06
釣りにマジレスカコワルイ・・・ orz
298
名前:
デフォルトの名無しさん
:2005/07/21(木) 13:58:34
>>296
例えば、
template <class T>
void print_array(const T* t, unsigned N)
{ ... }
int n[10];
print_array(n, sizeof(n) / sizeof(n[0]));
ってやるより100倍楽だろうが
マジで脳みそ腐ってんのか?
299
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:02:07
配列の参照になんの意味も感じないんだったら使わなきゃいいじゃん
300
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:03:15
template <class T, unsigned N>
void print_array(const T t[N])
{
for (unsigned i = 0; i < N; ++i) {
std::cout << t[i] << std::endl;
}
}
>>298
なんでわざわざ参照にしたの?
301
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:05:59
>>300
残念ながらそれは
コンパイルが通らなかった。(VC++7.1)
まあ確かに
>>298
は有効なコードだ。
わずかcountof(n)の数文字書かずに済むだけの
メリットだが。
302
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:09:43
>>300
値を書き換える場合を考えたに決まってるだろボケ
つかなんなんだよその糞コード
呼び出すときに
print_array<int, 10>
とでもやれってか?
人間の手を煩わせないようにコンパイラに出来ることをやってもらおうと
してんのにそんなあほらしいこと出来るか
303
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:10:12
なるほど。参照にしとくとコンパイルが通る、というのが
配列の参照を使うメリットか・・・
実践的価値は高いが、なんだか納得いかんような。
304
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:11:18
>>302
配列の値を書き換える???
例示してみてください。
305
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:15:17
>>304
template <class T, unsigned N>
void nullpo(T (&t)[N])
{
for (unsigned i = 0; i < N; ++i) {
t[i] = 0;
}
}
こういうことだろ?
306
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:18:42
>>303
志村!上上〜
307
名前:
289
:2005/07/21(木) 14:22:41
まあ結局使い道がないことだけはわかった。
308
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:24:44
>>300
のコードって規格外じゃないの?
gccでも通んなかったし
309
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:27:00
いやだから300のコードはポインタを引数に取る関数を宣言しているんだってば
template <class T, unsigned N>
void print_array(const T *t);
310
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:28:18
Nって何wワロス
311
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:34:14
まあ結局
>>289
がアフォなことだけはわかった。
312
名前:
309
:2005/07/21(木) 14:42:18
あ,違う.微妙に説明間違った.
300のコードは関数呼び出しに伴うテンプレートパラメータ推論の際に
引数の配列に対して配列->ポインタの暗黙の変換を試みるために,
結果として呼び出しが無効になる,というべきなのか.
313
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:42:20
人の話を聞くと結論を変えなきゃいけないから
耳を塞ぐことにしたみたいだしね。
314
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:48:18
>>312
分かったからもう来ないでね(^^:
315
名前:
デフォルトの名無しさん
:2005/07/21(木) 14:58:20
// numberofマクロの置き換え
template<typename T, std::size_t N> inline std::size_t numberof(T (&)[N]) {return N;}
316
名前:
デフォルトの名無しさん
:2005/07/21(木) 15:03:06
これって関数だからランタイムに評価することもありうるんじゃないの?
コンパイル時に定数になってる保証あるの?
317
名前:
デフォルトの名無しさん
:2005/07/21(木) 15:06:19
>>315
惜しいね、C++の限界か。
318
名前:
デフォルトの名無しさん
:2005/07/21(木) 15:16:43
>>316
ない。
319
名前:
デフォルトの名無しさん
:2005/07/21(木) 15:29:00
WinXP SP2 VC++6.0です。
マシンが2台あります。(仮にA,Bとします)
マシンAのComnというフォルダが共有されており、Bからアクセス可能です。
この共有フォルダ内にあるアプリのexeファイルがあります。
Bからこのexeをキックし、Aのマシン上のプロセスとして動かしたいのですが、
プログラムでそのような制御は可能でしょうか?
調べたところ、起動したいアプリがサービスなら、OpenSCManager(),OpenService()
などを使えば起動できるようなのですが、サービスではないので…。
320
名前:
_/ ̄|○#
:2005/07/21(木) 15:46:01
あの〜はじめてここにカキコするんですけど・・・
消せないファイルがあるんですけどどうやったらいいんでしょうか?
教えてください_| ̄|○
321
名前:
デフォルトの名無しさん
:2005/07/21(木) 15:47:25
>>319
ShellExecute()でリモートパス渡してできればナイスだがやったことない
322
名前:
デフォルトの名無しさん
:2005/07/21(木) 15:58:02
>>316
ない。でも保証を求める必要もない、かもな。
よほどのヘボ処理系でもない限りは定数になるから。
323
名前:
デフォルトの名無しさん
:2005/07/21(木) 16:02:43
>>322
一度使ってみろよ。
int a[10];
int b[numberof(a)];
が通るか?
324
名前:
デフォルトの名無しさん
:2005/07/21(木) 16:14:09
もしも複合リテラルがあれば、std::vectorにtemplate<size_type N> vector(const value_type (&)[N]);なんてコンストラクタを作って
std::vector<int> v = (int []){1, 2, 3, 4, 5};なんてことができるようにするのに使えるんじゃないかと思う。
325
名前:
デフォルトの名無しさん
:2005/07/21(木) 16:19:05
>>323
通る通る
326
名前:
デフォルトの名無しさん
:2005/07/21(木) 16:30:42
>>319
-srvany.exeを使ってサービスにする
-マシンAのTelnetサービスを有効にして、そこから起動する
-マシンA上で動作し、適切な通信を受ければexeを実行する
(トロイの木馬的)サーバプログラムを常駐させる
-適切なスレで質問する>Visual C++かWindowsプログラミングかそのあたり?
共有フォルダ上の実行ファイルが、リモートでそのまま実行できたら、
セキュリティホールになりそう。
>>array
特に配列でなければならない理由がないのならば、標準ライブラリのコンテナを使え。
327
名前:
デフォルトの名無しさん
:2005/07/21(木) 16:35:04
>>325
マジで?コンパイラ何?
つーかそれが定数になるのは
最適化を通すからだろ?
あり得ない話だ。
328
名前:
デフォルトの名無しさん
:2005/07/21(木) 16:41:02
%27.20eの時より多く小数点が表示されるのって何がある?
329
名前:
319
:2005/07/21(木) 16:42:12
ありがとうございます。
ShellExecute()で、実行するファイル名を"\\xx.xx.xx.xx\\xxx.exe"としてみたんですが、
ローカルで実行されてしまいました。
どうやらこの質問はスレ違いみたいですね。
もうちょっと調査してみます。
330
名前:
デフォルトの名無しさん
:2005/07/21(木) 17:10:04
>>323
コンパイル時定数であることと,コンパイル時に定数(即値)に最適化されることを
ごっちゃに議論するのはまずくないですか?
331
名前:
デフォルトの名無しさん
:2005/07/21(木) 17:29:35
CMAGAZINE 3月号の"ゲームのシクミ"の一部で、
class CTask
{
・・・
void* operator new(size_t t);
・・・
};
とあるのですが、これをコンパイルすると
void*の行で " ) が必要 "とエラーになります。
その行をコメントアウトするとコンパイルできます。
(Borland C++ 5.5.1使ってます)
見たところおかしくないと思うんですが、なぜなんでしょうか。
教えてください。
332
名前:
デフォルトの名無しさん
:2005/07/21(木) 17:37:43
「…」の部分がなんだか知らんが、
class CTask
{
void* operator new(size_t t);
};
これはコンパイルできた。VC++.NET2003
333
名前:
331
:2005/07/21(木) 18:12:57
おかげさまで解決しました。
class CTask
{
void* operator new(size_t t);
};
でコンパイルできない!
class CTask
{
void* operator +();
};
でできるのに!と思ったら、#include <iostream>
してませんでした。これやったらコンパイルできました。
そこでsize_tを定義してるのかな。
borlandだから起きた現象なのですか?
(わざわざインクルードしなきゃいけない事。)
334
名前:
デフォルトの名無しさん
:2005/07/21(木) 18:17:47
size_tはたぶん<stddef.h>とか<sys/types.h>とかで定義されてると思われ
335
名前:
デフォルトの名無しさん
:2005/07/21(木) 18:19:21
size_tはstddef.h(またはcstddef)
336
名前:
335
:2005/07/21(木) 18:20:51
すまん、被った。
337
名前:
質問です m(__)m
:2005/07/21(木) 19:03:29
class Class_1 {
int *m_pnData;
public:
Class_1 () : m_pnData(NULL) {}
~Class_1 () { Delete(); }
void NewData (int nNum) { m_pnData = new int[nNum]; }
void Delete () { delete [] m_pnData; }
};
class Class_2 {
Class_1 *m_pcObject;
int m_nNum;
public:
Class_2 () : m_pcObject(NULL) { m_nNum = 0; }
~Class_2 () {
for (int i = 0; i < m_nNum; i++)
m_pcObject[i].Delete();
delete [] m_pcObject;
}
void Create () {
m_nNum = 2;
m_pcObject = new Class_1[m_nNum];
m_pcObject[0].NewData(3);
m_pcObject[1].NewData(3);
}
};
338
名前:
質問です m(__)m
:2005/07/21(木) 19:04:51
メモリの開放で迷ってます。
↑のプログラムはClass_2のデストラクタで、Class_1のDelete()を呼んでるのですが
これで開放できてるんでしょうか?
どなたかお願いします m(__)m
339
名前:
デフォルトの名無しさん
:2005/07/21(木) 19:10:51
>>338
Class_1::Delete ()
にプローブでもいれて確かめては?
340
名前:
質問です m(__)m
:2005/07/21(木) 19:24:50
す、すいません。
>>337
のは実行したらエラーでます orz
もうちょっと考えてみます。
スレ汚し、どうもすみませんでした m(__)m
341
名前:
デフォルトの名無しさん
:2005/07/21(木) 19:28:33
>>338
m_pcObject[i].Delete();
これでClass_1::m_pnData[]が解放され、NULLポインタになり、
delete [] m_pcObject;
これでClass_1のデストラクタが呼ばれ、Class_1::Delete()が呼ばれ、NULLポインタの解放
(何も実行しない)が行われる。
Class_1のデストラクタで、生成したオブジェクトを解放しているなら
あえてDelete()メソッドを用意する意味はないと思われる。
同様のことがNewData()メソッドにもいえて、これはコンストラクタでやるべき処理では。
ソースは一部を抜粋してるだけだろうから、一概にいえないけど。
ところで、std::vectorは使いたくないの?
342
名前:
341
:2005/07/21(木) 19:33:11
などと自信満々に書いたけど、delete[]はNULLポインタだと例外だっけ
if (m_pcObject) {
delete[] m_pcObject;
m_pcObject = NULL;
}
とするか、二重解放しないように
for (int i = 0; i < m_nNum; i++)
m_pcObject[i].Delete();
を消すかしないとダメか。
いずれにせよ、NewData()もDelete()メソッドも、コンストラクタ/デストラクタにすべきだと思うよ
343
名前:
質問です m(__)m
:2005/07/21(木) 19:35:26
>>341
おお、なるほど。
newでコンストラクタが呼ばれるように、
deleteでデストラクタも呼ばれるんですね。
初めて知りましたww
Class_2のデストラクタは、
m_pcObject を deleteするだけでよかったのかぁ。
std::vectorは、勉強不足でわかりません orz
丁寧なご説明、どうもありがとうございました。
344
名前:
デフォルトの名無しさん
:2005/07/21(木) 19:47:55
delete でデストラクタがちゃんと必要数分呼ばれるように
hoge = new class; delete hoge;
hage = new class[array]; delete[] hage;
と区別してるわけで
345
名前:
341
:2005/07/21(木) 19:52:23
仕様が不明なのでできるだけ忠実にstd::vectorで書くと:
class Class_1 {
vector<int> m_Data;
public:
Class_1(const int& n) : m_Data(n) {}
};
class Class_2 {
vector<Class_1> m_Object;
public:
Class_2(const int& n) {
m_Object.push_back(Class_1(3));
m_Object.push_back(Class_1(3));
}
};
こうか?
346
名前:
質問です m(__)m
:2005/07/21(木) 19:59:12
int *pData = NULL;
int array = 5;
pData = new int[array];
if (array == 1)
delete pData;
else it (array > 1)
delete [] pData;
>>344
どうもです。
普段はarrayを↑みたくフラグっぽく使ってるんですが、
もっとカッコよく開放できる方法って知ってます?
>>345
うう、わからないー。
どもすみません orz
てゆか、
>>345
はすげーかっこいいww
それで開放できてるんですか。
347
名前:
344
:2005/07/21(木) 20:04:19
>>346
new の時に [n] と書いたら、たまたま n が 1 だったとしても delete[] で通してる。
言葉的に 「オブジェクト配列を確保」(でも1個だった) と 「オブジェクトを確保」とを区別したい ってことかな。
348
名前:
デフォルトの名無しさん
:2005/07/21(木) 20:06:09
>>346
STLのお勉強をしなさいな。std::vector。
だいたいどのC++の本でも標準コンテナの使い方は載ってると思う。
349
名前:
質問です m(__)m
:2005/07/21(木) 20:08:30
あれ?
一個だけの確保でも、
delete []
していいんですか?
アフォな質問ですみませんが。
>>348
はい、がむばります。
これが噂のコンテナってやつかww
350
名前:
デフォルトの名無しさん
:2005/07/21(木) 20:09:54
>>346
p = new T[..] で確保したなら、...のトコが1でもdelete [] p; で開放できる。
一々 if 分なんかで区別する必要はないです。
351
名前:
質問です m(__)m
:2005/07/21(木) 20:25:07
>>350
おお、次々と新事実がww
私の手元の本には、
[] を使うと配列で確保できる
開放する場合も [] を使う
としか書いてないです・・。
今ちょっとためしてみましたが、一個のヤツを [] で開放しても
エラーとかはでないようですね。
どうもありがとー。
352
名前:
デフォルトの名無しさん
:2005/07/21(木) 20:30:56
>>351
C言語的配列 ≠ C++語的配列
foo = new T;
hoge = new T[1];
は似ているようで違う。 (最適化で同じになるかもしれんが、本質的に違う機能だ)
○ new T; delete T;
× new T; delete[] T;
× new T[]; delete T;
○ new T[]; delete[] T;
353
名前:
341
:2005/07/21(木) 20:43:31
>>345
Class_2(const int& n) {
この引数のnは不要だった。次のコードにしようかどうか迷って消し忘れた:
Class_2(const int& n) : m_Object(n, Class_1(3)) {}
>>351
new T[0]とした場合、要素数0の配列が作られ、戻り値は非NULL値になることにも注意。
あと、実行時エラーがでるかどうかで正しいかどうか判断するのはやめれ(´д`)
最近、実行時引数argvから:
double d = atoi(argv[3]);
としているコードを見たが、これまでそのプログラムが正しく動いていたとはとても思えない。
354
名前:
デフォルトの名無しさん
:2005/07/21(木) 20:43:55
vectorでclear()しても確保されたメモリは解放されないというのは
本当ですか?解放する方法は無いんですか?
355
名前:
デフォルトの名無しさん
:2005/07/21(木) 20:54:58
>>353
>double d = atoi(argv[3]);
何が問題?
勿論argcが4以上として。
356
名前:
デフォルトの名無しさん
:2005/07/21(木) 21:02:09
>>355
double 型の変数に整数を入れてはいけません教の人なんだと思う。
357
名前:
デフォルトの名無しさん
:2005/07/21(木) 21:05:49
それはそれでわからんでもないが、何故それがでてきたのやら。
358
名前:
デフォルトの名無しさん
:2005/07/21(木) 21:08:18
>>354
> vectorでclear()しても確保されたメモリは解放されないというのは
>本当ですか?
実装依存だが、大抵は本当
>解放する方法は無いんですか?
swap
359
名前:
デフォルトの名無しさん
:2005/07/21(木) 21:09:57
>>354
vectorは、効率のために、保持しているオブジェクトの数以上のメモリを確保している(capacity)ので
実装によってはメモリを「完全に」解放しきらないかもしれない。
>>355
argv[3]は実数値を指定する(実際には0<=d<=1の値を受け取る)仕様で、
ここでatoiで常に0か1を返していても実行時エラーはでないが、正しく動作していないと思われる。
エラーがでるかどうかで正しいコードかどうか判断することは危険だという例示のつもりだったけれど
説明不足すぎてわかんないなスマソ
360
名前:
デフォルトの名無しさん
:2005/07/21(木) 21:17:48
>>359
だめだスレ追いきれねぇ。
なんで double d = atoi(argv[3]); が出てきたんだ?
361
名前:
341
:2005/07/21(木) 21:20:19
>>360
マジでスマソ、atoiの件は忘れてくれEEEEE 最悪な例えだった!!
362
名前:
デフォルトの名無しさん
:2005/07/21(木) 21:22:10
>>353
の "実行時エラーがでるかどうかで正しいかどうか判断するのはやめれ"
の例として
>>353
の実体験で
実数値を指定するargv[3]に対し double d = atoi(argv[3]); としている奴が居た。
という
>>353
以外絶対分からない例を挙げた。
この流れでOK?
363
名前:
341
:2005/07/21(木) 21:27:19
>>362
その通りであります。漏れにしか絶対分からない例を挙げてすいませんでした。
スレ汚しすいませんでした。
そろそろスレ常駐を終わり帰るます(´д`)
364
名前:
デフォルトの名無しさん
:2005/07/21(木) 23:02:49
申し訳ないのですがPHPで2次関数の解を出すプログラムを教えてください。
ax2+bx+c=0 の解です。
365
名前:
デフォルトの名無しさん
:2005/07/21(木) 23:04:25
PHPで
366
名前:
デフォルトの名無しさん
:2005/07/21(木) 23:14:18
はい。 お願いしますm
367
名前:
デフォルトの名無しさん
:2005/07/21(木) 23:34:20
>>364
好きな方法を使いたまえ。
1. 解の公式
2. Newton法
3. Laguerre法
以上のどれかをPHPで実装すること。
俺はPHPは知らんがどの言語でもアルゴリズムあってのものなので。
以上。
368
名前:
デフォルトの名無しさん
:2005/07/21(木) 23:34:40
PHPのスレへいけばいいじゃない。
369
名前:
デフォルトの名無しさん
:2005/07/21(木) 23:40:57
あざーす!
370
名前:
デフォルトの名無しさん
:2005/07/22(金) 01:05:40
>>325
あーそれ、たぶんコンパイラの拡張だから。 gcc かなんか使ってるんじゃない?
--
#include <cstddef>
template<typename T, std::size_t N> inline std::size_t numberof(T (&)[N]) {return N;}
int a[10];
int b[numberof(a)];
--
・gcc -pedantic
:4: error: ISO C++ forbids variable-size array `b'
:4: error: variable-size type declared outside of any function
・msvc
(4) : error C2057: expected constant expression
(4) : error C2466: cannot allocate an array of constant size 0
371
名前:
デフォルトの名無しさん
:2005/07/22(金) 01:17:04
>>341
delete してもポインタ変数の値は変わりません。
>>342
ヌルポインタに対する delete は「何もしない」で正解です。
372
名前:
370
:2005/07/22(金) 01:23:40
ちなみに、現行の規格でも numberof(a) をコンパイル時定数として使える実装は存在する。
373
名前:
デフォルトの名無しさん
:2005/07/22(金) 09:17:35
>>372
それって
int f(){
static const bool b = false;
if(b){
return;
}
else{
return 0;
}
};
が通ったりするの?
だとすると、便利とは思うけど
やりすぎな気が。
374
名前:
デフォルトの名無しさん
:2005/07/22(金) 16:07:17
メンバ内でのコンストラクタの明示的呼び出しって
どうやるんでしょうか?
operator=( hoge());
こうやるしかない?
375
名前:
デフォルトの名無しさん
:2005/07/22(金) 16:36:40
Visual C++ .NET Standard 2003 を買おうと思っているのですが、
これって商用利用可能でしょうか?
マイクロソフトのサイトを見たのですが書いてないのです。
あと、「C++ならこれより他のツールがいいよ」とかありましたら教えてくれませんでしょうか。
スレ違いでしたらごめんなさい。
376
名前:
デフォルトの名無しさん
:2005/07/22(金) 17:45:13
>>374
new (this) hoge();
this->~hoge()を呼び出さずに動かした時にどうなるかは知らんが
377
名前:
デフォルトの名無しさん
:2005/07/22(金) 23:35:57
>>373
それ、 if(0) return; else return 0; でも通らないだろ。
コンパイル時定数とは関係無い。
378
名前:
デフォルトの名無しさん
:2005/07/23(土) 15:14:52
変数を宣言するときは、使用する直前にしたほうがいいって聞いたんですけど、
ループの中とかでもいいんですか?
for(){
int x;
…
}
int x;
for(){
…
}
どっちが良いんだろ(゚д゚)
379
名前:
デフォルトの名無しさん
:2005/07/23(土) 15:17:19
前者の方が当然いいに決まってる
もしintがユーザー定義型でコンストラクタに時間がかかるのであれば
最適化という意味で後者の書き方をするときもある。
380
名前:
デフォルトの名無しさん
:2005/07/23(土) 15:20:04
>>379
なるほど。サンクス。
381
名前:
デフォルトの名無しさん
:2005/07/23(土) 15:22:26
変数のスコープは短い方がいいよ
極稀にforとかifとかの中でしか使わないような
変数も全部ひっくるめて関数の最初で宣言しろ
っていう変なオッサンがいるけど、相手にしないように
382
名前:
デフォルトの名無しさん
:2005/07/23(土) 15:53:12
>>381
ヒント:C
383
名前:
デフォルトの名無しさん
:2005/07/23(土) 16:02:08
C99より前のCであってもブロック作れば関数内の任意位置で変数宣言できるわけだが。
384
名前:
デフォルトの名無しさん
:2005/07/23(土) 16:03:31
それに C99 でなくとも if や for でも変数宣言出来るわけだが。
385
名前:
デフォルトの名無しさん
:2005/07/23(土) 16:04:55
>>383
Cでもこういうことやっちゃうからね
void hoge(void)
{
…
{ /* ココでローカルスコープ (1)*/
…
}
…
{ /* ココでローカルスコープ (2)*/
…
}
}
386
名前:
デフォルトの名無しさん
:2005/07/23(土) 18:49:23
デストラクタでメモリを解放(delete)しているようなクラスがあるのですが
これを静的なインスタンスとして確保した場合は、
アプリケーション終了前に、デストラクタとは別の手段で
明示的にdeleteを呼び出す必要が有るんでしょうか?
387
名前:
デフォルトの名無しさん
:2005/07/23(土) 18:51:50
ないお
388
名前:
デフォルトの名無しさん
:2005/07/23(土) 18:53:32
必要ないだろ、
つーか、どうやってdeleteするつもりだ。
それはそうと、アプリ終了時にデストラクタが呼び出されるかどうかも怪しい。
389
名前:
デフォルトの名無しさん
:2005/07/23(土) 19:09:17
> アプリ終了時にデストラクタが呼び出されるかどうかも怪しい
使用時にリークさえなければ、終了時の処理は適当で良いって事かワーイ
390
名前:
デフォルトの名無しさん
:2005/07/23(土) 19:16:52
>>387-389
STLに例えると、必要ないのに明示的にclear()を呼び出す感じのを考えていました。
ありがとうございます、気にせず行きます。
391
名前:
デフォルトの名無しさん
:2005/07/23(土) 19:30:12
>>386
どうやってアプリを終了させるつもりか知らないが、mainの後には当然デストラクタが呼ばれる。
392
名前:
デフォルトの名無しさん
:2005/07/24(日) 12:54:10
すべての変数は、関数の最初で宣言されるべきだ、と主張する変なオッサンに理由をたずねたい。
PTSDか何かだろうか?
393
名前:
デフォルトの名無しさん
:2005/07/24(日) 12:58:16
自動変数がプリミティブ型ばっかりで
関数の規模が大きくなければ別にいいんじゃねとか思う
394
名前:
デフォルトの名無しさん
:2005/07/24(日) 13:05:39
>>392
トラウマというよりトラコーマ
395
名前:
デフォルトの名無しさん
:2005/07/24(日) 13:05:53
「すべて」って言うのならPTSDかそれともいい加減古くなってガタがきてるかのどっちかだろ。
全部の変数が使用される直前になってから宣言されてるコードも読みたくないけどな
396
名前:
デフォルトの名無しさん
:2005/07/24(日) 13:09:57
>>392
Cでこんな風に書く奴少ないだろ、
>>385
。
C++での途中宣言のメリットとほぼ同じ効果が得られるにもかかわらず。
それと同じ。
途中宣言止めるべきとは俺は言わないが、自分のスタイルを変えるほどの
インパクトが途中宣言にはない。それだけ。
397
名前:
デフォルトの名無しさん
:2005/07/24(日) 13:12:46
昔case文ごとに同じ名前の変数宣言してドツボにはまった俺様が来ましたよ。
398
名前:
デフォルトの名無しさん
:2005/07/24(日) 13:15:32
それくらいのことでそんなに見通しが悪くなるようなコードを日々生産しているのか?
399
名前:
デフォルトの名無しさん
:2005/07/24(日) 13:40:28
俺がCではなくC++を選択したのは、「メモリの仕様効率をよくしたい」
などの理由ではなく、むしろその辺を犠牲にしても「保守性をあげた
い」などの人間にとって管理しやすい点を重視したから。
「後からみたときに、および他人が見たときにどちらが分かりやすい
か?」と考えから、俺は先頭で宣言するスタイルを選択した。
「”for(i”・・・iって宣言したっけな?」などとソース全体を見渡すのが
面倒だから。
400
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:00:08
for(int i;...を使えよw
401
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:09:39
>>399
保守性を考慮すればこそ、使用箇所での宣言を取るべきだろ。
402
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:09:40
ヒント: 399はC99を使えない環境かもしれない。
403
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:09:48
>>400
某環境ではバグあるからなぁそれ。
404
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:10:58
昔は#define for if(0) else for とかやったもんだ。
405
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:23:31
処理系の特徴への対応方法の基本をさておいて変なマクロに走るクソガキうぜえ
406
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:25:37
#define for if(0) else forに文句言う奴がいるとは
407
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:26:27
どうもこのスレでは、日本語の不自由な香具師がageる傾向にあるようだな。
408
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:26:49
>>405
処理系の特徴への対応が変なマクロになるのはよくあることだろ。
409
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:27:30
一瞬のうちにフクロにされる
>405
ワロス
410
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:29:40
>>404
を見て目から鱗が出た俺は半人前
411
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:36:52
>>408
変なマクロに「しちまう」奴がよくいるだけ
本当に必要なケースはまれ
412
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:44:42
>411
具体的にどうぞ
413
名前:
デフォルトの名無しさん
:2005/07/24(日) 14:59:19
>>412
for のスコープなんて
int i;
for(i = 0; 〜
でいいんだよ
for(int i = 0;
が使いたくなる心理はあるが
想定要件よりも優先することなどない
むしろ旧仕様とわかっている処理系で
マクロにしてあるから for(int i = 0; を使えと言われる方が強い抵抗を感じる
(この心理もコーディング基準より優先しないが)
414
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:01:00
俺は富豪派
415
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:23:05
>>413
マクロが使ってあっても前者の書き方は許されるだろ。
必要ない場所では後者で書くように言われるかもしれないが、
それは「マクロにしてあるから」じゃないだろう。
416
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:27:58
想定要件って?
417
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:37:44
たとえば互換性の範囲
418
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:41:39
for if(0)〜のマクロ使えば互換性も可読性も両立できるじゃん。何がしたいの?
419
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:42:37
>>418
>>413
420
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:48:17
要するに『心理的に嫌だからfor if(0)...のマクロは使わない』ってことですね。
421
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:56:42
どっちにしろ気をつけなければいけないのだが...
自分はスコープ最小原理主義者です。
#include<iostream>
struct I
{
int i;int j;int k;
I()
{
int j;//後から変数を宣言するのは気をつけよう
{int i=100;//深いスコープでは重複に気をつけよう}
{ j=100;}
{ k=100;}
}
};
int main(){I i;
std::cout << i.i << std::endl;
std::cout << i.j << std::endl;
std::cout << i.k << std::endl;
}
422
名前:
デフォルトの名無しさん
:2005/07/24(日) 15:56:55
>>420
道具をスペックどおりに使うというだけのこと
必要でないギミックは使わないのが基本だよ
423
名前:
デフォルトの名無しさん
:2005/07/24(日) 16:41:48
クサッ
このスレ超臭い
424
名前:
デフォルトの名無しさん
:2005/07/24(日) 17:07:34
俺もそう思う。
425
名前:
デフォルトの名無しさん
:2005/07/24(日) 17:46:25
長い関数を書きたがるところでは切実な問題なのかなw
426
名前:
デフォルトの名無しさん
:2005/07/24(日) 18:25:38
>>422
それはそうだ。あとは意識の問題。
VC6でプログラミングしているのか、
C++でプログラミングしているのか。
必要でない限り環境に依存させないのも基本だろうと思うので、
後者を基本とするべきじゃないか?
それでも、VC6にはそれを否定するだけの負のポテンシャルがあるのは認める。
427
名前:
デフォルトの名無しさん
:2005/07/24(日) 18:32:38
自分のPCのIPアドレスを取得する方法を教えてください。
428
名前:
デフォルトの名無しさん
:2005/07/24(日) 18:36:27
「PC」も「IPアドレス」も、標準C++の仕様には含まれていませんが
429
名前:
デフォルトの名無しさん
:2005/07/24(日) 18:41:39
>>427
http://pc8.2ch.net/pcqa/
430
名前:
デフォルトの名無しさん
:2005/07/24(日) 18:47:53
127.0.0.1
431
名前:
デフォルトの名無しさん
:2005/07/24(日) 18:54:55
ワラタ
432
名前:
デフォルトの名無しさん
:2005/07/24(日) 18:57:10
::1
433
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:10:17
>>427
実際自分のIPアドレスってのは常に複数あって
宛先などからルーティング情報などによって選択されるので
単に「自分のIPアドレス」といっても何が適切か分からん品
勉強した上でネットワークプログラミングスレあたりで。
434
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:19:41
433は433で的はずれな気がする
スレ違いにレスしている時点でなんだが
435
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:29:26
>>434
的外れではなく、間違ってるんだよ
436
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:32:51
親クラスのポインタに子クラスのアドレスが入るじゃん?
で、そのポインタから子クラスのメソッドが使えちゃったりはするはずないよな?
437
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:37:58
公開メソッドならどこからでも使えるわけだが何か
438
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:40:03
>>436
仮想関数をオーバーライドしたものなら使えるだろ。
439
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:51:20
dynamic_castすると・・もう親クラスのポインタじゃないから関係ないか
440
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:53:39
>>435
どっか内容間違ってる?
まあこのスレに書くことが間違いってのならそうだが
441
名前:
デフォルトの名無しさん
:2005/07/24(日) 19:55:33
>>440
うーんとね、前半の3行くらいがちょっと。
最後の一行はごもっとも。
442
名前:
デフォルトの名無しさん
:2005/07/24(日) 20:00:28
いつか自分にもIPアドレスが振られる日が来るんだろうか・・・
443
名前:
デフォルトの名無しさん
:2005/07/24(日) 20:12:16
赤紙みたいで嫌だな
444
名前:
デフォルトの名無しさん
:2005/07/24(日) 20:14:03
>437
>438
それで安心しました。thx
445
名前:
デフォルトの名無しさん
:2005/07/24(日) 21:04:44
いま電話があって俺がバイクで事故を起こして警察に捕まったらしい。
しかも相手が妊婦で流産までさせてしまったそうだ。示談にするから
金振り込めっていうし電話の向こうで俺は泣いてるし、いったい俺は
どうしたらいいんだ
446
名前:
デフォルトの名無しさん
:2005/07/24(日) 21:06:06
>>445
C++の話を汁
447
名前:
デフォルトの名無しさん
:2005/07/24(日) 21:08:03
>>445
deleteしてしまえばOK
448
名前:
445
:2005/07/24(日) 21:13:35
>>447
なるほど、それで安心しました。thx
449
名前:
デフォルトの名無しさん
:2005/07/24(日) 21:21:17
電話の向こうで泣いてる俺が来ましたよ
450
名前:
デフォルトの名無しさん
:2005/07/24(日) 21:47:14
>>445
振込先を聞いて警察に通報しr
451
名前:
デフォルトの名無しさん
:2005/07/24(日) 21:49:19
んな超有名なコピペに反応せんでも…
452
名前:
質問です
:2005/07/24(日) 22:05:26
char[] hoge
このメモリに、あるファイルの完全パスの文字列が割り当てられています。
このパスの2階層上のフォルダパス文字列を
CString型の変数に割り当てる処理を行おうとしております。
Ex)”C:\test\test1\hogehoge.cpp” -> "C:\test"
C++で上記処理を行う場合、どのような処理方法が一般的なのでしょうか?
よろしくお願いいたします。
453
名前:
デフォルトの名無しさん
:2005/07/24(日) 22:17:07
>>452
CStringがそもそも一般的じゃありませんから。
454
名前:
デフォルトの名無しさん
:2005/07/24(日) 22:18:17
残念、VCは専用スレへ斬り!
455
名前:
デフォルトの名無しさん
:2005/07/24(日) 22:24:17
>>453
−454
(つェ`)えーん
VC専用スレがみつからなかったんですよ。
【VC++】プログラム作成に手を貸して下さい!!
スレなんですかね?板汚しすまそんでした。。
他のスレは過疎ってそうなのでwebでも少し探してみます。ありがとうでした
456
名前:
デフォルトの名無しさん
:2005/07/24(日) 22:30:09
>>452
shlwapi.hのPathRemoveFileSpecを2回呼べば?
あとVCのスレはここね。こんな名前だからVCじゃ引っかかるわけないな。
★初心者にVisual C++を教えるスレ★ Part20
http://pc8.2ch.net/test/read.cgi/tech/1120222322/l50
457
名前:
デフォルトの名無しさん
:2005/07/24(日) 22:38:40
>>456
ぎゃ・・・検索が甘すぎでした
PathRemoveFileSpec
お、こんな便利なAPIがあったんですね、これで試してみます。
ありがとうございました。
458
名前:
デフォルトの名無しさん
:2005/07/25(月) 11:21:38
my_dick.insert(find(pussy.begin(), pussy.end(), boost::bind(younger_than, _1, 25)));
459
名前:
デフォルトの名無しさん
:2005/07/25(月) 11:23:33
>>458
dick に pussy をいれるのか?
460
名前:
デフォルトの名無しさん
:2005/07/25(月) 11:43:36
strncpy()関数の使い方の確認なのですが 下記の使い方で
うまくいく場合と行かない場合があります。
ファイルから1行読み込み、2桁の数字、5桁の数字、12桁の英数文字
を抜き取る作業なのですが関数の使い方は合っているでしょうか?
----------------------------------------
FILE *fp;
int a, b;
char str0[256];
char str1[256];
fp = fopen ("M:\\test\\data1.txt", "r");
if (fp == NULL) exit (-1);
while (fscanf (fp, "%s", str0) != EOF) {
strncpy (str1, str0, 2);
a = atoi (str1);
strncpy (str1, str0 + 3, 5);
b = atoi (str1);
strncpy (str1, str0 + 9, 12);
keisan1 (hwnd, a, b, str1);
}
fclose (fp);
---------------------------------------
データファイルの中身
01,23456,abc456ghijkl
52,63481,vwxyz.abcdef
:
:
461
名前:
デフォルトの名無しさん
:2005/07/25(月) 11:49:06
>>460
strncpyは指定された文字数ちょうどをコピーしたときには文字列終端の'\0'を書き込まないため。
462
名前:
460
:2005/07/25(月) 12:23:29
>>461
なるほど! どうもありがとうございました m(_ _)mぺこ
463
名前:
デフォルトの名無しさん
:2005/07/25(月) 12:54:27
CSVファイルの読み込みにboost::tokenizer使うのは、やっぱりダメなんだろうか。
464
名前:
デフォルトの名無しさん
:2005/07/25(月) 13:54:29
>>463
なして?
465
名前:
デフォルトの名無しさん
:2005/07/25(月) 14:40:23
>>464
>>460
のケースだと、固定幅フィールドファイルではなく、CSVファイルに見えたから。
であるなら、車輪の再開発はしなくてもいいのにと思った。
ただ、ソースコードはCコンパイラでコンパイルできるものなので、
C++は使えない環境なのかもしれないとも思った。
C++は使えても、boostは使えない環境なのかもしれないとも思った。
466
名前:
デフォルトの名無しさん
:2005/07/25(月) 14:51:30
>>465
このスレではC++が使えない環境のことは考えなくていいんでは
boostは使えないかもしれないけど
467
名前:
デフォルトの名無しさん
:2005/07/25(月) 15:01:06
boostが駄目でもstd::getlineがある。こいつに','を指定すれば……。
もちろんboost::tokenizerとは挙動がいろいろと違うけれどね。
468
名前:
デフォルトの名無しさん
:2005/07/25(月) 15:29:25
マルチバイト文字の罠もあるね。
469
名前:
デフォルトの名無しさん
:2005/07/25(月) 16:43:56
CSVは""の扱いとかウザい
素直にTSVつかっとけよ
470
名前:
デフォルトの名無しさん
:2005/07/25(月) 19:52:55
>>469
毎回コーディングし直すからうざいんちゃうの?
471
名前:
デフォルトの名無しさん
:2005/07/25(月) 20:14:47
MTじゃなさ気だし、strtok()使うのが吉。
472
名前:
デフォルトの名無しさん
:2005/07/25(月) 20:26:12
strtok()使うくらいならsscanf()でいいじゃない。
473
名前:
デフォルトの名無しさん
:2005/07/26(火) 04:59:30
野球におけるピッチャーの防御率は,9回あたりの失点数で計算します.
なので,低い程よくなります.そこで,1試合ごとの投球回数と失点数
を入力し,「全試合を通しての防御率」と「最近5試合の防御率」を入
力するたびに計算するプログラムを作ってください.ただし,1/3 回
のようなアウトカウントによる投球回数は考えず,投球回数単位で計算
するものとします.
下の表に出ている値で正しいかどうかを確認してください.
なお,最大140試合まで入力できるようにしてください.また,
日本のプロ野球では,延長戦は12回までなので,投球回数に12より
大きい数値は入らないようにしてください.
474
名前:
デフォルトの名無しさん
:2005/07/26(火) 06:08:09
>>473
マルチ氏ね。そもそもスレ違い
475
名前:
デフォルトの名無しさん
:2005/07/26(火) 07:33:55
質問です。
クラスの継承で、アクセスコントロールをメンバ関数個別に設定する事は可能でしょうか?
たとえば、
class A{
...
public:
void Func1();
void Func2();
};
class B : public A{
...
};
の時、
「クラスAのオブジェクト → 外部からFunc1,Func2両方アクセスできる」
という条件を維持したままで、
「クラスBのオブジェクト → 外部からFunc1はアクセス可だが、Func2は不可」
のような設定を実現する方法はあるでしょうか。
476
名前:
475
:2005/07/26(火) 07:45:43
すいません、自己解決しますた。
継承先のクラスでprivateで多重定義すればよかったですね。
477
名前:
デフォルトの名無しさん
:2005/07/26(火) 08:26:46
>>476
class A {
public:
void Func1();
void Func2();
};
class B : public A {
void Func2();
};
こういうことならこうできるけどいい?
B obj;
obj.A::Func2();
478
名前:
デフォルトの名無しさん
:2005/07/26(火) 09:05:15
private継承ということではなかろうか。
で、再定義するよりも、public部で公開したいものをusingする方が
メンテ上ベターでしょう。
479
名前:
475
:2005/07/26(火) 11:15:22
>>477-478
回答ありがとうございました。
>private継承ということではなかろうか。
はい、そうです。
478さんの方法を試してみます。
勉強になります。
480
名前:
475
:2005/07/26(火) 13:09:40
たびたびすいません。
private継承して継承先からはアクセス不可にしておきたい基底クラスのメンバはごく一部で、
継承先のpublic部でusingして公開しようとしているメンバの方が数が圧倒的に多いです。
そのため、今478さんの方法を試そうとしているのですが、
継承先のpublic部にかなりたくさんのusing記述をする事になってしまいそうです。
他に、継承先クラスから基底クラスの一部のメンバだけを個別にアクセス制限
できるような方法はないものでしょうか。
継承クラス関係で調べているのですがなかなかそういう方法がみつかりません。
481
名前:
デフォルトの名無しさん
:2005/07/26(火) 13:16:47
>>480
無理かもしれんが、クラスがでかすぎるようなら
役割でクラスを分割して複数のオブジェクトにするといいかも
482
名前:
デフォルトの名無しさん
:2005/07/26(火) 13:17:54
>>480
struct base
{
void a();
void b();
void c();
};
struct derived : base
{
private:
void c() { base::c(); }
}:
483
名前:
デフォルトの名無しさん
:2005/07/26(火) 13:18:59
>>480
publicで継承して、見せたくない部分だけprivateでusingすればいいんじゃね?
484
名前:
デフォルトの名無しさん
:2005/07/26(火) 15:22:06
>>480
>private継承して継承先からはアクセス不可にしておきたい基底クラスのメンバはごく一部で、
>継承先のpublic部でusingして公開しようとしているメンバの方が数が圧倒的に多いです。
を理由に
>>482
>publicで継承して、見せたくない部分だけprivateでusingすればいいんじゃね?
はあんまり良くないと思うよ
public継承ってことは
基底クラスの参照ポインタで普通にアクセスできてしまうからね
485
名前:
デフォルトの名無しさん
:2005/07/26(火) 16:18:19
#include <iostream.h>
char *run()
{char *dp,d[]="running";
dp=d;
return dp;
}
void main()
{char *tp,t[10];
tp=t;
tp=run();
cout << tp << endl;
}
何分基本的な事で申し訳ありません
文字列を返す関数を作りたいのですが、上記のもの実行すると
running・↕ฺと、お呼びでないものも表示されてしまうのです
多分メモリが解放されている為だと思うのですが、何か良い方法は有りませんか?
486
名前:
デフォルトの名無しさん
:2005/07/26(火) 16:35:00
>>485
std::string
487
名前:
デフォルトの名無しさん
:2005/07/26(火) 16:35:50
> 何か良い方法は有りませんか?
{まず、中括弧をキモイ位置に配置するのはやめなさい。
}
const char* run() {
const char*dp="running";
return dp;
}
488
名前:
デフォルトの名無しさん
:2005/07/26(火) 16:40:04
char *run(char*s){
char *dp="running";
return strcpy(s,dp);
}
489
名前:
デフォルトの名無しさん
:2005/07/26(火) 16:55:40
>>486-488
すみません、どうも有難う御座いました
490
名前:
デフォルトの名無しさん
:2005/07/26(火) 17:09:32
>>485
>#include <iostream.h>
アナクロすぎ。
文字列を返す関数が欲しいだけなら
const char * run() {return "running";}
でいい。
491
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:17:08
コンストラクタが自動的に継承されない理由って何?
template使うときにこれが障害になることがかなり多いんだけど。
492
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:28:56
>>491
え? そういう必要があるときに template 使うよ??
493
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:31:39
質問です
for ( int a = 0, unsigned int b = 0; a < 10; a++, b++ ) {
}
これってなぜにダメなのでしょう?
初期値に宣言でおけるのは1つだけ?
おとなしく
unsigned int b = 0;
for ( int a = 0; a < 10; a++, b++ ) {
}
としておけということ?
494
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:32:55
>>493
型は1つですよ
495
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:33:43
>>493
unsigned は予約語なので変数名になれない
コンパイラは心を持たない
496
名前:
493
:2005/07/26(火) 20:34:18
>初期値に宣言でおけるのは1つだけ?
ちと言葉足らずでしたが
for内だけのスコープを持つ変数宣言は1つしかできないのか?
という意味です
for ( a = 0, b = 0; a < 10; a++, b++ )
ができるのはわかっています。
497
名前:
493
:2005/07/26(火) 20:34:54
あら、1つだったのね・・
いくつでもできる気がしてた・・
498
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:36:43
>>493
俺んとこではダメだったけど、これなら通ってもよさそうな気がする
for ( (int a = 0), (unsigned int b = 0); a < 10; a++, b++ ) {
}
499
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:37:56
>>498
そいつは無理な相談
500
名前:
デフォルトの名無しさん
:2005/07/26(火) 20:38:32
>>499
なんで?
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.