1read 100read
2011年11月2期プログラム14: 【初心者歓迎】C/C++室 Ver.76【環境依存OK (728) TOP カテ一覧 スレ一覧 2ch元 削除依頼

【初心者歓迎】C/C++室 Ver.76【環境依存OK


1 :11/08/06 〜 最終レス :11/11/24
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

2 :
前スレで次スレと称して前スレを貼るなしw
リスト構造からやり直しだなw

3 :
ノード数が1の循環リストなんじゃねのか

4 :
おいなんだprotectedって
誰かわかりやすく図示してくれ図示

5 :
   ∩
  /~~\  ←protected 明るい家族計画
 ( ゚    )
 |o  |
 |0  |
 (ニニニ)
 ( ・∀・)
  )    (
 (__Y_)

6 :
protected
派生先からはpublic
外からはprivate

7 :
>>6
あーそれだけなのか
なんで皆難しく説明するのかねぇ?

8 :
publicはpublic
privateはprivate
でも 子供に秘密を教えた時があるよね。
そん時が protected
家族限定みたいな。

9 :
>>7
みんな俺頭いいだお?すごいだろぉ?をしたいものさ

10 :
#define private public

11 :
#define class struct

12 :
クラスを参照渡しで引数として渡しているのですが特にコンストラクタなどがない場合関数内でクラス宣言した方が速いですかね?

13 :
>>12
void func(const hoge& arg)
{
}
よりも
void func()
{
hoge h;
}
ってこと?

14 :
そういうことです。どっちが速いのかなって

15 :
>>14
速度どうとかより何かを受け取るために必要な引数じゃないの?

16 :
void func1(const hoge&){...}
{ hoge h; func1(h); }
なら
void func2(){hoge h;...}
{func2();}
のほうが速いよ

17 :
>>15
クラスの関数しか使わないので中で宣言してもやることが変わらないんですよ
>>16
中で宣言した方が速いのですか。これは書きなおしだなー
ありがとうございます

18 :
#include <fstream>
int main(int argc,char* argv[])
{
std::ofstream ofs("text.txt");
for(int i = 0 ; i < argc ; ++i)
{
ofs << argv[i] << std::endl;
}
return 0;
}
このプログラムになんらかのファイルをドラッグ&ドロップして起動しました。
しかしなぜか同じディレクトリ以外からドラッグしたファイルの名前は
textに出力されません。なぜでしょうか?
VS2010です

19 :
ドラッグドロップしたファイルの置いてあるディレクトリに
text.txt が出力されているとか

20 :
>>19
ほんとだ・・・気づきませんでしたありがとうございます

21 :
放り込むファイルの場所がカレントになるのか。
へー…前からそうだっけ?

22 :
>>21
俺も実行ファイルと同じ場所になるような気がしていたが、今確認したら
 Win 7 sp1: ドロップしたファイルの場所
 Win XP sp3: ユーザープロファイルの場所

23 :
スレッドの同期って、共有する変数に対して
1つのスレッドだけが書き込みを行って
他のスレッドは読み込みだけの場合でも必要なのですか?

24 :
>>23
書き込み同士は排他が必要だが、読み込み同士は排他は不要。
問題は書き込み中に読み込み、あるいは読み込み中に書き込み、だが、これは書き込み/読み込み対象のオブジェクトが小さければ不要なこともあるかもしれない。

25 :
変数の書き換え操作にもともとアトミシティがあるなら不要。
書き換え途中の変数にアクセスしても泣かないなら不要。
それ以外は必要。

26 :
メモリバリアしてやらないと、あるCPUが書き込んだ情報は他のCPUが読めないだろ。
x86-64限定ならたぶんOK。

27 :
main.cppがごちゃごちゃしてきたので、ヘッダファイルとそれに対応したソースファイルに分割中なのですが、
インクルードが上手くいかず、
〜〜〜 定義されていない識別子です。
というエラーが沢山出て頭が爆発しそうです。
ヘッダファイルで宣言、定義した変数、定数、関数、クラスをそのまま対応したソースファイルや
main.cppで使用する方法はありませんか?

28 :
>>27
リンクしてるか?

29 :
返答ありがとうございます、常に排他が必要ではないのですか。
書き込み中に読み込みが行われた場合の問題というのは、
書き込み前の値を読み取られる可能性がある、というだけなのでしょうか?

30 :
>>29
>>25の書いてる通り、アトミシティーがあるならそう。
無ければ何が起こっても文句は言えない。

31 :
>>29
環境によっては、例えば0xffffから0x10000に書き換える瞬間に読み出した結果が
0x1ffffになるかもしれないし、0になるかもしれない。もしかしたら、0x100ffになるかもしれない。

32 :
>>30
>>31
ありがとうございます、環境によっては危険なことになるようですので、
同期はとるようにします。
大変勉強になりました、返答を下さった方々、もう一度ありがとうございます。

33 :
>>27
VisualC++なら項目の追加で分割したcppやhを全てプロジェクトの中へいれる。
あと、C++はコンパイルすると関数名を勝手に変えてしまうので、ソースを分割するとそれまでリンク出来ていたものが出来なくなるから、hファイルにおまじないを書かないといけない。

34 :
int
main(int ac, char **av)
{
const int N = 1000000;
int *alloc = new int[N];
memset(allc, 0, sizeof(alloc) * N);
return 0;
}
これを実行すると、セグメンテーションエラーになります。なにか間違ってますか?
$ ./a.out
Segmentation fault
$
環境は64ビットのUbuntuです。

35 :
sizeof(*alloc)かsizeof(int)にしないとダメなんじゃないの?

36 :
>>35
ありがとうございます。そうでした。

37 :
>>35にすれば直らなくもないけど、バイナリでゼロ初期化するセンスがおかしい。
intの配列を全要素0で初期化したいんだから、
std::fill_n(&alloc[0], N, 0);
が素直。

38 :
ゼロ初期化なら、
int *alloc = new int[N]();
とかで出来なかったっけ

39 :
>>38
配列を初期化できたっけ。

40 :
>>39
() の場合は可能

41 :
>>39
ぉぃぉぃ

42 :
auto& shortname = very.longlong.name;
みたいにして長い変数名を短縮する目的で参照を使うのは
行儀が良くないですか?
少なくともプロは使わない、とか、コーディング規約で普通禁止される、
とか、そういう意見があれば教えてください。

43 :
>>42
まず長い名前になること自体どっかおかしくね?という視点は必要な気がする。
適切にクラス、関数が切り分けられていないかもしれない。
後は生存期間の問題がなければ個人的には有り。

44 :
>>43
回答ありがとう。
長い名前は自分が作ったわけではないライブラリのAPI名でして。
安易に参照作って生存期間でハマるのは前にやって懲りたので、
引き続き気をつけます。

45 :
>>44
--
{
// 長い処理
auto & shortname = very.longlong.name; // shortnameも充分長ぇよ
// ある程度長い処理
// veryの寿命が尽きた後
}
--
よりは
--
{
// 長い処理
{
auto & shortname = very.longlong.name; // shortnameも充分長ぇよ
// ある程度長い処理
}
// veryの寿命が尽きた後
}
--
のようにブロックにしてスコープを狭くすれば少しだけ安心感が増すかと。

46 :
wstring *p;
wstring s;
 *p = s;
sの方が*pより長いときに、領域外アクセスで落ちることはありますか?

47 :
>>46
pは何も指していないが大丈夫か?
単に代入のことを言っているなら、
小さければ内部配列は拡張されるから安心汁

48 :
>>47 ありがとう

49 :
>>46
pは実体が確保されていないので、*p=sは常に問題のあるコードです。
不正メモリアクセスで落ちたらラッキー

50 :
クラスの中で、構造体テンプレートをメンバーに持つってありですか?
設計的におかしいと思うのですが?

51 :
rebindのことだな!

52 :
>>50です
>>51 rebind もそうですね
そもそも、クラステンプレートなり、構造体テンプレートを別のクラスで縛ることで得られるメリットってあるのかな?
普通に、そのクラスや構造体のインスタンスを生成して使うのが普通だし、譲歩して他のクラスから
そのテンプレートクラスなりが使いたかったとしても対等な関係で使えるはず
クラスが他のクラステンプレートや構造体テンプレートを所有するメリットについて、誰か説明してもらえませんか。

53 :
>>52
イメージが湧かないから例を挙げて。

54 :
関数の引数がstd::stringとstd::wstringの違いで関数をオーバーロードさせる方法がわかりません。
std::wstring strmid (std::wstring, int, int) ;
std::string strmid (std::string, int, int) ;
を両用したいのです
ご教示お願いします

55 :
>>54
それでいけるでしょ
他の部分に問題があるのでは?

56 :
>>55
ヘッダーをincludeしてなかったので前方参照できなくて、再帰呼び出しで変換できないエラーになっていました。
ありがとうございます。

57 :
ファイルシステムにフックしてPC内データ全てのアクセスログを残そうと思うのですが、そういったことは可能でしょうか?

58 :
対象とするファイルシステムは?

59 :
>>57
むり

60 :
ふっかつのじゅもん

61 :
>>57 OSを仮想化する

62 :
>>57です。すいません、知識が浅く言葉足らずで。
Windows7/XP等でファイルシステムのシステムコールにフックして
「いつ誰がどのファイルを操作した」といったログを残したいのです。
これって無理なんですかね?

63 :
>>62
可能だよ。
http://d.hatena.ne.jp/eco31/20110116/1295112914

64 :
>>63
これはSetWindowsHookEx()を使ってフックする方法とはまた違うやり方なんですね
このクラスを使ったほうがいいんですかね・・・

65 :
linuxのルートみたいな存在感だ

66 :
WindowsNTのスレッドを強制終了するときに自動変数のデストラクタを呼ばせることはできない?

67 :
>>66
無理。
・NT関係ないだろ
・今時NTかよ
・C++やめてPerlにすればできるよ

68 :
Core i7向けの
http://support.amd.com/us/Processor_TechDocs/47414.pdf
に相当するドキュメントはありませんか?

69 :
わからないことが二つあります
using namespaceはヘッダファイルに書くのでしょうか?それともcppファイルに書くのでしょうか?

70 :
cppのどこかローカルなスコープに書くのが普通です

71 :
ヘッダに書いちゃうと忘れてまいます。

72 :
複数のcppファイルでプログラムを構成するとき、
あるcppファイルのグローバル変数は、そのcppのオブジェクト?の、クラスのプライベート変数のようなもの、
externでアクセスできるようになる
という理解はあってるんでしょうか?

73 :
>>72
あまり正確ではない
キーワードは「リンケージ」
cppで普通に変数や関数を定義すると、それは外部結合になる
外部結合ならば、extern int a;などと宣言することでそれにアクセスできる。
逆に
cppでstatic int a = 1;などと定義してある変数は内部結合になって、
それは宣言しようが、他のcppからはアクセスできない。
勿論ポインタが手に入ればアクセスできるが
関数の場合は宣言にexternつけなくても宣言になるけどな

74 :
>>73
半分くらい理解しました
精進します
むしろstaticの意味が理解できた気がします

75 :
クラスAの中でクラスBを生成してもOKですか?
これが包含ってやつですか?

76 :
>>75
C++は「クラス」を動的に生成することは出来ません

77 :
boostのasioでwebサイトを取得しています
このwebサイトはUTF-8です
コマンドライン引数で得た文字列をUTF-8にしてURLエンコードしてGETで渡したいのですがコマンドライン引数の入力の文字コードは何なのでしょうか?
できれば移植性の高いソースにしたいので入力の文字ーコードを割り出してUTF-8への変換を行いたいです
変換の方法や文字コードを調べる方法を教えてください
また、取得したwebサイトを
boost::asio::ip::tcp::iostream socket( "example.com", "http" );
socket << "GET ........" << std::flush;
std::string line;
std::ofstream fp( "test.txt" );
while( std::getline( socket, line ) ) {
 fp << line << std::endl;
}
のようにしてファイルへの書き込みをしたのですが
コマンドプロンプトの設定をchcpコマンドを使わずにそのまますると文字化けし
chcpでUTF-8にすると文字化けせずに書き込みできるのですがどう関係しているのでしょうか
(コマンドプロンプトへの出力はフォントの関係でうまくいきませんでした)
最終的には
コマンドライン入力->UTF-8変換->web通信->処理->適切な文字コードに変換->標準出力
               └─────UTF - 8─────┘
のように内部的にはUTF-8で処理したいです
stringやwstringなどいろいろありよくわからないです
長くなりましたがよろしくお願いします

78 :
osによるからなんともいえん

79 :
icuに丸投げ

80 :
UTF-8の文字列を保存するデータ型はchar*型(std::string)でいいのでしょうか
それだけでもいいので教えてください

81 :
w_char 型

82 :
>>80
charであってる

83 :
$ echo $LANG
ja_JP.UTF-8
#include <stdio.h>
#include <string.h>
int main(void){
char *str="ほげほげ";
printf("%d\n",strlen(str));
return 0;
}
最初 ちょとびびるかもねw

84 :
>>76
すいません、オブジェクトAの中で、オブジェクトBを生成するのは可能ですか?

85 :
>>84
不可能なわけない。
struct A {
 C c;
 B *pb;
 A() : c(100) { this->pb = new B(); }
};
BやCをAが所有するという考えの設計なら、包含とかコンポジションと呼んでよい

86 :
グローバル変数やグローバル関数は使うなっていう参考書は多いのですがグローバルなクラスを宣言することも推奨されないのでしょうか?

87 :
宣言しないと使えないだろ

88 :
使えないこともないよ

89 :
宣言?じゃなかったですかね
int hoge()

   hoge hogege();
   hogege.hogehoge();

だいたいこんな感じで関数の中で宣言して使ってるじゃないですか。
hoge hogege();
int hoge()

   
   hogege.hogehoge();

こういうのはどうなのかなって。

90 :
hogeって何なんだろう、>>89を見てると頭がおかしくなりそうだ

91 :
>>89
それってどっちでもコンパイルエラーでない?

92 :
あぁ、クラスの宣言には()いらなかったですね
・・・関数名と同じ名前にしたのはまずかったですね

93 :
上と下じゃまったく意味が違うだろ

94 :
>>86,89
用語は正しく使おうな。そこをあいまいにしてる人は物事を正しく理解できてないと思われてもしかたない。
で、君の言いたいことはクラスのインスタンス生成のことのようだが
グローバルなインスタンスは本質的にグローバル変数と同じものなので無闇に使うものじゃない

95 :
クラスをよく理解していない人のコードは、クラスを使用しない人のコードより汚いもんな

96 :
>>94
使わないほうがいいですか。
ありがとうございます
まだまだ勉強が足りませんでしたね。精進します

97 :
なんで関数の中でプロト宣言してるんすか。

98 :
ぐっぐっぐっ

99 :
ぐはぁっ

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