1read 100read
2012年6月プログラム262: スレを勃てるまでもないC/C++の質問はここで 20 (965) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Emacs Lisp 3 (915)
ソフトウェア開発技術者取れた奴の集い (371)
リファクタリングをただのコード修正と思ってる人へ (268)
MVVMについて語ろう (277)
低水準言語を開発したい (268)
【Google】Androidアプリ作成part14 (545)

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


1 :11/09/15 〜 最終レス :12/06/28
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/
19
http://hibari.2ch.net/test/read.cgi/tech/1308106024/

2 :


3 :
Cはヨーグルトの味がしますか?

4 :
Cは醍醐味

5 :
白かよ、青かよ、ウォッシュかよ?

6 :
>>5
喰える、喰えない、割と好き

7 :
ちょっと和んだw

8 :
質問です。VC++ 2008 Express で
ttp://k3tec.net/neko_wiki/index.php?C%2FC%2B%2B%A5%BD%A5%B1%A5%C3%A5%C8%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%C2%E8%B0%EC%B2%F3
を参考にサーバ・クライアントプログラムを作っているのですが、実行すると
server.exe の 0x85c7ec4d でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x85c7ec4d を読み込み中にアクセス違反が発生しました。
というエラーが出て困っています。Segmentation Fault だと思うのですが、簡単なテストプログラムではエラーが出ないので原因がよくわかりません。
対処方法がわかる方いましたらご教示ください。
以下、ソース
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
enum COMMAND { CMD_NOP, CMD_LOGIN, ....... };

9 :
class Message {
SOCKET _dst_socket;
COMMAND _command;
public:
// コンストラクタ、デストラクタ、セッタ、ゲッタ
...
virtual int sizeOf() cosnt { return sizeof( *this ); }
};
class TextMessage : public Message {
char _text[ 16 ];
public:
// コンストラクタ、デストラクタ、セッタ、ゲッタ
...
virtual int sizeOf() const { return sizeof( *this ) }
};
class Server{ ... };
bool Server::send( SOCKET dst_socket, const Message& msg ) {
if( ::send( dst_socket, (char*) &msg, msg.sizeOf(), 0 ) != SOCKET_ERROR ) // このへんで sizeOf() を呼ぶとエラー。sizeof( TextMessage ) とかだとOK
}
class Tester {
public:
static void test( const Message& msg ) { cout << msg.sizeOf() << endl; }
};
int main() {
TextMessage tmsg;
Tester::test( tmsg ); // これはOK
...
}

10 :
sizeOf()を呼ぶとエラーじゃなくて、sizeOf()を呼んだ後の次のsizeOf()で死ぬんだろ。
それなら原因は想定できた。

11 :
こいつはくせえーッ!Java厨のにおいがプンプンするぜッーーーッ!

12 :
>>10 ヒントだけでもお願いします。
ついでにJava厨臭くない方法があったら教えて下さい。

13 :
>>9
それが>10の言いたいことかどうかは知らんが、(char *) & msgはsend()に渡すべき場所を指しているかデバッガでよく見てみたら?
つーか、Cスタイルキャストは使うなや。

14 :
広域の::send()関数の引数に、Messageクラスのポインタを(char*)にキャストして
渡してまともに動作するものなのか?
TextMessageの場合は、たまたまクラスの銭湯に_test[16]があれば動作するかも知れないが…

15 :
自己解決しました。
クライアントから送られてきたデータをそのまま流用しようとしたため sizeOf のアドレスが異なっていたようです。
char data[ SIZE ];
recv( src_socket, data, _countof( data ), 0 );
TextMessage tmp, msg;
memcpy_s( &tmp, sizeof( TextMessage ), data, sizeof( TextMessage ) );
msg = tmp;
server.send( dst_socket, msg );
としたらうまくいきました。
情報不足の質問をしてすみませんでした。アドバイスくださった方、ありがとうございました。

16 :
あ、sizeOf のアドレスじゃないや。まあいいや

17 :
アドバイスを受けて事故解決かよ。おめでてーな。

