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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
http://pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/
スレを勃てるまでもないC/C++の質問はここで 7
http://pc11.2ch.net/test/read.cgi/tech/1232983248/
スレを勃てるまでもないC/C++の質問はここで 8
http://pc12.2ch.net/test/read.cgi/tech/1235921779/
スレを勃てるまでもないC/C++の質問はここで 9
http://pc12.2ch.net/test/read.cgi/tech/1240022781/
2デフォルトの名無しさん:2009/05/14(木) 20:52:06
これはポニーテールがなんちゃらかんちゃら
3デフォルトの名無しさん:2009/05/14(木) 21:15:47
std::invalid_argument
は「意味的に正しくない引数に対する例外」ということなのですが、
この「意味的」という意味が分かりません。
具体的にどのような場合が「意味的に正しくない」のでしょうか?
4デフォルトの名無しさん:2009/05/14(木) 21:36:12
例えば引数で何月かという値をもらうとする。
1-12以外が渡されたら、意味的におかしいだろ?
53:2009/05/14(木) 21:48:32
>>4
ありがとうございます。

1-12以外が渡されたら、それは想定範囲外だから std::out_of_range であると思っていました。
6デフォルトの名無しさん:2009/05/15(金) 02:32:50
                          刀、           , ヘ
                  /´ ̄`ヽ /: : : \_____/: : : : ヽ、
              ,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
               /: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
     ,. -──「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
    /: :.,.-ァ: : : |: : : : : : : : :    :\: : : : :: : : :ヽ  \   /: : : :/
    ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i  / /: : : : :/
     /: :     ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/  /: : : : :/         、
.    /: : /  . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : |  /: : : : :/            |\
   /: : ィ: : : : :.i: : |   \!___/ ヽ:: : : : : : :\|:.:.:.:/:!  ,': : : : /              |: : \
   / / !: : : : :.ト‐|-    ヽ    \: : : : : l::::__:' :/  i: : : : :{              |: : : :.ヽ
   l/   |: : :!: : .l: :|            \: : : l´r. Y   {: : : : :丶_______.ノ: : : : : :}
      l: : :l: : :ト、|         、___,ィ ヽ: :| ゝ ノ    '.: : : : : : : : : : : : : : : : : : : : : : /
      |: : :ト、: |: :ヽ ___,彡     ´ ̄´   ヽl-‐'     \: : : : : : : : : : : : : : : : : : イ
        !: :从ヽ!ヽ.ハ=≠' , ///// ///u /           ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
      V  ヽ|    }///  r‐'⌒ヽ  イ〉、
              ヽ、______ー‐‐' ィ´ /:/:7rt‐---、       こ、これは>>1乙じゃなくて
                  ィ幵ノ ./:/:./:.! !: : : : :!`ヽ     ポニーテールなんだから
              r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\   変な勘違いしないでよね!
               /: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
7すげーどーでもいい質問:2009/05/15(金) 03:23:23
class Hoge {
private:
int h;
public:
Hoge(int h) : h(h) {}
};
俺、上みたいなとき、いつも仮引数の名前とメンバ変数の名前同じにしてるんだが、
(特に問題なく動くので)そういうコード見たことない。混乱するから?それともたまたま
動いているだけで何か問題あるの?
俺にとっては毎回変数と違う名前を思いつく方がよっぽど紛らわしいんだが。
8デフォルトの名無しさん:2009/05/15(金) 03:24:23
始めて3日の初心者です。
初項1、公比1/3の等比数列の4項までの和を求めたいのですが
(もちろん普通に計算すればできますが)
どうにも上手くいかなくて困っています。助けてください。
自分が書いたのはこんな感じです。


#include <stdio.h>
#include <conio.h>

int main(void ){
int l;
double m,n;
l=0;
m=0;
n=0;
for(l=0;l<5;l++) {
m=1/3^l;
n=n+m;
}
printf("%f",n);
getch();
return 0;
}

どこがいけないのかさっぱりわかりません。どなたかご指摘お願いします。
9デフォルトの名無しさん:2009/05/15(金) 03:38:03
>>8
C言語ではべき乗演算子はない
^はXOR演算子

だから m = 1 / pow(3, l); とすればいいはず
10デフォルトの名無しさん:2009/05/15(金) 03:40:57
あ、#include <math.h> を忘れずにな

powがdouble型を返す事を前提にしてるんで
そうしないと整数÷整数という意味のない事をする事になってしまう
11デフォルトの名無しさん:2009/05/15(金) 04:09:31
>>8
問題あるよ。
その問題とはお前が低脳ってこと
普通の脳なら、int m_h;とかする。
12デフォルトの名無しさん:2009/05/15(金) 04:50:04
>>11
おまえ番号ちがうくらいだからもっと低能だな
13デフォルトの名無しさん:2009/05/15(金) 04:52:48
m_って何の略?
14デフォルトの名無しさん:2009/05/15(金) 05:25:09
staticの意味を調べコードを書いたのですがコンパイルエラーになります
どこがおかしいのでしょうか

#include <iostream>
class Test {
public:
static int x;
int y;
Test() {}
~Test() {}
void show();
static void s_show();
};

void Test::show() {
std::cout << "y=" << y << std::endl;
}

void Test::s_show() {
std::cout << "x=" << x << std::endl;
}

int main() {

return 0;
}
15デフォルトの名無しさん:2009/05/15(金) 05:28:03
int Test::x; が抜けてる
16デフォルトの名無しさん:2009/05/15(金) 05:45:40
#include <iostream>
class Test {
public:
static int x;
int y;
Test() {}
Test(int i = 0) : y(i) {}
~Test() {}
void show();
static void s_show();
};

int Test::x = 1;

void Test::show() {
std::cout << "y=" << y << std::endl;
}

void Test::s_show() {
std::cout << "x=" << x << std::endl;
}

int main()
{
Test t(2);

t.show();
t.s_show();
}
17デフォルトの名無しさん:2009/05/15(金) 06:05:17
えっグローバル変数とstatic変数は宣言と同時に自動的に0に初期化されるのではないのでしょうか?
例)
#include <iostream>
int global;
int main() {
static int staticint;
int local;
std::cout << local << std::endl;
std::cout << global << std::endl;
std::cout << staticint << std::endl;
return 0;
}
(結果)
-1881141193 ←ゴミ
0 ←きちんと0で初期化されてる
0 ←きちんと0で初期化されてる
18デフォルトの名無しさん:2009/05/15(金) 06:09:29
>>17
クラスのstatic変数は例外です
というのもクラスのインスタンスを複数作ってもstatic変数の
実体は一つしか作られない上にコンストラクタでも初期化不可能
なため、どこかで定義してやる必要があります。

もちろん = 1 を省略すれば 0 で初期化されます。
1917:2009/05/15(金) 06:23:33
>>18
わかりやすい説明ありがとう。
20デフォルトの名無しさん:2009/05/15(金) 10:03:13
>>7
メンバー変数と仮引数と局所変数を区別するプリフィックスをつければいいんじゃないかな。同じ意味で記憶クラスが異なる変数を人目で見分けられるし、名前を増やさなくて済む。
例えば、メンバーはm、仮はkとか何とか

class Hoge {
private:
int mh;
public:
Hoge(int kh) : mh(kh) {}
};
21デフォルトの名無しさん:2009/05/15(金) 10:08:37
>>7
私は小さいコンストラクタに限り、同じ名前でやってるよ。まぁ、別に問題ないな。

>>10
解釈がおかしい。プロトタイプ宣言のないpow()を使った場合、引き数のそれぞれがintのまま引き渡されてしまいおかしなことになる。
又、戻り値もdouble値として戻されるのにintとして受け取ろうとするからやはりここでもおかしなことになる。

x86みたいにintとdoubleで格納するレジスタが異なるような環境の場合、一見巧く動くから厄介だ。
22デフォルトの名無しさん:2009/05/15(金) 10:14:13
等比数列で前の数を使わないでいちいちpowするような間抜けなやり方なんてどうでもいいだろw
23デフォルトの名無しさん:2009/05/15(金) 12:22:26
自作のヘッダファイルは二重にインクルードしてしまうと再定義のエラーになりますが、
よくよく考えると<iostream>のような標準ヘッダはインクルードガードしないで何度もインクルードしているような
気がしますが、なぜエラーにならないのでしょうか?
24デフォルトの名無しさん:2009/05/15(金) 12:29:45
>>23
標準ヘッダもインクルードガードしてるだろ。
2523:2009/05/15(金) 12:43:11
>>24
あ、そっか。独自のヘッダファイルでインクルードガードするんじゃなくて、
標準ヘッダ側にインクルードガードが書かれてるのか。ところで標準ヘッダファイルを見た事がないのですが、
標準ヘッダってどこのディレクトリにあるんでしょうか?iostreamでCドライブ検索したけどヒットしませんでした。
Visual Studio2008使ってます
26デフォルトの名無しさん:2009/05/15(金) 13:13:44
includeの下。
2723:2009/05/15(金) 13:19:27
やっぱりなかった。iostreamもistreamもostreamも。
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include
ですよね!?
28デフォルトの名無しさん:2009/05/15(金) 13:24:30
#include <iostream>で右クリックして
ドキュメントを開くを選んで
開いたらタブで完全パスのコピー
2923:2009/05/15(金) 14:09:23
こんな機能あったんだ。。
ヒットしなかったのは違うドライブにインストールしてたからだった。。
大変失礼しやした。ありがとー
30デフォルトの名無しさん:2009/05/15(金) 14:39:22
ttp://www.geocities.jp/ky_webid/cpp/language/021.html
ここにインライン関数はソース側に記述できないと書いてあるのですが(ヘッダに書けってことですよね)、
試したらソースファイル(cpp)にインライン関数を書いてもエラーになりませんでした。
僕の読み違いでしょうか?
31デフォルトの名無しさん:2009/05/15(金) 16:08:38
>>30
>僕の読み違いでしょうか?
いいえ、間違いです。
32デフォルトの名無しさん:2009/05/15(金) 16:33:30
>>31
どっちなんだよww
33デフォルトの名無しさん:2009/05/15(金) 16:48:14
「インライン関数はソース側に記述できない」のは正しいが、「エラーにならない」のも事実。
従って「読み違い」ではなく、「検証方法の間違い」だ。
34デフォルトの名無しさん:2009/05/15(金) 17:22:25
共用体ってどんな時に使うのでしょう?
メンバの値がどれも同じになるなら、変数と同じ気がするんですが…
35デフォルトの名無しさん:2009/05/15(金) 17:37:31
メモリが足りない時等にに変数を共有してメモリ節約したい時
36デフォルトの名無しさん:2009/05/15(金) 17:44:56
すいません、わかりません…。
同じデータだけどデータ型が頻繁に変わるゆうな時に使う、という認識ですか?

37デフォルトの名無しさん:2009/05/15(金) 17:50:18
変数で考えるな
メモリで考えろ
38デフォルトの名無しさん:2009/05/15(金) 17:52:37
>>36
>同じデータだけどデータ型が頻繁に変わるゆうな時に使う、という認識ですか?
データ型が変わるという認識は間違い。
例えば
2つの変数char cとint iに対して同時にアクセスしないなら
それをunionにすれば同じメモリ上に配置できるから節約できるでしょ?
ただしそのunionの値を読み出す時は
どちらの値が入っているかに気を配りながら使う手間が必要。

39デフォルトの名無しさん:2009/05/15(金) 17:53:06
#include <stdio.h>

typedef struct
{
  int sampling_rate;
}AAC;

typedef struct
{
  int sampling_rate;
}AC3;

typedef struct
{
  union{
    AAC aac;
    AC3 ac3;
  }u;
}SOUND;

int main(void)
{
  SOUND sound;
  // なにかの処理
}
みたいな?
4038:2009/05/15(金) 17:53:18
>>36
これでもわからなければ諦めろ
つーかググれ。
41デフォルトの名無しさん:2009/05/15(金) 17:56:48
ありがとうございます!よくわかりました
42デフォルトの名無しさん:2009/05/15(金) 18:17:13
こんなのはありそうだね。
typedef union {
struct foo {
int x;
int y;
} s;
int array[sizeof(struct foo)];
} coord_t;
43デフォルトの名無しさん:2009/05/15(金) 18:28:25
C99のソースを書く奴は単なるオナニー
44デフォルトの名無しさん:2009/05/15(金) 18:45:31
unionは二分木の実装で見かける気がする。
45デフォルトの名無しさん:2009/05/15(金) 20:16:52
通信では、普通に使う
46デフォルトの名無しさん:2009/05/15(金) 20:23:11
クラスを配列にすることはできますか?
47デフォルトの名無しさん:2009/05/15(金) 20:42:34
できます
48デフォルトの名無しさん:2009/05/15(金) 20:50:55
C言語で、linux のioポートのアクセスを行う実装を行いたくて
#include <linux/types.h>
#include <linux/config.h>
#include <asm/system.h>
include <asm/io.h>
これらのファイルがないと怒られます、どうしたらいいのでしょうか?
49デフォルトの名無しさん:2009/05/15(金) 21:03:31
Redhat系なら、kernel-headersとかその辺のパッケージを入れる。
それ以外なら Linux板で聞け。
50デフォルトの名無しさん:2009/05/15(金) 21:15:04
>>49
Thx
slacklwareなんでlinux板で聞きます、因みにkernel-headersはインストールしているのですが
カーネルを 2.6.29.3に上げているためだと思います、 2.6.29.3用のkernel-headersをインストールしないといけないのでしょうかね?
51デフォルトの名無しさん:2009/05/15(金) 21:15:52
>>47
ありがd
クラス覚えた手だけどこりゃ便利そうだ
52デフォルトの名無しさん:2009/05/15(金) 21:18:50
プログラム板から、誘導されました
C言語で、linux のioポートのアクセスを行う実装を行いたくて
#include <linux/types.h>
#include <linux/config.h>
#include <asm/system.h>
include <asm/io.h>
これらのファイルがないと怒られます、どうしたらいいのでしょうか?
因みに、鳥はslacklware12.2でkernel-headersはインストールしているのですが
カーネルを 2.6.29.3に上げているためだと思います、 2.6.29.3用のkernel-headersをインストールしないといけないのでしょうか?
53デフォルトの名無しさん:2009/05/15(金) 22:52:38
C言語で一つの処理?を終えるまでにかかる時間を計算する方法ってありますか?
CPUが100Mhzだとすると、
たとえば、*buf = 1000 とか一つ処理するのにどれくらいかかりますか?
54デフォルトの名無しさん:2009/05/15(金) 22:54:14
1/100000000秒じゃね?
55デフォルトの名無しさん:2009/05/15(金) 22:57:17
>52
J 釣りか ?
それくらい解決できないようではC言語を使わないでもらいたい。
昔の人は考えた、無ければ作ればいいと。
findでgrepのviだろjk.
56デフォルトの名無しさん:2009/05/15(金) 23:01:31
>>53
コンパイルしてアセンブラのコードを見ないと。
最近のCPUは複雑だから、それでも難しいと思うけど。
57デフォルトの名無しさん:2009/05/15(金) 23:10:21
>>56
アセンブラのコードみたらわかるというわけでもないのですね

そういうのって計算できないものなのかな
おおよその計算ができるプログラムなりあったりしないのでしょうか?

CPU作ってる人たちはそういうの計算してるんですよねやっぱり
58デフォルトの名無しさん:2009/05/15(金) 23:20:43
大体は判るよ。CPUが指定されているのならね。
アセンブラの判る人間なら、この処理はこんなコードに落ちるから、何クロックとか推測出来る。
同じ周波数でもCPUによってかかる時間が違うから単に100MHzとか言われても答えようがない。

もっと問題なのは
*buf = 1000;
なんてのはコンパイラの最適化でどうなるか判らないことだ。
59デフォルトの名無しさん:2009/05/15(金) 23:22:09
>>57
10年くらい前に読んだアセンブラの本にはVTuneってツールで
プロファイルしながら、アセンブラのコードを最適化する例が
乗ってたよ。
ググったら、今でも売ってるみたいなんで、そういうツールを
使えばわかるんじゃないの?
60デフォルトの名無しさん:2009/05/15(金) 23:22:27
最速のケースと、最悪のケースは計算できるだろうけど。
あとは、CPUのシミュレータがあるからね。
61デフォルトの名無しさん:2009/05/15(金) 23:24:21
>>58
Mhz以外に何がわかればいいのでしょうか?

計算方法としては
Cのソースをコンパイル→アセンブラ見る→CPUから計算? という感じでしょうか
62デフォルトの名無しさん:2009/05/15(金) 23:26:20
>>58
たとえ同じCPUでも、その前のコードによってキャッシュやパイプラインの状況が
異なってくるから何とも言えないというのはある。
63デフォルトの名無しさん:2009/05/15(金) 23:28:09
>>62
大体はわかりませんか?

たとえば10000回ループさせたとして
これくらいだと、100ms〜200msかかるとか
64デフォルトの名無しさん:2009/05/15(金) 23:28:58
>>63
それかなりの精度の読みを要求してるなw
65デフォルトの名無しさん:2009/05/15(金) 23:29:43
あと、いい加減sageろ
66デフォルトの名無しさん:2009/05/15(金) 23:32:08
>63
大体は判るって言ってるだろうが。
日本語に不自由してるのか?

アセンブラ勉強しろ。その範囲で判る範囲の推測は出来る。
それより実測した方が早いがな。
67デフォルトの名無しさん:2009/05/15(金) 23:36:45
大体は判る

その大体すら教えてくれないのにそういわれても
68デフォルトの名無しさん:2009/05/15(金) 23:39:53
>>67
CPUすら教えてくれないのにそう言われても。
69デフォルトの名無しさん:2009/05/15(金) 23:40:42
>>63
実測するのが早い。
実測できないのなら、MIPS値がわかれば一秒間に実行できる大体の命令数がわかる。
70デフォルトの名無しさん:2009/05/15(金) 23:42:36
環境によって変わり過ぎる
ハードウェア等の動かない前提のものならともかく、
OSやサービスパックの有無、画面のサイズなどの描画関係やアンチウィルスソフトなんかも走ってればかなり差も出る
ってか、実測すれば??
71デフォルトの名無しさん:2009/05/15(金) 23:47:19
そのためのプロファイラだろ
72デフォルトの名無しさん:2009/05/15(金) 23:50:22
アセンブラで局所的にパフォーマンスどうこうって話をしてるのに、
サービスパックの有無とか安置ウイルスソフトどうこうとかって話はないだろ。
73デフォルトの名無しさん:2009/05/15(金) 23:54:23
だよねw
74デフォルトの名無しさん:2009/05/16(土) 00:01:32
例えアセンブラでも、>>67の書いた情報だと、
「全フットプリント合計の最悪値以下」しか答えようがないでしょ。
キャッシュやらパイプラインやら環境要因/外的要因が多すぎる。

組み込み用のMMUもないCPUを割り込み禁止で使えば、
好きなだけアセンブラから完全な精度で値を割り出せるよw
75デフォルトの名無しさん:2009/05/16(土) 00:50:28
みんなわかりきってて言及を控えた事だから書かなくていいよ
76デフォルトの名無しさん:2009/05/16(土) 01:15:54
unionの話ちょっと前に出てるけど
unionをどんな時に使ってるんだ?
77デフォルトの名無しさん:2009/05/16(土) 08:09:09
上にも出てたが、最有力はネットワークのパケット関連だろ。
あとは特定のファイル形式のヘッダとか。
俺は組み込みやらんから知らないけど、メモリの制約が大きい環境では勿論メモリ節約の意味で使うだろうし。
78デフォルトの名無しさん:2009/05/16(土) 13:17:22
インストール完了して、ライブラリなどの参照先を全て設定してあるのですが
コンパイルで3回ほどやったら固まったり
ビルドですぐに固まったりして 何度も強制終了して困っています。

何か解決策はありますでしょうか?

使用 VC++6.0
OS WindowsXP Proffesional
メモリ 4GB
CPU Core2 Duo 3GHz

です。
79デフォルトの名無しさん:2009/05/16(土) 13:50:07
それは C/C++ の質問とは言わん。が、まあいい。
>使用 VC++6.0
これを新しくするか
>OS WindowsXP Proffesional
これを古くする。
80デフォルトの名無しさん:2009/05/16(土) 14:14:42
>>レスありがとうございます。

新しくするというのは
VC++ 2008にするという事ですか?
81デフォルトの名無しさん:2009/05/16(土) 14:40:06
VC++6.0は時代の遺物じゃね。
もう使い物にならん。
82デフォルトの名無しさん:2009/05/16(土) 17:21:57
小林健一郎さんの、「これならわかるC++」と
矢沢久雄さんの「C++クラスの継承」を読み終わって
平山尚さんの「ゲームプログラマになる前に覚えておきたい技術」を読んでみたのですが
最初のプログラムって、初心者が思いつくようなものなのでしょうか?orz
初心者向けと聞いて開いてみたのですが、難しくて挫折しそうです・・・。
平山さんの本を読むために、読んでおくべき本があったら教えてください・・・。
83デフォルトの名無しさん:2009/05/16(土) 17:26:42
読むだけじゃだめ、何か作っていかないと
84デフォルトの名無しさん:2009/05/16(土) 17:29:36
追加、本読めば作れるようになれっると思うのはひじょーーに甘い。
簡単なものからで良いから、数を作ることが必要。
例えば、マラソンの本を1万冊読もうがマラソン選手になれるわけではない。
85デフォルトの名無しさん:2009/05/16(土) 17:35:44
>>83-84
即レスありがとうございます。
プログラムも自分なりに作ってはいるのですが
x軸やy軸などの基本書に書いてなかった概念が出てきて
何か足りない知識があるのだろうか、と思っています。
86デフォルトの名無しさん:2009/05/16(土) 17:37:50
まて、それは数学の知識や物理の知識で、2Dなら中学程度でOKだけど。
本当に知りたいのはなに?
87デフォルトの名無しさん:2009/05/16(土) 17:47:14
>>86
数学の知識があればいけるのでしょうか?
私の単なるプログラムの経験不足でしょうか・・・。
目にしたことない単語が多く出てきたので、難しく感じています。

数学は大学センター試験で1A,2B両方とも80点取れる程度です。
88デフォルトの名無しさん:2009/05/16(土) 17:53:15
>>87
なんとなくスレ違だが、>>85の例題が悪い。
>私の単なるプログラムの経験不足でしょうか・・・。
これが答え。
易しく言うと、ある現象、キャラガX軸方向に歩いていきます。とした場合。
あなたなら、簡単に計算式が予想できると思う。しかしだ、
それをプログラムとした場合のモデル化が予想できない状態である。
この解決策は、ずばり、経験だけ。あなたなら経験すればすぐ作れるようになる
89デフォルトの名無しさん:2009/05/16(土) 17:54:24
ゆとりの理想像にだいぶ近いな
90デフォルトの名無しさん:2009/05/16(土) 17:56:46
>>88
レスありがとうございます。
やはり経験不足なのですね。
色々なプログラムに触れて勉強したいと思います。
どうもありがとうございました。
91デフォルトの名無しさん:2009/05/16(土) 18:10:06
宿題スレの問題を自分の力だけで解けば、糸口が見えてくると思う。
解けない時は、他の人の回答を 手打ちで入れる。
コピペは駄目ぜったい
92デフォルトの名無しさん:2009/05/16(土) 18:40:04
ゲーム作りたいのなら、HSPあたりがいいんじゃない?
93デフォルトの名無しさん:2009/05/16(土) 23:41:39
誕生日を祝ってくれるプログラムを作りましたが何も表示されません。
やはり誰も祝ってくれないのでしょうか。

int main(void){
int i;
for(i=0;i>100;i++)
printf("お前、お誕生日おめでとう。\n");
return 0;
}
94デフォルトの名無しさん:2009/05/16(土) 23:43:28
>>93
釣り?マジ?コマンドラインからそのプログラムを起動しろ
9594:2009/05/16(土) 23:46:16
>>93
その前に
i>100
この停止条件がおかしいじゃん。
96デフォルトの名無しさん:2009/05/16(土) 23:48:54
俺が祝ってやる
int main(void){
while(1) {
printf("お前、お誕生日おめでとう。\n");
return 0;
}
97デフォルトの名無しさん:2009/05/16(土) 23:49:54
あーーーーーーーっ  }   何も言うな  orz  やはり祝えなかった
98デフォルトの名無しさん:2009/05/16(土) 23:51:05
ありがとうございます。
しかしこういうエラーが出るんです。

