【初心者歓迎】C/C++室 Ver.68【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
09/09/17 22:22:59
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.67【環境依存OK】
スレリンク(tech板)l50

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か   に置換しておくことをお勧めします。

2:デフォルトの名無しさん
09/09/17 23:01:03
 ○  >>1 乙 もうお前に用はない
 く|)へ
  〉   ヽ○ノ
 ̄ ̄7  ヘ/
  /   ノ
  |
 /
 |


3:デフォルトの名無しさん
09/09/18 00:41:55
          ◤◥◣
  ▂  ◢◤▀〓▲▂▐         ▂ ▪ ▂▄▅▆▇■▀▀〓◣▬ ▪ ■….
 ▍ ▼     ◥◣▼        .▂▅■▀ ▪ ■ ▂¨ ∵▃ ▪ ・
  ▀▍ ◢◤     ▅ ▐◣   ◢◤ ◢▇█▀ ¨▂▄▅▆▇██■■〓◥◣▄▂
    ▍  ▅ ◢■     ▍ ■ ▂▅██▅▆▇██■〓▀▀ ◥◣ ∴ ▪ .
  ▐   ▂   ▐◣ ▐▅▇███████▀ ▪ ∴ ….▅ ■  ◥◣
   ▀◣▂  ▀◥▅▆▇████████▆▃▂  ▪ ■▂▄▃▄▂
     ◥◣▄▂▄▅▀   ■  ¨ ▀▀▀■▀▀▀ ▪ ■ ∴‥

↑はUnicode対応のブラウザで見るとコーヒーを吹くプーさんが表示されますが、これを
1.正しく画面に表示する
2.テキストファイルに出力し、再入力してから画面に表示してもやはり正しく表示される
3.出力されたテキストファイルをUnicode対応のテキストエディタやブラウザで表示しても正しく表示される
ようにするC++のコードを書いてください。

多くの人にはとても難しいです。

4:デフォルトの名無しさん
09/09/18 01:13:38
MFC使えば簡単だけど
C++標準でやろうとすると死ぬな。

5:デフォルトの名無しさん
09/09/18 01:21:12
またあやふやなコトを…

6:デフォルトの名無しさん
09/09/18 04:23:11
たとえAAであってもディズニーキャラはモザイク掛けといた方がよくね?

7:デフォルトの名無しさん
09/09/18 12:10:11
wchar_t s[] = L"ハート♡髑髏☠DANGER☣";
wcout << s << endl;
wcout.clear();
wcout.imbue( locale( "Japanese" ) );
wcout << s << endl;

んー。動かん。
URLリンク(codepad.org)


8:デフォルトの名無しさん
09/09/18 13:32:14
バイナリモードでやったら

9:デフォルトの名無しさん
09/09/18 16:00:44
long double を使う必要が出たため、
Turbo C++(2005?)で long double を double へ変換するDLLを作成し、
VC2008EEで呼び出そうとしていたところ、関数コール部分で以下のエラーが出ました。

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

dumpbin でチェックしたところ、関数名はあっているようでしたし、
defファイルを作成し、lib /machine:i386 /def: で lib を作ってリンクもしています。
何が問題なのでしょうか?

10:デフォルトの名無しさん
09/09/18 16:34:37
URLリンク(download.microsoft.com)

↑を読んでみたけど、マイクロソフトでさえUnicodeを正しく表示できないのにワロタ。

11:9
09/09/18 18:00:13
追記です。
libを使用せず、LoadLibrary()を使用しても同じ結果でした。

12:デフォルトの名無しさん
09/09/18 18:12:55
とりあえず呼び出し規約は一致させてるのか

13:デフォルトの名無しさん
09/09/18 18:32:41
指定したURLのHPのソースコードを取ってくることは可能でしょうか?

14:デフォルトの名無しさん
09/09/18 18:36:59
>>13
HTMLソースって意味なら環境依存の方法で可能なことが多い。


15:9
09/09/18 18:38:19
>>12
libリンクの方だと__stdcallではVCの方でリンクエラーが出ていました。
そのため、libリンク方式の方は指定していません。
LoadLibrary()の方は__stdcallを指定しています。

16:デフォルトの名無しさん
09/09/18 18:38:32
>>14
C++標準関数でありませんか?
調べると、.NETやMFCなら沢山出てくるのですが・・・

17:デフォルトの名無しさん
09/09/18 18:39:39
>>13
ブラウザがやってることと同じことをやるだけだな。
HTTPプロトコルに従った手順(テキストベースの送受信)でやりとりして得るだけの話だし

18:デフォルトの名無しさん
09/09/18 18:41:43
>>16
言語レベルでそこまでの範囲を想定してないから、標準では無い。

非標準で、その手の面倒をみてくれるライブラリは あるかもね

19:デフォルトの名無しさん
09/09/18 18:46:01
>>15
呼び出し側の 宣言が狂っているんじゃないの?

lib式)
 プロトタイプ宣言の呼び出し規約定義はちゃんとあわせてるのか? (マンゲリング抑制も含めて

LoadLib式)
 GetProcAddress() の戻りをどうキャストして使ってるんだ?

20:デフォルトの名無しさん
09/09/18 18:52:50
>>17,18
ありがとうございます。
もう少し調べてみます

21:デフォルトの名無しさん
09/09/18 18:53:58
>>16
C/C++標準は、socket(ネットワーク)を扱えるものは何一つ無い。
どこぞでも書いたが、(Win環境ならwgetを入手して)
system("wget")が一番楽かもしれない。

22:9
09/09/18 19:28:43
>>19
双方同じヘッダをインクルードして使用しています。

