09/05/23 23:04:42
>>261
ならない
カッコがついているので副作用完了点がカッコの中で終了するから
263:261
09/05/23 23:14:35
>>262
となると、自作クラスの前置インクリメント演算子のオーバーロードの返り値は、
const参照で*thisを返すのではなく
非constな参照で*thisを返すべきなのですね。
ありがとうございました。
264:デフォルトの名無しさん
09/05/23 23:15:13
>>261
そもそも
++(++foo)
は、++fooが評価後に値なので、++を作用させることができない気がするのだが
これがC++の参照返す++演算子のオーバーロードならどうなるか知らないけど
265:261
09/05/23 23:19:51
>>264
でも一応
long num=100;
++(++(++(++num)));
はコンパイル可能です。
266:デフォルトの名無しさん
09/05/23 23:20:04
Cでは前置も後置も値のコピーを返すけど
C++の前置は自身を左辺値として帰すので有効。
267:デフォルトの名無しさん
09/05/23 23:24:35
ああ、cとc++では扱いが違ったのですね。
c++脳なので知りませんでした。
268:デフォルトの名無しさん
09/05/24 10:29:25
HTMLパーサ自作できたのだわ
1時間もかからなかったのだわ
こんなに簡単なのでググってもでないわけだわ
JAVA, Ruby でパーサ使ってる奴って・・・
269:デフォルトの名無しさん
09/05/24 12:02:03
+は可算演算子だよね。
では%は何演算子と呼べばいい?
270:デフォルトの名無しさん
09/05/24 12:05:10
剰余演算子
271:デフォルトの名無しさん
09/05/24 12:14:19
>>268
天才だな
272:デフォルトの名無しさん
09/05/24 12:46:43
よく言われる
273:269
09/05/24 13:00:27
>>270
ああなるほどね。
ありがと。
274:デフォルトの名無しさん
09/05/24 13:14:03
そこらへんのパーサって非標準(タグ閉じ忘れとか含め)のHTML読めるの?
275:デフォルトの名無しさん
09/05/24 14:24:58
STLの投げる例外の一覧みたいなサイトってありますか?
276:269
09/05/24 14:39:30
+num
や
-num
といった、符号をあらわす演算子はなんて言えばいい?
単項演算子じゃおかしいし、符号演算子とか??
277:デフォルトの名無しさん
09/05/24 14:44:18
性符号・フフ郷
278:デフォルトの名無しさん
09/05/24 14:51:04
>>277
サンクス!
279:デフォルトの名無しさん
09/05/24 17:02:00
int foo(bool arg1, bool arg2)
{
if(arg1){return 1;}
else if(arg2){return 2;}
else return 3;
}
この関数をこれ以上速く記述することって可能でしょうか?
例えばelseを無くしたりすることによって。
280:デフォルトの名無しさん
09/05/24 17:15:45
速く記述する、ってどういうこと?
短くの間違い?
281:デフォルトの名無しさん
09/05/24 17:19:50
>>279
int foo(bool arg1, bool arg2)
{
return arg1 ? 1 : arg2 ? 2: 3;
}
282:デフォルトの名無しさん
09/05/24 17:32:52
static int f[][] = {{3, 2}, {1, 1}};
int foo(bool arg1, bool arg2){
return f[arg1][arg2];
}
283:デフォルトの名無しさん
09/05/24 17:46:34
static int* f = {3, 2, 1, 1};
int foo(bool arg1, bool arg2){
ASSERT((!!arg1) == arg1 && (!!arg2) == arg2);
return f + ((arg1 << 1) | arg2);
}
284:デフォルトの名無しさん
09/05/24 17:47:21
>>279
速くするんだったらinline asmかな
やり方知らんから教えられないけど
285:279
09/05/24 18:06:32
>>280
速く動作するように記述したいという意味です。
確かに速記でもするかのような書き方でした。
>>281-283
ありがとうございます。
>>284
ありがとうございます。
一応標準C++だけで書きたいと思っております。
みなさんありがとうございます。
連続質問で申し訳ないのですが、
int bar(bool arg1, bool arg2)
{
if(arg1&&arg2){return 1;}
else if(arg1||arg2){return 2;}
else return 3;
}
でしたらどう記述するのが(動作速度的に)ベストでしょうか?
286:デフォルトの名無しさん
09/05/24 18:11:24
前のもそうだがその程度ならそのまま書くのが一番良いと思う。
特定の環境を想定しないのなら尚更だ。
287:デフォルトの名無しさん
09/05/24 18:12:35
>>286
たしかに、ボトルネックにならないなら素直な書き方が一番ですかね。
ありがとうございました。
288:デフォルトの名無しさん
09/05/24 18:15:00
ここ行けば、そういうの好きな人いっぱい居るぞ。
スレリンク(tech板)
俺は面倒くさいからパス。
289:デフォルトの名無しさん
09/05/24 20:14:35
数人の身長が記されているtxtファイルを読み込んで、
140 ー 145cm **
145 ー 150cm *
150 ー 155cm **
155 ー 160cm **
160 ー 165cm ****
165 ー 170cm **
の、ようにヒストグラムで出力するプログラムの作り方を教えてください。
290:デフォルトの名無しさん
09/05/24 20:17:07
読み込んで出力すればいいよ
291:デフォルトの名無しさん
09/05/24 21:35:54
>>289
1.テキストファイルを読み込む
2. int配列にそれぞれの範囲の要素を加算していく
3 配列の要素の値の数だけ*を表示する。
順番に作っていけばいい。
292:287
09/05/24 21:47:55
>>288
ありがとうございます。
・・・ボトルネックになるようでしたら挑戦してみます。
293:デフォルトの名無しさん
09/05/24 21:49:47
float A[4][21];
でA[2]とA[4]を入れ替える方法教えてください
294:デフォルトの名無しさん
09/05/24 21:56:24
>>293
std::swap(A[2][x],A[4][x])
でxを0~21まで回せばいいんじゃない?
295:デフォルトの名無しさん
09/05/24 21:58:01
for(int i = 0; i < 21; i++){
float t = A[2][i];
A[2][i] = A[4][i];
A[4][i] = t;
}
296:デフォルトの名無しさん
09/05/24 21:58:36
普通にmemcpy3回じゃない?
ビットスワップでもいいけど
297:デフォルトの名無しさん
09/05/24 22:03:43
どうかなぁ。並列化考えたらmemcpyは不利な気がした。
298:デフォルトの名無しさん
09/05/24 22:09:07
どのデーター量なら>>295が一番早い
299:デフォルトの名無しさん
09/05/24 22:14:08
㌧ 一個一個交換する方法でやってみます
こんな風にしてたんだけど何故か変な値になっちゃうんだよね。
memcpy(B,A[i],sizeof(float)*(n+1));
memcpy(A[i],A[i+j],sizeof(float)*(n+1));
memcpy(A[i+j],B,sizeof(float)*(n+1));
300:デフォルトの名無しさん
09/05/24 22:15:50
A[4][n+1]; B[n+1];としてね
301:デフォルトの名無しさん
09/05/24 22:16:02
クラスの2次元配列を用いるにはどう宣言すればよいでしょうか
具体的には、
class Complex {
public:
double re;//実部
double im;//虚数部
};
という複素数のクラスを用いて行列を作成したいのですが、メインで
#define SIZE 5
int main(){
Complex **comp_mat;
comp_mat = new Complex[SIZE][SIZE];
}
のようにしますと(*)[5]型は**型に変換できませんとエラーが出ます。
どのようにすればいいのかわからないので1次元で宣言して以下のように
アクセスしていました。(comp + i * SIZE + j )の記述がわかりにくいので
簡単にしたいのですが、よろしくお願いします
int main(){
int i , j ;
Complex *comp_mat ;
comp_mat = new Complex[SIZE*SIZE] ;
//compを(-1 , -1)の値で埋める
for( i = 0 ; i < SIZE ; i++ ){
for( j = 0 ; j < SIZE ; j++){
(comp + i * SIZE + j ) ->re = -1.0 ;
(comp + i * SIZE + j ) ->im = -1.0 ;
}
}
・・・・省略・・・・
}
302:デフォルトの名無しさん
09/05/24 22:20:57
>>291
ありがとうございます
303:デフォルトの名無しさん
09/05/24 22:42:23
>>293
std::swap(A[2],A[4])はどう?
304:デフォルトの名無しさん
09/05/24 22:52:58
C++で
fout << "Hello World" << endl ;
などでファイル書き込みができますが、
foutで複数ファイルへの書き込みを区別するにはどうすればいいのでしょうか
FILE *f_eng_p , *f_jpn_p ;
fprintf( f_p , "Hello World ") ;
fprintf( f_s_p , "こんにちは 世界") ;
のようにファイルポインタを2つ宣言してfprintfで行うのでしょうが、
fprintfは記述がめんどくさいのでどなたか知恵をお貸しください
305:デフォルトの名無しさん
09/05/24 22:54:40
すみません、上の f_p と f_s_p は以下の間違いです
FILE *f_eng_p , *f_jpn_p ;
fprintf( f_eng_p , "Hello World ") ;
fprintf( f_jpn_p , "こんにちは 世界") ;
306:294
09/05/24 23:04:25
>>303
配列へのポインタだから無理だろ。
だから>>294を提唱するぜ。
307:デフォルトの名無しさん
09/05/24 23:04:51
>>304
出力ストリームを複数持てばいいだけじゃないの?
308:デフォルトの名無しさん
09/05/24 23:15:46
>>303
それだとエラーでちゃいます。swap(A[2][x],A[4][x])の方法で上手くうごきました。
あと、すみませんがもう一つ質問お願いします。
void func(二次元配列を受け取る){
処理
}
int main(){
float A[x][y];
A[0~x][0~y]に値を代入;
func(?);
return 0;
}
ここで関数funcはA[4][5]でもA[99][99]でもどんな大きさの二次元配列でも
受け取れるようにしたいんですが、関数funcの宣言の引数と、main関数内で
関数funcに渡す引数はどのようにすればいいですか?
309:デフォルトの名無しさん
09/05/24 23:29:22
それは無理なので
std::vector< std::vector< float > >
使っとけ
310:デフォルトの名無しさん
09/05/24 23:33:40
void func(float *a, int m, int n){
処理
}
int main(){
float A[x][y];
A[0~x][0~y]に値を代入;
func((float*)A, x, y);
return 0;
}
311:デフォルトの名無しさん
09/05/24 23:34:59
ありがとうございます。無理なんですね。どうりで調べてもA[][5]とかしか出てこないわけだ
C言語でしたいのでA[]にしてA[y*x+y]でアクセスすることにします。
312:デフォルトの名無しさん
09/05/24 23:45:01
>>311
前にも同じような質問が出ていましたが、最近のCの規格では
void func (int m, int n, float a[m][n]) { 処理 }
といった書き方ができますよ。mとnは呼び出し側で決められます。
【初心者歓迎】C/C++室 Ver.65【環境依存OK】
スレリンク(tech板)
の >>836 あたりからの書き込みにも情報があります。
313:デフォルトの名無しさん
09/05/24 23:57:32
>>312
これは知らなかった。でも、VS2008でやってみたらエラー出て無理だった
314:デフォルトの名無しさん
09/05/24 23:59:01
マイクロソフトはC99シカトしてます。
315:デフォルトの名無しさん
09/05/25 00:04:33
0Xどうするんだろうね。
でも、C++/CLIはもはやC++なのかどうなのかも怪しいw
316:デフォルトの名無しさん
09/05/25 00:19:10
>>314
VS2010でauto、decltype、λ式、右辺値参照、static_assertは取り敢えず入れる
予定だそうだ
それ以上のC++0x対応は今の所未定
317:デフォルトの名無しさん
09/05/25 00:29:27
C++ なんだから配列には vector 使おうよとか
配列の配列をポインタのポインタに置き換えられないことは
大概の教科書で懇切丁寧に説明しているはずなのでもう一度教科書読んでねとか
全力でマクロは避けろ( C++ Coding standards )とか
なぜに FILE 構造体?とか
いろいろ思った^^
318:デフォルトの名無しさん
09/05/25 00:37:58
>>317
その辺りはD&Eを読んでもらえば歴史的経緯がよくわかる
Cは一人、いや二人の人間が独善で作った言語だが
C++はコミュニティに属する数多くの人の意見を元に作られてる
中心人物は禿だったがもはや禿が一人で作ったC++とは絶対に言えまい
319:デフォルトの名無しさん
09/05/25 00:45:46
>>301
動的二次元配列の作成と削除は
Complex **comp_mat = new Complex *[SIZE];
for ( size_t i = 0; i != SIZE; ++i )
comp_mat[i] = new Complex();
for ( size_t i = 0; i != SIZE; ++i )
delete [] comp_mat[i];
delete [] comp_mat;
でも、C++でこんなことしちゃらめ。
320:デフォルトの名無しさん
09/05/25 00:58:46
>>319
なんでダメなの?
俺はよく使ってるぜ
コンストラクタとデストラクタにぶち込んでおけば十分じゃん
vectorを使う事もあるけど少なくとも速度が最大要求の
科学技術計算では>>319の方法をよく使うぞ
321:デフォルトの名無しさん
09/05/25 01:13:03
速度重視ならクラスで包んじゃダメでしょ。
・・・それはさておき、C++のモダンなスタイルは可読性重視になってるからっていう弱い理由。
もちろん、わかって使う分には問題ないよ。
322:デフォルトの名無しさん
09/05/25 01:19:41
「速度が最大要求」ならクラスはおろか関数呼び出しもNGでしょ^^
なにより new と delete 自体が遅い。
memcpy を使うほうが一般的。
どうしても C++ ライクに書きたいなら、せめて allocator クラス使おうよ。
323:デフォルトの名無しさん
09/05/25 01:22:42
memcpy じゃなくて malloc の間違いでした^^スマンコ
324:デフォルトの名無しさん
09/05/25 01:38:26
そもそも速度優先なら、そんなに頻繁にメモリの確保/解放はしない。
どうしてもって言うのなら、自前でメモリ管理する。
325:デフォルトの名無しさん
09/05/25 01:38:35
>>321-322
いや速度重視ならmallocもそのままでは使わないだろ。自前でプールとかしてさ。
326:デフォルトの名無しさん
09/05/25 01:41:30
だな。つか new 遅すぎ。
327:デフォルトの名無しさん
09/05/25 01:45:08
っていうかC++が速くない
Cより5%遅いが開発の指標だったから
328:デフォルトの名無しさん
09/05/25 01:51:20
OCN規制で携帯でしか書けないのが辛いぜ。
329:デフォルトの名無しさん
09/05/25 01:53:35
支援
330:デフォルトの名無しさん
09/05/25 02:56:08
これlj(x)の分子が0になっちゃうんだけど、これで合ってるの?
331:デフォルトの名無しさん
09/05/25 02:56:25
URLリンク(ja.wikipedia.org)
URL忘れてたこれ
332:デフォルトの名無しさん
09/05/25 06:04:25
なんか一気にレベル低くなってね?
333:デフォルトの名無しさん
09/05/25 09:36:57
※スレを勃てるまでもない低俗なC/C++の質問はここでお願いします
334:デフォルトの名無しさん
09/05/25 19:27:15
C++で文字列を入力し、そこに指定されていた文字が含まれている場合、そうでない場合に分けて処理を行いたいです。
どう書けばいいでしょうか?
文字列はアルファベットなのですが、
指定するすべての文字についてif,elseifで判別するしかないのでしょうか?
335:デフォルトの名無しさん
09/05/25 19:31:35
>>334
そうだよ
336:デフォルトの名無しさん
09/05/25 19:45:53
>>335
ありがとうございます。
もう一つお願いします。
たとえば、
abddみたいな文字列があって、
先頭の1文字づつ判別していきたいです。つまり、
1回目の処理はaについて、
2回目の処理はbについて・・・
のような感じです。
どう考えればいいでしょうか?
337:デフォルトの名無しさん
09/05/25 20:29:58
何をどう判別するのかわからん。
具体的な入力例と、期待される結果を示してくれ。
338:デフォルトの名無しさん
09/05/25 20:45:19
>>337
アルファベットと書きましたが、半角英数すべてで、
accaと入力したとすれば
aが1個存在するので coutで1と出力
cが2個存在するので coutで2と出力
aが1個存在するので coutで1と出力
みたいな感じです。
よろしくお願いします。
339:デフォルトの名無しさん
09/05/25 21:03:30
#include <iostream>
#include <string>
using namespace std;
int main(){
int n = 0;
string s;
cin >> s;
for(int i=0; i<s.size(); i++){
n++;
if(s[i]==s[i+1]) continue;
cout << n << endl;
n = 0;
}
return 0;
}
340:デフォルトの名無しさん
09/05/25 21:40:58
ファイル操作にはいろいろとエラーチェック用のメソッドが用意されてますが、例外機構をつかわない理由はあるのでしょうか?
341:デフォルトの名無しさん
09/05/25 23:11:06
例外を使いたくない環境ってのが結構あるからかも
342:デフォルトの名無しさん
09/05/26 22:31:02
C言語そのものの質問とはちょっと違うのですが#ifdef,#ifndefに対応する#endifを見つけて、
どれとどれが対応しているかのコメントを追加するようなツールは無いでしょうか?
//////////入力///////////
#if AAA
...
#if BBB
...
#endif
...
#endif
///////////出力///////////
#if AAA
...
#if BBB
...
#endif //BBB
...
#endif // AAA
343:デフォルトの名無しさん
09/05/26 23:16:37
>>342
知らないなぁ。
俺は大抵はコメントを毎回記載しちゃう派だし。
あるいはエディタの機能で対応する#~に飛んだりするし。
良い課題として作ってみてよ。
そして是非とも公開してくれ!
344:デフォルトの名無しさん
09/05/27 17:04:28
charで配列の要素数を変数にしています。
cinで入力後、この要素数の最大値を調べたいのですがどうしたらいいでしょうか?
345:馬牛
09/05/27 17:14:21
C++です。
a=10,b=3,c=2として、!aかつb>cの戻り値、!aまたはb>cの戻り値はそれぞれどうなりますか?
よろしくです。
346:デフォルトの名無しさん
09/05/27 17:15:56
felse true
347:デフォルトの名無しさん
09/05/27 17:33:15
18時まで引っ張ろうぜw
348:デフォルトの名無しさん
09/05/27 17:44:52
>>345
君は、C++をやる前に離散数学を勉強することをお薦めする。
>>347
どこの誤爆だ
349:デフォルトの名無しさん
09/05/27 17:46:29
スレリンク(tech板:346番)
これだろ
350:デフォルトの名無しさん
09/05/27 18:03:03
https通信をOSによらずに行いたいと思っているのだが、手の込んだことするのは
面倒になりcurl.exeを呼び出すことで解決することにした。
先頭の10KBとかは読めないと思っていたら対応していた。
351:デフォルトの名無しさん
09/05/27 21:26:13
main{
func1();
}
func1{
char array[100];
array[1] = 10;
func2();
}
func2{
char sum[10];
sum[0] = array[1];
}
このようにプログラムする場合、func2にてarray[1]をセットする場合、
グローバル宣言するしかないのでしょうか?
できれば、main内でfunc1が終了した時点でarrayで使用していた変数を消滅させたいのです。
メモリ使用量を少なくする意味で
352:デフォルトの名無しさん
09/05/27 21:29:16
func2(array[1] );
353:デフォルトの名無しさん
09/05/27 21:31:49
>>350
何のことを言っているのだい?
curl.exeはWindows専用ではないのかい?
354:デフォルトの名無しさん
09/05/27 21:36:15
>>352
func1{
char array[100];
array[1] = 10;
array[2] = 5;
func2();
}
func2{
char sum[10];
sum[0] = array[1];
sum[1] = array[2];
}
こうだった場合は、func2();
の中は何になるのでしょうか?
355:デフォルトの名無しさん
09/05/27 21:39:11
>>354
参考書とにらめっこしてこい。 コードの書き方からしてお前は根本的に理解できていない。
356:デフォルトの名無しさん
09/05/27 21:48:55
すみませんお願いします
357:デフォルトの名無しさん
09/05/27 21:50:33
353
SYSTEMの中身を対応するのに変える MACでもUNIXでもあるはず
curl.hの使い方がわかればいいんだけど、メモリやファイルに読み書きするのに
専用の関数を用意しなければならず難しかった。
それなら直接exeを動かしたら簡明と思った。
358:デフォルトの名無しさん
09/05/27 21:51:13
func2(array);
359:353
09/05/27 22:57:24
>>357
UNIX系でも~.exeって名前なの?
360:デフォルトの名無しさん
09/05/27 22:59:06
>>354
お前ふざけてんの?
何言ってるの?
スレタイ読めよ、ここはC/C++の質問部屋だぞ!!
そんな謎の言語は知りません!
361:デフォルトの名無しさん
09/05/28 02:25:31
質問します。
Windows環境で、とあるC++用ライブラリ hoge.lib があります。
このライブラリには、関数を呼び出すためのヘッダファイル hoge.h が用意されていますが、
実際のソースは提供されていないものとします。
また、ライブラリ内部だけで使われている関数は、hoge.h には記述されていないようです。
さて、このライブラリには名前空間は設定されていません。
そのままでは使いにくいので、Hoge::~ という名前でライブラリの関数を呼び出せたら便利だと思いました。
この状況(*.h と *.lib のみ)で、ライブラリの関数に名前空間をセットすることは可能でしょうか?
362:デフォルトの名無しさん
09/05/28 06:25:28
>>361
君がhoge_ns.hとかいうヘッダを自作して、
hoge_ns.hでは
namespace Hoge
{
inline int bar(int x)
{
return bar(x);//hoge.hの。
}
//...etc
}
のようにラップしたらだめかな?
363:デフォルトの名無しさん
09/05/28 06:30:49
c/c++で仕事している人たちに質問です。
基本情報技術者試験って、最低限必要な資格ですか?
364:デフォルトの名無しさん
09/05/28 07:01:46
5000円程度で取れるんだから、とっとけ。
365:デフォルトの名無しさん
09/05/28 07:09:15
生産性と資格には関連はないだろ。
未経験なら持っていたら考慮されるとか一時金や給料がすこしだけ良くなるとかだろう。
366:デフォルトの名無しさん
09/05/28 07:18:18
>362
ありがとうございます。
諦める決心がつきそうです。
367:デフォルトの名無しさん
09/05/28 07:29:43
webページを解析したいのですが、HTMLを整形済みXMLに変換するライブラリはありますか
368:デフォルトの名無しさん
09/05/28 07:57:22
自己解決しました。
HTMLのパーサーがあるみたいでそっちのします。
369:デフォルトの名無しさん
09/05/28 10:06:12
くわしく
370:デフォルトの名無しさん
09/05/28 10:32:40
>>366
C用のライブラリだったら
namespace hoge {
extern "C" {
#include "hoge.h"
}
}
である程度ごまかせるんだけどな。
それにusing hoge::hogedata_t
とか#pragma comment(lib)とかも使って。
371:デフォルトの名無しさん
09/05/28 17:29:11
fstream& getLogFile() {
static fstream logFile;
return logFile;
}
として、非局所的なオブジェクトのコンストラクタ内でもログを取れる用にしたんですけど、
logFileの破壊と非局所的なオブジェクトの破壊はどちらが先に起こるか決まってるんですか?
非局所オブジェクトの破壊時にもログをとるのに使えるのか知りたいので。
372:デフォルトの名無しさん
09/05/28 19:02:56
フーリエ級数展開をするプログラム を作ったんだけど異常値しか出ないのでどこが悪いか教えてください
↓のプログラムの場合はf(x)=x [xが0-5] , 0 [xが5-10] で波長が10でループするような式
//最初にxの値を入力してから
hani_suu = 2;//範囲の数
hani[0]=0.0; hani[1]=5.0; hani[2]=10.0; //(0~5),(5~10)という意味
double temp=0,temp_cos,temp_sin;
for(int j=0;j<hani_suu ;j++)//以下a0の計算
for(double i = hani[j];i<hani[j+1];i+=0.1)temp += 0.1 * kansuu(i,j);//積分計算 ※kansuu(i,j)はjが0のときf(x)=x,1のときf(x)=0を返す
for(int n=1;n<50;n++)//以下an,bnの計算
{
temp_cos=0; temp_sin=0;
for(int j=0;j<hani_suu;j++)
for(double i = hani[j];i<hani[j+1];i+=0.1) //積分計算
{
temp_sin+= 0.1 * kansuu(i,j)*sin((2.0*PI*i*n)/10);
temp_cos+= 0.1 * kansuu(i,j)*cos((2.0*PI*i*n)/10);
}
cos_v[n] = temp_cos; //an
sin_v[n] = temp_sin;//bn
}
temp = temp/2.0; //以下a0+Σ(ancos+bnsin)
for(int n=1;n<50;n++)
temp = temp + cos_v[n] * cos((2.0* PI * n * x )/10) + sin_v[n] * sin((2.0* PI * n * x )/10);
//最終的なtempが答え
見にくいですがお願いします
373:デフォルトの名無しさん
09/05/28 19:05:24
勉強用に、シンプルな多倍長加算を作ってるのですが
もっとシンプルに出来ますでしょうか
効率は意識していません
string add(string l,string r){
int carry=0;
stringstream ss;
if(l.size()>r.size()){swap(l,r);}
reverse(l.begin(),l.end());
reverse(r.begin(),r.end());
int i=0;
for(;i<l.size();++i){
unsigned int tmp=(l[i]-'0')+(r[i]-'0')+carry;
if(tmp/10){carry=1;}else{carry=0;}
tmp%=10;
ss<<tmp;
}
for(int j=i;j<r.size();++j){
unsigned int tmp=r[i]-'0'+carry;
if(tmp/10){carry=1;}else{carry=0;}
tmp%=10;
ss<<tmp;
}
if(carry){ss<<'1';}
string ret=ss.str();
reverse(ret.begin(),ret.end());
return ret;
}
374:デフォルトの名無しさん
09/05/28 19:40:36
>>372
感覚で読むとfor ( ; i<hani[j+1]; )が臭うコードに見える。
>>373
C++は、よくわからないが、やりたいことはなんとなく伝わる。
for()は、二つに分ける必要があったのかな。
似たようなことをしているから、for()のなかで、if()するようなコードが浮かびそう。
引数を参照にしたり、const char *foo = bar.c_str()で添字アクセスとか
ただの高速化だけど。
375:デフォルトの名無しさん
09/05/28 20:17:36
ヘッダファイルでプログラムソースファイルを分割することができますが
ヘッダファイルも分割する方法があったら教えて下さい
376:デフォルトの名無しさん
09/05/28 20:20:20
ヘッダファイルはいくらでも分割できます。
377:デフォルトの名無しさん
09/05/28 20:38:31
VC++2008を使ってるのですが
自動修復情報の保存ってのが左下にでてしょっちゅう重いです
なんですかこれ
378:デフォルトの名無しさん
09/05/28 20:59:40
事故解決
URLリンク(blog.goo.ne.jp)
379:デフォルトの名無しさん
09/05/28 21:38:47
実際の数学みたいにxを数字にせずxとして計算するにはどうしたらいいですか?
例えば2x*3x=6x^2みたいな感じで計算して、あとで6x^2のxに色々な数字を代入
できるようにしたいんですが
380:デフォルトの名無しさん
09/05/28 21:54:57
関数電卓のソースを探して見てみよう!
381:デフォルトの名無しさん
09/05/28 22:08:34
ある関数内でnewして得たアドレスを返り値にして
それを外で受け取ったらそのまま、受け取らなかったらdeleteする
みたいな記述はどうやったらできますか?
382:デフォルトの名無しさん
09/05/28 22:39:54
>>381
受け取らなかったらとは、どういう状態?
383:デフォルトの名無しさん
09/05/28 22:50:55
>>382
pHoge = allocHoge(); // OK
allocHoge(); // 自動でdelete したい!
384:デフォルトの名無しさん
09/05/28 23:01:55
>>383
生のポインタじゃムリじゃね?
スマートポインタを使うとか。
385:デフォルトの名無しさん
09/05/29 00:23:19
wrap_allocHoge( void* p )的なものを外側に作って
p==NULLならそのまま削除
p!=NULLなら入れて返すとか
386:デフォルトの名無しさん
09/05/29 00:34:41
>>383
C++なら>>385に引数無しの関数をオーバーロードするのもアリだと思う
387:372
09/05/29 04:19:06
>>372では
for(double i = hani[j];i<hani[j+1];i+=0.1)temp += 0.1 * kansuu(i,j);//積分計算
こんな風に小さい範囲を刻んで積分計算してるんですが
もっと精度を上げたり計算量を少なくするためにはどんな方法がありますか?
388:デフォルトの名無しさん
09/05/29 05:51:59
>>387
完全にスレ違いだろ。
数学スレに行ってくれ。
389:デフォルトの名無しさん
09/05/29 07:16:23
RPGの戦闘部分を作っています。
FFみたいなアクティブタイムバトル(パラメータのすばやさに毎秒1ずつ足して行き、規定値になったら行動)
というものですが、勝利判定はどこでどういう風にすればよいでしょうか?
行動が終わった時に、goto文で戦闘部分の処理を抜け出すのが一般的でしょうか?
390:デフォルトの名無しさん
09/05/29 07:24:55
goto文が一般的じゃない。break使え
391:デフォルトの名無しさん
09/05/29 07:48:35
>>390
ありがとうございます。危うく道を踏み外すところでした
392:デフォルトの名無しさん
09/05/29 19:50:28
STLにupper_boundとlower_boundってありますが
lower:指定した値"以上"の値が最初に現れる位置を返す
upper:指定した値"より大きい"の値が最初に現れる位置を返す
となっていて、どちらも指定した値以上の値が帰ってきます。
そうではなくて、指定した値を超えない最大の値を得たい場合
アルゴリズムを組み合わせたりして
それを簡単に行うような方法ってありますでしょうか
具体的に言うと
1 7 10という列に対して
upper/lower_boundに値2を与えると
どちらも7が帰ってきますが、
1が帰ってくるアルゴリズムはありますか
393:デフォルトの名無しさん
09/05/29 20:06:26
デクリメントすれば?
394:392
09/05/29 20:24:57
自己解決しました
find_if(v.begin(),v.end(),bind2nd(less<int>(),n));
395:392
09/05/29 20:38:47
すみません、解決していませんでした
デクリメントってこういうことでしょうか
vector<int>::iterator it = lower_bound(v.begin(),v.end(),n);
--it; //ここ(*)
int lower = *it;
確かにこれで期待した動作はするのですが
ちょっと気になるのは
(*)の箇所でイテレータが範囲外、例えばitが最初の要素だったりした場合
どう範囲チェックすれば良いのでしょうか
if(it)やif(it!=NULL)などは型チェックが通りませんし
396:デフォルトの名無しさん
09/05/29 21:07:16
begin()でもrend()でも使えばいいじゃない
397:デフォルトの名無しさん
09/05/29 21:43:34
includeファイルが増えてくると面倒なので
include_iroiro.h----------
#include "foo.h"
#include "bar.h"
・
・
・
#include "hoge.h"
----------------------
のように、よく使うものを全部includeするヘッダを使ってます
この場合includeしたcppで実際には使わなかったクラスなども無意味にコンパイルされるんでしょうか?
398:デフォルトの名無しさん
09/05/29 21:46:39
.h ということならYES
399:デフォルトの名無しさん
09/05/29 21:55:46
そうなんですか・・・ショック!
400:デフォルトの名無しさん
09/05/29 22:05:33
プリコンパイルヘッダを使えばいい
401:デフォルトの名無しさん
09/05/29 22:11:28
450 step -1 until 1 do
ってどういう意味ですか?
402:デフォルトの名無しさん
09/05/29 22:15:57
450が1なるまで-1しながらdo以下の処理を繰り返す??
403:デフォルトの名無しさん
09/05/29 22:23:14
while(条件){
cin >> x1 >> x2;
(以下if文)
のように記述して、ループさせています。
EOFでwhileのループを終了させたいとき条件はどう書いたらいいのでしょうか?
よろしくおねがいします。
404:デフォルトの名無しさん
09/05/29 22:24:33
>>402
ありがとうございます。
ということは、「1が53になるまで+1しながらdo以下の処理を繰り返す」っていうのは、
1 step +1 until 53 do
であってますか?
405:デフォルトの名無しさん
09/05/29 22:43:57
それC/C++じゃないじゃん。スレ違い
406:デフォルトの名無しさん
09/05/29 22:55:58
>>401
どこの言語だ。
最近スレ違いがおおいな。
407:デフォルトの名無しさん
09/05/30 10:46:34
VS2005proです
#pragma region
~処理を記述~
#pragma endregion
このおまじないは、どういう意味を持つのですか?教えてくださいエロイ人
408:デフォルトの名無しさん
09/05/30 10:48:14
>>407
折りたたみ機能
409:デフォルトの名無しさん
09/05/30 10:53:12
>>408thx
syntaxには関係ないものか、あまり役に立たない機能だな
410:デフォルトの名無しさん
09/05/30 11:24:58
templateを展開した後のコードを生成するようなフリーソフトってなんかいい感じのありますか?
411:デフォルトの名無しさん
09/05/30 11:39:14
すいません、質問です。
アマゾンで古本を販売していて
販売価格を簡単に改定できるソフトを探しています。
改定ソフトは.netフレームワークでプログラムが作られてるようなのですが
プログラミングの知識がまったくない素人が売ってるのを購入せず
同じようなものを作るにはどれぐらいの時間がかかりそうですか?
プログラム自体はアマゾンサイトから価格データを集めるのがメインで
それほど難しくなさそうに見えるのですが。(素人なので直感です)
価格改定ソフトの一例です
URLリンク(6plan.net)
やっぱりめちゃくちゃ難しいんですかね?
412:デフォルトの名無しさん
09/05/30 12:01:41
>>411
とりあえず君のプログラミングスキルを教えてくれ。
ここはC/C++スレだからC/C++のスキルに関しても。
413:デフォルトの名無しさん
09/05/30 12:06:15
>>412
すいません、プログラミング知識はゼロです。
コンピュータ用語がわかる程度
良く言ってシスアドレベルだと思います。
414:デフォルトの名無しさん
09/05/30 12:08:47
>>413
0からだと果てしなく険しいと思う。
少なくともC/C++でやるなら相当苦労しそうだ。
他の人の意見も聞きたいところだけど、
やるにしてもせめて初心者にやさしい超高級言語で挑戦したとして
果たして何ヶ月かかるだろうか。。。
415:デフォルトの名無しさん
09/05/30 12:15:27
プログラムの取得にかかる時間は個人差がある。
独学ならなおさら。
半年で5つの言語を習得してプログラミング言語自体を作ってしまう高校生もいれば、
いくら頑張っても途中で挫折する人間も大勢いる。
416:デフォルトの名無しさん
09/05/30 12:18:48
>>415
>半年で5つの言語を習得してプログラミング言語自体を作ってしまう高校生もいれば、
だれ?
417:デフォルトの名無しさん
09/05/30 12:44:48
>>411
業務時間内に作ろうと思ってるならやめた方がいい
よほどの天才じゃない限り買った方が安い
418:デフォルトの名無しさん
09/05/30 12:52:16
>>415-417
レスありがとうございます。
それほど難しいものなんですか。
おとなしく製品を購入することにします。
ちなみにシスアド程度の素人がプログラムを楽しもうと
思う場合、ExcelとかのVBAなら比較的簡単に習得できるものなんですか?
あくまでも趣味程度しか時間はさけませんので。
419:デフォルトの名無しさん
09/05/30 13:16:37
極端な例を出して話をはぐらかすやつって馬鹿なの?
420:デフォルトの名無しさん
09/05/30 15:04:51
char x1,x2;としてこれをwhileで繰り返し、if文でx1==x2の判定をしながら、
文字列のランレングス符号化をしたいです。
どう書けばいいでしょうか?
421:デフォルトの名無しさん
09/05/30 18:59:17
グローバル変数と性的変数ってどっちのほうがメモリ容量多く使うのでしょうか?
また、staticを何個も書くのはまずいですか?
422:デフォルトの名無しさん
09/05/30 19:00:00
静的変数の間違いでした。
423:デフォルトの名無しさん
09/05/30 19:25:54
>>421
たいていの場合、グローバル変数とstatic変数は同じ扱いになる
static変数を何個も書くこと自体は問題ない。
性能面、安全面で自動変数より劣ることはあるかもしれない。
424:デフォルトの名無しさん
09/05/30 19:32:11
グローバル変数のほうが、シンボル情報がオブジェクトファイルに含まれるので
.objなり.oなりが大きくなる
と全然意味の無いことを言ってみる
425:デフォルトの名無しさん
09/05/30 19:43:53
ヘッダーファイルの値をいくら変えても反映されません。
どうやらパソコンを起動してから最初に実行した時の値が以後ずっと使われているようです。
PCを変えて実行してみましたが、同じ不具合が発生しています。
原因がわかるかたいませんか?
426:デフォルトの名無しさん
09/05/30 19:53:43
日本語でおk
427:デフォルトの名無しさん
09/05/30 20:02:01
説明しようにも不具合の原因がわからなすぎて、上手く説明できません。
ソースファイルの更新はしっかり反映されるのに、ヘッダーファイルの更新は最初の一度しか反映されないのです。
428:デフォルトの名無しさん
09/05/30 20:05:58
その.hをincludeした.cで printfしてみれ
それでも反映されないのなら、コンパイラのバグじゃね
429:デフォルトの名無しさん
09/05/30 20:14:43
どうやら値事態はしっかり反映されているようです。
しかし、その値と変数を比較する部分が正しく動作しません。
友人と全く同じプログラムですが、実行結果が違います。(アカウントは違います。)
430:デフォルトの名無しさん
09/05/30 20:20:44
ヘッダーを書き換えた後にそれをインクルードしているソースはコンパイルしなおしているよな?
一応OSと環境(VC++とかgccとか)よろ
431:デフォルトの名無しさん
09/05/30 20:20:56
学校の課題は先生に訊きなさい
432:デフォルトの名無しさん
09/05/30 20:24:59
複数あるソースファイルのうち、その比較部分があるファイルにprintf文をつけたところ、値の比較が正しく行われるようになりました…。
当然、友人らはこのソースファイルには手をつけなくても正しく動作しています。
全くもって理解不能です。
433:デフォルトの名無しさん
09/05/30 20:32:11
こんな言葉がある
『プログラムは思ったとおりに動かない。書いたとおりに動くのだ』
434:デフォルトの名無しさん
09/05/30 20:37:43
printf文をつけることで関係無い部分が正しく動くようになったのですよ。
理解不能(^q^)
435:デフォルトの名無しさん
09/05/30 20:41:57
>>430の言ってることが答えな気がする
printf文を加えたソースファイルをコンパイルしなおしたことでヘッダファイルの変更が反映されたと
436:デフォルトの名無しさん
09/05/30 20:47:47
>>435
別のソースファイルにつけたときは正しく比較部分が正しく動かなかったです。
(ヘッダーで設定した数値は正しく表示された)
日本語が不自由ですみません。
437:デフォルトの名無しさん
09/05/30 20:58:48
そんなときにはソリューションのクリーン→ビルド
438:デフォルトの名無しさん
09/05/30 21:11:50
>>436
いやだから、別のソースファイルの時は今回直したソースファイルをコンパイルしなおしていないんじゃないか?ってこと
439:デフォルトの名無しさん
09/05/30 22:44:16
とりあえず環境、ヘッダとかのファイル名と実行したコマンドを書け。
440:デフォルトの名無しさん
09/05/30 23:53:16
C言語の質問です。お願いします。
{
int i;
char ch;
scanf("%d", &i);
printf("%dです。\n", i);
scanf("%c", &ch);
printf("%cです。\n", ch);
return 0;
}
というプログラムを実行し例えば4と打つと
4
4です。
です。
と表示されてしまいます。
何故、scanf("%c", &ch)は無視されるのでしょうか?
4
4です。
s
sです。
と言った具合に表示させたいです。
441:デフォルトの名無しさん
09/05/30 23:59:06
URLリンク(www.google.co.jp)
442:デフォルトの名無しさん
09/05/31 00:01:12
virtualってつけれるところは全部つけとけばおkなんですか?
443:デフォルトの名無しさん
09/05/31 00:12:38
>>440
4の次に入力された改行文字が、2回めのscanfで読み込まれるから。
scanf("%d%*c", &i);
のようにして、改行文字を1回めのscanfで読み込ませればいい。
444:デフォルトの名無しさん
09/05/31 00:21:25
>>441
>>443
ありがとうございました。
おかげさまで解決しました。
445:デフォルトの名無しさん
09/05/31 00:25:31
>>442
副作用としては、
・オーバーライドするつもりのない関数を間違ってオーバーライドする可能性がある
・多分、メモリ使用量が幾分増える
ってのがある。
446:デフォルトの名無しさん
09/05/31 03:57:21
Cの乱数をsrandとtimeを使って毎回違うようにするのは
わかったのですが、二つの乱数をほぼ同時に出す場合、どうすれば
その二つの乱数をバラバラにする事ができますか?
具体的には戦闘ゲームなのですが、
コチラの攻撃が1~30までで、相手も1~30までの値で
攻撃してくるときに、1~30までの値を返す関数を
srandで初期化してrand()%30+1の値を返すという風に作りました。
しかし、自分の攻撃値も上の関数でけっていし、それにほぼ同時
(すぐ次の行で)相手の攻撃値も決定しているのですが、そうすると
どうしても自分の攻撃値と相手の攻撃値が同じになってしまいます。
時間がほぼ同時ぐらいのタイミングで処理するとどうしても
このようになってしまうと思うのですが、どのようにすれば別々の値に
できるでしょうか?よろしくおねがいします。
447:デフォルトの名無しさん
09/05/31 04:04:51
srandで初期化するのは、プログラム中1回だけでいい。
面倒なら、srand呼ばないようにすればとりあえずランダムな値は取れる。
448:デフォルトの名無しさん
09/05/31 04:16:45
同じだったらもう一回randすればいいんじゃないの
449:デフォルトの名無しさん
09/05/31 04:30:35
乱数シードに IP アドレスとかプロセス ID とかを加算
てか同じプロセス内のコードか??? なら初期化は一回だけであとは rand を呼べばいい
450:デフォルトの名無しさん
09/05/31 05:18:53
質問なのですがお願いします。
c++、bccを使用しています。
char si[1000];
char sj[1000];
cin>>s1;
cin>>s2;
と二つの配列を作って、こんぱいる実行したら
「_ 」
とうまく入力待ちになりました。しかし、
char si[1000];
char sj[1000];
cin>>s1;
cin>>s2;
array[1000][1000][5];
では、
「
c:\bcc\test> 」
と表示されて、たぶん実行終了した状態になるのですが、
原因を教えてくださいませんでしょうか?おれがうんこなのでしょうか?
451:450
09/05/31 05:20:12
全力で間違えました。
char si[1000];
char sj[1000];
cin>>s1;
cin>>s2;
int array[1000][1000][5];
でうまくいかないのでしあt
452:デフォルトの名無しさん
09/05/31 05:23:32
領域確保しすぎてスタックオーバーフロー?
配列をグローバルにしてみよう
453:デフォルトの名無しさん
09/05/31 05:24:01
>>451
>int array[1000][1000][5];
これ単純に大きさを計算したら1000×1000×5×4=約19MBとなって
スタックのデフォルトの大きさ1MBを超えるから異常終了する
スタックを大きくするかstaticを付けてBSSに配置するかだな
454:デフォルトの名無しさん
09/05/31 06:35:37
Visual Studio 2005 Proですが
array<String^>^ getFilterName_St();
Bitmap^ sample_grab();
Bitmap^ sample_grab2(Bitmap^ bmp);
こういう書き方って、.NET対応CLIの実装ですよね、NativeなC/C++では使えないコードですよね。
455:デフォルトの名無しさん
09/05/31 08:37:19
うん
456:デフォルトの名無しさん
09/05/31 09:06:28
>>455Thx分かりました。
.NETのCLIって、C/C++のコードも混在することができるんですね、templateや関数オブジェクトがすらすら書けない俺には無用なものですね。
457:450
09/05/31 11:42:01
ありがとうございました。
mainの外に追い出したところ、何とか起動しました。
途中で強制終了されたけど。。。なんかでかい配列を扱うのはすごく大変ですね。
ありがとうございました!
458:デフォルトの名無しさん
09/05/31 13:25:55
ある動的配列の要素全てが0以下である
をループを抜ける条件としたいのですが、何か良い方法はありますか?
今はforで要素全てを判定させて、全て0以下なら
変数aを1、このaが1ならループを抜けるとしています
459:デフォルトの名無しさん
09/05/31 13:47:38
O(n)未満の方法はないんじゃないかな
なのでその方法がベスト
もし、STLに関数型言語のforallやexistsのようなものがあれば
記述的に楽は出来るだろうが
やる計算的には>>458の方法と同じになるし
460:デフォルトの名無しさん
09/05/31 13:49:41
Pstade.Ovenライブラリを使って
oven::forall(xs, _1 <= 0)
を終了条件にすればいい
ただしxsは対象である動的配列の型で、かつ
xsの型がsingle pass rangeのコンセプトを満たす必要がある
vectorやlistはこのコンセプトを満たす
461:デフォルトの名無しさん
09/05/31 13:52:40
>>458
それでいいんじゃないの?
あまりにも大量のデータを頻繁にチェックするというのなら、
配列に書き込む時点で値が0以下かどうかチェックするという方法もあるけど。
(配列への書き込みが大量に発生するようだと、これも効率的でなくなるが)
462:デフォルトの名無しさん
09/05/31 13:58:53
while( !isAllNegative(array, size) ) ~;
isAllNegative(int *array, int size){
for(int i = 0; i < size; ++i)
if(array[i] >= 0)
return false;
return true;
}
463:デフォルトの名無しさん
09/05/31 14:00:15
ああ、そのほうが良いな。アホだった
あと、そのプログラム、条件>=じゃなくて>にしないと
464:458
09/05/31 14:31:22
ありがとうございます!
全部試してみますね
465:デフォルトの名無しさん
09/05/31 16:34:51
他人の作ったクラスを継承するのって危険ですかね?
466:デフォルトの名無しさん
09/05/31 16:37:52
継承する想定で設計しているならそうでもないんじゃないの。
まぁ作った奴のスキルがどれだけ信用できるかだが。
467:デフォルトの名無しさん
09/05/31 16:56:40
自分で定義したクラスでも意識してないと
Liscov Sutstitution Principleは簡単にぶっ壊れるのになにをかいわんやだ
468:デフォルトの名無しさん
09/05/31 17:06:56
プライベート継承しただけで壊れるんだっけ
469:デフォルトの名無しさん
09/05/31 17:09:19
女でプログラマは何割くらいいますか?
470:デフォルトの名無しさん
09/05/31 17:32:53
一割いないね。
471:デフォルトの名無しさん
09/05/31 17:42:00
トンクス
472:デフォルトの名無しさん
09/05/31 17:42:25
女でプログラマで美人で性格いい人は何割ぐらいいますか?
473:デフォルトの名無しさん
09/05/31 18:55:38
本当に人口の半分は女なのか疑わしくなってくる
474:デフォルトの名無しさん
09/05/31 18:59:10
女優遇社会だからな。酷い男社会とは別の贅沢な環境で生活してるんだよ。
475:デフォルトの名無しさん
09/05/31 19:06:42
主夫になりたい
476:デフォルトの名無しさん
09/05/31 19:18:18
前にも質問したんですが、メモリをファイルに見せかける方法か、
ramディスクを動的に生成する方法ありますか。
477:デフォルトの名無しさん
09/05/31 19:21:25
DOSコマンドでファイルへ出力するものを直接メモリに入れたいのですが。無理でしょうか。
標準出力ではなく、ファイルへの出力の場合です。
478:デフォルトの名無しさん
09/05/31 20:06:40
mmapとか、MapViewOfFileとか、その辺を調べるといいかも。
ただし俺だったら出力関数にファイルに出力するかメモリに書き込むかを
指定するフラグをつけるけどな。
479:デフォルトの名無しさん
09/05/31 20:08:14
>>476
メモリマップドファイルというのがある
それ専用のWindowsAPIがあるから、他でもOSレベルのAPIがあるんじゃね
480:デフォルトの名無しさん
09/05/31 20:12:08
ファイルをメモリのように扱うのではなく、
メモリをファイルのようにしたいのですが。
メモリを借りてきて、Zドライブを作るとかです。
普通のドライブのようにアクセスする方法はないですか
481:デフォルトの名無しさん
09/05/31 20:14:51
えっ
482:デフォルトの名無しさん
09/05/31 20:14:55
---hoge.h---
class Hoge{
public:
メンバ関数;
private:
void *mMember;
};
-----------
--hoge.cpp--
namespace{
struct Member{hoge hg}; //コンストラクタでmMember = (void *) new Member; アクセスは(Member *)mMember
privateメンバ関数の代わりの関数;
}
メンバ関数;
-----------
めんどくさそうだけど、カプセル化にこだわるならこんな感じのほうがいいんでしょうか?
483:デフォルトの名無しさん
09/05/31 20:18:54
>>480
RAMディスク Windows
とかでぐぐれ。
484:デフォルトの名無しさん
09/05/31 20:21:30
>>482
こだわるならそんな感じだけど、そこまでこだわる必要があるケースは稀。
485:デフォルトの名無しさん
09/05/31 20:21:33
RAMディスクをプログラムが動いているときだけ生成して、終了したら解放する方法はないですか?
既存のDOS EXEで、出力がファイルのやつを直接メモリに格納して高速化したいです。
486:デフォルトの名無しさん
09/05/31 20:25:52
RAMディスクつくるソフトを制御して
起動時にRAMディスク作らせて、終了時にRAMディスク開放させればいいのでは?
487:デフォルトの名無しさん
09/05/31 20:29:44
汎用性がある方法はないですか
ソフトをインストールしてもらわないと出来ません
488:デフォルトの名無しさん
09/05/31 20:40:26
単に、バーチャルなファイルシステムをかますだけでしょ。作った方が早い
489:デフォルトの名無しさん
09/05/31 20:43:05
USBカメラから画像を取り込みたいんですが、よくあるUSBカメラを使うソフト
とかってどうやってるんでしょうか?
490:デフォルトの名無しさん
09/05/31 20:58:48
既存のDOS EXEって何よ?
491:デフォルトの名無しさん
09/05/31 21:14:14
>>489
USBカメラがそうなっているかは分からんが、TWAINという共通化インターフェースがある
492:デフォルトの名無しさん
09/05/31 21:19:51
カプセル化という物を勉強したのですが、一度しか使わない計算でも
関数を定義して別ファイルに値を渡し、戻り値をmainに渡すようにしたほうがよいのでしょうか?
493:デフォルトの名無しさん
09/05/31 21:22:02
ありがとうございます。TWAIN初めてききました
直接カメラのドライバをたたいてるのかと思ってたけど、こんな便利なのがあったんですね
494:デフォルトの名無しさん
09/05/31 21:34:23
>>492
必要に従いカプセル化する。何でもかんでもカプセルにして密閉化すると。
オブジェクト指向原理主義者になるw
495:デフォルトの名無しさん
09/05/31 21:39:04
>>492
突き詰めると決着が付かないような議題
個人的にはほんの数行(最大4行ぐらい)で、そこでしか計算しないんだったら埋め込む
ただ
>関数を定義して別ファイルに値を渡し、戻り値をmainに渡す
が何を言ってるのかがわからなくて心配
496:デフォルトの名無しさん
09/05/31 21:51:10
>>492
それはカプセル化というよりはリファクタリングに関係してるように思う
俺の場合、ある処理を2回行うようになった時点で関数化する
逆に1回しか使う場所がないのに無駄に抽象化した関数は定義しないようにしている
C++の抽象化能力では、これは常に出来ないのは若干悩みの種
カプセル化は、ライブラリのように
他人もそのコードを使うケースで意識すればよいと思う
497:デフォルトの名無しさん
09/05/31 21:54:50
>>477
出力ファイル名にCONを指定して標準出力へ出せるようにならない?
それで動くなら、あとはリダイレクトできるでしょ。
498:デフォルトの名無しさん
09/05/31 22:01:18
>>494-496
ありがとうございます
一人だから問題ないのですが、逆に指摘してくれる人がいないのが難点です
499:デフォルトの名無しさん
09/06/01 00:08:32
スタイルの問題で答えはないと思うけど、マクロってインデントするべきかな?
#ifndef CLASS
namespace Name
{
class Class
{
public:
foo bar();
#ifdef _DEBUG
hoge fuga();
#endif
}
}
#endif
#ifndef CLASS
namespace Name
{
class Class
{
public:
foo bar();
#ifdef _DEBUG
hoge fuga();
#endif
}
}
#endif
悩む・・・
500:デフォルトの名無しさん
09/06/01 00:26:03
#ifndef CLASS
なんたらかんたら
# ifdef _DEBUG
なんたらかんたら
# endif /* _DEBUG */
なんたらかんたら
#endif /* CLASS */
とやるのが普通かな。
プリプロセッサディレクティブは、行の先頭を#で始めなければならない。
規格のどのセクションだったかもう覚えてないけど。
フリーソフトウェアのソースを読んで勉強したら良いかもしれない。
501:デフォルトの名無しさん
09/06/01 00:53:26
そう?
手元のANSI C言語辞典には#の前に空白類があってもよいと書いてあるけど。
もちろんそんな書き方誰もしないということは同意だ。
502:デフォルトの名無しさん
09/06/01 00:59:31
#if foo
#if bar
#include <momo.h>
#else
#include <taro.h>
#endif
#endif
のような例はよくみかける。
503:デフォルトの名無しさん
09/06/01 01:25:41
自分は普段はこう書くな。
#if foo
# if bar
# include <momo.h>
# else
# include <taro.h>
# endif
#endif
行頭に#があったほうが見た目わかりやすいと思う。
504:503
09/06/01 01:27:01
#if foo
# if bar
# include <momo.h>
# else
# include <taro.h>
# endif
#endif
こうな。
505:デフォルトの名無しさん
09/06/01 01:36:32
Windows98のメモ帳でのプログラムの実行の仕方を教えて下さい
因みに入力したのはC言語のprintf何たらの簡単なプログラムです
506:デフォルトの名無しさん
09/06/01 01:41:44
書いたコードをここに貼り付けて、右下のボタンを押せ。
URLリンク(codepad.org)
507:デフォルトの名無しさん
09/06/01 05:53:03
>>502
俺もそう書くわ。
特に多いのが
#ifndef __BORLANDC__
高度な処理;
#else
低度な処理;
#endif
みたいにコンパイラで処理を分けたりとか、あとはデバッグの時かな。
508:デフォルトの名無しさん
09/06/01 06:27:58
1.下の多重ループで「A」は何行何列に表示されるか.
for(j=1;j<=2;j++) {
for(k=1;k<=3;k++) {
printf("A");
}
printf("\n");
}
2.下の多重ループで「A」は何行何列に表示されるか.
for(j=1;j<=5;j++) {
for(k=1;k<=4;k++) printf("A");
printf("\n");
}
1は2行3列で2は4行5列ですか?
509:デフォルトの名無しさん
09/06/01 07:30:16
>>506
すみません
ネットに繋げてないのでメモ帳での方法を教えて下さい
510:デフォルトの名無しさん
09/06/01 10:56:47
>509
別にメモ帳だろうが何だろうが、Cのプログラムには関係ないよ。
もちろん効率とかは違うだろうけど。
511:デフォルトの名無しさん
09/06/01 11:32:44
>>509
エスパーすると、コンパイラの使い方がわからないんだろう
そもそも509はC言語のコンパイラを持っているのか?
例えばVC,BCC,GCCなど。
512:デフォルトの名無しさん
09/06/01 12:13:08
持ってないだろうねえ。でも、
最初の一歩も自分で踏み出せない奴を
どうにか歩かせたところで無駄じゃね?
513:デフォルトの名無しさん
09/06/01 13:27:29
最小2乗法によるm次の多項式近似を行うプログラムを教えてください
教えて
xがー2の時yが3.02
-1の時0.98
0の時1.22
1の時2.16
2の時2.61 の時のです
出来ればソース全文書いてください
514:デフォルトの名無しさん
09/06/01 14:16:58
>出来ればソース全文書いてください
>出来ればソース全文書いてください
>出来ればソース全文書いてください
515:デフォルトの名無しさん
09/06/01 14:20:25
>>513
マルチすんなカス
516:デフォルトの名無しさん
09/06/01 16:18:56
符号なしenumがほしいんですが、なにか代替案はありますかね?今は
typedef const unsigned long uenum_t;
uenum_t foo = 0, bar = 1, hoge = 2 ・・・;
みたいに地道に書いて我慢してるんですが
省略記法が使えなくてめんどいし、メモリももったいない気がします
517:デフォルトの名無しさん
09/06/01 17:25:11
半角テキストファイルを読み込んで使用する場合
空白文字も含めて一つの変数orクラスに格納したいんですが
どうすればいいでしょうか?
というかなぜ空白で一々区切られるのでしょうか?
EOFでいいじゃないですか?
518:デフォルトの名無しさん
09/06/01 17:27:29
getlineでいいんじゃない?
519:デフォルトの名無しさん
09/06/01 17:49:17
getlineって一行だけじゃなかったっけ?
520:デフォルトの名無しさん
09/06/01 20:39:48
whileのループをEOFで抜けだし、出力するようにしたのですが、
出力後、プロンプトが出てきません。ctrl+Zで中止しないといけない状態です。
なぜ出てこないのでしょうか?
よろしくお願いします。
521:デフォルトの名無しさん
09/06/01 20:44:30
ループにでも入ってるんじゃない?
522:デフォルトの名無しさん
09/06/01 22:51:06
for(a=0;a<3;a++){
for(b=0;b<20;b++){
if(hensu<0){
処理1;
}
else{
処理2;
}
}
}
このようなfor文で、処理1もしくは処理2を実行したら
二つのfor文を一度に抜けたいのですが、どうすれば可能でしょうか?
処理のあとにbreakひとつじゃ後のfor文しかぬけないため、また処理1か2を実行してしまうので
困ってます。
goto文?というのはなるべく使いたくないのでそれ以外で何か簡潔にできますでしょうか?
523:デフォルトの名無しさん
09/06/01 22:55:08
俺は普通に終了フラグを作る
524:デフォルトの名無しさん
09/06/01 22:56:20
典型的な「gotoを使うと綺麗に書ける例」だな。
どうしても使いたくないなら
・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける
・全体を関数にしてしまい、returnで抜ける
とかどうか。
525:デフォルトの名無しさん
09/06/01 22:58:27
int end = 0;
for(a=0;a<3 && !end;a++){
for(b=0;b<20 && !end;b++){
if(hensu<0){
処理1;
end = 1;
}
else{
処理2;
end = 1;
}
}
}
もしくは関数化して、returnで抜けるとか。
526:デフォルトの名無しさん
09/06/01 23:00:31
男3人が結婚かよ
527:デフォルトの名無しさん
09/06/01 23:09:54
C言語の本を買ってきて、printfなるものをWindowsのメモ帳に入力したけど、どうしたら実行出来るの?
528:デフォルトの名無しさん
09/06/01 23:12:53
C言語の本に書いてあるんじゃね?
529:デフォルトの名無しさん
09/06/01 23:13:08
そのC言語の本に実行までのやり方が書いてないなら、
それが書いてある入門本を買いに本屋に走るんだ。
530:デフォルトの名無しさん
09/06/01 23:13:10
そのC言語の本を1ページ目から読み返せ。
それで分からなければタイトル晒して燃やせ。
531:デフォルトの名無しさん
09/06/01 23:13:58
また多重婚だねっ♪
532:デフォルトの名無しさん
09/06/01 23:19:00
2重のループを無理やり1重のループに変換する
533:デフォルトの名無しさん
09/06/01 23:20:52
aに3を入れる
534:デフォルトの名無しさん
09/06/01 23:21:06
>>523-524
フラグをつくる場合、>>525さんが書いて頂いたような
フラグの仕方が一番コード書く上では綺麗なのでしょうか?
関数化もよさげですね。ただあまり関数を増やしたくないのもあるので
使わずにすむならそっちのが使いたいです
535:デフォルトの名無しさん
09/06/01 23:22:34
フラグと書いた俺はフラグが基本だ。他は好みだろ
536:532
09/06/01 23:25:30
誰も思いついてない方法だから俺様の勝ち
int a, b;
for(x=0; x<60; x++){
a = x/20; b = x%20;
if(hensu < 0){
処理1;
}
else{
処理2;
}
}
537:デフォルトの名無しさん
09/06/01 23:26:55
>>536 -見るー> >>532
538:デフォルトの名無しさん
09/06/01 23:29:37
・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける
あれでもこれだと、内側のループをまずbreakで抜けて、抜ける前にフラグをたてて
で、抜けたあとに外側をそのフラグでみるということかな?
でも外側のループから抜けるってどうやるんだろう
539:デフォルトの名無しさん
09/06/01 23:34:46
例の通りなら hensuの比較bool だから a=0,b=0 時点で必ずループ終了を要求することにならないか?
540:デフォルトの名無しさん
09/06/01 23:35:11
つうか処理1もしくは処理2は初回で確実に実行されるんじゃないのかfor文いらなくね
541:デフォルトの名無しさん
09/06/01 23:36:36
俺もそれ思ったwアルゴリズムが変
542:デフォルトの名無しさん
09/06/01 23:47:28
>>534
2重ループくらいなら、あんまり汚くはならんでしょ。たぶん。
実際の書き方は十人十色だろうけどね。
個人的には、forの条件式のところに書くよりは、新しくif~breakを作る方が好き。
あと、もう1つ。
関数呼び出しにかかる時間が致命的で、少しでも減らしたいというのでもない限り
基本的に関数を増やす方向で進めた方がいいと思うよ。
>540-541
まあ、実際のコードとは違う可能性もあるし、そこは突っ込むほどのことでもないんじゃない?
543:デフォルトの名無しさん
09/06/01 23:56:17
>538
すごく単純に書くと
for ()
{
for ()
{
end_flag = 1;
break;
}
if ( end_flag == 1 ) break;
}
544:デフォルトの名無しさん
09/06/02 00:04:31
書いてない
近所にそんな本置いてない
Amazon登録(会員?)してない
晒した後に燃やす意味がわからない
メモ帳ってテキストエディタだよね?C言語によるプログラムはどうやって実行するの?
545:デフォルトの名無しさん
09/06/02 00:07:04
Cの入門書なら絶対に書いてある。
万が一書いてなければ、それは間違いなく悪書なので燃やしても咎められないだろう。
ついでに、同じような被害者を出さないためにも、タイトルを晒しておこう。
くらいの意味。
要約すると、「1ページ目から読み直せ」ってことだ。
546:デフォルトの名無しさん
09/06/02 00:30:19
void型のWINAPI関数、ABC()があるとします。
void WINAPI ABC()
と
VOID WINAPI ABC()
には違いがありますか?(voidが小文字か大文字か)
547:デフォルトの名無しさん
09/06/02 00:34:47
>546
どっかで、「VOID は void の別名ですよー」って定義されているかどうかによる。
結論から言うと、たぶんそうなってる。
548:デフォルトの名無しさん
09/06/02 00:53:27
>>542
なるほど。関数を呼ぶと時間がかかるのですか。
かなり高い頻度で呼び出すのでできればはずしたいかな。
書いてなく申し訳ないですが、おっしゃるとおり実際は
forで回している変数を処理1,2で使っているので何とか抜けないといけないのです。
見た目で行くとやっぱり関数ですねー。
一気にfor二個抜けるbreak2みたいなのがあればいいですね(笑)
549:デフォルトの名無しさん
09/06/02 00:58:34
>548
>関数を呼ぶと時間がかかる
それこそ1/60秒間に1000回呼ばれ、マシンの性能の極限まで詰め込みたい……とかいうのでもない限り
普通に関数使っとけw
550:デフォルトの名無しさん
09/06/02 01:00:46
goto文使ってたり多重ループがあるだけで、
コードレビューが合格にならないキチガイISOマンセープロジェクト
って、この世からなくなればいいのに
551:デフォルトの名無しさん
09/06/02 01:29:22
>>522
for(~){
for(~){
if(hoge) break;
}
if(hoge) break;
}
552:デフォルトの名無しさん
09/06/02 01:42:18
そのループ処理を関数に切り出して、
抜けたいところで return してしまうのも一つの手。
553:デフォルトの名無しさん
09/06/02 01:55:55
>551-552
実際の質問の直後のレスを見ようぜ
554:デフォルトの名無しさん
09/06/02 03:49:46
go to文は有害だよ
どんなネストごちゃまぜなソースでもちゃんと普通に抜けだすコード書いたほうがいい
go to文はあとから見た時可読性が著しく落ちる まじで
555:デフォルトの名無しさん
09/06/02 03:53:11
その部分をまるっと関数化してreturnで抜けだすのと
gotoにそこまで違いがあるのかどうかw
556:デフォルトの名無しさん
09/06/02 04:01:36
for(a<3){ for(b<20){
if(){if(hensu){}else{},a=3;continue;}
}} // bループの外に処理があるなら }if(a<3){ }}
で十分じゃないの?
557:デフォルトの名無しさん
09/06/02 04:02:07
>>554
フラグ変数とか多用されるよりgoto使ってくれた方が追うの楽だし、
そもそもgotoつかえば深いネストしなくて済むことも多い。
558:デフォルトの名無しさん
09/06/02 04:05:36
フラグ変数を使って深いループを抜ける事は、仮想関数を
使うべき所にswitch文やif文で多重にネストした醜いプロ
グラムを連想させる
559:デフォルトの名無しさん
09/06/02 04:18:03
質問。
あるクラスから派生したクラスを作るとき、その派生クラスを強制的にシングルトンにさせる方法ってありますか?
派生クラスに自前でシングルトンパターンを実装するしかないのでしょうか?
>goto
まあ俺みたいな初心者は
少しは綺麗になるかも?と思ってもgotoを使わない方向で書いた方が安全ってことだな!
560:デフォルトの名無しさん
09/06/02 06:19:47
gotoが必要になる事ってほとんど無いんだけど。
ちゃんとクラス設計しているのか?
・・・と思ったが、C言語の場合はクラス設計もクソもないな。
561:デフォルトの名無しさん
09/06/02 06:26:12
gotoも使いようだよ
ifとかwhileで書けるなら、gotoでなくそっちを使うべき、ってだけ
いずれにせよクラスは関係ないな
562:デフォルトの名無しさん
09/06/02 07:30:53
>>545
最初っから読んだが載って無いな
悪書なのは分かったが買ったからには100%使う予定
で、メモ帳はテキストエディタっていう程だからプログラムを実行出来るんだよね?ググっても良く分からんのだよorz
563:デフォルトの名無しさん
09/06/02 07:37:44
>>562
じゃぁ、初心者向けの本じゃ無かったんだろ。
自分のレベルにあった本を買えるようにしような。
564:デフォルトの名無しさん
09/06/02 08:04:55
もっと高級なテキストエディタじゃないと実行できないんだよ。
565:デフォルトの名無しさん
09/06/02 08:14:21
>>582
C言語なら、コンパイラというプログラムが必要だ。それをつかえ。
コンパイラにも色々種類があるが、C言語用のコンパイラな。
566:デフォルトの名無しさん
09/06/02 08:48:14
>>564
嘘は言っていないから困る
567:デフォルトの名無しさん
09/06/02 09:54:40
まあ基本は、「エディタは編集するものであって実行するものじゃない」
568:デフォルトの名無しさん
09/06/02 12:38:23
>562
念のため、本のタイトルを。
569:デフォルトの名無しさん
09/06/02 12:59:30
わかた
コンパイラは自力で探してみる
因みに購入したC言語本は
URLリンク(www.amazon.co.jp)
コンパイラについて書いて無かった気がしたけどなぁ
570:デフォルトの名無しさん
09/06/02 13:00:55
あ、コンパイラはC++用でもおKなの?
571:デフォルトの名無しさん
09/06/02 13:02:32
/ \
、 ヽ\ ヽ
. / , / ! ∨丁ヽ い | /二フ”
/ ! | ィ 「\ | ハ l | ,′ /
l ! | / /j/ '. ノ, =、!// /j/ ヽ/
l い/ ,, =x j/ ′ 〈j/ /ヽ
ト ._ \_〃 :.:.:.:.} /二フ”
l l { 下 ̄ .:.:.:.: -‐1 ∧ /
l l T ‐个 ._ ー' イ l| ニニ!
l/ /| l l//下二千ヽ_l い ─┘
' / .′ l,ノ\/// 小、|、\ヽ\ 「〉
¦l / / \/ U` \ヽl i r_|
¦l l i ! ト ヽ |
572:デフォルトの名無しさん
09/06/02 13:29:57
>569
ちょっと軽く評判を調べてみたんだけど、「実行する方法が書いてない」「やたら間違ってる」なんて話がチラホラあった。
1から読み直せとか、さんざん疑ってしまってスマン。
573:デフォルトの名無しさん
09/06/02 13:31:19
>>571 質問者はケータイみたいだし、AAでの返答はしないほうがいいんでね?
574:デフォルトの名無しさん
09/06/02 13:37:19
>>570
今のC++コンパイラはたいていCも扱える
575:デフォルトの名無しさん
09/06/02 13:39:07
やっぱりぼうようか
576:デフォルトの名無しさん
09/06/02 13:42:25
>>573
もともと >>571 に、真面目に答える気があるとも思えん。
577:デフォルトの名無しさん
09/06/02 14:08:56
これは酷い
URLリンク(labaq.com)
578:デフォルトの名無しさん
09/06/02 14:12:23
夏休みまだだよな?
579:デフォルトの名無しさん
09/06/02 14:13:22
年中夏休みですがなにか
580:デフォルトの名無しさん
09/06/02 14:25:09
VB、C#、C++だと.NETフレームワークの使い方って全然違ってくる?
.NETフレームワークの用途毎の使い方が載ってる本がほしいので
「.NET Frameworkプログラミングテクニック―for Visual Basic/C#」
を買おうかと思うんだが今使ってる言語はC++なんだ・・・
581:デフォルトの名無しさん
09/06/02 14:46:50
C#がいいお
582:デフォルトの名無しさん
09/06/02 14:51:25
>cat test.cpp
#include <iostream>
template <typename _T>
struct base { typedef size_t size_type; };
#ifdef CANNOTCOMPILE
template <typename _E>
struct A:base< A<_E> >{
#else
struct A:base< A >{
#endif
size_type s;
};
#ifdef CANNOTCOMPILE
typedef A<int> type;
#else
typedef A type;
#endif
int main(void)
{
type a;
a.s = 10;
return 0;
}
>g++ test.cpp
>g++ test.cpp -DCANNOTCOMPILE
test.cpp:10: error: ‘size_type’ does not name a type
test.cpp:10: note: (perhaps ‘typename base<A<_E> >::size_type’ was intended)
test.cpp: In function ‘int main()’:
test.cpp:20: error: ‘struct type’ has no member named ‘s’
頭がこんがらがってよくわからなくなってしまったのですが、
テンプレート版でsize_typeが継承されてないのはなぜでしょうか?
583:デフォルトの名無しさん
09/06/02 15:31:35
public base
584:デフォルトの名無しさん
09/06/02 15:31:42
マイクロソフトの最新版らしいので安心して使用してみます
べっかんこから見ているのでAAも安心です
では、おいとまさせて頂きます
585:デフォルトの名無しさん
09/06/02 15:33:26
おとこは黙ってVisual J
586:デフォルトの名無しさん
09/06/02 16:33:41
涙で>585が見えない
587:デフォルトの名無しさん
09/06/02 16:55:46
>>569
amazonの中身が読める所だけみたが
3ページの上の方に、プログラムの実行方法は
「処理系や実行環境によって異なりますから
みなさんが利用している処理系のマニュアルなどを参照してください」
と書いてある
まぁ、完全な初心者にはそもそも「処理系」って何?ってなるから
これじゃつまづくな
588:デフォルトの名無しさん
09/06/02 18:56:19
訳語の「処理」が大外れではないけど意味を採り難い語だからね
「処理乾酪」でヤバさ倍増な感
589:デフォルトの名無しさん
09/06/02 19:33:34
>>580
ライブラリ自体の使い方は同じだから、そういう目的ならVB/C#向けでも構わないと思う。
590:デフォルトの名無しさん
09/06/02 21:39:01
同じ名前のメンバ変数を持ってるクラスを継承しちゃったらどうなるの?
591:デフォルトの名無しさん
09/06/02 21:50:55
>>590
継承の仕方による。
多重継承ならスコープ解決演算子で名前解決することになる。
多重継承でなく、単一の継承を繰り返した場合は
派生クラスのメンバ変数の名前が基底クラスの
メンバで同名なものを「全て」隠蔽する。
これ以上は、実例を挙げるのがめんどくさいので、誰かよろしく。
592:デフォルトの名無しさん
09/06/02 23:34:12
すいません、VS2005で外部ライブラリをソースコードの中に記述して取り込む方法をど忘れしてしまいました、教えてください。
593:デフォルトの名無しさん
09/06/02 23:37:41
絶対ど忘れじゃねーだろwwwww
594:デフォルトの名無しさん
09/06/02 23:40:00
pragman
595:デフォルトの名無しさん
09/06/03 00:06:16
そうだった
#pragma comment(lib,"ws2_32.lib") これでよかった、thx>>593ぶた野郎
596:デフォルトの名無しさん
09/06/03 06:42:31
メモリ上のポインタをファイルポインタで開くことはできますか?
597:デフォルトの名無しさん
09/06/03 06:58:06
できません
598:582
09/06/03 16:54:38
よろしくお願いします。
599:デフォルトの名無しさん
09/06/03 17:59:15
すまん質問させて貰う
下のように定義した関数があり
void funcA( const char *pszA, const char *pszB, const char *pszC );
funcBで色々と処理した後に、funcB内でfuncAを呼ぶと
pszBとpszCのアドレスが変わってしまう
pszBに渡されるアドレスが本来0x1000だとすると、0x1200となる
デバッガで渡される直前の中身と、funcAで受け取った中身が違ってるのも確認済み
これの原因で考えられるのはメモリ破壊のみだろうか?
funcAとfuncBは別々のモジュールで実装されているんだが
WinMainを呼んで他に処理をする前に
すぐにfuncBを呼んでも、同様の現象が起きてる
そこの機能だけを一つに纏めて実験すると問題無く動作する
IDEはVC++2008 ExpressEdtion
正直訳が分からない。よろしくお願いします。
600:デフォルトの名無しさん
09/06/03 18:27:56
char const * (const char *)
const なcharへのポインタ。アドレスは変わっても良い。データはconst。
char * const
charのポインタがconst。アドレスはconst。データは変わってもよい。
char const * const (const char * const)
const な char のポインタがconst。アドレス、データ共にconst
601:599
09/06/03 18:51:25
自己解決した
構造が
main.cpp
dialog/dialog.cpp
shell/shell.cpp
resource/resource.cpp
という風にモジュール分けしてて
funcB内で別のモジュールの処理を呼ぶんだが
そのモジュール(funcB内で呼ぶ処理)自体は結合度が凄い低い
そのモジュールのヘッダに
#include "../hogehoge.h"
とアプリ全体の共通ヘッダをインクルードしたら解決した
そのモジュール自体、他の機能全く使わないのに
何でこれで解決するのかが分からないが…
スレ汚しすまない
602:デフォルトの名無しさん
09/06/03 18:56:43
>>601
アドレスは変わっても良いってコンパイラに伝えてるんだから、当然アドレスはいつか突然変化する。
今回変わらなかったのは単なる偶然。
603:599
09/06/03 19:17:16
例えば
void func( const char *pszHoge )
と定義して
char szHoge[] = "hogehoge";
szHogeのアドレスが0x1000として
func( szHoge );
とすると、func側のpszHogeは必ずしも0x1000ではないって事?
同じアプリのメモリ空間だから、アドレスが変わるっていうのは知らなかった
でも、今回のはアドレスも変わって、中身も変わってた
604:デフォルトの名無しさん
09/06/03 19:18:46
すまん、記述ミスがあった
×pszHogeは必ずしも0x1000ではないって事?
○pszHogeが指すアドレスは0x1000ではないって事?
605:デフォルトの名無しさん
09/06/03 19:23:39
>>600参照。
const char*だと、アドレスは変わる。
ついでに>>603だと宣言の時点でconstついてないから中身も変わる。
コンパイラによって保証されるのは、funcがpszHogeの中身を変えないことだけ。
606:599
09/06/03 19:45:18
>>605
有難う
ポインタで渡す限りアドレスは固定だと思ってたが、違うのか
今日アドレスと中身も変わったが、相当レアなケースに遭遇したみたいだ
>>600は凄い参考になった。有難う
607:デフォルトの名無しさん
09/06/03 19:53:48
ポインタ変数だろうがint型の変数だろうが関数に渡した値が勝手にかわってたらおかしいだろw
608:デフォルトの名無しさん
09/06/03 20:18:16
C++でゲーム開発してるんですが、敵ユニットや弾をリスト構造を用いて実装しました。
しかし、これらのオブジェクト同士の当たり判定の実装で詰まってしまっています。
解決策を知っている方が居たらお願いします。
それが駄目でも、二つの双方向リストを総当りで比較する方法などありましたらお願いします。
609:デフォルトの名無しさん
09/06/03 20:24:55
>>608
サンプルプログラムそこらじゅうに転がってるからてきとーに参考にすりゃいいだろ
総当りの方法って、先頭から順番に見ていきゃ言いだけだろ
610:582
09/06/03 22:23:15
VC++2008 EEで試してみたところ、どちらのバージョンでも問題なくコンパイルされてしまいました。
動作も期待(?)通りです。お騒がせいたしました。
611:デフォルトの名無しさん
09/06/03 22:25:31
だめだったのはやっぱBCC無料版だったりするんだろうか
612:デフォルトの名無しさん
09/06/03 22:38:02
>>609
まぁ、ゲームの場合速度が重視されるから単純な総当たりなんてやらないで
エリアを区切ってエリア単位で総当たりの判定するけどな。
613:デフォルトの名無しさん
09/06/03 22:42:02
まずすべてのオブジェクトの座標を確認して
適当な範囲ごとにソートして、それからその範囲内で当たり判定を行うってことかしら?
範囲の境界に位置するようなオブジェクトの場合はどうしたら…
614:デフォルトの名無しさん
09/06/03 22:42:52
>>613
どっちでもいい、処理を減らすことが目的だから
615:デフォルトの名無しさん
09/06/03 22:43:36
いや違うな
>>613じゃ根本的に間違ってる
616:デフォルトの名無しさん
09/06/03 23:35:00
for(n=1; n<=100; n++){
sum += n;
printf("1+2+...+100=%d\n",sum);
}
{ }をつけると、1、1+2、1+2+3、・・・、1+2+…+100までの答え、
{ }を外すと単なる1+2+…+100の答えが出るのですが、
これはなぜですか?
本には{ }内に1つの文しかないときには{ }を省略できるとだけ書いているのですが
ここで{ }を省略するかどうかというのは重要な問題だと思うのですが
617:デフォルトの名無しさん
09/06/03 23:39:11
{} を省略した場合は
for(n=1; n<=100; n++){
sum += n;
}
printf("1+2+...+100=%d\n",sum);
って書いてあるのと同じ意味になるから。
618:デフォルトの名無しさん
09/06/03 23:41:42
> 本には{ }内に1つの文しかないときには{ }を省略できるとだけ書いているのですが
だから、{ }がなければ
for(n=1; n<=100; n++){
sum += n;
}
printf("1+2+...+100=%d\n",sum);
とみなされる。
619:616
09/06/03 23:42:47
>>617
なるほど!
1つの文しかないときは{}を省略できるってのは、
条件式が1つの場合、って解釈してたんですが
printfも何もかも含むんですね!わかりやすい説明ありがとうございます
620:616
09/06/03 23:44:20
>>618
ありがとうございます!
621:デフォルトの名無しさん
09/06/03 23:44:21
関数で値渡しをするときに配列の要素全てを渡すことは出来ますか?
それともそれぞれ引数に指定しないとダメでしょうか
622:デフォルトの名無しさん
09/06/03 23:47:37
;が文の終わり。日本語の句点のような存在。
だからsum += n;で1つの文。
{}はその例外で、囲った部分全体で1つの文になる。 すまん話し過ぎたか。
623:デフォルトの名無しさん
09/06/03 23:51:15
>>621
C++ なら vector を使えばいいです。
Cでは直接配列を値渡しすることはできないので、
構造体の中に入れて、構造体を値渡ししましょう。
624:デフォルトの名無しさん
09/06/03 23:56:06
>>623
アリガトゴザイマす
625:デフォルトの名無しさん
09/06/04 04:23:23
初心者です。
Cの参考書でメモリ関連の事が良く出てきます。
バイトとかビットとか2進数、10進数とか出てきますけど、これらはスルーしても
良いんでしょうか?
HTMLで例えるなら#ffffffみたいな感だったので・・・。
これは覚えたほうがいいんでしょうか。
わけわからないんですが
626:デフォルトの名無しさん
09/06/04 04:54:02
スルーしちゃらめぇ。
627:デフォルトの名無しさん
09/06/04 06:24:57
>>625
C言語はそう言うのを扱うのが醍醐味というか、
それが分からないと全然まともに使えないと思われる。
理系なら分かるでしょ?がんばれ!
628:デフォルトの名無しさん
09/06/04 07:46:11
授業で言うなら、最初の3回くらいまでは知らなくてもなんとかなりそうな気はするけど
せいぜいそれくらいだよなあ。
629:デフォルトの名無しさん
09/06/04 17:39:26
C++の質問です。
あるクラスの、あるメンバ関数からしか参照されないことが分かっている変数があるとします。
この関数が呼び出されたあとも、変数の内容を保持したい場合は、どのようにするのがスマートでしょうか?
・メンバ変数にする
→ 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?
・呼び出し側で変数を用意しておき、引数でその都度渡す
→ 呼び出し側の手間が増える。数が多いとかなり大変。
・staticを付ける
→ オブジェクトごとに個別の値を持てなくなる
630:デフォルトの名無しさん
09/06/04 17:42:17
そのときの変数の性質や役割による。 手間隙とかは関係ない
631:デフォルトの名無しさん
09/06/04 17:50:18
ああごめん、途中で質問を書き直したら
頓珍漢な内容になってました。
以下の3パターン以外に方法はないのでしょうか、で。
思いついた3つのうち、いずれの方法を取るにしても何らかの欠点があるので。
632:デフォルトの名無しさん
09/06/04 17:57:18
制約がないなら好きにすればいい
633:デフォルトの名無しさん
09/06/04 17:58:41
>>629
・メンバ変数にする
→ 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?
これがやっぱり一番自然でしょ。
と俺は思う。
いくつあるのかしらないが、そんなに多いならクラス内クラスを作るとかすれば?
634:デフォルトの名無しさん
09/06/04 17:58:43
・関数オブジェクトを用いる。
635:デフォルトの名無しさん
09/06/04 18:08:35
C言語勉強中なんですが、宿題で
「ファイル名を自分で設定しそのファイルに、EOFを行うまで
スペース区切りの二つの整数を何回でも入力できるようにし、
それをファイルに改行して記録しなさい」
というのがあり、
#include <stdio.h>
int main()
{
int a,b;
FILE *fp;
char name[100];
printf("ファイル名を入力してください\n");
scanf("%s",name);
fp=fopen(name,"w");
printf("数値を入力してください\n");
while(scanf("%d %d",&a,&b)!=EOF){
scanf("%d %d",&a,&b);
fprintf(fp,"%d,%d\n",a,b);
}
fclose(fp);
return(0);
}
というプログラムを作ったんですが、なぜか
数値を入力した際に記録される時とされない時があります。。。。
どなたか解決策を教えていただけないでしょうか?
636:デフォルトの名無しさん
09/06/04 18:36:32
スレの皆様に質問です。
8ビットbitmapファイルを読み込み、各ピクセルに演算を加え、別ファイルとして出力するプログラムを作っています。
演算結果をint型の変数ifooに格納し、unsigned char型にキャストしてputしています。
ifooがunsigned char型の範囲外の値の時は、範囲の端の値を代入しています。
//fin,foutのファイル上の位置は適切な場所にあるとする
for (int y=0 ; y<height ; ++y){
for (int x=0 ; x<width ; ++x){
int ifoo = fin.get()*A+B;
if(ifoo<0) ifoo=0;
if(ifoo>255) ifoo=255;
fout.put((unsigned char)ifoo);
++i;
}
//bmpファイルの幅は4の倍数ピクセルとする
}
先輩が組んだプログラムはこれの2倍以上速いのですが、AとBがハードコードされていて
ソースコードは失われ、先輩本人は行方知れずです。。。
そのためA,Bを引数で与えられるように、イチから再作成しています。
1000x1000pxのBMPを一度に数千枚~数万枚単位で処理するため
このループ部分をもっと高速化したいです。何か良いアイデアは無いでしょうか。
ちなみにこの部分以外に目立ったループ箇所は無いです。
637:デフォルトの名無しさん
09/06/04 18:48:13
>>636
1. ループの中で ファイルIOするのは遅すぎるので、
一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
(全部読み込めないほどメモリが少ないのなら、一部ずつとか)
2. SIMDで複数pixelを同時に処理するか、OpenGL or DirectXのpixelシェーダ書く
638:デフォルトの名無しさん
09/06/04 20:50:01
>>637
早速ありがとうございます。とりあえず1を試してみます。
環境書き忘れて申し訳なかったですが、Windowsのプロンプトから呼ぶプログラムをgccで作っています。
2の手法はVisualStudio等を使って行う方法でしょうか?
そのうち勉強してみたいと思います。
639:デフォルトの名無しさん
09/06/04 20:56:08
>>638
インラインアセンブラ
640:デフォルトの名無しさん
09/06/04 20:57:00
と外部ライブラリ
641:デフォルトの名無しさん
09/06/04 21:17:36
usingを解除することはできますか?
namespace {
using foo::CFoo;
class CBar {
public:
void hoge(CFoo);
};
}
みたいにやってるんですが副作用があるのかどうか気になってます
642:デフォルトの名無しさん
09/06/04 21:21:29
>>638
最近だとインラインアセンブラのほかに<emmintrin.h>なんかの組込関数という手もある。
いずれにせよgccでも使える。
643:デフォルトの名無しさん
09/06/04 21:23:37
まぁまずないとは思うけど最適化オプションの存在は知ってるよね?
644:デフォルトの名無しさん
09/06/04 21:37:23
>>635
while(scanf("%d %d",&a,&b)!=EOF){
fprintf(fp,"%d,%d\n",a,b);
}
としてみるべし
645:デフォルトの名無しさん
09/06/04 21:40:54
デートは家でまったりしたいのですが
女性から見ればNGですか?
646:デフォルトの名無しさん
09/06/04 21:43:37
Rubyを教えてくれるならOK
647:デフォルトの名無しさん
09/06/04 21:43:39
>>645
死ね
648:デフォルトの名無しさん
09/06/04 21:44:20
>>645
誤爆サーセン
649:636
09/06/04 22:05:38
>>639
アセンブラはマイコンで少々やったことがあるので挑戦してみます。
ただ後年に後輩が読めなそうなので、教授が許してくれなそう・・・orn
>>>640
外部ライブラリというと、そういう処理が高速にできる
ライブラリを他から持ってきちゃえということでしょうか?
>>643
恥ずかしながら知らなかったです。
軽くググってみて、とりあえず -O3 をつけて変化を観察することにします。
プログラムを大学に置いてきてしまったので、有意な変化があれば明日報告します。
皆様アドバイス有難う。
650:デフォルトの名無しさん
09/06/04 22:46:58
あと、流行りの並列処理も最近のコア沢山なCPUには効くぞ。
gccならOpenMPが使えるし。
651:636
09/06/05 14:13:30
>ループの中で ファイルIOするのは遅すぎるので
>一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
new で uint8(unsigned char)型の readbuf,writebuf を、int型のcalcbufを確保し
以下のように書き換えたところ、>>636より約6倍も高速化しました。
fin.read((char*)readbuf,width*height);
int i=0;
for( int y=0 ; y<height ; ++y){
for( int x=0 ; x<width ; ++x){
calcbuf[i] = readbuf[i]*A+B;
if(calcbuf[i]<0) writebuf[i]=0;
else if (calcbuf[i]>255) writebuf[i]=255;
writebuf[i] = (uint8)calcbuf[i];
++i;
}
//bmpファイルの幅は4の倍数ピクセルとする
}
}
fout.write((char*)writebuf,width*height);
○vector<uint8> foo でバッファを確保した場合 read()にchar* が渡せないからダメ。
という判断から、バッファはnewで確保しました。
○ループ中の2回のif文をelse if でまとめ、比較演算回数の減少を図りました。
(気休め程度だと思ったので、これ単体の効果は未計測)
「先輩と互角」という目標を軽くクリアし、先輩の倍以上高速なプログラムになりました。
最適化オプション、インラインアセンブラ、並列化等もこれから試してみたいですが
目標クリアしたためとりあえず質問は終了させて頂きます。
スレの皆様ありがとうございました!
652:デフォルトの名無しさん
09/06/05 14:20:51
アセンブラ化は効果なし。
もっとも時間かかるのはディスクアクセス。
Windowsであれば、Noバッファリングで読み込んでみて。
バッファリングありより倍以上の速度になる。
あと、一度にたくさん読み込んでも逆に遅くなる。
100M読み込むより、4Mや2Mずつのほうが速い。
データが仮想メモリ(HDD)に移動してしまう可能性が高い。
自分の環境では4M以上は速度は上がらなかった。
653:デフォルトの名無しさん
09/06/05 14:24:21
ちなみに一度に一斉に書くのも遅くなる。
メモリ不足になるという理由で。
入出力バッファは、1M~4Mくらいにして、使い回すのが吉。
654:デフォルトの名無しさん
09/06/05 14:27:13
並列化もきっと意味ないだろうなぁ
655:デフォルトの名無しさん
09/06/05 14:27:21
calcbuf[i] = readbuf[i]*A+B;
if(calcbuf[i]<0) writebuf[i]=0;
else if (calcbuf[i]>255) writebuf[i]=255;
writebuf[i] = (uint8)calcbuf[i];
↓
tmp = readbuf[i] * A + b;
if (tmp < 0) tmp = 0;
if (tmp > 255) tmp = 255;
writebuf[i] = (uint8) tmp;
656:デフォルトの名無しさん
09/06/05 14:29:14
2008-04-30 大容量ファイルI/Oの効率について 其の弐
FILE_FLAG_NO_BUFFERING 指定のないReadFile() -赤線-
リニアにアクセス速度が低下していく。大容量ファイルのリードを行うことに対して
Windows の I/O バッファリングアルゴリズムにパフォーマンスバグがあると思われる。
FILE_FLAG_NO_BUFFERING を指定すれば回避できるとはいえ、
コンシューマ市場向けにもTBクラスのストレージが出回ってる昨今、これは致命的な問題だと思う。
FILE_FLAG_NO_BUFFERING 指定のあるReadFile() -緑線-
2GiB の読み込みに概ね12-13秒台の高速でコンスタントなアクセス速度を誇る。(・∀・)イイ!!
URLリンク(img.f.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
657:デフォルトの名無しさん
09/06/05 14:34:48
bmpではなくjpgなら、アセンブラ化は効果あるだろけど
bmpはサイズがでかいからな。
処理内容が複雑 (ディスク読み込み時間と比べて速すぎない) なら並列化は効果あるだろけど
単純なものをスレッド化すると、スレッドの呼び出し時間がかかり、余計に鈍くなり得る。
658:デフォルトの名無しさん
09/06/05 19:59:01
implementationは実装と訳せばいいのですか?
659:デフォルトの名無しさん
09/06/05 20:33:17
>>656
バッファリングなしの非同期読み取りだともう少し速くなるのだろうか?
660:デフォルトの名無しさん
09/06/05 21:24:22
>>658
そうです^^
661:658
09/06/05 21:31:46
>>660
ありがとうございます。
662:デフォルトの名無しさん
09/06/06 01:54:30
関数を呼びまくるとスタックオーバーフローを起こします。
スタックを増やす以外にどんな解決方法がありますか?
663:デフォルトの名無しさん
09/06/06 02:01:52
関数オブジェクトをヒープに置く。
664:デフォルトの名無しさん
09/06/06 02:23:44
>>662
再帰呼び出しが原因ならば、アルゴリズムを工夫して再帰が深くならないようにする。
そうでなければ、ローカル変数域を減らす。特にバッファ。
665:デフォルトの名無しさん
09/06/06 05:33:46
配列の要素の組み合わせを出力したいのですが、
実装をどのようにするか迷っています・・・
配列
int array[10] = {0,1,2,3,4,5,6,7,8,9};
出力
{0}, {1}, {2}, {3}... {9}
{0,1}, {0,2}, {0,3}... {8,9}
{0,1,2}, {0,1,3}... {7,8,9}
...
{0,1,2,3,4,5,6,7,8,9}
このような出力を実現するにはどのようにコードを組めば効率が良いでしょうか?
666:デフォルトの名無しさん
09/06/06 05:41:25
ヒント:二重ループ
667:デフォルトの名無しさん
09/06/06 06:29:22
なんだよそのヒントw
>>665は一応実装はできるけど
最適な実装ロジックを聞いてるんでしょ。
668:デフォルトの名無しさん
09/06/06 06:47:20
いや二重ループが一番のヒントだろ
669:デフォルトの名無しさん
09/06/06 07:25:49
>>665
どういう規則で出力するのかさっぱりわからん。
670:デフォルトの名無しさん
09/06/06 07:37:10
桁ごとに、組み合わせを順番に表示してくんだろw
671:デフォルトの名無しさん
09/06/06 07:56:47
>>665
効率はしらんが、適当に書いてみた
#include <stdio.h>
void combi(int n, int pos, int digit, int *array)
{
int i, j;
if(pos==digit) {
printf("{%d", array[0]);
for(i=1; i<digit; i++) printf(",%d", array[i]);
putchar('}');
} else {
for(i=n; i<=9; i++) {
array[pos] = i;
combi(i+1, pos+1, digit, array);
}}}
int main(void)
{
int i, array[10];
for(i=1; i<=10; i++) combi(0, 0, i, array);
return 0;
}
672:デフォルトの名無しさん
09/06/06 08:23:21
printfのfはformattedのfだと聞いたことがありますが、
そもそもformattedってどういう意味ですか?
辞書を引いてもC/C++に適した訳語が見つからなくて。。。
673:デフォルトの名無しさん
09/06/06 08:30:09
書式に則った
674:デフォルトの名無しさん
09/06/06 08:31:42
>>673
何の書式に則ったってことですか?
自分で指定した"hoge%spi%dyo"だとかそういうことでしょうか?
675:デフォルトの名無しさん
09/06/06 08:34:17
どう考えてもそれしかないと思う。
676:デフォルトの名無しさん
09/06/06 08:38:52
>>675
ありがとうございました。
677:デフォルトの名無しさん
09/06/06 08:45:47
>>665
main()
{
int array[10]={0,1,2,3,4,5,6,7,8,9};
int i,f,set;
for(set=1;set<=0x3ff;set++)
{
putchar('{');
for(i=0,f=0;i<10;i++)
if(set & (1 << i)) {
if(f) putchar(',');
printf("%d", array[i]),f=1;
}
putchar('}');
}
}
678:デフォルトの名無しさん
09/06/06 10:20:23
>>677 これは良いな。出力順序が変わるのを何とかしようと頑張ってみたが俺には無理だった
679:デフォルトの名無しさん
09/06/06 15:57:09
クラス内で動的確保した文字列に、ポインタ渡しでのアクセスは出来ませんか。
680:デフォルトの名無しさん
09/06/06 15:59:10
>>679
できます
681:デフォルトの名無しさん
09/06/06 16:04:03
これができません。なぜでしょうか。
#include <iostream>
#include <string>
using namespace std;
class A {
public: char *ch;
A() { ch=new char [10]; strcpy(ch,"aaa"); }
void test(char *p){ p=ch; } };
main () {
A x; char *p;
x.test(p);
cout<<p;
}
682:デフォルトの名無しさん
09/06/06 16:06:26
自己解決しました。 test(char* &p)にしたら良かったです。
683:デフォルトの名無しさん
09/06/06 16:11:36
char* &pって気持ち悪いなchar*& pがクール
684:デフォルトの名無しさん
09/06/06 16:16:08
いやむしろ、char *&p の方がクール。
理由は宣言構文の仕様上、char が specifier で *&p が declarator だから。
char* p; のように書く人は p と q をポインタにしたいとき
char* p, *q; のように非対称に書いたりするので混乱必至。
っていうか宗教^^