[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 03/13 21:05 / Filesize : 260 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

スレを勃てるまでもないC/C++の質問はここで 3



1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
pc11.2ch.net/test/read.cgi/tech/1178503366/

348 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 12:22:47 ]
そもそも、int はマズいな。wchar_t だ。

とにかくツケ刃じゃダメだ。

349 名前:デフォルトの名無しさん [2007/10/12(金) 12:39:49 ]
>>347
>>348
ありがとうございます
試してみます

350 名前:337 [2007/10/12(金) 13:24:28 ]
ご指摘ありがとうございます。
vec[i].nできれいにコードを書くことができましたが、
やはり構造体のアドレスを取得する方法が気になっています。
というのも、最終的に行いたいことは、
基底クラスを継承した複数の派生クラスをvetor配列に格納し、
その派生クラスのアドレスを基底クラスで受け取って、
仮想関数を呼び出すという処理をしたいからです。

CData *p;

//ここでvector配列と添字でCDataの派生クラスのアドレスをpで受け取る

p->Draw(); // 受け取った派生クラスの種類を意識せず関数を呼び出す

コードとしては、このようなものをイメージしているのですが、
実装は可能なのでしょうか。
申し訳ありませんが、よろしくお願いします。

351 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 13:25:49 ]
p = &vec[i];

352 名前:351 mailto:sage [2007/10/12(金) 13:29:06 ]
いや、まて。 なにかおかしい。

例えば
class Base{};
class Derived : public Base{};
だとして、
vector<Base> に Derived を入れることは出来ないぞ。
vector<Base*> とすることになるんじゃないか?
だったら
Base *p;
p = vec[i];
だと思うが。

353 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 13:33:12 ]
的確すぎてワロタw

354 名前:337 [2007/10/12(金) 13:52:05 ]
ご指摘ありがとうございます。
つまり、クラスのアドレスをvector配列に格納し、
実体そのものは別に管理するということでしょうか。


355 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 14:15:49 ]
>>337
>実体そのものは別に管理するということでしょうか。
yes.
vector内でのコピーがポインタのコピーで済むから動作が速くなる(可能性もある)し。
余裕があれば(管理者が許せば)boost::shared_ptrとかを検討してみるのもあり。

356 名前:337 mailto:sage [2007/10/12(金) 14:39:49 ]
vector<Base*>で上手くいきました。
ありがとうございました。



357 名前:デフォルトの名無しさん [2007/10/12(金) 14:59:31 ]
動画像からフレームを取り出してフーリエ変換したいのですが
取り出すプログラムが分かりません。
分かる方、教えて頂けると幸いです。

358 名前:デフォルトの名無しさん [2007/10/12(金) 15:01:50 ]
>357
動画像処理したいというなら、ライブラリが限られるけどDirectShowを使いたいのかな?
それならDirectShowフィルタを使うのが現実的で、次がサンプルグラバで1枚づつ画像を取り出すとかになると思う。
むつかしめだけどがんば。


359 名前:357 mailto:sage [2007/10/12(金) 15:23:15 ]
>>358
レスありがとうございます。
秒間20フレーム程度で数秒の動画なのですが
簡単なプログラムで実装出来ないでしょうか?

先生に難しいプログラムでは無いと言われました。
その2つを見てみたのですがこの分野が苦手な自分には
少し難しいです;;

360 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 16:13:43 ]
>>359
何のために学費払ってんだよ。
先生に聞け、先生に。

361 名前:358 [2007/10/12(金) 16:16:00 ]
fft(高速フーリエ変換)自体は画像処理系の本ではかなりあたりまえにあるコードなので難しいものではないと思うんだけど
動画から画像を取り出すのはwindows標準でライブラリとか存在したかな...。
fftが難しくないのか、動画からフレームごとの画像を取り出すのも含めて難しくないのかちょっと聞いてみて欲しい。
あと、だれかできるだけ楽な、その方法知らないですか?>all

362 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 16:21:51 ]
20フレームで数秒ってことは、50フレーム前後か。
そこいらの、動画を入力して、ビットマップ画像の羅列を出力するプログラムを使えばいいじゃん。

363 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 20:47:09 ]
いろいろなデータファイルからデータ抽出して
アルゴリズムに適用して出力結果を出すプログラム作ってんだけど
微妙に値がおかしいんだよね。大方あってるんだけど。

これはデバックでなおるのかな?
150X30くらいのデータを配列にいれて1行ずつ処理してるんだけど
領域破壊とかなってるんでしょうかね。


364 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 20:57:03 ]
>>363
さぁな、どんなバグがあるかは、デバッグしてみないとな。

365 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 20:58:47 ]
>>363
テストしたの?

本屋に行って、
「基礎から学ぶソフトウェアテスト」
とかの本を買って読んでみ。

366 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:13:30 ]
おまえらこんな抽象度の高い質問によく答えられるな



367 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:21:50 ]
回答も抽象的だし

368 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:23:55 ]
だってプログラムの概要をいってなんとかしてくれるのかい?
データファイル大量すぎて
説明しようがない

369 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 21:29:22 ]
4725円のやつですか?
学校で買ったソフトウェア工学じゃ駄目?

370 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 22:00:39 ]
学生さんか。
じゃぁ、>>365の本は向いてない。

ちゃんとしたレクチャーなんて、ここではできないから、インチキな方法を教えてお茶を濁そう。

メモリの不正アクセスは、検出するためのツールがある。高価なものから無償のものまで。
開発環境は何?

次に、プログラムが意図通り動いていないのであれば、まずはステップ実行して確認してみよう。
案外、あっさりと間違いを見つけられる。

それでもダメなら、すでに確認済のデータを入力し、正しいデータが出力されるか、確認してみよう。
おかしなデータが出力されるようなら、プログラムを部分ごとに個別に、テストデータを与えて、出力が正しいことを確認しよう。


371 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 23:16:09 ]
cppunitとかunittest++とかboost.testとかライブラリから学ぶのがいいと思うんだぜ
中でもboost.testはbjamと組みあわせて複数のプロジェクトを一括テストとかできるし
make書くのが面倒臭い人にはおすすめ

372 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 23:28:44 ]
んなものは、反復してテストするレベルに到達してからでいい。

すでにバグがあるらしいということが、わかっているのだから、まずはステップ実行だ。


373 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 01:49:15 ]
データ処理において配列をたくさん使ってプログラムを作るのは
やめておいたほうがいいですか?
グリッドでの計算で二次元配列を2つ使って行っているんです。
30X150行を2つくらい。
領域を使いすぎてはいけないと聞いたんですけど。


374 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 07:53:56 ]
>>373
たったそれだけ?
今時のPCなら問題ないでしょ。

375 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 09:19:25 ]
まーその二次元配列のファイルを2500個処理するんだけどね

376 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:02:24 ]
>>373,375
要は、そのときのメモリ使用量が使用環境において妥当かどうかだ。
30x150x2x2500と考えて、それぞれ4バイトデータとしたら、高々100MiB未満。
全部メモリ上に置いたって何にも問題ないだろ。
# 勿論、Linux@PS3やWinCE、組み込みってことなら話は別だが。



377 名前:デフォルトの名無しさん [2007/10/13(土) 11:13:23 ]
long l1 = 1.2;
long l2 = 3.4;
printf("%f\n", l1 + l2);
これで4.6または4.600のような値を表示したいのですが、どう直したらよいのでしょうか?

378 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:14:58 ]
l1とl2の型をdoubleにする。

379 名前:デフォルトの名無しさん [2007/10/13(土) 11:16:58 ]
long l1 = 1.2;
long l2 = 3.4;
はもしかしたら優秀なコンパイラなら
long l1 = 1;
long l2 = 3;
として解釈するということでしょうか?

380 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:19:57 ]
>>379
いいえ。優秀なコンパイラに限らず、気が違っていない限りそう解釈するはずです。

381 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:20:43 ]
何が優秀なコンパイラなのかは知らないが、
規格上、浮動小数点数を整数に変換する際には、
小数点以下切捨てが行われることになっている。

382 名前:デフォルトの名無しさん [2007/10/13(土) 11:21:14 ]
kzk9.net/column/time.html
の一番上のソースを見たんですが、clock_tはlongですよね。
なのに%10.30fとして小数以下を30桁出そうとしたこの人も
勘違いしているのでしょうか?

383 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 11:40:57 ]
>>376
返答ありがとう。
よくよく考えてみると配列を150X30を30X150にしたり
無駄なことをしてるから
そこらへんを直してみるわ。

384 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:03:23 ]
>>382
clock_tが実際に何型かは実装に依存する。
しかしprintfには、型が判明していなければデータを渡せない。
とりあえずdoubleにキャストすれば、大抵の環境では値が保持される。
俺ならlong longにキャストしたいところだが、long longはまだ標準にないからな…。

385 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:06:10 ]
切捨てに関して便乗で

-4 -3 -2 -1 0 1 2 3 4 ・・・

-2 -2 -1 -1 0 0 1 1 2 ・・・
にしようと思ったのですが

int X=-1;
printf("%d\n",X/2);