'int' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
99デフォルトの名無しさん:2009/05/16(土) 23:53:37
まじで、コマンドプロンプトなのか? ちょっとOS何か言ってみ
100デフォルトの名無しさん:2009/05/16(土) 23:57:08
OSはウインドウズです。
もしかしてウインドウズだとできないんですか?
10193:2009/05/17(日) 00:01:30
解決しました。
一年後よろしくお願いします。
102デフォルトの名無しさん:2009/05/17(日) 00:01:36
>>100
んなわけがない
まさかソースを直接実行してないよね?
コンパイルはしてるよね?
103デフォルトの名無しさん:2009/05/17(日) 00:10:25
コンパイルはコマンドラインでするんですよね?
ちゃんとプログラムを打ち込んでるつもりなのですが・・・
104デフォルトの名無しさん:2009/05/17(日) 00:12:42
DOS窓でコンパイルか、なにC使ってるか疑問だ
105デフォルトの名無しさん:2009/05/17(日) 00:13:03
>>98
拡張子はcだぞ。batじゃ無いぞ
106デフォルトの名無しさん:2009/05/17(日) 00:14:41
おまえら全力で釣られてていいの?
107デフォルトの名無しさん:2009/05/17(日) 00:15:50
int main(void){
printf("今日、僕ね、万個からこんにちはしたんです。\n");
main();
return 0;
}
108デフォルトの名無しさん:2009/05/17(日) 00:24:22
コマンドラインで
int main(void){
って入力するとそのエラーになるなw
109デフォルトの名無しさん:2009/05/17(日) 09:24:08
>>107
関係ないけど
>万個からこんにちはしたんです
「中に誰もいませんよ」を思い出した。
110デフォルトの名無しさん:2009/05/17(日) 11:59:56
C++にて
unsigned x=10;
と言ったらxの型は何になるんでしょうか?
unsigned intですか?
111デフォルトの名無しさん:2009/05/17(日) 12:04:29
yes
112110:2009/05/17(日) 12:09:42
>>111
unsigned intと書かずに
unsignedとだけ書くメリットは短い以外に何かありますか?
今後の互換性とか何か?
113デフォルトの名無しさん:2009/05/17(日) 12:12:59
なんのメリットもない気がする
114デフォルトの名無しさん:2009/05/17(日) 12:32:51
省略かっこいい 俺すげー(゚∀゚)神のヨカーンな気分にひたれる
115デフォルトの名無しさん:2009/05/17(日) 12:39:46
ギャル語みたいなもんか
116デフォルトの名無しさん:2009/05/17(日) 12:48:36
R&K を厨二病だなんて言ってやるな。
117110:2009/05/17(日) 12:56:34
まあ確かに
long intと書かずにlongで済ませたりしますが、そんな感じですか。
ありがとうございました。
118デフォルトの名無しさん:2009/05/17(日) 13:07:04
ポインタ → 整数型(64bit) → ポインタの変換って仕様的に保証されていますか?
C で確保したリソースを他システムにハンドル値として渡し、他システム側からの
解放命令やセッション中断で解放したいんですが。
119デフォルトの名無しさん:2009/05/17(日) 14:23:34
>>118
reinterpret_cast
120デフォルトの名無しさん:2009/05/17(日) 14:28:23
thankyou
121デフォルトの名無しさん:2009/05/17(日) 16:44:31
整数型への相互変換自体は保証されているが、それが64bitというのは保証されて無い

というのが建前で
そのためにわざわざintptr_tとかUINT_PTRとかが用意されているんだけど
まあC以外との通信なら仕方ないかな。
既に環境依存だし、64bitってのも問題ないんだろう。

キャストの方法(構文)はどうでもいい。
122デフォルトの名無しさん:2009/05/18(月) 21:41:16
テキストの改行コード \r \n を削除して
バイナリファイルとしてファイルに出力後

メモ帳でみると1024文字目で改行されて表示されるのです

バイナリで開くと改行コードは取り除かれているのですが
これはWindowsのメモ帳の仕様でしょうか?
123デフォルトの名無しさん:2009/05/18(月) 21:45:45
コマンドプロンプトから type [ファイル名] で改行されていなかったらメモ帳の仕様
124デフォルトの名無しさん:2009/05/18(月) 23:03:54
質問です。

・・・
俺:「RSA暗号で暗号化されているので安全です」
上司:「RSA暗号とは?」
俺:「素数を使った暗号なのですが・・・要するに解読しようと思ったら何万年もかかってしまうから、
   実際には解読しようと試みる人はいないだろうという意味で安全な暗号なのです。」
上司:「高速なコンピュータを使ったら解けてしまうのではないか?」
俺:「TOP500という世界で一番速いコンピュータのリストがあるのですが、その上位のコンピュータでも私たちが生きている間には解けませんよ。
   まぁ、量子コンピュータなんかがあれば一瞬で解けてしまうと聞いたことがありますが、幸か不幸か量子コンピュータをまだ誰も完成させていません。」
上司:「でもお前が知らないだけかもしれない」
俺:「いえいえ、量子コンピュータなんかができたらすごいニュースになりますよ」
上司:「ほかの企業や組織が秘密裏に作っていたりしたらお前にわかるのか?」
俺:「・・・」

↑の「俺」がRSA暗号が安全だと上司を説得するにはこの後どのように続ければ良いでしょうか?
正論でお願いします。
125デフォルトの名無しさん:2009/05/18(月) 23:09:04
「他の企業でも積極的に使われていますよ」
126デフォルトの名無しさん:2009/05/18(月) 23:09:34
>>124
100%開かない鍵のかかった扉は、もはや誰にも明けられない扉だと思わなければなりません。
それと同じで、正当な手順で暗号を解除して元に戻すことが出来るようにしておく以上、
100%の確率で不正な解除を防げるようなことはありえません。

現行の規格で利用可能な現実的な意味で安全な暗号なんです。

これでどうだ?
つーかスレちがいじゃね?
127デフォルトの名無しさん:2009/05/18(月) 23:42:44
>>124
2048ビット値の素因数分解してもらえ
もしくはできるプログラムを書いてもらえ
128デフォルトの名無しさん:2009/05/18(月) 23:45:49
上司:「でも俺が書けないだけかもしれない」
129デフォルトの名無しさん:2009/05/18(月) 23:48:41
つい最近始めた者です。
知り合いのサンプルコードをみてみると
グローバル変数に
OBJ gPlayer;
という欄があったのですが、これはどういう変数なのでしょうか?
130デフォルトの名無しさん:2009/05/18(月) 23:52:56
OBJ型のgPlayerという名前の変数です
131デフォルトの名無しさん:2009/05/18(月) 23:56:48
OBJ型っていうのが本に書いてないんですが
どういう型なんですか?
132デフォルトの名無しさん:2009/05/19(火) 00:00:44
学校でUNIXでC++やってるんですが、
どうやってプログラム書く画面開くんですか?
lsとか色々入れてたんですが、どこに何を入れればテキストエディタ開けますか。
どうすれば、コンパイルかけれますか?
133デフォルトの名無しさん:2009/05/19(火) 00:03:12
>>124
おまえは本当に俺の上司なのか?
134デフォルトの名無しさん:2009/05/19(火) 00:06:35
>>132
先生に聞け。
135デフォルトの名無しさん:2009/05/19(火) 00:06:52
>>131
サンプル内で定義されてる型だろ
136デフォルトの名無しさん:2009/05/19(火) 00:15:47
>>134
教えてくださいよorz
137デフォルトの名無しさん:2009/05/19(火) 00:22:26
>>136
プログラムを書く画面はviで開くよ。
138デフォルトの名無しさん:2009/05/19(火) 00:22:45
>>135
なるほど
探してみます
ありがとうございましたー
139デフォルトの名無しさん:2009/05/19(火) 00:22:47
>>132
lsとか打ち込む画面で、viと打ち込めばエディタが立ち上がる。
プログラム打ち込んだら、
cc プログラム
でコンパイルできる。
140デフォルトの名無しさん:2009/05/19(火) 00:39:19
>>124
「見つけた人はCIAとFBIから消されますので、公的には発表できません。ですから安心です」

とでも言っておけ。
141デフォルトの名無しさん:2009/05/19(火) 00:49:46
つまんね
142 ◆ZtXjKqCmiQ :2009/05/19(火) 05:38:02
>>132
% vi hello.c (プログラム)と打ち込めばviエディタが立ち上がる。
 [a]または[i]プログラム main(){} と打ち込んだら、
 [Esc][:][w][q][Enter] でエディターを終了する。
% cc hello.c (プログラム)でコンパイルできる。
143デフォルトの名無しさん:2009/05/19(火) 10:11:12
バカな上司は持ちたくないですな
144デフォルトの名無しさん:2009/05/19(火) 15:41:16
DOS窓に出力したいんですが、どうすればいいのですか?
145デフォルトの名無しさん:2009/05/19(火) 16:05:40
>>144 = >>132 か?何処まで出来た?
146デフォルトの名無しさん:2009/05/19(火) 20:14:59
AllocConsole
147デフォルトの名無しさん:2009/05/19(火) 20:16:41
HTMLを解析するライブラリはないでしょうか?
言語はC/C++です
148デフォルトの名無しさん:2009/05/19(火) 20:38:47
久しぶりにプログラムを行ったらすごく基本的なところで躓きました

double x;
x=2/5;
printf("%f\n",x);

この結果が0.0000になります
もちろん0.4000にしたいのですが何が悪いんでしょうか?
149デフォルトの名無しさん:2009/05/19(火) 20:54:59
>>148
x = 2.0 / 5/0;
150デフォルトの名無しさん:2009/05/19(火) 20:55:41
>>149
まちがえた。
x=2.0/5.0;
151デフォルトの名無しさん:2009/05/19(火) 21:53:51
今ゲームや単純な練習用プログラムを作ってるんですが、
どこからどこまでクラスを使うべきか、等がよくわかりません
○○の場合は△△を使うのが良い、というようなことを書いてあるサイトなどはありますか?
152デフォルトの名無しさん:2009/05/19(火) 21:57:26
>>151
デザパタの本でも読めばいいんじゃね?
って思ったけど、本読んでも試行錯誤した経験がないとピンとこないかもしれない。
153デフォルトの名無しさん:2009/05/19(火) 21:59:32
OOPで作るなら、全部オブジェクトでつく霊
154デフォルトの名無しさん:2009/05/19(火) 22:10:05
>>152
ありがとうございます
作りながらそういう分野も勉強してみます
155デフォルトの名無しさん:2009/05/20(水) 00:50:51
float型の変数の値をRS-232で送りたいので8bitずつに分けたいんですが、どうすればできますか?
ビットシフトや論理積とろうとしてもエラーがでてしまいます。
156デフォルトの名無しさん:2009/05/20(水) 00:52:50
union {
flaute fdat
struct {
char cdat[4];
}
} udat;
157デフォルトの名無しさん:2009/05/20(水) 01:28:14
ありがとうございます。unionで出来ました。unionってこう使うものだったんですね
でも、何故structでchar cdat[4]を括ってるのか分かりません。何故ですか?
158デフォルトの名無しさん:2009/05/20(水) 03:47:29
IDAという解析ツールのver5.2の体験版が欲しいんですが、誰か持ってませんか?
159デフォルトの名無しさん:2009/05/20(水) 04:17:27
製品版買え
160デフォルトの名無しさん:2009/05/20(水) 09:08:34
>>157
別に括りたくなければ括らなくていいよ。それと、unionを使うことは環境依存という修羅の道に進むことだと言うこともお忘れなく。
# 尤も、float値をバイナリのままシリアル伝送しようと言う時点で既に修羅の道だけど。
161デフォルトの名無しさん:2009/05/20(水) 09:41:13
>>155
memcpyでいいじゃん
162デフォルトの名無しさん:2009/05/20(水) 09:42:14
int i = *(int*)&f;
163デフォルトの名無しさん:2009/05/20(水) 09:45:50
>>161
このケースでどのようにmemcpy()を使うのか、詳しく。
164デフォルトの名無しさん:2009/05/20(水) 09:54:42
できた

unsigned char c[sizeof(float)];
float f;
f = 10000000.0f;
memcpy(c, &f, sizeof(f));
for (int i=0; i<sizeof(c);i++) {
printf("%#x,", c[i]);
}
165デフォルトの名無しさん:2009/05/20(水) 10:13:59
memcpyしなくてもできた
float f;
f = 10000000.0f;
for (int i=0; i<sizeof(f);i++) {
printf("%#x,", ((unsigned char*)&f)[i]);
}
166デフォルトの名無しさん:2009/05/20(水) 10:21:42
>>124
団塊世代の上司ってそんな感じのやつが多いよなあ。
解りもしないくせに説明しろだの言ってくるから困る。
解るためには自分で理解しようという努力が必要なのにその努力もせずに、
自分が理解できないのは説明しているやつが悪いからだ、と責任の押しつけまでしてくることもある。
んで結局は他の何人かが良いと思うか悪いと思うか聞いて直感で判断するわけなんだが、
解らないなら最初からそうしろ、と思うわけなんだよ。
結局のところ、団塊世代は対抗意識が非常に強くて教育者あるいは指導者しての能力が致命的に欠落していると言わざるを得ない。
167デフォルトの名無しさん:2009/05/20(水) 10:25:30
ろくに説明もできないのに何言ってんだか。
内容が知りたいわけじゃなくて、当人がちゃんと理解してるか判断するために
説明させてるんだよ、たぶんw。
168デフォルトの名無しさん:2009/05/20(水) 10:33:30
新しい暗号技術でも開発しろというのか?
169デフォルトの名無しさん:2009/05/20(水) 10:45:23
>>167
つまり部下を信用していないということか。
社内にまで敵を作って大変ですね。
どうせムズカシイ理論とかは理解できないんだから、せめて成果で判断すりゃいいのにね。
最初は小さいことから成果を積ませて、だんだん大きいことをやらせれば良いのに。
170デフォルトの名無しさん:2009/05/20(水) 11:08:12
>>164>>165
わざわざコピーする理由は? 元質は転送が目的なんだから、コピーしなければいけないなんて要件ないよね。
171デフォルトの名無しさん:2009/05/20(水) 11:12:52
>>170
だからコピーやめたやーん
172デフォルトの名無しさん:2009/05/20(水) 11:13:57
わざわざunionにする理由は? 元質は転送が目的なんだから、unionにしなければいけないなんて要件ないよね。
173デフォルトの名無しさん:2009/05/20(水) 11:17:51
で、コピーするコストを掛ける理由は?
174デフォルトの名無しさん:2009/05/20(水) 11:18:39
頭悪いな
175デフォルトの名無しさん:2009/05/20(水) 11:21:20
またメモリ節約厨か
176デフォルトの名無しさん:2009/05/20(水) 11:22:11
>>173
charの配列にコピーすれば取り出せるんじゃね?
って思ったけど、じゃあcharにキャストすればいいんじゃね?
という具合に思考が遷移したんだよ。
ごめんよ。
177デフォルトの名無しさん:2009/05/20(水) 12:05:38
>>167
いや、技術的に正確かどうかなんてどうでもいいんだよ。
納得させられるかどうかだけが問われる。
178デフォルトの名無しさん:2009/05/20(水) 12:08:56
>>177
だから、単に自分の権威を見せつけたいというのと対抗意識の現れでしかないんだよ。
179デフォルトの名無しさん:2009/05/20(水) 12:12:13
団塊世代は技術もなければ精神性も低い。
社会のゴミですね。
180デフォルトの名無しさん:2009/05/20(水) 12:14:42
>>178
うん、そうかもね。
だから?w
それで出世あきらめるの?
181デフォルトの名無しさん:2009/05/20(水) 12:17:26
>>180
技術盗んだら海外におさらばするつもり
182デフォルトの名無しさん:2009/05/20(水) 12:18:53
もう俺が悪いって事でいいからけんかはよせ
183デフォルトの名無しさん:2009/05/20(水) 12:26:22
あーあ 団塊世代のせいでまた人材が日本から流出していく。
さすが社会のゴミ 国賊 団塊世代は日本をつぶす気か
184デフォルトの名無しさん:2009/05/20(水) 12:30:53
何でも他人のせいにするところはどっかの民族とそっくりだな。
185デフォルトの名無しさん:2009/05/20(水) 12:40:46
>>183
団塊世代が悪いかどうかは知りませんが、うちの会社でも団塊世代の天下りを受け入れない方針になったみたいですよ。
まぁ、最近の世論的に天下りはまずいからでしょうが。
186デフォルトの名無しさん:2009/05/20(水) 16:43:34
Windows上でLinuxを起動させたいのですが
VMwareソフトウェアのどのシリーズを選んだらいいのでしょうか?
187デフォルトの名無しさん:2009/05/20(水) 16:44:38
vmware serverをダウンロードしてインストールしる
188デフォルトの名無しさん:2009/05/20(水) 17:14:03
ようしゃなく英語やったorz
189デフォルトの名無しさん:2009/05/20(水) 17:18:15
日本人のくせに英語もできないのか
190デフォルトの名無しさん:2009/05/20(水) 18:17:16
敵性言語として長く使用を禁じられていたので…
191デフォルトの名無しさん:2009/05/20(水) 19:13:14
じゃぁ なでしこでWMwareと同レベルのものを作ってください
192デフォルトの名無しさん:2009/05/20(水) 19:15:49
今は属国なんだからしっかりしる!
193デフォルトの名無しさん:2009/05/20(水) 22:47:50
#include <iostream>
using namespace std;
int main(){
int tmppl;
cin>>tmppl;
int const pl=tmppl;
int php[pl];
return 0;
}

あらかじめ数字を入力して変数tmpplに入れておき
const plの初期化の際にtmpplを使おうと思ったのですがコンパイルエラーが出ます
これは無理なんでしょうか?

また配列の要素数をキーボードで入力した数字で決めたいのですが、どうすればよいでしょうか?
194デフォルトの名無しさん:2009/05/20(水) 22:54:38
>あらかじめ数字を入力して変数tmpplに入れておき
>const plの初期化の際にtmpplを使おうと思ったのですがコンパイルエラーが出ます
>これは無理なんでしょうか?

無理です

>また配列の要素数をキーボードで入力した数字で決めたいのですが、どうすればよいでしょうか?

std::vector
195デフォルトの名無しさん:2009/05/20(水) 22:58:06
int *php=new int [pl];
196デフォルトの名無しさん:2009/05/20(水) 23:07:30
>>194>>195
ありがとうございます!
初期化と代入の違いが何となく分かりました
197デフォルトの名無しさん:2009/05/21(木) 00:31:36
それは初期化とか代入の話じゃなくて
配列の添え字はコンパイル時定数でなければならないという仕様の話じゃないのかい?
っていうか、前にもまったく同じ回答をした気配がする。
198デフォルトの名無しさん:2009/05/21(木) 03:35:38
extern就職誌というのを知らなかったので試してみたら疑問がでました。
(main.cpp)
#include <iostream>
int global = 100;
extern void func(); //ココをexternとっても動作する
int main() {
std::cout << ::global << std::endl;
::func();
return 0;
}

(another.cpp)
#include <iostream>
extern int global;
void func() {
std::cout << ::global << std::endl;
}

俺の理解している範囲ではexternをつけると「この変数もしくは関数はグローバルだ。ただし定義自体はこのファイルでなくて
別のソースファイルでしているから気をつけろ。」ということなのだが、上記のソースではどうも動作が違う。
最初にメイン関数内でグローバル変数のglobalを表示するのはいいだろう。
次にグローバル関数のfuncに突入するのだがfuncはexternがついているので別ファイル、すなわち
another.cppで定義されている。それで実行は可能なのだが試しにメインのextern void func()からexternをとってみた。それでも
動作したのだが、なんで動くんだ?
199デフォルトの名無しさん:2009/05/21(木) 03:57:19
>>extern就職誌

素晴らしい
200デフォルトの名無しさん:2009/05/21(木) 03:59:50
で、とりあえず、externは、「この名前がグローバルだ」とするためのもの。
そのコンパイル単位で定義されているかどうかは関係ない。

それと、関数はデフォルトでextern。
つまり、staticを付けないで宣言(定義も)されたものは、全てexternと同等となる。
201デフォルトの名無しさん:2009/05/21(木) 04:00:00
海外転職誌みたいだな。
202デフォルトの名無しさん:2009/05/21(木) 04:00:17
本題に答えろ
203デフォルトの名無しさん:2009/05/21(木) 04:07:44
http://eow.alc.co.jp/extern

通勤医師の就職誌か。
204デフォルトの名無しさん:2009/05/21(木) 04:12:30
おまえ、辞書引いたのか。。
205デフォルトの名無しさん:2009/05/21(木) 08:10:30
>>200
んー、よくわからんのですがとりあえず関数はおいておいて変数については
「この変数はグローバルだ。ただし定義自体はこのファイルでなくて 別のソースファイルでしているから気をつけろ。」
この定義は間違っていますか?それとも合っている?今、同じソースファイルで宣言だけでなく定義もしたらエラーに
なったのですが。。わかりやすい説明モトム
(main.cpp)
#include <iostream>
extern int global;
int global = 4;
void func();
int main() {
std::cout << ::global << std::endl;
::func();
return 0;
}

(another.cpp)
#include <iostream>
void func() {
std::cout << ::global << std::endl;
}
206デフォルトの名無しさん:2009/05/21(木) 08:20:02
どんなエラーだよ
まさか宣言しないシンボルを使おうとかしてないよな
207デフォルトの名無しさん:2009/05/21(木) 08:24:49
another.cppの中ではglobalが何者かわからん。
208デフォルトの名無しさん:2009/05/21(木) 08:45:54
動けばいいんだよ。動けば。
209デフォルトの名無しさん:2009/05/21(木) 11:26:55
コンパイルできない なんでか教えて

#include <iostream>
class Point {
private:
int m_x;
int m_y;
public:
Point(int x = 0, int y = 0): m_x(x), m_y(y) {}
void show() {
std::cout << "m_x = " << m_x;
std::cout << ", m_y = " << m_y << std::endl;
}
Point *operator+(Point *p) {
m_x = m_x + p->m_x;
m_y = m_y + p->m_y;
return *this;
}
};

int main() {
Point *p1 = new Point(3, 4);
Point *p2 = new Point(5, 8);
p1->show();
p2->show();
Point *p3;
p3 = p1 + p2;
p3->show();
return 0;
}
210デフォルトの名無しさん:2009/05/21(木) 11:50:47
>>209
Point *operator+(Point *p) {
...
return this;
}

p3 = *p1 + p2;

コンパイルするだけならこう変更する
211デフォルトの名無しさん:2009/05/21(木) 11:53:23
ありがとうございます
仮にp3 = p1 + p2;
を計算させたい場合は関数定義はどうすればいいですか?
212デフォルトの名無しさん:2009/05/21(木) 13:01:54
ポインタ演算をオーバーロードするのはオススメできない
どうしてもやりたいなら「フレンド関数 オーバーロード」あたりでぐぐれ

あと補足だけど>>210はp1==p3になるから気を付けてね
213デフォルトの名無しさん:2009/05/21(木) 15:22:46
了解しました。
214デフォルトの名無しさん:2009/05/21(木) 16:32:56
std::cout << "ABCDEFGHIJKLMN";
std::cout << "\r12345\n";

とすると12345ABCDEFGHIJKLMNと表示される。
\rは復帰、現表示位置がその行の先頭に移動する。

というのはわかるが、一体何の役に立つんだこれ?
マジで使ったことある人いたら教えてくれ
215デフォルトの名無しさん:2009/05/21(木) 16:40:09
歴史的遺物
216214:2009/05/21(木) 16:41:05
興味程度にどんな歴史的遺物か教えてくれ
217デフォルトの名無しさん:2009/05/21(木) 16:42:37
コマンドライン上で簡易進捗バー出すのに便利。
218デフォルトの名無しさん:2009/05/21(木) 16:49:36
>>205
externは、別のファイルで定義しているリソース(変数とか)を
このファイルでも流用するよ、っていう宣言。
C++では、変数名・関数名などは、その変数・関数を使用するより前に、
それが何なのかを同じファイル中でコンパイラに教えてやらないとエラーになる。

お前さんのソースの中で、グローバル的に使用されているのは、
void func()とint globalの2つ。
func()を使用しているのはmain.cppだが、ここではfunc()を使用するより
前に
void func();
と宣言してあるから無問題。
一方、another.cpp内で使用されているglobalは、定義はmain.cppでしているが、
another.cpp内で宣言していない。
だからコンパイラはanother.cppのglobalという識別子が何なのかという
情報を教えてもらってないのでエラーになる。
219デフォルトの名無しさん:2009/05/21(木) 16:52:01
歴史というなら、それこそ5,60年代とかに遡れるんじゃね?

http://ja.wikipedia.org/wiki/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89
220デフォルトの名無しさん:2009/05/21(木) 17:05:44
>>214
つか、それ12345FGHIJKLMNって表示されないか?
処理系依存なんかな。
221デフォルトの名無しさん:2009/05/21(木) 21:03:52
すまん質問させてもらう

void *operator new(size_t size,const char *pname, int nline );
#define new new(__FILE__, __LINE__)

とnewを実行したソース名と行数を取ってるんだが
これのdelete版が出来ない
もしかしてdeleteの方は無理?
STL使ったら、妙なdeleteが増えて特定したいんだ
222デフォルトの名無しさん:2009/05/21(木) 21:43:31
>>220
処理系っつーか、出力装置 (と、その状態) による。
223デフォルトの名無しさん:2009/05/21(木) 22:21:07
MFCを使ってライブラリを利用するのと
SDKで一からアプリケーションを作成するのは
どちらがいいでしょうか?
224デフォルトの名無しさん:2009/05/21(木) 22:27:33
MFC。間違いない。マクロやキャスト使いまくりで興奮する。
225デフォルトの名無しさん:2009/05/22(金) 00:48:32
最初のうちはSDKで必死になって窓の基本を覚え、その後MFCをさわって逝く

まあ俺のことだが
226205:2009/05/22(金) 01:07:35
>>218
やっと理解できたー!有難う。
というわけで俺んなかでの結論;
「extern就職誌をつけられた変数・関数はこのファイルでこれから使うけどどっか別のソースファイルで
指定されてるからね!ちなみに関数のプロトタイプがあるとしたらそれはextern就職誌つけなくてもそれは
externとみなされてるから、別のファイルで指定されてるかもしんないし、ひょっとするとこのファイルの
後で定義されてるかもしんない」

という感じか。
なんか認識にまだ問題有ったら指摘して
227デフォルトの名無しさん:2009/05/22(金) 11:00:27
就労意欲は汲み取れた。
228デフォルトの名無しさん:2009/05/22(金) 11:55:10
ワロタ
229デフォルトの名無しさん:2009/05/22(金) 15:31:37
まずはexternなしでソースを書いてコンパイルしてエラーが
出たらexternをつければよい
230デフォルトの名無しさん:2009/05/22(金) 16:45:03
そもそもexternって使う機会あんまなくないか?
231デフォルトの名無しさん:2009/05/22(金) 17:56:56
グローバル変数
232デフォルトの名無しさん:2009/05/22(金) 17:59:49
グローバル変数そのものをほとんど使わないからな
233デフォルトの名無しさん:2009/05/22(金) 18:32:07
グローバル変数を使うとしても、
初期化の問題を恐れてほとんど全部
関数スコープ内でのstatic変数の参照の呼び出しにしちゃうし
(つまり結局グローバルスコープではない。)

234デフォルトの名無しさん:2009/05/22(金) 18:39:49
グローバル変数でもグローバル変数を入れるクラスを作るからね
235デフォルトの名無しさん:2009/05/22(金) 19:22:42
グローバル変数がグローバル関数になり、グローバル関数がグローバルオブジェクトになるわけですね。
236デフォルトの名無しさん:2009/05/23(土) 09:48:22
template <int N> foo bar(Hoge hoge1, Hoge hoge2, … , Hoge hogeN)
みたいな感じでtemplate <int N>のNに対応して引数の数を変える関数とかって標準で作れますか?
237デフォルトの名無しさん:2009/05/23(土) 10:04:52
多重定義しかありません
238デフォルトの名無しさん:2009/05/23(土) 12:05:47
可変引数リストじゃだめなんだろうか
239デフォルトの名無しさん:2009/05/23(土) 12:21:57
Cを使ってlsライクなプログラムを作ろうとしてて、自分の環境下で動いているlsコマンドの動作を元に作ろうと思ってるんだけど
ls-オプションの動作のCで書かれたソースはコンピュータ内にあるのでしょうか?
240デフォルトの名無しさん:2009/05/23(土) 12:38:52
引数の個数が変化すれば bar() の中身も変える必要があるしね
241デフォルトの名無しさん:2009/05/23(土) 12:48:05
>>239
lsは、Coreutilsに含まれているはずだから
http://www.gnu.org/software/coreutils/
から手に入れることができるはずだよ
242デフォルトの名無しさん:2009/05/23(土) 13:22:25
今加速度センサから値を得て速度を出してるんですが、ノイズや誤差の影響で
加速度を積分した値が静止させても0に戻りません。
そこで出来るだけ正確に無理矢理0に戻そうとしているんですが、何かいい方法ありませんか?
あと、このようなフィルタ処理?とかを扱ってるスレってありますか?
243デフォルトの名無しさん:2009/05/23(土) 15:12:40
getopt
244デフォルトの名無しさん:2009/05/23(土) 18:32:35
C/C++でHTMLのパーサってないでしょうか?
245デフォルトの名無しさん:2009/05/23(土) 21:26:05
なんでop[]は引数をひとつしか取れないようにしたんだろう
246デフォルトの名無しさん:2009/05/23(土) 21:34:12
>>245
ハゲに聞いてくれ
247デフォルトの名無しさん:2009/05/23(土) 21:45:27
>>245
C++はPascalじゃないよ
[a, b]なんて書き方はないから
248デフォルトの名無しさん:2009/05/23(土) 21:53:10
何をブチ込んでもいいんだから
気が済むまでメンバ変数詰め込んだクラスを引数にとる[]を定義すればいいじゃないか
249デフォルトの名無しさん:2009/05/23(土) 22:03:42
delete a, b;
とかやるのと一緒だな>>247
250246:2009/05/23(土) 22:09:52
>>247
別に>>245はPascalとごっちゃにしているわけではないだろう。
オペレータオーバーロードとしては[a, b]の形も認めてもいいんじゃないかって
>>245は言いたいんじゃないの?
251デフォルトの名無しさん:2009/05/23(土) 22:24:41
C++はカンマ演算子の意味が違うから無理
関数呼び出しはむしろ特別な場合
252246:2009/05/23(土) 22:28:16
>>251
そりゃ知っているけどさ、
出来たら便利じゃない。
今からじゃ互換性の関係があって無理だけど、
最初の段階で可能であるように仕様を定めておけばよかったのでは。

・・・ということも踏まえた上で、
だから俺は「ハゲに聞いてくれ」と言ったのだ。
253デフォルトの名無しさん:2009/05/23(土) 22:31:00
C言語で連立方程式を解くにはどんな方法がありますか?
2次方程式だけじゃなく3次4次と応用が利くようなやり方で
254デフォルトの名無しさん:2009/05/23(土) 22:32:35
>>253
Gaussの消去法でぐぐれ
255デフォルトの名無しさん:2009/05/23(土) 22:35:21
あほか
ガウス法は一元一次方程式にしか使えん
反復法なら使える
256デフォルトの名無しさん:2009/05/23(土) 22:35:38
もしかして: ガウスの消去法
257デフォルトの名無しさん:2009/05/23(土) 22:36:27
掃き出し法だろ常考
258デフォルトの名無しさん:2009/05/23(土) 22:45:46
お前ら・・・(汗

3次とか4次にも使えるようにって書いてあるのが読めないのか?
259デフォルトの名無しさん:2009/05/23(土) 22:46:09
Gauss-Seidel反復法マジオススメ
260デフォルトの名無しさん:2009/05/23(土) 22:57:23
反復法で10万次方程式解いて悦にひたるのがマイブーム
261デフォルトの名無しさん:2009/05/23(土) 23:02:55
long num=100;
このとき
++(++(++(++num)));
って動作は未定義になりますか?
一つの式の中で値が複数回変更されているように見えるのですが。
262デフォルトの名無しさん:2009/05/23(土) 23:04:42
>>261
ならない
カッコがついているので副作用完了点がカッコの中で終了するから
263261:2009/05/23(土) 23:14:35
>>262
となると、自作クラスの前置インクリメント演算子のオーバーロードの返り値は、
const参照で*thisを返すのではなく
非constな参照で*thisを返すべきなのですね。
ありがとうございました。
264デフォルトの名無しさん:2009/05/23(土) 23:15:13
>>261
そもそも
++(++foo)
は、++fooが評価後に値なので、++を作用させることができない気がするのだが
これがC++の参照返す++演算子のオーバーロードならどうなるか知らないけど
265261:2009/05/23(土) 23:19:51
>>264
でも一応
long num=100;
++(++(++(++num)));
はコンパイル可能です。
266デフォルトの名無しさん:2009/05/23(土) 23:20:04
Cでは前置も後置も値のコピーを返すけど
C++の前置は自身を左辺値として帰すので有効。
267デフォルトの名無しさん:2009/05/23(土) 23:24:35
ああ、cとc++では扱いが違ったのですね。
c++脳なので知りませんでした。
268デフォルトの名無しさん:2009/05/24(日) 10:29:25
HTMLパーサ自作できたのだわ
1時間もかからなかったのだわ
こんなに簡単なのでググってもでないわけだわ

JAVA, Ruby でパーサ使ってる奴って・・・
269デフォルトの名無しさん:2009/05/24(日) 12:02:03
+は可算演算子だよね。

では%は何演算子と呼べばいい?
270デフォルトの名無しさん:2009/05/24(日) 12:05:10
剰余演算子
271デフォルトの名無しさん:2009/05/24(日) 12:14:19
>>268

天才だな
272デフォルトの名無しさん:2009/05/24(日) 12:46:43
よく言われる
273269:2009/05/24(日) 13:00:27
>>270
ああなるほどね。
ありがと。
274デフォルトの名無しさん:2009/05/24(日) 13:14:03
そこらへんのパーサって非標準(タグ閉じ忘れとか含め)のHTML読めるの?
275デフォルトの名無しさん:2009/05/24(日) 14:24:58
STLの投げる例外の一覧みたいなサイトってありますか?
276269:2009/05/24(日) 14:39:30
+num

-num
といった、符号をあらわす演算子はなんて言えばいい?
単項演算子じゃおかしいし、符号演算子とか??
277デフォルトの名無しさん:2009/05/24(日) 14:44:18
性符号・フフ郷
278デフォルトの名無しさん:2009/05/24(日) 14:51:04
>>277
サンクス!
279デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/24(日) 17:15:45
速く記述する、ってどういうこと?
短くの間違い?
281デフォルトの名無しさん:2009/05/24(日) 17:19:50
>>279

int foo(bool arg1, bool arg2)
{
return arg1 ? 1 : arg2 ? 2: 3;
}
282デフォルトの名無しさん:2009/05/24(日) 17:32:52
static int f[][] = {{3, 2}, {1, 1}};
int foo(bool arg1, bool arg2){
  return f[arg1][arg2];
}
283デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/24(日) 17:47:21
>>279

速くするんだったらinline asmかな
やり方知らんから教えられないけど
285279:2009/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デフォルトの名無しさん:2009/05/24(日) 18:11:24
前のもそうだがその程度ならそのまま書くのが一番良いと思う。
特定の環境を想定しないのなら尚更だ。
287デフォルトの名無しさん:2009/05/24(日) 18:12:35
>>286
たしかに、ボトルネックにならないなら素直な書き方が一番ですかね。
ありがとうございました。
288デフォルトの名無しさん:2009/05/24(日) 18:15:00
ここ行けば、そういうの好きな人いっぱい居るぞ。
http://pc12.2ch.net/test/read.cgi/tech/1226143920/

俺は面倒くさいからパス。
289デフォルトの名無しさん:2009/05/24(日) 20:14:35
数人の身長が記されているtxtファイルを読み込んで、

140 ー 145cm **
145 ー 150cm *
150 ー 155cm **
155 ー 160cm **
160 ー 165cm ****
165 ー 170cm **

の、ようにヒストグラムで出力するプログラムの作り方を教えてください。
290デフォルトの名無しさん:2009/05/24(日) 20:17:07
読み込んで出力すればいいよ
291デフォルトの名無しさん:2009/05/24(日) 21:35:54
>>289
1.テキストファイルを読み込む
2. int配列にそれぞれの範囲の要素を加算していく
3 配列の要素の値の数だけ*を表示する。

順番に作っていけばいい。
292287:2009/05/24(日) 21:47:55
>>288
ありがとうございます。
・・・ボトルネックになるようでしたら挑戦してみます。
293デフォルトの名無しさん:2009/05/24(日) 21:49:47
float A[4][21];
でA[2]とA[4]を入れ替える方法教えてください
294デフォルトの名無しさん:2009/05/24(日) 21:56:24
>>293
std::swap(A[2][x],A[4][x])
でxを0〜21まで回せばいいんじゃない?
295デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/24(日) 21:58:36
普通にmemcpy3回じゃない?
ビットスワップでもいいけど
297デフォルトの名無しさん:2009/05/24(日) 22:03:43
どうかなぁ。並列化考えたらmemcpyは不利な気がした。
298デフォルトの名無しさん:2009/05/24(日) 22:09:07
どのデーター量なら>>295が一番早い
299デフォルトの名無しさん:2009/05/24(日) 22:14:08
d 一個一個交換する方法でやってみます

こんな風にしてたんだけど何故か変な値になっちゃうんだよね。
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デフォルトの名無しさん:2009/05/24(日) 22:15:50
A[4][n+1]; B[n+1];としてね
301デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/24(日) 22:20:57
>>291
ありがとうございます
303デフォルトの名無しさん:2009/05/24(日) 22:42:23
>>293
std::swap(A[2],A[4])はどう?
304デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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 , "こんにちは 世界") ;
306294:2009/05/24(日) 23:04:25
>>303
配列へのポインタだから無理だろ。
だから>>294を提唱するぜ。
307デフォルトの名無しさん:2009/05/24(日) 23:04:51
>>304
出力ストリームを複数持てばいいだけじゃないの?
308デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/24(日) 23:29:22
それは無理なので
std::vector< std::vector< float > >
使っとけ
310デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/24(日) 23:34:59
ありがとうございます。無理なんですね。どうりで調べてもA[][5]とかしか出てこないわけだ
C言語でしたいのでA[]にしてA[y*x+y]でアクセスすることにします。
312デフォルトの名無しさん:2009/05/24(日) 23:45:01
>>311
前にも同じような質問が出ていましたが、最近のCの規格では

void func (int m, int n, float a[m][n]) { 処理 }

といった書き方ができますよ。mとnは呼び出し側で決められます。

【初心者歓迎】C/C++室 Ver.65【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1239326399/
>>836 あたりからの書き込みにも情報があります。
313デフォルトの名無しさん:2009/05/24(日) 23:57:32
>>312
これは知らなかった。でも、VS2008でやってみたらエラー出て無理だった
314デフォルトの名無しさん:2009/05/24(日) 23:59:01
マイクロソフトはC99シカトしてます。
315デフォルトの名無しさん:2009/05/25(月) 00:04:33
0Xどうするんだろうね。

でも、C++/CLIはもはやC++なのかどうなのかも怪しいw
316デフォルトの名無しさん:2009/05/25(月) 00:19:10
>>314
VS2010でauto、decltype、λ式、右辺値参照、static_assertは取り敢えず入れる
予定だそうだ

それ以上のC++0x対応は今の所未定
317デフォルトの名無しさん:2009/05/25(月) 00:29:27
C++ なんだから配列には vector 使おうよとか
配列の配列をポインタのポインタに置き換えられないことは
大概の教科書で懇切丁寧に説明しているはずなのでもう一度教科書読んでねとか
全力でマクロは避けろ( C++ Coding standards )とか
なぜに FILE 構造体?とか

いろいろ思った^^
318デフォルトの名無しさん:2009/05/25(月) 00:37:58
>>317
その辺りはD&Eを読んでもらえば歴史的経緯がよくわかる

Cは一人、いや二人の人間が独善で作った言語だが
C++はコミュニティに属する数多くの人の意見を元に作られてる

中心人物は禿だったがもはや禿が一人で作ったC++とは絶対に言えまい
319デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/25(月) 00:58:46
>>319
なんでダメなの?
俺はよく使ってるぜ
コンストラクタとデストラクタにぶち込んでおけば十分じゃん

vectorを使う事もあるけど少なくとも速度が最大要求の
科学技術計算では>>319の方法をよく使うぞ
321デフォルトの名無しさん:2009/05/25(月) 01:13:03
速度重視ならクラスで包んじゃダメでしょ。

・・・それはさておき、C++のモダンなスタイルは可読性重視になってるからっていう弱い理由。
もちろん、わかって使う分には問題ないよ。
322デフォルトの名無しさん:2009/05/25(月) 01:19:41
「速度が最大要求」ならクラスはおろか関数呼び出しもNGでしょ^^
なにより new と delete 自体が遅い。
memcpy を使うほうが一般的。
どうしても C++ ライクに書きたいなら、せめて allocator クラス使おうよ。
323デフォルトの名無しさん:2009/05/25(月) 01:22:42
memcpy じゃなくて malloc の間違いでした^^スマンコ
324デフォルトの名無しさん:2009/05/25(月) 01:38:26
そもそも速度優先なら、そんなに頻繁にメモリの確保/解放はしない。
どうしてもって言うのなら、自前でメモリ管理する。
325デフォルトの名無しさん:2009/05/25(月) 01:38:35
>>321-322
いや速度重視ならmallocもそのままでは使わないだろ。自前でプールとかしてさ。
326デフォルトの名無しさん:2009/05/25(月) 01:41:30
だな。つか new 遅すぎ。
327デフォルトの名無しさん:2009/05/25(月) 01:45:08
っていうかC++が速くない
Cより5%遅いが開発の指標だったから
328デフォルトの名無しさん:2009/05/25(月) 01:51:20
OCN規制で携帯でしか書けないのが辛いぜ。
329デフォルトの名無しさん:2009/05/25(月) 01:53:35
支援
330デフォルトの名無しさん:2009/05/25(月) 02:56:08
これlj(x)の分子が0になっちゃうんだけど、これで合ってるの?
331デフォルトの名無しさん:2009/05/25(月) 02:56:25
332デフォルトの名無しさん:2009/05/25(月) 06:04:25
なんか一気にレベル低くなってね?
333デフォルトの名無しさん:2009/05/25(月) 09:36:57
※スレを勃てるまでもない低俗なC/C++の質問はここでお願いします
334デフォルトの名無しさん:2009/05/25(月) 19:27:15
C++で文字列を入力し、そこに指定されていた文字が含まれている場合、そうでない場合に分けて処理を行いたいです。
どう書けばいいでしょうか?
文字列はアルファベットなのですが、
指定するすべての文字についてif,elseifで判別するしかないのでしょうか?
335デフォルトの名無しさん:2009/05/25(月) 19:31:35
>>334
そうだよ
336デフォルトの名無しさん:2009/05/25(月) 19:45:53
>>335
ありがとうございます。

もう一つお願いします。

たとえば、
abddみたいな文字列があって、
先頭の1文字づつ判別していきたいです。つまり、
1回目の処理はaについて、
2回目の処理はbについて・・・
のような感じです。
どう考えればいいでしょうか?
337デフォルトの名無しさん:2009/05/25(月) 20:29:58
何をどう判別するのかわからん。
具体的な入力例と、期待される結果を示してくれ。
338デフォルトの名無しさん:2009/05/25(月) 20:45:19
>>337
アルファベットと書きましたが、半角英数すべてで、
accaと入力したとすれば

aが1個存在するので coutで1と出力
cが2個存在するので coutで2と出力
aが1個存在するので coutで1と出力
みたいな感じです。

よろしくお願いします。
339デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/25(月) 21:40:58
ファイル操作にはいろいろとエラーチェック用のメソッドが用意されてますが、例外機構をつかわない理由はあるのでしょうか?
341デフォルトの名無しさん:2009/05/25(月) 23:11:06
例外を使いたくない環境ってのが結構あるからかも
342デフォルトの名無しさん:2009/05/26(火) 22:31:02
C言語そのものの質問とはちょっと違うのですが#ifdef,#ifndefに対応する#endifを見つけて、
どれとどれが対応しているかのコメントを追加するようなツールは無いでしょうか?


//////////入力///////////
#if AAA
...
#if BBB
...
#endif
...
#endif

///////////出力///////////
#if AAA
...
#if BBB
...
#endif //BBB
...
#endif // AAA
343デフォルトの名無しさん:2009/05/26(火) 23:16:37
>>342
知らないなぁ。

俺は大抵はコメントを毎回記載しちゃう派だし。
あるいはエディタの機能で対応する#〜に飛んだりするし。

良い課題として作ってみてよ。
そして是非とも公開してくれ!
344デフォルトの名無しさん:2009/05/27(水) 17:04:28
charで配列の要素数を変数にしています。
cinで入力後、この要素数の最大値を調べたいのですがどうしたらいいでしょうか?
345馬牛:2009/05/27(水) 17:14:21
C++です。
a=10,b=3,c=2として、!aかつb>cの戻り値、!aまたはb>cの戻り値はそれぞれどうなりますか?
よろしくです。
346デフォルトの名無しさん:2009/05/27(水) 17:15:56
felse true
347デフォルトの名無しさん:2009/05/27(水) 17:33:15
18時まで引っ張ろうぜw
348デフォルトの名無しさん:2009/05/27(水) 17:44:52
>>345
君は、C++をやる前に離散数学を勉強することをお薦めする。

>>347
どこの誤爆だ
349デフォルトの名無しさん:2009/05/27(水) 17:46:29
350デフォルトの名無しさん:2009/05/27(水) 18:03:03
https通信をOSによらずに行いたいと思っているのだが、手の込んだことするのは
面倒になりcurl.exeを呼び出すことで解決することにした。
先頭の10KBとかは読めないと思っていたら対応していた。
351デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/27(水) 21:29:16
func2(array[1] );
353デフォルトの名無しさん:2009/05/27(水) 21:31:49
>>350
何のことを言っているのだい?
curl.exeはWindows専用ではないのかい?
354デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/27(水) 21:39:11
>>354
参考書とにらめっこしてこい。 コードの書き方からしてお前は根本的に理解できていない。
356デフォルトの名無しさん:2009/05/27(水) 21:48:55
すみませんお願いします
357デフォルトの名無しさん:2009/05/27(水) 21:50:33
353
SYSTEMの中身を対応するのに変える MACでもUNIXでもあるはず
curl.hの使い方がわかればいいんだけど、メモリやファイルに読み書きするのに
専用の関数を用意しなければならず難しかった。
それなら直接exeを動かしたら簡明と思った。
358デフォルトの名無しさん:2009/05/27(水) 21:51:13
func2(array);
359353:2009/05/27(水) 22:57:24
>>357
UNIX系でも〜.exeって名前なの?
360デフォルトの名無しさん:2009/05/27(水) 22:59:06
>>354
お前ふざけてんの?
何言ってるの?
スレタイ読めよ、ここはC/C++の質問部屋だぞ!!
そんな謎の言語は知りません!
361デフォルトの名無しさん:2009/05/28(木) 02:25:31
質問します。

Windows環境で、とあるC++用ライブラリ hoge.lib があります。
このライブラリには、関数を呼び出すためのヘッダファイル hoge.h が用意されていますが、
実際のソースは提供されていないものとします。
また、ライブラリ内部だけで使われている関数は、hoge.h には記述されていないようです。

さて、このライブラリには名前空間は設定されていません。
そのままでは使いにくいので、Hoge::〜 という名前でライブラリの関数を呼び出せたら便利だと思いました。

この状況(*.h と *.lib のみ)で、ライブラリの関数に名前空間をセットすることは可能でしょうか?
362デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/28(木) 06:30:49
c/c++で仕事している人たちに質問です。
基本情報技術者試験って、最低限必要な資格ですか?
364デフォルトの名無しさん:2009/05/28(木) 07:01:46
5000円程度で取れるんだから、とっとけ。
365デフォルトの名無しさん:2009/05/28(木) 07:09:15
生産性と資格には関連はないだろ。
未経験なら持っていたら考慮されるとか一時金や給料がすこしだけ良くなるとかだろう。
366デフォルトの名無しさん:2009/05/28(木) 07:18:18
>362
ありがとうございます。
諦める決心がつきそうです。
367デフォルトの名無しさん:2009/05/28(木) 07:29:43
webページを解析したいのですが、HTMLを整形済みXMLに変換するライブラリはありますか
368デフォルトの名無しさん:2009/05/28(木) 07:57:22
自己解決しました。 
HTMLのパーサーがあるみたいでそっちのします。
369デフォルトの名無しさん:2009/05/28(木) 10:06:12
くわしく
370デフォルトの名無しさん:2009/05/28(木) 10:32:40
>>366
C用のライブラリだったら
namespace hoge {
extern "C" {
#include "hoge.h"
}
}
である程度ごまかせるんだけどな。

それにusing hoge::hogedata_t
とか#pragma comment(lib)とかも使って。
371デフォルトの名無しさん:2009/05/28(木) 17:29:11
fstream& getLogFile() {
static fstream logFile;
return logFile;
}
として、非局所的なオブジェクトのコンストラクタ内でもログを取れる用にしたんですけど、
logFileの破壊と非局所的なオブジェクトの破壊はどちらが先に起こるか決まってるんですか?
非局所オブジェクトの破壊時にもログをとるのに使えるのか知りたいので。
372デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/28(木) 19:40:36
>>372
感覚で読むとfor ( ; i<hani[j+1]; )が臭うコードに見える。

>>373
C++は、よくわからないが、やりたいことはなんとなく伝わる。
for()は、二つに分ける必要があったのかな。
似たようなことをしているから、for()のなかで、if()するようなコードが浮かびそう。
引数を参照にしたり、const char *foo = bar.c_str()で添字アクセスとか
ただの高速化だけど。
375デフォルトの名無しさん:2009/05/28(木) 20:17:36
ヘッダファイルでプログラムソースファイルを分割することができますが
ヘッダファイルも分割する方法があったら教えて下さい
376デフォルトの名無しさん:2009/05/28(木) 20:20:20
ヘッダファイルはいくらでも分割できます。
377デフォルトの名無しさん:2009/05/28(木) 20:38:31
VC++2008を使ってるのですが
自動修復情報の保存ってのが左下にでてしょっちゅう重いです
なんですかこれ
378デフォルトの名無しさん:2009/05/28(木) 20:59:40
379デフォルトの名無しさん:2009/05/28(木) 21:38:47
実際の数学みたいにxを数字にせずxとして計算するにはどうしたらいいですか?
例えば2x*3x=6x^2みたいな感じで計算して、あとで6x^2のxに色々な数字を代入
できるようにしたいんですが
380デフォルトの名無しさん:2009/05/28(木) 21:54:57
関数電卓のソースを探して見てみよう!
381デフォルトの名無しさん:2009/05/28(木) 22:08:34
ある関数内でnewして得たアドレスを返り値にして
それを外で受け取ったらそのまま、受け取らなかったらdeleteする
みたいな記述はどうやったらできますか?
382デフォルトの名無しさん:2009/05/28(木) 22:39:54
>>381
受け取らなかったらとは、どういう状態?
383デフォルトの名無しさん:2009/05/28(木) 22:50:55
>>382
pHoge = allocHoge(); // OK

allocHoge(); // 自動でdelete したい!
384デフォルトの名無しさん:2009/05/28(木) 23:01:55
>>383
生のポインタじゃムリじゃね?
スマートポインタを使うとか。
385デフォルトの名無しさん:2009/05/29(金) 00:23:19
wrap_allocHoge( void* p )的なものを外側に作って
p==NULLならそのまま削除
p!=NULLなら入れて返すとか
386デフォルトの名無しさん:2009/05/29(金) 00:34:41
>>383
C++なら>>385に引数無しの関数をオーバーロードするのもアリだと思う
387372:2009/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デフォルトの名無しさん:2009/05/29(金) 05:51:59
>>387
完全にスレ違いだろ。
数学スレに行ってくれ。
389デフォルトの名無しさん:2009/05/29(金) 07:16:23
RPGの戦闘部分を作っています。
FFみたいなアクティブタイムバトル(パラメータのすばやさに毎秒1ずつ足して行き、規定値になったら行動)
というものですが、勝利判定はどこでどういう風にすればよいでしょうか?

行動が終わった時に、goto文で戦闘部分の処理を抜け出すのが一般的でしょうか?
390デフォルトの名無しさん:2009/05/29(金) 07:24:55
goto文が一般的じゃない。break使え
391デフォルトの名無しさん:2009/05/29(金) 07:48:35
>>390
ありがとうございます。危うく道を踏み外すところでした
392デフォルトの名無しさん:2009/05/29(金) 19:50:28
STLにupper_boundとlower_boundってありますが
lower:指定した値"以上"の値が最初に現れる位置を返す
upper:指定した値"より大きい"の値が最初に現れる位置を返す
となっていて、どちらも指定した値以上の値が帰ってきます。

そうではなくて、指定した値を超えない最大の値を得たい場合
アルゴリズムを組み合わせたりして
それを簡単に行うような方法ってありますでしょうか

具体的に言うと
1 7 10という列に対して
upper/lower_boundに値2を与えると
どちらも7が帰ってきますが、
1が帰ってくるアルゴリズムはありますか
393デフォルトの名無しさん:2009/05/29(金) 20:06:26
デクリメントすれば?
394392:2009/05/29(金) 20:24:57
自己解決しました
find_if(v.begin(),v.end(),bind2nd(less<int>(),n));
395392:2009/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デフォルトの名無しさん:2009/05/29(金) 21:07:16
begin()でもrend()でも使えばいいじゃない
397デフォルトの名無しさん:2009/05/29(金) 21:43:34
includeファイルが増えてくると面倒なので
include_iroiro.h----------
#include "foo.h"
#include "bar.h"



#include "hoge.h"
----------------------
のように、よく使うものを全部includeするヘッダを使ってます
この場合includeしたcppで実際には使わなかったクラスなども無意味にコンパイルされるんでしょうか?
398デフォルトの名無しさん:2009/05/29(金) 21:46:39
.h ということならYES
399デフォルトの名無しさん:2009/05/29(金) 21:55:46
そうなんですか・・・ショック!
400デフォルトの名無しさん:2009/05/29(金) 22:05:33
プリコンパイルヘッダを使えばいい
401デフォルトの名無しさん:2009/05/29(金) 22:11:28
450 step -1 until 1 do
ってどういう意味ですか?
402デフォルトの名無しさん:2009/05/29(金) 22:15:57
450が1なるまで-1しながらdo以下の処理を繰り返す??
403デフォルトの名無しさん:2009/05/29(金) 22:23:14
while(条件){
cin >> x1 >> x2;
(以下if文)

のように記述して、ループさせています。
EOFでwhileのループを終了させたいとき条件はどう書いたらいいのでしょうか?

よろしくおねがいします。
404デフォルトの名無しさん:2009/05/29(金) 22:24:33
>>402
ありがとうございます。
ということは、「1が53になるまで+1しながらdo以下の処理を繰り返す」っていうのは、
1 step +1 until 53 do
であってますか?
405デフォルトの名無しさん:2009/05/29(金) 22:43:57
それC/C++じゃないじゃん。スレ違い
406デフォルトの名無しさん:2009/05/29(金) 22:55:58
>>401
どこの言語だ。
最近スレ違いがおおいな。
407デフォルトの名無しさん:2009/05/30(土) 10:46:34
VS2005proです
#pragma region
〜処理を記述〜
#pragma endregion
このおまじないは、どういう意味を持つのですか?教えてくださいエロイ人
408デフォルトの名無しさん:2009/05/30(土) 10:48:14
>>407
折りたたみ機能
409デフォルトの名無しさん:2009/05/30(土) 10:53:12
>>408thx
syntaxには関係ないものか、あまり役に立たない機能だな
410デフォルトの名無しさん:2009/05/30(土) 11:24:58
templateを展開した後のコードを生成するようなフリーソフトってなんかいい感じのありますか?
411デフォルトの名無しさん:2009/05/30(土) 11:39:14
すいません、質問です。
アマゾンで古本を販売していて
販売価格を簡単に改定できるソフトを探しています。
改定ソフトは.netフレームワークでプログラムが作られてるようなのですが
プログラミングの知識がまったくない素人が売ってるのを購入せず
同じようなものを作るにはどれぐらいの時間がかかりそうですか?

プログラム自体はアマゾンサイトから価格データを集めるのがメインで
それほど難しくなさそうに見えるのですが。(素人なので直感です)

価格改定ソフトの一例です
ttp://6plan.net/amazonpricechecker

やっぱりめちゃくちゃ難しいんですかね?
412デフォルトの名無しさん:2009/05/30(土) 12:01:41
>>411
とりあえず君のプログラミングスキルを教えてくれ。
ここはC/C++スレだからC/C++のスキルに関しても。
413デフォルトの名無しさん:2009/05/30(土) 12:06:15
>>412
すいません、プログラミング知識はゼロです。

コンピュータ用語がわかる程度
良く言ってシスアドレベルだと思います。
414デフォルトの名無しさん:2009/05/30(土) 12:08:47
>>413
0からだと果てしなく険しいと思う。
少なくともC/C++でやるなら相当苦労しそうだ。

他の人の意見も聞きたいところだけど、
やるにしてもせめて初心者にやさしい超高級言語で挑戦したとして
果たして何ヶ月かかるだろうか。。。
415デフォルトの名無しさん:2009/05/30(土) 12:15:27
プログラムの取得にかかる時間は個人差がある。
独学ならなおさら。

半年で5つの言語を習得してプログラミング言語自体を作ってしまう高校生もいれば、
いくら頑張っても途中で挫折する人間も大勢いる。
416デフォルトの名無しさん:2009/05/30(土) 12:18:48
>>415
>半年で5つの言語を習得してプログラミング言語自体を作ってしまう高校生もいれば、
だれ?
417デフォルトの名無しさん:2009/05/30(土) 12:44:48
>>411
業務時間内に作ろうと思ってるならやめた方がいい
よほどの天才じゃない限り買った方が安い
418デフォルトの名無しさん:2009/05/30(土) 12:52:16
>>415-417

レスありがとうございます。
それほど難しいものなんですか。
おとなしく製品を購入することにします。

ちなみにシスアド程度の素人がプログラムを楽しもうと
思う場合、ExcelとかのVBAなら比較的簡単に習得できるものなんですか?
あくまでも趣味程度しか時間はさけませんので。
419デフォルトの名無しさん:2009/05/30(土) 13:16:37
極端な例を出して話をはぐらかすやつって馬鹿なの?
420デフォルトの名無しさん:2009/05/30(土) 15:04:51
char x1,x2;としてこれをwhileで繰り返し、if文でx1==x2の判定をしながら、
文字列のランレングス符号化をしたいです。
どう書けばいいでしょうか?
421デフォルトの名無しさん:2009/05/30(土) 18:59:17
グローバル変数と性的変数ってどっちのほうがメモリ容量多く使うのでしょうか?
また、staticを何個も書くのはまずいですか?
422デフォルトの名無しさん:2009/05/30(土) 19:00:00
静的変数の間違いでした。
423デフォルトの名無しさん:2009/05/30(土) 19:25:54
>>421
たいていの場合、グローバル変数とstatic変数は同じ扱いになる
static変数を何個も書くこと自体は問題ない。
性能面、安全面で自動変数より劣ることはあるかもしれない。
424デフォルトの名無しさん:2009/05/30(土) 19:32:11
グローバル変数のほうが、シンボル情報がオブジェクトファイルに含まれるので
.objなり.oなりが大きくなる

と全然意味の無いことを言ってみる
425デフォルトの名無しさん:2009/05/30(土) 19:43:53
ヘッダーファイルの値をいくら変えても反映されません。
どうやらパソコンを起動してから最初に実行した時の値が以後ずっと使われているようです。
PCを変えて実行してみましたが、同じ不具合が発生しています。
原因がわかるかたいませんか?
426デフォルトの名無しさん:2009/05/30(土) 19:53:43
日本語でおk
427デフォルトの名無しさん:2009/05/30(土) 20:02:01
説明しようにも不具合の原因がわからなすぎて、上手く説明できません。

ソースファイルの更新はしっかり反映されるのに、ヘッダーファイルの更新は最初の一度しか反映されないのです。
428デフォルトの名無しさん:2009/05/30(土) 20:05:58
その.hをincludeした.cで printfしてみれ
それでも反映されないのなら、コンパイラのバグじゃね
429デフォルトの名無しさん:2009/05/30(土) 20:14:43
どうやら値事態はしっかり反映されているようです。
しかし、その値と変数を比較する部分が正しく動作しません。
友人と全く同じプログラムですが、実行結果が違います。(アカウントは違います。)
430デフォルトの名無しさん:2009/05/30(土) 20:20:44
ヘッダーを書き換えた後にそれをインクルードしているソースはコンパイルしなおしているよな?
一応OSと環境(VC++とかgccとか)よろ
431デフォルトの名無しさん:2009/05/30(土) 20:20:56
学校の課題は先生に訊きなさい
432デフォルトの名無しさん:2009/05/30(土) 20:24:59
複数あるソースファイルのうち、その比較部分があるファイルにprintf文をつけたところ、値の比較が正しく行われるようになりました…。
当然、友人らはこのソースファイルには手をつけなくても正しく動作しています。
全くもって理解不能です。
433デフォルトの名無しさん:2009/05/30(土) 20:32:11
こんな言葉がある
『プログラムは思ったとおりに動かない。書いたとおりに動くのだ』
434デフォルトの名無しさん:2009/05/30(土) 20:37:43
printf文をつけることで関係無い部分が正しく動くようになったのですよ。
理解不能(^q^)
435デフォルトの名無しさん:2009/05/30(土) 20:41:57
>>430の言ってることが答えな気がする
printf文を加えたソースファイルをコンパイルしなおしたことでヘッダファイルの変更が反映されたと
436デフォルトの名無しさん:2009/05/30(土) 20:47:47
>>435
別のソースファイルにつけたときは正しく比較部分が正しく動かなかったです。
(ヘッダーで設定した数値は正しく表示された)

日本語が不自由ですみません。
437デフォルトの名無しさん:2009/05/30(土) 20:58:48
そんなときにはソリューションのクリーン→ビルド
438デフォルトの名無しさん:2009/05/30(土) 21:11:50
>>436
いやだから、別のソースファイルの時は今回直したソースファイルをコンパイルしなおしていないんじゃないか?ってこと
439デフォルトの名無しさん:2009/05/30(土) 22:44:16
とりあえず環境、ヘッダとかのファイル名と実行したコマンドを書け。
440デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/30(土) 23:59:06
442デフォルトの名無しさん:2009/05/31(日) 00:01:12
virtualってつけれるところは全部つけとけばおkなんですか?
443デフォルトの名無しさん:2009/05/31(日) 00:12:38
>>440
4の次に入力された改行文字が、2回めのscanfで読み込まれるから。
scanf("%d%*c", &i);
のようにして、改行文字を1回めのscanfで読み込ませればいい。
444デフォルトの名無しさん:2009/05/31(日) 00:21:25
>>441
>>443
ありがとうございました。
おかげさまで解決しました。
445デフォルトの名無しさん:2009/05/31(日) 00:25:31
>>442
副作用としては、
・オーバーライドするつもりのない関数を間違ってオーバーライドする可能性がある
・多分、メモリ使用量が幾分増える
ってのがある。
446デフォルトの名無しさん:2009/05/31(日) 03:57:21
Cの乱数をsrandとtimeを使って毎回違うようにするのは
わかったのですが、二つの乱数をほぼ同時に出す場合、どうすれば
その二つの乱数をバラバラにする事ができますか?

具体的には戦闘ゲームなのですが、
コチラの攻撃が1~30までで、相手も1~30までの値で
攻撃してくるときに、1~30までの値を返す関数を
srandで初期化してrand()%30+1の値を返すという風に作りました。
しかし、自分の攻撃値も上の関数でけっていし、それにほぼ同時
(すぐ次の行で)相手の攻撃値も決定しているのですが、そうすると
どうしても自分の攻撃値と相手の攻撃値が同じになってしまいます。
時間がほぼ同時ぐらいのタイミングで処理するとどうしても
このようになってしまうと思うのですが、どのようにすれば別々の値に
できるでしょうか?よろしくおねがいします。
447デフォルトの名無しさん:2009/05/31(日) 04:04:51
srandで初期化するのは、プログラム中1回だけでいい。

面倒なら、srand呼ばないようにすればとりあえずランダムな値は取れる。
448デフォルトの名無しさん:2009/05/31(日) 04:16:45
同じだったらもう一回randすればいいんじゃないの
449デフォルトの名無しさん:2009/05/31(日) 04:30:35
乱数シードに IP アドレスとかプロセス ID とかを加算
てか同じプロセス内のコードか??? なら初期化は一回だけであとは rand を呼べばいい
450デフォルトの名無しさん:2009/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>      」

と表示されて、たぶん実行終了した状態になるのですが、
原因を教えてくださいませんでしょうか?おれがうんこなのでしょうか?
451450:2009/05/31(日) 05:20:12
全力で間違えました。

char si[1000];
char sj[1000];
cin>>s1;
cin>>s2;
int array[1000][1000][5];

でうまくいかないのでしあt
452デフォルトの名無しさん:2009/05/31(日) 05:23:32
領域確保しすぎてスタックオーバーフロー?
配列をグローバルにしてみよう
453デフォルトの名無しさん:2009/05/31(日) 05:24:01
>>451
>int array[1000][1000][5];

これ単純に大きさを計算したら1000×1000×5×4=約19MBとなって
スタックのデフォルトの大きさ1MBを超えるから異常終了する

スタックを大きくするかstaticを付けてBSSに配置するかだな
454デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/31(日) 08:37:19
うん
456デフォルトの名無しさん:2009/05/31(日) 09:06:28
>>455Thx分かりました。
.NETのCLIって、C/C++のコードも混在することができるんですね、templateや関数オブジェクトがすらすら書けない俺には無用なものですね。
457450:2009/05/31(日) 11:42:01
ありがとうございました。
mainの外に追い出したところ、何とか起動しました。
途中で強制終了されたけど。。。なんかでかい配列を扱うのはすごく大変ですね。

ありがとうございました!
458デフォルトの名無しさん:2009/05/31(日) 13:25:55
ある動的配列の要素全てが0以下である
をループを抜ける条件としたいのですが、何か良い方法はありますか?

今はforで要素全てを判定させて、全て0以下なら
変数aを1、このaが1ならループを抜けるとしています
459デフォルトの名無しさん:2009/05/31(日) 13:47:38
O(n)未満の方法はないんじゃないかな
なのでその方法がベスト
もし、STLに関数型言語のforallやexistsのようなものがあれば
記述的に楽は出来るだろうが
やる計算的には>>458の方法と同じになるし
460デフォルトの名無しさん:2009/05/31(日) 13:49:41
Pstade.Ovenライブラリを使って

oven::forall(xs, _1 <= 0)
を終了条件にすればいい

ただしxsは対象である動的配列の型で、かつ
xsの型がsingle pass rangeのコンセプトを満たす必要がある
vectorやlistはこのコンセプトを満たす
461デフォルトの名無しさん:2009/05/31(日) 13:52:40
>>458
それでいいんじゃないの?

あまりにも大量のデータを頻繁にチェックするというのなら、
配列に書き込む時点で値が0以下かどうかチェックするという方法もあるけど。
(配列への書き込みが大量に発生するようだと、これも効率的でなくなるが)
462デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/31(日) 14:00:15
ああ、そのほうが良いな。アホだった
あと、そのプログラム、条件>=じゃなくて>にしないと
464458:2009/05/31(日) 14:31:22
ありがとうございます!
全部試してみますね
465デフォルトの名無しさん:2009/05/31(日) 16:34:51
他人の作ったクラスを継承するのって危険ですかね?
466デフォルトの名無しさん:2009/05/31(日) 16:37:52
継承する想定で設計しているならそうでもないんじゃないの。
まぁ作った奴のスキルがどれだけ信用できるかだが。
467デフォルトの名無しさん:2009/05/31(日) 16:56:40
自分で定義したクラスでも意識してないと
Liscov Sutstitution Principleは簡単にぶっ壊れるのになにをかいわんやだ
468デフォルトの名無しさん:2009/05/31(日) 17:06:56
プライベート継承しただけで壊れるんだっけ
469デフォルトの名無しさん:2009/05/31(日) 17:09:19
女でプログラマは何割くらいいますか?
470デフォルトの名無しさん:2009/05/31(日) 17:32:53
一割いないね。
471デフォルトの名無しさん:2009/05/31(日) 17:42:00
トンクス 
472デフォルトの名無しさん:2009/05/31(日) 17:42:25
女でプログラマで美人で性格いい人は何割ぐらいいますか?
473デフォルトの名無しさん:2009/05/31(日) 18:55:38
本当に人口の半分は女なのか疑わしくなってくる
474デフォルトの名無しさん:2009/05/31(日) 18:59:10
女優遇社会だからな。酷い男社会とは別の贅沢な環境で生活してるんだよ。
475デフォルトの名無しさん:2009/05/31(日) 19:06:42
主夫になりたい
476デフォルトの名無しさん:2009/05/31(日) 19:18:18
前にも質問したんですが、メモリをファイルに見せかける方法か、
ramディスクを動的に生成する方法ありますか。
477デフォルトの名無しさん:2009/05/31(日) 19:21:25
DOSコマンドでファイルへ出力するものを直接メモリに入れたいのですが。無理でしょうか。
標準出力ではなく、ファイルへの出力の場合です。
478デフォルトの名無しさん:2009/05/31(日) 20:06:40
mmapとか、MapViewOfFileとか、その辺を調べるといいかも。

ただし俺だったら出力関数にファイルに出力するかメモリに書き込むかを
指定するフラグをつけるけどな。
479デフォルトの名無しさん:2009/05/31(日) 20:08:14
>>476
メモリマップドファイルというのがある
それ専用のWindowsAPIがあるから、他でもOSレベルのAPIがあるんじゃね
480デフォルトの名無しさん:2009/05/31(日) 20:12:08
ファイルをメモリのように扱うのではなく、
メモリをファイルのようにしたいのですが。
メモリを借りてきて、Zドライブを作るとかです。
普通のドライブのようにアクセスする方法はないですか
481デフォルトの名無しさん:2009/05/31(日) 20:14:51
えっ
482デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/05/31(日) 20:18:54
>>480
RAMディスク Windows
とかでぐぐれ。
484デフォルトの名無しさん:2009/05/31(日) 20:21:30
>>482
こだわるならそんな感じだけど、そこまでこだわる必要があるケースは稀。
485デフォルトの名無しさん:2009/05/31(日) 20:21:33
RAMディスクをプログラムが動いているときだけ生成して、終了したら解放する方法はないですか?
既存のDOS EXEで、出力がファイルのやつを直接メモリに格納して高速化したいです。
486デフォルトの名無しさん:2009/05/31(日) 20:25:52
RAMディスクつくるソフトを制御して
起動時にRAMディスク作らせて、終了時にRAMディスク開放させればいいのでは?
487デフォルトの名無しさん:2009/05/31(日) 20:29:44
汎用性がある方法はないですか
ソフトをインストールしてもらわないと出来ません
488デフォルトの名無しさん:2009/05/31(日) 20:40:26
単に、バーチャルなファイルシステムをかますだけでしょ。作った方が早い
489デフォルトの名無しさん:2009/05/31(日) 20:43:05
USBカメラから画像を取り込みたいんですが、よくあるUSBカメラを使うソフト
とかってどうやってるんでしょうか?
490デフォルトの名無しさん:2009/05/31(日) 20:58:48
既存のDOS EXEって何よ?
491デフォルトの名無しさん:2009/05/31(日) 21:14:14
>>489
USBカメラがそうなっているかは分からんが、TWAINという共通化インターフェースがある
492デフォルトの名無しさん:2009/05/31(日) 21:19:51
カプセル化という物を勉強したのですが、一度しか使わない計算でも
関数を定義して別ファイルに値を渡し、戻り値をmainに渡すようにしたほうがよいのでしょうか?
493デフォルトの名無しさん:2009/05/31(日) 21:22:02
ありがとうございます。TWAIN初めてききました
直接カメラのドライバをたたいてるのかと思ってたけど、こんな便利なのがあったんですね
494デフォルトの名無しさん:2009/05/31(日) 21:34:23
>>492
必要に従いカプセル化する。何でもかんでもカプセルにして密閉化すると。
オブジェクト指向原理主義者になるw
495デフォルトの名無しさん:2009/05/31(日) 21:39:04
>>492
突き詰めると決着が付かないような議題
個人的にはほんの数行(最大4行ぐらい)で、そこでしか計算しないんだったら埋め込む
ただ
>関数を定義して別ファイルに値を渡し、戻り値をmainに渡す
が何を言ってるのかがわからなくて心配
496デフォルトの名無しさん:2009/05/31(日) 21:51:10
>>492
それはカプセル化というよりはリファクタリングに関係してるように思う
俺の場合、ある処理を2回行うようになった時点で関数化する
逆に1回しか使う場所がないのに無駄に抽象化した関数は定義しないようにしている
C++の抽象化能力では、これは常に出来ないのは若干悩みの種

カプセル化は、ライブラリのように
他人もそのコードを使うケースで意識すればよいと思う
497デフォルトの名無しさん:2009/05/31(日) 21:54:50
>>477
出力ファイル名にCONを指定して標準出力へ出せるようにならない?
それで動くなら、あとはリダイレクトできるでしょ。
498デフォルトの名無しさん:2009/05/31(日) 22:01:18
>>494-496
ありがとうございます
一人だから問題ないのですが、逆に指摘してくれる人がいないのが難点です
499デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/01(月) 00:26:03
#ifndef CLASS
なんたらかんたら
# ifdef _DEBUG
なんたらかんたら
# endif /* _DEBUG */
なんたらかんたら
#endif /* CLASS */
とやるのが普通かな。

プリプロセッサディレクティブは、行の先頭を#で始めなければならない。
規格のどのセクションだったかもう覚えてないけど。

フリーソフトウェアのソースを読んで勉強したら良いかもしれない。
501デフォルトの名無しさん:2009/06/01(月) 00:53:26
そう?
手元のANSI C言語辞典には#の前に空白類があってもよいと書いてあるけど。
もちろんそんな書き方誰もしないということは同意だ。
502デフォルトの名無しさん:2009/06/01(月) 00:59:31
#if foo
 #if bar
  #include <momo.h>
 #else
  #include <taro.h>
 #endif
#endif

のような例はよくみかける。 
503デフォルトの名無しさん:2009/06/01(月) 01:25:41
自分は普段はこう書くな。

#if foo
# if bar
# include <momo.h>
# else
# include <taro.h>
# endif
#endif

行頭に#があったほうが見た目わかりやすいと思う。


504503:2009/06/01(月) 01:27:01
#if foo
# if bar
#  include <momo.h>
# else
#  include <taro.h>
# endif
#endif

こうな。
505デフォルトの名無しさん:2009/06/01(月) 01:36:32
Windows98のメモ帳でのプログラムの実行の仕方を教えて下さい
因みに入力したのはC言語のprintf何たらの簡単なプログラムです
506デフォルトの名無しさん:2009/06/01(月) 01:41:44
書いたコードをここに貼り付けて、右下のボタンを押せ。
ttp://codepad.org/
507デフォルトの名無しさん:2009/06/01(月) 05:53:03
>>502
俺もそう書くわ。
特に多いのが
#ifndef __BORLANDC__
 高度な処理;
#else
 低度な処理;
#endif
みたいにコンパイラで処理を分けたりとか、あとはデバッグの時かな。
508デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/01(月) 07:30:16
>>506
すみません
ネットに繋げてないのでメモ帳での方法を教えて下さい
510デフォルトの名無しさん:2009/06/01(月) 10:56:47
>509
別にメモ帳だろうが何だろうが、Cのプログラムには関係ないよ。
もちろん効率とかは違うだろうけど。
511デフォルトの名無しさん:2009/06/01(月) 11:32:44
>>509
エスパーすると、コンパイラの使い方がわからないんだろう
そもそも509はC言語のコンパイラを持っているのか?
例えばVC,BCC,GCCなど。
512デフォルトの名無しさん:2009/06/01(月) 12:13:08
持ってないだろうねえ。でも、
最初の一歩も自分で踏み出せない奴を
どうにか歩かせたところで無駄じゃね?
513デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/01(月) 14:16:58
>出来ればソース全文書いてください
>出来ればソース全文書いてください
>出来ればソース全文書いてください
515デフォルトの名無しさん:2009/06/01(月) 14:20:25
>>513
マルチすんなカス
516デフォルトの名無しさん:2009/06/01(月) 16:18:56
符号なしenumがほしいんですが、なにか代替案はありますかね?今は
typedef const unsigned long uenum_t;
uenum_t foo = 0, bar = 1, hoge = 2 ・・・;
みたいに地道に書いて我慢してるんですが
省略記法が使えなくてめんどいし、メモリももったいない気がします
517デフォルトの名無しさん:2009/06/01(月) 17:25:11
半角テキストファイルを読み込んで使用する場合
空白文字も含めて一つの変数orクラスに格納したいんですが
どうすればいいでしょうか?
というかなぜ空白で一々区切られるのでしょうか?
EOFでいいじゃないですか?
518デフォルトの名無しさん:2009/06/01(月) 17:27:29
getlineでいいんじゃない?
519デフォルトの名無しさん:2009/06/01(月) 17:49:17
getlineって一行だけじゃなかったっけ?
520デフォルトの名無しさん:2009/06/01(月) 20:39:48
whileのループをEOFで抜けだし、出力するようにしたのですが、
出力後、プロンプトが出てきません。ctrl+Zで中止しないといけない状態です。
なぜ出てこないのでしょうか?

よろしくお願いします。
521デフォルトの名無しさん:2009/06/01(月) 20:44:30
ループにでも入ってるんじゃない?
522デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/01(月) 22:55:08
俺は普通に終了フラグを作る
524デフォルトの名無しさん:2009/06/01(月) 22:56:20
典型的な「gotoを使うと綺麗に書ける例」だな。

どうしても使いたくないなら
 ・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける
 ・全体を関数にしてしまい、returnで抜ける
とかどうか。
525デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/01(月) 23:00:31
男3人が結婚かよ
527デフォルトの名無しさん:2009/06/01(月) 23:09:54
C言語の本を買ってきて、printfなるものをWindowsのメモ帳に入力したけど、どうしたら実行出来るの?
528デフォルトの名無しさん:2009/06/01(月) 23:12:53
C言語の本に書いてあるんじゃね?
529デフォルトの名無しさん:2009/06/01(月) 23:13:08
そのC言語の本に実行までのやり方が書いてないなら、
それが書いてある入門本を買いに本屋に走るんだ。
530デフォルトの名無しさん:2009/06/01(月) 23:13:10
そのC言語の本を1ページ目から読み返せ。
それで分からなければタイトル晒して燃やせ。
531デフォルトの名無しさん:2009/06/01(月) 23:13:58
また多重婚だねっ♪
532デフォルトの名無しさん:2009/06/01(月) 23:19:00
2重のループを無理やり1重のループに変換する
533デフォルトの名無しさん:2009/06/01(月) 23:20:52
aに3を入れる
534デフォルトの名無しさん:2009/06/01(月) 23:21:06
>>523-524
フラグをつくる場合、>>525さんが書いて頂いたような
フラグの仕方が一番コード書く上では綺麗なのでしょうか?

関数化もよさげですね。ただあまり関数を増やしたくないのもあるので
使わずにすむならそっちのが使いたいです
535デフォルトの名無しさん:2009/06/01(月) 23:22:34
フラグと書いた俺はフラグが基本だ。他は好みだろ
536532:2009/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デフォルトの名無しさん:2009/06/01(月) 23:26:55
>>536  −見るー> >>532
538デフォルトの名無しさん:2009/06/01(月) 23:29:37
・ループ終了を示すフラグ用の変数を用意しておき、そのフラグの値をチェックして外側のforループから抜ける

あれでもこれだと、内側のループをまずbreakで抜けて、抜ける前にフラグをたてて
で、抜けたあとに外側をそのフラグでみるということかな?
でも外側のループから抜けるってどうやるんだろう
539デフォルトの名無しさん:2009/06/01(月) 23:34:46
例の通りなら hensuの比較bool だから a=0,b=0 時点で必ずループ終了を要求することにならないか?
540デフォルトの名無しさん:2009/06/01(月) 23:35:11
つうか処理1もしくは処理2は初回で確実に実行されるんじゃないのかfor文いらなくね
541デフォルトの名無しさん:2009/06/01(月) 23:36:36
俺もそれ思ったwアルゴリズムが変
542デフォルトの名無しさん:2009/06/01(月) 23:47:28
>>534
2重ループくらいなら、あんまり汚くはならんでしょ。たぶん。
実際の書き方は十人十色だろうけどね。
個人的には、forの条件式のところに書くよりは、新しくif〜breakを作る方が好き。

あと、もう1つ。
関数呼び出しにかかる時間が致命的で、少しでも減らしたいというのでもない限り
基本的に関数を増やす方向で進めた方がいいと思うよ。


>540-541
まあ、実際のコードとは違う可能性もあるし、そこは突っ込むほどのことでもないんじゃない?
543デフォルトの名無しさん:2009/06/01(月) 23:56:17
>538
すごく単純に書くと

for ()
{
 for ()
 {
  end_flag = 1;
  break;
 }
 if ( end_flag == 1 ) break;
}
544デフォルトの名無しさん:2009/06/02(火) 00:04:31
書いてない
近所にそんな本置いてない
Amazon登録(会員?)してない
晒した後に燃やす意味がわからない


メモ帳ってテキストエディタだよね?C言語によるプログラムはどうやって実行するの?
545デフォルトの名無しさん:2009/06/02(火) 00:07:04
Cの入門書なら絶対に書いてある。
万が一書いてなければ、それは間違いなく悪書なので燃やしても咎められないだろう。
ついでに、同じような被害者を出さないためにも、タイトルを晒しておこう。

くらいの意味。
要約すると、「1ページ目から読み直せ」ってことだ。
546デフォルトの名無しさん:2009/06/02(火) 00:30:19
void型のWINAPI関数、ABC()があるとします。

void WINAPI ABC()

VOID WINAPI ABC()

には違いがありますか?(voidが小文字か大文字か)
547デフォルトの名無しさん:2009/06/02(火) 00:34:47
>546
どっかで、「VOID は void の別名ですよー」って定義されているかどうかによる。
結論から言うと、たぶんそうなってる。
548デフォルトの名無しさん:2009/06/02(火) 00:53:27
>>542
なるほど。関数を呼ぶと時間がかかるのですか。
かなり高い頻度で呼び出すのでできればはずしたいかな。

書いてなく申し訳ないですが、おっしゃるとおり実際は
forで回している変数を処理1,2で使っているので何とか抜けないといけないのです。

見た目で行くとやっぱり関数ですねー。
一気にfor二個抜けるbreak2みたいなのがあればいいですね(笑)
549デフォルトの名無しさん:2009/06/02(火) 00:58:34
>548
>関数を呼ぶと時間がかかる

それこそ1/60秒間に1000回呼ばれ、マシンの性能の極限まで詰め込みたい……とかいうのでもない限り
普通に関数使っとけw
550デフォルトの名無しさん:2009/06/02(火) 01:00:46
goto文使ってたり多重ループがあるだけで、
コードレビューが合格にならないキチガイISOマンセープロジェクト
って、この世からなくなればいいのに
551デフォルトの名無しさん:2009/06/02(火) 01:29:22
>>522

for(〜){
  for(〜){
    if(hoge) break;
  }
  if(hoge) break;
}
552デフォルトの名無しさん:2009/06/02(火) 01:42:18
そのループ処理を関数に切り出して、
抜けたいところで return してしまうのも一つの手。
553デフォルトの名無しさん:2009/06/02(火) 01:55:55
>551-552
実際の質問の直後のレスを見ようぜ
554デフォルトの名無しさん:2009/06/02(火) 03:49:46
go to文は有害だよ
どんなネストごちゃまぜなソースでもちゃんと普通に抜けだすコード書いたほうがいい
go to文はあとから見た時可読性が著しく落ちる まじで
555デフォルトの名無しさん:2009/06/02(火) 03:53:11
その部分をまるっと関数化してreturnで抜けだすのと
gotoにそこまで違いがあるのかどうかw
556デフォルトの名無しさん:2009/06/02(火) 04:01:36
for(a<3){ for(b<20){
if(){if(hensu){}else{},a=3;continue;}
}} // bループの外に処理があるなら }if(a<3){ }}


で十分じゃないの?
557デフォルトの名無しさん:2009/06/02(火) 04:02:07
>>554
フラグ変数とか多用されるよりgoto使ってくれた方が追うの楽だし、
そもそもgotoつかえば深いネストしなくて済むことも多い。
558デフォルトの名無しさん:2009/06/02(火) 04:05:36
フラグ変数を使って深いループを抜ける事は、仮想関数を
使うべき所にswitch文やif文で多重にネストした醜いプロ
グラムを連想させる
559デフォルトの名無しさん:2009/06/02(火) 04:18:03
質問。
あるクラスから派生したクラスを作るとき、その派生クラスを強制的にシングルトンにさせる方法ってありますか?
派生クラスに自前でシングルトンパターンを実装するしかないのでしょうか?

>goto
まあ俺みたいな初心者は
少しは綺麗になるかも?と思ってもgotoを使わない方向で書いた方が安全ってことだな!
560デフォルトの名無しさん:2009/06/02(火) 06:19:47
gotoが必要になる事ってほとんど無いんだけど。
ちゃんとクラス設計しているのか?
・・・と思ったが、C言語の場合はクラス設計もクソもないな。
561デフォルトの名無しさん:2009/06/02(火) 06:26:12
gotoも使いようだよ
ifとかwhileで書けるなら、gotoでなくそっちを使うべき、ってだけ

いずれにせよクラスは関係ないな
562デフォルトの名無しさん:2009/06/02(火) 07:30:53
>>545
最初っから読んだが載って無いな
悪書なのは分かったが買ったからには100%使う予定

で、メモ帳はテキストエディタっていう程だからプログラムを実行出来るんだよね?ググっても良く分からんのだよorz
563デフォルトの名無しさん:2009/06/02(火) 07:37:44
>>562
じゃぁ、初心者向けの本じゃ無かったんだろ。
自分のレベルにあった本を買えるようにしような。
564デフォルトの名無しさん:2009/06/02(火) 08:04:55
もっと高級なテキストエディタじゃないと実行できないんだよ。
565デフォルトの名無しさん:2009/06/02(火) 08:14:21
>>582
C言語なら、コンパイラというプログラムが必要だ。それをつかえ。
コンパイラにも色々種類があるが、C言語用のコンパイラな。
566デフォルトの名無しさん:2009/06/02(火) 08:48:14
>>564
嘘は言っていないから困る
567デフォルトの名無しさん:2009/06/02(火) 09:54:40
まあ基本は、「エディタは編集するものであって実行するものじゃない」
568デフォルトの名無しさん:2009/06/02(火) 12:38:23
>562
念のため、本のタイトルを。
569デフォルトの名無しさん:2009/06/02(火) 12:59:30
わかた
コンパイラは自力で探してみる

因みに購入したC言語本は
http://www.amazon.co.jp/gp/aw/d.html/ref=mp_s_a_1/376-2471770-0113248?qid=1243914976&a=4797327928&sr=1-1
コンパイラについて書いて無かった気がしたけどなぁ
570デフォルトの名無しさん:2009/06/02(火) 13:00:55
あ、コンパイラはC++用でもおKなの?
571デフォルトの名無しさん:2009/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,ノ\/// 小、|、\ヽ\          「〉
Ul  /  / \/ U` \ヽl i      r_|
Ul l    i      !   ト ヽ |
572デフォルトの名無しさん:2009/06/02(火) 13:29:57
>569
ちょっと軽く評判を調べてみたんだけど、「実行する方法が書いてない」「やたら間違ってる」なんて話がチラホラあった。
1から読み直せとか、さんざん疑ってしまってスマン。
573デフォルトの名無しさん:2009/06/02(火) 13:31:19
>>571 質問者はケータイみたいだし、AAでの返答はしないほうがいいんでね?
574デフォルトの名無しさん:2009/06/02(火) 13:37:19
>>570
今のC++コンパイラはたいていCも扱える
575デフォルトの名無しさん:2009/06/02(火) 13:39:07
やっぱりぼうようか
576デフォルトの名無しさん:2009/06/02(火) 13:42:25
>>573
もともと >>571 に、真面目に答える気があるとも思えん。
577デフォルトの名無しさん:2009/06/02(火) 14:08:56
578デフォルトの名無しさん:2009/06/02(火) 14:12:23
夏休みまだだよな?
579デフォルトの名無しさん:2009/06/02(火) 14:13:22
年中夏休みですがなにか
580デフォルトの名無しさん:2009/06/02(火) 14:25:09
VB、C#、C++だと.NETフレームワークの使い方って全然違ってくる?
.NETフレームワークの用途毎の使い方が載ってる本がほしいので
「.NET Frameworkプログラミングテクニック―for Visual Basic/C#」
を買おうかと思うんだが今使ってる言語はC++なんだ・・・
581デフォルトの名無しさん:2009/06/02(火) 14:46:50
C#がいいお
582デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/02(火) 15:31:35
public base
584デフォルトの名無しさん:2009/06/02(火) 15:31:42
マイクロソフトの最新版らしいので安心して使用してみます

べっかんこから見ているのでAAも安心です

では、おいとまさせて頂きます
585デフォルトの名無しさん:2009/06/02(火) 15:33:26
おとこは黙ってVisual J
586デフォルトの名無しさん:2009/06/02(火) 16:33:41
涙で>585が見えない
587デフォルトの名無しさん:2009/06/02(火) 16:55:46
>>569
amazonの中身が読める所だけみたが
3ページの上の方に、プログラムの実行方法は
「処理系や実行環境によって異なりますから
みなさんが利用している処理系のマニュアルなどを参照してください」
と書いてある

まぁ、完全な初心者にはそもそも「処理系」って何?ってなるから
これじゃつまづくな
588デフォルトの名無しさん:2009/06/02(火) 18:56:19
訳語の「処理」が大外れではないけど意味を採り難い語だからね

「処理乾酪」でヤバさ倍増な感
589デフォルトの名無しさん:2009/06/02(火) 19:33:34
>>580
ライブラリ自体の使い方は同じだから、そういう目的ならVB/C#向けでも構わないと思う。
590デフォルトの名無しさん:2009/06/02(火) 21:39:01
同じ名前のメンバ変数を持ってるクラスを継承しちゃったらどうなるの?
591デフォルトの名無しさん:2009/06/02(火) 21:50:55
>>590
継承の仕方による。

多重継承ならスコープ解決演算子で名前解決することになる。

多重継承でなく、単一の継承を繰り返した場合は
派生クラスのメンバ変数の名前が基底クラスの
メンバで同名なものを「全て」隠蔽する。

これ以上は、実例を挙げるのがめんどくさいので、誰かよろしく。
592デフォルトの名無しさん:2009/06/02(火) 23:34:12
すいません、VS2005で外部ライブラリをソースコードの中に記述して取り込む方法をど忘れしてしまいました、教えてください。
593デフォルトの名無しさん:2009/06/02(火) 23:37:41
絶対ど忘れじゃねーだろwwwww
594デフォルトの名無しさん:2009/06/02(火) 23:40:00
pragman
595デフォルトの名無しさん:2009/06/03(水) 00:06:16
そうだった
#pragma comment(lib,"ws2_32.lib") これでよかった、thx>>593ぶた野郎
596デフォルトの名無しさん:2009/06/03(水) 06:42:31
メモリ上のポインタをファイルポインタで開くことはできますか?
597デフォルトの名無しさん:2009/06/03(水) 06:58:06
できません
598582:2009/06/03(水) 16:54:38
よろしくお願いします。
599デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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
601599:2009/06/03(水) 18:51:25
自己解決した

構造が
main.cpp
dialog/dialog.cpp
shell/shell.cpp
resource/resource.cpp
という風にモジュール分けしてて

funcB内で別のモジュールの処理を呼ぶんだが
そのモジュール(funcB内で呼ぶ処理)自体は結合度が凄い低い

そのモジュールのヘッダに
#include "../hogehoge.h"
とアプリ全体の共通ヘッダをインクルードしたら解決した

そのモジュール自体、他の機能全く使わないのに
何でこれで解決するのかが分からないが…

スレ汚しすまない
602デフォルトの名無しさん:2009/06/03(水) 18:56:43
>>601
アドレスは変わっても良いってコンパイラに伝えてるんだから、当然アドレスはいつか突然変化する。
今回変わらなかったのは単なる偶然。
603599:2009/06/03(水) 19:17:16
例えば
void func( const char *pszHoge )
と定義して

char szHoge[] = "hogehoge";
szHogeのアドレスが0x1000として
func( szHoge );
とすると、func側のpszHogeは必ずしも0x1000ではないって事?
同じアプリのメモリ空間だから、アドレスが変わるっていうのは知らなかった

でも、今回のはアドレスも変わって、中身も変わってた
604デフォルトの名無しさん:2009/06/03(水) 19:18:46
すまん、記述ミスがあった
×pszHogeは必ずしも0x1000ではないって事?
○pszHogeが指すアドレスは0x1000ではないって事?
605デフォルトの名無しさん:2009/06/03(水) 19:23:39
>>600参照。
const char*だと、アドレスは変わる。
ついでに>>603だと宣言の時点でconstついてないから中身も変わる。
コンパイラによって保証されるのは、funcがpszHogeの中身を変えないことだけ。
606599:2009/06/03(水) 19:45:18
>>605
有難う
ポインタで渡す限りアドレスは固定だと思ってたが、違うのか
今日アドレスと中身も変わったが、相当レアなケースに遭遇したみたいだ
>>600は凄い参考になった。有難う
607デフォルトの名無しさん:2009/06/03(水) 19:53:48
ポインタ変数だろうがint型の変数だろうが関数に渡した値が勝手にかわってたらおかしいだろw
608デフォルトの名無しさん:2009/06/03(水) 20:18:16
C++でゲーム開発してるんですが、敵ユニットや弾をリスト構造を用いて実装しました。
しかし、これらのオブジェクト同士の当たり判定の実装で詰まってしまっています。
解決策を知っている方が居たらお願いします。

それが駄目でも、二つの双方向リストを総当りで比較する方法などありましたらお願いします。
609デフォルトの名無しさん:2009/06/03(水) 20:24:55
>>608
サンプルプログラムそこらじゅうに転がってるからてきとーに参考にすりゃいいだろ

総当りの方法って、先頭から順番に見ていきゃ言いだけだろ

610582:2009/06/03(水) 22:23:15
VC++2008 EEで試してみたところ、どちらのバージョンでも問題なくコンパイルされてしまいました。
動作も期待(?)通りです。お騒がせいたしました。
611デフォルトの名無しさん:2009/06/03(水) 22:25:31
だめだったのはやっぱBCC無料版だったりするんだろうか
612デフォルトの名無しさん:2009/06/03(水) 22:38:02
>>609
まぁ、ゲームの場合速度が重視されるから単純な総当たりなんてやらないで
エリアを区切ってエリア単位で総当たりの判定するけどな。
613デフォルトの名無しさん:2009/06/03(水) 22:42:02
まずすべてのオブジェクトの座標を確認して
適当な範囲ごとにソートして、それからその範囲内で当たり判定を行うってことかしら?
範囲の境界に位置するようなオブジェクトの場合はどうしたら…
614デフォルトの名無しさん:2009/06/03(水) 22:42:52
>>613
どっちでもいい、処理を減らすことが目的だから
615デフォルトの名無しさん:2009/06/03(水) 22:43:36
いや違うな
>>613じゃ根本的に間違ってる
616デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/03(水) 23:39:11
{} を省略した場合は

for(n=1; n<=100; n++){
 sum += n;
}
printf("1+2+...+100=%d\n",sum);

って書いてあるのと同じ意味になるから。
618デフォルトの名無しさん:2009/06/03(水) 23:41:42
> 本には{ }内に1つの文しかないときには{ }を省略できるとだけ書いているのですが
だから、{ }がなければ
for(n=1; n<=100; n++){
sum += n;
}
printf("1+2+...+100=%d\n",sum);
とみなされる。
619616:2009/06/03(水) 23:42:47
>>617
なるほど!
1つの文しかないときは{}を省略できるってのは、
条件式が1つの場合、って解釈してたんですが
printfも何もかも含むんですね!わかりやすい説明ありがとうございます
620616:2009/06/03(水) 23:44:20
>>618
ありがとうございます!
621デフォルトの名無しさん:2009/06/03(水) 23:44:21
関数で値渡しをするときに配列の要素全てを渡すことは出来ますか?
それともそれぞれ引数に指定しないとダメでしょうか
622デフォルトの名無しさん:2009/06/03(水) 23:47:37
;が文の終わり。日本語の句点のような存在。
だからsum += n;で1つの文。

{}はその例外で、囲った部分全体で1つの文になる。 すまん話し過ぎたか。
623デフォルトの名無しさん:2009/06/03(水) 23:51:15
>>621
C++ なら vector を使えばいいです。
Cでは直接配列を値渡しすることはできないので、
構造体の中に入れて、構造体を値渡ししましょう。
624デフォルトの名無しさん:2009/06/03(水) 23:56:06
>>623
アリガトゴザイマす
625デフォルトの名無しさん:2009/06/04(木) 04:23:23
初心者です。

Cの参考書でメモリ関連の事が良く出てきます。

バイトとかビットとか2進数、10進数とか出てきますけど、これらはスルーしても
良いんでしょうか?

HTMLで例えるなら#ffffffみたいな感だったので・・・。
これは覚えたほうがいいんでしょうか。
わけわからないんですが
626デフォルトの名無しさん:2009/06/04(木) 04:54:02
スルーしちゃらめぇ。
627デフォルトの名無しさん:2009/06/04(木) 06:24:57
>>625
C言語はそう言うのを扱うのが醍醐味というか、
それが分からないと全然まともに使えないと思われる。

理系なら分かるでしょ?がんばれ!
628デフォルトの名無しさん:2009/06/04(木) 07:46:11
授業で言うなら、最初の3回くらいまでは知らなくてもなんとかなりそうな気はするけど
せいぜいそれくらいだよなあ。
629デフォルトの名無しさん:2009/06/04(木) 17:39:26
C++の質問です。

あるクラスの、あるメンバ関数からしか参照されないことが分かっている変数があるとします。
この関数が呼び出されたあとも、変数の内容を保持したい場合は、どのようにするのがスマートでしょうか?


 ・メンバ変数にする
     → 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?

 ・呼び出し側で変数を用意しておき、引数でその都度渡す
     → 呼び出し側の手間が増える。数が多いとかなり大変。

 ・staticを付ける
     → オブジェクトごとに個別の値を持てなくなる
630デフォルトの名無しさん:2009/06/04(木) 17:42:17
そのときの変数の性質や役割による。 手間隙とかは関係ない
631デフォルトの名無しさん:2009/06/04(木) 17:50:18
ああごめん、途中で質問を書き直したら
頓珍漢な内容になってました。

以下の3パターン以外に方法はないのでしょうか、で。
思いついた3つのうち、いずれの方法を取るにしても何らかの欠点があるので。
632デフォルトの名無しさん:2009/06/04(木) 17:57:18
制約がないなら好きにすればいい
633デフォルトの名無しさん:2009/06/04(木) 17:58:41
>>629
 ・メンバ変数にする
     → 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも?
これがやっぱり一番自然でしょ。
と俺は思う。
いくつあるのかしらないが、そんなに多いならクラス内クラスを作るとかすれば?
634デフォルトの名無しさん:2009/06/04(木) 17:58:43
・関数オブジェクトを用いる。
635デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/04(木) 18:48:13
>>636
1. ループの中で ファイルIOするのは遅すぎるので、
一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。
(全部読み込めないほどメモリが少ないのなら、一部ずつとか)

2. SIMDで複数pixelを同時に処理するか、OpenGL or DirectXのpixelシェーダ書く
638デフォルトの名無しさん:2009/06/04(木) 20:50:01
>>637
早速ありがとうございます。とりあえず1を試してみます。

環境書き忘れて申し訳なかったですが、Windowsのプロンプトから呼ぶプログラムをgccで作っています。
2の手法はVisualStudio等を使って行う方法でしょうか?
そのうち勉強してみたいと思います。
639デフォルトの名無しさん:2009/06/04(木) 20:56:08
>>638
インラインアセンブラ
640デフォルトの名無しさん:2009/06/04(木) 20:57:00
と外部ライブラリ
641デフォルトの名無しさん:2009/06/04(木) 21:17:36
usingを解除することはできますか?
namespace {
using foo::CFoo;
class CBar {
public:
void hoge(CFoo);
};
}
みたいにやってるんですが副作用があるのかどうか気になってます
642デフォルトの名無しさん:2009/06/04(木) 21:21:29
>>638
最近だとインラインアセンブラのほかに<emmintrin.h>なんかの組込関数という手もある。
いずれにせよgccでも使える。
643デフォルトの名無しさん:2009/06/04(木) 21:23:37
まぁまずないとは思うけど最適化オプションの存在は知ってるよね?
644デフォルトの名無しさん:2009/06/04(木) 21:37:23
>>635

while(scanf("%d %d",&a,&b)!=EOF){
 fprintf(fp,"%d,%d\n",a,b);
}

としてみるべし
645デフォルトの名無しさん:2009/06/04(木) 21:40:54
デートは家でまったりしたいのですが
女性から見ればNGですか?
646デフォルトの名無しさん:2009/06/04(木) 21:43:37
Rubyを教えてくれるならOK
647デフォルトの名無しさん:2009/06/04(木) 21:43:39
>>645
死ね
648デフォルトの名無しさん:2009/06/04(木) 21:44:20
>>645
誤爆サーセン
649636:2009/06/04(木) 22:05:38
>>639
アセンブラはマイコンで少々やったことがあるので挑戦してみます。
ただ後年に後輩が読めなそうなので、教授が許してくれなそう・・・orn
>>>640
外部ライブラリというと、そういう処理が高速にできる
ライブラリを他から持ってきちゃえということでしょうか?
>>643
恥ずかしながら知らなかったです。
軽くググってみて、とりあえず -O3 をつけて変化を観察することにします。

プログラムを大学に置いてきてしまったので、有意な変化があれば明日報告します。
皆様アドバイス有難う。
650デフォルトの名無しさん:2009/06/04(木) 22:46:58
あと、流行りの並列処理も最近のコア沢山なCPUには効くぞ。
gccならOpenMPが使えるし。
651636:2009/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デフォルトの名無しさん:2009/06/05(金) 14:20:51
アセンブラ化は効果なし。 
もっとも時間かかるのはディスクアクセス。
Windowsであれば、Noバッファリングで読み込んでみて。
バッファリングありより倍以上の速度になる。
あと、一度にたくさん読み込んでも逆に遅くなる。
100M読み込むより、4Mや2Mずつのほうが速い。
データが仮想メモリ(HDD)に移動してしまう可能性が高い。
自分の環境では4M以上は速度は上がらなかった。
653デフォルトの名無しさん:2009/06/05(金) 14:24:21
ちなみに一度に一斉に書くのも遅くなる。 
メモリ不足になるという理由で。
入出力バッファは、1M〜4Mくらいにして、使い回すのが吉。
654デフォルトの名無しさん:2009/06/05(金) 14:27:13
並列化もきっと意味ないだろうなぁ
655デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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秒台の高速でコンスタントなアクセス速度を誇る。(・∀・)イイ!!

http://img.f.hatena.ne.jp/images/fotolife/w/wraith13/20080430/20080430231453.png
http://d.hatena.ne.jp/wraith13/20080430/1209565632
657デフォルトの名無しさん:2009/06/05(金) 14:34:48
bmpではなくjpgなら、アセンブラ化は効果あるだろけど
bmpはサイズがでかいからな。
処理内容が複雑 (ディスク読み込み時間と比べて速すぎない) なら並列化は効果あるだろけど
単純なものをスレッド化すると、スレッドの呼び出し時間がかかり、余計に鈍くなり得る。
658デフォルトの名無しさん:2009/06/05(金) 19:59:01
implementationは実装と訳せばいいのですか?
659デフォルトの名無しさん:2009/06/05(金) 20:33:17
>>656
バッファリングなしの非同期読み取りだともう少し速くなるのだろうか?
660デフォルトの名無しさん:2009/06/05(金) 21:24:22
>>658
そうです^^
661658:2009/06/05(金) 21:31:46
>>660
ありがとうございます。
662デフォルトの名無しさん:2009/06/06(土) 01:54:30
関数を呼びまくるとスタックオーバーフローを起こします。
スタックを増やす以外にどんな解決方法がありますか?
663デフォルトの名無しさん:2009/06/06(土) 02:01:52
関数オブジェクトをヒープに置く。
664デフォルトの名無しさん:2009/06/06(土) 02:23:44
>>662
再帰呼び出しが原因ならば、アルゴリズムを工夫して再帰が深くならないようにする。
そうでなければ、ローカル変数域を減らす。特にバッファ。
665デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/06(土) 05:41:25
ヒント:二重ループ
667デフォルトの名無しさん:2009/06/06(土) 06:29:22
なんだよそのヒントw
>>665は一応実装はできるけど
最適な実装ロジックを聞いてるんでしょ。
668デフォルトの名無しさん:2009/06/06(土) 06:47:20
いや二重ループが一番のヒントだろ
669デフォルトの名無しさん:2009/06/06(土) 07:25:49
>>665
どういう規則で出力するのかさっぱりわからん。
670デフォルトの名無しさん:2009/06/06(土) 07:37:10
桁ごとに、組み合わせを順番に表示してくんだろw
671デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/06(土) 08:23:21
printfのfはformattedのfだと聞いたことがありますが、
そもそもformattedってどういう意味ですか?
辞書を引いてもC/C++に適した訳語が見つからなくて。。。
673デフォルトの名無しさん:2009/06/06(土) 08:30:09
書式に則った
674デフォルトの名無しさん:2009/06/06(土) 08:31:42
>>673
何の書式に則ったってことですか?
自分で指定した"hoge%spi%dyo"だとかそういうことでしょうか?
675デフォルトの名無しさん:2009/06/06(土) 08:34:17
どう考えてもそれしかないと思う。
676デフォルトの名無しさん:2009/06/06(土) 08:38:52
>>675
ありがとうございました。
677デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/06(土) 10:20:23
>>677 これは良いな。出力順序が変わるのを何とかしようと頑張ってみたが俺には無理だった
679デフォルトの名無しさん:2009/06/06(土) 15:57:09
クラス内で動的確保した文字列に、ポインタ渡しでのアクセスは出来ませんか。
680デフォルトの名無しさん:2009/06/06(土) 15:59:10
>>679
できます
681デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/06/06(土) 16:06:26
自己解決しました。 test(char* &p)にしたら良かったです。
683デフォルトの名無しさん:2009/06/06(土) 16:11:36
char* &pって気持ち悪いなchar*& pがクール
684デフォルトの名無しさん:2009/06/06(土) 16:16:08
いやむしろ、char *&p の方がクール。
理由は宣言構文の仕様上、char が specifier で *&p が declarator だから。
char* p; のように書く人は p と q をポインタにしたいとき
char* p, *q; のように非対称に書いたりするので混乱必至。

っていうか宗教^^
685デフォルトの名無しさん:2009/06/06(土) 16:16:56
それより一引数で参照私の値変更ってのがさ!
686デフォルトの名無しさん:2009/06/06(土) 16:23:07
>>684
> char* p; のように書く人は p と q をポインタにしたいとき
> char* p, *q; のように非対称に書いたりするので混乱必至。
そうでもないよ。俺は普段1行目のように書くけど、2行目のようなケースは
まず第一に「滅多に書かない」し、もし書く時は char *p, *q; って書く。

まぁ、宗教。
687デフォルトの名無しさん:2009/06/06(土) 16:26:38
そもそも*&ってのが気持ち悪い
ダブルポインタのほうがかっこよくない?

まぁ、宗教。
688デフォルトの名無しさん:2009/06/06(土) 16:29:15
Effective C++(第2版)には ** 使うくらいならどうして *& を使わないのかって書いてあるから
*& でいいんじゃない?っていうか、>>681のような質問って時々出てくるけど
その設計にどういうメリットがあるのかしら?
ポインタの管理はクラスの外でやってるし、そもそも内部の詳細を公開しているし・・・
689デフォルトの名無しさん:2009/06/06(土) 16:29:33
創価学会最高!
690デフォルトの名無しさん:2009/06/06(土) 17:09:37
そこまでするならmulti_arrayみたいにラップするわ
691デフォルトの名無しさん:2009/06/06(土) 18:20:00
デバッグしてるときにちょっと気になったんですが
他人の作ったメソッドや関数(例えばSTLやboost)が投げる可能性のある例外を調べる方法は仕様を読む以外ないんでしょうか?
強制的に例外を投げさせるオプションみたいなものがあるんでしょうか?
コンパイラはVC++EE2008を使っています
692デフォルトの名無しさん:2009/06/06(土) 18:27:02
つ grep
693デフォルトの名無しさん:2009/06/06(土) 22:29:11
複文マクロは
do{〜;〜;〜;}while(0)
とすると良いとききました。
しかしこれだと返り値を持たせられないため、関数形式のマクロが書けません。
複文マクロでありながら、返り値を持たせる方法はありませんか?
694デフォルトの名無しさん:2009/06/06(土) 22:34:00
インライン使っとけ。 複雑なマクロつかうよりいい。
エラーがわかりやすい。 実行時間が計測できるなどりメリット。
695デフォルトの名無しさん:2009/06/06(土) 22:34:51
>>694
インライン関数などの知識は十分あるんですが、
どうしても変なマクロが書きたいんです。

マクロでしかできない変な処理なんです。
696デフォルトの名無しさん:2009/06/06(土) 22:46:21
カンマ演算子でなんとかするのはもう考えた?
697デフォルトの名無しさん:2009/06/06(土) 22:48:56
>>696
ありがとうございます。

もう考えてあります。
ただ、try catchブロックを盛り込みたく、それがカンマ演算子に合わせられないのです。。。
そしてマクロでしかできない処理というのは「マクロ引数から#で文字列化する」というような
いわばリフレクション的な処理も含んでいる物だからです。

まあ無くても支障ないのですが、一般化して再利用可能にしておいたら便利かなと思って
変態マクロに挑戦しているところです。
698デフォルトの名無しさん:2009/06/06(土) 22:50:26
引数っぽくすれば
#define FOO(X) do{;;(X)=hoge;}while(0)
699697:2009/06/06(土) 22:55:03
>>698
ありがとうございます。

副作用を持たせるわけですね。
最終手段として考慮します。

しかし当面はもうちょっと挑戦してみます。
返り値はbool型になる予定でして、疑似関数の形の方が分かりやすいので。

関数テンプレートや文字列結合演算子、無名構造体など、
もちえる言語仕様の知識をフル活用してみます。
700デフォルトの名無しさん:2009/06/06(土) 23:20:30
void func(float a[]){
  int size=sizeof(a)/sizeof(float);
}
これでsizeに配列aの個数が入ると思ったのに1になる。何で?
701デフォルトの名無しさん:2009/06/06(土) 23:31:22
aはfloatへのポインタに変わったから
702デフォルトの名無しさん:2009/06/06(土) 23:31:55
サイズが分からないから

void func(float a[10]){
とかにすれば10って出るはず
703デフォルトの名無しさん:2009/06/06(土) 23:34:47
void func(float a[]){
としても

void func(float *a){

となるから

>>702
なんねーよばか
704デフォルトの名無しさん:2009/06/06(土) 23:35:53
ありがとう。float[10]ってしないと駄目なのか
でもそれだとint size=10;ってすることと一緒だから意味無いよね
受け取った配列の数によって処理を変えたいんですがどうすればいいですか?
705デフォルトの名無しさん:2009/06/06(土) 23:38:08
それこそマクロっぽくするべき
#define func(x) func_(sizeof(x)/sizeof(float))
void func_(unsigned size);
706デフォルトの名無しさん:2009/06/06(土) 23:39:11
>>704
二引数にして大きさを渡すする
ものすごい馬鹿みたいに思うかもしれんが
memsetやらfreadやらあるように領域の大きさを渡すのは普通
707デフォルトの名無しさん:2009/06/06(土) 23:39:19
void func(float *a, size_t n) { }
#define numberof(array) (sizeof(array)/sizeof(array[0]))
float foo[10];
func(foo, numberof(foo));
708デフォルトの名無しさん:2009/06/06(土) 23:48:33
ありがとうございます。サイズを引数として受け取るしかないんですね
当たり前なんだろうけど、これにはちょっとびっくり。
普通に分かるものだとばかり思ってた
709デフォルトの名無しさん:2009/06/07(日) 00:27:30
商業ソフトだとメモリ確保とかでガチガチにtry catchするんでしょうか?
710デフォルトの名無しさん:2009/06/07(日) 01:10:01
メモリ確保失敗はアプリレベルではどうにもならないからOSに例外投げてしまう。



という考え方もある。
711デフォルトの名無しさん:2009/06/07(日) 01:14:08
限界になる前に、そろそろメモリが足りません言い出すソフトもあるなぁ・・・・
712デフォルトの名無しさん:2009/06/07(日) 02:22:58
OSに例外投げたらどうなるんだ?つか、そんなことできるのか?
713デフォルトの名無しさん:2009/06/07(日) 02:57:00
他人のソースコードを読んでいってもさっぱり頭に入ってきません。
何かソースコードを読む際のポイントとかあるんでしょうか。
714デフォルトの名無しさん:2009/06/07(日) 03:00:11
コメントを読んだり、
読んでる関数の中身までは読まずに、大まかな流れを先に確認する。
715デフォルトの名無しさん:2009/06/07(日) 03:37:32
>>713
doxygen(Graphviz)で関係のグラフ化オヌヌメ
716デフォルトの名無しさん:2009/06/07(日) 10:54:46
テンプレートの型を一部の型に限定したい(たとえばunsignedの各種整数型のみ)場合は
template<typename T> class HOGE;
template<> class HOGE<unsigned char> {...;};
template<> class HOGE<unsigned short> {...;};
template<> class HOGE<unsigned long> {...;};
template<> class HOGE<unsigned int> {...;};
のように本体を書かずに、特殊化のほうをいちいち全部書くしかないんでしょうか?
717デフォルトの名無しさん:2009/06/07(日) 11:53:12
traits
718デフォルトの名無しさん:2009/06/07(日) 12:20:01
C++にて。
同じ副作用を保ったまま、式を文にすることは出来ます。
セミコロンを付ければ良いだけです。
 例 x=3ならx=3;とすればよい。
しかし同じ副作用を保ったまま、文を式にすることは出来ますか?
その際の式の値は何だって良いとして。
 例 while(flag){++x;} を ???
719デフォルトの名無しさん:2009/06/07(日) 12:50:35
>716
class の中身の方は型によって変わらないと仮定して、

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_unsigned.hpp>

template<typename T, typename Enable = void>
class HOGE {};

template<typename T>
class HOGE<T, typename boost::enable_if<boost::is_unsigned<T> >::type>
{ // 何か
};

他の型にするなら boost::is_unsigned を適宜変更すれば OK。
型をべた書きするなら↓なんてのも可能。

#include <boost/mpl/set.hpp>
#include <boost/mpl/has_key.hpp>
template<typename T>
class HOGE<T, typename boost::enable_if<
  boost::mpl::has_key<
    boost::mpl::set<
      unsigned int,
      unsigned char
    >,T> >::type>
{ // 何か
};

中身も変わってくるなら >717 の通り traits でまとめる。
720デフォルトの名無しさん:2009/06/07(日) 13:42:55
>>718
そこを関数にする。
そうすれば関数呼出式になる。
721718:2009/06/07(日) 14:31:24
>>720
あーなるほど。
ありがとうございます。
722デフォルトの名無しさん:2009/06/07(日) 18:39:05
for each 処理を自前で作りたい。
Sentinelを付加する方法でなんかいいアイデアない?
723デフォルトの名無しさん:2009/06/07(日) 18:43:09
CかC++かくらい書け。
もっとも、C++ならSTL使え、だが。
724デフォルトの名無しさん:2009/06/07(日) 18:57:23
もっと洗練されたライブラリが必要だと思うんだ
725722:2009/06/07(日) 19:00:27
STL様 i=begin;while((function(i++),i)<=end); は偽物foreach

i=begin; end+1=eoloop; while(function(i++));
      ^^^^^^^^^←この部分
726デフォルトの名無しさん:2009/06/07(日) 19:01:00
一応Qt(C++用ライブラリ)にforeachはある
それを参考にしろとは言わんが
727デフォルトの名無しさん:2009/06/07(日) 21:22:20
インターフェースクラスがクールに感じたんだけど、これってなにかマイナス面はある?
今作ってるプログラムをこれ使って大幅に書き換えようかなと思ってるんだけど
728デフォルトの名無しさん:2009/06/07(日) 21:39:06
>>727
ソースコードの量が増える
保守するとき読めればいいが
そんな保証などない

将来性にかけて拡張性に優れた設計にするには
優れた設計能力が必要
後からの変更は1からのやり直し
729デフォルトの名無しさん:2009/06/07(日) 21:48:20
>>727
Qtのこと?
俺もQtの設計は美しいと思ってるし、
いまさらMFCやろうとしてる(まずいないがw)やついたらQtを紹介してる

マイナス面は、以前はGPLだったけどそれも変更になってLGPL
不満といえばdllのサイズぐらいかな?


マルチOSなのもおいしいところ
730デフォルトの名無しさん:2009/06/07(日) 21:56:43
>>725
std::for_eachもいやならBOOST_FOREACHはだめ?
731デフォルトの名無しさん:2009/06/07(日) 22:02:31
>>729
そのインターフェイスじゃないだろ
732デフォルトの名無しさん:2009/06/07(日) 22:11:32
QtってGUI専用だと勝手に思っていたが、
GUI以外の事も出来るの?

733デフォルトの名無しさん:2009/06/07(日) 22:18:02
>Qt

何故か俺の中で、
フジコフジオのイメージが払拭できない
734デフォルトの名無しさん:2009/06/07(日) 22:21:55
>>732
コンテナ、ネットワーク、XML、データベースとか一通り
機能制限はあるが組込み向けやXサーバーなしでもGUIが使えたり
735732:2009/06/07(日) 22:24:51
>>734
すげーー
マジかよ。

LGPLだと商用利用はしんどいか?
Staticリンクしちゃうとオープンソース強制だっけ?
736デフォルトの名無しさん:2009/06/07(日) 22:55:36
>>735
LGPLだと静的リンクはアウトだね
動的リンクなら商用非公開おk
737デフォルトの名無しさん:2009/06/07(日) 23:03:14
LGPLだと、リバースエンジニアリングの拒否の禁止かな。
738732:2009/06/07(日) 23:06:54
リバースエンジニアリングはどうせされるんだろうし
そんなの禁止しても意味ないだろうけど・・・。

>動的リンクなら商用非公開おk
これはつまりDLLを付属させて配れってこと?
739デフォルトの名無しさん:2009/06/07(日) 23:14:11
>>735
強制じゃないけど
staticリンクでその条件を満たすのはかなりしんどい
740デフォルトの名無しさん:2009/06/07(日) 23:14:53
>>738
そうだよ配っていいんだよ
741デフォルトの名無しさん:2009/06/07(日) 23:28:13
ってことは

「QtのDLLを付属させてスタティックリンクしないようにするかぎり」
無償でクローズドソースの商用利用が可能

ということか。
Qtいいな。
…ちょっと考えてみようかな。
742デフォルトの名無しさん:2009/06/08(月) 02:12:57
>>715
分かりやすい解説サイト教えてください
743デフォルトの名無しさん:2009/06/08(月) 02:20:00
>>742
ggrks
相当前からあるソフトで、情報も腐るほどあるぞ




ちなみにそのウィザードもQtでできてる
744デフォルトの名無しさん:2009/06/08(月) 03:44:59
C++のテンプレートについて教えて
クラスとどう違うんだ?
745デフォルトの名無しさん:2009/06/08(月) 03:49:36
次元が違う
746デフォルトの名無しさん:2009/06/08(月) 04:18:25
違いすぎて逆に説明が困難だな。
747デフォルトの名無しさん:2009/06/08(月) 04:19:38
訂正
C++のテンプレートについて教えて
やっぱクラスとの違いじゃなくてどういう時に使うのか
どんなニーズによってできたのか教えて
748デフォルトの名無しさん:2009/06/08(月) 04:27:42
型が違うだけで同じような処理を何回も書かないで済むように
749デフォルトの名無しさん:2009/06/08(月) 06:46:52
今年女子大に入ったばかりのゆきこと言います。
C++を学びたいのですが、どの本がお薦めでしょうか?
750デフォルトの名無しさん:2009/06/08(月) 06:47:04
>>744
天と地ほど違うと思うけど。

[タイヤキを作るための金属の鋳型]

[食べられるタイヤキ]
の違い。ぜんっぜん違う。
751デフォルトの名無しさん:2009/06/08(月) 06:56:11
>>742
このスレに行け。
【コメント】doxygen【コンソメ】
ttp://pc12.2ch.net/test/read.cgi/tech/1212144627/

オススメは以下。
Graphviz
ttp://www.graphviz.org/
doxygenの文字化け対策 - 僻地のプログラマkmt-t - わりとどうでもいい日記 1.1
ttp://d.hatena.ne.jp/kmt-t2/20090403/1238718375
Let’s use doxygen!
ttp://www.fides.dti.ne.jp/%7Eoka-t/doxygen.html
無題ドキュメント
ttp://www.sat.t.u-tokyo.ac.jp/~tetsuya/homeNew/research/Tips/doxygen.htm
SourceForge.net: sakura-editor ≫ DoxygenComment
ttp://sakura-editor.wiki.sourceforge.net/DoxygenComment
Doxygenマニュアル
ttp://www.doxygen.jp/manual.html
Doxygen公式
ttp://www.doxygen.jp/
752デフォルトの名無しさん:2009/06/08(月) 10:12:17
>>750
それクラスとインスタンスの違いでなくて?
テンプレートはその鋳型を付け替えるとタコ焼にも今川焼きにもなる台とか
753デフォルトの名無しさん:2009/06/08(月) 11:03:19
型チェックしてくれるマクロとでも思えば。
754デフォルトの名無しさん:2009/06/08(月) 12:56:01
なんだかtemplateってbindに似てるね
755デフォルトの名無しさん:2009/06/08(月) 13:03:26
コンストラクタの引数の値によって、データメンバの型を変える方法ってありますか?
756デフォルトの名無しさん:2009/06/08(月) 13:24:48
>>749
女子供は股開いてればいいんだよ
757デフォルトの名無しさん:2009/06/08(月) 13:34:28
子供もかよ……
758デフォルトの名無しさん:2009/06/08(月) 13:49:24
ぼくおとこのこだよ…
759デフォルトの名無しさん:2009/06/08(月) 13:58:54
>>755
同じ親クラスから継承した子クラスという条件内であれば可能。

もしくは、void*で持たせれば、多分なんでもおkだけど。
760750:2009/06/08(月) 16:12:44
>>752
そうとも言えるな。
なら俺方式で言うなら
クラステンプレート=[タイヤキやら今川焼きやらを作るための金属の鋳型を作るためのナニモノか]
クラス=[タイヤキを作るための金属の鋳型]
インスタンス=[食べられるタイヤキ]
とでも言えばいいかな。
761デフォルトの名無しさん:2009/06/08(月) 16:55:30
喩えなら何とでも言えるわ。
762デフォルトの名無しさん:2009/06/08(月) 17:42:54
名前空間について質問です。

名前空間 foo と、それとは別に名前空間 bar::foo があるとします。
このとき、bar の内側から、bar::fooでは無い方の foo を指定するにはどうしたら良いのでしょうか。

なお、環境はWinXP、C++、VisualStudio2005です。
763デフォルトの名無しさん:2009/06/08(月) 17:46:20
::foo
764762:2009/06/08(月) 17:53:04
すみません、2つ質問するつもりで書いてませんでした。

あるクラス内に、別クラスをメンバ変数として取り込む時、
その別クラスが書かれたヘッダファイルをインクルードするのではなく、
先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?

さて、その別クラスの名前が、名前空間 bar の下にあるとき、
namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか?


>>763
ありがとうございます。
なんで思いつかなかったんだろう、自分。
765デフォルトの名無しさん:2009/06/08(月) 18:40:27
便乗質問、テンプレートクラスを持たせる時って同じ方法使えるん?
766デフォルトの名無しさん:2009/06/08(月) 18:48:37
使えるん
767デフォルトの名無しさん:2009/06/08(月) 18:51:59
>>764
あなたのいうクラスに名前が付いていないので
説明の便宜上
あるクラス=MyClass, 別クラス=fooとします。

まずは本題からちょっとそれた話から。
 > その別クラスが書かれたヘッダファイルをインクルードするのではなく、
 > 先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね?
あります。
しかし
 > あるクラス内に、別クラスをメンバ変数として取り込む時、
この場合は前方宣言Forward declarationだけでは足りません。
というのも、
class MyClass {int m_num;std::string m_str;foo m_var;}
のようにメンバ変数としてfoo型変数を使いたい場合、
fooが不完全型なのでそのサイズがわからず、したがって
MyClassのために確保すべき領域のサイズもコンパイラには分からないことになるからです。
前方宣言で足りるのはfoo型メンバ変数ではなく
foo型への参照型メンバ変数やfoo型へのポインタ型メンバ変数、
あるいはメンバ関数の戻り値としてfoo型を使用する場合などです。
768デフォルトの名無しさん:2009/06/08(月) 18:54:54
ユーザが入力した数式を処理するプログラムを考えているのですが
cin>>eq;
#define function(x) (eq)
cout<<function(1);

みたいなことができませんんか?もしくは別の方法があったら教えてください
769767:2009/06/08(月) 18:54:56
あとはまあ
前方宣言で足りるのは
メンバ関数の引数の型としてfoo型を使用する場合

typedefとかかな。
 > さて、その別クラスの名前が、名前空間 bar の下にあるとき、
 > namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか?
それでいいと思いますが。
class bar::foo;とか書いても無理ですし、それ以外記述できないですよねぇ?

もし有識者がいらしたらそっちを信用してください。
770767:2009/06/08(月) 18:56:45
>>768
意味不明ですが、どういうことですか?
プリプロセッサにより
cin>>eq;
cout<<((eq));//xは無視される
として処理されるだけですが。。。
771デフォルトの名無しさん:2009/06/08(月) 19:01:07
>>770
768に書いたのはあくまでイメージです。言葉足らずですみません
私がしたいことは引数にある文字列を数式として扱いたいのです
もしくはcinで入力した式をプログラムで処理したいのですが
772デフォルトの名無しさん:2009/06/08(月) 19:02:27
ほんとは言語の問題じゃないかもしれないけど教えてください

@double配列と、Aメンバがdoubleいっこだけの構造体の配列を読み上げる速度を比較するための
コードを書いて実行してみたらAのほうが速かったです

環境はItanium、CentOS、GCC(C++)です

これはなぜなんでしょうか?
773デフォルトの名無しさん:2009/06/08(月) 19:04:08
そうなったから
774767:2009/06/08(月) 19:04:19
>>771
言いたいことは分かりました。
C++の知識はどのくらいありますか?
STLやBoost C++はご存じですか?
C言語じゃなくてちゃんとC++らしいコードが書けますか?
775デフォルトの名無しさん:2009/06/08(月) 19:05:31
>>772
不思議だわ。
・・・最適化とかレジスタの割り付けとか、もう不確定要素に押されて結果が揺らいでるだけじゃないか?

つまりどっちで書いても大差ないから好きな方で記述すればよか。
776デフォルトの名無しさん:2009/06/08(月) 19:08:39
>>774
c++は初めて3か月くらいですが、STLはつかったものがあるので
簡単なものなら大丈夫だと思います。
777デフォルトの名無しさん:2009/06/08(月) 19:09:25
>>775
計算時間半分くらいでした

ちなみにこれに気づいたのは構造体メンバのアライメントに関する実験中でした




コンパイラが賢くなりすぎてマニアックな知識も必要ない時代になったんですかねえ・・・
778デフォルトの名無しさん:2009/06/08(月) 19:11:11
普通のポインタがインスタンスを持ってるかどうか判別する方法はありますか?
現状ではポインタのゼロ初期化とdelete・0代入を徹底するぐらいしか手段が思いつきません
779767:2009/06/08(月) 19:11:28
>>776
せっかくSTLの知識の有無を聞いたのですが、STLつかった実例が見つかりませんでした。
とりあえず適当なリンクを張っておきます。

以下の中で、上に挙げられている物の方が
より優れていると思ってください。

letsboost::spirit
ttp://www.kmonos.net/alang/boost/classes/spirit.html
数式解釈プログラム - uPage
ttp://www-as.dse.ibaraki.ac.jp/umezu/?%E6%95%B0%E5%BC%8F%E8%A7%A3%E9%87%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0
七行プログラミング
ttp://cm.xrea.cc/thread/program_001.html

LISPですが
記号数式処理
ttp://www-antenna.ee.titech.ac.jp/~hira/hobby/symbolic/index.html
780767:2009/06/08(月) 19:13:06
追記。
>>776
Spiritで数式を解釈させるなら
boost::spiritっちゃえ!
ttp://tamachan.club.kyutech.ac.jp/%7Egridbug/spirit/
C++ Labyrinth
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-boost-spirit.html
Spirit v1.6
ttp://boost.cppll.jp/BDTJ_1_30/libs/spirit/
これらが有名で質も高いと評判です。
781デフォルトの名無しさん:2009/06/08(月) 19:14:34
>>768
これでイメージが湧いたらそいつは一流のエスパーだwwwww
782767:2009/06/08(月) 19:17:06
>>778
>普通のポインタがインスタンスを持ってるかどうか
有効な領域を指し示しているかどうかとおっしゃりたいものと推測・解釈します。
結論から言えば、
普通のポインタでしたら、そんな方法はありません。
指し示す領域が有効かどうかなぞわかり得ません。
783768:2009/06/08(月) 19:22:56
>>782
いろいろ情報ありがとうございます。
784764:2009/06/08(月) 19:45:30
>>767>>769
ありがとうございます

>宣言
やっぱ namespace bar { class foo; }; って書くしか無さそうですね。
階層が深いとちょっと面倒かな?と思っただけなので、特に問題はありません。

>メンバ変数
確かに、メンバ変数を直接弄ろうとすると前方宣言だけじゃダメですよね。
まあ、素直にアクセサ付けれ、って話ですが。


>>765
確かに、 std::string とかは上記の方法じゃ出来ないですね。
785デフォルトの名無しさん:2009/06/08(月) 20:11:52
C++の関数で文字列を参照渡しする方法がわかりませ
ん &stringだと弾かれたし
786デフォルトの名無しさん:2009/06/08(月) 20:16:09
>>785
参照の記述を勉強してください。
クラス名& ref=参照先;
で記述します。
787785:2009/06/08(月) 20:23:15
参照の書き方って&nと違うの?
788デフォルトの名無しさん:2009/06/08(月) 20:31:10
>>787
まずは日本語から覚えた方がよさそうだな
789デフォルトの名無しさん:2009/06/08(月) 20:33:46
char &string;
って書いてるんだったりして。
790786:2009/06/08(月) 20:36:41
もう らちがあかないので

ソースみせるか、
参照の記述を勉強し直すか、
名前空間を記述するか

せめて少なくとも1つはやってみせてください。
なんかアドレスとごっちゃになってそうな予感もしますね。
791デフォルトの名無しさん:2009/06/08(月) 20:39:25
int func(const char *string)
792デフォルトの名無しさん:2009/06/08(月) 20:40:24
途中送信。>791を参照渡しにする
793786:2009/06/08(月) 21:04:14
>>791
それだけエスパーを強制しすぎです。

適当に答えるなら
//before
int func(const char *string);
const char * const p="mojiretsu";
func(p);
がアドレス渡し(ポインタ渡し)で、
//after
int func(const std::stirng &string);
std::string str="mojiretsu";
int func(str);
が参照渡しです。

せめて前後関係の分かるソースを見せてください。
答える側が書いたソースの方が長いっておかしいです。
794デフォルトの名無しさん:2009/06/08(月) 21:16:08
foo *p = new foo[bar]; delete p;
がまずいのはわかるんだけど
foo *q = new foo; delete [] q;
ってーのはべつにやばくない・・・よね?
795デフォルトの名無しさん:2009/06/08(月) 21:16:58
やばいよ。何が起きても知らないよ。
796デフォルトの名無しさん:2009/06/08(月) 21:17:12
std::stringで書き変えるのは要求を満たしてない気がするなあ。
797デフォルトの名無しさん:2009/06/08(月) 21:19:34
>>794
配列をnewしたときは、その配列のサイズなんかも保持しておくので
配列じゃないのにdelete[]だと、関係ない部分にアクセスする危険性がある……と教わったが、正確には違うかも。
798786:2009/06/08(月) 21:21:37
>>796
彼は
>C++の関数で文字列を参照渡しする方法
と言っています。
別にconst char*型変数を参照渡ししてもいいんですが、
もうエスパーするしかないからわかりませんよ。
799デフォルトの名無しさん:2009/06/08(月) 21:23:02
>>794
だめな理由は処理系によりいろいろあるだろうけど、そんなの関係ない。
「仕様上認められていない」ってだけで
十分に鼻から悪魔が出てくると結論づけられます。
800デフォルトの名無しさん:2009/06/08(月) 21:26:52
C++はめんどくさいな
801デフォルトの名無しさん:2009/06/08(月) 21:36:37
>>800
なにを今更w
802デフォルトの名無しさん:2009/06/08(月) 21:50:39
C++に限らず、多種多様の実装が存在する言語は多かれ少なかれそういう傾向にあると思う。
803デフォルトの名無しさん:2009/06/08(月) 23:34:58
doxygen = デュクシジェン
804デフォルトの名無しさん:2009/06/09(火) 01:06:17
doxygen destroyer
805デフォルトの名無しさん:2009/06/09(火) 04:19:56
>>804
http://pc11.2ch.net/test/read.cgi/gamedev/1238520070/692

692 :名前は開発中のものです。:2009/06/09(火) 00:57:34 ID:2fI/sHFo
何言ってんだ。プログラマにまともな精神持った奴がいた試しなんてねえよ。
第一プログラマと精神科なんてほとんどセットなのに今更それを語るとか情弱以下だろ。
806デフォルトの名無しさん:2009/06/09(火) 04:31:40
C言語をやりたいんだけど

Microsoftのc++ExpressEdition
ってのでもできますか?

#include <stdio.h>
int main(void){
printf("aaaa");
return 0;
}
みたいなのもちゃんとできますか?
807デフォルトの名無しさん:2009/06/09(火) 05:09:32
>>806
Microsoft Visual C++ 2008 Express Edition
の事ですね。
可能です。
ですが、最初はコンソールの方が分かりやすいと思いますよ。
C/C++初心者なら
bcc5.5.1+bcc developer
がなかなかオススメ。
エラーメッセージが分かりやすいので。
複雑なテンプレート等、まともなC++をやりたくなったらその時初めて
Microsoft Visual C++ 2008 Express Edition
gcc3.x, gcc4.x
などを試せば良いかと思います。
808デフォルトの名無しさん:2009/06/09(火) 09:17:19
まあ鼻から悪魔が出ることは無いと断言できる
809デフォルトの名無しさん:2009/06/09(火) 15:45:37
C/C++というよりLinuxの質問になってしまうのですが、
mq_sendとmq_receiveでメッセージキューのパラメータに
任意の構造体を渡すことはできますでしょうか?
関数仕様ではchar*のみのようですが。

メッセージキュー以外の方式で別プロセスに任意の型の
値を渡す代替案があればそれでも良いのですが。
810デフォルトの名無しさん:2009/06/09(火) 16:10:40

mmapとかpipeとか
プロセス間通信は、Linuxの方で聞いた方がいいかもね
811デフォルトの名無しさん:2009/06/09(火) 16:13:22
使ったこと無いけど
文字列にシリアライズして渡すんじゃねーの
そんな雰囲気のある関数っぽい
812デフォルトの名無しさん:2009/06/09(火) 17:07:30
>>809
昔は, 任意のバイト列に対するポインタは char* を使っていた
で, 関数使用はその名残だと思うんだわ

# kernel 内部の caddr_t とかの絡みもあるとは思うが………

構造体とか配列とかもバイト列として表現できるわけだから,
キャストすれば何でも可
813デフォルトの名無しさん:2009/06/09(火) 17:08:35
>>812
× 関数使用は
〇 関数仕様は
814デフォルトの名無しさん:2009/06/09(火) 17:27:02
なるほど、ありがとうございます。
mmapとかの共有メモリがお手軽そうですね。

>>812
やはりできるんですね。やろうとしてsegvでちゃったん
ですが、できるとわかればもうちょっと調べてみます。
815デフォルトの名無しさん:2009/06/09(火) 17:29:28
vectorのmax_size()って中の人はどうやって計算してるの?
816デフォルトの名無しさん:2009/06/09(火) 17:51:40
bad_alloc出した場合って普通何をするもんなのかな
・APIとかで開いた画像ファイルとかを閉じる
・そのメソッドで確保成功した分のメモリを開放する
・そのメソッド内での仕事が完了したらbad_allocを上に投げる
・再帰的に開放作業を繰り返して、一番上でプログラム終了
とかでいい?
817デフォルトの名無しさん:2009/06/09(火) 18:01:25
>>815
gcc 4.1は単にsize_type(-1) / sizeof(value_type)を返してた。
VC2008は、上の値とアロケータの最大サイズと比較してちっさい方返してた。
818デフォルトの名無しさん:2009/06/09(火) 19:52:52
void Initialize(){
ここで配列を5本動的確保

}

そしてこの関数で使いたいんですがどうすればいいですか?
void calc(){

}
calcは何度も呼び出すのでcalc内で動的確保するのは無駄だと思いました。
819デフォルトの名無しさん:2009/06/09(火) 20:03:38
template <typename _T,int _Size>
class hoge
{
private:
  std::vector<_T> _vec[5];
public:
   void Initialize(void)
  {
    for(int i=0;i<5;++i) _vec[i].reserve(_Size);
  }

   void calc(void)
  { 以下略

};
820デフォルトの名無しさん:2009/06/09(火) 20:09:32
vectorとかのコンテナのサイズを変えるときはtry-catch(bad_alloc)したほうがいいの?
821デフォルトの名無しさん:2009/06/09(火) 20:17:52
>>819
できればSTLなしで・・・
822デフォルトの名無しさん:2009/06/09(火) 20:48:36
>>821
お前の質問に対する答えが>>819なわけだが、STLがその答えの本質じゃないことぐらい判るだろ。
コードを一から書いて欲しいなら宿題スレ行ってこいよ。
823デフォルトの名無しさん:2009/06/09(火) 21:17:14
内容がC++からちょっとずれますがお願いします。
大学ではじめてのC++で勉強しているのですが、phpの初心者向けサイトで
コードをみたところc++と似ていて驚きました。c++はphpにも応用が利くと聞いたのですが、
C++をどの程度できるようになればphpでも簡単なwebサービスをできるでしょうか?
824デフォルトの名無しさん:2009/06/09(火) 21:32:03
C++をいくら極めてもwebサービスはできんじゃろ。
なんせ標準ライブラリにwebに関するものはまったくはいっとらんからな…。
825デフォルトの名無しさん:2009/06/09(火) 21:33:51
>>821
STLなしでとか何言ってるの?
まさかSTLない環境でやってるわけじゃなくて知識がないだけでしょ?
ちょっとで良いから勉強しろよ。
826デフォルトの名無しさん:2009/06/09(火) 21:34:11
>>814
Linux の実装はしらんが, Solaris とか *BSD とかの実装だと,

mq_send で msq_ptr からサイズ分 kernel 内バッファにコピーして,
mq_receive で該当領域を読み出し側にコピーする

で, kernel は該当領域にアクセス可能か否かの test 程度は行っている
ので, とんでもない引数を与えると EINVAL か何かが返るはず

segv が発生するのは, mq_receive で, msq_ptr として与えた領域サイズより
大きな msg_len を与えてスタック書きつぶしたときくらいじゃ内かな?
827デフォルトの名無しさん:2009/06/09(火) 21:34:16
文字処理が面倒だけど
cgiで起動すれば出来るんじゃね。
828デフォルトの名無しさん:2009/06/09(火) 21:36:02
0から99までの乱数を表示するプログラムを作ったんですが、コンパイルしたらまた新たな乱数を表示するにはどうすれば良いのですか?
829デフォルトの名無しさん:2009/06/09(火) 21:42:11
>>828
乱数系列切り替えればええんちゃうの?
830デフォルトの名無しさん:2009/06/09(火) 21:44:31
時刻でも乱数シードに使えばいい
831デフォルトの名無しさん:2009/06/09(火) 21:46:56
>>828
乱数の生成方法によって違うけれど乱数の種を設定できる仕組みがあるはずだからそれで種を変更する。
832デフォルトの名無しさん:2009/06/09(火) 21:50:14
>>829-831
ありがとうございます。
すいません。
かなり初心者なので、出来れば、詳しくお願いします。
今main関数の中が
cout<<rand()%100<<endl;
だけなんですが、何かつけ加えますか?
833デフォルトの名無しさん:2009/06/09(火) 21:54:17
>>832 そうゆう話なら取りあえず処理系の名前を書け
834デフォルトの名無しさん:2009/06/09(火) 21:54:55
↓以下乱数の質について
835デフォルトの名無しさん:2009/06/09(火) 21:56:53
箱を開けたら猫
836デフォルトの名無しさん:2009/06/09(火) 21:58:12
>>833
bcc32です。
837デフォルトの名無しさん:2009/06/09(火) 22:06:15
メルセンヌツイスタでぐぐるといいよ
838デフォルトの名無しさん:2009/06/09(火) 22:10:23
>>836
けっして誉められた手法ではないんだろうが
おそらく
sland(time(NULL))
とかやっとけば?

>>834 が期待してるように
用途に応じて生成される乱数の品質とかアルゴリズムとかが問題になる
置くの深い部分だけどな
839デフォルトの名無しさん:2009/06/09(火) 22:18:59
標準の乱数は大きな素数を割ってるだけみたいな単純な実装なので
それをそのまま使うとカルドセプトサーガみたいなことになるかもね♥
840デフォルトの名無しさん:2009/06/09(火) 22:25:25
>>838
ありがとうございます。
やってみます。
841デフォルトの名無しさん:2009/06/09(火) 22:31:08
>>837
ありがとうございます。
参考にしてみます。
842デフォルトの名無しさん:2009/06/09(火) 23:33:38
どういたしまして
843デフォルトの名無しさん:2009/06/10(水) 00:59:13
質問したいのですが誰かいますか?
844デフォルトの名無しさん:2009/06/10(水) 01:00:12
います
845デフォルトの名無しさん:2009/06/10(水) 01:11:32
じゃあ質問させていただきます。
今、作っているプログラムはあるファイルから特定の部分の値を読み込み
値だけのバイナリファイルを書き出すプログラムを作っているのですが。
sstreamを使い、値を変数に格納したいのですがfloat型だと格納できるのですが、
int型だと格納されません。
どうしてか教えてください。
ソース:
stringstream ss(f_buf);

int test[16 * 3]; //ここがint型だと値が入らない

for(int i = 0; i < (16 * 3); i++){

ss >> test[(i * 3)] >> w >> test[(i * 3) + 1] >> w >> test[(i * 3) + 2] >> w >> w;

}

データ:
0;1;2;,
1;2;3;,
846デフォルトの名無しさん:2009/06/10(水) 01:13:48
>>845

追記

stringstream ss(f_buf);の下に
char w; //記号を飛ばすための変数
847デフォルトの名無しさん:2009/06/10(水) 01:19:14
どうしてでしょう?
848デフォルトの名無しさん:2009/06/10(水) 01:20:34
わからん
849デフォルトの名無しさん:2009/06/10(水) 01:27:14
どなたか>>845の理由が分かる人いますか?
850デフォルトの名無しさん:2009/06/10(水) 01:29:17
たとえば古いgccはstringsteamの中身に挙動不審なバグがあるので、それが原因かもしれない。
今やってみたらとりあえずgcc 4.1とVC2008はどっちもちゃんと動いた。

#include <iostream>
#include <sstream>

using namespace std;

int main(void)
{
  int t[3];
  char w;
  stringstream ss("1,2,3,,");

  ss >> t[0] >> w >> t[1] >> w >> t[2] >> w >> w;

  cout << t[0] << " " << t[1] << " " << t[2] << endl;

  return 0;
}

出力
1 2 3
851デフォルトの名無しさん:2009/06/10(水) 01:34:22
>>850さん、ありがとうございます。
環境をかくの忘れてましたね…
環境はVC2005です。
>>850さんのソースも試してみましたがやはりだめなようです…
変数を作った時の不定な値が入ったままでした。
2008でビルドしてみようかな…
852デフォルトの名無しさん:2009/06/10(水) 10:06:43
あるディレクトリ下にあるファイルを読み取ってから削除するという処理をしているのですが、希にコピー途中のものを読み取ってしまい、
思ったような動作が出来ない場合があります。アクセスしようと(もしくはアクセス中の)ファイルが、コピー中であるか否かの判断は
一般的にどのような方法で実装するのでしょうか。
853デフォルトの名無しさん:2009/06/10(水) 10:07:49
>>852
OSは?
854デフォルトの名無しさん:2009/06/10(水) 10:09:47
>>853
Windows 2000/XP です。コピー元は同じPC上の時もあれば、ネットワークを介して他PCからの場合もあります。
855853:2009/06/10(水) 10:19:57
俺はUNIX屋なので、後は誰かに任せた。
856デフォルトの名無しさん:2009/06/10(水) 11:04:35
>>854
writeオープンしてからコピーする
857デフォルトの名無しさん:2009/06/10(水) 11:55:21
FILE_FLAG_DELETE_ON_CLOSEフラグ付けて開くとか
858デフォルトの名無しさん:2009/06/10(水) 12:41:47
std::stringでTCHAR扱えないので
std::basic_string<TCHAR>を使うってのはグーグル先生でわかったんですが、
入出力の方法が今度はわかりません。グーグル先生に聞いてもわかりませんでした。
std::cinやstd::coutの代わりにどのように使うんでしょうか?
859デフォルトの名無しさん:2009/06/10(水) 14:19:21
//hoge.h
class CHoge {
public:
 void hoge();
};

//hoge.cpp
#include "hoge.h"
void CHoge::hoge() {・・・};

このCHoge::hogeを省略してhogeだけで書きたいんですけどそういうことはできますか?
なぜかusing CHoge::hogeではできませんでした
860デフォルトの名無しさん:2009/06/10(水) 14:22:27
名前空間じゃなくてクラス名か。
全然「なぜか」じゃねーw

どうしても面倒なら、ヘッダファイルに中身も書いたら?
861デフォルトの名無しさん:2009/06/10(水) 14:30:00
C#を使えばおk
862デフォルトの名無しさん:2009/06/10(水) 14:34:07
>>858
wstring & wcoutを使う。

>>859
#define hoge CHoge::hoge
863デフォルトの名無しさん:2009/06/10(水) 14:51:54
+とか+=とか、そういった四則演算関連の演算子オーバーロードを作成したいのですが、
ネットで見ると、戻り値が参照だったり実体だったりして、演算子によって違うみたいです。
どういう考え方で参照と実体の使い分けをしているのでしょうか?
864デフォルトの名無しさん:2009/06/10(水) 14:58:39
関数を抜けても壊れない参照を返せるなら基本参照返し。
一時オブジェクトを返さざるをえないなら泣く泣く実体返し。
865デフォルトの名無しさん:2009/06/10(水) 15:49:30
float型の変数がゼロかどうか(誤差も含めて)判断するときに、
1e-4fみたいな数字で比較を行っているコードを見たんですが、
こういう数字の記述の仕方(意味)を説明してるウェブページをどこか知りませんか?
866デフォルトの名無しさん:2009/06/10(水) 15:53:30
科学表記とかでぐぐる
867デフォルトの名無しさん:2009/06/10(水) 17:32:36
初歩的な部分ですが、

while(i--) 処理

は「iの値が評価され、処理を実行するか決定する」→「iがデクリメントされる」

while(--i) 処理

は「iがデクリメントされる」→「iの値が評価される」

ということで、i>0なら前者は処理が i 回、後者は (i - 1)回行われるということでよいのでしょうか。
868デフォルトの名無しさん:2009/06/10(水) 17:34:44
コーディングの最終段階に入っていて、
なるべく見通しが良くなるように関数に処理を分割したりしています。
a,b,cという関数が有って各関数はうまく行けば0を返し失敗すれば1を返します。
aがうまく行けばbを,bがうまくいけばcを行いcがうまく行けば
最後に少量の出力が有ります。
そこで、今の段階はプロトタイプとして
int main()
{
if(a == 0) {
if(b == 0 {
if(c == 0{
//some print
}
}
}
return 0;
}
となっているのですが、ネストが深くなりすぎているような気がしてなりません。
なにか良い方法が御座いましたらご教授願います。
869デフォルトの名無しさん:2009/06/10(水) 17:37:21
if (!a && !b && !c)
870デフォルトの名無しさん:2009/06/10(水) 17:41:00
!(a||b||c)
871868:2009/06/10(水) 17:43:50
見落としていた点が有りました。
追加で書きますがお許しください。
aが失敗すればプログラム終了
bが失敗すればプログラム終了
cが失敗すればプログラム終了
とそれぞれ行いたく思います。
よろしくおねがいします。
872デフォルトの名無しさん:2009/06/10(水) 17:50:39
それは a が false を返す代わりに exit(1) を呼び出せばいいじゃないか^-^
873デフォルトの名無しさん:2009/06/10(水) 17:57:00
>>872
そうなんですよね、一度そのような事を考えたのですが
言語はC++なのですが、
http://kmaebashi.com/bbs/bbs12.html
というページを見かけてなんとなく怖くなってexit()を使わなくしたのですが、
実際どうなのでしょうか?
よろしくおねがいします
874デフォルトの名無しさん:2009/06/10(水) 18:09:17
どっちにしても>>869>>870でOK。
875デフォルトの名無しさん:2009/06/10(水) 18:11:32
>> 874
ありがとう御座います。
無事きれいになりました!!
感謝感激です。
876デフォルトの名無しさん:2009/06/10(水) 18:52:22
C++にはJavaのObjectクラスに相当するようなものは無いんでしょうか?

Java使い向けに書かれているデザインパターン本を読んでて
脳内翻訳するのに必要になったもので
877デフォルトの名無しさん:2009/06/10(水) 18:59:05
全然別人が話に食いつきます。
>>873が言う
>ISO/IEC 14882:1998 3.6.1-4
>exit 関数を呼び出すことは現ブロックを抜けずにプログラムを終了させることであるため、
>自動記憶域期間を持つオブジェクトは破棄されない。
>静的記憶域機関を持つオブジェクトのデストラクタ中から
> exit を呼び出すことは、未定義の動作を引き起こす。
これって
巻頭言 2000〜
ttp://park1.wakwak.com/~y-nagano/200001.html
ここに書いてあるとおりなんだろうが、
恐ろしいよねぇ。
878デフォルトの名無しさん:2009/06/10(水) 19:37:24
もよもと exit はプログラムの異常終了時くらいしか使わんからなー。
879デフォルトの名無しさん:2009/06/10(水) 20:17:11
>>858
自分で作ればいい。
#ifdef UNICODE
# define tcin std::wcin
# define tcout std::wcout
# define tcerr std::wcerr
# define tclog std::wclog
#else
# define tcin std::cin
# define tcout std::cout
# define tcerr std::cerr
# define tclog std::clog
#endif
あと、mainの頭で、文字コード変換が行われるように指示しておく。
std::locale l(""); // 数値を取り扱うならstd::locale l(std::locale::classic, "", std::locale::ctype);のほうがよいかも。
tcin.imbue(l);
tcout.imbue(l);
tcerr.imbue(l);
tclog.imbue(l);
880デフォルトの名無しさん:2009/06/10(水) 20:57:45
C++なら例外使えばいいのに
881デフォルトの名無しさん:2009/06/10(水) 21:00:13
>>880
誰もキャッチできない例外をスローするってこと?

みんなはそうしてるの?
882デフォルトの名無しさん:2009/06/10(水) 21:03:14
例外のよい使い方がいまだにわからん
883881:2009/06/10(水) 21:14:30
>>882
俺は
関数の戻り値は正常値ならおk、
異常値を返す場合は-1とか0とかそういう値に限り、
不完全なオブジェクトを返すような形は
とらないようにしている。
そして不完全なオブジェクトを返さざると得ない時に
例外を使っている。

・・・でもやっぱり俺もわからない。
884デフォルトの名無しさん:2009/06/10(水) 21:15:49
ttp://pc12.2ch.net/test/read.cgi/tech/1241438694/
ここの>>740が妙な提案をしていたよ。
もっとも実際には出来なさそうって結論になったのだが。
885デフォルトの名無しさん:2009/06/10(水) 22:06:18
ABCが失敗したら例外発生させて、キャッチして適当に処理して return 0 すればいい。
886デフォルトの名無しさん:2009/06/10(水) 23:24:46
VC++を勉強するのにお勧めの本ありますでしょうか?
初級〜中級くらいをめどに
887デフォルトの名無しさん:2009/06/10(水) 23:29:14
いわゆるぺゾルト本。
Programing Windows 第5版。

定番なので。
888デフォルトの名無しさん:2009/06/10(水) 23:32:10
>>886
VC++だから、MFCかも知れないが
普通にSDK使う程度なら、wisdomとか入門サイトから見るといいよ
俺はいろいろなサイト見て学んだ
889デフォルトの名無しさん:2009/06/10(水) 23:33:06
890デフォルトの名無しさん:2009/06/10(水) 23:37:56
今時MFCはどうかと思うけど、お勧めの本はなさす。
中級以上なら、Effective C++のシリーズお勧め
891デフォルトの名無しさん:2009/06/10(水) 23:38:07
この本は原著じゃなくても翻訳はまともだから大丈夫だよw

プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版!
(Microsoft Programming Series) (単行本)

まぁ…とっつきにくい感じはするかなぁ。
まぁ、あくまで定番ってことで。
892デフォルトの名無しさん:2009/06/10(水) 23:40:51
Effective C++はもちろん名著だけど、VCの勉強にはならんじゃろw
893デフォルトの名無しさん:2009/06/11(木) 00:16:36
質問です

Cでファイルに書き込むときに
fwrite(str, 1, strlen(str), fp);
fwrite(str, strlen(str), 1, fp);
とどちらが一般的ですか?何か違いは出てくるのでしょうか?
894デフォルトの名無しさん:2009/06/11(木) 00:24:08
VC++で、いっぱい書店においてるような本はどうなのですか?
入門〜やや中級手前レベル?の内容くらいかいてるようにはみえたのですが
役に立たないのかな
895デフォルトの名無しさん:2009/06/11(木) 00:56:43
>>894
プログラミング言語を全く知らない人が、いきなりVCに手を出す状況とかなら
決して悪くはないんじゃないかしら?
896デフォルトの名無しさん:2009/06/11(木) 01:49:07
>>893
fwrite(str, 1, strlen(str), fp);
に1票。
なんとなく2番めの引数は型のサイズ、3番めの引数はその個数って
思っている。
897デフォルトの名無しさん:2009/06/11(木) 04:45:58
>>893
>fwrite(str, 1, strlen(str), fp);
1バイトをstrlen(str)分書き込む、成功した際の戻り値がstrlen(str)

>fwrite(str, strlen(str), 1, fp);
strlen(str)バイトを1回書き込む、成功した際の戻り値が1

結果は同じ
ただ、意味のあるデータなら後者の方が意味的に良くない?
898デフォルトの名無しさん:2009/06/11(木) 07:13:39
>>895
>プログラミング言語を全く知らない人が、いきなりVCに手を出す状況
そうとうな窮地だな。
899デフォルトの名無しさん:2009/06/11(木) 07:24:29
#include <iostream>
#include <list>
int main() {
std::list<int> nums1;
nums1.push_back(4);
nums1.push_back(6);
std::cout << nums1[0] << std::endl;
std::cout << nums1[1] << std::endl;
return 0;
}
vectorで動いたソースをlistに変更してみたら動かないのでしがなんででしょうか?
900デフォルトの名無しさん:2009/06/11(木) 07:52:45
エラーメッセージ読めよ
901デフォルトの名無しさん:2009/06/11(木) 07:56:21
「動かない」というのはこの場合、極めて曖昧な比喩表現でしかない。
比喩を使われても困る。
902デフォルトの名無しさん:2009/06/11(木) 11:17:11
list<int>::iterator p = nums1.begin();
while( p != nums1.end() )
{
cout << *p << endl;
p++;
}
list はランダムアクセス子をもってない
903デフォルトの名無しさん:2009/06/11(木) 12:24:09
http://www.geocities.jp/KY_webid/cpp/library/012.html
なるほど了解した。ありがと
904デフォルトの名無しさん:2009/06/11(木) 15:57:58
gprofって、対象のプログラムが使うライブラリが全てスタティックリンク
でないといけないのです?
そういうのないですよね?
905デフォルトの名無しさん:2009/06/11(木) 22:09:13
try {
m_pInt = new int [N];
}
catch {
delete [] m_pInt; // <-するべき?それとも放置?
}
906デフォルトの名無しさん:2009/06/11(木) 22:28:03
>>905
m_pIntに予め 0 を入れておけばdeleteしても問題ない
907デフォルトの名無しさん:2009/06/11(木) 23:22:38
>>905
そんなことよりboost::scoped_array使え。
908デフォルトの名無しさん:2009/06/12(金) 01:31:58
ちょっとした質問です。
二分木の高さと深さは違うものですよね。
909デフォルトの名無しさん:2009/06/12(金) 01:37:26
木の「高さ」とノードの「深さ」のこと?
910デフォルトの名無しさん:2009/06/12(金) 01:46:07
下から見れば高さ、上から見れば深さ、相対的な違いか?
911デフォルトの名無しさん:2009/06/12(金) 01:57:06
視点が違うだけで数としては同じになる
912デフォルトの名無しさん:2009/06/12(金) 02:04:36
たとえば、a(左部分, 右部分)とあらわす。
aはroot
a(b, NULL)
b(c, d)
c(NULL, NULL)
d(NULL, NULL)
c,dはleaf
という風になっているとします。伝わるかわからないですが・・・
このとき、a,b,c,dそれぞれの高さは2,1,0,0で合ってますか?
913853:2009/06/12(金) 02:07:21
Fedora11落としてきたばかりなのに。
最近は自前でカーネルコンパイルするの減ったな。
914デフォルトの名無しさん:2009/06/12(金) 02:50:17
すいません。だれか僕が作ったプログラミングのデバッグしてくれませんか?お願いします。
初歩中の初歩です。
915デフォルトの名無しさん:2009/06/12(金) 02:56:30
お断りします
916デフォルトの名無しさん:2009/06/12(金) 03:04:38
とりあえずうp汁
917デフォルトの名無しさん:2009/06/12(金) 04:12:14
住所・氏名・連絡先も忘れずに。
918デフォルトの名無しさん:2009/06/12(金) 07:55:46
codepad
ttp://codepad.org/
ってところに貼れ。
貼ってどうすれば良いかは分かると思う。
919デフォルトの名無しさん:2009/06/12(金) 12:53:27
コンストラクタの引き数の規約を与えるための仮想基底クラスを作ることはできますか?
920デフォルトの名無しさん:2009/06/12(金) 13:00:43
http://codepad.org/WjzXeUiM
エラーがでるのですが
エラーを日本語にしてもらえないでしょうか?
921デフォルトの名無しさん:2009/06/12(金) 13:02:45
>>920
翻訳サイトつかってみたら?
922デフォルトの名無しさん:2009/06/12(金) 13:06:51
923デフォルトの名無しさん:2009/06/12(金) 13:09:35
>>920
どこにエラーが? 警告なら出ているようだけど。
924デフォルトの名無しさん:2009/06/12(金) 13:11:42
三行目を
void print( const char *c )
にすればいいよ。

925デフォルトの名無しさん:2009/06/12(金) 13:13:25
>>920
ほい、エラーを翻訳してやったよ。
--
誤りとして扱われる警告
--
926デフォルトの名無しさん:2009/06/12(金) 15:13:06
R255 G0 B0の赤色の1ピクセルのbitmapのデータ読み込みで
54byte飛ばして色データを読み込んで10進数で表示させたのですが

0
0
-1
0
と表示されます。
0
0
255
0と表示されないのはなぜでしょうか?
927デフォルトの名無しさん:2009/06/12(金) 15:22:52
>>926
charに読み込んでるとか。
928デフォルトの名無しさん:2009/06/12(金) 15:32:45
>>927
charではダメなんですか?
1バイトだからいいかと思ったのですが

char unchi[10000];
fread( unchi, 1, 5000, fp );

とやっています
929デフォルトの名無しさん:2009/06/12(金) 15:36:07
あ、わかりました
charって-127~128ですよね
unsignedにすればいいですか?
930デフォルトの名無しさん:2009/06/12(金) 15:37:24
できました。
お騒がせしてすいません
ありがとうございました。
931デフォルトの名無しさん:2009/06/12(金) 15:40:38
>>929
ビットマップに限った話ではないが
typedef unsigned char uint8;
とでもしておくと楽。
必要に応じてuint16,uint32,uint64もtypedefしといてもいいかと。
932デフォルトの名無しさん:2009/06/12(金) 15:51:13
char 配列に日本語が入っているとします。
改行コードが\nで統一されている場合に
wchar_tにポインタでキャストしたときに文字化けしない方法はありますか?
933932:2009/06/12(金) 16:05:38
キャストしたら\r\nでも文字が正しくなく・・・ 
windowsのwchar_tの文字コードは
UTF16とか効いた気がします・・・
934デフォルトの名無しさん:2009/06/12(金) 16:08:25
mbtowc(wchar_t *wc_str, const char *mb_str, size_t mb_scan_size);
935932:2009/06/12(金) 16:10:43
ここに書いてありました。 
EUCやSJISをwchar_t* にキャストして操作しても問題は出ませんか?
表示できないだけで。



ワイド文字 - Wikipedia
wchar_tの内部表現もUnicodeである必要はない。
本来はCode Set Independet(符号化集合に独立)なのである。
しかし、Windowsでは16ビット (UTF-16)、
LinuxやMac OS Xでは32ビット (UTF-32)である。
936デフォルトの名無しさん:2009/06/12(金) 16:30:16
>>935
文字列の終わりの0のサイズが違うんで、キャストしただけじゃ使えないと思う。
937デフォルトの名無しさん:2009/06/12(金) 16:31:42
質問です

int *Array;
int *pNum;

int Num = 10;

Array = new int[1];
Array[0] = Num;

*pNum = Array[0];

デバッグすると、このコードの最後の部分でエラーが起きます
どうすればうまくいきますか?
938デフォルトの名無しさん:2009/06/12(金) 16:34:19
>>937
pNumもメモリ確保しないと。
939デフォルトの名無しさん:2009/06/12(金) 16:38:29
>>938
ああ、なるほど
ありがとうございました
940デフォルトの名無しさん:2009/06/12(金) 19:04:46
ユニコードとかって3バイト以上の文字もありますよね?
wchar_tは2バイトなのにどうやってこれを格納してるんですか?
941デフォルトの名無しさん:2009/06/12(金) 19:25:10
>>940
>wchar_tは2バイト
そんなこと決まってないっしょ?
言語使用上定められているのは
sizeof(char)<=sizeof(wchar_t)
だけじゃない?
942デフォルトの名無しさん:2009/06/12(金) 19:39:08
つ UTF16
943デフォルトの名無しさん:2009/06/12(金) 20:44:25
少なくともうちでは2バイトじゃないから大丈夫だなあ
944デフォルトの名無しさん:2009/06/12(金) 20:55:20
cygwinはwchar_tが2バイトっていうイカれた仕様
なのでUTF-8が上手く使えない…
945デフォルトの名無しさん:2009/06/12(金) 21:04:42
windowsも2バイト
946デフォルトの名無しさん:2009/06/12(金) 21:13:12
そうなのか、失敬した
947デフォルトの名無しさん:2009/06/12(金) 21:55:53
UTF-8はマルチバイトだからchar*で扱うもの
948デフォルトの名無しさん:2009/06/12(金) 22:09:33
16bit整数二つ→32bit整数ひとつと変換して、配列の添え字に使いたいのですが
全部のインデックスからアクセス可能にしようとすると配列がでかくなりすぎてこまります
なにかいい方法はないでしょうか?
949デフォルトの名無しさん:2009/06/12(金) 22:12:12
inline static void foo();

static inline void foo();
とではどちらが正しいですか?

foo()はあるクラスの静的メンバ関数です。
950949:2009/06/12(金) 22:16:02
あれ?
MyClassの宣言中では
MyClass
{
//etc
static void foo();
//etc
};
と書き、
そのヘッダの中(ただし宣言の外で)実装を書いて
inline void foo()
{
//実装
};
と書くのがただしいですか?
951デフォルトの名無しさん:2009/06/12(金) 22:19:34
どっちでもいい。
どっちかが正しかったら、憶えなくちゃいけないから大変だ。
952949:2009/06/12(金) 22:22:17
>>951
ありがとうございます。
953デフォルトの名無しさん:2009/06/12(金) 22:23:49
>>948
つ map

mapなら、int x=-1; でも、a[x]がエラーにならない。
google製のmapもある
954デフォルトの名無しさん:2009/06/12(金) 23:52:12
>>940
Windows環境ではsizeof(wchar_t) == 2で、UTF-16を格納している。
昔はサロゲートペアはサポートしていないと聞いたような気がするが今はどうだか知らん。

多くの*NIX系環境ではsizeof(wchar_t) == 4で、UTF-32(UCS-4)を格納している。
955デフォルトの名無しさん:2009/06/13(土) 02:08:32
int型の配列に整数だけを代入したいときにはどうすればよいのでしょうか?
isdigitが数字かどうかの判定が出来るというので、使ってみたら、エラーが出ます。
これがソースの一部です。
for(i = 0; i < 10; i++){

while(isdigit(a[i]) == 0){
printf("%d個目の整数です。\n",i+1);
fgets(buf, 10, stdin);
sscanf_s(buf, "%d", a[i]);
}
}
whileの中身をどうにかすればうまくいくと思うんですが。
956デフォルトの名無しさん:2009/06/13(土) 02:14:55
いろいろとだめだろ。
&がついてないし、入力後に確認すればいいものをループの上で判定するし
たとえば変数xに数字が入っていたら代入すればいいし。

957デフォルトの名無しさん:2009/06/13(土) 02:15:07
ソースの一部を貼るのはいいが、特に初心者ならちゃんと変数宣言とかも書いてくれ。
あとエラーメッセージもちゃんと書いてくれよ。 エスパー技能を発揮できる人間はそうそういないんだから。
958デフォルトの名無しさん:2009/06/13(土) 02:23:10
たとえば。

int inputsu(){
int x;
do{ scanf("%d", &x);
} while(x<0 || x>1000);
return x; }

int main(){
int i; int a[10];
for(i = 0; i < 10; i++){
printf("%d個目の整数です。\n", i+1);
a[i]=inputsu(); }
}
959デフォルトの名無しさん:2009/06/13(土) 02:23:43
>>955
isdigitは、あるcharの1字が'0'から'9'までの数字に分類される文字かどうかを判定するだけ。
数値であるかどうかの判定とは違う。

a[i]に値が入るのはsscanf_sの時点。
そのsscanf_sは代入できたデータの数を戻り値にする。見るべきはこれ。

for (i = 0; i < 10; i++) {
    do {
        printf("%d個目の整数です。\n", i + 1);
        fgets(buf, 10, stdin);
    } while (sscanf_s(buf, "%d", &a[i]) != 1);
}
960デフォルトの名無しさん:2009/06/13(土) 02:36:13
>>956
入力後に確認ですか、ありがとうございます。

>>957
すいません、次から気をつけます。
visual C++ 2008EEでやっているのですが、ビルド時にエラーは出ないんです。
コンパイルしたときに
Debug Assertion Failed!
Program:...\Visual Studio 2008\Projects\~

Line: 56
Expression: (unsigned)(c + 1) <= 256

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

っていうメッセージが出ます。
961デフォルトの名無しさん:2009/06/13(土) 02:48:22
>>958
>>959
言われたとおりにやってみたら、
期待したとおりの出力結果が得られました。
ありがとうございます。
962デフォルトの名無しさん:2009/06/13(土) 10:23:58
Webを参考に全ての順列を列挙するプログラムを作ったんですが、
これをnPkが列挙できるように改良するにはどうすれば良いですか
引数を一つ増やして(int k) 終了条件をt.size()==kとしてみましたが
予想よりも多く結果が出力されてしまってうまくいきません

void perm(int p,vector<int>& v,vector<int> t){
if(t.size()==v.size()){
copy(t.begin(),t.end(),ostream_iterator<int>(cout," "));cout<<endl;
}
for(int j=p;j<v.size();++j){
t.push_back(v[j]); perm(p+1,v,t); t.pop_back(); perm(p+1,v,t);
}
}

int main(){
vector<int> v(5),t;
for(int i=0;i<5;++i){v[i]=i;}
perm(0,v,t);
}
963デフォルトの名無しさん:2009/06/13(土) 13:37:58
C言語でマイコンからLCDに文字列を出力するプログラムで

void PutString(char* point);
void PutChar(char data);

main(){
  PutString("Hello,world!");
}

void PutString(char* point){
  while(*point){
  PutChar(*point);
  ++point;
  }
}

void PutChar(char data){
  //LCDに1文字出力し、カーソルをインクリメントする
}

上記のプログラムが正常に動くのですが
PutString("Hello,world!");
文字列のリテラルとchar型ポインタは型があわないはずなのに
なぜこの行がエラーにならず正常に動のでしょうか?
マイコンというよりCの言語仕様の話だと考えたのでこっちに質問しました。
964デフォルトの名無しさん:2009/06/13(土) 13:42:06
俺も最近マイコンのプログラムに触れて思ったけど、
マイコン向けのコンパイラってANSIとかに厳密に追従してない感じだな

ところどころ気持ち悪い
965デフォルトの名無しさん:2009/06/13(土) 13:47:46
標準出力? 何ソレ? みたいな環境もあるからな。
それはしゃーない。
966デフォルトの名無しさん:2009/06/13(土) 14:05:57
>>963
"Hello,world"はchar[12]型。
それが配列からポインタへの変換でchar*になる。
型の問題はどこにもないぞ。
967デフォルトの名無しさん:2009/06/13(土) 14:15:59
ヒント:リテラル
968デフォルトの名無しさん:2009/06/13(土) 14:23:34
え?文字列リテラルは書き換えできなくてもchar*に変換できるだろ。
969963:2009/06/13(土) 15:52:05
>>964-968
アドバイスサンクスです。

関数コール時に一時的にメインメモリ上にchar[12]の領域が確保され
そのポインタが渡され、型の問題が生じない。という理解で良いですか。

char[12]が一時的に確保されたなら、その領域が解放されるのは
PutString("Hello,world!");
を抜けた時でしょうか。
970デフォルトの名無しさん:2009/06/13(土) 16:12:22
いいや、一時的な領域が作られることはないよ。
基本的に、文字列リテラルは予め用意された静的な領域に置かれるが、
そこへのポインタそのものがPutStringの引数として渡される。
971デフォルトの名無しさん:2009/06/13(土) 16:20:01
型安全についてCよりも厳しくなったC++では
この変換を「死の変換」と呼ぶ。
972963:2009/06/13(土) 16:26:04
>予め用意された静的な領域に置かれる
納得しました。

>>971
「死の変換」ですか・・・
関数から抜けた後は、その文字列リテラルへのポインタがわからなくなり
永遠にアクセスできない領域になってしまうためそう呼ばれるのでしょうか。

char hello[12] = "hello,world!"
と最初のほうに書いておき、
PutString(hello);
とやるほうが望ましいでしょうか。
973デフォルトの名無しさん:2009/06/13(土) 16:28:43
C++でnamespaceの名前つけかたのルールみたいなものってあるんですか?
Javaだと全部小文字でドメイン名をひっくり返したものとか、あるけど。

大文字で始まってるのよく見る気もするし。
ドットが入ってるのあんまり見ないし

ドメイン名っていうのはかぶらないのでいい方法だと思うけど
yahoo.co.jpだったらどんなのつけます?
974デフォルトの名無しさん:2009/06/13(土) 16:31:59
そういうのは、プロジェクトポリシーで決まるんじゃねーの
975デフォルトの名無しさん:2009/06/13(土) 16:36:10
>>972
いや、それよりもPutStringの引数にconstつけろよ。
976デフォルトの名無しさん:2009/06/13(土) 16:40:57
>>973
全世界にソース公開とかじゃない限り「絶対にかぶらない名前をつける」ってのは
重視しなくていいんじゃないかな。
ちなみに、自分はクラス名と同じ命名規則。
977デフォルトの名無しさん:2009/06/13(土) 16:44:55
プログラムのわかりやすさではstringだな。
生成と動作のコストがかかるが。
978デフォルトの名無しさん:2009/06/13(土) 16:52:01
長い文字列、データをソース内に貼り付けるとコンパイル時間かかりサイズもでかくなる。
計算や短い文から生成できるならそれ使うべき。
979デフォルトの名無しさん:2009/06/13(土) 17:29:48
日本語の識別子を使う人なんてめったにいないだろうから
namespaceで日本語を使えば被る確立はほとんどないだろう
コンパイラ依存だけど
980デフォルトの名無しさん:2009/06/13(土) 17:57:37
>>979
どう考えたって、
仕様違反のコンパイラ依存に確実になるくらいなら
namespaceがかぶる危険があるってだけの方が
まだマシだと考えるヤツが大半だと思うが。

ローマ字に止めるべし。
981デフォルトの名無しさん:2009/06/13(土) 18:01:00
和製英語のローマ字読み最強
982デフォルトの名無しさん:2009/06/13(土) 18:19:57
BOOL bBlockConnect(char * pAddr, int iPort, unsigned int uiMsg);
int iOnSocketEvent(WPARAM wParam, LPARAM lParam);
BOOL bInitBufferSize(DWORD dwBufferSize);
XSocket(HWND hWnd, int iBlockLimit);
virtual ~XSocket();

int m_WSAErr;
BOOL m_bIsAvailable;
BOOL m_bIsWriteEnabled;

void _CloseConn();

int _iSendUnsentData();
int _iRegisterUnsentData(char * cData, int iSize);
int _iSend(char * cData, int iSize, BOOL bSaveFlag);
int _iSend_ForInternalUse(char * cData, int iSize);

メンバ関数の 始まりの文字が
b -> return BOOL
i -> return int
と規則的に作られてるのですが
_ (アンダーバー)で始まるのは何の意味があるのでしょうか?
983デフォルトの名無しさん:2009/06/13(土) 18:24:17
実装した奴が、そうしたかったから
言語仕様での意味はないはず。
984デフォルトの名無しさん:2009/06/13(土) 18:39:53
privateなメンバとか。何か規則があると思う。
スコープがクラスだから、_[a-Z]+()なメンバ関数があっても他のスコープと識別子がかぶることはないが、
_[a-Z]+で始まる識別子は予約されているので、マクロで置き換えられたときに嵌まるおそれがある。
985デフォルトの名無しさん:2009/06/13(土) 19:00:49
STLのmapの容量はかってみた。 
<int,int>で2の21乗個登録したら、127M使用していた。
一個あたり、64バイト。
通常の配列だと4バイト、16倍も消費量が多い。
もっと少なくなるやつある?
986デフォルトの名無しさん:2009/06/13(土) 19:18:51
VC++2008で、2の22個の比較。 上はBCC最新版。

google::sparse_hash_map 50M
google::dense_hash_map 66M
STL map 132M

STLとsparseは挿入時にCPU負荷が高め。
STL使うならdense map使うとよさげ。
987デフォルトの名無しさん:2009/06/13(土) 20:57:57
その使用量はどうやって計ったの?
VC++ 2008のunordered_mapも計りたい。
988デフォルトの名無しさん:2009/06/13(土) 21:04:25
Windowsタスクマネージャですよ。プロセスのメモリ使用量の値です。
ページファイルの分はカウントされないようですが、
アクティブにして時間が立たないうちは、移動しないので正確な値のようです。
たとえばint(4バイト)を64M分確保したらちゃんと64M前後の値になります。
989デフォルトの名無しさん:2009/06/13(土) 21:08:35
あと、vectorやstringなどは実際に値を代入しないと
メモリを消費しないので注意してください。
vector<int> v(1<<24,0); としても表示に出ません。
memsetなどで値を入れたら実メモリに確保されます。
あと、確保後にgetchar(); で待ちを入れないと終了してしまいます。
990デフォルトの名無しさん:2009/06/13(土) 21:17:53
> あと、vectorやstringなどは実際に値を代入しないと
> メモリを消費しないので注意してください。
それはC/C++というよりOSの作り次第じゃないかな。
実際にそのメモリにアクセスするまではメモリを割り当てないってのはよくあること。
991デフォルトの名無しさん:2009/06/13(土) 21:28:48
64bitマシンかな?
赤黒親のポインタ三つで24バイト
自分とキーが両方intで8バイト
足して32ビットは必要最低限のサイズ。まだ半分までしか行かないね。なんか忘れてるかな。
それとも間に入れやすいように櫛みたいなすかすかのメモリ要求してるのかな。わかんない。
992デフォルトの名無しさん:2009/06/13(土) 22:04:26
>>988
OSはXP、それともVista?
そこを境に表示内容が異なるんだけど。
993デフォルトの名無しさん:2009/06/13(土) 22:07:41
何でsinとかasinとかってラジアン単位なの?
普通に30度ならsin(30)→(戻り値)→1/2とかasin(1/2)→30とかにしてくれた方が
一々ラジアンに変換しなくていいから楽なのに
994デフォルトの名無しさん:2009/06/13(土) 22:11:46
degだと展開するのめんどくさいじゃん
995デフォルトの名無しさん:2009/06/13(土) 22:12:20
>>993
数学だからじゃね?
数学者にとってラジアン以外まともな角度じゃないんだろ。
996デフォルトの名無しさん:2009/06/13(土) 22:16:09
高校の数学を勉強しなおして来いってことですね。ありがとうございます
997デフォルトの名無しさん:2009/06/13(土) 22:18:41
度にするって、「度分秒」で指定するってことか?
998デフォルトの名無しさん:2009/06/13(土) 22:37:40
>>993
三角関数を微分積分しようとしたら
ラジアン以外じゃやってられない。
理系の高等教育を受けた人のほとんどはラジアン脳
999デフォルトの名無しさん:2009/06/13(土) 22:43:01
d/dx sinx |x=0が1になるからだよ
1000デフォルトの名無しさん:2009/06/13(土) 22:50:11
微積はラジアン関係ない。 xは値が定まって異ない。
ラジアンが意味もつは、E^( i x) = cosx + i sinxという等式のためだろう。
x=πとすると、E^( iπ ) = -1 となる。


物理学者のリチャード・ファインマンはこの公式を評して
「我々の至宝」かつ「すべての数学のなかでもっとも素晴らしい,
そして驚くべき「公式」の一つだと述べている。
オイラーの公式 - Wikipedia
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。