スレを勃てるまでもないC/C++の質問はここで 3at TECH
スレを勃てるまでもないC/C++の質問はここで 3 - 暇つぶし2ch237:デフォルトの名無しさん
07/09/28 01:19:27
>>236
fgets()でやれば?

238:デフォルトの名無しさん
07/09/28 01:38:13
>>237
できませんでした(´・ω・`)
if(a[0] == '\0')
で未入力エラーチェックしてたのですが他の方法ってありますか?


239:デフォルトの名無しさん
07/09/28 01:42:31
>>238
その場合fgets()は改行文字を取り除かないから、if (a[0] == '\0' || a[0] == '\n')とでもすればいい。

240:デフォルトの名無しさん
07/09/28 01:56:46
scanfも非推奨

241:デフォルトの名無しさん
07/09/28 02:06:19
なんか頭痛くなってきた。もう寝ます。
教えていただきありがとうございました。

242:デフォルトの名無しさん
07/09/28 02:42:28
>>236
「未入力のエラーチェック」って何だよ。
わかんねーよ。

243:デフォルトの名無しさん
07/09/28 03:06:52
質問です。

#include<stdio.h>

#define NAME_MAX 20

int main()
{
char name[NAME_MAX+1];

scanf("%s",&name[0]);
printf("%-20s : 名前",&name[0]);
}
以上のようなプログラムを#defineの値を変えただけで
表示幅の左詰めを変更できるような方法を
知っている方がいらっしゃったら教えて頂けませんか?

244:デフォルトの名無しさん
07/09/28 03:17:34
printf("%-*s : 名前", NAME_MAX, &name[0]);

&name[0] は name と書いたほうがいいよ。

245:デフォルトの名無しさん
07/09/28 03:57:43
できました!ありがとうございます。
>244


246:デフォルトの名無しさん
07/09/28 14:56:42
>>242
何も入力しないでエンター押した時のことでしょ

247:デフォルトの名無しさん
07/09/28 21:29:24
>>246
それは未入力ではなく空入力と書いたほうがわかりやすいし、
もっと具体的に説明したほうがいいんじゃまいか。

248:デフォルトの名無しさん
07/10/02 17:51:52
#include <stdio.h>

int sum_ave(int num1,int num2,int *sum,int *ave)
{
*sum = num1 + num2;
*ave = (num1 + num2) / 2;
}
int main(void)
{
int x = 3;
int y = 5;
int goukei = 0;
int heikin = 0;

sum_ave(x, y, &goukei, &heikin);

printf("合計は %d です\n",goukei);
printf("平均は %d です\n",heikin);

}

これでコンパイルするとerror C4716: 'sum_ave' : 値を返さなければいけませんと表示されてしまいます。
何度も本を読み返してみたのですがどこがおかしいのかわかりません。ご教示お願いします。


249:デフォルトの名無しさん
07/10/02 17:54:57
int sum_ave → void sum_ave

250:デフォルトの名無しさん
07/10/02 17:56:37
エラーメッセージの言うとおりにしろよ
sum_aveの中でreturnしろ
値戻す気ないなら戻り値型voidにしろ

251:デフォルトの名無しさん
07/10/02 17:57:17
>>249
ありがとうございます

本に書いてあるのが間違いだとは思いませんでした

252:デフォルトの名無しさん
07/10/02 18:02:51
本のタイトル晒せ

253:デフォルトの名無しさん
07/10/02 18:08:45
本のサンプルが細かい所で間違ってるのは良くあること

254:デフォルトの名無しさん
07/10/02 23:11:22
>>252
C言語のポインタがゼッタイにわかる本の160ページです

本に書いてあるのがひょっとしたら間違えてるのかなと思って
正誤表URLリンク(www.shuwasystem.co.jp)をみたのですが
そのページのことは何も書いてなかったので私が間違えてるのかなと・・・

255:デフォルトの名無しさん
07/10/03 01:55:00
>>254
すごく恥ずかしいタイトルの本だなぁ。

ポインタくらいで躓く人は、その先にある、もっと大きなハードルを越えられないから、
いまのうちに諦めたほうがいいよ?

256:デフォルトの名無しさん
07/10/03 03:01:53
>>254
そういう壮大なタイトルをつける著者は、自分にしか分からないような文章を書く事が多いからねぇ。
まずは、メモリとアドレッシングについてきちんと理解した方がいいよ。

257:デフォルトの名無しさん
07/10/03 17:30:41
> そういう壮大なタイトルをつける著者は、自分にしか分からないような文章を書く事が多いからねぇ。
ハゲ堂w

258:デフォルトの名無しさん
07/10/04 16:36:02
ハゲって言うなこのハゲ!!

259:デフォルトの名無しさん
07/10/06 04:38:31
テンプレートを使うとリンクで失敗します。
ソースをまとめて一つのファイルにした場合は大丈夫なのですが、
テンプレートを使ったクラスを分割コンパイルしようとすると、必ずリンクで失敗します。
環境はFC6+gcc4.0です。

260:デフォルトの名無しさん
07/10/06 06:54:23
そうだそうだ!
「ハゲ」って言うな俺ハゲ!

261:デフォルトの名無しさん
07/10/06 09:15:21
>>259
テンプレートクラスを分割コンパイルってどうやってやってるの?
Vandevoorde と Josuttis の C++ Templates という本では 6 章で
議論しているけど。

262:デフォルトの名無しさん
07/10/06 12:18:30
画像を一覧表示 -> 簡単な加工 -> 保存
を行うアプリケーションを開発させられています。
PhototoShop等の画像処理ソフトでは、作成したファイルのアイコンに、画像のプレビューが表示されますが、あれができないかと言われたのですが
VisualStudioのhelpを探しても、helpのテキストが膨大すぎてどうにもなりません。
これに関しての情報をどなたかご存知ありませんでしょうか?

263:デフォルトの名無しさん
07/10/06 12:46:08
>>262
help でキーワード検索してみるとか。
「イメージ ライブラリ」で検索するとちょっと近付くかも。

264:デフォルトの名無しさん
07/10/06 13:37:13
>>262
漠然としすぎてる。

やりたいことを具体的に適切に書かないと、アドバイスできない。

265:デフォルトの名無しさん
07/10/06 13:40:31
おいモマイラ
C and C++ Forum URLリンク(forums.belution.com)
↑ここ見える、漏れは9月の終りから覗けなくて困ってるんだが。

266:デフォルトの名無しさん
07/10/06 14:01:53
>↑「ここ見える、漏れ」は9月の終りから覗けなくて困ってるんだが。

そこが見えるあんたは何で覗けないんだ?

267:デフォルトの名無しさん
07/10/06 14:21:15
>>266
本当に見えるのか?
会社からも、自宅からも見えないんだが?

268:デフォルトの名無しさん
07/10/06 14:26:56
日本語が書けない・読めない人を雇ってる会社の人が不憫だ

269:デフォルトの名無しさん
07/10/06 14:31:15
嫌いな人が居るなら殺しちゃえばいいんだよ

270:デフォルトの名無しさん
07/10/06 14:32:26
belution最近調子わるいみたいだね。

271:デフォルトの名無しさん
07/10/06 14:41:21
>>267
>265に、「ここ見える、漏れ」と書いてあるが。

272:デフォルトの名無しさん
07/10/06 14:46:41
揚げ足を取るならせめておもしろくしようや

273:デフォルトの名無しさん
07/10/06 15:49:48
ここ見える?って区切らなきゃだめってのと、266の突っ込みが理解できてないの両方だからな
相手に伝える能力もなければ、相手の言うことも理解できない。
仕事でこういう奴と組まされる人がかわいそうだ。

274:デフォルトの名無しさん
07/10/07 03:37:55
数字をカウントしたいんだけど
(宣言等省略)
fgets(input,256,stdin);
for(i = 0;input[i] != '\n';i++){
if(isdigit(input[i]) != 0){
for(j = '0';j <= '9';j++){
if(input[i] == j){
output[j - '0']++;
}
}
}
}
でやってもうまくいかない。どっかおかしいところあります?

275:デフォルトの名無しさん
07/10/07 04:59:03
ある

276:デフォルトの名無しさん
07/10/07 05:00:08
>>274
for(j = '0';j <= '9';j++){
if(input[i] == j){
output[j - '0']++;

output[input[i]-'0']
でいいと思うけど、一応目的通りには動くよな。

どう上手くいかないのか、もう少し詳しく書いてくれないと

277:デフォルトの名無しさん
07/10/07 05:28:07
配列外アクセスしてないか
inputとoutputの長さは大丈夫か?

278:デフォルトの名無しさん
07/10/07 08:38:25
どのようにうまくいかないのか、ちゃんと説明しろよ。

まともな頭脳していたら、もっと問題点を絞り込めるハズだ。
大抵はその課程で自己解決するものだがな・・・。

279:デフォルトの名無しさん
07/10/07 19:20:57
>>274
省略しちゃった宣言のほうが
とてつもなくおかしかったりして

280:デフォルトの名無しさん
07/10/07 20:14:51
問題に気がついていないからこそ、省略したところに、問題があるんだろうな。

ソースコードは全部見せたほうがいい。
とはいえ、問題とは関係ない処理は削るべし。

スレに直接書くのは大変だろうから、
自分の持っているWebサイト上にソースコードを置くべし。

過去ログを見た人のために、そのソースコードは長期にわたってWebに残すべし。

281:デフォルトの名無しさん
07/10/09 01:03:50
ありがとうございます。
どう動かないかというと、実行したとたんに終了してしまうのです。
この入れ子自体は変じゃないんですね?

一応変数宣言は
int i,j;
char input[256];
char output[256];


282:デフォルトの名無しさん
07/10/09 09:56:54
>>281
> 実行したとたんに終了してしまうのです。

まず、デバッガ上でステップ実行しろ。
次に、fgetsの返り値をチェックしろ。

話はそれからだ。

問題箇所はわかっているが、
すぐに教えてしまうと、
ステップ実行すらやらなさそうだからな!


283:デフォルトの名無しさん
07/10/09 10:06:18
デバッガなしでprintf()をはさんでデバッグすればすむことだ。

284:デフォルトの名無しさん
07/10/09 11:01:20
>>283
printfデバッグなんて、いったい、いつの時代の話だよ。
デバッグ用のログを取るべき状況もあるが、これは、明らかに違う。

285:デフォルトの名無しさん
07/10/09 11:07:02
>>281
>実行したとたんに終了
正常に動作して終了しただけじゃね?

あと、outputは数字の数を数えてるんだから[10]でよくね?

286:デフォルトの名無しさん
07/10/09 11:22:48
質問します。このようなコードがあるのですが

fseek(fp, 0, SEEK_SET);
for( ; l>=0; l = l - 2L) {
ch = fgetc(fp);
putchar(ch);
fseek(fp, 1L, SEEK_CUR);
}

なんでわざわざ定数をLong型で表現してるのですか?普通に
for(;l>=0;l-=2){で良いと思うのですが。何か理由があるのでしょうか?

287:デフォルトの名無しさん
07/10/09 11:28:37
>>286
関数のプロトタイプ宣言がなされていない場合などに、スタックに積まれる内容が違ってくる。

288:デフォルトの名無しさん
07/10/09 11:38:10
l -= 2 でいいと思うが、long を明示したい年頃だったんじゃないかね

289:デフォルトの名無しさん
07/10/09 12:33:37
>>284
時代もへったくれも、きちんとロジックを追えれば済むと言っているのだが。
まぁ、対処療法プログラミングを心掛けたいのなら止めはしないが。

290:デフォルトの名無しさん
07/10/09 12:36:17
>>287
for ループの l = l - 2L には関係ない話だね。


>>288
それならそれで、 l -= 2L でいいわけで。

>>286
つーことで、普通はそんな書き方しない。
書いた香具師に聞け。

291:デフォルトの名無しさん
07/10/09 12:48:03
>>289
おいおい。

printfデバッグとデバッガを使うのと、本質的には何も変らないぞ。


292:BjarneStroustrup
07/10/09 17:08:29
なにこのスレワロタ

293:デフォルトの名無しさん
07/10/09 20:34:24
64bit環境を想定したかったんじゃね

294:デフォルトの名無しさん
07/10/09 20:51:56
そこでユニットテストですよ
ステートメント毎にログ、強制終了等処置方法を細かく選べ
大量のテストを一度に実行できて再利用もできる
これを使わない手はないね☆

>>292
うっさいハゲ!

295:デフォルトの名無しさん
07/10/09 21:48:57
>>286
暗黙のキャストが嫌いなんじゃね?
どっちかっつーと
>fseek(fp, 0, SEEK_SET);
ry
>fseek(fp, 1L, SEEK_CUR);
ここの差が気になる。


296:デフォルトの名無しさん
07/10/09 22:06:16
>>289
× 対処療法
○ 対症療法

297:281
07/10/10 21:01:28
アドバイスありがとうございます。
fgetsの返り値は異常ありませんでした。
デバッカ上でステップ実行てどのようにするんですか?

298:デフォルトの名無しさん
07/10/10 21:05:17
環境を書かないと

299:デフォルトの名無しさん
07/10/10 21:44:33
>>297
デバッガ って何だか、わかってる?
ステップ実行 って何だか、わかってる?

いまどきのGUIの開発環境なら、ちょっとマニュアル見ればわかると思う。

300:デフォルトの名無しさん
07/10/10 21:45:30
>>297
なんじゃそら。
プログラム実行したとたん終わるのに、fgetsで入力あんのか?
fgetsで入力待ちしてるの?

「実行したとたん終了する」の状態がさっぱり分からんくなった。

301:デフォルトの名無しさん
07/10/10 21:47:16
すいません質問させてくださいm(_ _)m
RPGとかで誰かがしゃべると文字列が1個ずつ順次に表示されるんですが
あれ半角ならできるんですが、2バイト使用する全角の場合って、char配列2個使うので
解決できません;;

全角文字を配列に格納したり、1個ずつ表示するのってどうすればいいんでしょうか・・・
よろしくお願いします

302:デフォルトの名無しさん
07/10/10 21:52:09
stringつかっとけ こっちが業界標準

303:デフォルトの名無しさん
07/10/10 21:54:20
マルチバイト使うなら俺はwstringを使うぞ

304:デフォルトの名無しさん
07/10/10 21:55:00
>>301
半角文字のときは1個、全角文字のときは2個分進める。

305:デフォルトの名無しさん
07/10/10 22:01:37
>>302-304
早速の回答、本当にありがとうございますm(__)m
>>304
char配列を2つ使用しているので、この配列2こを利用して表示するというのは
理解しているのですが・・・2個分進めるというのはメモリ操作のことなんでしょうか?

恐ろしく低レベルな質問をしている気がしますが、よろしくお願いいたしますm(__)m


306:デフォルトの名無しさん
07/10/10 22:06:49
ソースを置いておきますm(__)m 連投申し訳ございません

// シーンの描画(テキスト①)
RECT rect = { x, y, 0, 0 }; // 描画領域
Font->DrawText(
Sprite, // 描画に使うスプライト
say, // 文字列
-1,      // 文字数(-1は自動計算)
&rect, // 描画領域
DT_LEFT | DT_NOCLIP,         // 左揃え&クリップしない
D3DXCOLOR(1, 1, 1, a));         // 文字色(R255,G255, B0) aは1で出る

// ここで出力
wsprintf( str,"%s","おはようございます。。" );
font1.print_char((int)x+260,(int)y+50,str);

全角を1こずつ順次だし????

307:デフォルトの名無しさん
07/10/10 22:21:26
それは、半角なら1個ずつ順番に出せるコードなのか?

308:デフォルトの名無しさん
07/10/10 22:39:00
>>300
もともとの質問者は、
相手に分かるように的確に説明する
というスキルが足りないからなぁ。

>>301
お前さんが言ってる「char配列」というのは何者か。
言いたいことは、なんとなくわかるが、
自分で勝手に変な用語を作り出したり使ったりされると、
話が見えにくくなるよ。

309:デフォルトの名無しさん
07/10/10 22:40:56
>>305
面倒くさいからUnicode使え。

310:デフォルトの名無しさん
07/10/10 22:47:51
VC++6.0Proをインストールしたのでサービスパックを当てようとしたんですが、
公式見ると最新の物はVisualStudio6.0のSP6しか見当たりませんでした。
これを当てればVC++6.0にもSP6が当たっている認識でいいんでしょうか?

311:デフォルトの名無しさん
07/10/10 23:10:03
>>310
OK。
VS6を買ってVC6しかインストールしない構成もアリだからね。

312:デフォルトの名無しさん
07/10/10 23:10:33
>>311
ありがとうございました。

313:デフォルトの名無しさん
07/10/11 03:12:06
しばしば、(void)hoge() などと関数呼び出しの前に (void) を付けているのを見かけるのですが、あれは何のメリットがあるのでしょうか?

314:デフォルトの名無しさん
07/10/11 03:16:57
>>313
専らLINTを黙らせるために付けている。
要は、値を返す関数の戻り値を利用しないことを明言するわけだ。

315:313
07/10/11 03:44:00
>>314
ありがとうございました。

316:デフォルトの名無しさん
07/10/11 18:54:16
WINDOWS環境で、OS標準でない画像形式をフォルダの縮小版表示で一覧できるようにしたいと思っています。
シェル拡張を利用するdllを用意してやればよいというのはわかったのですが、サンプルがなかなか見つかりません。
MSDN内等によいサンプル等はないでしょうか?


317:デフォルトの名無しさん
07/10/11 19:33:08
WindowsSDKのサンプルは漁ってみた?
なければ、
同様のことをやっているオープンソースのフリーウェアを、
SourceForge等で探そう。

318:デフォルトの名無しさん
07/10/11 22:13:50
WindowsSDKでビットマップ(カラー)の拡大・縮小がやりたいです。
サンプルソースなどがある良きサイトをご存知の方いましたら教えていただきたいのです。

319:デフォルトの名無しさん
07/10/11 22:27:08
>>318
StretchBltで検索

320:デフォルトの名無しさん
07/10/11 22:33:50
Expression Template(ET)の質問です

URLリンク(homepage1.nifty.com)

上記ページのETサンプルプログラム(vect2.h)
と同等の機能を持つETを使用しないコードの
実行速度を比較したところ
ET不使用の方が2倍程度早かったのですが、
どのような場合にETを使えば有効なのでしょうか??

321:デフォルトの名無しさん
07/10/11 23:39:22
入力パラメータが5つくらいあって、そのパラメータの条件でデータを
検索する関数を作らないといけないのですが、5つのパラメータ毎に
使用フラグがあって、フラグOFFの時は、検索条件になりません。
なので、検索条件としては、最低0個、最大5個になり、検索条件の
組み合わせもいろいろになってしまいます。
作り方としては、どういうやり方が簡単そうでしょうか?
パラメータの組み合わせがいろいろになるので、オーバーロードも
できないかなあ、と悩んでいます。

322:デフォルトの名無しさん
07/10/12 00:40:32
>>320
質問の答えにはならないが・・・。

そのWebページで紹介しているノウハウは、
下手な小細工
であるが故に、かえって遅くなったのだと思うよ。

無駄な一時オブジェクトの生成は、
コンパイラの最適化によって端折られるのであれば、
素直にコーディングするのがいいと思うよ。

323:322
07/10/12 00:41:14
文章が変だった。

無駄な一時オブジェクトの生成が、コンパイラの最適化によって端折られるのであれば、
素直にコーディングするのがいいと思うよ。

324:デフォルトの名無しさん
07/10/12 00:44:45
>>321
その「使用フラグ」を見ながら検索処理するのでは、ダメ?

325:デフォルトの名無しさん
07/10/12 01:10:18
>>324
ありがとうございます。
お風呂に入って考えてたけど、結局それが一番見通しがいいような
気がしてきた・・・


326:シロートです
07/10/12 01:41:53
C++言語を使っています。質問です。
4種類の連続した数値のデータがあります。4種類の測定時間や時間間隔は一緒です。
その4種類をひとまとまりとします。そのまとまりがいくつかあります。
それぞれのまとまりから一部分だけを取り出します。その一部分のデータの特徴を
どんどんと集めていき4種類のデータの特性を求めたいです。その方法がわかりません。
すいません。ホントシロートです。質問の意味がわからないかもしれません。
でも本当に困ってます。ヒントだけでもいいのでお願いします。

プログラムが違うのかもしれませんが、
「似たようなデータをどんどん記憶していくことによりそのデータ達の
特性を求める」ということかなと自分では考えたのですがその方法も分かりません。
方法を知っているとかこんなコマンドがあるなど本当に何でもいいのでよろしくお願いします。

327:デフォルトの名無しさん
07/10/12 01:55:59
エスパー以外お断りでなければもっと具体的に頼む

328:デフォルトの名無しさん
07/10/12 04:18:09
「特性」ってのをもっと具体的に説明しる

329:デフォルトの名無しさん
07/10/12 05:01:45
>>326
アルゴリズムの問題だね。
C/C++言語に特有の話ではないので、スレ違い。
さようなら。

330:デフォルトの名無しさん
07/10/12 05:07:00
      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     | 吉本いるか  
     \            
        ̄ ̄ ̄|/ ̄ ̄ ̄ ̄
                   ∧_∧      / ̄ ̄ ̄ ̄ ̄
         ∧_∧     ( ´Д`)    < 吉本いるか 
         ( ´Д` )   /⌒    ⌒ヽ    \_____
        /,  /   /_/|     へ \
       (ぃ9  |  (ぃ9 ./    /   \ \.∧_∧  / ̄ ̄ ̄ ̄ ̄
        /    /、    /    ./     ヽ ( ´Д` )< 吉本いるか 
       /   ∧_二つ (    /      ∪ ,  /   \_____
       /   /      \ .\\     (ぃ9  |     
      /    \       \ .\\    /    /  ,、  
     /  /~\ \        >  ) )  ./   ∧_二∃  
     /  /   >  )      / //   ./     ̄ ̄ ヽ    
   / ノ    / /      / / /  ._/  /~ ̄ ̄/ /   
  / ./     ( ヽ、     ( ヽ ヽ | /       ( ヽ、     
(   _)      \__つ    \__つ).し          \__つ   


331:デフォルトの名無しさん
07/10/12 05:33:44
いるよ

332:シロートです
07/10/12 08:49:30
みなさん、説明が下手ですいません。
4種類のデータはヘリコプタの制御に使う、スロットル、エルロン、エレベータ、ラダーです。
特性はホバリングをしている時の4種類のデータ入力の特徴を見つけたいです。
よろしくお願いします。

333:デフォルトの名無しさん
07/10/12 09:01:18
私らはヘリコプタの専門家ではないから、それらのデータの特徴と言われても
何をどうすればいいか判らんのだがね。
もっと具体的に説明はできないもんかね。

334:デフォルトの名無しさん
07/10/12 09:49:43
>>332
コンピュータは勝手に思考して適当によろしくやってはくれない。
処理の手順を1つずつ手取り足取りコーディングしてやる必要がある。

まずは、人間が手作業で計算して処理する手順を明らかにすること。
それくらいは自分でやってから、相談してね。

335:デフォルトの名無しさん
07/10/12 11:40:08
C言語で2次元変数a[4][5]として適当な文字を入れる場合、20文字入れないといけないんですよね?

336:デフォルトの名無しさん
07/10/12 11:53:19
何をしたいのかよくわからん。
こういうことか?
char a[4][5] = { "This", "is", "a", "pen" };

337:デフォルトの名無しさん
07/10/12 12:02:44
vector配列について質問です。
現在、配列に構造体を設定しているのですが、
その構造体の内容を書き換えるとき、以下のようなコードを書いています。

struct DATA data;

data=vec[i];
data.n=5;
vec.push_back(data);

できれば、このようなコードではなく、
vector[i]のところで構造体のアドレスを得るようにして、
メンバを変更したいと思っているのですが、
そのようなことは可能でしょうか。








338:デフォルトの名無しさん
07/10/12 12:08:00
>>335に追加で
#include<stdio.h>
void main(){
int i,j,a[4][5];
a[0][0]='た';a[0][1]='さ';a[0][2]='か';a[0][3]='あ';
a[1][0]='ち';a[1][1]='し';a[1][2]='き';a[1][3]='い';
a[2][0]='つ';a[2][1]='す';a[2][2]='く';a[2][3]='う';
a[3][0]='て';a[3][1]='せ';a[3][2]='け';a[3][3]='え';
a[4][0]='と';a[4][1]='そ';a[4][2]='こ';a[4][3]='お';
for(i=0;i<4;i++){
for(j=0;j<5;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
}
と入力しても正しく入力できないのですがどうすればいいのでしょうか?

たさかあ
ちしきい
つすくう
てせけえ
とそこお

と表示させたいです。

339:デフォルトの名無しさん
07/10/12 12:09:08
>>336
そういうことです

340:デフォルトの名無しさん
07/10/12 12:12:17
>>338
ぱっと見、
printf("%d",a[i][j]);
これはおかしい。
%cだよ。

341:デフォルトの名無しさん
07/10/12 12:12:26
>>338
1) printfの書式について調べよう
2) charについて調べてみよう
3) 全角を表示するにはどうしたらいいか調べよう

342:デフォルトの名無しさん
07/10/12 12:14:33
>>340
無駄な指摘乙。

>>337
vec[i].n = 5ではいけないの?
安全にやるなら
vec.at(i).n = 5になるけど。

343:デフォルトの名無しさん
07/10/12 12:15:35
>>337
vec[i].n = 5;

344:デフォルトの名無しさん
07/10/12 12:16:03
そのコードは、
コンテナ内の既存の要素を変更しているのではなく、
コンテナ内の既存の要素をコピーし、少し変更し、新規の要素として末尾に追加しているぞ。

既存の要素を変更するなら、
vec[i].n=5 ;
でいけると思う。

あるいは、明示的に参照を使って、
DATA& data ;
data = vec[i] ;
data.n = 5;
これでもいいね。

345:デフォルトの名無しさん
07/10/12 12:16:53
>>340
>>341
ありがとうございます。
調べてみます

346:340
07/10/12 12:17:32
>>342
あー、%Cの間違い。

処理系によってはサポートしていないかもしれんが。

347:デフォルトの名無しさん
07/10/12 12:21:52
いや、
a[0][0]='た';a[0][1]='さ';a[0][2]='か';a[0][3]='あ';
とかも、
a[0][0]=L'た';a[0][1]=L'さ';a[0][2]=L'か';a[0][3]=L'あ';
にする必要あるな。

348:デフォルトの名無しさん
07/10/12 12:22:47
そもそも、int はマズいな。wchar_t だ。

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

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

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

CData *p;

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

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

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

351:デフォルトの名無しさん
07/10/12 13:25:49
p = &vec[i];

352:351
07/10/12 13:29:06
いや、まて。 なにかおかしい。

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

353:デフォルトの名無しさん
07/10/12 13:33:12
的確すぎてワロタw

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


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

356:337
07/10/12 14:39:49
vector<Base*>で上手くいきました。
ありがとうございました。

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

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


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

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

360:デフォルトの名無しさん
07/10/12 16:13:43
>>359
何のために学費払ってんだよ。
先生に聞け、先生に。

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

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

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

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


364:デフォルトの名無しさん
07/10/12 20:57:03
>>363
さぁな、どんなバグがあるかは、デバッグしてみないとな。

365:デフォルトの名無しさん
07/10/12 20:58:47
>>363
テストしたの?

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

366:デフォルトの名無しさん
07/10/12 21:13:30
おまえらこんな抽象度の高い質問によく答えられるな

367:デフォルトの名無しさん
07/10/12 21:21:50
回答も抽象的だし

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

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

370:デフォルトの名無しさん
07/10/12 22:00:39
学生さんか。
じゃぁ、>>365の本は向いてない。

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

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

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

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


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

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

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


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


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

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

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

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

378:デフォルトの名無しさん
07/10/13 11:14:58
l1とl2の型をdoubleにする。

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

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

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

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

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

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

385:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/13 12:07:12
>>382
いいえ、勘違いではなくclock_tがdoubleなどの実数型であるとでも思っているのでしょう。

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

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

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

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

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

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

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

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


393:390=391
07/10/13 13:52:16
すまんorz

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

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

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

ありがとうございました

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

396:デフォルトの名無しさん
07/10/13 16:22:59
(int)floor(X / 2.0)

これってアリなの?

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

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

397:デフォルトの名無しさん
07/10/13 16:24:37
>>396
2.0

398:デフォルトの名無しさん
07/10/13 16:31:49
doubleで割ってるからdoubleになる
大丈夫

399:デフォルトの名無しさん
07/10/13 16:44:39
左項に合わせるのだと思い込んでたよ。


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

401:デフォルトの名無しさん
07/10/13 18:11:19
まず間違いなくバグだらけだろうな

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

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

403:デフォルトの名無しさん
07/10/13 18:53:41
GNUのソースは警告0ですか?

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

405:デフォルトの名無しさん
07/10/13 20:03:57
Wallにしたらstlでも凄い量の警告出るぜ

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

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

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

409:デフォルトの名無しさん
07/10/13 22:16:07
そうですか

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

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

410:デフォルトの名無しさん
07/10/13 22:22:18
boost使うならやりようは色々あるかと

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

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

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

413:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/16 04:50:04
int array[10] = { FILL(10,10) };
みたいにプリプロセッサで書けないかなぁ…

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

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

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

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


419:デフォルトの名無しさん
07/10/16 12:25:23
あれ?自動変数は0に初期化されるんでしたっけ?

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

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


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

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

424:デフォルトの名無しさん
07/10/16 13:44:09
あーなるほど、言いたいことは判った。

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

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

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

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

427:デフォルトの名無しさん
07/10/16 14:06:45
STLなら自動拡張する

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

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


429:デフォルトの名無しさん
07/10/16 14:27:02
抽象的に過ぎてよく判らんw

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

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

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


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

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

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

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

435:デフォルトの名無しさん
07/10/16 18:48:47
若い人は記憶力まかせにしても破綻しにくいからのぉ。

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

いまではもう無理。

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

437:デフォルトの名無しさん
07/10/16 18:51:59
ここは自分のダメな所を書くスレになりました

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

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

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

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

440:デフォルトの名無しさん
07/10/16 21:47:30
>>439
その制限は関係ないよ。

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


441:デフォルトの名無しさん
07/10/16 22:16:45
>>439プ

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

443:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/10/17 12:31:33
128文字以上を入力するとマズい

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

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

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

447:デフォルトの名無しさん
07/10/17 12:57:32
間違えた、sの要素数を、ね

448:デフォルトの名無しさん
07/10/17 13:52:11
ofstreamはdeleteした際には自動的にcloseされるますか?

449:デフォルトの名無しさん
07/10/17 16:56:00
yes yes yes

450:444
07/10/17 21:22:36
レスありがとうございます。

>>445
>128文字以上を入力するとマズい

実装時には、バッファ長を1kB位取ってごまかしちゃうつもりでしたが、
言われてみればその通りですね。変数ipをチェックすればいいので、
バッファがあふれたらエラーを返すコードを追加しようと思います。

>>446
>ex変数が無駄に見える……

やっぱり?
ループの脱出条件をコーディングしながら決められるので、ついつい
やっちゃいます。こんな場合は、

  while ( (c=fgetc(p) != EOF ) {

とか書くもんなんでしょうか?


451:デフォルトの名無しさん
07/10/17 22:24:27
>>450
exが無駄って言ったのは、
ループ中途脱出(break)を判別するためだけに使ってるように見えたから。
あれならwhileループ後のif文をそのままwhile内にぶちこめば、
ex使わないでいけそうだったし。
まあ、分かりやすく書けば良いと思うので、聞き流して結構です

do {
if( (c=fgetc(p)) == EOF ) {
s[0] = '\0';
return 0;
}
} while (IsDelimiter(c));
ループ終了条件を>>450みたくデリミタでなくEOFにすると、
この場合はreturnするために別にまたif文書かないといけないから、無駄そう

452:デフォルトの名無しさん
07/10/17 22:50:46
C言語なんだから、関数ばしばし作ろうよ。

・デリミタもしくはEOFまで読み飛ばし、最後に読み飛ばした文字を返す
・デミリタまで文字列を格納する
という2つの関数を作ればスッキリするよ。


453:444
07/10/17 22:59:06
>>451
>whileループ後のif文をそのままwhile内に

む。なるほど。
こちらの方がシンプルですね。

プログラムをできるだけ愚直に書こうと努力しているつもりですが、
スマートな解を示されると感動しちゃいます。勉強になりました。

>>452
>関数ばしばし

実装フェーズでは、そうなっちゃうかもしれません。
ただ、データ読み出しの関数なので、恐らく何万回も呼ばれる
ことになると思います。
実のところ、こんな冗長な関数を作るべきか、まだ悩んで
いるんです・・・


454:デフォルトの名無しさん
07/10/17 23:09:09
何万回程度の関数呼び出しコストなんて屁でもないぞ


455:デフォルトの名無しさん
07/10/17 23:15:46
というかこれでいいと思う

int ReadData(FILE *p, char *s){
int c, ip=0;

while( (c=fgetc(c)) != EOF)
if (IsDelimiter(c))
s[ip++] = (char) c;

s[ip] = '\0';
return !!ip;
}

456:デフォルトの名無しさん
07/10/17 23:21:41
いいのか、ほんとに。

457:デフォルトの名無しさん
07/10/17 23:29:45
なんでいいのか判らん・・・


458:455
07/10/17 23:32:29
あ、すまん、所々ミスってる上にそもそも動作が違うなw

これでどうだ

int ReadData(FILE *p, char *s){
int c , ip=0 , flag=0;

while( (c=fgetc(p)) != EOF ){
if (flag){
if (!IsDelimiter(c)) s[ip++] = (char) c;
else break;
} else if (IsDelimiter(c)) flag=1;
}

s[ip] = '\0';
return !!ip;
}

うーん、あんまりスマートじゃない……

459:455
07/10/17 23:34:58
>>456-457
いや、IsDelimiterの戻り値を勘違いしてた上に、
そもそも動作を全く勘違いしてたw

これならわざわざ書き直す必要なかったですね……
偉そうにでしゃばってすみませんorz

460:444
07/10/17 23:44:46
各位殿

色々ご指導ありがとうございました。
とりあえず仮決めですが、下記のようにすることにしました。
色々いじったら、仕様が変わっちゃった・・・

>>454
ちょっと安心しました。

>>455
読み込み長を返すアイデア頂きました。
ありがとうございました。


461:444
07/10/17 23:45:24
int ReadData(FILE *p, char *s)
{
int c, ip;

/* 非デリミタ文字が現れるまで読み飛ばす */
do {
if ( (c = fgetc(p)) == EOF ) {
s[0] = '\0';
return 0;
}
} while (IsDelimiter(c) == 1);
s[0] = (char) c;

/* デリミタが現れるまで,文字列を積み上げる */
ip = 1;
while (1) {
if ( (c = fgetc(p)) == EOF ) break;
if ( IsDelimiter(c) == 1 ) break;

s[ip] = (char) c;
ip++;
if (ip >= MAXBUFSIZE) {
ip--;
s[ip] = '\0';
return -ip;
}
}
s[ip] = '\0';
return ip;
}


462:デフォルトの名無しさん
07/10/17 23:58:02
自分なら、↓こんな感じかなぁ。

int ReadData(FILE* pFileIn, char* strOut) {
*s = '\0' ;
int countDelimiter = 0 ;
int countOutput = 0 ;

while(1) {
int c ;

c = fgetc(pFileIn) ;
if (c == EOF) break ;

if (IsIsDelimiter(c)) {
++countDelimiter ;
if (countDelimiter ==2) break ;
} else if (countDelimiter == 1) {
*strOut = (char)c ;
++strOut ;
}
}

return countOutput ;
}


463:462
07/10/17 23:58:45
おっと、間違った。

int ReadData(FILE* pFileIn, char* strOut) {
int countDelimiter = 0 ;
int countOutput = 0 ;

while(1) {
int c ;

c = fgetc(pFileIn) ;
if (c == EOF) break ;

if (IsIsDelimiter(c)) {
++countDelimiter ;
if (countDelimiter ==2) break ;
} else if (countDelimiter == 1) {
*strOut = (char)c ;
++strOut ;
}
}

*strOut = '\0' ;
return countOutput ;
}

464:デフォルトの名無しさん
07/10/18 00:14:00
countDelimiterで制御するのですね。
ちょっとトリッキーかな・・・


465:462
07/10/18 00:22:08
やりたい処理を素直に書いただけなんだけどなぁ・・・。

466:デフォルトの名無しさん
07/10/18 00:35:46
文化が違うのがオモロイなぁ・・・

467:デフォルトの名無しさん
07/10/18 01:16:12
int ReadData(FILE *fp , char *out , int n){
int c , i=0;

while(i<n-1){
c = getchar(fp);
if (c == EOF || (IsDelimiter(c) && i != 0)) break;
if (!IsDelimiter(c)) out[i++] = c;
}
out[i] = '\0';
return i;
}

468:デフォルトの名無しさん
07/10/20 22:47:48
エラーメッセージを出力するところなんですが、

#define ABC "ABCの時のエラーメッセージ"

などと定義しておいて、エラーメッセージの出力関数には、
エラーコードの「ABC」のみを引数で渡すようになっています。
ただの文字列に変換する場合はこれでよかったんですが、
エラーの時に出た数字もエラーメッセージに含める場合も追加されました。
その数字は、書式指定(%dとか%lfとか)なので、同じようにマクロで
文字列を生成しようとして、つまづいてしまいました。

こんな感じで書いてみたんですが、当たり前だけどstrをどこで定義すれば
よいのかがわかりません。

#define ABC(gStr) sprintf( str, "ABCの時のメッセージ( %g ).", gStr )

引数なしの時と同じように、文字列(str)をそのまま生成するには
どう書いたらいいですか?

469:デフォルトの名無しさん
07/10/20 23:28:42
>>468
> エラーコードの「ABC」のみを引数で渡す

あなたは自分がやっていることを理解してない。
ABCはエラーコードなんてものではなく、文字列リテラルへのポインタ。
なお、複数の同じ内容の文字列リテラルが1つにまとめられることは保証されていない。

そして、マクロが何者なのか、理解していない。
いまのコンパイラはプリプロセッサが統合されているので、わかりにくいが、
ソースコードは、プリプロセッサによってマクロが展開された後に、コンパイルされる。
マクロは「定義」するものだが、その定義とは、日本語の定義とは意味が異なる。

> strをどこで定義すればよいのかがわかりません。

エラーはネストするの?
シングルスレッドとマルチスレッド、どっち?


470:469
07/10/20 23:35:01
ああぁ

呼び出し側の関数にエラーコードとして返したりせず、
エラーメッセージを出力する関数にしか渡さないのなら、
適当に自動変数で持てばいいと思うよ。

CとC++どっち?

471:デフォルトの名無しさん
07/10/21 00:00:21
>>468
#define ABC(gStr) "ABCの時のメッセージ("#gStr")"

ってgStrが変数なのか
知らね

472:デフォルトの名無しさん
07/10/21 00:21:50
基本的なことが理解できてない人に、
場当たり的に教えるのは、
効率が悪すぎる。

473:デフォルトの名無しさん
07/10/21 00:42:22
468です。いくつかのご回答、ありがとうございました。
>>469
自分のしていることを、自分で理解していないのかもしれません。
> エラーコードの「ABC」のみを引数で渡す
は間違いで、エラー出力関数への引数には、文字列になります。
エラーはネストしません。また、シングルスレッドです。

>>470
C++です。
「適当に自動変数」というのは、文字列自動変数をエラーコード
毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか?

>>472
効率よく教わるためには、どの基本的なことを勉強すればよいでしょうか。




474:デフォルトの名無しさん
07/10/21 00:56:30
>>473
ネストせず、シングルスレッドなら、str をグローバル変数にしてしまうのも可能。
簡単だけど、あんまり良いやり方ではないが、とりあえず最小の変更で済むかな。
strなんて短くてどこにでもありそうな名前は、変えるべきだよ。

> 「適当に自動変数」というのは、文字列自動変数をエラーコード
> 毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか?

そう。


475:wolf ◆8VH3XAqjlU
07/10/21 11:00:52
>>468
>>473
C++なら普通polymorphismを使いますが兎も角動かすには
#define ABC(i_code) { char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }
ブロックについては URLリンク(www.geocities.jp)

476:デフォルトの名無しさん
07/10/21 11:47:16
>>475
ありがとうございます。
実環境で確認してみます。

477:デフォルトの名無しさん
07/10/21 16:45:38
おま・・・。
せめてdo-while

#define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0)

で、ソレは俺も質問見たとき考えたけど、マクロの意味というか役割というかが変わってるから、
「なんでエラーメッセージをマクロにしたいのか」が分からないと使えるかどうか分からなかった。

個人的には、ストリングテーブル的に↓とかで十分かな、と思う。

#define ABC "ABCの時のメッセージ( %s )."
(共通な文字列リテラルの切り出し。日本語版やら英語版やらを作るときに使う)

478:デフォルトの名無しさん
07/10/21 16:56:29
>>477
do whileハックを使わないといけないのは、古いコンパイラ。


479:デフォルトの名無しさん
07/10/21 17:33:37
>>478
それはすまない。俺の勉強不足のようだ。
ついては↓のコードがエラー無くコンパイル通るような
「新しいCコンパイラ」は何かを教えてくれないか?

#include <stdio.h>
#define macro(x) {puts(x);}

int main()
{
if(1) macro("str1");
else macro("str2");
return 0;
}


480:デフォルトの名無しさん
07/10/21 17:56:42
>>479
そういう{}のないif文は、コーディング規約で禁止。

481:デフォルトの名無しさん
07/10/21 18:00:58
マクロには;をつけないっていう選択肢はなし?

482:デフォルトの名無しさん
07/10/21 18:32:53
どう考えてもバグの原因になるだろ。

483:デフォルトの名無しさん
07/10/21 18:58:42
小細工禁止!

マクロによる関数もどきはダメ。
インライン関数やテンプレート関数を使うべし。

484:デフォルトの名無しさん
07/10/21 19:06:06
コンパイルに5分かかるプログラムを作ったら一人前ですか

485:デフォルトの名無しさん
07/10/21 19:07:23
そうだねえ。
再帰テンプレートとか作ると簡単に5分超えるね。
練習にはいいんじゃない?

486:デフォルトの名無しさん
07/10/21 19:10:36
で、規約やら小細工やら良いんだけど

>do whileハックを使わないといけないのは、古いコンパイラ。
誰かコレを解説して貰えんか?
コンパイラの新旧が、マクロを括るブロックにdo-whileを使うことと
どう関係してんだ?

487:デフォルトの名無しさん
07/10/21 19:11:40
勘弁してやれw 勘違いだろw

488:デフォルトの名無しさん
07/10/21 19:42:09
制御文なしに中括弧だけを書くとエラーになるような古いコンパイラがあったんじゃないか。

489:デフォルトの名無しさん
07/10/21 20:31:08
>>475
それだとABC(data);って書いたら駄目だわなw
#define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0)
こうだな
まあ受け売りだが

てか一回sprintf経由する必要はあるの?
#define ABC(i_code) printf("ABCの時のメッセージ( %d ).\n", i_code)
これじゃ駄目なんかいな

490:489
07/10/21 20:33:43
やべ、俺リロードしなさすぎw
吊ってくるww

491:デフォルトの名無しさん
07/10/21 20:34:54
エラーメッセージを生成するのと、表示するのは、分離したほうがいいと思う。

492:デフォルトの名無しさん
07/10/22 10:50:35
つーか、元質はデバッグ出力関数に渡す引き数を生成したいんじゃないかな?
だとしたら、>475以下はダメだろう。

493:デフォルトの名無しさん
07/10/22 19:39:51
C言語に関して質問です。
構造体の各要素に添え字を使ってアクセスすることはできないのでしょうか?

例えば
struct OBJ{
int x;
int y;
char c;
char str[10];
};

main()
{
struct OBJ tmp;
tmp.[0] ← xのこと
tmp.[1] ← yのこと
tmp.[2] ← cのこと
tmp.[3] ← str[]のこと
}

といった感じのことがしたいのです。実現可能な方法があれば是非お願いします。

494:デフォルトの名無しさん
07/10/22 19:43:42
unionを使えば出来ないことはないけど、正直お勧めしない。

495:デフォルトの名無しさん
07/10/22 19:44:02
C++なら・・・無理か。
型もバラバラだしな。
添え字に変数を使って

tmp.[i]

ってしたとき、何型で扱うつもりなんだ

496:デフォルトの名無しさん
07/10/22 19:44:13
>>493
限定的にはunionを使えばできる。
ややこしくはなるがポインタをキャストしてもできる。
どちらにしろ、サイズの違う型を統一的には扱えない。

497:デフォルトの名無しさん
07/10/22 20:19:14
>>493
なんで、そんな変なことをしたいの?


498:デフォルトの名無しさん
07/10/22 20:22:08
テンプレートクラスでtemplate <Type T>のTにクラスを入れることが可能なのですか?
int型などを入れるメリットは分かるのですが具体的にどんなクラスを入れれば役に立つのか教えていただけないでしょうか?

499:493
07/10/22 20:29:47
回答して下さった方々有難う御座います。
for文のインデックスを利用出来たらと思いました。
しかし型などが違うのでその都度場合わけをしないといけないので出来たとしても結局のところ手間は増えますね。

500:デフォルトの名無しさん
07/10/22 20:33:51
>>498
可能です。
STLのvector<T> はTの配列と置き換えられる動的な再配置も可能なクラスですが
当然組み込み型以外でもvectorを使うことが出来ます。

501:デフォルトの名無しさん
07/10/22 21:15:25
float a;
a=1;
print("%d",a);
を実行すると
1072693248っていう数がでてくる。
これってどういうこと?

502:デフォルトの名無しさん
07/10/22 21:24:52
>>501
言語およびコンパイラは何?
"%f" を使うべきである事は知っていて、なぜそうなるのかが知りたいということ?

503:デフォルトの名無しさん
07/10/22 22:53:01
>>501
printfの引数の2つ目以降の型って決まってないよね。
だから、printfにとっては、どんな型の値を引数に渡されたのか、わからない。
そのため、書式文字列に%dとあれば、intだと思って処理するわけ。

504:デフォルトの名無しさん
07/10/22 22:54:09
>>498
可能。

int型を入れるのと同じメリットが、stringクラスを入れるのにもあると思うのだが。
stringの配列なんて使う機会ないか? ないなら、まぁ仕方ない。

505:デフォルトの名無しさん
07/10/22 22:58:36
list<vector<string> >
とかな。

506:デフォルトの名無しさん
07/10/22 23:28:17
>>505
そんなこと、したことないぞ。

まず、stringのように重いものを、ポインタや参照ではなく値として持つvectorに格納するのが、乱暴だ。

次に、vector<string>を直にlistに格納するのも、乱暴だ。
vector<string>に何か意味があるのであれば、それなりのクラスにすべきだ。

507:デフォルトの名無しさん
07/10/22 23:35:45
乱暴ってのが何を意味してるかわからんが、
別にstringは重くないしvector<string>も十分に速いぞ


508:デフォルトの名無しさん
07/10/22 23:36:17
あほすぎる・・・

509:デフォルトの名無しさん
07/10/22 23:46:20
>>506が何を言いたいのかワカンネ
乱暴ってどういう意味?
vector<string>を使うなって言ってるの?

510:デフォルトの名無しさん
07/10/22 23:57:05
vector<string>を内包したオブジェクトつくって
インターフェースをきちんとしたオブジェクト指向な作り方しろってことか…。

C++だからって必ずオブジェクト指向で作らんでもいいだろ…

511:デフォルトの名無しさん
07/10/23 00:00:22
>>506は「そんなこと、したことないぞ」と言っている通り、思い込みで書き込んでいるんだよ。

512:デフォルトの名無しさん
07/10/23 00:02:01
vector<string> に何か意味をもたせるとして、所詮 vector 程度なら変数名で十分示せると思う。
vector<string> はオブジェクト指向だよ。

513:デフォルトの名無しさん
07/10/23 00:27:02
>>507
それは実装依存だな。

どーでもいい場所なら乱暴なコーディングをしても構わないし、すべきだろうが、
重くないとか十分に速いとか言ってるようじゃ、C++使う意味がないんじゃないか。

>>509
文字どおりさ。
動けば何でもいい、そういうやりかた。

>>510
何らかの意味があるのだからtypedefすべきだし、
大抵の場合は何か付随したデータがあるわけで、
それと本体のvector<string>を別管理するのは、
不適切だと思う。

>>512
オブジェクト志向と言いながら、
BASICやスクリプト言語のように、型にルーズでどうしようもない代物を作る人を、見てきたわけだが。
彼らは万能ナイフを作ることに喜びを感じているようだが。

514:デフォルトの名無しさん
07/10/23 08:58:30
ふ~ん。君はそういう事に喜びを感じているんだね。

515:デフォルトの名無しさん
07/10/23 09:02:19
そこでboost::ptr_vector, ptr_list
内部ではvoid*として保持されているためコードサイズ膨張対策にもなる
重いオブジェクトのコンテナならこれで決まり☆

516:デフォルトの名無しさん
07/10/23 10:21:21
>>513 のやり方を推し進めたら、プログラム中に出てくる概念全部を
typedefなりクラス化なりすることになるな
アホとしか思えん

いちいち型を定義してたら型がむやみに大量発生するし、
そのせいでtypedefされた型の元の型がわからなくなって
どういう操作ができるのかいちいち調べる羽目になる

名前の一覧は vector<string> names; で十分
過度の抽象化は毒であると知れ

517:デフォルトの名無しさん
07/10/23 10:44:09
>>516の書き込みをみて
VC++が頭をよぎった。
ふとよぎった。


518:デフォルトの名無しさん
07/10/23 10:50:52
>>513は早すぎる最適化をやっちゃうタイプだな

519:デフォルトの名無しさん
07/10/23 10:51:54
>>516
> 名前の一覧は vector<string> names; で十分

名前だけで単独なんだ・・・どういう場合?

520:デフォルトの名無しさん
07/10/23 15:36:35
スイッチを押すと外部割り込みでInterrupt関数が呼び出されて、スイッチを押した回数を数えて変数countに保存し、
タイマ割り込みで一定時間ごとにTimer関数を呼んで押した回数ごとに行動を変えるプログラムを作りたいです。
グローバル変数を使う以外に二つの関数の間でcount変数の値を渡す方法はありますか?

521:デフォルトの名無しさん
07/10/23 16:04:40
つまり、二つの割り込み関数からそれぞれ設定と参照を行いたいわけだな。

グローバル変数の代わりに、それらの関数をメンバとして持つクラスを作ってそのメンバとしてcountを持てばいい。
勿論、そのクラスの生存期間に注意が必要。

522:520
07/10/23 16:23:07
せっかく回答してくれたのにすみません。
C++ではなくCで行う方法を教えてください。

523:デフォルトの名無しさん
07/10/23 16:37:47
>>520
設定も参照もどちらも割り込みルーチンから行なうのなら、
グローバル変数にしておくのが無難だがなぁ。
グローバル変数にしたくない理由は?

524:デフォルトの名無しさん
07/10/23 16:44:44
メインで変数作ってポインタ渡せば?
グローバルと同じような物だけど

525:520
07/10/23 17:49:50
>>523
やはりグローバル変数がいいですか・・・。
プログラム作ってる途中でよくわからなくなることが多くて個人的にあまり好きじゃないだけです。

526:デフォルトの名無しさん
07/10/23 18:12:44
>>520
gccなら関数内関数で外側のローカル変数を参照出来るはず。
グローバル変数以上に問題のあるコードかもしれんが。

527:デフォルトの名無しさん
07/10/23 19:13:25
>>524
割り込み処理だと渡しようがないと思うんだ。

528:wolf ◆8VH3XAqjlU
07/10/23 21:52:40
>>520
>>525
1.割り込みマスク外した後ならsignal関数では?
2.共通の割り込みハンドラで割り込みを1箇所で受けられるかな?

529:デフォルトの名無しさん
07/10/24 07:25:37
ここで聞いてよいのかわからないのですが・・・
CPadてVistaでも使えるものなんでしょうか?

とりあえず実行すると~.exeが見つかりません~てなエラーが出てきます。
これはOSとCPadとの相性が悪いのか、自分が何かミスを犯しているのか、どちらなのでしょう?

530:デフォルトの名無しさん
07/10/24 07:29:32
調べてみたら自己解決できそうなので、自分で調べてみます。

531:デフォルトの名無しさん
07/10/24 07:32:45
解決、スレ消費申し訳ありませんでした。

532:デフォルトの名無しさん
07/10/25 16:20:24
VCでコントロール(仮にオリジナルのペイントソフト)を作成して
それをVB.NETから呼び出して、VBで作成したインターフェース内に埋め込みたいのですが
VCで作ったものをDLLにまとめることくらいしか現在わかっていません。
何に対応(例えば継承させるクラス)させればよいのかなどおおまかに教えていただけないでしょうか?


533:デフォルトの名無しさん
07/10/25 16:23:09
VBのスレで聞いたら?

534:デフォルトの名無しさん
07/10/25 18:26:14
>>532
> 何に対応させればよいのか

> コントロール

自分で書いていて気がつかないとは。

535:デフォルトの名無しさん
07/10/25 19:31:24
ABのどっちが好き?

#include <iostream.h>
void f(unsigned int u){
 printf("%u", u);
}
main(int argc, char **argv){
 unsigned int u = 0;
 if(argc > 1){
A  u = static_cast<unsigned int>(atoi(argv[1]));
B  sscanf(static_cast<const char *>(argv[1]), "%u", &u);
 }
 f(u);
}

536:デフォルトの名無しさん
07/10/25 19:32:55
lexical_cast<>

537:デフォルトの名無しさん
07/10/25 19:55:07
qa3457974

538:デフォルトの名無しさん
07/10/26 01:33:48
>>535
エラー処理してない点は同じなのでどちらも却下。

だ が 敢 え て 言 わ せ て も ら う

if(1 < argc){

だと!

539:デフォルトの名無しさん
07/10/26 06:44:04
>>538
if(argc > 1)
より
if(1 < argc)
の方がいい理由も添えて書いてくれ。

540:デフォルトの名無しさん
07/10/26 11:33:39
いまどきiostream.hって・・・

541:デフォルトの名無しさん
07/10/26 13:57:17
.h

542:デフォルトの名無しさん
07/10/26 14:13:27
bf

543:538
07/10/26 17:15:12
>>539
半分冗談だったんだけどね(^^; 適当に流して欲しかったんだけど。
単に俺のスタイルなだけ。

例えば、『aが1よりおおきくて、かつ10より小さい』という命題について

if(1 < a && a < 10)

と書くと、常に右が大きくなるでしょ。
完全に主観だけど、あとでソースを見返すとき分かりやすいんですよ。
(数学の)実数線も右が大きいし、なんとなくそういうクセをつけました。

それだけ。



544:デフォルトの名無しさん
07/10/26 17:36:45
>>543
俺もそう書く
理由も同じ

545:デフォルトの名無しさん
07/10/26 21:27:52
vectorは「動的配列」という事なのですが、
これは、

void init_vct()
{
   vector< vector<int> > v;
   v.resize(3);
   for(int i=0; i<v.size(); ++i) v[i].resize(5);

   int array[] = { 0, 1, 2, 3, 4};
}

int main()
{
   init_vct();

   return 0;
}


としたときに、init_vct()関数を抜けても、
int型配列 arrayと違って、vector< vector<int> >型配列 vは、
メモリ上から消されないということですか?

//初歩的な質問で申し訳ありません。

546:デフォルトの名無しさん
07/10/26 21:33:34
消えるだろ ふつう

547:デフォルトの名無しさん
07/10/26 21:37:01
>>545
関数中のvはスコープから抜ける時デストラクタが呼ばれ、
確保された領域は開放される。

v.push_back(i)などで、どんどん追加でき、
サイズが動的に拡張されていく配列。

548:デフォルトの名無しさん
07/10/26 21:57:37
>>543
if( x==0xFF ) などと比較したいのに、誤って代入文 if( x=0xFF ) と
書いてしまう凡ミスを防ぐために変数を右に つまりif( 0xFF==x ) と
書くと良い みたいなことがドコカの本で書かれていた記憶がある

549:デフォルトの名無しさん
07/10/26 22:00:36
>>548
ぱっと見て「ヘタだなぁ」と思うコード その6
スレリンク(tech板)l50
ここで今、思いっきりその話になってます。

550:デフォルトの名無しさん
07/10/26 22:33:42
>>543
俺は『aが1よりおおき』いなら、

if(a > 1)

と書くな。『1がa未満』なら逆に書くけど。

俺も一時期>>543と同じ書き方してたけど、
仕事でプログラム書き始めてからは仕様書通りに書く癖が付いた。

551:デフォルトの名無しさん
07/10/26 23:35:50
sscanf()はバッファオーバーフローがあるから
使ってはいけないんじゃなかったっけ?
普通atoi()だろ。

552:デフォルトの名無しさん
07/10/26 23:39:02
どちらでも仕様書どおりだよ。

553:デフォルトの名無しさん
07/10/26 23:50:21
>>545です。
>>546さんありがとうございます。

以下のようなプログラムを書いたのですが、
正しく表示されるのはたまたまメモリに残っているせい?

#include<iostream>
#include<vector>
using namespace std;

class VEC{
  private:
  public:
    vector< vector<int> > vec;
    VEC(int num);
    VEC(){};
};

VEC::VEC(int num)
{
  vec.resize(3);
  for(int i=0; i<3; ++i) vec[i].resize(5);

  for(int i=0; i<vec.size(); ++i){
    for(int j=0; j<vec[i].size(); ++j){
      vec[i][j] = num+j;
    }
    num+=vec[i].size();
  }
}

554:デフォルトの名無しさん
07/10/26 23:50:58
class A{
  private:
  public:
    A();
    void Show();
    vector<VEC> v;
};

A::A()
{
  int j=0;
  for(int i=0; i<10; ++i){
    v.push_back(VEC(j));
    j+=10;
  }
}

555:デフォルトの名無しさん
07/10/26 23:51:55
void A::Show()
{
  for(int i=0; i<v.size(); ++i){
    for(int j=0; j<(v[i].vec.size()); ++j){
      for(int k=0; k<(v[i].vec[j].size()); ++k){
        cout << v[i].vec[j][k] << " ";
      }
      cout << endl;
    }
    cout << endl;
  }
}


int main()
{
  A aa;
  aa.Show();

  return 0;
}


556:デフォルトの名無しさん
07/10/26 23:52:44
>>553
関数抜けた時点で解放され、別の値に変わる可能性はある
ゴミ箱の中身消したけど復活できるかどうかと同じ事だ

557:デフォルトの名無しさん
07/10/27 00:04:16
>>553-555
別にどこもおかしなようには見えないが、どこに問題があると思ってるの?

558:デフォルトの名無しさん
07/10/27 00:49:51
>>545です。
>>546
>>547
>>556
さんのご指摘もありますが、
newで確保されていないvector配列の中身(vector< vector<int> > vec)が、
最後まで保持されていること・・・
についてです。

vecはクラスの中で宣言はされているものの、
VEC()で代入される中身は局所的なもので、
VEC()を出たらvec配列の中身は、開放されるのかなぁと。

サイトで「vectorは"動的"配列」というのを目にしたのですが、
これは配列のサイズを"動的"に確保するだけで、
newのメモリの"動的"確保とは別物なのではないか?
と思ったので、試しています。

559:デフォルトの名無しさん
07/10/27 00:51:53
>>545です。
かなりトンチンカンなこと言ってると思いますが、
ご指導お願いいたします。m(_ _)m

560:デフォルトの名無しさん
07/10/27 00:57:53
>>559
クラス内の関数は、抜けても値は保持される 常識だろう vectorとか関係なし

561:デフォルトの名無しさん
07/10/27 00:59:15
>>559
基本的なことが、いくつも、理解できていない気配がする。
泥縄的に教えてもしょーがないので、ちゃんとC++の基本を勉強したほうがいいよ、としか言えない。

562:デフォルトの名無しさん
07/10/27 00:59:20
オブジェクト指向っていうのは、データに対してあれこれ作業をするって事だ
あれこれ作業するごとにデータが消えていたら駄目だろ

563:デフォルトの名無しさん
07/10/27 01:00:16
v.push_back(VEC(j));

VEC(j)はどこいっちゃったの?

ってこと?

564:デフォルトの名無しさん
07/10/27 01:20:13
>>545です。
みなさん、レスありがとうございます。

クラスの中でサイズを指定しないと配列の宣言てできませんよね。
もしコンストラクタの引数の値を配列のサイズにしたいときには、
データメンバに、
int a*;
を入れて、
コンストラクタの中で、
a=new int[コンストラクタの引数の値];
と(私は)します。

だから、私はvector配列をクラスのデータメンバとするときも、
配列のサイズを指定しないから、
どこかでnewすることでvector配列の領域を確保しなければ
ダメなのかぁと思ってしまったわけです。
newをせずに、ただ値を代入しただけでは、
局所な値を代入しているに過ぎないなどと思ってしまいました。

色々考えているうちに、頭の中がごちゃごちゃになってしまいました。
己の力の無さを改めて自覚しました。

565:デフォルトの名無しさん
07/10/27 01:31:07
>>564
vectorの中でnew/deleteしてる。

566:デフォルトの名無しさん
07/10/27 01:32:02
コンストラクタとデストラクタで何か表示するクラス作って
vectorにpush_backしてると何か閃くかもしれない

567:デフォルトの名無しさん
07/10/27 01:38:24
クソッタレな本に引っかかってしまった可哀想な犠牲者なんだろうな。
きちんとした本を読んでいれば間違わないような誤解してるんだもの。

568:デフォルトの名無しさん
07/10/27 01:50:13
これからプログラムを勉強する俺に是非教えてほしい。

ちょっとしたアプリケーションを作りたくて
なんとなく、適当に参考書見て、高校の頃少し勉強した、デルファイに似てるような気がしたから
VBの参考書買って、MSからVS2008bata2をダウンロードしてサンプルプログラムを作っては
自分なりに書き換えて違う結果を出力させたりと、少しずつ理解してきてる・・つもり。

けど、VBとC++はどのスレ見てもVBは糞ってよく見るんだけど、それはなぜですか?
自分は結構VBがなじんできてるしこの頃。。
実際、プログラムの組みやすさ、軽さ、ほか色々。
ここで聞くのはどうかと思うけど、できれば教えてほしい

もし、VBはやめとけ!と言うならばお勧めの言語を教えていただきたい。

569:デフォルトの名無しさん
07/10/27 01:54:18
すいません、教えていただけないでしょうか。

C言語で、2つのスレッドが交互にグローバル変数を参照→インクリメントして、
決められた値になったら終了する。という処理を作りました。
ここからグローバル変数を用いずにスレッド間でデータを渡しあうことで同様の処理を
実現したいのですが、どうすればいいでしょうか。

自分で調べたところ、スレッド間ではお互いのメッセージキューへ格納→読み出しを行えば
データを渡せることがわかったのですが、見当違いな考えかもしれません…。
どのような方法・関数を用いればいいか、ご教授のほど宜しくお願いします。

570:デフォルトの名無しさん
07/10/27 01:59:25
OSぐらい書けよ

571:デフォルトの名無しさん
07/10/27 02:02:14
>>570
申し訳ありませんでしたorz
作成環境は以下のとおりです。

OS:Windows XP
コンパイラ:Microsoft Visual C++ 2005 Express Edition

572:デフォルトの名無しさん
07/10/27 02:03:22
VBが糞と言われる理由

1. VB自体ではなく、VB使いが糞であるため
2. VBでプログラミングを勉強すると糞になるため
3. VBが適切な手段の場合には良いが、そうではないのにVBを使う糞がたくさんいるから
4. VB.NETではないVBは既に終わっており、なおかつ、VB.NETをやるならC#をやるべきだから

573:デフォルトの名無しさん
07/10/27 02:05:35
>>569
質問が抽象的すぎる。
もっと具体的に詳しく。

また、なぜ、グローバル変数をやめようと考えているのか、その理由も。

574:デフォルトの名無しさん
07/10/27 02:16:09
  ∧_∧ クワッ!
 ∩`iWi´∩ 
 ヽ |m| .ノ
  |. ̄|
  U⌒U

575:デフォルトの名無しさん
07/10/27 02:17:26
>>574
それ何か可愛いな。

576:デフォルトの名無しさん
07/10/27 02:25:48
>>573
色々と足りない部分が多くて申し訳ありません。
初心者の為、処理が的確ではないかもしれませんが現在の処理は以下のとおりです。

unsigned __stdcall thread0(void *lpx)
{
 /*排他制御にミューテックスを使っています*/
 HANDLE hM;
 hM = *(HANDLE*)lpx;

 while ( 100 > nCnt )
 {
  WaitForSingleObject( hM, INFINITE );
  nCnt++;
  printf("nCnt = %d", nCnt);
  ReleaseMutex( hM );
 }
 printf("thread0 END");
 return 0;
}

これと同様の処理を行うスレッドがもう一つありまして、
交互にグローバル変数nCntをインクリメントして、100になったら終了させるようにします。
このnCntをグローバル変数ではなく、ローカル変数にしてスレッド間で値を渡し合うことで、
同様の処理ができるようにしてみたいのです。

グローバル変数を使わない理由ですが、現在C言語を勉強中で、
様々な処理方法を試してみたいと思ったからです。

577:デフォルトの名無しさん
07/10/27 02:33:47
そのスレッドに渡すlpxでミューテックスと一緒に共有したいデータを渡すとか。

struct thread_data {
HANDLE hM;
int nCnt;
};
unsigned __stdcall thread0(void *lpx)
{
struct thread_data *data = lpx;
 /*排他制御にミューテックスを使っています*/
 HANDLE hM;
 hM = data->hM;

while ( 100 > data->nCnt )
以下略

578:573
07/10/27 03:03:46
>>576
なるほど。文字どおりの処理をしていたのね。ごめん。

まず、そのプログラムには重大な問題がありそう。

それはともかく、
スレッド毎にメッセージ・キューを持たせて、相互にメッセージを送り合う
ということだと、まず、最初の選択として、
Windowsが提供してくれるメッセージ・キューを使うのか、
それ以外のメッセージ・キューを使うのか、
というのがあるが、とりあえず前者の方向で。

Win32APIのPostThreadMessageを使う。
まずは、MSDNライブラリ等でPostThreadMessageの解説を見よう。

579:デフォルトの名無しさん
07/10/27 03:04:25
>>577
ご助言ありがとうございます。
ただ、私が今回試してみたいのはスレッド間通信?というものになりそうなんですが、
このコードがそういった処理になるのでしょうか。
サンプルコードが分かり辛いと思うので、自信がありません…。

580:デフォルトの名無しさん
07/10/27 03:07:12
>>578
ありがとうございます。
エラー処理や組み方自体についても、学ぶべきことが多いですorz

PostThreadMessageについて、早速見てみます。

581:573
07/10/27 03:14:26
ついでに>>576のプログラムの問題点と解決方法を。

まず、コンパイラの最適化の問題。
変数nCntの宣言にvolatileを付けていますか? 付けていなければ、付けること。

次に、100 > nCnt の比較が、排他制御の外にあること。
nCntに触っていいのは、排他制御の内側だけ。


582:デフォルトの名無しさん
07/10/27 03:28:55
>>581
たしかにこれでは…色々と参考になりました。

MSDNライブラリで調べたところ、
PostThreadMessage関数でデータをポストして、
GetMessage関数でポストされたデータを取得することで、
スレッド間でデータをやりとりできそうなので、早速試してみます。

ご助言いただいた方々、本当に有難うございましたm(_ _)m

583:デフォルトの名無しさん
07/10/27 16:47:47
>>545です。
>>554
のA()で、

A::A()
{
  int j=0;
  for(int i=0; i<10; ++i){
    v.push_back(VEC(j));
    j+=10;
  }
}

としているのですが、ここで作られるVEC型オブジェクトは、
局所的なもので、寿命はfor 1回分の間だけですよね?
コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、

vector<VEC*> v;
と宣言を直して、
A()では、
v.push_back(new VEC(j));
としなければダメですか?

何度も申し訳ないです。

584:デフォルトの名無しさん
07/10/27 16:55:04
VEC(j)のコピーがvector内に追加される

585:デフォルトの名無しさん
07/10/27 16:59:02
> コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、
ただし、Aのvector<VEC> v;は、v.push_backの内部で、
引数を使ったコピーコンストラクタを使い、勝手に保持する。

vector<string> v;でv.push_back("ababa");と渡しても、
const char *pを受け取って内部で string(p) のようにして保持する。

> vector<VEC*> v;
> v.push_back(new VEC(j));

のようなことをするのなら、Aのデストラクタで、
push_backの所でnewしたぶんをdeleteしてやる必要がでてくる。



586:デフォルトの名無しさん
07/10/27 16:59:51
かぶったorz

587:デフォルトの名無しさん
07/10/27 18:34:43
>>583
基本ができてなさすぎ。
ちゃんと勉強して出直せ。

588:デフォルトの名無しさん
07/10/27 20:26:59
>>583
いろいろごっちゃになっているようだが、
・関数内で宣言されたオブジェクトは関数が終わったら破棄される
と言われて、
関数が終わったらvectorの中身が壊れるのでは、と疑問を持ったみたいだけど、
この場合は関数へ渡す引数として宣言した「一時オブジェクト」なので問題ない。
そうでなくても、vectorは要素を「コピー」して保持するので、
元のオブジェクトが破棄されても何ら問題はない。

589:588
07/10/27 20:31:56
間違えた、俺がごっちゃになってるorz
書き直すと、

関数内で作ったオブジェクトをvectorに入れたら、
関数を抜けた時にそのオブジェクトが破棄されてvectorの要素が無効になるのでは、と疑問を持ったみたいだけど、
この場合はvectorへ渡す要素として宣言した「一時オブジェクト」なので問題ない。
そうでなくても、vectorは要素を「コピー」して保持するので、
元のオブジェクトが破棄されても何ら問題はない。

590:588
07/10/27 20:34:03
ああ、いや、一時オブジェクトは関係ないか、結局破棄されるんだから

とにかくvectorはコピーコンストラクタ呼び出してコピーしてるので、
元のオブジェクト破棄しても問題ない

591:588
07/10/27 20:42:08



592:デフォルトの名無しさん
07/10/27 20:47:52
ややこしく考え杉。

int g_c ;

void funcA(int& a) {
int b = a ;
g_c = a ;
}

void testA(void) {
int x = 3 ;
funcA(x) ;
}

これと同じよ

593:デフォルトの名無しさん
07/10/27 21:33:41
フフフフフフハハハハハハ

594:デフォルトの名無しさん
07/10/27 23:07:18
int ary[2] = { 1000 , 2000 };
int *po;

po = &ary[0];
printf("po\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);
po++;
printf("po++\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);
*po++;
printf("po++\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);

これで最後の方で*poに1を加えてるつもりなのですが、変な値になって
*po+=1だと大丈夫です

*poはポインタの中身だと今まで思ってたのですが、、、、なんでなのでしょうか

595:デフォルトの名無しさん
07/10/27 23:09:12
(*po)++;

釣りなんだろうけど

596:デフォルトの名無しさん
07/10/27 23:21:37
理由のところ、教えてくれませんか

なんで()つけないとダメなのか。
というか中身にアクセスするときは()つけた方がいいんでしょうか

597:デフォルトの名無しさん
07/10/27 23:28:44
>>596
演算子の優先度

598:デフォルトの名無しさん
07/10/28 04:23:38
*po++ は *(po++) という意味だから、だな

599:デフォルトの名無しさん
07/10/28 04:48:37
俺は演算子の優先度の表を暗記するだけの頭脳がないので、
決して、
*po++ ;
なんてコードは書かない。
他人が書いたのを読まないといけないときは、優先度の表を見て確認する。

そもそも、後ろに++を付けるのは特別なときだけだし・・・。

600:デフォルトの名無しさん
07/10/28 13:39:19
*++p

601:デフォルトの名無しさん
07/10/28 13:40:46
++(*po);

602:デフォルトの名無しさん
07/10/28 20:56:27
>>601
括弧イラネ

603:デフォルトの名無しさん
07/10/28 21:02:43
優先順位覚えてないから付けといて

604:デフォルトの名無しさん
07/10/28 21:33:35
左側に単項演算子二つで優先順位も糞もないだろ

605:デフォルトの名無しさん
07/10/28 21:52:24
むしろ全ての演算子を単項演算子にすれば頭で思い浮かべたものをキャレットを一々前後させずに一気に書ける

606:デフォルトの名無しさん
07/10/28 21:55:25
>>605
それって何て逆ポーランド記法?

607:デフォルトの名無しさん
07/10/28 23:15:58
★改行が多すぎと言われたので、何度かにわけます。

構造体Sのvectorがあって、SのメンバdoubleDataに関してfindをしようとしています。
(#include <algorithm>しています)

struct S{
string strA;
int intData;
double doubleData;
};

findを使っているところは、こんな感じです。
vector<S>::iterator it;
it = find(VecTest.begin(), VecTest.end(), 1.7);
cout << (*it).doubleData << endl;


608:デフォルトの名無しさん
07/10/28 23:16:34
★続き

Boland55で、以下のようなエラーが出ます。

エラー E2094 c:\Borland\Bcc55\include\algorith.cc 72: != 演算子が使われたがクラ
ス S では double 型のための定義が存在しない(関数 find<S *,double>(S *,S *,const
double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'last' は一度も使
用されない(関数 find<S *,double>(S *,S *,const double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'value' は一度も
使用されない(関数 find<S *,double>(S *,S *,const double &) )
*** 1 errors in Compile ***


609:デフォルトの名無しさん
07/10/28 23:17:24
★続き

ちなみに、以下のような演算子オーバーロードをしているのですが、
何がよくないのでしょうか。
bool operator == ( const S& left, const S& right )
{
return left.doubleData == right.doubleData;
}

bool operator != ( const S& left, const S& right )
{
return left.doubleData != right.doubleData;
}




次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch