■過去ログ置き場に戻る■ 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.