18 :
以下のような宣言に対して…
template< class T1 >
class CHoge
{
void f1();
template< class T2 > void f2();
};
f1(),f2()の定義を宣言と分けて書きたい場合,f1()は,
template< class T1 > void CHoge< T1 >::f1(){ ... }
と書きますが,
f2()の実装はどのように書けばよいのでしょうか?

19 :
template <class T1> template <class T2> void CHoge<T1>::f1<T2>() { ... }

20 :
エラーが出ます
template <class T1>
class CHoge {
T1 t;
void f1();
template <class T2> void f2();
public:
CHoge(T1 x) : t(x) {}
};
template <class T1>
void CHoge<T1>::f1() {
std::cout << t << std::endl;
}
template <class T1>
template <class T2>
void CHoge<T1>::f2<T2>() {
std::cout << static_cast<T2>(t) << std::endl;
}
error: function template partial specialization 'f2<T2>' is not allowed

21 :
template <class T1> template <class T2> void CHoge<T1>::template f2<T2>() { ... }

22 :
>>21
>>20と同じエラーが出ます

23 :
template <class T1> template <class T2> void CHoge<T1>::template f2() { ... }

24 :
>>23
ありがとうございます
template <class T1>
class CHoge {
T1 t;
public:
void f1();
template <class T2> void f2();
CHoge(T1 x) : t(x) {}
};
template <class T1>
void CHoge<T1>::f1() {
std::cout << t << std::endl;
}
template <class T1>
template <class T2>
void CHoge<T1>::f2() {
std::cout << static_cast<T2>(t) + 0.5 << std::endl;
}
int main()
{
CHoge<int> c(1);
c.f1();
c.f2<double>();
}

25 :
>>19〜24 感謝.

26 :
計算式の入った文字列("1+2*3"など)を用意しておいて、その計算結果(先程の例では7)を変数に代入するみたいなことって出来ますか?

27 :
>>26
自分でパーサー書けば出来る

28 :
>>26
Lua使えば1分でそういうコードが書けるよ

29 :
boostでなかったっけ

30 :
L"abc"のLって何ですか?
一文字なのでぐぐれなくて困っています。

31 :
>>30
ワイド文字

32 :
「C言語 文字列 L」でぐぐったら一発だったが

33 :
X a(),b(),c(),d();

if(is_true) return;

Y e();
} → if(!is_true)e.~e();→ d.~d();→ c.~c();→ b.~b();→ a.~a();
RAIIは開放の順番は規定されてるの?
それとも順不同?

34 :
>>33
X a()は返却値X型で引数をとらない関数aの宣言で解放もなにもないし
変数の構築と破棄の順序関係はRAIIなんかとは直接関係ない変数に関する普通の話だしでつっこみどころしかない。
最低限の知識が正しく身についてない人にはそれより先は教えようがないぞ。

35 :
>>33
規定されてるよ
>>34
struct A{};
A a();

36 :
デストラクタコール記述のつもりだろうが変数名でデストラクタ書いてるwwから
生兵法君が鼻息荒げて訳判らん(キリッしちゃったんだろうな

37 :
もう何度も質問されていると思いますので簡潔にでいいのでお答えいただけないでしょうか?
PHPやJavaScriptは習得しているのですが、ちょっとC系が必要になりそうなのです
その際、C -> C++と学習したほうがやはりいいのでしょうか?
CはC++に吸収済みとか言う人もいるようですが
オブジェクト指向に関しましてはまぁ少々は慣れていると思います
やはりC++をいきなりというのはつまずく点が多いのでしょうか?
また、CとC++はオブジェクト指向以外にも違いはあるのでしょうか?
Webで調べたのですがいまいち分かりませんでした

38 :
>>37
必要な言語を学習したんでいい。C++が必要なら最初からそっちでおk
Cにオブジェクト指向とテンプレート(ジェネリックプログラミング)、例外を加えたのがC++だな

39 :
ご回答ありがとうございます
>必要な言語を学習したんでいい
とはPHP等のオブジェクト指向を学習しているので、そのままC++にいってもいいという意味でしょうか?
Cで出来ることはC++で出来ると聞いていますので、C++に行こうかと思いました

40 :
>>39
仕事でも趣味でも受験でも、目的があるならそれに沿った言語を選択して学習すればいい。
学習そのものが目的なら自分で調べて悩んで下さい。学習になります。

41 :
>>37
CとC++の肝はメモリー管理。
どちらからやっても同程度に壁になる

42 :
日頃C++をバリバリ使ってると、Cの仕事は苦痛。
日頃Cをバリバリ使ってると、C++の仕事は苦痛。
その程度には違うので、C系なんてごまかしてないで、
プロジェクトに必要な方をやるべし。両方必要なら迷わずC++。

43 :
設計がしっかりしてればどっちでやっても大差ない

44 :
アルゴリズムの話なのですが、
手続き型言語でコールバックは悪ってのは何故なんでしょうか。

45 :
悪じゃないです

46 :
純粋な手続き型ではA-B-C-D-Eという流れなら毎回A-B-C-D-Eの順で処理が進んでいくけど
コールバックが入るとA(ハンドラ登録)-コールバック-B-C-D-Eだったり
A(ハンドラ登録)-B-C-D-E-コールバックだったりと処理の順序関係が安定しなくなる、
あるいは順序を安定させようとするとマルチプロセス化や待機状態を作るなどの
純粋な手続き型と比べると余計なコストがかかるなどで相性が悪いから。

47 :
>>46
なるほど、ありがとうございました。

48 :
assertってやめたほうが良くないですか?
デバッグ時に発生しなかったバグケースがリリース時に出たら困りますよね

49 :
>>48
assert使った事ないの?

50 :
>>49
リリース時に例外を投げるassertもどきなら使ってます
ボトルネックでは仕方ないからassertですが…

51 :
リリースビルドの意味わからなかったり直接呼んだりしてるなら
ディスパッチャーの中で発生させるアラートや事後アラートがバレると
IQの低さを悟られてしまうから止めといたほうがイイとおもうよ

52 :
煽りはレスしなくて結構です

53 :
すでにある構造体(コンストラクタなしの型)のテンポラリオブジェクトを無駄なく構築するにはどうすればいい?
func(hoge(1, 2));
というふうな書き方ができないから
{ hoge h(1, 2); func(h); }
と書いてるんだけど、ダサすぎて困る

54 :
>>53
C++ならコンストラクタを書く
CならC99のコンパウンドリテラルを使う
C89はどうしようもない

55 :
printf("%s %d", "hoge", x);
な所が
printf("hoge", "hoge", x);
こうなるケースがあっても問題ない?

56 :
初心者には意味不明な質問だな

57 :
多いのは問題あるが少ないのは問題ない

58 :
ファイルから文字列を読み込んで,その文字列を名前にもつ関数を呼び出す事ってC,もしくはC++で可能なんでしょうか
例えば func,100 とだけ書かれたファイルを読み込んで,func(100)という風に呼び出したいのです

59 :
if(strcmp(str, "func") == 0)
{
  func(num);
}

60 :
void hoge(void) { std::cout << "hoge" << std::endl; }
void fuga(void) { std::cout << "fuga" << std::endl; }
map<string, void (*)(void)> m;
m["hoge"] = hoge;
m["fuga"] = fuga;
string s;
cin >> s;
map<string, void (*)(void)>::iterator i(m.find(s));
if(i != m.end()) { (*i)(); }

61 :
あらかじめ用意した関数しか呼び出せねえのかこの糞ゲーは

62 :
用意してないものを利用できると思うほうがおかしい

63 :
>>59
ありがとうございます
たぶん,これでもやろうとしてることは出来ないことはないんですが
全部の関数でそれをするのはちょっと辛いなあと思ってたんです
言葉足らずですいません
>>60
C++はまだ勉強中なのでよくわからないのですが,おそらくイメージしてたのはこれです
mapとか言うのを調べればよさそうな感じですね
勉強になりました
お二方,ありがとうございました

64 :
以下のプログラムで実行結果を「ABC」にしたいのですが「ABCBCC」になってしまいます
どうすればいいですかね・・・
#include<stdio.h>
int main()
{
int i;
char c[100]={'A','B','C'};
for(i=0;i<3;i++)
printf("%s",&c[i]);
printf("\n");
}

65 :
%sを%cにする?

66 :
s->c

67 :
>>65
%cにしたら出力が「???」になりました

68 :
printf("%c",c[i]);

69 :
プリントは&いらん

70 :
>>67
申し訳ない
>>68が正解だな

71 :
>>68-69
できました!ありがとうございます
&はscanfと混同してました・・・初歩的なミスでしたね^^;

72 :
Boost pythonを使用しようとして
http://d.hatena.ne.jp/moriyoshi/20091214/1260779899
を参考にしているのですが、vector<int>からpythonのリストへの変換例のコードの意味がわかりません。
参考URL中の
.def("__getitem__", (int const&(foo::int_vector::*)(foo::int_vector::size_type) const)&foo::int_vector::at)
の中で(int const&以下が何をやっているのでしょうか。さっぱり理解できません。

73 :
>>72
foo::int_vector::at へのメンバ関数ポインタを取得するために、
返却値型 int const & で引数は一つで型は foo::int_vector::size_type で const 修飾されてる foo::int_vector のメンバ関数の
メンバ関数ポインタ型へ明示的なキャストをしてる。

74 :
>>73
ありがとうございます。
関数キャストは
(返却値型 (ポインタ型)(引数リスト) )
の形式で行うということですね。

75 :
なんか正しくわかってないような?
・メンバ関数ポインタ
・オーバーロードされてる(メンバ)関数への(メンバ)関数ポインタの取得
についてわかってるならそれでいいよ

76 :
vectorの各要素を<algorithm>を使って3乗するとして、
案1
class MyPow {
pulic:
  double operator() (double value){return pow(value, a_)
  MyPow(double a):a_(a)
private:
  double a_;
}

transform(vec.begin(), vec.end(), vec.begin(), MyPow(3.0));
案2
class MyPow: public binary_func<double, double, double> {
  double operator() (double value, double a) {return pow(value,a);}
}

transform(vec.begin(), vec.end(), vec,begin(), bind2nd(MyPow(), 3.0))
どちらの方が好ましいのでしょうか。どちらでもOK?

77 :
>>76
どちらも単なる関数オブジェクトだから大差ないんじゃね?
強いて言えば案1の方が3.0を内部状態として持つのでそれだけ引数の
受け渡しが減る

78 :
const int n = 10;
int main()
{
std::vector<double> vec;
for (int i = 0; i < n; i++)
vec.push_back(std::rand() % 100);
std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " "));
std::cout << std::endl;
std::transform(vec.begin(), vec.end(), vec.begin(), [](double& x) { return std::pow(x, 3.0); });
std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " "));
std::cout << std::endl;
}

79 :
やっぱりラムダ入ったのは大きいよなぁ

80 :
mem_fun_ref(笑)

81 :
-> を使えば一発

82 :
やはりここはptr_funの出番d・・・
transform(vec.begin(), vec.end(), vec.begin(), bind2nd(ptr_fun<double, double, double>(pow), 3.0));

83 :
もっとクールな方法でパブリックメンバ変数を外から見たらconstに中から見たら非constにできる?
struct hoge
{
int const x;
hoge(void) : x(0) { }
hoge(int x) : x(x) { }
hoge & operator = (hoge const & h) { const_cast<int &>(x) = h.x; return *this; }
void inc(void) { const_cast<int &>(x) += 1; }
void dec(void) { const_cast<int &>(x) -= 1; }
};

84 :
publicなメンバ変数という設計を捨てる

85 :
void君と名付けよう

86 :
ファイルを適当な変数の配列にファイルサイズ分一気に読み込みたいんですが、
どうすればできますか?
今はこんな風にして凌いでるけど、どう考えても馬鹿らしすぎる
std::string buf;
std::string DataStr;
while(FileStream&&getline(FileStream,buf))DataStr+=buf;
char *src=new char [DataStr.size()];
memcpy((void *)src,DataStr.c_str(),DataStr.size());

87 :
std::ifstream ifs("test.txt", std::ios::in|std::ios::binary);
ifs.seekg(0, std::ios::end );
size_t size = ifs.tellg();
ifs.seekg(0, std::ios::beg );
char *buff = new char[size+1];
ifs.read(buff, size);
buff[size] = '\0';
// ...
delete[] buff;

88 :
#include <exception>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
template <class A> void readAllAtOnce(char const * path, std::vector<char, A> & data) {
std::fstream file;
file.exceptions(std::ios::badbit | std::ios::eofbit | std::ios::failbit);
file.open(path, std::ios::in | std::ios::binary);
file.seekg(0, std::ios::end);
std::ios::pos_type end(file.tellg());
file.seekg(0, std::ios::beg);
std::ios::pos_type beg(file.tellg());
std::ios::off_type off(end - beg);
if(data.max_size() < off) throw std::exception();
data.resize(off);
file.read(&data[0], off);
file.close(); }
int main(void) {
try {
std::vector<char> buf;
readAllAtOnce("test.txt", buf);
std::string str(buf.begin(), buf.end());
std::cout << str << std::endl; }
catch(...) { std::cout << "err" << std::endl; }
return 0; }

89 :
窓板の質問スレでたずねたんだけど、返答がないようなのでこっちでも聞かせてください。
C++でWinXPでネットワーク接続を表示したときに表示される「LANおよび高速インターネット」を
表示するexeを作成したいですが、ネットワーク名なんかはレジストリから取得できました。
しかし、切断したネットワーク名まで表示される状態で上記の内容とはずれてしまっています。
レジストリに保管されているネットワークから現在接続されているネットワークだけ表示したいんですけど、
何をフラグとしてしているのかがわかりません。
どなたかご教授お願いします。

90 :
http://blogs.msdn.com/b/jpwdkblog/archive/2009/09/29/9900575.aspx
devcon status =net
でdisabled/runningの判別がつくけど他にいい方法があるかもしれん

91 :
>>87-88
ありがとう、seekgを使うのがポイントなのね

92 :
イテレータってインクリメントやデクリメントだけでなく、+1や-1でも前後の要素にアクセスできる?

93 :
自分で試したほうが早かった。できた

94 :
浮動小数点数をバイナリで保存するにはどうすれば?

95 :
fwrite
ofstream::write

96 :
>>90
ありがとう。
devconは知らなかった。試してみる。

97 :
ローベルのC++入門講座をお持ちの方にお聞きしたいのですが、
P308の演算子オーバーロードの流れがよくわかりません。
> delete[] m_array;
> m_array = array;
deleteしたにも関わらず直後にdeleteしたものを使っていて混乱しています。

98 :
ロベールの翻訳は分かりやすい

99 :
その2行だと。
deleteしたのは、m_arrayのポインタが指す領域。
m_arrayはまだ残っている。
そこに、arrayのエリアのポインタを再設定しただけ。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
C言語を勉強しあおう (252)
【肥大化】C++ を見捨てたヤシ 2人目【複雑化】 (892)
Cで書くかアセンブラで書くか・・・ (829)
マならMicrosoft嫌いだよな? (727)
【あなごる】anarchy golf! (281)
【漏れは】猫でもわかる質問スレ【猫以下です】 (489)
--log9.info------------------
【フランス語会話】Jessy 【アニメソング】 (797)
女子高生シンガー大竹佑季 (926)
【革命家】−泰葉Ver.1−【電波系】 (202)
【歌手】◆山田優◆【デビュー】 (842)
   COO    (275)
Nao (238)
茅原実里 (553)
梨花 Rinka (252)
【文筆歌手?】未映子5【歌唱作家?】 (281)
【巨】熊田曜子が4月にデビュー【ピアノ少女】 (235)
FictionJunction YUUKA 〜PART1〜 (241)
市川由衣! (282)
白鳥英美子 君はス・テ・キ (332)
【Dreamusic】久嶋美さち【宮崎県出身】 (490)
【いよいよ】千織 vol.1【デビュー】 (523)
☆小野綾子さんを応援するスレ☆part1 (312)
--log55.com------------------
★2ch.scは何故失敗したのか
★クロール批判要望スレ
★削ジェンヌに文句ある人集合
★迷惑行為報告担当 - 小さな親切募集中 2
★2ch.scへの要望スレ Part3
★かっこう観測所
★スレ立て人キャップ
★2ch.scニュース系板観測所