ヘッダ
#ifdef _USRDLL
# define __PORT __declspec(dllexport) /* DLLを作る場合 */
#else
# define __PORT __declspec(dllimport) /* DLLを使う場合 */
#endif
#ifdef __cplusplus
extern "C"
{
#endif
__PORT double __stdcall LONGDOUBLE( void* p );
#ifdef __cplusplus
}
#endif

LoadLib式は以下の通りです。

HMODULE h;
FARPROC p;
double (*func)( void* );
h = LoadLibrary( "longdouble.dll" );
p = GetProcAddress( h, "LONGDOUBLE" );
func = (double (*)(void*))p;
変数 = (int)func( long doubleが入っているメモリへのアドレス );
FreeLibrary( h );

23:デフォルトの名無しさん
09/09/18 19:31:53
VC++2008と32bitXPを使っているのですが、
64bitのOSにするとint等のビット幅以外になにか変わるところはあるんでしょうか

24:9
09/09/18 19:35:40
>>19
>マンゲリング抑制
とは何のことですか?
ググってみましたがよくわかりませんでした。

25:9
09/09/18 19:41:18
>>19
double (__stdcall *func)( void* ); 
に変更したところ、問題なく動作しました。
ありがとうございました。

26:デフォルトの名無しさん
09/09/18 21:26:23
>>23
むしろ、intの大きさは変わらない。
変わるのはポインタ・ハンドル・L/WPARAM・LRESULT・size_tなどの大きさ。
これにより、アドレス空間1プロセス4GB(うちユーザが使えるのは2-3GB)という制限が大幅に緩和される。
あと、x86→x86-64だとレジスタの増加で高速化が期待できる。

>>24
extern "C"のこと。

27:デフォルトの名無しさん
09/09/18 21:34:55
>>26
あれ、そうなんですか。もう少しよく調べてみます
ありがとうございました

28:デフォルトの名無しさん
09/09/18 21:56:11
多数派はLP64なのにVC++だけは、なぜかLLP64


29:デフォルトの名無しさん
09/09/18 21:59:00
Windowsプログラミングだと、LRESULT,WPRAM,LPARAMが64bitになっていてはまる場合もある。
LPARAMをlongに代入できないとか。

30:デフォルトの名無しさん
09/09/18 22:13:44
GetWindowLongPtr使うと警告出されたりとか

31:デフォルトの名無しさん
09/09/18 22:19:51
>>30
それは/Wp64をオフにすればいいだけ。
もう64ビット対象にばんばんビルドして確かめてくれってことで、
VC++ 2008では/Wp64オフが初期設定となっているから、それにならえばいい。

32:デフォルトの名無しさん
09/09/19 06:41:02
入出力マニュピレータ endlとか
なんで引数どころか()まで省略できるの?

33:デフォルトの名無しさん
09/09/19 07:21:21
>>32
それらを書くか書かないかで意味が違う。省略できているわけじゃない。

34:デフォルトの名無しさん
09/09/19 09:48:11
詳しく

35:デフォルトの名無しさん
09/09/19 10:46:35
int a,b,c,d,e;の中にランダムに整数が入ってるものとします。
この5つの中でいちばん数が小さい変数を見つけるにはどうやるのが良いでしょうか?

36:デフォルトの名無しさん
09/09/19 11:00:13
>>35
4回比較する

37:デフォルトの名無しさん
09/09/19 13:16:18
暗黙のアップキャストを抑制して、明示的にキャストした場合のみ
アップキャスト可能にすることって可能でしょうか?

38:デフォルトの名無しさん
09/09/19 13:23:29
暗黙のアップキャストを抑制する必要性自体がほとんどないし、できなかったと思う。
具体的に必要な場面を示せばなんか方法はあるかもしれない。


39:デフォルトの名無しさん
09/09/19 13:32:40
>>37
private 継承して BaseType& Base() を用意するとか?

40:デフォルトの名無しさん
09/09/19 14:17:48
class A;
class B : A;

func(A);
func(B);

templateの絡みで、こんな感じに親クラスと派生クラスを
オーバーロードした同名関数で処理したいのですが。

41:デフォルトの名無しさん
09/09/19 14:27:49
>>40
ん?それなら普通にオーバーロードで済まないか?

A, B の例でいいから、今できてるところまでひととおりのコードを貼ってみるといいかもね。

42:デフォルトの名無しさん
09/09/19 14:36:15
class Hoge {・・・};

int main(void)
{
Hoge h;

h; // ※

return 0;
}

※をエラーに(できればコンパイル時)することはできますか?

43:デフォルトの名無しさん
09/09/19 14:50:46
0除算でもしてみては

44:デフォルトの名無しさん
09/09/19 14:53:30
>>42 無理

45:デフォルトの名無しさん
09/09/19 15:15:22
C/C++は評価した値を捨てる事ができる言語だからな
Pascalとは違う

46:デフォルトの名無しさん
09/09/19 15:22:16
>>41
オーバーロードが用意されていればキャストされないのですね。
すみませんでした。

47:ぅゅ ◆e6.oHu1j.o
09/09/19 23:39:19
>>42
Cだとそういうの警告でるよ
エラーだすの実行時でいいならboolオペレーターっていうのがある
operator bool(){
printf("era-");
return 0;
}

48:ぅゅ ◆e6.oHu1j.o
09/09/19 23:40:47
あ、すまん勘違い
それじゃboolオペレーターの実行されねーや

49:デフォルトの名無しさん
09/09/19 23:42:18
>>47
その警告に C と C++ は関係ない。
その operator bool を Hoge に宣言しても h; では呼び出されない。

50:デフォルトの名無しさん
09/09/20 02:04:05
>>42
のコードって規格ではどういう動作するように決められてるの?無視するだけ?

51:ぅゅ ◆e6.oHu1j.o
09/09/20 08:03:51
>>47borlandでは.cのとき警告

52:デフォルトの名無しさん
09/09/20 10:15:49
Carクラスがあるとします
Car car1;
とオブジェクトを作成するのと
Car* pCar;
pCar=new Car;
とメモリを確保するのと、どういう短所長所があるのでしょうか?

53:デフォルトの名無しさん
09/09/20 10:27:03
前者はスコープを抜けるときにオブジェクトが自動的に削除される。そして生成廃棄が速い
後者は不要なオブジェクトを手動でdeleteする必要がある。そして生成廃棄が遅い。
なのに、なぜ後者が有るかというと、生成と廃棄のタイミングを自由に操作できるから。



54:デフォルトの名無しさん
09/09/20 10:31:24
>>53
なるほど、ありがとうございます
グローバル変数ほど長く使いたくない場合に使うんですね

55:デフォルトの名無しさん
09/09/20 13:05:14
templateの>>を離して書くのがだるいんですがこれはもうどうしようもないんですか?

56:デフォルトの名無しさん
09/09/20 13:37:34
そんなやならdifineでも使ってみては


57:デフォルトの名無しさん
09/09/20 13:42:31
>>55 c++0xで正式に実装される。
VC8でもできるから、できるコンパイラを使えばいい。



58:デフォルトの名無しさん
09/09/22 11:53:26
struct base
{
virtual void hoge(){・・・};
};

struct sub : public base
{
virtual void hoge(){・・・};
};

int main(void)
{
sub s;
s.hoge();
return 0;
}

↑見たいな感じに書いても仮想関数の検索コストって掛かるもの?
静的に決定できるからコストかからないと思うんだけどどうなんでそか?

59:デフォルトの名無しさん
09/09/22 12:00:13
>>58
コンパイラによるとしか

60:デフォルトの名無しさん
09/09/22 13:49:23
>>58
VCで確認したら、sub::hogeを直接コールしてた。

61:デフォルトの名無しさん
09/09/22 15:38:50
>>58
BCC(ECC6.2.0)もsub::hogeを直接コールしてた
最適化が糞なコンパイラですらこれだから大抵のコンパイラは
出来るだけ静的に解決出来る所はするのではないか

62:デフォルトの名無しさん
09/09/22 15:45:10
細かな部分で挙動がクソなだけでBCCの最適化は普通に良いよ

63:デフォルトの名無しさん
09/09/22 15:48:48
gccも直接sub::hogeしてた

64:デフォルトの名無しさん
09/09/22 17:07:54
みんなテストさんくすこ

65:デフォルトの名無しさん
09/09/22 17:26:08
というか直接呼ばないようにコンパイルする意味が分からないってレベルだしな
まぁでも、確実な根拠があると一応ちょっと安心かな

66:デフォルトの名無しさん
09/09/22 17:35:53
>>58
VCでこうだと、テーブルジャンプになってた。

sub* s = new sub();
s->hoge();



67:デフォルトの名無しさん
09/09/22 17:38:31
そりゃそうだろw

68:デフォルトの名無しさん
09/09/22 17:41:20
>>67
これ、最適化したらまずいの?

69:デフォルトの名無しさん
09/09/22 17:58:52
それの場合、最適化するコンパイラは無さそうだけどなぁ
sが実際に保持している型をコンパイルタイムで追尾しなきゃならないから、処理が
重くなる割には性能向上が全く期待できない(レアケースすぎるから)
規格上、確実にs->hoge()の時点でsのポイントするインスタンスがsub型と確定可能
かどうか、というのもちょっと確信は持てない(newの辺りが特に)
まぁ実験するのは面白いかも

70:デフォルトの名無しさん
09/09/22 18:13:46
ちょっと見た目では、sub::hoge()以外が呼ばれる余地がないと思うけど、
なんか落とし穴でもあるのかね。
最適化されないってのは。

71:デフォルトの名無しさん
09/09/22 18:28:56
>>70

new が例外起こす場合を考慮すると、s == NULLもあるから
sub::hoge()は呼べないのでは。

つーか new がオーバーライドされてたらもはや何でもあり。


72:デフォルトの名無しさん
09/09/22 18:29:17
ポインタが実際に指している型を静的に追尾するメリットは、>>66のようなコードが
ごく僅かに最適化されるくらいだと思う。
実用的にはメリット皆無に限りなく近い予感。コンパイルも遅くなるだろうし。

73:デフォルトの名無しさん
09/09/22 18:30:09
>>71
new で例外が発生すれば s への代入も、それに続く s->hoge() の呼び出しも行われない
から、それは関係ない。

74:デフォルトの名無しさん
09/09/22 18:34:06
需要が無いor真面目に書けば最適化不要、って場合は最適化を期待しない方がいい

75:デフォルトの名無しさん
09/09/22 19:29:57
s->hoge();の時点でアップキャストもダウンキャストもなく、
正しくsubのインスタンスを指してることをどうやって保障するかじゃない?
人間には簡単に分かる事もコンパイラだと100万行のコードでも同じ動作しなきゃならんと思うとかなり面倒な気がする

76:デフォルトの名無しさん
09/09/22 19:48:59
vc8だとs.hogeはインライン展開、s->hogeは仮想呼び出し

intel c++だとs.hogeもs->hogeもインライン展開された。


77:デフォルトの名無しさん
09/09/22 20:19:27
流れと無関係にsubという識別子が気になるPerl経験者であった

78:デフォルトの名無しさん
09/09/22 23:23:40
Intelコンパイラさんマジパネー

79:デフォルトの名無しさん
09/09/24 23:58:38
URLリンク(kansai2channeler.hp.infoseek.co.jp)