が0になります
とりあえずXがマイナスのときを条件分けしましたが
EXCELのINT関数だとすんなりいくので不思議な感じがします
そういうものなんでしょうか?

386 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:07:12 ]
>>382
いいえ、勘違いではなくclock_tがdoubleなどの実数型であるとでも思っているのでしょう。



387 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:08:20 ]
>>382
もとが整数なのに小数で出力しようとするのはナンセンスだが、
doubleにキャストして変換しているので、間違いではないよ。

388 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:14:35 ]
>>385
負数の丸めは実装依存ですが、一般的には0に近い方に丸められるようです。

389 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:22:17 ]
>>388
浮動小数点数型から整数型への変換は、常に小数点部分を捨てた値で、
つまり0方向への丸めに決まっていたはずだが。

>>385
(int)floor(X / 2)

390 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:29:31 ]
すまん、(int)floor(X / 2.0)とでもしないとだめだな。

浮動小数点数型から整数型への変換のことは、X3010:2003 6.3.1.4に書いてある。
手元のANSI C言語辞典の型変換の項目にもそう書いてあるから、
C89でも0方向への丸めで間違いないはず。

391 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 12:32:21 ]
>もとが整数なのに小数で出力しようとするのはナンセンス
よしよし

392 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 13:09:33 ]
>>389,390
すみません、どこに浮動小数点型が出てくるんですか? 元質はこれなんですが。
--
int X=-1;
printf("%d\n",X/2);


393 名前:390=391 mailto:sage [2007/10/13(土) 13:52:16 ]
すまんorz

388の言うとおりだ。ただしC99では0方向への丸められることになった。
また、div関数などを使えば、C89でも必ず0方向への丸めになる。
丸め方を指定したければ、391のように浮動小数点数を使うという手もある。

394 名前:385 mailto:sage [2007/10/13(土) 14:44:59 ]
>>388-390,393
整数型/整数型の丸めは0方向に
floorとかEXCELのINTとかは小数点部分を捨てた値にする関数っていう感じですかね

>>392
とりあえず(int)floor(X/2.0)=-1でできますね
たしかにわざわざ実数で割るのもなんかすっきりしませんが、そういうものだと思うことにします

ありがとうございました

395 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 14:52:37 ]
floorとExcelのINTは負の無限大方向への丸め。
小数部分を捨てるというと、
Cのやる0.5→0、-1.5→1のような字面的に整数部分だけの値にすることを連想する。

396 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:22:59 ]
(int)floor(X / 2.0)

これってアリなの?

Xが整数型だから、
X / 2
になっちゃわないか?

(int)floor((double)X / 2.0)
などとして、Xを実数にしないと。



397 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:24:37 ]
>>396
2.0

398 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:31:49 ]
doubleで割ってるからdoubleになる
大丈夫

399 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 16:44:39 ]
左項に合わせるのだと思い込んでたよ。


400 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:10:02 ]
コンパイルしたら警告が600個あります
今のところバグは無いのですが、何か他に弊害はありますか?

401 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:11:19 ]
まず間違いなくバグだらけだろうな

402 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:32:22 ]
>>400
そんなに大量に警告が出ていたら、無視してはいけない警告が出ても、気がつかないだろうな。
それが、大量の警告を放置することによる害。

きちんと精査した上で警告を無視すると決めたら、
当該部分だけに限定して、pragmaとかで警告を抑制すべし。

403 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 18:53:41 ]
GNUのソースは警告0ですか?

404 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 19:38:20 ]
>>400
多分ライブラリが嫌らしいコーディングしてるんだろうがな

405 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 20:03:57 ]
Wallにしたらstlでも凄い量の警告出るぜ

406 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 20:08:08 ]
>>404
wow
調べてみたらけっこうライブラリというか同じ部分の警告でかぶってました



407 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 21:59:34 ]
3桁ごとにカンマが入ってる数字文字列を
int型に変換する関数ってないんですかね

408 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 22:09:50 ]
標準ではありません。大したもんじゃないから自作しましょう。

409 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 22:16:07 ]
そうですか

lexical_castで通ると思ってたらエラー出るし…

自分で書くことにします
すみません

410 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 22:22:18 ]
boost使うならやりようは色々あるかと

当該スレで聞いてみては?

411 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 20:13:04 ]
C++なんですが、AfxsetResuseで
明示的にリソースを設定した場合
リソースの解放も明示的に行う必要が
あるんでしょうか?

412 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 20:44:31 ]
>>411
C++標準には、そのような識別子は定義されていないが?

413 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 04:05:24 ]
質問です。