ロープレのイベントなんかで、使う分だけ
メモリを確保したいのですが、こんな感じでいいでしょうか。

メモリは正しく確保できているか、
通常の配列より容量を削減できているかあたりです。

80:デフォルトの名無しさん
09/09/25 00:14:25
>>79
これならほとんどの場合において配列だけの方がメモリ効率はいいよ
開発効率をあげたいなら STL を使うといいよ

目的が、作ることより勉強優先っていうなら苦しむといいよ

81:デフォルトの名無しさん
09/09/25 00:40:41
void hogehoge(double x0, double x1, double dx, const fugafuga& fuga)
{
for(double x = x0; x < x1; x += dx) fuga(x);
}

これを

template <class Iterator>
void hogehoge(Iterator begin, Iterator end, const fugafuga& fuga)
{
for( ; begin != end; ++begin) fuga(*begin);
}

という形にしたいんですけど新しいIterator作る以外になにか手はありますか?

82:デフォルトの名無しさん
09/09/25 01:09:43
>>80
ありがとうございます。

メモリは、3つのイベントを作るとすると、
配列だと作った数に関係なく 8 * 32 バイト、
ポインタだと 4 * 32 + 8 * 3 で少なくできると思ったのですが。
(4はポインタのサイズ、8は構造体のサイズ、
32はイベントを作れる最高の数)
また、構造体のサイズは、実際のゲームではもう少し大きいです。

その効率の悪さについてググってみたのですが、
連続な領域でない事が関係しているんですかね。

stlはc++の機能みたいですね。
ヒントになる事もありそうなので勉強してみます。

83:デフォルトの名無しさん
09/09/25 02:42:11
>>81
配列や標準コンテナに入れて呼び出すとかでいいの?

84:デフォルトの名無しさん
09/09/25 15:00:42
URLリンク(msdn.microsoft.com)
にあるSendInput関数という関数を使いたい場合は、
SDKというものをインストールしないとダメなのでしょうか?

85:デフォルトの名無しさん
09/09/25 16:08:07
環境による

86:デフォルトの名無しさん
09/09/25 16:47:39
staticメンバ関数から
同じクラスの中にある他のメンバ変数(静的か非静的かは問わず)を
操作することはできないのですが
どうしても操作したい場合には
どういった方法をとることができるのでしょうか?

87:デフォルトの名無しさん
09/09/25 16:53:15
引数で渡せばおk

88:デフォルトの名無しさん
09/09/25 17:17:10
staticメンバ関数じゃなくすればOK

staticメンバ関数は特定のインスタンスに対する操作ではないので、
インスタンスごとに存在するメンバ変数にアクセスできないのは当然です。
どのインスタンスのメンバ変数にアクセスしたいのかを指定するには、
(1) 通常のメンバ関数にする → this で指定されるインスタンスにアクセスする
(2) 引数でインスタンスを渡す → 引数で指定されたインスタンスにアクセスする
(3) 別の変数(グローバル変数やstaticメンバ変数)でインスタンスを指定する
のどれかの方法で行います。

89:デフォルトの名無しさん
09/09/25 17:54:25
aaa型のabcという構造体を1.txtに書き出しました。
1.txtの内容をabcに代入するにはどうやればいいんでしょうか?

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp ;
fp = fopen("1.txt", "w");

struct aaa{int a;int c;};
aaa abc;
abc.a=500;
abc.c=555555;
fwrite( &abc, sizeof(aaa), 1, fp ) ;
return 0; }


90:デフォルトの名無しさん
09/09/25 17:56:05
fread()

91:デフォルトの名無しさん
09/09/25 17:58:04
>>81
その例なら、イテレーターとしてint*が渡せるね

92:デフォルトの名無しさん
09/09/25 18:03:07
>>89
出来ればfwrite()、fread()を使う時は"wb"や"rb"で開いた方がいいよ
ランダムアクセスする時にcooked modeだとズレが邪魔をするOSがある

93:デフォルトの名無しさん
09/09/25 19:37:49
>>90>>92
ありがとうございました。がんばってみます

94:79
09/09/25 21:44:42
すいません、別スレで質問したいと思います。
ありがとうございました。

95:デフォルトの名無しさん
09/09/25 21:56:16
>>89
じゃないんだけどバイナリエディタで読むと
23 7A 08 00
で、
00 08 7A 23
の順で読み込めばいいんでしょうかー?

96:デフォルトの名無しさん
09/09/25 22:10:12
リトルエンディアンだとそう。
abc.cの部分についてだよね

97:デフォルトの名無しさん
09/09/25 22:11:14
今のLvだとそこは深く考えなくていいと思うよ。
単純にfreadとfwrite使えばいい。

98:デフォルトの名無しさん
09/09/25 22:14:06
>>96>>97
そうです、ありがd

99:デフォルトの名無しさん
09/09/25 22:55:41
fprintf(fp,"%lf %lf %lf %lf %lf %lf %lf %lf",a,b,c,d,e,f,g);

cout << a <<" "<< b << setw(1) << c <<" "<< d <<setw(1)
<< e <<" "<< f << " " g << endl;
な感じのタイプ数が多いのを
cout << a << b << c << d << e << f << g << endl;
こんな具合に書きたいんですが、何かいい方法ありませんか。


100:デフォルトの名無しさん
09/09/25 22:58:31
>>99
オペレータをオーバーライド

101:デフォルトの名無しさん
09/09/25 23:00:49
ほとんどオブジェクト指向理解してないので、書いてくれるとうれしいでつ

102:デフォルトの名無しさん
09/09/25 23:01:45
>>100 それはオーバーロード。
>>101 オブジェクト指向とか関係ないから。

103:デフォルトの名無しさん
09/09/25 23:08:34
んじゃ、オーバーロード理解してないんで、書いてくれるとうれしいなぁ...

104:デフォルトの名無しさん
09/09/25 23:12:02
>>103 ググレカス

105:デフォルトの名無しさん
09/09/25 23:41:43
>>3
血をはいてるぷーさんにしか見えん

106:デフォルトの名無しさん
09/09/26 00:33:22
>>92

どこかで聞いたような単語を、意味も知らずに偉そうに使って
恥ずかしくないですか?

107:デフォルトの名無しさん
09/09/26 00:54:51
Class* a; と Class *a; の違いがわかりません。
両者は使い分けないといけないものなのですか?
それとも一方にそろえるべきものなのですか?

108:デフォルトの名無しさん
09/09/26 01:23:04
どこにホワイトスペースを挟もうと違いはない。

109:デフォルトの名無しさん
09/09/26 02:14:06
>>107
Class* a, b; と書いたら

Class *a, *b; という意味にはならず
Class *a, b; という意味になるので注意
それだけ気をつけていればどちらで書いてもOK

110:デフォルトの名無しさん
09/09/26 02:38:08
>>92
cooked modeという言葉を初めて知ることができてよかった。
けどバイナリに対する言葉はアスキーもしくはテキストと言ったりしない?

111:デフォルトの名無しさん
09/09/26 02:59:23
>>110
まあどっちでもいいんだけどな
バイナリモードに対応するのはraw mode
MS/DOS、Windowsのみに存在する区別らしい

Linux、UNIXには区別は存在しない

112:デフォルトの名無しさん
09/09/26 03:07:29
fopen()のtとbは、raw とかcookedとか言わないだろ。

113:デフォルトの名無しさん
09/09/26 03:11:40
頭の中でわかっていればいいんだよ
他人に伝える時はテキストとバイナリと言うべきだけどな

114:デフォルトの名無しさん
09/09/26 03:18:45
まぁMS-DOSが懐かしくはあった

115:デフォルトの名無しさん
09/09/26 03:22:25
素人がインストロールとか言ってたら、ネタにして笑ってるくせに。

116:デフォルトの名無しさん
09/09/26 03:37:26
cooked mode という用語は、
一般的には端末入出力、特に入力時に
編集した結果を受け取るのではなく
Enterやカーソルキーなどの、生の情報を受け取るために使う。

ファイルの\r\n変換に使うことなど、まず無い。
なぜならば、そもそもファイルのベタなデータを
「行」という単位で扱おうとしていること自体
「生のままで扱っていない」から。

\r\n変換のことを cooked mode なんて呼ぶと
陰で笑われるから、気をつけたほうが良いよ。

117:デフォルトの名無しさん
09/09/26 03:48:29
望むところだ

118:デフォルトの名無しさん
09/09/26 03:53:36
>>115
その例が同質のものだと思ってるなら、お前の頭もネタにして笑われるレベルだな。

119:デフォルトの名無しさん
09/09/26 03:57:31
知ったかして恥ずかしい用語の使い方してるってだけのくせして、なにとりつくろってんだ。

120:デフォルトの名無しさん
09/09/26 11:00:53
Linux環境でP2Pボイスチャットを作りたいのですが、C++のオーディオに関する知識がまったくないので、
どのライブラリを使えばいいのかわかりません
オーディオストリーミングに適したライブラリがあれば教えてください

121:デフォルトの名無しさん
09/09/26 11:55:57
>>120
背伸びするのはいいんだけど、背伸びしすぎじゃねーの
オーディオだけじゃなくて、ストリーミングもP2Pの知識もないんだろ?

122:デフォルトの名無しさん
09/09/26 15:14:35
関数についてですが、void aaa();と宣言したあと、
main関数の中でもう一度void aaa();sと書くのは、もう一度プロトタイプ宣言をしていると言うことでしょうか?

またこのように、サイトなどからコピーする時に、よく型をつけたままコピーしてしまい不具合が起きてしまいます。
これを防ぐ方法はないでしょうか?

void aaa();
int main() {
void aaa();///←ココ
return 0; }
void aaa(){return;}

123:デフォルトの名無しさん
09/09/26 15:19:00
>>122
関数内の void aaa() は外にある宣言を繰り返していることになる。
ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。

2つ目の質問は、「型をつけたままコピー」と「不具合」が何のことかわからん。

124:デフォルトの名無しさん
09/09/26 15:20:16
>>122
型の不一致が無ければ問題ないよ

125:デフォルトの名無しさん
09/09/26 15:49:31
>>123>>124
ありがとうございましたす
後半はあんまりキニシナイでください

126:デフォルトの名無しさん
09/09/26 18:51:56
>>108, 109 ありなとう
ひところから急に Class* な表記が流行りだしたような気がしてたから
ちょっと気になってたんですが、自分の好きなClass *表記で気にしない
ようにします。

127:デフォルトの名無しさん
09/09/26 21:12:03
C/C++の形態論的にはClass *a;という書き方のほうが整合性が取れているように
思う。意味論的にはClass* a;のほうが相応しいと思う。文法的にはClass*a;
でも構わないけどw まあ、好みで。自分はClass *a;。

128:デフォルトの名無しさん
09/09/26 21:29:02
template <class T> struct add_pointer{ typedef T* type; };
add_pointer<some_class>::type psc;
これが正解だからこれからはこれを使うように

129:デフォルトの名無しさん
09/09/26 21:31:51
俺はClass* a;だな
「Classのポインタ」という変数aって感じがいい
>>109みたいな問題があるけど、1行で複数の変数を宣言しなければいいんだし

130:デフォルトの名無しさん
09/09/26 21:38:42
Class *p;とClass* p;はどっちでもいいけど、
Class &r;はなんかいやだなあ。

131:デフォルトの名無しさん
09/09/26 21:40:06
>>129
どっちかっていうと、Classへのポインタ

132:デフォルトの名無しさん
09/09/26 21:41:51
Class * ptr;派が一人もいないことに絶望した

133:デフォルトの名無しさん
09/09/26 22:10:29
それってなんか掛け算っぽくね?
完全に独断と偏見だけどさ。

134:デフォルトの名無しさん
09/09/26 22:18:45
依存名だと掛け算優先だね

135:デフォルトの名無しさん
09/09/26 22:56:30
>>123
> ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。
そなの?

136:デフォルトの名無しさん
09/09/26 23:16:40
>>135
C の場合、引数リスト無しの関数宣言 f() は f(...) と同じで、呼び出し時に引数の型は
チェックされない。一方プロトタイプ宣言といえば以下のもの。
ISO C 6.2.1 p2
> (A function prototype is a declaration of a function that declares the types of its parameters)
(関数プロトタイプとは関数の宣言で、その引数の型を宣言するもの)

C++ の場合、引数リスト無しの関数宣言 f() は f(void) と同じで引数を取らないことを
宣言するが、 C++ には引数の型を宣言しない関数宣言というものが無いので、そもそも
関数プロトタイプというように呼び分ける必要が無く、すべて単に関数の宣言と呼べばいい。

137:デフォルトの名無しさん
09/09/26 23:21:50
34へぇ

138:デフォルトの名無しさん
09/09/26 23:23:51
65へぇ

139:デフォルトの名無しさん
09/09/27 01:50:04
unicodeを扱おうとワイド文字列型(wchar_t)に入れようとしましたが、うまくいきません
どこが間違っているのでしょうか・・?
int main() {
wchar_t aaa[]="テスト";
return 0;
}

140:デフォルトの名無しさん
09/09/27 01:52:44
>>139
× "テスト"
○ L"テスト"

141:デフォルトの名無しさん
09/09/27 02:00:34
int main() {
wchar_t aaa[] = L"テスト♥";
wcout << aaa << " : " << aaa << endl;
return 0;
}

142:デフォルトの名無しさん
09/09/27 04:32:31
ありがとうございます

143:デフォルトの名無しさん
09/09/27 08:26:21
>>121
ストリーミングもP2Pも理論的には解っていますが、作った事はありません
P2Pボイスチャットを作るのは大変だとわかっていますが、大学の課題なので
何とか完成させたいのです
よろしくおねがいします

144:デフォルトの名無しさん
09/09/27 10:26:25
よしくです
int Row = 10;
int Col = 20;
std::vector<std::vector<int> > Array(Row, std::vector<int>(Col));
このように書くことで、2次元int 型のvector コンテナが定義できますが
他の型、(list やmap、独自クラス)でも2次元のコンテナを作りたいのですが
templae を用いて、汎用的にしたいのですが、どのように書いたらいいでしょうか。
よろしくお願いします。

145:デフォルトの名無しさん
09/09/27 11:08:42
>>144
template template パラメータを使うことが考えられる。
現行の C++ では template template パラメータの引数の数を固定しないといけないから、
使う側で専用の template メタ関数を用意しないといけないかもしれない。

146:デフォルトの名無しさん
09/09/27 11:10:41
#include <vector>
#include <list>

template <
template <class, class> class Cont,
class T,
template <class> class A = std::allocator
>
struct Table
{
typedef Cont<Cont<T, A<T> >, A<Cont<T, A<T> > > > Type;
};

int main(void)
{
Table<std::vector, int>::Type vec2d;
Table<std::list, int>::Type lst2d;

/* ・・・ */

return 0;
}

templateはよくわからんがこんな感じ?

147:デフォルトの名無しさん
09/09/27 12:07:05
>>144です
>>146Thxです
使い方としてはこんな感じでしょうか?
vec2d[10][10];
vec2d[0][0] = 100;
int i = vec2d[0][0];
std::cout << i << std::endl;
でもこれだと、Out of range で落ちてしまいますが?
セマンティクス的に間違ってるんだろうか?

148:デフォルトの名無しさん
09/09/27 12:09:05
>>147
デフォルトコンストラクタが走っただけじゃ空なんだから、当然だろ。

149:デフォルトの名無しさん
09/09/27 14:19:41
>>144だが
More Effective C++ に載ってたので終了。

150:デフォルトの名無しさん
09/09/27 16:23:47
kwsk

151:デフォルトの名無しさん
09/09/27 16:55:30
Proxy Classだろjk
でもlistで二次元配列作ると疎行列以外の用途では
やたらと速度が遅くなっていかんな

152:デフォルトの名無しさん
09/09/27 17:08:14
二次元配列なんて配列かvectorぐらいでしか使わんような気がするんだが本当に凡化する必要はあるのか

153:デフォルトの名無しさん
09/09/27 17:34:46
数値ならvalarray使ったほうがいいし
キーとレコードならmap使ったほうがいいし
生の二次元配列を使うことは少ないな。

154:デフォルトの名無しさん
09/09/27 18:13:04
>>144です
最近template 中毒に冒されいて、どうして汎用化できるだろうかと、気になってしょうがないw

155:デフォルトの名無しさん
09/09/27 18:16:23
MESTLにもコンテナの汎化は基本的に悪手と書いてあったな
どうしてもやるならアダプタかませてインターフェースを調整しないといかん

156:デフォルトの名無しさん
09/09/27 18:22:54
VS2008C++使っています
別のアプリケーション(メモ帳)にsendkeyで入力したいのですが、どうすればいいでしょう?
何とか↓まで調べたのですがこの先が良く分かりません。知ってる方いましたらお願いします。
#include<iostream>
#include <conio.h>
#include <windows.h>

using namespace std;
int main() {
wcout.imbue(std::locale(""));

HWND qqq = FindWindow(
L"[Edit]", // クラス名//1つ目不明点
L"1.txt - メモ帳" // ウィンドウ名
);
SendInput(
1, // 入力イベントの数
LPINPUT pInputs, // 挿入する入力イベントの配列//2つ目不明点
int cbSize // 構造体のサイズ//3つ目不明点
);
return 0;
}

157:デフォルトの名無しさん
09/09/27 18:28:10
win環境で、exe側からdll側に関数インターフェースを提供する場合、
exe側で関数をexportして、dll側でGetModuleHandleするのが唯一の方法でしょうか?

158:デフォルトの名無しさん
09/09/27 18:32:31
>>156
VC++ なら普通SendMessageやPostMessage が無難だと思うぞ、ぐぐれば事例が沢山あるし

159:デフォルトの名無しさん
09/09/27 18:33:38
>>157
試してないけど
Dll側にSetFunc()を作ってExe側から関数ポインタあげたら?

160:デフォルトの名無しさん
09/09/27 18:37:36
>>158
ありがとうございます。やってみます

161:デフォルトの名無しさん
09/09/28 17:03:06
インクルードするとエラーが出ます。これはどういうことでしょうか・・?
#include <iostream>
#include <string>
#include <fstream>
#include <windef.h>
#include <windows.h>
using namespace std;

int main(){return 0;}

1>------ ビルド開始: プロジェクト: no, 構成: Debug Win32 ------
1>コンパイルしています...
1>a.cpp
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545) : error C2146: 構文エラー : ';' が、識別子 'ContextRecord' の前に必要です。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545)

162:デフォルトの名無しさん
09/09/28 17:03:48
: error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11263) : error C2065: 'PCONTEXT' : 定義されていない識別子です。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2146: 構文エラー : ')' が、識別子 'ContextRecord' の前に必要です。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2182: 'RtlCaptureContext' : 'void' 型が不適切に使用されています。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2491: 'RtlCaptureContext' : dllimport データ の定義は許されません。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2059: 構文エラー : ')'
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(12935) : error C3861: '__readfsdword': 識別子が見つかりませんでした
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C2146: 構文エラー : ';' が、識別子 'LPCONTEXT' の前に必要です。


163:デフォルトの名無しさん
09/09/28 17:06:20
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4015) : error C2061: 構文エラー : 識別子 'LPCONTEXT'
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4023) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4023) : error C2143: 構文エラー : ',' が '*' の前にありません。
1>ビルドログは "file://c:\Documents and Settings\user1\デスクトップ\sdk\Debug\BuildLog.htm" に保存されました。
1>no - エラー 15、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

以上です。分かる方、お願いします。

164:デフォルトの名無しさん
09/09/28 17:15:02
環境を書き忘れました
VS2008 C++です。よろしくおねがいします

165:デフォルトの名無しさん
09/09/28 17:41:37
ふと思ったのですが
*++p = 'a'; *++p = 'a'; *++p = 'a'; ...

*p++ = 'a'; *p++ = 'a'; *p++ = 'a'; ...
はスピードに違いがありますか。
つまりインクリメントとデクリメントで速度が変わったりしますか。
どちらも1を足すというのはかわりませんが、こっちのほうが効率のよいバイナリが生成されるとか
そういうのがあれば教えてください。

166:デフォルトの名無しさん
09/09/28 17:48:52
>>165
環境の提示がないので一般論として考えると、2行目と4行目はインクリメントするタイミングが違うだけ。
6行目はインクリメントとデクリメントの違いだけ。
いずれにしても、有意差が出るほど阿呆なコンパイラも環境もないと思うがね。

167:デフォルトの名無しさん
09/09/28 17:50:22
>>165
その例では機能が同等では無くね?

168:デフォルトの名無しさん
09/09/28 19:26:44
まあ、一般的な(前置|後置)(インクリメント|デクリメント)の速度の違いだけに
着目してるんじゃないかな。

どうも、前置|後置とインクリメント|デクリメントを混同している節が
見受けられるが……。

169:デフォルトの名無しさん
09/09/28 19:48:00
>>161
#include "stdafx.h"
あと氏ね

170:デフォルトの名無しさん
09/09/28 20:57:31
まるちスレッドの割り込みって最短でどこまで割り込まれるんですかね?

void func()
{
line1;
line2;
line3;
}

int main(void)
{
line4;
func();
line5;
return 0;
}

上の例で言ったらline4とfunc()の間、func()とline5の間まで割り込まれる?
それともline1、line2、line3の間でも割り込まれる?
1行が終わる間に割り込まれることはある?
a = b = c = d;としたらどこかで割り込まれる可能性はある?

171:デフォルトの名無しさん
09/09/28 20:58:35
>>170
いつでもありえます

172:デフォルトの名無しさん
09/09/28 21:09:18
> a = b = c = d;としたらどこかで割り込まれる可能性はある?

a = 100; みたいに代入一個でも、アセンブラだと2命令以上になることがあるんで、代入中に割り込まれることもある。


173:spirit
09/09/28 21:18:32
>>170 行とか演算子とか無関係に割り込まれる。
すなわちb=a+3;の実行中にaを読んでbに書き込む間でも割り込まれる。
さらにa++;の実行中にも割り込まれる。


174:デフォルトの名無しさん
09/09/28 21:20:43
さらにマルチプロセッサだと1命令の実行中でも割り込まれる。


175:デフォルトの名無しさん
09/09/28 21:29:10
>>169
ありがとうございました。すいませんでした。

176:デフォルトの名無しさん
09/09/28 21:31:02
割り込まれまくりなんですね・・・

そうなるとmutexを取得する関数の途中で割り込まれると
バグの元になりそうな気がするんですけど大丈夫なんでしょうかね?

177:デフォルトの名無しさん
09/09/28 21:33:11
>mutexを取得する関数

システムコールなので不具合は起きない

178:デフォルトの名無しさん
09/09/28 22:16:05
mutexを含むマルチスレッド同期ライブラリは、「このように呼び出すとここから
ここまでは割り込まれないよ」とかそういう細かい仕様がいちいち決まってるので、
それを調べて使うもの。

179:デフォルトの名無しさん
09/09/28 22:56:13
画像の任意回転、画像を表示したあとその上に場所指定して画像を合成etc・・・
をCで作る課題が出てるのですが、助けになるような参考書・サイト等ありませんでしょうか
お願いします

180:デフォルトの名無しさん
09/09/28 22:59:41
ググレカス^^

181:デフォルトの名無しさん
09/09/28 23:47:07
>>180
このスレの意味がなくなる

182:デフォルトの名無しさん
09/09/29 00:33:11
DXライブラリでおk

183:デフォルトの名無しさん
09/09/29 01:49:49
DXライブラリが手っ取り早いな

184:デフォルトの名無しさん
09/09/29 01:56:22
DXライブラリ使えばいいと思う

185:デフォルトの名無しさん
09/09/29 02:01:26
DXライブラリがいいね

186:デフォルトの名無しさん
09/09/29 05:44:20
>>166
ありがとうございます。違いはないとのことで安心しました。

>>168
>どうも、前置|後置とインクリメント|デクリメントを混同している節が
>見受けられるが……。
その通りでしたorz 無知をさらして申し訳ない


187:デフォルトの名無しさん
09/09/29 10:25:22
>>186
プリミティブ型ならいいけど、クラスに対する前置後置はだいぶ効率に差ができるから注意しよう

188:デフォルトの名無しさん
09/09/29 10:54:27
×だいぶ効率に差ができるから
○効率に差ができる場合もあるから


189:デフォルトの名無しさん
09/09/29 11:59:47
別人だがkwsk

190:デフォルトの名無しさん
09/09/29 12:18:04
詳しくも何も、後置は原理的に重くなりやすいのが一目瞭然じゃないか?
クラスじゃないなら、見た目の好みとかで後置にしても最適化で前置に置換されることが
期待できるけど、統一感を求めるなら、必要が無い限りは前置で統一した方がいいだろうね。
クラスの時は勝手に最適化で前置に変えたりできないから。

191:デフォルトの名無しさん
09/09/29 12:19:41
別にクラスじゃなくて構造体でも演算子オーバーロードしていれば同じことだけどね。

192:デフォルトの名無しさん
09/09/29 12:28:00
クラスと構造体は本質的には同じものだよ

193:デフォルトの名無しさん
09/09/29 12:29:03
クラスと構造体はほぼ同じだからいちいち説明する必要も無いと思うが

194:デフォルトの名無しさん
09/09/29 12:29:48
かぶったし

195:デフォルトの名無しさん
09/09/29 12:31:03
共用体とか持ち出してくればまだ芸があったかも。
でも余計うざいだけか。

196:デフォルトの名無しさん
09/09/29 12:36:34
>>189
むかしむかし、後置だとインクリメントする前の状態をどこかに保存しておかないといけないのであったとさ

197:デフォルトの名無しさん
09/09/29 15:34:40
で?

198:デフォルトの名無しさん
09/09/29 16:41:01
>>196
えっ? 今は違うの?

199:デフォルトの名無しさん
09/09/29 17:34:08
今は技術が発展しているのでそんな事はありません
科学万能の時代が到来したのです

200:デフォルトの名無しさん
09/09/29 17:46:33
>>198
可哀想な人…

201:デフォルトの名無しさん
09/09/29 18:11:48
it_a = it_b++
とかやったらちょっと面倒なことになる。

202:デフォルトの名無しさん
09/09/29 18:50:59
>>199
今はどうなってんのさ。

>>201
どう面倒なことになるのさ。

203:デフォルトの名無しさん
09/09/29 19:27:56
自分で調べろw

204:デフォルトの名無しさん
09/09/29 19:34:50
ググったけど、出てこない。

205:デフォルトの名無しさん
09/09/29 20:44:44
ググレカス。
Wikipedia項目リンク

206:デフォルトの名無しさん
09/09/29 21:29:15
>>196の言いたいことが分かったかも。
後置演算子のオーバーロード方法が無いとcallerが保存しなきゃならなかった、ってことが
言いたいんじゃないのかな。
ところが、普通に考えたらcallerが保存しなくてもcalleeでは保存するコードを書くことに
なるから、端から見ると>>196が何言ってんだか分からない人状態に。
一方>>196は、intを引数にすれば後置になるの知ってるの俺だけかよプゲラッチョ、とか
一人でいい気分になっていた、とか。

207:デフォルトの名無しさん
09/09/29 21:32:38
単にreturnの後に処理を入れられないという
言語制約上の問題でしかないね

208:デフォルトの名無しさん
09/09/29 23:03:02
>>206
何が言いたいのか分からん。
最適化されない限り、前置の方がコストかかるのは当然で。

>>196のだめなところはツッコミがあるように、むかしむかし、というのを付けてしまったとこ

209:208
09/09/29 23:03:59
あああ。前置じゃなくて後置ね。


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

4791日前に更新/163 KB
担当:undef