以下のように書いたとき、
arrayの各要素は10で初期化されると思っていたんですが、
コンパイルして実行してみるとarray[0]のみ10で
残りは0で初期化されてました。
配列の各要素をすべて同じ値で初期化するにはどうすれば良いんでしたっけ?
よろしくお願いします。

#include <iostream>

int main(int argc, char** argv)
{
int array[10] = {10};

for (int k = 0; k < 10; ++k) {
std::cout << array[k] << std::endl;
}

return (0);
}

414 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 04:33:10 ]
int array[10] = {10,10,10,10,10,10,10,10,10,10};

0以外の数字で全て同じ数値で初期化するには、いちいち全部書かなきゃダメ。

めんどくさいなら for(i=0; i<10; i++) array[i] = 10; みたいにループで初期化する。

415 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 04:50:04 ]
int array[10] = { FILL(10,10) };
みたいにプリプロセッサで書けないかなぁ…

416 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 05:02:13 ]
C++ならクラスにしてコンストラクタで初期化させればええやん



417 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 07:03:56 ]
std::vector<int> array(10, 10);

418 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 08:47:11 ]
>>414
0以外のときは駄目だったんですね。
全然知りませんでした。

ありがとうございました。


419 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 12:25:23 ]
あれ?自動変数は0に初期化されるんでしたっけ?

420 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 12:43:56 ]
いいえ、普通の自動変数は初期化されません。
但し、構造体や配列の初期化指定子の数が足りない場合は0が補われます。
従って、all bit 0が数値0を表わさない実数型であったとしても、数値0が保証されます。

421 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:34:07 ]
プログラム的にmain関数内でforループの中で配列を宣言するのはどう思いま
すか?配列の領域がループ回数分かわるのでforループの中にいれたいのですが。


422 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:36:43 ]
>配列の領域がループ回数分かわる
ここが意味不明なので何とも言えない。

423 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:41:17 ]
forループの中で1ループごとにファイルを1つ読み込んで
そのファイルの行数を配列の領域としたいんです。
だからファイルをかえるとファイルの行数もかわり、領域もかわるというわけ
です。わかりにくいですか

424 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:44:09 ]
あーなるほど、言いたいことは判った。

配列って言うか、動的メモリ領域の話ね。
ループ外で全く使わないなら、ループ内で定義していいんじゃない?
つーか、そうすべきだと思うけど。
# 但し、殊にCではアナクロ的に関数の先頭で全てのローカル変数を宣言しないと気が済まない人もいるから注意。

425 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 13:55:16 ]
ただそのときに
その配列の前にファイル読み込んで行数確認して
配列の領域確保して
またファイル読み込んでそこの配列に代入というプログラムにしてるんです。
無駄にファイル読み込んでるとかいわれそうだけど。

最初に全てのファイルの領域を確保する
配列を定義してもいんですが、その行数をまた違う配列でも使うので、
それは避けたいんです。

426 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:04:46 ]
ファイルの二回読み自体は仕様的に問題ないなら構わないと思う。
しかし、寧ろそれだけ複雑ならループ内を全部別関数にするべきじゃないのか?
main()はあくまでもコマンドラインとのI/Fだと思うんだが。



427 名前:デフォルトの名無しさん [2007/10/16(火) 14:06:45 ]
STLなら自動拡張する

428 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:20:06 ]
まあそうなんですけど。
今つくってるのは1つのファイル(これを入力)に対して
forループ回違うファイルを読み込んで処理して
それぞれファイルでの値を出して一番高いものを出す。
その一番高いものが入力と合ってたら正解みたいなプログラムなんですけど。
これをmain関数内でやってるわけなんですが、
入力が複数として、この複数の入力の中で正解がいくつあるかって最終的には
したいんです。

今のmain関数も別関数として
入力をいれる処理をmainとして、元のmain関数において正解のものを
returnさせて正解率を出すべきですよね?


429 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:27:02 ]
抽象的に過ぎてよく判らんw

こんなもんじゃないのかな?
main()
{
問題処理();
}

問題処理()
{
統括ファイル読み込み();
for () {
個別ファイル処理();
if (正解判定()) {
正解処理();
}
}
}

430 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:32:14 ]
んなもんですね。。ありがとうございます。
mainから問題処理のところを手作業でやってもいんですけど
入力データが100くらいあるから手作業だとだるすぎるので。
今求められてるのは正解率ですから。しかし何かの機械の実装って本当にめん
どくさいね。まだ社会人じゃないから実情は知らないけど。


431 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:33:04 ]
オジサンの弱った頭には、ややこしくて理解できん。
話を整理してもらえないか。

432 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:36:26 ]
宿題スレじゃないんだし、エスパーごっこはそろそろ終わりでいいんじゃないか?
>430だって>429までの流れを踏まえて少しは自分で頭を使いたいだろうし。

433 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 14:44:07 ]
もうforループの中で配列宣言つかっていいてのと
ファイル2回読みはOKかどうかもわかったので失礼します

434 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 17:55:42 ]
まあ、ファイルのクローズと、領域の解放を忘れなければどうでも良いんじゃね

435 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:48:47 ]
若い人は記憶力まかせにしても破綻しにくいからのぉ。

わしも小学生の頃は、
恐ろしくスパゲッティなコードを書いていたが、
ちゃんと把握できていたので何ら問題なかったな。

いまではもう無理。

436 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:51:02 ]
若いのにRAIIとかエディタの支援機能に頼りまくりで記憶力低下中だけど
元からそんなに記憶力良い方じゃないから問題ないか



437 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:51:59 ]
ここは自分のダメな所を書くスレになりました

438 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 18:57:10 ]
若くても、頭脳を有効に使うために、スマートなコードを書くべき。

439 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 20:59:21 ]
Cの配列宣言って要素数に定数じゃなくて変数って使えないんじゃ?
動的な領域確保したい時はCはmallocに頼るしかないはずだと記憶していたのですが?
覚え間違いかな…?

># 但し、殊にCではアナクロ的に関数の先頭で全てのローカル変数を宣言しないと気が済まない人もいるから注意。

これはブロック({}で囲まれた部分のこと、正式な呼び方知らない)の先頭でしか変数の宣言を許さないCの制限のせいでしょう
C++ではこの制限がないからbetterCとしてC++を使っているなら関係ない話ですが

440 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 21:47:30 ]
>>439
その制限は関係ないよ。

関数の先頭でしか変数宣言すべきではないという石頭の連中は、
制限がないC++においても、同様のルールを主張していたりするから。


441 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:16:45 ]
>>439プ

442 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 22:23:16 ]
>>439
>Cの配列宣言って要素数に定数じゃなくて変数って使えないんじゃ?
C99なら出来る。C89はムリ

443 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 11:22:34 ]
C言語の入門書を読んでたら、getsやscanfは使うなとか、fgetsを使えとか
ややこしいですよね。デリミタで区切られたデータ列を読み込む必要がある
んですが、呼び側のコードをシンプルにするため、こんな関数を作ってみま
した。下記のように使うのですが、何かマズいところはないでしょうか?
今のところ一応動いているのですが・・・

 char s[128];
 FILE *p = fopen("hoge.txt", "rb");
 if (ReadData(p, s) == 0) break;

/*********************************************************************
 ☆ファイルから1単位読み込んで文字列として返す
  デリミタで挟まれた文字列を1単位とする。
  int IsDelimiter(int c)はデリミタなら1、そうでなければ0を返す
  空のフィールドは存在しないものとする。
*********************************************************************/


444 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 11:23:47 ]
int ReadData(FILE *p, char *s)
{
int ex, c, ip;
/* 非デリミタ文字が現れるまで読み飛ばす */
ex = 0;
while (ex == 0){
c = fgetc(p); if (c == EOF) break;
if (IsDelimiter(c) == 0) ex = 1;
}
if (ex == 0) {
s[0] = '\0'; return 0;
}
else {
s[0] = (char) c;
}

/* デリミタが現れるまで,文字列を積み上げる */
ip = 1;
ex = 0;
while (ex == 0){
c = fgetc(p); if (c == EOF) break;
if (IsDelimiter(c) == 1) {
ex = 1;
}
else {
s[ip] = (char) c; ip++;
}
}
s[ip] = '\0';
return 1;
}


445 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:31:33 ]
128文字以上を入力するとマズい

getsを使うなってのは、読み込む最大文字数を指定できないからで、入力ファイルに予想より長い文字列が現れたら致命的
代わりにfgetsを使えってのは、fgetsは最大文字数を指定できるので、どんな入力が来ても死ぬことはない
>>444 の関数はそれと同じ問題を孕んでいる

ユーザに127文字までしか入力してはいけないといくら言い聞かせてみたところで、禁止されるとやりたくなるのが人というものだし、
そうでなくてもついうっかり文字数制限を忘れてしまうこともあるだろうし、プログラムはどんな入力が来ても安全なように作っておくべき

446 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:56:45 ]
>>444
ReadDataにsの要素を渡して文字数のチェックをちゃんとすればおk
てかex変数が無駄に見える……



447 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:57:32 ]
間違えた、sの要素数を、ね

448 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 13:52:11 ]
ofstreamはdeleteした際には自動的にcloseされるますか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<260KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef