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

このエントリーをはてなブックマークに追加
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/
スレを勃てるまでもないC/C++の質問はここで 10
http://pc12.2ch.net/test/read.cgi/tech/1242300936/
スレを勃てるまでもないC/C++の質問はここで 11
http://pc12.2ch.net/test/read.cgi/tech/1245059383/
スレを勃てるまでもないC/C++の質問はここで 12
http://pc12.2ch.net/test/read.cgi/tech/1248010352/
スレを勃てるまでもないC/C++の質問はここで 13
http://pc12.2ch.net/test/read.cgi/tech/1260842197/
2デフォルトの名無しさん:2010/03/23(火) 02:01:15
iostreamってなんで嫌われてんの?
3デフォルトの名無しさん:2010/03/23(火) 05:08:48
・printf, scanfでやるみたいな書式指定ができないから嫌い
・>>,<<で入力、出力というのが単に気持ち悪いから嫌い
・中身が複雑すぎて自分の頭では理解できないから嫌い
という理由はよく見かける。

ちゃんと使えば標準入出力もファイル入出力も、
あるいは圧縮・展開しながら読み書きとかいうのも
ストリームオブジェクト替えるだけでできて便利。
常に標準出力にしか書かないならprintfで十分かも。

書式指定したいときはsprintfで一度バッファに書いてから出力するか、
boost.format使うとかすればOK。
4デフォルトの名無しさん:2010/03/23(火) 07:01:53
>>2
それはお前だけ
5デフォルトの名無しさん:2010/03/23(火) 07:56:19
>>2
それはあなたです
6デフォルトの名無しさん:2010/03/23(火) 09:02:11
>ストリームオブジェクト替えるだけでできて便利。

ここだろ。
大抵の場合、その恩恵授かる事が少ないから使わなくてもいいやってなる。
7デフォルトの名無しさん:2010/03/23(火) 09:37:12
>>6
今後のために、必要条件と十分条件の違いを学習した方がいいかも
8デフォルトの名無しさん:2010/03/23(火) 09:43:07
>>7
それはあなたです
9デフォルトの名無しさん:2010/03/23(火) 11:45:32
「参照」に関する質問です。

Foo& const GetFoo();
この様な「宣言」は旧式って認識でおkでしょうか?

そして現在では
Foo& GetFoo();
に「簡略化」されているという認識でおkでしょうか?
10デフォルトの名無しさん:2010/03/23(火) 12:06:00
いいえ。
11デフォルトの名無しさん:2010/03/23(火) 12:47:11
>>9
どっちも×
12デフォルトの名無しさん:2010/03/23(火) 13:28:12
A a;はいいのに A a();はエラーになるのはなぜですか?
13デフォルトの名無しさん:2010/03/23(火) 13:38:28
switch(data)
{
case '+';
k = a + b;
break;
       }

でビルドするとエラーになるのはなぜ?
14デフォルトの名無しさん:2010/03/23(火) 13:43:15
;
:
15デフォルトの名無しさん:2010/03/23(火) 13:44:14
>>13
data, a, b, k が未定義だし、mainもないし
16デフォルトの名無しさん:2010/03/23(火) 13:46:18
>>14
ごめん よくわからない
17デフォルトの名無しさん:2010/03/23(火) 13:47:19
>>15
全部書いたほうがいいのね
 #include <stdio.h>
int main(void)
{
int a,b,data,k;
scanf("%d%d%d",&a,&data,&b);
switch(data)
{
case '+':
int k = a + b;
break:
}
printf("%d%d%d",a,data,b);
}
18デフォルトの名無しさん:2010/03/23(火) 13:50:21
>>13と全然違うじゃねーかw
19デフォルトの名無しさん:2010/03/23(火) 13:51:59
>>17をビルドしようとするとエラーを吐くって言いたかったんだ。。。すまん
2012:2010/03/23(火) 13:54:56
>>19
あまりこのスレで暴れないでくれるかな。
君以外にも答えを待っている人が沢山いてだね
チャットみたいに使われるとスルーされるのだよ。
自己中をなおしたまえよ。
21デフォルトの名無しさん:2010/03/23(火) 13:56:45
>>17
int k = a + b; → k = a + b;
break: → break;

>>13
case '+'; → case '+':
22デフォルトの名無しさん:2010/03/23(火) 13:57:50
>>17
> #include <stdio.h>
行頭に全角スペース?が入ってる

>int k = a + b;
int は不要 → k = a + b;

>break:
break の後ろがコロンに「:」になっている、セミコロン「;」とすべき
23デフォルトの名無しさん:2010/03/23(火) 18:21:35
このスレのテンプレートに>>23入れようぜ!


24スレのテンプレート:2010/03/23(火) 18:22:26
姉妹スレ

C言語なら俺に聞け(入門編)Part 61
http://pc12.2ch.net/test/read.cgi/tech/1267799238/
C言語初心者質問総合(だいぶ過疎っているが)
http://yutori7.2ch.net/test/read.cgi/pc2nanmin/1080308026/
C++相談室 part79
http://pc12.2ch.net/test/read.cgi/tech/1268846738/
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
C/C++小心者スレッドPart1
http://pc12.2ch.net/test/read.cgi/tech/1186262298/
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
Boost総合スレ part8
http://pc12.2ch.net/test/read.cgi/tech/1251446016/
Boost C++ Libraries Sandbox
http://pc12.2ch.net/test/read.cgi/tech/1250396380/

/******************************************************************/

 codepad
 ttp://codepad.org/

長いソースを貼るときはここへ!

/******************************************************************/

25デフォルトの名無しさん:2010/03/23(火) 18:51:20
配布されてるライブラリを見ると希に->演算子や*演算子がオーバーロードされてたりしますが
こういうオーバーロードを行うとポインタ操作で不用意なバグを生み出しそうな気がするのですが大丈夫なのでしょうか?
26デフォルトの名無しさん:2010/03/23(火) 19:00:25
>>25
それは作り方しだい。
配布するぐらいだからそれなりに作ってんじゃないの。
27デフォルトの名無しさん:2010/03/23(火) 19:03:25
C++のクラスは、ヘッダに直接実装するのかソースに実装を分けるのか、どちらが良いでしょうか?

foo.h
class foo {
public:
  foo() {}
  void var() {
    cout << "var" << endl;
  }
};
----
foo.h
class foo {
public:
  foo();
  void var();
}

foo.cpp
foo::foo() {}
void foo::var() {
  cout << "var" << endl;
}

それぞれのメリット、デメリットってありますか?
おいらはヘッダに実装しちゃうのが簡単でよいと思ってます。
28デフォルトの名無しさん:2010/03/23(火) 19:13:45
>>27
好きにすればいいよ。

君の場合はそのヘッダーを他人に見せるわけではないだろうし、
メモリ効率とかパフォーマンスとかも気にするレベルでもなさそうだからね。
29デフォルトの名無しさん:2010/03/23(火) 19:31:58
>>28
おいらのレベルは置いておいて、一般的な話として
メモリ効率が悪くなり、パフォーマンスも悪くなる、ってことですか?
30デフォルトの名無しさん:2010/03/23(火) 19:39:53
>>27
クラス定義内で実装すると inline になる。
inline でいいならそれでいいけど、
そうでないものを無理にクラス定義内で実装すると
ちょっと実装を変更しただけで
そのヘッダファイルをインクルードした全てのファイルが
再コンパイルされてしまうので、
inline にするつもりがないなら .cpp で実装した方がいい。

クラステンプレートみたいに全部ヘッダで実装する必要のあるものなら
全部クラス定義内で実装しちゃってもいいと思うけど。
inline になったからって必ずインライン展開されるわけじゃないしね。
31デフォルトの名無しさん:2010/03/23(火) 19:49:43
>>30
すごい合点がいきました。
時々空っぽ(もしくはメンバの初期化のみ)のコンストラクタだけヘッダに実装してあって
残りがソースに実装してあるコードを見るので、どういう使い分けなんだろう、と
思ってましたが、inlineになるというので氷解しました。
おいらはJava出身なので、理由がなければヘッダに実装も書きたいんだけど
クラスの設計後、実装をソースに移すようにしてみます。
32デフォルトの名無しさん:2010/03/23(火) 20:05:36
>>30
コンパイル時間を気にするような状況なら、プリコンパイルにするはずだから、
再コンパイルとか気にしなくていい。
33デフォルトの名無しさん:2010/03/23(火) 20:24:16
>>32
大きなプログラム扱った事無いだろ、お前
34デフォルトの名無しさん:2010/03/23(火) 21:54:03
template使ったことないことくらい察してやれ
35デフォルトの名無しさん:2010/03/23(火) 22:04:01
pimplパターンとか考えられるくらい
コンパイル時間て重要なのにな
partial classが欲しいわあ
36デフォルトの名無しさん:2010/03/23(火) 22:57:36
後学のためにboostのソース眺めてたんだが

namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;

これがなにをやってるんだかよく判らないんだけどこれどういうこと?
37デフォルトの名無しさん:2010/03/23(火) 23:10:51
>>36
他の型に自動変換されない型を定義してる。
相談室かどっかにも同じ質問あったが同じ人か?
38デフォルトの名無しさん:2010/03/23(火) 23:35:03
>>37
関係ない人だと思う

>他の型に自動変換されない型を定義してる。

それ以前の問題で
typedef int detail::none_helper::*none_t ;という文法からして何が言いたいのか判らない状態なのです
39デフォルトの名無しさん:2010/03/24(水) 00:11:52
これってそんなFAQだったのかw
基本的なところから。
  typedef A a;
は「Aという型をaという名前でも使えるようにします」という意味。
  int A::*b
は「型Aのint型のメンバ変数へのポインタ b」という意味。
両方合わせて
  typedef int A::*b;
は「『型Aのint型のメンバ変数へのポインタ』の型をbという名前でも使えるようにします」となる。

メンバ変数ポインタはややこしいので使い方はぐぐってみてくれ。
とりあえず、普通のポインタと違ってNULLですら代入できないという性質がある。
このお陰で、例えば引数にNULLを渡したとしてもオーバーロードを誤判定するということがなくなる。
40デフォルトの名無しさん:2010/03/24(水) 00:27:20
ふと思ってVCで試してみたらNULL代入できたorz
NULLも代入できないのってメンバ関数ポインタだったっけ
41デフォルトの名無しさん:2010/03/24(水) 00:28:48
::*って違和感あるんだけど、↓で正しい?

class A { int x; int y; float z; } a;
class B { int x; int y; float z; } b;

int A::* p1 = &a.x; //OK
int B::* p2 = &b.x; //OK
int A::* p3 = &b.y; //NG
int B::* p4 = &a.y; //NG
float A::* p5 = &a.x; //NG
float A::* p6 = &a.z; //OK

なんで、A::int* ではなく int A::* なんだろう。変な感じ。
42デフォルトの名無しさん:2010/03/24(水) 00:40:36
>>41
struct A { int x; int y; float z; } a;
struct B { int x; int y; float z; } b;

int A::* p1 = &A::x; //OK
int B::* p2 = &B::x; //OK
int A::* p3 = &B::y; //NG
int B::* p4 = &A::y; //NG
float A::* p5 = &A::x; //NG
float A::* p6 = &A::z; //OK

・ &a.xは通常のポインタが取得される、&A::xとしないとダメ
・ privateメンバのアドレスはクラス外からだと取れない

intだと分かりにくいけど、
A::B* と書いた場合「型Aのローカル型Bへのポインタ」と解釈される。
struct A{
 struct B{};
};

C言語からの伝統で、「ある型の変数の定義の名前の部分を*に置き換えたもの」
がその型のポインタの型になることになっている。
例: int a→int *
  int A::b→int A::*
(後者は見慣れないと思うけど、staticメンバ変数の定義のときにはこう書く)
43デフォルトの名無しさん:2010/03/24(水) 01:05:07
なるほどねー
44デフォルトの名無しさん:2010/03/24(水) 01:49:28
shared_ptrとunique_ptrはどう使い分けますか?

全部shared_ptrじゃ、ダメなんですか。
45デフォルトの名無しさん:2010/03/24(水) 02:09:21
>>44
実行速度が気にならないなら全部shared_ptrで構わない。
shared_ptrを使った場合はプログラマが1個のshared_ptrからしか参照されないことを知っていたとしても
毎回参照カウンタを生成するため、そのためのオーバーヘッドが生じる。
unique_ptrは参照カウンタを使用しないため、1つからしか参照されないことが予め分かっているなら効率的。

また、shared_ptrの場合、一度ポインタをshared_ptrに格納してしまうとポインタの所有権を奪い返すことができない。
つまり参照するshared_ptrがなくなった時点でオブジェクトがdeleteされるのを止めることができない。
一方で、unique_ptrはrelease()によって所有権を放棄させることができる。

ぱっと思いつくのはこのくらい。
46デフォルトの名無しさん:2010/03/24(水) 03:04:54
win32でピルドできる?

Google、高速・低メモリ消費の正規表現ライブラリ「RE2」を公開 ...
http://sourceforge.jp/magazine/10/03/15/0331223


もし誰も挑戦してみたいの試行RE2 Windows上でコンパイルするには、パッチを歓迎するだろうなされている。
どのようにre2/re2.hの上部にあるコメントを参照してくださいRE2、使用方法に関するドキュメントしてください。
http://code.google.com/p/re2/wiki/Install
No attempt has been made to make RE2 compile on Windows, but if anyone would like to try, patches would be welcomed.
For documentation on how to use RE2, see the comment at the top of re2/re2.h.
47デフォルトの名無しさん:2010/03/24(水) 09:17:07
endlみたいに空の()を省きたいが、マニピュレータではない関数を作ってみたいんですけど、
分かりやすいサイトもしくはサンプルもしくは検索語無いですかね?
48デフォルトの名無しさん:2010/03/24(水) 11:34:19
ttp://soudan1.biglobe.ne.jp/qa3450940.html

この質問者ではないんだけど、やりたいこととしては

typedef unsigned int UINT;

が定義されていなければ自分で定義したい。

擬似コードとしては以下のような感じ。

#ifndef UINT
typedef unsigned int UINT;
#endif

冒頭の URL は実行時に判定しているけど(それはそれですばらしい)
やりたいのはコンパイル時です。
49デフォルトの名無しさん:2010/03/24(水) 12:03:41
>>48
OKWaveの回答者はなにやら勘違いしているようだけど、あるかないかはエラーかどうかで判断できる。
なので、コンパイルしてみてエラーになったら定義すればいい。
逆に言えば、汎用的な手段で判定することはできないので悪足掻きするだけ無駄。
50デフォルトの名無しさん:2010/03/24(水) 12:14:51
template<typename T=unsigned>struct mkUINT{typedef T UINT;};
#define mkUINT() typedef mkUINT<UINT>::UINT UINT;
mkUINT()
51デフォルトの名無しさん:2010/03/24(水) 12:38:46
>>48
そこの回答だと
namespace fuga { typedef unsigned int UINT; }
using namespace fuga;
を加えるとエラーになるよね
52デフォルトの名無しさん:2010/03/24(水) 12:43:10
>>45 誤解されがちなshared_ptrに補足
引数でshared_ptrを渡したいときは const shared_ptr<hoge>& とすればコピーのオーバーヘッドは発生しないし。
->は参照カウントと変更しないからオーバーヘッドはないよ。
new に対するshared_ptrのコストは無視できる。
まあ、大抵のshared_ptrのコストは無視できるよ。ホントにボトルネックになったときに考えればいい。
53デフォルトの名無しさん:2010/03/24(水) 16:12:35
>>52
const でもカウントアップされないと困る場合もあると思うけど。
54デフォルトの名無しさん:2010/03/24(水) 18:30:37
どんなとき?
55デフォルトの名無しさん:2010/03/24(水) 18:39:48
カウントしておかないと実態が解放されちゃうことがあるよ。
これが起こるはずがないというのは本末転倒。

元々その辺の管理をやらなくていいようにするための物なんだから。
56デフォルトの名無しさん:2010/03/24(水) 18:47:28
const参照の参照元が掴んでるから平気じゃね。
必要に応じてコピーすればいいし
57デフォルトの名無しさん:2010/03/24(水) 18:48:23
別スレッドに渡すと死ぬる
58デフォルトの名無しさん:2010/03/24(水) 18:50:01
スタック上にchar[sizeof]で確保した領域に
別の型のオブジェクトをplacement newするのは危険、と小耳に挟んだんだけど本当?
59デフォルトの名無しさん:2010/03/24(水) 18:52:20
ヒープであっても危険
60デフォルトの名無しさん:2010/03/24(水) 18:57:04
>>56
だからずーと掴んでおく必要がないのが shared_ptr でしょうに。
61デフォルトの名無しさん:2010/03/24(水) 19:00:24
>>58
char[sizeof]を宣言してる関数から抜けたら駄目でしょう。
別に placement new だからというわけでもないと思うけど。
62デフォルトの名無しさん:2010/03/24(水) 19:03:53
>>61
関数を抜けなければ大丈夫とお思い?
http://d.hatena.ne.jp/Cryolite/20051102
63デフォルトの名無しさん:2010/03/24(水) 19:10:12
>>61
オブジェクトのメンバにchar[sizeof]で確保されたメンバがあって、オブジェクト自体が自動変数だった場合を想定してます。

>>62
それを呼んでもどういう場合が危険でどう回避すればいいか解らないあたりc++に対する理解度が低いのかなと・・・
64デフォルトの名無しさん:2010/03/24(水) 19:14:43
>>62
それは処理系から来る制限であり、元の仕様とは関係ない。

問題のある処理系ではそのようなコードを書かないのは当たり前のこと。
逆にメモリ管理を上書きしたいんだから、その辺のことを考慮するのは当然だろ。
65デフォルトの名無しさん:2010/03/24(水) 19:18:46
>>63
>危険でどう回避すればいいか解らないあたりc++に対する理解度が低いのかなと・・・

わからない人が使うものではないと思いますが、使う理由は何ですか?
66デフォルトの名無しさん:2010/03/24(水) 20:19:29
>>64
話がずれてるだろお前
67デフォルトの名無しさん:2010/03/25(木) 09:41:55
char name[MAX_PATH] = "";
nameを\0で、埋め尽くしたい場合にどう記述すれば良いのでしょう。
68デフォルトの名無しさん:2010/03/25(木) 10:06:16
その書き方で全部'\0'で埋まってないか?
69デフォルトの名無しさん:2010/03/25(木) 10:19:54
>>67
最初だけで良いなら static を付けて宣言する

それか
memset(name, '\0', MAX_PATH);
で毎回クリアするとか
70デフォルトの名無しさん:2010/03/25(木) 10:21:25
>>67
char name[MAX_PATH] = {'/0'};
71デフォルトの名無しさん:2010/03/25(木) 10:22:05
訂正
/0じゃなくて\0ね。
7267:2010/03/25(木) 10:41:55
初期宣言時   char name[MAX_PATH] = {'\0'};
変数クリア時  memset(name, '\0', MAX_PATH);

解決しました、ありがとうございます。
73デフォルトの名無しさん:2010/03/25(木) 14:26:32
Modern C++ Designにpointeeって出てきたんですけどこれって何者なんですか?pointerの誤植じゃないですよね?
74デフォルトの名無しさん:2010/03/25(木) 14:43:36
employ 【動】雇用する
employer 【名】雇用主
employee 【名】従業員
とか言うのと同じ
75デフォルトの名無しさん:2010/03/25(木) 14:48:29
ポインタが示す先ってこと?
76デフォルトの名無しさん:2010/03/25(木) 14:51:42
int pointee;
int *pointer = &pointee;
77デフォルトの名無しさん:2010/03/25(木) 14:55:01
>>72
memset(name, '\0', sizeof name); の方がよくない?
78デフォルトの名無しさん:2010/03/25(木) 14:58:42
マクロ定数で決まってる配列のサイズを、sizeofにわざわざ変える必要はない。
79デフォルトの名無しさん:2010/03/25(木) 15:46:16
メッセージを表示させて時間が来たら消します

i= MessageBox(hwnd, Message, Title, MB_OK);
Set timer
時間経過→ SendMessage(?,WM_KEYDOWN,VK_RETURN,0);
Killtimer

SendMessageでMessageBoxにエンター入力して表示を消すつもりです。
WM_KEYDOWNにVK_RETURNを送るとエンターの入力になりますよね?
また、MessageBoxのハンドルをどうやって所得すればよいのか解りません。
80デフォルトの名無しさん:2010/03/25(木) 15:48:39
スレチ
81デフォルトの名無しさん:2010/03/25(木) 15:54:32
>>79
MessageBox 使わず、自分で CreateDialog すればいいじゃん。
SendMessage は控えよう!
8279:2010/03/25(木) 16:18:07
API向けのスレでした…すみません。
CreateDialogも調べてみます。
83デフォルトの名無しさん:2010/03/25(木) 16:47:35
>>74,76
thxです
84デフォルトの名無しさん:2010/03/25(木) 21:32:49
カンマ区切りの文字列sがあったとして

foo(strtok(s, ","), strtok(NULL, ","), strtok(NULL, ","));

なんて呼び出しをしたいんだけど、strtok は第一引数の場所から
順番に呼び出されるって保証がありますか?
85デフォルトの名無しさん:2010/03/25(木) 21:34:34
無い
86デフォルトの名無しさん:2010/03/25(木) 21:34:40
ない
87デフォルトの名無しさん:2010/03/25(木) 21:36:03
ない

実際の実装ではむしろ逆から呼ばれる傾向にある
(後ろの引数からスタックに詰むため)
これも必ずそうというわけではないが
88デフォルトの名無しさん:2010/03/25(木) 21:40:22
>>85-87
面倒でもいったん変数に取り出す必要があるんですね。
どうもです。
89デフォルトの名無しさん:2010/03/25(木) 23:37:22
fopen("1.txt",fp)後に while (fgets(s, 256, fp) != NULL) {Line++}で行数を読み込みます。
Lineが100あり、30行目の内容を読み込みたい時ですが、

int a=30,Line=0;
while (fgets(s, 256, fp) != NULL) {
Line++
if(Line=a) 適当な関数(s);


上の記述だと1〜30まで繰り返しますが、ダイレクトに30行目を読み込む方法ってあります?

for()
90デフォルトの名無しさん:2010/03/26(金) 00:30:22
1行の長さが不定なら前から見ていくしかないよ
91デフォルトの名無しさん:2010/03/26(金) 02:40:50
BOOLEAN BOOL boolean bool
どれ使えばいいの?(´;ω;`)
92デフォルトの名無しさん:2010/03/26(金) 03:06:31
BOOLかbool
93デフォルトの名無しさん:2010/03/26(金) 06:25:42
ありがとう
94デフォルトの名無しさん:2010/03/26(金) 10:41:27
>>89
そのソースだと全行で関数が呼び出されるぜw
95デフォルトの名無しさん:2010/03/26(金) 10:45:48
algorithmのstd::remove()について質問です。

std::vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
std::remove(v.begin(), v.end(), 0);
std::remove(v.begin(), v.end(), 1);
printf("%d", v.size());

上記のようにすると、最後のvのサイズは1を期待するのですが3のままです。
でも、v[0]には本来の0ではなく2が入っています。
v[1]もv[2]も2が入っています。

std::remove()の代わりにvector::erase()を使用すれば、
v.size()は1を返します。

std::remove()はそういうモノなのでしょうか?

VC2008で確認しています。


96デフォルトの名無しさん:2010/03/26(金) 10:55:20
>>95
そうです
期待通りの動作をさせるには

v.erase(std::remove(v.begin(), v.end(), std::compose2(
std::logical_or<bool>(),
std::bind2nd(std::equal_to<int>, 0),
std::bind2nd(std::equal_to<int>, 1)))

とする必要があります
97デフォルトの名無しさん:2010/03/26(金) 10:57:09
あ、ごめん

v.erase(std::remove(v.begin(), v.end(), std::compose2(
std::logical_or<bool>(),
std::bind2nd(std::equal_to<int>, 0),
std::bind2nd(std::equal_to<int>, 1)),
v.end())

だった
removeは残す要素の候補を前に集めるだけで、実際の削除は
しませんのでstd::eraseもしくはメンバ関数eraseを使います
98デフォルトの名無しさん:2010/03/26(金) 11:18:20
>>97
erase 使うのならそんな面倒なことせず
remove を erase に置き換えれば良いだけだと思うけど。
99デフォルトの名無しさん:2010/03/26(金) 11:56:46
v.erase(std::remove(v.begin(), v.end(), 0), v.end());
v.erase(std::remove(v.begin(), v.end(), 1), v.end());

これでいいね
removeは第三引数にリファレンスを取るのでlogical_orが使えないな
100デフォルトの名無しさん:2010/03/26(金) 12:00:18
使うとしたらremove_ifとboost::bindを組み合わせるかだ
101デフォルトの名無しさん:2010/03/26(金) 12:05:16
やっと動いた
これは読みにくいわ(^ω^;)

v.erase(
std::remove_if(v.begin(), v.end(),
boost::bind(
std::logical_or<bool>(),
boost::bind(std::equal_to<int>(), _1, 0),
boost::bind(std::equal_to<int>(), _1, 1)
)
),
v.end());
102デフォルトの名無しさん:2010/03/26(金) 12:08:36
ちなみにboost::bindを使ったのは、標準C++にはstd::compose2が無いためです
103デフォルトの名無しさん:2010/03/26(金) 15:02:28
質問は

>std::remove()はそういうモノなのでしょうか?

であって、そういう汚いコードに興味はありません。
104デフォルトの名無しさん:2010/03/26(金) 16:54:30
boost使ったからまだ綺麗なんだぞ
もっと汚いコードは山ほど書いてきた
105デフォルトの名無しさん:2010/03/26(金) 17:12:19
>>104
だから、コード書いてくれなんて誰も頼んでないつーの。
オナニーはよそでやってくれ
106デフォルトの名無しさん:2010/03/26(金) 17:23:03
ときどき void main って書くやついるよね。
なんなんだろうね。馬鹿じゃないかと思うよね。
107デフォルトの名無しさん:2010/03/26(金) 17:28:36
まともな事には答えられないからって、同じ話題をループさせようとすんなよw
108デフォルトの名無しさん:2010/03/26(金) 17:46:36
オブジェクト(インスタンス)を生成するときに変数をポインタにするのとしない場合が
ある理由を教えてくださいませませ

Unko* unko_kusai

Chinko chinko_1
109デフォルトの名無しさん:2010/03/26(金) 17:51:11
>>108
生成パターンを使うと大抵ポインタにならないか?
それから仮想関数で使う場合もポインタにしなければならない
110デフォルトの名無しさん:2010/03/26(金) 18:04:49
別に参照でもいいよ
111デフォルトの名無しさん:2010/03/26(金) 18:06:33
>>108
変数にすると、生存期間をコントロールできない。

ポインタなら自由にコントールできる。
けど自由な分手間もかかるし、プログラマが責任を持つ必要がでてくる。
112デフォルトの名無しさん:2010/03/26(金) 18:08:00
>110
仮想関数の場合な
使う場面は限られるけど

生成パターンでもシングルトンだと参照の場合もあるし
113デフォルトの名無しさん:2010/03/26(金) 18:16:56
Hoge hoge;

{
HogeBase &h = hoge; h.vfunc();
}

ポインタじゃなくてもvtable参照してくれますよ
114デフォルトの名無しさん:2010/03/26(金) 20:12:27
>>113
知ってるから
わざわざ書かなくてよろしい
115108:2010/03/26(金) 23:44:05
レスありがとうございます
今勉強してるサンプルプログラムでポインタあ・なしの両方が出てきて、何故に使い
分けてるのか疑問だったのですが、一方は複雑なことやる必要があるからポインタ、
もう一方はその必要が無いなら安全なポインタ無し という風に使い分けてるという解釈で
おkですかね?
116デフォルトの名無しさん:2010/03/26(金) 23:46:46
>>115
自動で済ませられるなら自動に任せるって琴田
117デフォルトの名無しさん:2010/03/27(土) 00:57:48
>>99
初回のremove()の結果を二回目のremove()の第二引き数とすればerase()は一回でいいんじゃね?
>>101
だとすればわざわざそんなややこしいbind()するメリットもないんじゃね?
118デフォルトの名無しさん:2010/03/27(土) 01:46:00
>>115
メモリリークするバグを潰すのは大変だ。と前置きをした上で。

ポインタにしなかった場合、その変数のスコープから抜けるときに
変数の後始末を自動でやってくれる。つまりメモリリークの心配がない。
これは色々処理をする途中で、エラーが発生したら中断、みたいな処理をするときにはとても楽。
ポインタを使った場合、中断するときにnewしたオブジェクトを正しく全てdeleteしないと
メモリリークになるのでよく注意する必要がある。

一方で、>>109の言うようにオブジェクトの生存期間を自分で管理したい場合や、
継承を使ったオブジェクトを使いたい場合、
もしくは大きなオブジェクト(大きな配列など)はポインタを使う必要がある。

C++であれば、ポインタでありながら、メモリリークの心配がいらないスマートポインタという
仕組みがよく使われる。(boost::shared_ptrなど)
これを使うと普通のポインタよりも実行速度がやや遅くなるが、普通は気にするほどではない。
119デフォルトの名無しさん:2010/03/27(土) 01:54:03
速度気にならなければ、動的メモリ確保をすべて乗っ取って
ガベージコレクションした方が良い。
ヘッダ変更だけで済む
120デフォルトの名無しさん:2010/03/27(土) 01:55:54
はじめからnewを使わないという戦略もある
STLをうまく使えば、スマートポインタ、ガベージコレクション、new
はほとんどいらんだろう。
121デフォルトの名無しさん:2010/03/27(土) 05:50:38
>>117
>初回のremove()の結果を二回目のremove()の第二引き数とすればerase()は一回でいいんじゃね?

アホ
removeの戻り値は削除候補の先頭だ
前に集められた候補の中に次に削除したい値が含まれているので
その方法はダメ

>だとすればわざわざそんなややこしいbind()するメリットもないんじゃね?

だったらお前が何か書いて見せろや
口だけ出して何もしない奴が一番嫌いだな
122デフォルトの名無しさん:2010/03/27(土) 08:34:09
>>121
間抜けで頓馬で馬鹿と来ちゃ、どうしようもないな。

・間抜け
削除候補が集められるのは前じゃなくて後ろだよ。
つまり、「後ろに集められた削除候補の先頭」が戻されるって訳。

・頓馬
自分で確認すれば間違いに気付けたのにそれさえしないんだからな。

・馬鹿
その上、何か書いて見せろって自分が書けもしないのによく言うよ。

馬脚を現わした挙句に自ら墓穴を掘ったわけだ。
123デフォルトの名無しさん:2010/03/27(土) 08:43:16
>>122
間抜けのアホはお前だ

>削除候補が集められるのは前じゃなくて後ろだよ。
>つまり、「後ろに集められた削除候補の先頭」が戻されるって訳。

そんなもん常識だろ
>>121のどこにこれを否定するような文が書いてある?
>>117の通りにしたら1が削除されずに残ってしまうだろ
実行して試してみ

それとも図星を突かれて悔しくてファビョったのか?
124デフォルトの名無しさん:2010/03/27(土) 08:52:48
二人とも言い合いせずに特に>>122はプログラム例を書いて示せ
お前さんの言いたい事はこういう事だろ?

std::vector<int> v;

v.push_back(0);
v.push_back(1);
v.push_back(2);

v.erase(std::remove(v.begin(), std::remove(v.begin(), v.end(), 0), 1), v.end());

std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;

std::printf("%d", v.size());
125デフォルトの名無しさん:2010/03/27(土) 09:35:13
>前に集められた候補の中に
126デフォルトの名無しさん:2010/03/27(土) 09:38:05
>>125
合ってるじゃないか
前に集められた「削除から外される」候補の中にと文脈からは取れるだろ

>前に集められた候補の中に次に削除したい値が含まれているので

これをよく読め
127デフォルトの名無しさん:2010/03/27(土) 09:39:47
要するに>>122はイチャモン付けて喧嘩したいだけなんだよ
相手が誰であろうと構わないわけだ

だったら痛くも痒くもないネット内でのビビリ喧嘩などせずに
街に出てDQNに喧嘩吹っ掛けてボコボコに殴られてこい
128122:2010/03/27(土) 09:51:16
んじゃ、>123のために私の書いたのを貼っておく。
まぁ、>124と核は同じだね。
--
#include <algorithm>
#include <cstdio>
#include <vector>

int main()
{
std::vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
for (int ic = 0; ic < 10; ++ic) {
v.push_back(ic % 5);
}
v.erase(std::remove(v.begin(), std::remove(v.begin(), v.end(), 0), 1), v
.end());
for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++i
t) {
printf("%d\n", * it);
}
return 0;
}
--
それはさて。
>>121のどこにこれを否定するような文が書いてある?
>121には「前に集められた候補」とあるんだけどな。
まぁ、「削除候補とは書いてない」と言い出すだろうからまぁいいや。
129122:2010/03/27(土) 09:59:35
うぉっ、80カラムでぶった切れているから難癖つけられる前に問題の行だけ再掲。
--
v.erase(std::remove(v.begin(), std::remove(v.begin(), v.end(), 0), 1), v.end());
for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) {
--
つーか、書いている間に予想通りのレスがついてて笑えた。
無茶しやがって……
130デフォルトの名無しさん:2010/03/27(土) 10:00:31
>>128
>>126

お前の目はフシアナだ
131デフォルトの名無しさん:2010/03/27(土) 10:44:25
>>126
>removeの戻り値は削除候補の先頭だ
>前に集められた候補の中に次に削除したい値が含まれているので

一行前に削除候補って書いてあるのに、次の行の候補が「削除から外される」候補と
読むのはかなり無理がある
132デフォルトの名無しさん:2010/03/27(土) 10:48:56
>>131
お前の頭が悪いからだ
その分だとプログラムもバグだらけだろう
133デフォルトの名無しさん:2010/03/27(土) 11:00:02
>>132
いい加減見苦しい。
説明が下手か勘違いしていたのかは詳らかではないが、
そもそも>117で巧くいくことははっきりしている。
他人を嫌う前に、ご自身の言動を見直してみては如何?
134デフォルトの名無しさん:2010/03/27(土) 11:03:36
>>133
見苦しいのはお前の方
こちらの説明が間違ってないのに間違って言い張るお前は馬鹿
135デフォルトの名無しさん:2010/03/27(土) 11:08:20
>>120
STLをうまく使うにはスマポは必須だけどね。
スマポでもshared_ptrならmake_sharedを使えばnewもいらず例外安全性も確保されるようになるし。
STL+shared_ptrでnewもガベコレもいらなくなるね。
136デフォルトの名無しさん:2010/03/27(土) 11:11:45
>>117はせっかっく良いことをいったのに、挑発レスを受け流せずに台無しだ。
137デフォルトの名無しさん:2010/03/27(土) 11:13:16
>>117は単純馬鹿だからな
この分だと仕事場でも>>117は同僚とぶつかってばかりだろう
138デフォルトの名無しさん:2010/03/27(土) 11:18:35
>>121
> その方法はダメ
見苦しい弁解まだ〜w
139デフォルトの名無しさん:2010/03/27(土) 11:31:30
的外れな突っ込みをするバカが一番悪いだろw
140デフォルトの名無しさん:2010/03/27(土) 11:33:44
>>99
これで単純明快なのにケチを付ける奴が一番悪い
141115:2010/03/27(土) 12:05:39
皆様詳しいレスありがとうございました。
色々まだ自分の知らないワードが出てきたのでググって勉強しますぉ。
142デフォルトの名無しさん:2010/03/27(土) 21:51:58
SetTimerでタイムアウト後、タイマのプロシージャの中でKillTimerしても良いんでしょうか?
プロシージャ外じゃないと駄目なんて事は
143デフォルトの名無しさん:2010/03/27(土) 22:13:10
>>142
なんのSetTimer?
Win32ならWin32スレで聞くと詳しいぞ
144142:2010/03/27(土) 22:21:24
SetTimerはWin32でした、すみません。
145デフォルトの名無しさん:2010/03/27(土) 23:14:51
gnuplotでリアルタイム解析をするクラスを作りたいんだけど参考になるものなにかありますか?
146デフォルトの名無しさん:2010/03/27(土) 23:16:26
なんのリアルタイムかわからん
アクセス解析か
147デフォルトの名無しさん:2010/03/27(土) 23:22:33
物理の数値計算です
3次元での粒子の位置などを見ます
148デフォルトの名無しさん:2010/03/27(土) 23:37:52
gnuplotは表示ツールであって解析ソフトではないと思うが。
一応「gnuplot C++」あたりでググればそれっぽいページは出てくるな。

だが、もう少し本当にやりたいことは何なのか考えてみた方がいいと思う
149デフォルトの名無しさん:2010/03/27(土) 23:49:26
>>147
解析を行いたいのか、解析データはあるからプロットだけしたいのか?による。
150デフォルトの名無しさん:2010/03/28(日) 00:13:05
パイプ開いてコマンドを出力すればリアルタイムに描画してくれるよ
ただ糞遅いから結局のところ違う描画ライブラリ使うことになるだろうけど
151デフォルトの名無しさん:2010/03/28(日) 01:02:21
>>149
後者です

>>150
別にいいのがあるならどんなのがあるか教えてもらえるとありがたいです
152デフォルトの名無しさん:2010/03/28(日) 01:11:06
http://home.f08.itscom.net/okuya8/nnodysimulation.pdf

ここの5.8章みたいなことがしたいということです
説明下手ですいません
153デフォルトの名無しさん:2010/03/28(日) 16:23:54
C++とJavaの両方を勉強する意味ってありますか?何か範囲がかぶってる気がしまして。
154デフォルトの名無しさん:2010/03/28(日) 16:36:05
>>153
英語とフランス語の両方を勉強する意味ってありますか?
155デフォルトの名無しさん:2010/03/28(日) 16:38:14
意味はあるに決まってるが、
一方を勉強したらもう一方を勉強するのはかなり楽
156デフォルトの名無しさん:2010/03/28(日) 17:07:03
英語とフランス語というより
英語とドイツ語ってぐらいか
157デフォルトの名無しさん:2010/03/28(日) 17:14:29
スペイン語とポルトガル語くらいじゃないか
158デフォルトの名無しさん:2010/03/28(日) 17:15:44
例えが分かりにくくないかw
要するにどっちも覚えたら最強ってことだ
159デフォルトの名無しさん:2010/03/28(日) 22:16:31
>>153
> C++とJavaの両方を勉強する意味ってありますか?何か範囲がかぶってる気がしまして。
仕事がかぶってないからいいんじゃね?
160デフォルトの名無しさん:2010/03/28(日) 23:47:57
両方覚えてようやく半人前だと思うぞ。
161デフォルトの名無しさん:2010/03/28(日) 23:53:23
>>153
C++を学べばjavaもc#も軽い軽い
162デフォルトの名無しさん:2010/03/28(日) 23:55:26
いや重いよ
163デフォルトの名無しさん:2010/03/29(月) 00:25:58
64bit PCでのドライバの操作を含むアプリを開発する場合。
32bitビルドのアプリ(wow64で動作)と64bitドライバの組み合わせで動作させることは可能でしょうか?

DeviceIoControlなどのドライバとのIOなど、その他動作面で問題ないでしょうか?
164デフォルトの名無しさん:2010/03/29(月) 00:52:16
VisualStudio2008でビルド後にVMware内で起動させてデバッグするにはどうすればよいでしょうか?
できればF5キー一発ぐらい自動的な方法でお願いします
165デフォルトの名無しさん:2010/03/29(月) 08:55:43
>>163
どちらも作り方しだいです。

>>164
VMware 内で VS を動かしてください。
166デフォルトの名無しさん:2010/03/29(月) 10:00:54
>>162
少しワロタ
167デフォルトの名無しさん:2010/03/29(月) 16:00:33
>>153
並行して設計できるようにならないと無意味
168デフォルトの名無しさん:2010/03/29(月) 16:01:03
訂正:設計できるように→設計もできるように
169デフォルトの名無しさん:2010/03/29(月) 16:45:38
>>165
すみませんが実機でビルドしてVMwareにロードさせる方法を教えてください
170デフォルトの名無しさん:2010/03/29(月) 17:09:24
実機でビルドしたならそのまま動かせばいいだろ。
開発機でビルドしたというなら話は別だが。
171デフォルトの名無しさん:2010/03/29(月) 17:15:52
>>169
逆に普段どうやってるんだ?
隣のPCで動かすのと同じだろ。
172デフォルトの名無しさん:2010/03/29(月) 17:34:38
プロジェクトフォルダごとDVCSのリポジトリにコミットして
VMWare上の環境でそれをcheckout
173デフォルトの名無しさん:2010/03/29(月) 18:28:51
それを自動化すればいいじゃん。
174デフォルトの名無しさん:2010/03/30(火) 14:27:00
public継承する場合、派生クラスは基底クラスについてよく知っていると考えておk?
175デフォルトの名無しさん:2010/03/30(火) 14:35:56
ある右辺を有する配列の番号?を得るにはどうしたらいいでしょうか?

例えば配列int x[3]の3つの要素がそれぞれ
1,3,5であるが、どのx[]がそれぞれ1,3,5を有するかわからない場合に、
maxたる5を有するx[?]の?を出力したいのです。

特に、これの2次元配列版の出力方法を教えていただきたいのですが
176デフォルトの名無しさん:2010/03/30(火) 14:37:25
普通に検索する
177デフォルトの名無しさん:2010/03/30(火) 16:35:35
配列の要素数がそんなに大きくなければ、for文で先頭から探せばいいんでねーがな。
178デフォルトの名無しさん:2010/03/30(火) 16:45:18
ユニークなら格納方法を変える
ユニークで無いなら考察無意味
179デフォルトの名無しさん:2010/03/30(火) 17:19:02
>>174
よくではなく、ある程度知っていればOK。
180デフォルトの名無しさん:2010/03/30(火) 22:58:55
#include "a.h"

と書いた場合
・そのファイルと同じディレクトリのa.h
・コンパイルしたディレクトリのa.h
のどっちが選ばれるのかは決まってますか?
181デフォルトの名無しさん:2010/03/30(火) 23:10:50
未規定
182デフォルトの名無しさん:2010/03/31(水) 01:32:58
>>180
サーチパスの優先順位の高い方
183デフォルトの名無しさん:2010/03/31(水) 02:05:31
C++どれくらいで基本身につきますか?
ちなみに今中学生です
184デフォルトの名無しさん:2010/03/31(水) 02:58:10
perl出身なんだだけど、どうもCが無意味にめんどいように感じてしかたありません。
一言で言うと、制限とか宣言とか制約とか多すぎます。今、1変数1バイトの所まで知ってやる気がなくなってきました。

例えばですけど、こんなふうに処理が書きたいです

my %fanc = (
'fanc_a' => sub{ なんか処理 },
'fanc_b' => sub{ なんか処理 },
)
my @fanc = ('fanc_a', '引数');  #これ外部から取り入れた文字列
my $code = '??';        #これも外部から取り入れた何かのコード

$code =~ s/(変換しますお)/$fanc{"$fanc[0]"}->($fanc[1], $1);/eg;


完全に頭の中がperlに支配されてるんです。perlしかできないから。
Cを始めた理由は「exeなGUIを作りたかった」ってだけなんですが、もしかしてC以外を覚えたほうがいいでしょうか?
なんでもいいからなんかお勧めしたり、Cを肯定したり、助言したり、こんな情報みれやとURLを貼ったりしてほしいです。
どうすればいいのか全てを見失ってきそうです。
185デフォルトの名無しさん:2010/03/31(水) 03:05:47
186デフォルトの名無しさん:2010/03/31(水) 03:17:46
>>183
人によるとしか。すぐできる奴もいれば10年かけてもダメな奴もいる。
数学・英語・料理・ゴルフ・・・なんでも同じだな。
187デフォルトの名無しさん:2010/03/31(水) 03:19:19
ありがとうございます。
でもperlをexeにしたら、一通りやりましたが何を使ってもバグるんです。
警告なしで関数が動かずにスルーされてたりするんです。ひどいですよね。
188デフォルトの名無しさん:2010/03/31(水) 03:20:26
ずっとperlだけをやるのが一番いいだろ。
189デフォルトの名無しさん:2010/03/31(水) 03:28:50
perlが得意ならそのライブラリのソース読んで自作すればいいんじゃないのかな?
もしくは修正する。

結局、言語部分でしっくりきてないようだけどさ、
どちらにしてもWindowsAPI(exeなgui)などの知識が別途必要になってくる訳だし。
190デフォルトの名無しさん:2010/03/31(水) 03:39:22
Cの方が文法がシンプルで低級高速でバグが見つけやすくて綺麗に書けます
191デフォルトの名無しさん:2010/03/31(水) 05:46:09
>>180
一般的には前者。

>>182
それは不等号で括った場合じゃないのか?
192デフォルトの名無しさん:2010/03/31(水) 08:48:16
>>184
C#がおすすめ
193デフォルトの名無しさん:2010/03/31(水) 17:03:26
C++で簡単なゲーム作るのに初心者向けの本ぐらいの知識があれば出来ますか?
やっぱりwindowsAPIの知識だとか必要
194デフォルトの名無しさん:2010/03/31(水) 17:13:43
>>190
嘘付けアホ
泥沼化したらまずバグを見つける事は不可能に近いぞ
195デフォルトの名無しさん:2010/03/31(水) 17:15:55
プログラムの中のプログラムを書く場合にプログラムの中のプログラムの文がStringだと
処理が重いので
どうやればいいですか?
アイディアが浮かびません。
本とかに乗ってるやり方教えてください。
196デフォルトの名無しさん:2010/03/31(水) 17:23:01
勃起するまでもないまで読んだ
197デフォルトの名無しさん:2010/03/31(水) 17:45:01
>>195
質問の意味が全然わからねぇ。
プログラムの中のプログラムってどういう意味だ?
198デフォルトの名無しさん:2010/03/31(水) 18:01:03
デザインパターンのインタープリターパターンみたいなやつです。
199デフォルトの名無しさん:2010/03/31(水) 18:03:56
構文解析木/抽象構文木というのを作って、それを元に処理する

200デフォルトの名無しさん:2010/03/31(水) 18:08:25
意訳

関数中で文字列操作をするのだがStringクラスを使うと遅い
これを改善する方法はないだろうか?
私は馬鹿だ
信頼性のある方法を教えろ
201デフォルトの名無しさん:2010/03/31(水) 18:14:16
>>199
なるほど、パーサーがパースした物を初めから作れということですね。
しかし構文解析木の接点はstringじゃないんですか?
>>200
一行目が違います。
202184:2010/03/31(水) 18:54:50
ありがとうざいます。
他のスレとか見ても、言語に俺のようないちゃもん付けてる人いないので、
どうも俺の脳みその構造が間違ってたみたいです。

少し頭の構造を作り変えるべく勉強してまいります。
ありがとございました。
203デフォルトの名無しさん:2010/03/31(水) 19:00:41
>>202
C言語はまだマシだがC++は発狂する難しさだから
今のうちに別言語のほうがいいんじゃない?
exeでさえ良ければrubyならexerbとかあったような気がするから
perlでもあるでしょ。
204デフォルトの名無しさん:2010/03/31(水) 20:24:48
stringクラスの使い方が悪いから遅いってこともあるかと
205デフォルトの名無しさん:2010/03/31(水) 23:37:54
>>203
C++ってそんなに難しいの?
独学では無理なレベル?
206デフォルトの名無しさん:2010/03/31(水) 23:42:08
>>205
> 独学では無理なレベル?
俺は趣味プログラマでC++を独学でやっているが、
実装の都合をユーザーに押しつけるような代物。

バッドノウハウと「奥が深い症候群」
ttp://0xcc.net/misc/bad-knowhow.html

これを地でいくC++は、ホント好きor仕事じゃないと
やってらんないと思う。
207デフォルトの名無しさん:2010/03/31(水) 23:57:14
>>206
Cから移行しようかとおもってたんだが何か難しそうですね。
取り合えず全部の機能を使おうとするんじゃなくてbetter Cとして練習してみます。ありがとう
208デフォルトの名無しさん:2010/04/01(木) 00:04:24
>>207
> 取り合えず全部の機能を使おうとするんじゃなくてbetter Cとして練習してみます。
うん、それが正解だと思うよ。
難しいの使ってる俺SUGEEE
ってなれる性格じゃないとちょっと嫌になりかねないし。
209デフォルトの名無しさん:2010/04/01(木) 00:27:29
C++は昔からいいところもあれば悪いところも多いって位置付けだったのに、
最近はC++を本気で絶賛してる子が増えてる気がする
怖いね
210デフォルトの名無しさん:2010/04/01(木) 00:31:22
統計とってから増えてるとか言えよカス
てめーの感覚なんざ誰も信用しねぇよ
211デフォルトの名無しさん:2010/04/01(木) 01:05:56
マジレスすると、Cでも面倒だと感じるなら、C++から手を出すなんてやめとけ
C#→C→better CとしてのC++の順にやり、その上で、必要であればC++をやれ
212デフォルトの名無しさん:2010/04/01(木) 01:13:06
C++よりCで作る方が面倒だって
入門書の例題レベルなら話は別だろうけど
213デフォルトの名無しさん:2010/04/01(木) 01:28:05
>>212
そういう意味で言ったんじゃないんだけどな
214デフォルトの名無しさん:2010/04/01(木) 03:50:26
ほんとC++はbeter Cがいいよ。
215デフォルトの名無しさん:2010/04/01(木) 03:59:07
http://www.nicovideo.jp/watch/sm8114121
こんな感じでゲームが作りたいです。
どうしたらこんな感じで作れるようになりますでしょうか?
参考書でも良いのでアドバイスお願いいたします。
216デフォルトの名無しさん:2010/04/01(木) 08:58:35
>>215
春休み中に作るのは不可能。
217デフォルトの名無しさん:2010/04/01(木) 09:20:10
pimpl等 動的に確保したオブジェクトへのポインタをクラスのメンバとして持つ場合、
普通の生ポインタではなくスマポを使うようにといわれています。
深いコピーを想定しているため共有する必要はないので、必ずしもshared_ptrである必要はありません。
この場合は実際,
std::shared_ptr(まだ標準でない)
std::unique_ptr(まだ標準でない)
std::auto_ptr(標準)
boost::shared_ptr(boostが入っていない環境では使えない;準標準)
boost::scoped_ptr(boostが入っていない環境では使えない;準標準)
と5通りほど考えられると思うのですが
普遍性、速度などの面でどのスマポがいいのでしょうか。

よろしくお願いします。
218デフォルトの名無しさん:2010/04/01(木) 11:14:29
その場合は生ポで十分
219デフォルトの名無しさん:2010/04/01(木) 15:15:46
>>217
>普通の生ポインタではなくスマポを使うようにといわれています。
どういう理由でスマートポインタが必要なんだ?
それががわからないのに選択できるわけがない。

そういう言った本人にお伺いを立てる方が100倍速いわ。
220デフォルトの名無しさん:2010/04/01(木) 15:22:20
何でもかんでもスマポスマポ言う奴は雑魚
221デフォルトの名無しさん:2010/04/01(木) 15:59:34
>>220
まあお前が雑魚なんだけどな
222デフォルトの名無しさん:2010/04/01(木) 16:05:40
>>221
雑魚乙でありますwwwwwww
223デフォルトの名無しさん:2010/04/01(木) 16:23:50
まぁ雑魚は大概複数で群がっている
224デフォルトの名無しさん:2010/04/01(木) 19:59:07
>>217
shared_ptrをpimplで使うのは、不明な型を安全にdeleteできるメリットがある。この理由のためだけにpimplで使っても良いよ。
pimplの為に使うのであれば、shared_ptrの複製を作らない可能性が高く他の方式と速度の差は殆ど無い。
225デフォルトの名無しさん:2010/04/01(木) 20:41:32
>>218-217
動的に確保したオブジェクトへのポインタをクラスのメンバとして持つ場合、
スマートポインタを用いるのが間違いが起こりづらく可読性も高いという
コンセンサスがC++界にはあるのかと思っております。

>>224
動的削除子により不完全型を持てるというやつですね。
226デフォルトの名無しさん:2010/04/01(木) 21:59:41
スマートポインタ好きもそうでないのもいると思うが、
あれ可読性は高くないだろ?
見た目はかなり汚い
227デフォルトの名無しさん:2010/04/01(木) 22:02:05
>>226
一目でスマポと分かるし
228デフォルトの名無しさん:2010/04/01(木) 22:12:15
まじめにCをやることになって VC++2008を入れたら、すっげーめんどくさいことになりました。
今まではサクラエディタとか秀丸とかそんなのを使ってて、ALT+Z を押したら編集中のコードがそのままexeになって勝手に保存されてる仕組みでした。
と言うかプロジェクトってなんですか?
統合環境とやらは使ったほうがいいんですか?
使ったほうがいいなら、VC++2008のサイト教えてもらえないでしょうか?(検索したら記述のサイトばっかり出てくる)
229デフォルトの名無しさん:2010/04/01(木) 22:15:27
真面目に大規模なコード組むならIDEがあれば楽なことには違いない。
最後の行は何が聞きたいのかイミフ
230デフォルトの名無しさん:2010/04/01(木) 22:16:25
>>228
makeを書けないなら統合環境使っとけ。
231228:2010/04/01(木) 22:36:05
今の所、コンビニに行くのにメリーゴーランドに乗って出かけるような気持ちでいっぱいです。
makeのためなら使わないかも・・・

たまたま連休がめぐってきて、なおかつやる気があった日に使い方を調べてみるかもしれません。
232デフォルトの名無しさん:2010/04/02(金) 00:09:49
エディタ・ビルド・デバッガが融合してるのは便利。もう戻れない。
Edit and Continueを初めて見た時は感動した。
233デフォルトの名無しさん:2010/04/02(金) 10:45:38
makeをIMEに通したら負けに変換される
234デフォルトの名無しさん:2010/04/02(金) 11:37:39
>>231
まずは付属のドキュメント読んでチュートリアルやれ
中途半端な知識を応用して手探りで取り組むより遥かに良い
235デフォルトの名無しさん:2010/04/02(金) 11:59:07
>>228
「まじめにCをやることになって」ということだけど、この意味がわからないね。
まじめにやるのなら統合環境を使えるようになるのは当然のことだと思うし、
その気があれば数時間もあればビルドぐらいできるようになるはず。

Windows に依存したくないとか、趣味のプログラムなら VC 使う必要ないし、
自分が使えるコンパイラでやってればいいんじゃないの。
コードをトレースしてデバッグとかも必要ないんでしょうからね。
236デフォルトの名無しさん:2010/04/02(金) 15:11:16
最近の子はmakeも書けない
237デフォルトの名無しさん:2010/04/02(金) 15:14:24
だってautomakeあるもの
238デフォルトの名無しさん:2010/04/02(金) 15:21:22
A. make は書けるが統合環境は覚えられない
B. make は書けないが統合環境いこなせる
Bの方が使えるよ
239デフォルトの名無しさん:2010/04/02(金) 16:10:26
>>238
えー、まじで?

でも統合環境めんどくさくね?
俺の秀丸なんて、改行するたびにデバックモードでコンパイルされるよ。
F5とか押す必要もなければ、使う予定もない大量のファイルが生成されることもない。
ちなみにF5を押した場合に最後にデバックしたときのログが表示される。
240デフォルトの名無しさん:2010/04/02(金) 16:53:46
>>239
改行する度にコンパイルなんかされたら、まともにコード書けないだろ。意味わかんない。
F5かどうかはともかく、コンパイルや実行の指示ができないんなんてありえない。
大量のファイルとか作成されても見る必要がないから関係ない。

統合環境でないと関数のヘルプも見れないだろうし、インテリセンスも機能しない。
リソースも直接 .rc を編集するの??

デバッグ時はコードのトレースもできないし、コールスタックの確認もできない。
つかブレークポイントも設定できないじゃん。
変数の内容を確認するときにはprintf で出力するのかwww

まともなアプリケーションなら開発効率が10倍ぐらい変わってくるねよ。
けどまぁテキストベースのお遊びのプログラムなら、どっちもで変わらんかもな。
多分そういう世界の話なんだろうな。
241デフォルトの名無しさん:2010/04/02(金) 17:04:44
デバッグとホットスポットが見られないのは痛すぎるな。
これない環境で同レベルまで自力でやるとなると
10倍どころか100倍やっても追いつかないのでは。
問題点の発見は難しい
242デフォルトの名無しさん:2010/04/02(金) 17:26:04
えー?
eclipseもseve automatically before build がデフォじゃん
243デフォルトの名無しさん:2010/04/02(金) 17:50:06
書き込みテストうんこ
244デフォルトの名無しさん:2010/04/02(金) 21:49:33
勃起するまでもない質問はここに
245デフォルトの名無しさん:2010/04/03(土) 12:05:26
stdinを読む場合、キーを押してエンターを押しますが、エンターの押下を待たずにキーが押された時点でstdinを読ませることはできますか?
246デフォルトの名無しさん:2010/04/03(土) 14:04:24
>>245
できないんじゃね?
Windows かどうかしらんけど、まあAPIを使えばいいじゃないの?
247デフォルトの名無しさん:2010/04/03(土) 18:45:03
VC++6.0について質問です。

VB6.0のdebug.print、VB.NETのConsole.WriteLine()に相当する
IDEのウィンドウに結果を出力する方法を教えてください。

宜しくお願い致します。
248デフォルトの名無しさん:2010/04/03(土) 21:14:35
>>247
::OutputDebugString()
しかしVC++6とはレトロ趣味ですね
249デフォルトの名無しさん:2010/04/04(日) 00:20:41
VC++2008で、エディタのみ立ち上げてインテリシンクを使いたい
のですが出来ますか?

VCを立ち上げてプロジェクトを開いた形でならソース編集時にインテリ
シンクは動作しますが、できれば軽いエディタのみで編集したいのですが・・・

vs2008 express editoin
250デフォルトの名無しさん:2010/04/04(日) 00:21:43
使えるよ。
251デフォルトの名無しさん:2010/04/04(日) 00:23:44
>>250
おー、そのやり方をぜひ教えてください
252デフォルトの名無しさん:2010/04/04(日) 00:34:09
タダじゃ教えられねぇな
253デフォルトの名無しさん:2010/04/04(日) 00:46:06
>>252
教えてやれよ。
「使えるよ」「できるよ」とか一行レスされて、
やりかたを教えてくださいって聞き返してくるやつ珍しいな。
ほかはコミュ力無いから、そのまま黙っちゃうのに。
254デフォルトの名無しさん:2010/04/04(日) 04:24:44
>>253
スルーしてるだけだと思うんだw
255デフォルトの名無しさん:2010/04/04(日) 12:06:20
糞重いIDEに洗脳されてる輩が増えてるな。
開発効率は軽さこそ命なのに。
ブレークポイントだのスタックトレースだのが無いと開発出来ないなんてのは
器具がないと治療できませんとぬかす現代の医者のようだな。
組み込み機で割り込みベクタのデバッグとかやってみ。
256デフォルトの名無しさん:2010/04/04(日) 12:08:21
アホか
開発速度こそ命の安い案件がどれだけあると思ってるんだ
257デフォルトの名無しさん:2010/04/04(日) 12:17:02
>>256
・まず人を見下す
・文意を読み違えている
・憶測をもとにした論拠
君、もう全然ダメ。今日は一日寝てなさい。
258デフォルトの名無しさん:2010/04/04(日) 12:37:23
>>257
お前が寝てろ無職
259デフォルトの名無しさん:2010/04/04(日) 12:42:44
>>258
・オウム返し
も追加しときますね。
260デフォルトの名無しさん:2010/04/04(日) 12:47:37
>>259
オウム返しはお前だろ無職のクズ
261デフォルトの名無しさん:2010/04/04(日) 13:44:43
ここで聞くほどでもないんだろうけど、FindFirstFile()使ってサブディレクトリ内のファイルまで網羅リストアップしたいんだけど、
サブディレクトリのパスを一時格納するのってvector,list,dequeとかで何がいいんだろう

あるディレクトリ内を検索して、サブディレクトリが見つかったらパスを↑のコンテナに入れて、検索が終わったときコンテナに要素が残ってればそいつの中を検索して、ってのを繰り返したいんだ

使ったことがあるのはlistだけなので、別な物も使ってみたい
ぶっちゃけstackでも用は足しそうだけど、速さや容量やコードのシンプルさ求めるとどうなのかなあと
262デフォルトの名無しさん:2010/04/04(日) 13:46:52
そういう目的ならコンテナアダプタStackが良いだろう
263デフォルトの名無しさん:2010/04/04(日) 13:54:34
幅優先探索はqueue
264デフォルトの名無しさん:2010/04/04(日) 15:06:33
>>262-263
ありがとうございます
とりあえず定番らしいqueue使ってみます
265デフォルトの名無しさん:2010/04/04(日) 19:02:55
Aクラスを継承して作成したBクラス( Move()関数のみオーバーライドしている )に
Aクラスの情報をすべてコピーしたいんですけど、どうするのが一番良いでしょうか?

A obja
B objb

objaのいくつかの処理を行う

objb = obja;

仮にこれができるのなら、objaと同じ状態のobjbは出来そうですが…
266265:2010/04/04(日) 19:15:20
捕捉ですが、コピーしたい情報は手動でおこなうにはかなり莫大です。
そもそも、Bを作らず、BでオーバーライドしているMove()を、
AのMove()とは別にAの中に作り、

A obja,objb;
...
objaのいくつかの処理を行う
・・・
objb = obja;

として、それぞれのMove()を使い分けする方法は思いつきましたが、
それだと1つのクラスに2つの概念を取り込む形になってしまって気持ち悪いですよねぇ・・・
267デフォルトの名無しさん:2010/04/04(日) 19:18:52
その膨大な内容を構造体として持っておくとか
268デフォルトの名無しさん:2010/04/04(日) 19:33:31
単一用途のプログラムをライン工のようにもくもくと作り続けて年取っちゃった古いプログラマと、
プログラミング勉強しててある瞬間にそれまでわからなかった事が急に見え始め、万能感に囚われ、
どうして理解出来たかを自分理論で整理し始めた脱初心者くらいの人は、得てしてプライドが高くなりがち

そしてプライドの高さに反比例するように、視野はどんどん狭くなっていきがち
269デフォルトの名無しさん:2010/04/04(日) 19:39:52
>>268
脈絡がわからない。
どれに対して言ってるんだ。
270デフォルトの名無しさん:2010/04/04(日) 19:52:40
>>269
チラシの裏だろたぶん。
271デフォルトの名無しさん:2010/04/04(日) 21:05:51
>>269-270
うはwwww
誤爆だったんだが、タイミング良く書き込みエラーになったから無問題と思ったのにwwww
なんか時間差で書き込まれてたスマソ
272270:2010/04/04(日) 21:08:01
>>271
マジ誤爆だったのか
273265:2010/04/04(日) 21:38:28
>>267
うーん、それだとprivateとpublicそれぞれに変数がある場合だったり、
Aが派生クラスで、基底クラスの更新が考えられる場合などに、
構造体が1つでなく2つ3つとなったりして、対応しきれないんですよね

「全状態と全関数を引き継いで、その上で異なる動きをさせる」ってのがやりたいんですが・・・

>>266で書いたようなことをすると、気持ち悪いという以外にも
BがAと共有しているポインタをいじってしまう恐れがあるんですよね。

BにAをコピーした上で、『Bにさせる動きだけ』をBでオーバーライドすれば
Bの中身を見るだけで、危ないことをしてないかどうか管理できるのですが・・・
274265:2010/04/04(日) 21:59:34
ちょっと分かりにくかったので、やりたいことをもう少し具体的にしておきます。
「Aの "ある時点での" クローンを作成し、そのクローンの動きを監視したい」です

ただし、これはあくまで『見えない』クローンであって、一時的な処理に必要なだけなので
・目に見える処理はさせない必要と、
・Aと共有しているポインタをいじらない必要
があります。
その解決策として、継承→オーバーライドを考えているわけです

ポインタに関しては「クローン用のコピーを作成すればいいのではないか」となりますが、
そのポインタ自身(Cというオブジェクト)がさらにポインタを持ってたりして
それら全ての「その時点」をコピーする必要があってややこしいので、
「Bの処理だけに着目」させて、ポインタは必要な場合のみコピーを作成する、というようにしたいのです
275デフォルトの名無しさん:2010/04/04(日) 22:03:28
>>273
つまりは、こういうことがやりたいわけだ。
http://www.geocities.jp/ky_webid/design_pattern/010.html
ポインタを共用するなら自前で参照カウンタ式にするか、boost::shared_ptrを使えば?
276デフォルトの名無しさん:2010/04/04(日) 22:41:05
>>265
何がやりたいのかよく分からないです
コードも使って説明した方がいいよ
277デフォルトの名無しさん:2010/04/04(日) 22:44:20
>>274
普通にディープコピーすりゃいいんじゃないの?
278265:2010/04/05(月) 00:05:10
// Aクラス内
class A : public ICloneable{
protected:
int m_time;
public:
virtual void Move(){
m_time++;
}
ICloneable* A::Clone(){
ICloneable* clone = new A();
*clone = *this;
return clone;
}
}

// Bクラス内
class B : public A{
public:
void Move(); // オーバーライド
}

// Cクラス内
A* obja = New A();
obja->Move();
B* objb = A->Clone();
objb->Move();

これだと、「ICloneable*からB*に変換できません」とエラーが出ますが
やりたいことは伝わるかなーと思います...
Bを独立させて動かすことにより「Aの数F先の動きを読む」というのが狙いです。
実際はBのMove()内でAのMove()でさせている処理をいくつか省いています
279265:2010/04/05(月) 00:07:20
あ、上から8行目あたりの A:: はいりません・・・
280デフォルトの名無しさん:2010/04/05(月) 01:05:23
>>279
単に B::B( const A& a) : A(a) {}
があれば十分なんじゃねーの?
281デフォルトの名無しさん:2010/04/05(月) 01:15:37
B::B( const A& a){}
だけならただのコンストラクタってわかるんですが、後ろの「: A(a)」はどういう意味ですか?
282デフォルトの名無しさん:2010/04/05(月) 01:47:03
入門書を読みましょう
283281:2010/04/05(月) 02:05:19
すみません、コンストラクタ初期化子ってことはわかりました
参照型のaをBの基底であるAのコンストラクタに渡している・・・ということですよね

で、Aに
A::A( A& a )
{
m_time = a.time;
...
}

といった感じで値のコピーをするコンストラクタを実装する・・・
ということで合ってるでしょうか
284デフォルトの名無しさん:2010/04/05(月) 03:08:28
残念ですが違います。質問する前に入門書ぐらいは読んできてくださいね
285デフォルトの名無しさん:2010/04/05(月) 03:26:44
いけました(*´д`*)
286デフォルトの名無しさん:2010/04/05(月) 09:44:07
質問です。Windows限定(VC++限定?)かとは思いますが、

#pragma once

という一文についてなのですが、ググって調べた所、インクルードガードを1文で行える便利な物と解説があったのですが、
これの有効範囲というのは、「その一文が置かれたそれ以降」に適用になるのか、
それとも「それが書かれているファイルの内容全てが対象」になるのかどちらなのでしょうか。

確認しようと試しにテストコードを書いてみたのですが、あってもなくても違いがよくわからず、はっきりしないため悩んでいます。
よろしくお願いいたします。
287デフォルトの名無しさん:2010/04/05(月) 13:05:08
#pragma は処理系依存
288デフォルトの名無しさん:2010/04/05(月) 13:18:11
>>287
Windows限定(VC++限定?) と書いてあるのが見えないの?
馬鹿なの?死ぬの?
289デフォルトの名無しさん:2010/04/05(月) 17:16:37
>>286
今ちょっと確認できないけど、
#pragma onceをファイルの一番最後に書いてみるとかどうだろう。

「それ以降のみ有効」なら、
インクルードガードが無いときと同じリンカエラーが出るんじゃない?
290デフォルトの名無しさん:2010/04/05(月) 17:24:13
>>286
>これの有効範囲というのは、「その一文が置かれたそれ以降」に適用になるのか、

以降での適用です。
291デフォルトの名無しさん:2010/04/05(月) 20:07:20
hoge* a,b;

void minsyu(hoge* x)
{
hoge* manifesuto = new hoge();
x = manifesuto;
}

void main()
{
minsyu(a);
minsyu(b);
}

↑のプログラムを実行したところ、aとbに同じアドレスが入りました
スコープから外れたことでポインタ変数(manifesuto)が消されたのはわかるのですが、
このとき、ヒープ領域にはaとb2つ分のhogeサイズが確保されてるのでしょうか?
それとも、aはbに上書きされてるんでしょうか?
292デフォルトの名無しさん:2010/04/05(月) 20:14:50
void minsyu(hoge*& x)
{
hoge* manifesuto = new hoge();
x = manifesuto;
}
293デフォルトの名無しさん:2010/04/05(月) 20:16:41
>>291
1) hoge *a, *bじゃね?
2) 「ポインタ変数が消された」意味不明。
3) hoge *h = new hoge()した領域を削除するにはdelete hの呼び出しが必要。
4) minsyu(hoge **x)で*x = manifesuto;しなければもとのaにもbにも代入されない。
5) だから、「aはbに上書きされてる」なんてことは永遠に無い。

二回newされて、どこにもポイントされない領域が出来上がって、
それは削除されたりもしていないし、もとの変数aにもbにも何の値も代入されない。
294デフォルトの名無しさん:2010/04/05(月) 20:36:51
これで間違いなく動くな

class hoge {
int x;
};

hoge* a;
hoge* b;

void minsyu(hoge*& x)
{
hoge* manifesuto = new hoge();
x = manifesuto;
}

int main()
{
minsyu(a);
minsyu(b);

std::cout << "Address a = " << std::hex << std::showbase << reinterpret_cast<unsigned>(a) << std::endl;
std::cout << "Address b = " << reinterpret_cast<unsigned>(b) << std::endl;

delete b;
delete a;
}
295291:2010/04/05(月) 22:02:33
んー、長いので無理やり縮めたつもりが全然別物になってました。長いので2回に分けます

class aho {
int y;
};

class puyo {
public:
int x;
aho* m_aho;

puyo()
{
m_aho = new aho();
}
~puyo()
{
delete m_aho;
}
puyo puyo::operator=(const puyo& obj)
{
delete m_aho;
memmove( this, &obj, sizeof(puyo) );
aho* w_aho = new aho();
*w_aho = *m_aho;
m_aho = w_aho;
return *this;
}
};
296291:2010/04/05(月) 22:04:20
class hoge {
public:
puyo* m_puyo1;
puyo* m_puyo2;

hoge::hoge()
{
m_puyo1 = new puyo();
m_puyo2 = new puyo();
}
~hoge()
{
delete m_puyo1;
delete m_puyo2;
}
void minsyu()
{
puyo* manifesuto1 = new puyo();
puyo* manifesuto2 = new puyo();
*manifesuto1 = *m_puyo1;
*manifesuto2 = *m_puyo2;
m_puyo1 = manifesuto1;
m_puyo2 = manifesuto2;
}
};
297291:2010/04/05(月) 22:05:07
int main()
{
hoge* a = new hoge();

a->minsyu();

std::cout << "Address a = " << std::hex << std::showbase << reinterpret_cast<unsigned>(a->m_puyo1->m_aho) << std::endl;
std::cout << "Address b = " << reinterpret_cast<unsigned>(a->m_puyo2->m_aho) << std::endl;

delete a;
}

3回になってしまった・・・
これで、表示されるアドレスがいっしょになります
※実際に動かすとdeleteがうまくいかずエラーが出ます
298デフォルトの名無しさん:2010/04/05(月) 22:31:41
>>297
Error 00001. 0x310030 (Thread 0x0ACC):
Reference to freed resource:
delete(0x00BA79D0)

| reference_of_pointer2.cpp line 17:
| }
| ~puyo() {
|> delete m_aho;
| }
| puyo operator=(const puyo& obj) {
Call Tree:
0x00401E5B(=reference_of_pointer2.exe:0x01:000E5B) reference_of_pointer2.cpp#17
0x00401BF0(=reference_of_pointer2.exe:0x01:000BF0) reference_of_pointer2.cpp#39
0x004012BC(=reference_of_pointer2.exe:0x01:0002BC) reference_of_pointer2.cpp#61
0x32AD8D9E(=CC32100MT.DLL:0x01:0D7D9E)

以下省略
山ほどエラーが出るが、大要はフリーした領域に書きこみを行っているな
299デフォルトの名無しさん:2010/04/05(月) 22:35:31
>>297
void minsyu() {
puyo* manifesuto1 = new puyo();
puyo* manifesuto2 = new puyo();
*manifesuto1 = *m_puyo1;
*manifesuto2 = *m_puyo2;
m_puyo1 = manifesuto1;
m_puyo2 = manifesuto2;
}

これまずいやろ
交換してるんだと思うが、上書きしてしまっていてメモリリークが起きている
300デフォルトの名無しさん:2010/04/05(月) 22:42:45
これでメモリリークは無くなる
意図した動作かどうかは知らんが

class hoge {
public:
puyo* m_puyo1;
puyo* m_puyo2;

hoge() {
m_puyo1 = new puyo();
m_puyo2 = new puyo();
}
~hoge() {
delete m_puyo1;
delete m_puyo2;
}
void minsyu() {
puyo* manifesuto1 = new puyo();
puyo* manifesuto2 = new puyo();
puyo* t1;
puyo* t2;
t1 = m_puyo1;
t2 = m_puyo2;
m_puyo1 = manifesuto1;
m_puyo2 = manifesuto2;
manifesuto1 = t1;
manifesuto2 = t2;
delete manifesuto2;
delete manifesuto1;
}
};
301291:2010/04/05(月) 22:57:53
puyo::operator=(const puyo& obj) の中でdeleteしてから memmove() してるのがダメなのか...

aho* delaho = m_aho;
delete delaho;
memmove( this, &obj, sizeof(puyo) );

一般的なポインタ重複防止策は知らないけど、これで解決...?
>>300 指摘感謝
302デフォルトの名無しさん:2010/04/05(月) 23:00:14
意味不明だから、先ずはクラス使わないで作れよ。
303デフォルトの名無しさん:2010/04/05(月) 23:05:20
>>301
いやそれは関係無い
deleteしないとメモリリークするでしょ
304デフォルトの名無しさん:2010/04/05(月) 23:32:54
>>291
クラス使うの初めてなんだろ?
俺コーディングする前に定石を覚えろ。
305デフォルトの名無しさん:2010/04/05(月) 23:35:26
まずthisに上書きとか乱暴なテクニックは最後に覚えろ
最初はちまちまいじくってた方がいい
306デフォルトの名無しさん:2010/04/06(火) 00:33:01
307デフォルトの名無しさん:2010/04/06(火) 02:57:00
the file だね
308デフォルトの名無しさん:2010/04/07(水) 23:47:43
ソースやヘッダをディレクトリの中に入れて整理しているのですが
インクルード時に
#include "Uon/Sanukiudon.h"
とすると見つかりませんエラーが出て

#include "Sanukiudon.h"
にしたらちゃんと見つけてくれました。
(実際にはディレクトリの中に格納されてるのも関わらず)

これは一体全体どういうことでしょうか?
309デフォルトの名無しさん:2010/04/07(水) 23:51:32
>>308
確認。

> (実際にはディレクトリの中に格納されてるのも関わらず)
#include "Sanukiudon.h"としたソースファイル.cppの存在するフォルダと
"Sanukiudon.h"が同じフォルダにあるの?
それともそうでないの?
310デフォルトの名無しさん:2010/04/08(木) 00:28:06
>>309
両方なんです
例えばルートのmainからディレクトリの中に入れてるファイルをインクルードするときも
ディレクトリの中から同じディレクトリ内のファイルをインクルードするときもどちらも 
ディレクトリを取ったパスを書かないと駄目な感じです

参考書にはcppの位置に関わらずヘッダの位置をフルパス(プロジェクトのルートディレクトリ
から見て)書いとけって書いているので真似をしようとしたのですが
311デフォルトの名無しさん:2010/04/08(木) 00:35:52
https://developer.mozilla.org/ja/C___Portability_Guide#.23include_.e6.96.87.e3.81.ab.e3.81.af.e5.8d.98.e7.b4.94.e3.81.ab.e3.83.95.e3.82.a1.e3.82.a4.e3.83.ab.e5.90.8d.e3.81.ae.e3.81.bf.e8.a8.98.e8.bf.b0.e3.81.99.e3.82.8b

なんの理由があってその本はそれを推奨しているんだ?
どうせ書いてないだろうが
312デフォルトの名無しさん:2010/04/08(木) 01:01:03
class Test
{
 template<int T>
 int func( int val ){ return val; }

 template<>
 int func<2>( int val ){ return 2 * val; }
};

をコンパイルしようとすると以下のようなエラーが出てしまいます。
test0.cpp:11: error: template-id ‘func<2>’ in declaration of primary template
test0.cpp:11: error: ‘template<int T> int Test::func(int)’ cannot be overloaded

これは文法的に間違っているのでしょうか?
gcc version 4.4.1 です。
313デフォルトの名無しさん:2010/04/08(木) 01:05:13
>>311
参考書には「プロジェクト内に同じ名前のファイルがある場合の為にフルパスに
しておいた方が間違いが起きにくい」と書いてます
実際サンプルもディレクトリ違いで同じファイル名の別のものがあります。

でもこの参考書のWEBサイトによるとこれはVC2005用なのでVC2008では
異ディレクトリでも同一ファイル名は使えないのでファイル名を変更しなさいと
書いてありましたので…2005では意味があったけど2008では意味が無い
ということになりますね…あれ?
314デフォルトの名無しさん:2010/04/08(木) 08:13:32
>>248
ありがとうございます
315デフォルトの名無しさん:2010/04/08(木) 10:02:20
>>308
>#include "Uon/Sanukiudon.h"
>とすると見つかりませんエラーが出て

Uon → Udon にすればいんじゃね?
316デフォルトの名無しさん:2010/04/08(木) 11:25:00
>>313
ディレクトリ構成を改めて書いてくれ。言いたいことがよく判らんぞ。
例えば、
<project home>/Udon/Sanuki.h
<project home>/Udon/Sanuki.cpp
<project home>/main.cpp
こういう構成ならmain.cppからなら
#include "Udon/Sanuki.h"
で、Sanuki.cppからは
#include "Sanuki.h"
でインクルードできる。
<project home>がディレクトリサーチパスに指定されているのなら、Sanuki.cppからも
#include "Udon/Sanuki.h"
でいい。
<project home>/Udonがディレクトリサーチパスに指定されているのなら、どちらからも
#include "Sanuki.h"でいい。
317デフォルトの名無しさん:2010/04/08(木) 11:40:15
>>312
理由は兎も角、特殊化版を外に出せばコンパイルできると思う。
template<>int Test::func<2>(int val) {return 2 * val;}
318313:2010/04/08(木) 13:01:35
>>315
ありがとうございます、解決しました。
319デフォルトの名無しさん:2010/04/08(木) 13:12:09
        ∧∧
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄
320デフォルトの名無しさん:2010/04/08(木) 13:17:48
ワロタw
321デフォルトの名無しさん:2010/04/08(木) 13:18:13
>>317
で、元の書き方は文法的に正しくないということですか?
322デフォルトの名無しさん:2010/04/08(木) 13:22:09
>>321
ダメ
323デフォルトの名無しさん:2010/04/08(木) 19:39:19
ところで>313の
>異ディレクトリでも同一ファイル名は使えないのでファイル名を変更しなさい
ってマジ?
324デフォルトの名無しさん:2010/04/08(木) 19:52:27
>>323
本の間違いか、>313の勘違いだろ。
325デフォルトの名無しさん:2010/04/08(木) 22:02:34
ム板のどっかでも同じことを見たな
まあその本の著者の勘違いが原本だろう
326デフォルトの名無しさん:2010/04/09(金) 00:35:11
C++ってjavaみたいに
親クラス型のポインタに子クラスを入れたとして、そこから子クラス固有のメンバ関数呼べない?
327デフォルトの名無しさん:2010/04/09(金) 00:40:05
Javaにポインタってあるの?
328デフォルトの名無しさん:2010/04/09(金) 02:12:01
>>323
これなんだけど
http://www.shuwasystem.co.jp/support/7980html/2118.html#4
どうでしょうか
329デフォルトの名無しさん:2010/04/09(金) 02:21:18
>>326
dynamic_cast
330デフォルトの名無しさん:2010/04/09(金) 08:47:40
>>326
Javaでもそれ、キャストしないと呼べないんじゃ
331デフォルトの名無しさん:2010/04/09(金) 09:12:42
以下のプログラムを 「-Wall -O2」 オプションを付けてコンパイルすると
 test3.cpp:17: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
 test3.cpp:17: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
 /usr/include/c++/4.4/bits/stl_tree.h:175: note: initialized from here
のようなwarningが出ます。
「-Wall」「-O2」どちらかだけでは出ません。
また、「-Wall -O1」では出ず、「-Wall -O3」では出ます。
これはどういう意味のwarningなのでしょうか?

================================================

// a、bは0~9の値をとるとする
class Hoge
{
 public:
  double a, b;

  Hoge( double a, double b ) : a(a), b(b) { }

  bool operator<( const Hoge& rhs ) const{
   const double l_val = a*10 + b;
   const double r_val = rhs.a*10 + rhs.b; // <- 17行目
   return ( l_val < r_val );
  }
};

int main(int argc, char* argv[])
{
 map<Hoge,int> mmm;
 mmm[ Hoge(0,0) ] = 0;
}
332デフォルトの名無しさん:2010/04/09(金) 09:26:47
壁にぶつかったみたいだな。       Wall だけに。とかいって
333デフォルトの名無しさん:2010/04/09(金) 17:39:54
【審議中】
             ??
             (∵)  
(∵ )  ( )
        (∵)         ( ∵)
    (TT)       (∵) 

              (∵)y-~

  (∵)♪    (∵)…
334デフォルトの名無しさん:2010/04/09(金) 18:20:13
>>331
g++ 4.1.2 で -O2 -Wall そのコードを試してみたけど、警告は出なかったよ。
335デフォルトの名無しさん:2010/04/09(金) 18:48:58
g++ 4.4.1で出たけど出る理由は分からない
336デフォルトの名無しさん:2010/04/09(金) 19:47:05
BUGじゃね
337331:2010/04/09(金) 21:06:29
書き忘れました。
g++ 4.4.1 です。

全く考えもしませんでしたが、>>334>>335さんの結果を見ると
>>336さんの通りバグなんですかね…
338デフォルトの名無しさん:2010/04/09(金) 21:14:13
mapに関数オブジェクト渡して見れば?
339デフォルトの名無しさん:2010/04/09(金) 21:22:40
VC9でもエラー出ないしな
340デフォルトの名無しさん:2010/04/09(金) 22:20:50
おまえら最適化に失敗したって警告に何馬鹿言ってんだ。
英語の翻訳の仕方くらい勉強しとけよ。
341デフォルトの名無しさん:2010/04/09(金) 22:30:27
>>340
お前が一番わかってない
そんな内容のメッセージなんか出ちゃいない
type punningでぐぐれ馬鹿
342デフォルトの名無しさん:2010/04/09(金) 23:44:33
0が数字 or NULLか判断するポイントを教えてください
343デフォルトの名無しさん:2010/04/09(金) 23:55:17
_
344デフォルトの名無しさん:2010/04/10(土) 00:20:35
第一引数の文字列の中から第ニ引数の文字を検索して、一番後ろにあるものの位置を返す
char* strrchr( const char *s, int c )関数の第二引数は文字列が
変数だった場合どのようにすれば正しい結果が得られるのでしょうか。
345デフォルトの名無しさん:2010/04/10(土) 00:31:02
>>344
2行目と3行目の日本語がよく分からん。
346デフォルトの名無しさん:2010/04/10(土) 00:40:21
第二引数を文字じゃなくて文字列にして、一番後ろにある文字列の先頭アドレスを返したいとか?
347344:2010/04/10(土) 00:46:26
以下がんばって翻訳
自分が調べたものは
int c='C';
strrchr(str,c);
のように検索したい言葉が文字リテラルの場合しか出てきませんでした。
ですが、検索したい言葉が
char str2="あいう";
のように変数で指定できるようにしたかった場合、第二引数はどうすればよいでしょうか。
348デフォルトの名無しさん:2010/04/10(土) 00:58:20
strstr使えば?
349デフォルトの名無しさん:2010/04/10(土) 00:59:15
strstrって多バイト文字に対応してるの?
350344:2010/04/10(土) 01:04:17
どうしても後ろから調べたい理由がありまして。
GetOpenFileNameで取得したファイルパスからファイル名を除くようにしたいもので。
もっといい方法あったら教えて下さい。
(最初からこう書けばよかった('A`))
351デフォルトの名無しさん:2010/04/10(土) 01:06:50
stringにしてrfind
352デフォルトの名無しさん:2010/04/10(土) 01:07:33
strsokで一回バラバラにしてまた再結合すればいいじゃん
353デフォルトの名無しさん:2010/04/10(土) 02:23:03
strrchr()で \\ を探して \0 を書けばいいだけでは?
354デフォルトの名無しさん:2010/04/10(土) 04:07:08
>>350
SHLWAPIのPathRemoveFileSpec使う。
あるいは、boost::filesystem::pathにて、parent_path()してexternal_directory_string()するなど。
355デフォルトの名無しさん:2010/04/10(土) 07:30:39
>>354
こういう環境依存のレスする奴ってバカなの?死ぬの?
356デフォルトの名無しさん:2010/04/10(土) 08:23:21
Boost.FileSystemはPOSIX/Windosで動くから大概の環境で大丈夫だろう。
そもそも元の質問自体が環境依存な件。
357デフォルトの名無しさん:2010/04/10(土) 09:07:25
unixとWindowsしか知らないカエルごときが偉そうに回答してるわけね、納得
358デフォルトの名無しさん:2010/04/10(土) 09:29:18
>>357
あ?他になにがあるっつーんだ
まさかLinuxとか答えたりしないだろうなハゲ
359デフォルトの名無しさん:2010/04/10(土) 09:40:49
ホントに知らないんだwゴメンゴメン、カエルちゃん。
360デフォルトの名無しさん:2010/04/10(土) 11:18:23
>>359
おい逃げるな
他に何があるか答えてみろカス
361デフォルトの名無しさん:2010/04/10(土) 11:22:19
swodniW
362デフォルトの名無しさん:2010/04/10(土) 11:26:08
死ね
363デフォルトの名無しさん:2010/04/10(土) 11:46:27
VB
+ GetParentFolderName
に相当するVCで使えるAPI知りませんか。
364デフォルトの名無しさん:2010/04/10(土) 11:49:43
>>360
せっかく井戸の中に居るんだから無理して出ないほうがいいよー(ワラ
365デフォルトの名無しさん:2010/04/10(土) 11:57:15
こんなくだらん関数くらい作れないでプログラマかよ、泣けてくるぜ。

static void getparentpath(char* parent, const char* fullpath)
{
strcpy(parent, fullpath);
char* ptr = strrchr(fullpath, '/');
if (ptr != NULL) {
*ptr = '\0';
}
}
366デフォルトの名無しさん:2010/04/10(土) 11:58:43
あ、まちがえたw

static void getparentpath(char* parent, const char* fullpath)
{
strcpy(parent, fullpath);
char* ptr = strrchr(parent, '/');
if (ptr != NULL) {
*ptr = '\0';
}
}
367デフォルトの名無しさん:2010/04/10(土) 12:26:56
このスレ見てたらバカが居たから横槍を入れてみたくなった。

>>357>>359
おい 良いからさっさと答えてみろよ
POSIX/Windows API環境以外で君が知っている環境を答えてごらんよ?
368デフォルトの名無しさん:2010/04/10(土) 12:36:43
なんという頭の悪い自演
369デフォルトの名無しさん:2010/04/10(土) 13:15:54
370デフォルトの名無しさん:2010/04/10(土) 13:21:34
>>363
_tsplitpath
371デフォルトの名無しさん:2010/04/10(土) 13:41:52
>>368
言うと思った。でもまあ関係ない


さっさと答えろよ
372デフォルトの名無しさん:2010/04/10(土) 13:46:13
平和ですなぁ
373デフォルトの名無しさん:2010/04/10(土) 13:49:32
やっぱりIPアドレスを表示させないと
自演か自演じゃないか決着付かないのがやだな。

まあどうせ串通してきたりするだろうけど。
374デフォルトの名無しさん:2010/04/10(土) 13:53:36
>>373
そこまで自意識過剰なのは、もう病気というべきか。
375デフォルトの名無しさん:2010/04/10(土) 13:56:55
unixかwindows以外でCを使う環境?そんなん無数にあるじゃんw
376デフォルトの名無しさん:2010/04/10(土) 14:07:19
>>350でGetOpenFileNameって言ってんのに、環境依存がどうとかバカじゃね?
377デフォルトの名無しさん:2010/04/10(土) 14:17:39
よっぽど悔しかったんだね〜
378371:2010/04/10(土) 14:33:38
>>375
誰もそんなこと言ってない。
良いから早く答えろ。


>>376-377
お前ら同一人物かどうか知らんが
同一だろうがバカの集合だろうが関係ない

誰か答えて見せろよw
379デフォルトの名無しさん:2010/04/10(土) 14:37:04
376はどっちかって言えば371側だろw
380371:2010/04/10(土) 14:43:48
良くレスを読んでなかった。
もしそうならゴメン>>376

でもまあとにかく他のヤツは良いから
俺は
>>357
に答えて欲しいんだ。
POSIX/WindowsでBoost.FileSystemが動かない環境は?

>>375
> unixかwindows以外でCを使う環境?そんなん無数にあるじゃんw
Boost.FileSystemはC++のライブラリなんだけど。無知を晒すなw
381デフォルトの名無しさん:2010/04/10(土) 14:47:41
なんか意味がどんどんずれてきてるような
382デフォルトの名無しさん:2010/04/10(土) 14:50:50
boostってインストールしないと動かないんじゃなかったっけ
それだとレンタルサーバみたいな自分でインストールできない環境だと動かないんじゃね?
383デフォルトの名無しさん:2010/04/10(土) 15:08:42
まあ落ち着け。
>>356ってさあ、
>Boost.FileSystemはPOSIX/Windosで動くから大概の環境で大丈夫
って言ってるけど、
それを否定してる>>357って別に
「POSIX/WindowsでもBoost.FileSystemが動かない環境はある」
と言ってるとは限らないのでは。
「POSIX/Windows以外にもC++の環境はあるからBoostの例はよくない」
という可能性もあるわけで。
384デフォルトの名無しさん:2010/04/10(土) 15:16:42
357はただの低脳煽りだろw
まともに相手する価値なんてねーよ
385356:2010/04/10(土) 15:36:52
>Windos
今さらながらtypoしてた。恥ずかしい。

というか、ファイルパスとかディレクトリという概念自体が環境依存だよね。
デリミタだって'\', '/', ':' いろいろあるし、ダメ文字の問題もあるし。
386デフォルトの名無しさん:2010/04/10(土) 15:41:27
もうどうでもいいよ
お前ら全員あぼんしたいから安価しろ!
387デフォルトの名無しさん:2010/04/10(土) 17:41:03
ム板の民度の低さは異常
まともな大人が10割もいない
388デフォルトの名無しさん:2010/04/10(土) 17:47:13
>>387
ネタ?wwwネタだよなwww

まともな大人が10割居るコミュニティなんてこの世に存在しないだろ
389デフォルトの名無しさん:2010/04/10(土) 17:57:24
>>387
90割は厨房だしな
390デフォルトの名無しさん:2010/04/10(土) 18:00:52
0.721割は紳士タイム。
391デフォルトの名無しさん:2010/04/10(土) 18:07:39
>>389
900%はやばいな
392デフォルトの名無しさん:2010/04/10(土) 18:10:01
割合と小数点数表記を混ぜたらダメだと思うんだ
393デフォルトの名無しさん:2010/04/10(土) 18:10:59
>>387
> まともな大人が10割もいない
これは恥ずかしいwwwww
こんな自己言及的な無知レスは久々に見たぜw
394デフォルトの名無しさん:2010/04/10(土) 18:14:13
"10割もいない"でググったら一件しかかからなかった
これは新しいネタだな覚えておこうw
395デフォルトの名無しさん:2010/04/10(土) 18:14:57
>>394
一件居たのかw
396デフォルトの名無しさん:2010/04/10(土) 18:15:58
>>387に聞いてみたい、
自分のレスのどこがおかしかったかって分かってる?

397デフォルトの名無しさん:2010/04/10(土) 18:18:39
今のVIPにもこんな元気な反応欲しいよな
398デフォルトの名無しさん:2010/04/10(土) 18:40:24
2割もいない=20%以下だ(だがおおよそ20%は居る)

10割もいない=100%以下だ(だがおおよそ100%は居る)

まともな人間が10割もいない=ほとんどまともだけど、一部まともじゃない人がいる

なんだ正しいじゃないか
399デフォルトの名無しさん:2010/04/10(土) 18:49:01
何十割とか口が付く名字とかVIPPERの定番ネタ
てかスレチだから帰れ
400デフォルトの名無しさん:2010/04/10(土) 19:44:08
俺はちなみに賢者タイム
401デフォルトの名無しさん:2010/04/10(土) 22:44:53
>>400
そんなん聞きたくねぇよw
402デフォルトの名無しさん:2010/04/10(土) 22:45:42
>>399
 20割もいない
とかだったらまだ分かるけど、
 10割もいない
は素でやっちまったんだろうな。
403デフォルトの名無しさん:2010/04/11(日) 03:32:30
漠然とした質問でアレなのでつが
多数のファイル(クラス)に別れたプログラムを効率的に目で追っていくワザってありますか?
極端に言うファイルごとに全てのコードをプリントアウトして見比べると分りやすいのですが
コストがかかるので、エディター上でラクに確認できればと。。。
404デフォルトの名無しさん:2010/04/11(日) 07:39:30
ソースを目で追って、それで何がしたいのか??
例えば、関数のcall/retrun をみる。
405デフォルトの名無しさん:2010/04/11(日) 10:16:25
>>403
VisualStudioなら、変数やらメソッドやらを右クリックして、
宣言に移動とか、すべての参照を検索やらって機能があるんで
それが便利。
eclipse+Javaでも同様の機能が使えたんで、eclipse+C++とか
NetBeans+C++の組み合わせでも同様の機能があるかもしれない。
406デフォルトの名無しさん:2010/04/11(日) 10:53:05
IDE信者が鬱陶しいな
IDE無いと何も出来ないんじゃねえのか
407デフォルトの名無しさん:2010/04/11(日) 11:13:21
全自動洗濯機信者が鬱陶しいな
全自動洗濯機無いと何も出来ないんじゃねえのか

パソコン信者が鬱陶しいな
パソコン無いと何も出来ないんじゃねえのか
408デフォルトの名無しさん:2010/04/11(日) 11:14:22
なんでも信者扱いとか、そんな極端な視点しか持てない脳だと
まともなロジックなんか組めないぞ♪
409デフォルトの名無しさん:2010/04/11(日) 11:16:00
ide使いこなせなくて悔しいのはわかったよ
410デフォルトの名無しさん:2010/04/11(日) 11:17:57
図星を突かれたらしいな、すごいファビョり方だw
411デフォルトの名無しさん:2010/04/11(日) 11:19:35
○○が無いと何もできない、というのは○○に対しての評価であったりする。

PerlやRubyでやれば簡単なことを、Cでやってる人がいて、
「PerlやRubyが無いと何もできないんじゃねえのか」と言っても空しいだけ。
マッチやライター持ってる人に原始人がケチつけても空しいだけ。
412デフォルトの名無しさん:2010/04/11(日) 11:21:37
クソ重いIDEなんぞ有難がって使うものじゃない、他に選択肢が無い時に嫌々使うものだ。
あんなもの有難がるのは駆け出しの素人だけだろ。
413デフォルトの名無しさん:2010/04/11(日) 11:23:41
emacs暦13年だがそれはそれ。
IDEはIDE。便利なものを、便利に使える時に使う。
414デフォルトの名無しさん:2010/04/11(日) 11:36:24
>>412
いいから働けよ。Helloworld ばっかり書いててもご飯食べられないんだぞ?
415デフォルトの名無しさん:2010/04/11(日) 11:37:53
>>414 つまり Hello World をやめてハロワに行けって事ですね
416デフォルトの名無しさん:2010/04/11(日) 11:42:04
IDEは便利だけど、開発速度で見たらエディタが良いので、
エディタで済ませられる時はエディタで済ますようにして効率向上を図ってるなあ。
417デフォルトの名無しさん:2010/04/11(日) 11:48:42
>>416 実際、その時都合が良い方で書けばいいだけだもんな
どっちかしかダメとか、どっちかしか使えないとか、そういう事じゃないもんな
418デフォルトの名無しさん:2010/04/11(日) 11:50:56
>>406
ideじゃなくても、タグジャンプ機能くらいあるだろ?
そういうのも使わんの?
419デフォルトの名無しさん:2010/04/11(日) 11:52:43
IDEじゃなくて素のエディタを使ったほうが開発早いってのが分からない。
各種機能がシームレスにつながってるIDEのほうが効率いいだろ。
420デフォルトの名無しさん:2010/04/11(日) 11:54:47
>>419
おまえがそういう開発環境しか知らないだけだってのに
421デフォルトの名無しさん:2010/04/11(日) 11:58:37
>>419
伝統的に IDE を使わないスタイルが主流な
プラットフォームとか、
高々数百行程度のコードしか書かない人とか、
色々なケースがあるだろ
422デフォルトの名無しさん:2010/04/11(日) 12:03:28
>>420
IDEより効率いい環境あるよって言っても、
具体的にどういう環境かかけないんだろ?
どうせ2chだし。
423デフォルトの名無しさん:2010/04/11(日) 12:05:25
>>419>>422
こういう井の中の蛙でも口は付いてるからな、一丁前な減らず口を叩くのが鬱陶しい。
おまえの狭い世界で何がわかるんだと。

IDEが要らない開発環境なんかいくらもある。組み込み機もそうだし、UNIX上でsocketサーバを作る時もそうだ。
phpとかのwebアプリケーションだってIDEなしで作る人もいるだろうに。
424デフォルトの名無しさん:2010/04/11(日) 12:09:09
>>423
それって、IDEが使えない仕事ならIDEが効率よくないって当たり前の話だよね。
やっぱIDEが使える環境なら、IDEが効率高いと。
425デフォルトの名無しさん:2010/04/11(日) 12:13:06
>>424
前者は正しいが後者は正しくない
426デフォルトの名無しさん:2010/04/11(日) 12:16:24
>>425
で、相変わらず、IDEより効率いいって環境の具体的な名前はでてこないと。
427デフォルトの名無しさん:2010/04/11(日) 12:20:27
>>426
意味不明。
散々説明しただろうに。
それとも、プロジェクト名だか何だかを引き出そうとでもしてるのか?NDAって知ってるか?
428デフォルトの名無しさん:2010/04/11(日) 12:38:15
>>427
散々っていうか、説明っぽいのって、>>423だけじゃん。
それも、IDEが使えない仕事もあるよってだけで。

上のほうを見ると、IDEが使えてもより効率のいい環境があるような
ことを言ってる人がいるじゃん。

機密事項で、名前もだせないような特殊なツールでも使って
環境を構築してるのかね。
そういうのは一般論で語らないでほしいよ。

まあ、屁理屈こねて逃げまわってるのは明らかなんで、IDEより
効率のいい環境ってのは、IDEを使えない人の妄想ってことで決着ですね。
あとは具体的な話がでてくるまで一切相手をしないので、そういうことで。
429デフォルトの名無しさん:2010/04/11(日) 12:44:01
>機密事項で、名前もだせないような特殊なツールでも使って
だからお前はツールがないと何一つ作れないのかとww
makeとエディタとgrepとsedかawkあたり、pythonでもいいが、
その辺があればツールなんて自分で作れるだろ。

IDEがあってもなくても作れるものは、例えばWindowsのコンソールアプリケーションなんかがそうだが、
こういうのはコマンドラインのほうが効率いいんじゃないのか?
IDEを使うときっていうのは大抵、それがないと作れない=嫌々使う時だよ。
言いたかったのはそんなことじゃない、IDE様様っていってる奴はIDE無い時にモノ作れるのか?ってことだ。
世の中IDEが無い環境はいくらもあるんだからな。
430デフォルトの名無しさん:2010/04/11(日) 12:54:03
>>429
ええ、ツールって、makeとかgrepとかスクリプト言語のことだったのか。
まじめに相手して損した。
431デフォルトの名無しさん:2010/04/11(日) 12:55:43
捨て台詞で勝ち誇られても意味わからんだけだぞ
432デフォルトの名無しさん:2010/04/11(日) 12:57:05
俺はvc++使ってるんだけどこれぐらいインテリセンスがうまく働く普通のエディタって有るの?
これがあれば俺もエディタでいいかなって思うんだけど、いままで使ったのは中途半端な感じ
433デフォルトの名無しさん:2010/04/11(日) 13:00:42
>>429
> こういうのはコマンドラインのほうが効率いいんじゃないのか?

やっぱIDEのほうが効率いいでしょ。
コマンドラインになったらIDEの機能が使えなくなるわけじゃないし。
434デフォルトの名無しさん:2010/04/11(日) 13:02:33
>>431
makeやらgrepで効率いいって言ってる人って、IDE使ったことの無い人でしょ。
435デフォルトの名無しさん:2010/04/11(日) 13:03:52
IDE以外と言いながら各種ツールで構築したIDEもどき持ってこられても微妙
436デフォルトの名無しさん:2010/04/11(日) 13:10:38
>>434
makeやgrepがツールだとは書いてない。(ツールだけどな)

>makeとエディタとgrepとsedかawkあたり、pythonでもいいが、
>その辺があればツールなんて自分で作れるだろ。

自分で作れる、と書いたんだ。
案件ごとにコンバータやら何やらの要件は変わってくる。それらを拾い上げるのには
各種ツールを組み合わせて自前の変換ツールを作るんだよ。
437デフォルトの名無しさん:2010/04/11(日) 13:43:50
このスレは本当にくだらない事でもめるよな。
レベルがそんな程度なんだろうな。
438デフォルトの名無しさん:2010/04/11(日) 14:22:52
>>436
それだったらIDEでも作ればいいんじゃね?
逆にIDEの各種機能やら、それがシームレスにつながってるような環境を
非IDEで作るのは難しいだろ。
(このまえrubyでインテリセンスできるツール作ったとかって記事は見たけど)
439デフォルトの名無しさん:2010/04/11(日) 14:42:14
>>405
ありがとうございます!!
VisualStudioでしたが、こんな機能があるとゎ!
これでダイブ楽になりそうですぅ
440デフォルトの名無しさん:2010/04/11(日) 18:46:02
>>432
多分ない。
スマートポインタなんかのアロー演算子の解決とか、
コンパイラが統合されているからこそできることだと思うし。
441デフォルトの名無しさん:2010/04/11(日) 21:32:08
C++は勉強してるんだけど、他にC++とあわせて勉強したら得する言語って有る?
442デフォルトの名無しさん:2010/04/11(日) 21:37:40
>>441
穏健なところでは JAVA, でもそれよりは
http://www.amazon.co.jp/dp/4894714221/
なんかが面白い。また、STL やその根本技術である template を把握するまでは C++ 一本で精進すればいいかと
443デフォルトの名無しさん:2010/04/11(日) 22:00:36
>>442
その本クソミソに言われてるが、なんで勧めるの?
>>441
JavaよりもC#だな。でも、442のいうとおりtemplateやSTLを一通り理解してからでも良いと思う。
444デフォルトの名無しさん:2010/04/11(日) 22:09:06
>>441
JavaやC#でもいいが、
「C++に挫折しないでちゃんと使いこなせる様になった場合」
どうせこれらの言語を学んでもあんま意味無い気がする。

それよかP言語系(Perl, Python, PHP, Ruby)を学んでおくと、
 日頃の作業のお手伝い・自動化系=>P言語系
 お手軽開発=>P言語系
 ガチ開発=>C++
としっかり棲み分けできて良いと思う。
ちなみに俺はPython使い。
445デフォルトの名無しさん:2010/04/12(月) 01:01:04
以下のプログラムを、2進数で出力するにはどうしたらいいでしょうか?
進数変換のプログラムは書いたことがあるのですが、ポインタの扱い方がよく分かりません。
よろしくお願いします。

#include <stdio.h>

int main(){
double x = 123;
unsigned char *p = (unsigned char *)&x+7;

for(;p>=(unsigned char *)&x;p--)
printf("%x ",*p);
printf("\n");

return 0;
}
446デフォルトの名無しさん:2010/04/12(月) 01:19:42
#include <stdio.h>

int main(){
double x = 123;
unsigned char *p = (unsigned char *)&x+7;
int i;

for(;p>=(unsigned char *)&x;p--)
for(i=7; i>=0; i--) printf("%d", ((*p) >> i) & 1);
printf("\n");

return 0;
}

447デフォルトの名無しさん:2010/04/12(月) 03:41:58
私の知能知識不足で申し訳ありません。質問させていただきます。
下のように入力した文字(Y/N)によって分岐して、 Yなら1を返して終了、Nなら0を返してYが入力されるまで入力を繰り返す、 それ以外は2を返してYが入力されるまで繰り返すというものですが、
Yを入力したときは正常に動作するのですが、 Nやそれ以外のときはgetcharの部分がスキップされてしまうのか正常に表示されません。
continueの使い方が間違っているのかもしれません。 どなたかアドバイスいただければ幸いです。

#include<stdio.h>
int check(void);
int main(void)
{
int end;
while(1){
end = check();
printf("%d\n", end);
if(end == 1)
break;
else
continue;
}
printf("終了\n");
return(0);
}
int check(void)
{
char yn;
yn = getchar();
if(yn == 'Y')
return(1);
else if(yn == 'N')
return(0);
else
return(2);
}
448デフォルトの名無しさん:2010/04/12(月) 03:46:15
getchar()で改行文字読んでるだけだろ
449デフォルトの名無しさん:2010/04/12(月) 12:07:03
>>448
返信ありがとうございます。改行文字ですか・・・
どこの改行でしょうか?またどのような改善策が考えられますでしょうか?
知識不足ですみません。返信お願いいたします。
450デフォルトの名無しさん:2010/04/12(月) 12:11:27
>>447
エスパー回答だが'n'を入力しているとか?
451デフォルトの名無しさん:2010/04/12(月) 12:22:47
>>447
getchar()は一文字入力の関数だが、端末は1行単位で入力して使う。
このため、YやNを一文字打っても入力できず、改行キーも打っていることと思う。
この時、改行文字も入力されてしまうので、次のgetchar()の呼び出しで改行文字が得られてしまう。
従って、getchar()だけでやるなら改行文字はスキップしないといけない。
452デフォルトの名無しさん:2010/04/12(月) 13:31:21
yn = getchar();
while(getchar()!='\n');
453デフォルトの名無しさん:2010/04/12(月) 19:22:08
Ubuntu9.1のgcc 4.3です。
リンク時に new オペレーターが定義されてない、とか言うエラーを出すんですが・・・
グーグルで「gcc リンクエラー」で検索しても「ライブラリの順序を〜」とかしか見つかりません。
ファイルひとつだけなのでライブラリの順序は関係ないとおもうんです。

同じファイルをVisual C++ Expressではコンパイルできましたしちゃんと動きました。
454デフォルトの名無しさん:2010/04/12(月) 19:26:12
>>453
gcc foo.c などと実行せず、g++ foo.c などと実行してみてください。
455デフォルトの名無しさん:2010/04/12(月) 19:54:39
gcc はC++じゃなくて Cのコンパイラだったよな確かw
new とかあるわけ無い
456デフォルトの名無しさん:2010/04/12(月) 20:02:31
そうでもない。拡張子が.cppならc++と判断してくれるし、一定の条件を満たせばランタイムもリンクしてくれる。
457デフォルトの名無しさん:2010/04/12(月) 20:05:55
>>455
昔はそうだったが今はgnu compiler collectionの略で何でもコンパイルするようになったとか何とか聞いた記憶がある
458デフォルトの名無しさん:2010/04/12(月) 20:52:36
>>456
大文字のCと小文字のcではなかったか?
459447:2010/04/12(月) 21:11:42
getcharについて質問させていただいたものです。
みなさんアドバイスありがとうございます。不具合が起こる理由はわかったのですが、
どこをどのように訂正すればいいのかわかりませんでした。
改行文字のスキップとはこのプログラムの場合どのように行えば適切でしょうか?
460デフォルトの名無しさん:2010/04/12(月) 23:13:33
461(u_・y) ◆e6.oHu1j.o :2010/04/13(火) 00:21:57
なんか誘導されたから何か質問して去っていく

STL使うと容量が物凄い増えるんだけど
少しは増えないようにしよう! みたいな流れはないの?
462447:2010/04/13(火) 00:35:56
>>460
やってみました!大丈夫でした。これだけでいいんでしたか・・・
463デフォルトの名無しさん:2010/04/13(火) 06:51:00
>>461
つエネルギー保存則
STLは容量を犠牲にして書きやすさ、使いやすさを追求しているから不可能
容量を小さくしたいなら自前で全部やるしかない
464デフォルトの名無しさん:2010/04/13(火) 07:01:08
>>463
> エネルギー保存則
物理 何点だよ。
465(u_・y) ◆e6.oHu1j.o :2010/04/13(火) 08:24:15
不思議なんだけど
C++STLで出来て、C#のジェネリックで出来ない事って何かあるの?
C#のほうは全然容量増えないじゃん
466デフォルトの名無しさん:2010/04/13(火) 09:15:03
>>464
おまえの頭にはプリミティブな要素しかないのか?
人生、比喩とか応用とか出来ないと余計な苦労が増えるぞ。
467デフォルトの名無しさん:2010/04/13(火) 09:16:27
ネイティブコンパイラのC++とLL言語のC#を比較するのは無意味
468デフォルトの名無しさん:2010/04/13(火) 09:19:34
>>467
言語は言語、コンパイラと実行環境は別。
469デフォルトの名無しさん:2010/04/13(火) 09:24:08
>>468
それ、意味わかって書いてるか?
C系列でSTLのような高速かつ型依存しないコードを実装するには
コンパイル前にコードを型別に展開しなければ不可能。ゆえにコードサイズは膨れ上がる。
LL言語ならそういう縛りが無いから何でもできる。実行時に動的に型に合わせたコードを実行するとかな。
その代わり実行速度は落ちる。
470デフォルトの名無しさん:2010/04/13(火) 09:40:44
>>468
初心者は引っ込んでろ
471デフォルトの名無しさん:2010/04/13(火) 09:51:09
STL使いたい組み込み屋とか居ないのか?
472デフォルトの名無しさん:2010/04/13(火) 09:55:40
>>407
専門職のツールと白物家電を比較するとかwww
473デフォルトの名無しさん:2010/04/13(火) 09:58:26
>>469
> C系列でSTLのような高速かつ型依存しないコードを実装するには
> コンパイル前にコードを型別に展開しなければ不可能。ゆえにコードサイズは膨れ上がる。

?? 静的に展開したから高速なのでは?
「型依存しない」の意味がよくわからんが、
動的束縛により具体的な型に依存せずにすむ。
静的に展開しないからサイズも膨らまない。

> LL言語ならそういう縛りが無いから何でもできる。

一向によくわからんが、速度とサイズの問題は一緒では?

>>467
> ネイティブコンパイラのC++とLL言語のC#を比較するのは無意味

そもそもなんだコレ? C#がLL言語だって??
474デフォルトの名無しさん:2010/04/13(火) 10:07:40
>>473
お互いの言葉の意味が通じないから実例を示す。
std::vector<int> int_array;
std::vector<char> char_array;
std::vector<std::vector<int> > intvec_array;
この3つの変数はコンパイル前にそれぞれ別々のコードに展開される。
int_array.size() と char_array.size() と intvec_array.size() もそれぞれ別のコードの関数が生成される。
それにより、高速性と、型依存しないvectorという高機能性の両方が実現されるが、
トレードオフとしてコードサイズが犠牲になっている。

あと、LL言語の正式な定義にはc#やらjavaは合致しないかもしれない。詳しい定義は知らん。
でもC使いから見たらc#なんてLL言語で充分だよ。
475デフォルトの名無しさん:2010/04/13(火) 10:16:43
>>474
> お互いの言葉の意味が通じないから実例を示す。
 (中略)
>トレードオフとしてコードサイズが犠牲になっている。

んなこと知ってるよ…。どうしたいんだ一体。

>>469
> LL言語ならそういう縛りが無いから何でもできる。

なんでもできる、つってるのは、
STLみたいな静的な展開ができる、つってんの?
LL言語じゃないのに、どんな縛りがあるって?

LL言語じゃないC++にはSTLもあれば、
ポリモーフィズムもあると既に示した。
静的、動的、両方のアプローチを既に持ってる。
476デフォルトの名無しさん:2010/04/13(火) 10:17:26
修正
> LL言語じゃないのに、どんな縛りがあるって?

LL言語じゃない言語には、どんな縛りがあるって?
477デフォルトの名無しさん:2010/04/13(火) 10:23:37
>>475
>LL言語じゃない言語には、どんな縛りがあるって?
STLは高速かつ高機能を実現するのが目的(=縛り)なので、コードサイズは犠牲になっている。
C#のような中間コード言語で、頑張って高速を実現しても意味がない(=高速を実現せよという縛りがない)から、
動的なアプローチで充分(=何でもできる)。
478デフォルトの名無しさん:2010/04/13(火) 10:32:13
>>477
> STLは高速かつ高機能を実現するのが目的(=縛り)なので、

だがSTLを使うか否かは縛られてなどない。
LL言語じゃない言語には、そんな縛りは無い。

> C#のような〜意味がない(=高速を実現せよという縛りがない)〜(=何でもできる)。

言わんとすることはなんとなく分かってきたような気もせんでもないが、
「動的なアプローチで充分」というより、静的なアプローチには限度があるだろうし、
そう考えると、「=動的なアプローチしかできない」のではと思ってしまうけど。
479デフォルトの名無しさん:2010/04/13(火) 10:38:18
>>478
>だがSTLを使うか否かは縛られてなどない。
ちょちょまてまて、この話、もともとは
>>461>>465の「STLはコードサイズが膨れ上がるけど、c#のジェネリックではそんなに増えないのはどうして?」
という疑問へのレスだから、STL前提ですよ。
480デフォルトの名無しさん:2010/04/13(火) 10:42:21
>>479
ごめんw 薄々お気づきのこととは思うけど、
>>467単体で読んで噛み付いただけなんで、
なんか無意味なレスを連ねてしまったねw
481デフォルトの名無しさん:2010/04/13(火) 10:44:11
>>480
俺の作業量を返せw
482デフォルトの名無しさん:2010/04/13(火) 10:47:27
すまぬww
483デフォルトの名無しさん:2010/04/13(火) 16:17:49
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。



っつぅC++スレのテンプレほぼまんまだなwww
484デフォルトの名無しさん:2010/04/13(火) 21:15:31
引数として渡したポインタって、いつdeleteすればいいの?
485デフォルトの名無しさん:2010/04/13(火) 21:32:17
訊いてる状況を推測するとdeleteしなくていい
486デフォルトの名無しさん:2010/04/13(火) 21:42:34
for(int i = 0; i < 10; i++) {
std::cout << "test";
}
std::coutをした後にflushをしないと気持ち悪い
だから、ループが終わった後に
std::endl;を入れたんだけど、エラーが出る

何で?
487デフォルトの名無しさん:2010/04/13(火) 21:49:51
ループが終わった後に
std::cout << std::endl;
を入れないとだめなんじゃね
488デフォルトの名無しさん:2010/04/13(火) 22:17:39
>>486
> std::endl;を入れたんだけど、エラーが出る
そのエラーメッセージをどうして貼らない?
ねぇどうして?
ねぇどうして?
ねぇどうして?


for(int i = 0; i < 10; i++) {
std::cout << "test";
}
std::endl;
もしこうだとしても「エラーは出ない」と思うぞ。
489デフォルトの名無しさん:2010/04/13(火) 22:26:41
gccのリンクエラーで質問したものです。

gcc foo.cpp でエラーだったのが
g++ foo.cpp でちゃんと実行ファイルできました。

ありがとうございます。

gcc は拡張子cppだとg++を呼び出すと思ってたのに、違うみたいですね。
490486:2010/04/13(火) 22:34:38
>>487-488
thx
491デフォルトの名無しさん:2010/04/13(火) 22:40:01
>>489
拡張子 cpp は microsoft の方言。昔は大文字の .C が c++ を示すものだったが最近は不明。
492デフォルトの名無しさん:2010/04/13(火) 22:57:00
.cc じゃん?
493デフォルトの名無しさん:2010/04/13(火) 22:59:09
>>489
cppに限らず、gccは拡張子で動作を切り替えたりしない
494デフォルトの名無しさん:2010/04/14(水) 01:33:31
$ cat a.o
#include <stdio.h>

int main(int argc, char *argv[]) {
puts("hoge");
return 0;
}
$ gcc a.o
a.o: file not recognized: File format not recognized
collect2: ld returned 1 exit status

>493 うそつき
495デフォルトの名無しさん:2010/04/14(水) 01:47:06
gccのリンカエラーって -lstdc++ をつけたら直るやつかな
496デフォルトの名無しさん:2010/04/14(水) 09:35:02
Cの入門書一通り読破したけどぜんぜんたいしたことが出来ない。
これでどうやってゲームとかアプリとかが出来るのか分からん
497デフォルトの名無しさん:2010/04/14(水) 10:29:02
入門書を読んでも何も出来るようになんかなりませんよ。
英語の単語を大量に覚えて文法を理解してもしゃべれるようになれないのと同じ。
498デフォルトの名無しさん:2010/04/14(水) 11:19:14
アプリ作ってみる本てあるんじゃん
499デフォルトの名無しさん:2010/04/14(水) 21:11:16
>>497
> 英語の単語を大量に覚えて文法を理解してもしゃべれるようになれないのと同じ。

それは嘘。
単語を覚えず、文法が身についていない人間の妄言。

単語を大量に覚えて文法を理解していれば、しゃべれる。
500デフォルトの名無しさん:2010/04/14(水) 21:16:32
ゲームとかアプリとか作るには
言語だけでなくAPIの知識が必要だからな
501デフォルトの名無しさん:2010/04/14(水) 23:17:04
英語を理解していなくてもオウムは英語を喋れる。
502デフォルトの名無しさん:2010/04/14(水) 23:54:52
>>499
じゃあお前今目の前にネイティブのアメリカ人がいたら
ペラペラ会話できるか?できないだろう
単語を覚えるのと喋れるのは全然違う

>>501
でも理解していない
503デフォルトの名無しさん:2010/04/14(水) 23:58:24
仮想継承の有用な使い方ありますか?
504デフォルトの名無しさん:2010/04/14(水) 23:58:36
単語を大量に覚えて文法を理解していれば、ネイティブのアメリカ人と会話できる。
505デフォルトの名無しさん:2010/04/14(水) 23:58:45
二次元配列についてなんですがちょっと質問させてください。
string[3][10]という二次元配列があるとして、その2行目に日本語を直接代入するならば
「string[1] = "代入したい文字";」と書けるような気がするのですが、
「左のオペランドが、左辺値になっていません。」というエラーが表示されます。
一体これはどういう意味でしょうか。解決策等あればお教えください。
返信お待ちしています。

506デフォルトの名無しさん:2010/04/14(水) 23:59:56
せめて型を明示してください。
507デフォルトの名無しさん:2010/04/15(木) 00:03:34
char string[3][10];
string[1] = "代入したい文字";
508デフォルトの名無しさん:2010/04/15(木) 00:04:20
>と書けるような気がするのですが、
気のせいです
509デフォルトの名無しさん:2010/04/15(木) 00:06:43
>>507
char型の配列に文字列定数は代入できないよ。
=で結べるのは初期化の時だけ。
510デフォルトの名無しさん:2010/04/15(木) 00:20:37
>>507
こうやればいい

char *string[3];
string[1] = "代入したい文字";

文字を代入しているわけではないけど
511デフォルトの名無しさん:2010/04/15(木) 00:21:58
>>499
それは嘘。
熟語を覚えず、背景文化が身についていない人間の妄言。
512デフォルトの名無しさん:2010/04/15(木) 00:31:23
英語話せない奴必死すぎるw
513デフォルトの名無しさん:2010/04/15(木) 00:58:26
英語で情報伝達はできるけど会話らしい会話は難しい
514デフォルトの名無しさん:2010/04/15(木) 01:02:13
会話らしい会話が難しいのはお前が馬鹿だから。
515デフォルトの名無しさん:2010/04/15(木) 01:02:23
板違い
516デフォルトの名無しさん:2010/04/15(木) 02:36:57
>>512
自己分析乙
517デフォルトの名無しさん:2010/04/15(木) 14:11:08
Cで文字列扱うのは面倒だけど試練だと思って頑張れよ
518デフォルトの名無しさん:2010/04/15(木) 19:58:26
文字列は最後の要素が0のchar配列だと最初から理解していればそうでもない
エンコードの扱いが確かに面倒だけど

stringを言語仕様に持つところからCに来たら泥沼は確実
519デフォルトの名無しさん:2010/04/15(木) 20:15:21
>>518
> 文字列は最後の要素が0のchar配列だと最初から理解していればそうでもない
そうでもあるって!
const char * a = "mojiretsu!";
これを理解するのに一苦労だったよ!
520デフォルトの名無しさん:2010/04/15(木) 22:39:59
strcpy( string[1], "代入したい文字" );
とか
strncpy( string[1], "代入したい文字", sizeof(string[1]) );
って解決策が解決策にならない罠
521デフォルトの名無しさん:2010/04/15(木) 23:04:34
なんで、2重インクルードは禁止されているんですか?
522デフォルトの名無しさん:2010/04/15(木) 23:04:45
>>520
下はNG
523デフォルトの名無しさん:2010/04/15(木) 23:15:56
>>521
ほんとうに禁止されているのですか?
524356:2010/04/15(木) 23:20:48
二重どころか自己循環インクルードしてる変態コードだってあるぜ。
Boost.Preprocessorとか。
525デフォルトの名無しさん:2010/04/16(金) 06:42:13
>>521
無限にループさせたり、定義が被ることさえなければ、
どうインクルードしようが自由だ
526デフォルトの名無しさん:2010/04/16(金) 16:29:44
hppファイルって、ヘッダだから、
hppファイルの中に

class Test
{
 public:
  Test( );
};

Test::Test( )
{

}

のように実装まで書くのは間違いで、
hppの中は宣言、実装は別のcppファイルに書くべきなのでしょうか?
527デフォルトの名無しさん:2010/04/16(金) 16:32:12
>>526
必ずというわけでもない
528デフォルトの名無しさん:2010/04/16(金) 16:38:33
>>527
そんなのが答えと言えるかぼけ

>>526
Cでソースとヘッダがわかれてるのは、別に整理のためでも嫌がらせのためでもなくて、
複数のソースから参照するべきものはコピペするのムダだからヘッダにまとめてあるわけ。
だから、複数箇所で参照するものをヘッダに書いて、一箇所からしか見ないものをソースに
書けばよろしい。
何を言ってるのかわからなければ、まだヘッダとかを触る段階じゃないから、全部ソースに
書けばよい。
529デフォルトの名無しさん:2010/04/16(金) 16:57:27
ゲッターセッターはヘッダーに書いちゃうな俺
530526:2010/04/16(金) 17:16:11
>>527
>>528
ありがとうございます。

ヘッダには「宣言」を書くと教わったので、「定義」は別ファイルに書くという決まりがあるだと思ってしまいました。
なので以下の様な書き方もダメだと思っていました・・・

-----------------------------
// hoge.hpp

// 宣言かつ定義
void hoge( )
{
 // 何か処理
}
-----------------------------

531デフォルトの名無しさん:2010/04/16(金) 17:27:09
複数のファイルからインクルードするとhogeが多重定義になる。
532デフォルトの名無しさん:2010/04/16(金) 17:29:43
インクルードガードぐらいは流石に書くだろう
533デフォルトの名無しさん:2010/04/16(金) 17:32:19
>>532
そこまでしてヘッダに書くくらいならソースに書けばいい
534デフォルトの名無しさん:2010/04/16(金) 17:38:37
ん?
>>531
>>532
>>533
この流れはおかしいぞ、「複数のファイルから」という話が「複数のファイルを」に摩り替わってるぞ。
535デフォルトの名無しさん:2010/04/16(金) 17:42:13
>>532が悪い
536デフォルトの名無しさん:2010/04/16(金) 17:45:02
>>530
ヘッダーに関数の定義を書いても良いが、
関数の定義が書かれたヘッダーは複数のソースで include できなくなる。

ヘッダーの本来の目的は、複数のソースで同じことを何度も書くのが面倒なだから、
その共通部分をヘッダーファイルに書いて置き、複数のソースからはinclude するだけで済ますこと。

よってその目的が失われることをヘッダーに書いたりはしないのが常道。
537デフォルトの名無しさん:2010/04/16(金) 17:45:47
ああすまん勘違いしてたよ

>>533
そこまでして、っていうけどその言い方だと普段インクルードガード書かないように聞こえるよ
538デフォルトの名無しさん:2010/04/16(金) 17:51:06
>>537
現実にはインクルードガード書かない方が、
そこまでしてヘッダーの構成考えるのかって言いたくなるなw
539デフォルトの名無しさん:2010/04/16(金) 18:32:05
>>537-538
>>そこまでして
hogeが多重定義にならないように変なインクルードガードして
>>ヘッダに書くくらいなら
hogeの定義をヘッダに書くなら
>>ソースに書けばいい
hogeの定義はcppに書けば良いって意味じゃないか?
540デフォルトの名無しさん:2010/04/16(金) 18:47:22
>>539
まず、インクルードガード使ってもhoge関数の多重定義は防げないよ。
hoge関数の定義をcppに書くべきと言うのはそう。

けど、それとは関係ない話になっているわけで、

>>537 が言ってるのは、
インクルードガードが大変みたいなこと言ってるけど、インクルードガードぐらい普通に使うだろ、
それを君は書かずにやってるのか?
という意味だと思う。

>>538 はそれ賛同して
実際にはインクルードガード書かない方が面倒で大変なことだよね。
と言ってる。
541デフォルトの名無しさん:2010/04/16(金) 18:48:25
という自演でしたとさ
542デフォルトの名無しさん:2010/04/16(金) 18:48:52
そこまでするなら単一ファイルだな。
543デフォルトの名無しさん:2010/04/16(金) 19:04:59
そこまではしたくない
544デフォルトの名無しさん:2010/04/16(金) 21:08:06
>>540
>まず、インクルードガード使ってもhoge関数の多重定義は防げないよ。
メリットがなく混乱の元になるだけなので、使う意味は全くないが、できることはできる。

@ 定義の部分だけガードしてやる
A 呼び出し側の規約として、@で弾かれるように#defineで定義する
  → makeなどで、コンパイル時に自動で定義されるようにするとかでも可
B ヘッダは、定義せずにコンパイルする
545デフォルトの名無しさん:2010/04/16(金) 21:08:15
inline関数とか
546デフォルトの名無しさん:2010/04/16(金) 21:20:53
WindouwsXPにて、
VisualStudio2008コマンドプロンプトを使ってclコマンドを使おうとすると、

D:\work>cl reber.c

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

reber.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

LINK : fatal error LNK1104: ファイル 'C:\DOCUME~1\佐藤' を開くことができません。

というエラーが出て、オブジェクトファイルはできているのにexeファイルができません。
現在マイコンピュータ→ローカルディスク(D:)→workフォルダに入れています。
ソースプログラムはTeraPadに書いています。
エラーは何が原因なのでしょうか。
547デフォルトの名無しさん:2010/04/16(金) 21:30:31
>>546
佐藤ってあーた…
まぁ、多分、パスが通ってないんじゃないの?
548デフォルトの名無しさん:2010/04/16(金) 21:31:45
>>546
何が原因って、ちゃんと書いてあるだろ……

LINK : fatal error LNK1104: ファイル 'C:\DOCUME~1\佐藤' を開くことができません。

↑これが原因だよ。

君のPC環境は全く分からないのでエスパーレスになるが、
C:\DOCUME~1\佐藤 ←このディレクトリ、名字の後に半角SP入って名前が続いてるんじゃないのか?
もし半角SPが入っているなら消さないと駄目だ。
549521:2010/04/16(金) 21:35:53
>>523-525
thx
550デフォルトの名無しさん:2010/04/16(金) 21:37:09
入ってるのは全角スペースと名前だけで、消そうとすると
Windowsのシステムフォルダで
Windowsを正しく実行するのに必要なので名前を変更できないと出ますので、
どうすればいいのか分からない状況です。
551デフォルトの名無しさん:2010/04/16(金) 22:16:23
>>550
作業フォルダの設定がユーザのフォルダになってるのか…?
まぁ、変更方法とか、興味ないし知らんけど、
取り合えず、そのユーザはあきらめて、新しいユーザを作成して
その新しいユーザで試してみたら?
552デフォルトの名無しさん:2010/04/16(金) 22:20:43
>>550
スタートメニュー⇒Visual Studio⇒Visual Studio Tools⇒コマンドプロンプト
cl すればいい
553デフォルトの名無しさん:2010/04/16(金) 22:23:53
とりあえず、ユーザ名変更して試してみます。ありがとうございました。
554デフォルトの名無しさん:2010/04/16(金) 22:32:29
NtfsDisable8dot3NameCreation=1した後に作ったユーザーだろ
ユーザー名変えてもプロファイルフォルダパスは変わらないから無駄だぞ
0に戻して再起動してから新規ユーザー作るか環境変数TMPにスペースの入らないパスを設定しないと
ちなみにVC2010の次で直す予定だそうだ
555デフォルトの名無しさん:2010/04/16(金) 22:35:59
いっそのこと半角スペース禁止にしちゃえばいいのにな
556デフォルトの名無しさん:2010/04/16(金) 22:45:37
>>554
なんで、新規ユーザ作るのに、またスペースが入ることが前提なんだ?
557デフォルトの名無しさん:2010/04/16(金) 22:49:26
>>556
いわゆる~/に入れようとしたら
Documents and Settings
とスペースが入っちゃうからじゃない?
558デフォルトの名無しさん:2010/04/16(金) 22:53:26
>>557
>>546
'C:\DOCUME~1\佐藤'
になってるんだから、問題となるのはユーザ名だけなんじゃないの?
559デフォルトの名無しさん:2010/04/16(金) 23:01:26
>>558
あぁなるほど
じゃぁあるのかどうかは分からないけど
半角スペース以外の問題だね
560デフォルトの名無しさん:2010/04/16(金) 23:20:57
>>559
>>550でユーザ名に全角スペースが入ってるのは確からしく、
また、>>546で名前が途切れていることからユーザ名がおかしな原因になってると予測される。
さらに、ググってみると、ユーザ名部分は半角スペースがあっても、
ショートファイル名に直さないらしいので、それがNGの原因となることがあるらしい。
つーわけで、ユーザ名の全角スペースを自動的に半角スペースに
読み替えてくれる、素敵機能が、どっかの機能についてると予測
561デフォルトの名無しさん:2010/04/16(金) 23:59:45
ユーザ名変更で使えるようになりました。
お付き合いいただきありがとうございました。
562デフォルトの名無しさん:2010/04/17(土) 00:26:53
まぁ別にそうしなきゃいけないルールがあるわけじゃないが、

ディレクトリ名に全角文字は使わない。
ディレクトリ名にスペースは使わない。

ぐらいの暗黙のルールがあるべきだと俺は思う。
563デフォルトの名無しさん:2010/04/17(土) 00:33:47
暗黙というより明言してていいと思う
564デフォルトの名無しさん:2010/04/17(土) 00:40:52
問題は、自分でスペースを入れたつもりがなくても、
ユーザ名が、そのままフォルダ名になってしまい、
さらに、その命名ルールを決めたMSの製品で不具合がおきることだな。
さすがだぜ。
つーか、互換性の為にショートファイル名を残しているのに
互換性の無い製品内部でショートファイル名を残してるって、
MSは、ショートファイル名を切り捨てる気はないのだろうか?
565デフォルトの名無しさん:2010/04/17(土) 00:51:11
ショートファイル名って使われてるの?
XP&2008EEの環境で色々試したけど再現しないのだが。
566デフォルトの名無しさん:2010/04/17(土) 13:06:49
C++ Glossary
http://www.kmonos.net/alang/cpp/glossary.html
より


NTP (Named Template Parameter)
名前付きテンプレート引数。
大量にパラメータを指定出来るようなクラステンプレートを作ると、
実際に使うときには、どれをどんな順番で指定しなければならない… ということをいちいち確かめる必要があって、大変。
template<
class Pointee,
class OwnerShip = RefLink,
class CheckNull = NoCheckNull,
class ThreadModel = SingleThread
> class smart_ptr { ... };
typedef smart_ptr<MyClass,
RefCount,NoNullCheck,MultiThread> myptr;
もちろんそれぞれのパラメータにデフォルト値を指定しておけば、 たいていの場合は最初の一つだけ指定して終わり、で済むので楽です。
が、この場合もデフォルト以外を使いたくなったら大変。
そこで、 各パラメータに名前を付けて、順番は適当に指定出来たらいいな、 という気分になります。
typedef smart_ptr< MyClass,
ThreadModel_is<MultiThread>,
OwnerShip_is<RefCount>,
> myptr;
この技法が、です。最近の幾つかのライブラリでは、 NTPでパラメータ指定出来るようになっています。


とありますが、これについてもっと詳しく分かる日本語のWebサイトを教えてください。
よろしくお願いします。
567デフォルトの名無しさん:2010/04/17(土) 13:49:57
ググれカス
568デフォルトの名無しさん:2010/04/17(土) 17:00:25
佐藤 の検索結果 約 37,200,000 件
569デフォルトの名無しさん:2010/04/18(日) 10:02:39
>>565
8.3形式の名前の生成を止めるかexFAT使った上でコマンドラインからcl.exeやらないと再現なんか出来ないぞ
570デフォルトの名無しさん:2010/04/18(日) 14:24:06
while(cin >> w >> h, (w||h))
ってどういう意味? どっちが条件文? &&とか||ではなく,なのはなぜ?
571デフォルトの名無しさん:2010/04/18(日) 14:24:48
>>570
きたねえコードだなおい
オレが上司なら不許可だな
572デフォルトの名無しさん:2010/04/18(日) 14:26:32
>>570
カンマで区切られた式は、左から順番に評価され、
一番最後に評価された式の値が、その式の値となる。
573デフォルトの名無しさん:2010/04/18(日) 14:27:40
cin >> w >> h を実行してから w||h を条件式として判定する
コンマ演算子でググれ
574デフォルトの名無しさん:2010/04/18(日) 14:28:56
do { std::cin >> w >> h; } while (w || h);
575デフォルトの名無しさん:2010/04/18(日) 14:29:12
カンマってそういうコード以外で使い道あんのか?
576デフォルトの名無しさん:2010/04/18(日) 14:30:33
Boost.Assignとか。
577570:2010/04/18(日) 14:36:01
みなさんありがとう!よくわかりました.
ところでwhile(cin >> w >> h, (w||h)) と
while(cin >> w >> h && (w||h))
は同じ意味になりますよね?

どっちが望ましい?
578デフォルトの名無しさん:2010/04/18(日) 14:39:25
>>577
見てすぐわかんないだろ、どっちもダメ。
579デフォルトの名無しさん:2010/04/18(日) 14:44:07
その文法を使えば、
while()のカッコの中だけに全てのプログラムを書くことも可能じゃないのか?
580デフォルトの名無しさん:2010/04/18(日) 14:44:44
>>578
え、この程度がわかんないの?
そんなんでよくやっていけるな
581デフォルトの名無しさん:2010/04/18(日) 14:46:35
>>577
cin >> w >> h の評価が偽だった場合は、w が真でも (w||h) が評価
されないから、同じ意味ではない。
582デフォルトの名無しさん:2010/04/18(日) 14:48:09
>>580
少なくとも >>570 はわかってないから、>>570 でもわかる
書き方をすべきだな。
583デフォルトの名無しさん:2010/04/18(日) 14:49:51
>>575
for でよく使うでしょ

>>582
Cを勉強してない人に分からないから
Cは廃止した方がいいというレベルの事言われても
584デフォルトの名無しさん:2010/04/18(日) 14:58:11
forの初期化、再初期化以外でカンマ演算子を使う奴は殴り倒す。
585デフォルトの名無しさん:2010/04/18(日) 14:58:41
>>580
「わかんない」んじゃない。
「見てすぐわかんない」んだ。
じっくり見て、考えて、やっとわかるコードなんか書く奴はダメ。
見てすぐわかるように書かないとデバッグの時にひどい目にあうよ。
586デフォルトの名無しさん:2010/04/18(日) 15:01:12
Foo* a, b;
587デフォルトの名無しさん:2010/04/18(日) 15:03:47
>>585
この程度すぐ見て分からないようじゃねぇー
588デフォルトの名無しさん:2010/04/18(日) 15:05:32
>>586
おれはどっちかというとそれを問題視したいw
ハゲ一派のアスタリスク位置。
589デフォルトの名無しさん:2010/04/18(日) 15:06:25
>>587
底辺から煽られてもなんかくすぐったいな位しか感じないぞ
590デフォルトの名無しさん:2010/04/18(日) 15:12:39
なんやお前ら全員低レベルやな

って上から見ている気になっているヤツが何人いることかw
591デフォルトの名無しさん:2010/04/18(日) 15:13:41
592デフォルトの名無しさん:2010/04/18(日) 15:14:30
#define DECLVAR(TYPE) boost::mpl::identity<TYPE>::type

DECLVAR(Foo*) a, b;
593デフォルトの名無しさん:2010/04/18(日) 15:15:27
>>590
自分を慰めたいと思う人は、
それを自覚しないものさ。
594デフォルトの名無しさん:2010/04/18(日) 15:16:08
>>592
どうせなら

typedef Foo* LPFoo;

LPFoo a, b;
595デフォルトの名無しさん:2010/04/18(日) 15:16:38
596デフォルトの名無しさん:2010/04/18(日) 15:22:34
0xならこれできたっけ。
decltype(int*) a, b;
597デフォルトの名無しさん:2010/04/18(日) 16:02:58
template<typename T>class A{};
template<typename T>using &rA,*pA=A<T>; //とかできんのかね?

template<typename T>typedef class tagA{}A,*pA,&rA; //template typedefsで定義宣言一発を妄想してたのに
598デフォルトの名無しさん:2010/04/18(日) 16:51:43
つまり何だって言ってるの?
>>595
> A ``typical C programmer'' writes ``int *p;'' and explains it ``*p is what is the int'' emphasizing syntax,
 > and may point to the C (and C++) declaration grammar to argue for the correctness of the style.
 > Indeed, the * binds to the name p in the grammar.
> A ``typical C++ programmer'' writes ``int* p;'' and explains it ``p is a pointer to an int'' emphasizing type.
 > Indeed the type of p is int*. I clearly prefer that emphasis and see it as important
 > for using the more advanced parts of C++ well.
どっちが言い悪いの問題じゃないよって言っているってことか?
599デフォルトの名無しさん:2010/04/18(日) 16:59:23
>>596
decltypeの中に書くのは式なのでそれはできない。
なので上にあるようにboost::mpl::identityを使うのが近い方法。
600デフォルトの名無しさん:2010/04/18(日) 22:28:48
他で定義したマクロを使いたいんだけど、
どうすればいいの?
601デフォルトの名無しさん:2010/04/18(日) 22:35:07
>>600
> 他で定義したマクロを使いたいんだけど、
どこで定義したんだよ?
602デフォルトの名無しさん:2010/04/19(月) 14:43:12
>>600
ヘッダに書いてインクルードしろよ。
そんな事もわからなかったら、お先マっクロだぞ
603デフォルトの名無しさん:2010/04/19(月) 15:01:08
∧_∧∩))
( ・∀・)彡   パーン!
  ((⊂彡☆∩  _, ,_
   ⊂(⌒⌒(;`Д´)
      `ヽ_つ ⊂ノ ←>>602
604デフォルトの名無しさん:2010/04/19(月) 16:22:18
>>601
他だよ
605デフォルトの名無しさん:2010/04/19(月) 18:22:41
>>604
死ねクズが
606デフォルトの名無しさん:2010/04/19(月) 18:29:26
その他ってやつをコピペすればおk
Cではみんな伝統的にこうやってる
607デフォルトの名無しさん:2010/04/19(月) 19:06:41
PhysXっていうソフトを使うのに
C++が必要なんだけど、まず何から勉強したら良い?
今まで勉強した言語はMELってやつしか無くて
プログラム経験皆無と言って良いレベルかもしれないんだけど
608デフォルトの名無しさん:2010/04/19(月) 19:35:45
>>604
だったらその定義している他のヘッダを引き込めば良かろうに。
609デフォルトの名無しさん:2010/04/19(月) 19:37:14
>>607
まずはC/C++が何なのか知らないと話にならない。
C++ 入門 でぐぐるといい。
610デフォルトの名無しさん:2010/04/19(月) 19:45:14
>>609
オッス!ありがとうございます!頑張りまっす!
611デフォルトの名無しさん:2010/04/19(月) 19:45:55
>>608
そうするわ
612デフォルトの名無しさん:2010/04/19(月) 20:03:23
>>607
とりあえず天賦の才を持たない限りCの知識が無い状態からC++を勉強すると
数年越しのプランになるよ。

価値はまああると思うけど。
613デフォルトの名無しさん:2010/04/19(月) 21:20:27
>>607
>PhysXっていうソフトを使うのに
>C++が必要なんだけど

PhysX はNVIDIAの物理演算用数値計算ライブラリというか、SDKなのでどっちかって言うと、
「C/C++ で PhysXライブラリ を使って何かを作りたい。そのため、C/C++を勉強したい」
って話になると思う。 ソフトを使う、ってニュアンスじゃないぜ。とりあえず年単位くらいで腰すえて勉強してくれ

614デフォルトの名無しさん:2010/04/19(月) 21:38:20
>>612
Cの知識があってC++初めてから数年経つけど学習プラン終わらないよ…
615デフォルトの名無しさん:2010/04/20(火) 09:12:47
inlineってどれぐらい効果があるもんなんでしょうか?

inline void func(hoge h, const fuga &f)
{
・・・;
}

{ func(h, f); }

と書いた場合

{
hoge h_ = h; const fuga f = f;
・・・;
}

こんな感じで展開されると考えていいんですか?
616デフォルトの名無しさん:2010/04/20(火) 09:16:20
>>615
>hoge h_ = h; const fuga f = f;

こんな物が生成されたりはしない
617デフォルトの名無しさん:2010/04/20(火) 09:45:42
生成されたコード読むのが一番だよ
618デフォルトの名無しさん:2010/04/20(火) 11:43:43
テストツールとして、指定プロセスのCPU使用率を求めるTOOLを作成しています。

PDH系APIを使用してCPU使用率を取得を考えています。
PdhAddCounter()に特定プロセスを登録した場合と全体を指定した場合(以下の2つ)
"\\Process(Hoge#0)\\% Processor Time"
"\\Processor(_Total)\\% Processor Time"

プロセスを登録した方がCPU使用率が高く表示されたのですが、
_Totalを設定した場合は、全てのプロセスが使用しているCPU使用率を表示してる。
プロセスを設定した場合は、動作中のCPUを100としてその何パーセントを、そのプロセスが
占めいているという考えでよろしいでしょうか?
619デフォルトの名無しさん:2010/04/20(火) 21:50:42
時刻を取得する時に以下のようにコードを書くわけですが、
 time_t t;
 time(&t);
 tm* ltm = localtime(&t);
localtime( ) の戻り値が tm構造体のポインターなのが気になります。

localtime( )の中で、tm構造体はmalloc/newで取られて
それをさすポインターを返しているのでしょうか?
malloc/newしないとlocaltime()のスコープ抜けたらポインターが
無効になってしまいますよね?
620デフォルトの名無しさん:2010/04/20(火) 22:08:36
MSDN より
32 ビット バージョンおよび 64 ビット バージョンの gmtime、mktime、mkgmtime、localtime の各関数はすべて、1 スレッドあたり 1 つの tm 構造体を使用して変換を行います。これらのルーチンを呼び出すたびに、前の呼び出しの結果は破棄されます。
621デフォルトの名無しさん:2010/04/20(火) 22:08:51
>>619
localtime が持っている static な領域が返されています。
ポインタを保持しておいて後で使う、という場合は、
もう一度 localtime を呼ぶと結果が上書きされてしまうので注意です。
622デフォルトの名無しさん:2010/04/20(火) 22:12:57
time_t型の「_t」って何?
623デフォルトの名無しさん:2010/04/20(火) 22:12:42
>>620
>>621
ありがとうございます。
static変数へのポインタを返す、というのは全く思い付きませんでした。
624デフォルトの名無しさん:2010/04/20(火) 22:15:04
>>622
typeの頭文字
625622:2010/04/20(火) 22:15:36
>>624
thx
626デフォルトの名無しさん:2010/04/20(火) 22:56:08
>>612>>613
押忍!長く腰を据えてがんばります!
あざっっす!!
627>>612:2010/04/20(火) 22:58:26
>>626
その気合いがあれば大丈夫だ。
C++0xではどうだとか最初は気にしない方が良い。
C言語を2ヶ月かけて色々いじったりして勉強して、
(簡単な文字列関連の処理プログラムを標準Cライブラリの範囲内で作るとか)
次の月からC++をやるのが良いと思うよ。

がんばれ
628デフォルトの名無しさん:2010/04/20(火) 23:05:30
C覚える
C++に手を出す
なにかと理由をつけてCに戻る
C++に再チャレンジする
なんどか繰り返す
才能があればC++に定着する
なければC信者になる
629612:2010/04/20(火) 23:18:53
>>628
俺は
1.C覚える
2.C++に手を出す
->この後ずーっとC++信者になったよ。

でもあんまりにも細かい仕様は覚えたくないので
TMPとかは他人任せ(ライブラリまかせ)にしている。
630デフォルトの名無しさん:2010/04/20(火) 23:19:14
そのうちC#に手を出す
C/C++に戻れなくなりC#信者になる
631612:2010/04/20(火) 23:29:43
>>630
いや俺は>>612でありかつ>>444なんだけど、
Pythonに手を出した。

C#はなんだか中途半端なんだもん。
 日頃の作業のお手伝い・自動化系=>P言語系
 お手軽開発=>P言語系
 ガチ開発=>C++
がお薦め。
632デフォルトの名無しさん:2010/04/20(火) 23:52:00
ちなみに
上で述べられているTMPは
Template MetaProgramming
の略です。

TeMPlate の略だと思っている人がたまにいるので
冗長ながら申し上げました。。
633デフォルトの名無しさん:2010/04/21(水) 00:01:31
TeMPorary かと思ってた(;´ρ`)
634デフォルトの名無しさん:2010/04/21(水) 00:10:11
>>631
スクリプト言語の信者は、記述が少なくて楽って言ってるけど、
動的型の言語は、かえってめんどくさいな。
IDEのサポートがへぼいとか、コンパイル時にぜんぜんエラーを検出
できないとかで。

C#くらいが超楽でいい。
635デフォルトの名無しさん:2010/04/21(水) 05:15:37
ラップオブジェクト作ってオーバーロード裏表を嬉々とコーディングしている自分をふと振り返って
C++やめようかなと
636デフォルトの名無しさん:2010/04/21(水) 21:45:37
コンストラクタで例外は出さない方がいいんですか?
637デフォルトの名無しさん:2010/04/21(水) 22:05:27
メンバ変数で大文字って使わない方がいいんですか?
gccが文句を言ってきます
638デフォルトの名無しさん:2010/04/21(水) 22:25:57
>>636
出しても問題ないが、デストラクタが動かないので気をつける事
(派生クラスやコンストラクタの既に実行されているメンバ変数のデストラクタは動く)

>>637
どんな名前使ってんだ
639デフォルトの名無しさん:2010/04/21(水) 22:26:45
×派生クラスや
○基底クラスや

逆を書いちゃう事ってよくあるよね
640デフォルトの名無しさん:2010/04/21(水) 22:28:39
>>636
ダメなのはデストラクタ
641デフォルトの名無しさん:2010/04/21(水) 22:36:00
>>634
案件でC#による開発、とかは費用対効果的に(もちろん要件によるが)素晴らしいとは思うが、
趣味のプログラミングって話だと、C#絶賛してる奴は大抵何も知らない、勘違いしたゆとりって印象。
・・・実際、便利で良く出来てるとは思うけどさ。VC#をIDEに据えると本当にRADって感じだし
642636:2010/04/21(水) 22:43:58
643637:2010/04/21(水) 22:53:37
>>638
int testID;ってのを使ってますよ
644デフォルトの名無しさん:2010/04/21(水) 23:11:16
IronPython使ってみたけど
C#でいいと思った
645デフォルトの名無しさん:2010/04/21(水) 23:32:05
俺もC#使ってみようかな
やっつけ仕事でもGUIアプリとか作りたい
646デフォルトの名無しさん:2010/04/21(水) 23:39:22
>>636
大丈夫。
ちゃんとメモリーリークしたりしないようにできているなら
気兼ねなく例外を投げろ。

Constructorにもし例外を投げないことを強制したら、
うまくConstructできない場合には不完全なオブジェクトが
できることになってしまう。
(例:Googleのコーディング規約ではConstructorでの例外を禁止し、
init()というメンバ関数で初期化するように要請している。)
647デフォルトの名無しさん:2010/04/21(水) 23:45:23
C#使うならQtでいいだろ
648デフォルトの名無しさん:2010/04/21(水) 23:46:37
Qtは無いわ。
649デフォルトの名無しさん:2010/04/22(木) 07:07:50
>>648
なんで無いんだよ
十分じゃないか。
650デフォルトの名無しさん:2010/04/22(木) 07:16:58
>>646
class A {
public:
 A() : p1(NULL), p2(NULL) { p1 = new char[100]; p2 = new char[100]; }
 ~A() { delete[] p1; delete[] p2; }
 char* p1;
 char* p2;
};

で p2 の new で失敗したら p1 がメモリリークする。
こういうことしたいなら、
new を生で使わず vector を使う(vector のデストラクタが動いてくれる)か、
A() 内で一旦例外を catch して p1 を開放する必要がある。
651デフォルトの名無しさん:2010/04/22(木) 07:17:50
>>643
別に普通に使えると思うけど・・・
652デフォルトの名無しさん:2010/04/22(木) 12:49:46
>>641
> C#絶賛してる奴は大抵何も知らない、勘違いしたゆとりって印象。

スクリプト言語絶賛してる連中も中二病くさいやつがよくいる印象。
653デフォルトの名無しさん:2010/04/22(木) 15:15:56
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

int main (int argc, char const *argv[])
{
int* localarray;

localarray = (int*)malloc(16 * sizeof(int));

printf("arraysize = %d", ARRAY_SIZE(localarray));
printf("\n");

return 0;
}

16って表示させたいんですけど、どうすればいいのですか??
654デフォルトの名無しさん:2010/04/22(木) 15:18:12
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

int main (int argc, char const *argv[])
{
int* localarray[16];

printf("arraysize = %d", ARRAY_SIZE(localarray));
printf("\n");

return 0;
}
655デフォルトの名無しさん:2010/04/22(木) 15:26:46
>>654
いや、確かにそうなんですけど…
mallocやreallocつかったときは、どうやって要素の数を得ることが出来るのかが知りたいです。
656デフォルトの名無しさん:2010/04/22(木) 15:27:50
>>653 要点は、>>654 も書いてるが・・・

※ただし int localarray[16];

1.>>653の localarray はただの int のポインタ。ただどこかのアドレスを指す為の、ただのポインタ
2.malloc は単に指定されたバイトサイズの領域を確保しただけ。ただそれだけ
3.1と2から、そこには望んだようなサイズの答えは無い

また ARRAY_SIZE マクロの定義はこうなので

#define ARRAY_SIZE(X) (sizeof(X)/(sizeof(X[0])))

sizeof(X) で領域全体のバイトサイズが拾えないと無理。
と言うか、そもそも 「これだけの領域が欲しい」 と確保している時点で自分でサイズは知っている訳だから
それを見ろって話。例えそれが動的配列のつもりであったとしても。

657デフォルトの名無しさん:2010/04/22(木) 15:32:30
>>655
>mallocやreallocつかったときは、どうやって要素の数を得ることが出来るのか
malloc系統はバイトサイズ指定して確保するだけの物であって、
要素の数なんて無いし、それで得られるポインタが例え確保領域の外に飛び出したとしても
それを丁寧にチェックなどしない。

float *pF;
pF = (float*)malloc(16 * sizeof(int));

float f;
f = pF[1000]; // !

これだって可能だろ?そういう事だ
658デフォルトの名無しさん:2010/04/22(木) 15:34:54
何もかも忘れてvectorを使えばおk
659デフォルトの名無しさん:2010/04/22(木) 15:35:53
あ、>>657 の話は、「"要素"数を得るには型のサイズなど情報も必要だが、
そんな型サイズも"要素"数も malloc は関知なんてしないよ」 って話な
660デフォルトの名無しさん:2010/04/22(木) 15:56:28
>>658
このスレでそれは禁句。と書こうとしたらここはC/C++のスレだったw

折角だから、C++版のARRAY_SIZE関数でも貼っておこう。
--
template<typename T, std::size_t N> static inline std::size_t numberof(T (&)[N]) {return N;}
661デフォルトの名無しさん:2010/04/22(木) 16:45:37
ターゲット環境に合わせてlocalarrayをオーバ・アンダーリードして格納情報取り出せばOK
662デフォルトの名無しさん:2010/04/22(木) 17:21:20
>>660
へぇ×100
663デフォルトの名無しさん:2010/04/22(木) 19:26:57
>>660
実行時ではダサいです
コンパイル時にしてください
664デフォルトの名無しさん:2010/04/22(木) 19:29:04
template typedefsのない今の世じゃ typedef いっぱい作らなきゃならないじゃないか
665デフォルトの名無しさん:2010/04/22(木) 20:20:34
>>663
>660は普通のコンパイラなら最適化で定数になるよ。
666デフォルトの名無しさん:2010/04/22(木) 20:36:31
アホか
コンパイル時に解決しないと
配列のサイズとかに指定できないだろ

template <typename T, std::size_t N> char (&ARRAY_SIZE_(const T(&)[N]))[N];
#define ARRAY_SIZE(a) (sizeof ARRAY_SIZE_(a))

int n[10];
char m[ARRAY_SIZE(n)];
667デフォルトの名無しさん:2010/04/22(木) 21:20:28
使えない?
普通にコンパイル通ったけど。。
--
int array[5];
double da[numberof(array)];
for (int ic = 0; ic < numberof(array); ++ic) {
printf("%d:%g\n", array[ic], da[ic]);
}
--
勿論、不定値が出力されたw
668デフォルトの名無しさん:2010/04/22(木) 21:22:38
>>666
どないなってんのこれ?
669643:2010/04/22(木) 21:26:03
>>651
メンバ変数がint threadIdって名前なんだけど
何故かダメぽ

threadIDは大丈夫なんだけど、予約されているのかな?
1度も継承は使っていない
670デフォルトの名無しさん:2010/04/22(木) 21:26:12
標準C++の範囲でお伺いします。
例外安全について書かれた
英語のWebサイトを教えてください。

basic guarantee is ***
みたいな感じで、そこそこ詳しく書いてあるところを教えてください。

よろしくお願い申し上げます。
671デフォルトの名無しさん:2010/04/22(木) 22:18:26
>>669
gccの文句書いてよ
672デフォルトの名無しさん:2010/04/22(木) 22:19:42
>>670
このあたりはどうか。
Exceptional C++ の元ネタになったサイト。

http://www.gotw.ca/gotw/

#56〜#60, #82 あたりとか。
673デフォルトの名無しさん:2010/04/22(木) 22:25:32
メンバ変数に使われているクラスは、
前方宣言じゃなくて#includeを使わないとダメなんですか?

インクルードガード?ってのと何か関係あるの
674デフォルトの名無しさん:2010/04/22(木) 22:29:00
>>673
要はサイズを知ってればおk
ポインタか参照だったらサイズは固定(たいてい4バイト)だから前方宣言だけでいい
普通の変数だとクラスのサイズを知らないといけないからincludeするなりしてサイズを教えてあげないといけない
ガードとは関係ない
675673:2010/04/22(木) 22:49:18
>>674
なるほど、だからポインタは#includeしなくてもいいんですか
thx
67670:2010/04/22(木) 23:02:00
>>672
ありがとうございます。
見てきます。
677デフォルトの名無しさん:2010/04/23(金) 16:10:10
他で質問するべきだとは思うのですが、C言語やってる方なら詳しいと思うので教えてください。
式の演算結果が、その式の持つ情報量(x*yの場合3文字)より多くなるとします。
演算結果はどこかが変数になっていて毎回変わるものというわけではない場合、
情報量を少なく表現するために演算子を用いて書くか、
あるいは解を直接書くかどっちが速度的に早くなるのでしょうか?
演算回数にもよると思うのでなんともいえないとは思いますが、
ちょっと気になったので詳しい方教えてください。
678デフォルトの名無しさん:2010/04/23(金) 16:17:46
定数の計算式の話なら、コンパイル段階で計算されるから速度的にはかわらない。
計算式に意味があるとか、手計算だと面倒とか言う場合にはそのままでかまわない。
679デフォルトの名無しさん:2010/04/23(金) 16:17:49
なんだその勝手な定義の情報量は
勝手に言葉を再定義したって誰にも理解できんぞ
680デフォルトの名無しさん:2010/04/23(金) 16:31:17
情報量というからエントロピーとか圧縮の話かと思った。
まあ情報量が「3文字」なんていう時点でそれはないのな。
681デフォルトの名無しさん:2010/04/23(金) 16:44:44
文字列 CString (UNICODE)を使用しています。
ここに格納される文字が英語(半角)のみの文字か、
日本語が含まれているかを簡単に判別することはできないでしょうか?
682677:2010/04/23(金) 17:02:15
レスどうもありがとうございます。

>>678
参考になります。
そのままでもいいとのことなのでケースを吟味して計算式に特に意味がないようならそのままにしたいと思います。

>>679-680
すみません。
なんという言葉が正しいのかわからなかったので・・・
文字数というかバイト数?というとちょっとおかしいですよね?
int i = 3*3;
でiは4バイトということではなく、
この文字列をテキストなんかにSJISで保存した場合、12バイトになるみたいなことです。
コメントを含め大量の文字量が書かれたプログラムだと実行速度が遅くなると思ったので。
エントロピーとか難しい話は分かりません・・・すみません。

まぁ気にすることでもないと思うので気にしないことにします。
変な質問してすみませんでした。
683デフォルトの名無しさん:2010/04/23(金) 17:13:48
コンパイルしてんだから文字数は関係ないだろ
684677:2010/04/23(金) 17:25:50
>>683
すみません。
その辺が重要な認識のズレでしたね。
確かにCのようなコンパイラ言語なら関係ないですね。
インタプリタ視点で考えてました。
685デフォルトの名無しさん:2010/04/23(金) 17:41:56
スクリプト言語でもよほど古い実装でもなければ
JITが一般的になってるはずで、コメント云々で実行速度が落ちるとかはまずない。
何度もソースを再ロードしまくるとかなら別かもしれんけど。
686デフォルトの名無しさん:2010/04/23(金) 17:45:31
名前長くしすぎるとtypeid.name();を使ってなにか処理するときにちょっとコスト増えるかもね
687デフォルトの名無しさん:2010/04/23(金) 19:04:27
>>686
> 名前長くしすぎるとtypeid.name();を使ってなにか処理するときに
なーるほど。
確かに等価ではないかもしれん。

でもまあ
> typeid.name();を使ってなにか処理する
そんなコードはすべからくクソコードだろう。
688デフォルトの名無しさん:2010/04/24(土) 15:07:41
ポインタのポインタはヒープに格納されるの?
689デフォルトの名無しさん:2010/04/24(土) 15:15:34
ポインタのポインタはポインタですよ
690デフォルトの名無しさん:2010/04/24(土) 16:06:09
>>688
はい。そうです。
691デフォルトの名無しさん:2010/04/24(土) 16:08:10
>>690
氏ね
692デフォルトの名無しさん:2010/04/24(土) 16:11:24
はぁ?
693デフォルトの名無しさん:2010/04/24(土) 16:13:27
void* p = malloc(sizeof(void*));
p = &p;
694デフォルトの名無しさん:2010/04/24(土) 16:15:19
int a;
int*p=&a;
int**p2=&p;
int***p3=&p2;
695デフォルトの名無しさん:2010/04/24(土) 16:22:12
マジレスするとポインタだのポインタのポインタだのは本質じゃない。
動的に確保されたメモリはヒープ領域に格納される。
ポインタの指す実体はスタックにある場合もヒープにある場合もある。
それだけの話。
696デフォルトの名無しさん:2010/04/24(土) 16:46:31
>>693 ← ヒープに格納される場合
>>694 ← スタックに格納される場合
697デフォルトの名無しさん:2010/04/24(土) 16:51:46
どちらもポインタのポインタ自体はスタックに保持されている件について
しかも、ポインタのポインタの直接指す先もスタック
ポインタのポインタを二度脱参照した先はヒープとスタックの差があるけども
698デフォルトの名無しさん:2010/04/24(土) 16:53:12
>>697
>どちらもポインタのポインタ自体はスタックに保持されている件について

何言ってるの?
699デフォルトの名無しさん:2010/04/24(土) 16:58:45
ポインタってのは変数やそこに格納されている値の事であって
ポイント先の領域を指す言葉では無いでしょ
700デフォルトの名無しさん:2010/04/24(土) 16:59:28
>>693のヒープ上に記憶されるのはアドレスであってポインターではないんだな。
701デフォルトの名無しさん:2010/04/24(土) 17:01:28
>>699
その説明は違う。
ポインタってのは変数であって、そこに格納されている値はアドレス。

>>693のpに格納される値*pは、アドレスであってポインタではない。
702デフォルトの名無しさん:2010/04/24(土) 17:04:37
じゃあヌルポインタは変数なのかと小一時間
703デフォルトの名無しさん:2010/04/24(土) 17:13:37
ヌルポインタは値が0のポインタ変数だろ。間違いなく変数だ。
704688:2010/04/24(土) 17:20:39
>>690
thx
705デフォルトの名無しさん:2010/04/24(土) 17:36:05
>>703
え?
706デフォルトの名無しさん:2010/04/24(土) 17:41:43
>>705
えっ
707デフォルトの名無しさん:2010/04/24(土) 18:01:36
ヌルポインタは「ヌルポインタ定数を適当なポインタ型にキャストしたもの」と規格で定義されているが
708デフォルトの名無しさん:2010/04/24(土) 18:02:18
いや、キャストに限定してるわけじゃなく、
何らかの変換を行ったもの、だな
709デフォルトの名無しさん:2010/04/24(土) 18:11:20
An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.
710デフォルトの名無しさん:2010/04/24(土) 18:44:05
If a null pointer constant is converted to a pointer type,
the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
711デフォルトの名無しさん:2010/04/24(土) 20:15:58
Welcome to underground.
712デフォルトの名無しさん:2010/04/24(土) 20:23:22
linuxで遊ぶようなプログラミングをC++でしたいのですが、
何かおもしろそうな事ありませんか?
713デフォルトの名無しさん:2010/04/24(土) 20:28:04
>>712
MMOのサーバーを作るのが面白そうだな
714デフォルトの名無しさん:2010/04/24(土) 20:36:25
>>712
デバイスドライバー
715デフォルトの名無しさん:2010/04/24(土) 20:39:56
webから何か情報を取って来て
データマイニングするとか
716デフォルトの名無しさん:2010/04/24(土) 22:15:13
>>713
何それ?
717デフォルトの名無しさん:2010/04/24(土) 22:17:26
お前らはC++プログラミングをする時に、何を使っていますか?
718デフォルトの名無しさん:2010/04/24(土) 22:18:49
719デフォルトの名無しさん:2010/04/25(日) 00:05:36
即答ワロタ
720デフォルトの名無しさん:2010/04/25(日) 00:12:15
>>717
エディタかな、やっぱ。
721デフォルトの名無しさん:2010/04/25(日) 00:18:47
紙もよく使うよ
722デフォルトの名無しさん:2010/04/25(日) 00:51:16
>>717
PCは必須かな
723デフォルトの名無しさん:2010/04/25(日) 05:38:15
int型の変数を割ったとき切り上げする方法を教えてください。

int a=100;
int b=30
int c;

c=a/b;  ←cに4が入るようにしたい!
724デフォルトの名無しさん:2010/04/25(日) 06:30:58
c=(a+b-1)/b;
725デフォルトの名無しさん:2010/04/25(日) 07:28:15
726デフォルトの名無しさん:2010/04/25(日) 08:00:37
>>724
こういう発想がパッと出てくるかどうかって、とても大事だよな
727デフォルトの名無しさん:2010/04/25(日) 08:10:59
>>726
とてもかどうかは知らんが大事。
728デフォルトの名無しさん:2010/04/25(日) 08:19:23
>>726
いやこれは定石手だろ

1.7 整数除算で端数切り上げ(商のみ) | 株式会社きじねこ
ttp://www.kijineko.co.jp/tech/cpptempls/integer/ceil.html
729デフォルトの名無しさん:2010/04/25(日) 08:34:39
/演算の規則覚えたての初心者だとしても、切り上げはどうするんだろうって考え始めてから30秒以上かかるようじゃセンスないよ。定石とかそういうレベルじゃない
730デフォルトの名無しさん:2010/04/25(日) 08:47:27
定石として知ってるから書ける人間と、知らなくても書ける人間がいんだよな。
731デフォルトの名無しさん:2010/04/25(日) 08:49:03
>>729
センスの問題じゃなくて数学力・・・というか理系力の問題だろう。
732デフォルトの名無しさん:2010/04/25(日) 08:52:26
>>731
>>730 って事じゃね?そういう意味で、同じ言葉で表すなら
数学力/理系力のセンス
733デフォルトの名無しさん:2010/04/25(日) 08:52:53
実の無い潰しカキコはヤメレや無能ども
定石とか言ってる間抜けはsize_tでないのに負数とか気に成らんのか?
734デフォルトの名無しさん:2010/04/25(日) 09:10:29
むしろ
/演算の規則覚えたての初心者にこそ
自力で挑戦してもらいたいところだな。
735728:2010/04/25(日) 09:12:49
>>733
> size_tでないのに負数とか気に成らんのか?
何だ?お前頭おかしいの?
736デフォルトの名無しさん:2010/04/25(日) 10:10:25
除数か被除数のどちらかが負だと
割り算の商の丸め方向が規格で定義されてないんだっけ
C99ではされてるけど
737デフォルトの名無しさん:2010/04/25(日) 10:33:07
>>733
size_tはunsignedの代わりではありません
738デフォルトの名無しさん:2010/04/25(日) 10:48:54
>>736


BohYoh.com−C/C++ FAQ 負数に対する除算の結果がおかしいのはどうしてですか。
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00134.html
739デフォルトの名無しさん:2010/04/25(日) 11:04:00
728は頭おかしい
740デフォルトの名無しさん:2010/04/25(日) 12:13:22
qtで何も表示されていないwindowを作ったんだけど、
そのメモリ領域だけを壊すコードを作りたい

何でこんな意味の無いコードを書きたいかというと、
面白そうだから
741デフォルトの名無しさん:2010/04/25(日) 15:27:36
超初歩的な質問で申し訳ないのですが
rand関数で1から10までと指定すると
1と10は含まれるのですか?それとも2〜8が選択されるのでしょうか
742デフォルトの名無しさん:2010/04/25(日) 15:36:51
標準ライブラリのrandはそもそも範囲の指定はできず、0〜RAND_MAXまでの値が返るけど
それとは別の話?
743デフォルトの名無しさん:2010/04/25(日) 20:59:01
入門書読み終わった段階で次何していいか質問したんですが、Qtっていうライブラリーの
サンプル読めと言われました これってネタ?マジ? ネタかどうかわからないですが・・・
最近まで他の入門書とか読んでてやっと次の段階いけるかなってなりました
744デフォルトの名無しさん:2010/04/25(日) 21:00:53
>>743
言った本人に聞けよ。
745デフォルトの名無しさん:2010/04/25(日) 21:01:51
>>743
言った本人には何か考えがあるのかもしれないが
真面目にレスさせてもらうと、それはもうちょい先にするべきかもしれない
746743:2010/04/25(日) 21:06:48
いった本人って数人同意してきたからネタかと思ったんですが・・・
適当にサンプル漁ってみたりしたらいいんですかね?
747デフォルトの名無しさん:2010/04/25(日) 21:18:34
>>746
Qtだって立派なライブラリーだと思うから覚えて損は
ないと思うけど、おれが、次は Visual C++ 2008 EE
を落としてきて C++/CLI を覚えろ、といったら、お前は
覚えるのか?とか、結局、次に何をしたいかとかは、
自分で決めるしかないだろ?
748743:2010/04/25(日) 21:39:17
その通りですね 自分で決めます ありがとうございました
749デフォルトの名無しさん:2010/04/25(日) 21:48:49
(more) effective (c++|stl)
を読みなされ
話はそれからじゃ
750デフォルトの名無しさん:2010/04/26(月) 09:29:23
それってつまり、4冊読めってことですか?
751デフォルトの名無しさん:2010/04/26(月) 10:21:20
more effective stl なんてなかった気がするから3冊じゃね?
752デフォルトの名無しさん:2010/04/26(月) 20:56:57
()が0個以上という意味なら6冊
(1)effective
(2)effective c++
(3)effective stl
(4)more effective
(5)more effective c++
(6)more effective stl

()が1個以上という意味なら2冊
(1)more effective c++
(2)more effective stl
753デフォルトの名無しさん:2010/04/26(月) 21:11:10
>>752
C/C++準拠の正規表現で書けよ。
・・・あ、まだ導入されてないんだったか。
754デフォルトの名無しさん:2010/04/26(月) 21:23:49
0xにregexはあるが
755デフォルトの名無しさん:2010/04/27(火) 22:41:54
ここの住人のみんなは何ヶ月で、Cをマスターした??

俺の友達は10日間でマスターしたらしいんだが、そんなに簡単なの?
756デフォルトの名無しさん:2010/04/27(火) 22:49:19
文法だけならセンスがあれば1日
757デフォルトの名無しさん:2010/04/27(火) 23:00:33
他の言語知ってるなら1日
758デフォルトの名無しさん:2010/04/27(火) 23:02:08
>>755
> 俺の友達は10日間でマスターしたらしい
それは小学生が言う「俺は幽霊が見えるんだぜ」と同じで眉唾物。
C言語をマスターしているヤツなんて世界に何人だよおいw
てな話になってしまう。
マスターのレベルを下げて、
文法+標準ライブラリをそこそこ使えるってなら
センスありで仕事の傍らで1ヶ月、
センス普通で仕事の傍らだと4ヶ月
センス無しで仕事の傍らだと12ヶ月
ってところじゃないかな。
759デフォルトの名無しさん:2010/04/27(火) 23:03:35
ちなみにC++になると突然
文法・仕様・概念が変態化し、
仕事の傍らでセンス普通で数年越しのプランになる。
760デフォルトの名無しさん:2010/04/27(火) 23:05:10
Rubyの文法は3日で覚えたけど
Java/C#/Rubyあたり覚えてたらC++も同程度で覚えれるんじゃね
761デフォルトの名無しさん:2010/04/27(火) 23:08:52
俺はC++を知っている上でPythonやったら
確かに3日ぐらいだった。

だがC++は他とは一千を画す変態仕様だと思うぞ。
センスありでも仕事の傍らでは1年はかかると踏んだ。

762デフォルトの名無しさん:2010/04/27(火) 23:12:11
>>755
他の人も言ってるが、他言語などを普段使っていて良く慣れていて、だとか
自分のやりたい事をコードに落とすのに、どうしたらいいだとかの地図が見えているような人が、
頭の中で文法を置き換えて、あるいはロジックの組み方を置き換えて、書ける様になるまでだって時間がかかる。

そして 「何日でマスターした」、って台詞にはでっかい欠陥がある。
それは 「何を持ってマスターしたって話なのか」 って事だ。

その友達に 何が出来る?とか、何を作った?とか、これってどうすれば出来る?って聞いてみな。
何を聞いても答えられて、その場でコード書いて見せられるようなら、きっと本当にマスターしたんだと思うぜ

本を読んで理解できたとか、サンプルコードコピペして動かして上手く動かせた、って話だったら
黙って笑顔だけ返してあげればいいよ
763デフォルトの名無しさん:2010/04/27(火) 23:18:21
嗤えばいいと思うよ
764デフォルトの名無しさん:2010/04/27(火) 23:28:45
C言語で一つの簡易アプリケーションを作るのでさえ
10日間ぐらいかかりそうだがwww

>>763
eva名言
765デフォルトの名無しさん:2010/04/28(水) 10:46:21
マスターしたって自称するやつでそれに値するやつ一人も見たこと無い。
CにしろC++にしろ、OOPにしろ、だ。
フツーの感性ならやればやるほど、
正確に理解し切れてない部分があることに気がつく。
766764:2010/04/28(水) 12:11:47
>>765
> やればやるほど、正確に理解し切れてない部分があることに気がつく。
また名言やな。
お前ら良い事ばっか言うな。
767デフォルトの名無しさん:2010/04/28(水) 20:04:41
C++はじめて10年以上経つけど
未だに知らないことあるわな
768デフォルトの名無しさん:2010/04/29(木) 11:54:16
よーし、じゃあ俺から不明瞭部分言っちゃうぞ。

1) constメソッド内での、メンバ変数アクセスはどう制限されているか。
2) *NULLとは何か。
3) リファレンスの使いどころ。[]オーバーロードの返り値しか思いつかない。
4) コンストラクタで例外投げたらどうのこうの。
5) メソッドポインタとその使用。staticなやつじゃなくて。
769デフォルトの名無しさん:2010/04/29(木) 12:10:49
class A{shared_ptr<X> p;oeprator shared_ptr<X>const()const{return p;}};
weak_ptr<X> w = A;

とか?
770デフォルトの名無しさん:2010/04/29(木) 13:19:38
>>768
>1) constメソッド内での、メンバ変数アクセスはどう制限されているか。
質問の意味がわからんが、constメソッド内でメンバ変数の値を変えるコードを書くと
エラーでコンパイル出来ないけど、これで答えになってる?

>2) *NULLとは何か。
一般保護違反。

>3) リファレンスの使いどころ。[]オーバーロードの返り値しか思いつかない。
関数にオブジェクトを渡すとき、値渡しするとコピーが発生する。大きなオブジェクトだと高コスト。
ポインタを渡すとコード見たとき値かえてるのかって勘違いする。

>4) コンストラクタで例外投げたらどうのこうの。
知らん。

>5) メソッドポインタとその使用。staticなやつじゃなくて。
STLでアルゴリズムにメソッドを渡したいときに使う奴ってこれじゃなかったっけ。
771デフォルトの名無しさん:2010/04/29(木) 13:26:20
>>770
4)
コンストラクタで例外を投げても問題ない。対応するデストラクタの{}内が呼ばれないだけで、メンバおよび派生元のデストラクタは呼ばれる。newでもdeleteされるのでリークしない。
772デフォルトの名無しさん:2010/04/29(木) 13:34:44
>2) *NULLとは何か。
未定義
773デフォルトの名無しさん:2010/04/29(木) 13:35:41
>>768
1)はあれだ、内部的にはthisがconstになるとかどうとか。
メンバ変数へのポインタを返したりもできないとかどうとか。
774デフォルトの名無しさん:2010/04/29(木) 16:18:15
ここで聞くべきなのか分かりませんが
コンソール上でfgetcなどで標準入力からの入力を待っている際に、ユーザーが編集可能な文字列をコンソール上に表示させたいのです。
つまりヒストリ機能を実装したいのですが、どういう関数を使えば良いのでしょう。
readline等は使わない本来的なやり方を教えてください。
775デフォルトの名無しさん:2010/04/29(木) 17:42:49
pthread_create
776デフォルトの名無しさん:2010/04/29(木) 21:33:21
本来的?(゚Д゚)
777デフォルトの名無しさん:2010/04/30(金) 00:11:58
>>774
実際どうやっているんでしょうね。bash とかみてみようか。
778デフォルトの名無しさん:2010/04/30(金) 00:20:53
カーソル移動とかバックスペースとかのコントロールコードをコンソールに
出力しているだけだと思うのですが。
779デフォルトの名無しさん:2010/04/30(金) 00:22:10
入力の待ち受けと表示が並列に動いているように見えるけど、どうなってるんだってことでしょ。
780デフォルトの名無しさん:2010/04/30(金) 00:23:30
class hoge{
....
}
として、メイン関数で
hoge h;
for(i=0;i<100;i++){
h.print();
}

return 0;

となっているときにデストラクタを設定するとどこで働きますか?
781デフォルトの名無しさん:2010/04/30(金) 00:25:43
return 0;の後、メイン関数を抜けた時。
782デフォルトの名無しさん:2010/04/30(金) 00:27:31
>>781
ありがとうございます。for回るごとにデストラクタを働かせたい場合はどうしたらいいでしょうか?
783356:2010/04/30(金) 00:29:21
forの中に入れればいい。
自動変数のデストラクタは、定義されたスコープ(ブロック)を
抜けるときに実行される、と覚えておけばいい。

for(i=0;i<100;i++){
hoge h;
h.print();
}
784デフォルトの名無しさん:2010/04/30(金) 00:34:30
>>783
ありがとうございます。
785デフォルトの名無しさん:2010/04/30(金) 00:43:57
>>779
みえねーよ
786デフォルトの名無しさん:2010/04/30(金) 15:12:39
http://www1.axfc.net/uploader/Sc/so/108762

構造体使って分割ファイル作ったんですが関数がうまくいきません
どこが悪いか教えてください
787デフォルトの名無しさん:2010/04/30(金) 15:24:54
>>786
まさかとはおもうんだが
void mem(str p);
void show(str p);
これ呼び出しのつもりなのか?ww
788デフォルトの名無しさん:2010/04/30(金) 15:36:23
>>786
「構造体使って分割ファイル作った」 ってのが良くわからないが、
とりあえず修正してみた。 >>787 も言っているのは、ここ。

http://codepad.org/ChrCi1XX

※見づらかったので一部書き換えてある
789デフォルトの名無しさん:2010/04/30(金) 16:05:47
・C++ならtypedefするまでもないじゃないか。
・公開したい関数以外は静的にしておきましょうよ。
・オブジェクトとポインタを1行で宣言するのはやめた方がいい習慣。
790デフォルトの名無しさん:2010/04/30(金) 16:09:51
>>789
三つ目はどういう事情から来るのでしょうか
前二つは分かるのですが三つ目の意味が分かりません
ちなみに私は元の質問者ではありません
791デフォルトの名無しさん:2010/04/30(金) 16:12:40
>>790
俺は 788 だけど、こういう事じゃね?

 int* a, b; // ← 紛らわしい

792デフォルトの名無しさん:2010/04/30(金) 16:15:04
ちなみに >>791 の例は、「1行で宣言する習慣はやめたほうがいい」 の例な。
元の質問者のソースとは形は違うけど、紛らわしさは同じ。

int *a と int b を一緒に書いちゃうと紛らわしい、って話
793デフォルトの名無しさん:2010/04/30(金) 16:19:29
>>791
なるほどいわれてみれば確かに紛らわしいです
どうもありがとうございました
794デフォルトの名無しさん:2010/04/30(金) 16:28:42
>>793
ついでに言えば、>788の例なら
--
str data, *p;
p = &data;
--
と書くよりも
--
str data;
str * p = & data;
--
と書いた方がpが不定値である期間が短くて済むと言う利点もある。
オブジェクトの生存期間を短くするためにもその方がいい。
795デフォルトの名無しさん:2010/04/30(金) 19:46:46
>>794
>str * p = & data;

こんな気持ち悪い書き方教えるな!
796デフォルトの名無しさん:2010/04/30(金) 19:59:29
質問です。
VC++のコンパイラを使える、軽いIDEに心当たりのある方は居ないでしょうか?
EeePCを使って、出先でテストコードとかを使いたいんです。
797デフォルトの名無しさん:2010/04/30(金) 20:09:51
>>796
IDEにどのくらい機能求めてるの?
エディタ使ったらどうだ?
798デフォルトの名無しさん:2010/04/30(金) 20:11:50
str data, p = &data;
でいいのでは
799デフォルトの名無しさん:2010/04/30(金) 20:12:08
>>797
最低限、Fキーでコンパイルと実行ができれば・・・。
いちいちコマンドラインからコンパイル・実行するのは面倒で。
CPadとかいいかな、と思ったんですが古いしボーランド潰れてるしでアレですし。
800デフォルトの名無しさん:2010/04/30(金) 20:18:07
>>799
ならやっぱエディタでいいと思うよ
ショートカットで設定すればそれも実現できるし、有名所は大概できるから何使うかは好みで
801デフォルトの名無しさん:2010/04/30(金) 22:02:26
規制長すぎて死にそう・・・
避難所なんで無いんだよ
802デフォルトの名無しさん:2010/05/01(土) 00:47:01
質問です。
std::string *str = new std::string();

std::string *str = new std::string;
の違いってありますか。
803デフォルトの名無しさん:2010/05/01(土) 00:48:48
ありません。
804デフォルトの名無しさん:2010/05/01(土) 05:49:47
>>799
面倒ならあきらめて重いIDE使え
軽快な環境を使うには最低限のスキルが要るんだよ
805デフォルトの名無しさん:2010/05/01(土) 08:29:58
>>799
初心者程度ならCpadで十分。
806805:2010/05/01(土) 08:36:06
一応言っとくと設定すればVCでのコンパイルできるからね
807デフォルトの名無しさん:2010/05/01(土) 08:41:19
C++で計算物理の練習をしているのですが
放物線の問題で高校物理でやったような公式で当てはめて
解析的に解く方法
ttp://yasumoto.iuhw.ac.jp/HS_phys/1-9/1-9.htm



数値計算的に解く方法がわかりません
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/HIGH/high1.html


前者はこれまでやってきたことなので、直感的にも理解できて
コレが答えを出すのに正しいものだとわかるのですが
後者は、どうしてこれが正しいのか、なぜこのソースとなるのか
というところからわかりません。
数値計算的に解く、ということを解説してる良いサイトとかご存知ないですか?
808デフォルトの名無しさん:2010/05/01(土) 08:48:51
教科書位買えよ。
809デフォルトの名無しさん:2010/05/01(土) 08:50:29
単に微分が分かってないだけとしか思えないが
810デフォルトの名無しさん:2010/05/01(土) 08:52:44
>>807
まず微積分は理解できるのか
別にニュートン法等の説明が必要な手法でもなく、
ただ単に微分して傾きをだしてそれを少しづつ伸ばしてく手法なので
Cというより高校物理と数学やりなおせって話だな

一応、数値解析と呼ばれる分野なので、この単語でぐぐって本なりサイトなりを探せばいいよ
811デフォルトの名無しさん:2010/05/01(土) 09:40:04
いまどきの子供は区分求積法とかそのへん習わないで大学に入れてもらえるのか?
812デフォルトの名無しさん:2010/05/01(土) 10:49:28
大学によっては名前が書ければOK
813デフォルトの名無しさん:2010/05/01(土) 12:28:42
変数の前に~がつくとどうなるんでしたっけ?
~の意味を教えてください
814デフォルトの名無しさん:2010/05/01(土) 12:34:20
変数の型によります
815デフォルトの名無しさん:2010/05/01(土) 12:35:14
ビット反転
816デフォルトの名無しさん:2010/05/01(土) 13:25:23
ウワー
817802:2010/05/01(土) 14:03:15
>>803
ありがとうございます。
818デフォルトの名無しさん:2010/05/01(土) 20:09:56
7zipを解凍したいと考えている
/usr/lib/p7zip/7z.soがあるんだけど、*.hじゃないとダメだよね?
819デフォルトの名無しさん:2010/05/01(土) 20:28:25
おまえが全然ダメ
820デフォルトの名無しさん:2010/05/01(土) 21:21:08
その質問じゃこちらとしても、まさに
解答のしようがない    などと申しており
821818:2010/05/01(土) 21:26:40
>>820
共有ライブラリはどうやって使うわけ?
822デフォルトの名無しさん:2010/05/01(土) 21:32:21
>>818
> 7zipを解凍したいと考えている

OK

> /usr/lib/p7zip/7z.soがあるんだけど、

OK

>*.hじゃないとダメだよね?

何が?少なくとも.soが.hじゃないのは見ればわかる。
823818:2010/05/01(土) 21:35:28
>>822
どんな関数があるかとか、わかんないじゃん
#includeする時に*.hでも、大丈夫なのか?
824818:2010/05/01(土) 21:38:33
>#includeする時に*.hでも、大丈夫なのか?
>#includeする時に*.soでも、大丈夫なのか?
825デフォルトの名無しさん:2010/05/01(土) 21:44:10
>>823
includeするのはヘッダーファイルだろ。.hかどうかは分からないが、通常.soではない。
どんな関数があるかは7z.soのマニュアルでも読めばいい。
あるいは
$ nm 7z.so
とか。
826デフォルトの名無しさん:2010/05/01(土) 21:52:46
>>818 の質問を、他人に伝わるように横から書き直してみる

>7zipを解凍したいと考えている
>/usr/lib/p7zip/7z.soがあるんだけど、*.hじゃないとダメだよね?

  ↓↓↓

>7zipを解凍する処理をC/C++で書きたいと思っている
>手元にダイナミックリンクライブラリの 7z.so があるんだけど、
>これだけあっても、ヘッダファイルが無いと書けないよね?

多分、こういう質問を言葉端折って書いてて伝わっていない事に気づいてなかったと思われ
827818:2010/05/01(土) 22:00:30
>>826
その通り
828デフォルトの名無しさん:2010/05/01(土) 22:11:22
>>827
おまえがバカだってことを証明したレスに偉そうに「その通り」とかレスしてんじゃねえよアホ
829デフォルトの名無しさん:2010/05/01(土) 22:15:45
「スレを立てるまでもない」質問をする所で、
質問をしちゃいけないとかwww

何この人wwww
830デフォルトの名無しさん:2010/05/01(土) 22:18:20
>>829
アンカーつけないとどれに言ってるのかわからん
831デフォルトの名無しさん:2010/05/01(土) 22:20:13
誰か質問するなとか書いてるっけ?
832818:2010/05/01(土) 22:21:06
結局、どうやって*.soを使えばいいんですか?
833デフォルトの名無しさん:2010/05/01(土) 22:21:49
リンクしろ
834デフォルトの名無しさん:2010/05/01(土) 22:22:55
LoadLibrary
835818:2010/05/01(土) 22:29:22
>>833
#include hogehogeはしなくていいんですね
thx
836デフォルトの名無しさん:2010/05/01(土) 22:30:31
.soってwinだとdllに相当する
また、コンパイルする時のライブラリとしても使われる

/etc/ld.so.conf.d/
に実行時に使われるようにPATHを記述したファイルを作って
/sbin/ldconfig
する
837デフォルトの名無しさん:2010/05/01(土) 22:48:28
>>835
いや、必須ではないが、現実的には普通ヘッダファイルもインクルードするだろ。
838デフォルトの名無しさん:2010/05/01(土) 22:50:22
develファイルにヘッダーが入ってるとか?
839818:2010/05/01(土) 23:13:22
>>837
/usr/includeにヘッダファイルが見当たらないもので

>>838
develってredhat系のディストリでは見るけど
今はgentooを使っているから、そんなの無いよ
840デフォルトの名無しさん:2010/05/01(土) 23:36:44
gentooが手抜きしてるだけだよ。
841デフォルトの名無しさん:2010/05/01(土) 23:40:38
7zip単体で使うような構成みたい
その知識で7zip使って何やりたいんだか?
842818:2010/05/01(土) 23:46:31
>>841
*.zipと*.rarを解凍したいんだよ
testってディレクトリを作って、さらにディレクトリを作り
その中にエロデータを解凍したいわけ
843デフォルトの名無しさん:2010/05/01(土) 23:48:38
execでいいじゃん
844デフォルトの名無しさん:2010/05/01(土) 23:53:09
もしかしてそれは、シェルスクリプトをちょろちょろっと組めば
いいだけかもしれない。
845818:2010/05/01(土) 23:58:16
>>844
前にperlで作ったことがあるから、機能強化版をC++で作りたいわけ
その時は外部コマンドの呼び出しをしたので、
今回はちゃんとライブラリを使って書きたいな〜と

>>843
それって、外部コマンドの呼び出しでおk?
846デフォルトの名無しさん:2010/05/02(日) 00:03:38
おk
847818:2010/05/02(日) 11:01:21
C++でマクロを定数代わりに使っているコードがあるんですが
これって禁じ手じゃないんですか?
848デフォルトの名無しさん:2010/05/02(日) 11:05:36
>>847
たまたま同名のマクロが宣言されてたらマズいからって事?
849847:2010/05/02(日) 11:08:47
>>848
データ型が保証されていないんじゃないかな〜と
850デフォルトの名無しさん:2010/05/02(日) 11:18:27
851デフォルトの名無しさん:2010/05/02(日) 11:23:22
>>849-850
それ右辺の型の問題であって、マクロの話じゃないじゃん
マクロってプリプロセッサで置き換わるだけのものだから
852デフォルトの名無しさん:2010/05/02(日) 11:33:38
Cと互換性持たせたいコードの場合はマクロ使う
そうでない場合は積極的にconst使った方がいい
禁じ手は言いすぎだが、
使わなくて済むならマクロは使わない方がいいし、使うべきではないと思う

型もそうだけど、名前空間の概念が無いとか、同名の定義したらアウツとか
色々問題あるからねえ
853デフォルトの名無しさん:2010/05/02(日) 14:42:53
何でわざわざ、namespace test { class Hoge {}}なんて事をするんですか?
クラスの名前くらいなら、名前が衝突する可能性が低いと思うんですが
854356:2010/05/02(日) 15:53:10
そりゃ数百行で済むくらいのコードなら衝突しないだろう。
数十万行を越えると衝突しないはずがない。
機能の分類を明確にする意味もある。
855デフォルトの名無しさん:2010/05/02(日) 16:09:00
そんな事を言ったら、linuxとか作れないと思うんだけど
856デフォルトの名無しさん:2010/05/02(日) 16:54:33
OS様は一番えらいから大丈夫
名前被ったらOS様と被る名前をつけていた方が悪い
857デフォルトの名無しさん:2010/05/02(日) 18:39:49
linuxのインターフェース(システムコール)は「名前」で結合していない。
被るもヘチマもない。
858デフォルトの名無しさん:2010/05/02(日) 18:41:50
>>856
そうゆう意味じゃないだろ
数えたことないけど, どんだけシンボルがあるか > Linux
# Linux に限ったことではない
859デフォルトの名無しさん:2010/05/02(日) 18:50:06
たびたびすいません
今度はこれで構造体の初期化を外部のファイルにしたのですがセグメントエラーに
なるのですがどこが悪いのかご教授ください
http://www1.axfc.net/uploader/Sc/so/109596
860デフォルトの名無しさん:2010/05/02(日) 18:52:36
ダウンロードしてzip開くなんて面倒だからオレはパス。
codepadやpastebinなら見るけど。
861859:2010/05/02(日) 19:31:44
http://codepad.org/Pb8eFq0Z
codepadにしました。本来7個くらいの分割ファイルですが。
initのところがおかしいです
862デフォルトの名無しさん:2010/05/02(日) 19:33:14
関数ぬけたら消える変数のアドレスなんか使ってるからだろ
863デフォルトの名無しさん:2010/05/02(日) 19:44:07
>>861
>>862 も言ってるが・・・

void init(str *p)
{
 str DATA; // static にするか、グローバルにするかしないと関数抜けたら捨てられる領域
 〜省略〜
 p=&DATA; // 抜けて捨てられる領域を返している
}

怖い処理するなw
864デフォルトの名無しさん:2010/05/02(日) 19:44:15
仮引数に代入してるから何も変化してないの方だと思う
その後のアクセスで落ちてる

まぁ>>862の指摘してる勘違いも持ってはいるなそうだが・・・・・・
だだ>>862の指摘はおかしい、代入した変数も消滅してるからなwwwww
865デフォルトの名無しさん:2010/05/02(日) 19:46:27
>>863
その関数は怖くないよ
無意味なだけでwww
866デフォルトの名無しさん:2010/05/02(日) 19:50:47
そうだ・・ これ仮引数への代入じゃん・・・ ポインタポインタじゃなかった
俺も釣ってくるwwwwwwwwwwwwwwwwwwwwwwwwwww
恥ずかしいわ
867デフォルトの名無しさん:2010/05/02(日) 19:58:11
具体的にどうすればこの形を保ったまま動きますか?
868デフォルトの名無しさん:2010/05/02(日) 20:05:08
>>867
いろいろ理由は省くがこの形を保って動作させるのは不可能
どこか変えないとだめだ

ttp://codepad.org/WBeUPiQa
こういう感じが一番無難かなぁ・・・・
869デフォルトの名無しさん:2010/05/02(日) 20:05:19
関数の宣言を保ったままって意味なら無理じゃね

void init(str **p)
{
 static str DATA;
 *p = &DATA;
}

とかしなきゃ無理じゃね。で、メインはこう

int main(int argc, char** argv)
{
 str *p;
 init(&p);
}
870デフォルトの名無しさん:2010/05/02(日) 20:11:58
ありがとうございます
main関数に入れたほうが見やすくなりそうですね
871デフォルトの名無しさん:2010/05/02(日) 21:50:59
「全てのメソッドはクラスの属する」考えのjavaを勉強したわけですが
C++でもほぼ全ての関数をクラスに属させようとしている俺はバカですか?

Qtはほとんどの関数がクラスに属しているので、C++でもおkな気がする
872デフォルトの名無しさん:2010/05/02(日) 21:57:57
>>871
> C++でもほぼ全ての関数をクラスに属させようとしている俺はバカですか?
バカとは言わん。別に良いと思うよ。
ただ、カプセル化という考え方を知っているか?
そしてメンバ関数とメンバでない関数でどっちでも同じ事ができるから
どっちにしようか迷った場合は、メンバでない関数を選ぶべきと言うのが
一応のC++の推奨される考え方。
(『Effective C++』 Scott Meyers著 参照ね。)
873デフォルトの名無しさん:2010/05/02(日) 22:00:04
>>871
別にいいんじゃない?
ほぼってのが、メンバ関数にしない方が良いケースならそうするって意味ならいいが
限界まで無理やり所属させる気でいるならすこし問題がある
874873:2010/05/02(日) 22:00:57
なんという劣化説明・・・・・・・
875872:2010/05/02(日) 22:01:05
追記
>>871
メンバ関数でしかできない処理の場合はもちろんメンバ関数にすべきであるがね。

あと、C++には
オブジェクト指向のC++(クラス, 継承, etc)
といった使い方以外にも、
TemplateのC++(STLやTemplate MetaProgrammingとか)
という側面もあったりするので、色々勉強なさってください。
876デフォルトの名無しさん:2010/05/02(日) 22:01:23
int型の変数を直接ビット演算子使って操作するのと、
C++のbitsetを使うのでは速度に差が出たりしますか?
それとも内部的にはやってることが同じなのでほとんど変わりませんか?
同様に連結リストとvectorでは速度に差が出たりしますか?
877デフォルトの名無しさん:2010/05/02(日) 22:27:30
あなたはなぜ実測しないのか?
878デフォルトの名無しさん:2010/05/02(日) 22:33:56
めんどいからと、実測するのに効率的なサンプル構文の書き方が分からないから
879デフォルトの名無しさん:2010/05/02(日) 22:39:39
では死んでください
880デフォルトの名無しさん:2010/05/02(日) 22:43:32
>>876
前半はともかく
後半みたいな質問するとか、list と vectorで何が違うのかを知らないのか?
881デフォルトの名無しさん:2010/05/02(日) 22:46:38
Visual C++ で普通にフォームを作って ボタンなど配置すると、 コードの中に
this -> が、たくさんでてきます。 一応オブジェクト指向はすこし理解していますが、
このThisってどこで定義されているんでしょうか?またthisの意味を教えてください
882デフォルトの名無しさん:2010/05/02(日) 22:50:07
>>881
それよりC++の本でも読んでC++の仕様を理解して下さい
そのインスタンスのアドレスです、thisの定義文はどこにもありません
883デフォルトの名無しさん:2010/05/02(日) 22:50:37
>>880
線形と双方向だろ?
で、速度は?
884デフォルトの名無しさん:2010/05/02(日) 22:52:42
「thisポインタ C++」でググったら?
885デフォルトの名無しさん:2010/05/02(日) 22:53:45
>>883
メモリの連続性から自明だろ。
886デフォルトの名無しさん:2010/05/02(日) 23:02:27
>>882


>>インスタンスのアドレス

ありがとうございました!!
887デフォルトの名無しさん:2010/05/03(月) 10:40:43
整数値を3つ持つ配列(「整数値を3つ持つ構造体」の配列?)をソートしようとしたら、
比較関数を自分で作れと言われて大変なショックを受けました。

なんでC++はこんなに面倒くさいんですか?
Pythonなら簡単に書けるのに‥。

ちなみにPythonではなくC++を使う理由は、modを作りたいゲームが
C++を採用していて、選択の余地がないからです。
888デフォルトの名無しさん:2010/05/03(月) 10:44:09
C++からPython呼べばいいんじゃないですか?
889871:2010/05/03(月) 11:01:13
>>872-873
thx
890デフォルトの名無しさん:2010/05/03(月) 11:11:39
>>887
C++が面倒くさいんじゃなくて、Pythonが簡単過ぎると気づいて欲しい
891デフォルトの名無しさん:2010/05/03(月) 11:13:55
>>887
ソートについても比較関数を使って比較方法を変更できるようにしてある。
そういう風に、できる範囲が広いぶん面倒になっている。
892デフォルトの名無しさん:2010/05/03(月) 11:16:53
>>887
そのめんどくささも少し慣れれば、std::less<int>()とか体が自然に入力してくれるようになるから問題ない。
893デフォルトの名無しさん:2010/05/03(月) 11:22:45
>>887 は、C/C++でのコーディングはPythonでコーディングする人の立場よりも、
Python.exe を作る人の立場に近いって事に気づいていない様子。
同じ立場の言語じゃないんだぜ。

Python言語を作ったベンダが、その面倒くさい処理をPythonユーザの代わりにやってくれてるから簡単なだけ。
C/C++でのコーディングは、その辺を全部自分でやらないといけないけど・・・ 探せば >>892 も言うようなライブラリもあるんだぜとヒント。
探すっていうか、標準だけど。 ただ、まったく何も知らない状態だったら、それ自体勉強して理解しないと多分無理
894デフォルトの名無しさん:2010/05/03(月) 11:38:28
>>888
失礼しました。
それをやると遅くなるし、そもそもこんな基本的な操作で外部処理を呼び出すというのは
スマートではない気がして、できればやりたくありません。

ほとんど自己流の日曜プログラマなので、とりあえずC++での一般解はどうなのか
知りたくてここにやってきました。


>>890-893
ふむう〜。
低級言語と高級言語の違いってことでしょうか。

とりあえずstd::lessというのを調べてみます。
ありがとうございました。
895デフォルトの名無しさん:2010/05/03(月) 11:40:59
イラっとするわ
896デフォルトの名無しさん:2010/05/03(月) 12:01:04
C++でもjavadocみたいな感じでコメントを書いていますが、
お前らは*.hと*.cppのどちらにコメントを書いていますか?

やっぱり、doxygenとかを参考にしたほうがいいのかな〜
897デフォルトの名無しさん:2010/05/03(月) 13:05:35
>>887
VC++2010ならラムダ式が使えるよ
898デフォルトの名無しさん:2010/05/03(月) 13:17:19
ヘッダファイルに変数を定義しないで、*.cppの上部に変数を宣言しているコードがあります。
何でヘッダファイルに定義をしないで、*.cppだけに宣言して大丈夫なんですか?
899デフォルトの名無しさん:2010/05/03(月) 13:18:22
#includeが何をするものなのか理解しているのか
900デフォルトの名無しさん:2010/05/03(月) 14:22:59
なんでヘッダに変数定義しちゃうんだ
901デフォルトの名無しさん:2010/05/03(月) 17:08:30
ヘッダファイルをヘッダと略すな
902デフォルトの名無しさん:2010/05/03(月) 17:37:24
宣言と定義が逆になってるのかな?
903デフォルトの名無しさん:2010/05/03(月) 18:50:19
ifの || ってキーボードの何処押せばよいんでしょうか?
毎回コピペしてますんで直接打ちたい

904デフォルトの名無しさん:2010/05/03(月) 18:52:06
backspaceの左らへん
905デフォルトの名無しさん:2010/05/03(月) 19:05:06
>>904
Shift押して\マークですか…
キーボード上じゃ線が真中で切れてるから解りませんでした。
コピペ卒業できました、ありがとう。
906デフォルトの名無しさん:2010/05/03(月) 19:07:33
STLで、

vector<int> IntA;
vector<int> IntB;

// 各vector配列に要素を追加
・・・

IntA = IntB;

とした場合、IntBの各要素がIntAの各要素にハードコピーされるのでしょうか?
それとも、ポインタ的な交換が行われるだけで、要素の多少に関わらず、代入のコストは同じなのでしょうか??
907デフォルトの名無しさん:2010/05/03(月) 19:11:59
バッファサイズが足りてれば各要素の代入
足りてなければリサイズして各要素の代入
908デフォルトの名無しさん:2010/05/03(月) 19:34:34
ハードコピーというかディープコピー?
909デフォルトの名無しさん:2010/05/03(月) 19:56:13
ディープコピー
http://codepad.org/9aKSOg8D
910906:2010/05/03(月) 22:21:35
>>908
失礼しました(汗)
おっしゃる通り、ディープコピーのことです。

>>907
>>909
ありがとうございました。
スッキリしました。
(そのサイト、便利ですね!)
911デフォルトの名無しさん:2010/05/04(火) 11:39:46
0が数値かNULLかを区別する方法を教えてください
912デフォルトの名無しさん:2010/05/04(火) 11:40:25
ない
913デフォルトの名無しさん:2010/05/04(火) 11:47:42
int *i = NULL;
int x = 0;
i = &x;

の時、

if(i==NULL) {
 // i はNULL
} else if((*i)==0) {
 // i(の示す先の値)は0
}

単に 「0が数値かNULLか」 って質問だと解無し。(NULL=値0)
914デフォルトの名無しさん:2010/05/04(火) 11:52:45
0は数値でありヌルポインタ定数でもある
どちらとして扱われるかは、代入や比較の対象によって決まる
915911:2010/05/04(火) 11:53:43
>>913-914
thx
916デフォルトの名無しさん:2010/05/04(火) 11:55:48
数値の0とヌルポインタ定数はあくまでも全く別の概念であって、
コード上の表記のやり方がたまたま同じになってるだけ
(けど賢いコンパイラが文脈から判断して峻別している)
ってこと?
917デフォルトの名無しさん:2010/05/04(火) 11:58:59
0 だけじゃなくて 1-1 だってヌルポインタ定数だし
4*0 だって (9+4*5)/300 だってヌルポインタ定数だぜ
918デフォルトの名無しさん:2010/05/04(火) 12:00:47
>>916
C FAQのヌルポインタの項とか読んどけ
919デフォルトの名無しさん:2010/05/05(水) 07:58:42
class AnimDraw{

struct animpat{
vector<int> ghlist;
int anigap;
anipat(){anigap=1;}//コンストラクタ
}
vector <anipat> aplist;

public:
animDraw(){
aplist.push_back(anipat());//ひとつめのanipatをセット
}
};

とある本に載ってるコードなのですが
push_back()って一番最後に要素を追加するって関数ですよね?
なぜanipat()というコンストラクタを入れて機能するんでしょうか?
返り値ないですよね?

920デフォルトの名無しさん:2010/05/05(水) 09:25:07
関数中でその表記を見かけたら
それはコンストラクタを関数として呼んでるんじゃなく
一時オブジェクトを生成しているんだお
偉い人がそう書けって決めたんだお
一時オブジェクトとかテンポラリオブジェクトでググれば詳しく出てくるお
921デフォルトの名無しさん:2010/05/05(水) 09:47:11
なるほど、そんな機能があったんですね
ありがとうございました 勉強になりました
922デフォルトの名無しさん:2010/05/05(水) 12:12:33
GUIアプリをC++で作れるかと思い調べていたのですが
WIN32API / MFC / .NET という種類がある中でどうも違いが分からず。

.NETで、C++のコードを組み合わせて作れそうだとおもったのですが
これらの入門的なサイトなどありましたら教えていただけますか
923デフォルトの名無しさん:2010/05/05(水) 12:19:09
>>921 そんな機能って、別に特別な訳じゃないぜ

int a = 123;        // ← 普通の代入
int b(123);         // ← コンストラクタ
int(123);          // ← 名前の無い一時オブジェクト

int c = int(123);      // ← 一時オブジェクトを生成してコピー
int *d = new int(123);  // ← int でも new 演算子で
924デフォルトの名無しさん:2010/05/05(水) 12:24:03
>>922
windowsの話だとして

win32API … OSが持っている膨大な関数群。Windowsのソフトウェアにとって全ての大本
MFC … win32API関数群をラッピングしたマイクロソフト謹製のクラス集。VC6時代を最後にほぼ廃れている。

.NET … 上記2つと全然別物。上2つがネイティブコード、C/C++の世界だとすると .NET は管理された中間言語の世界。
     VMによって管理され実行される Javaに似た世界。 まったく別物。

925デフォルトの名無しさん:2010/05/05(水) 12:27:24
>.NETで、C++のコードを組み合わせて作れそうだ

やろうと思えば出来ると言えば出来るけど、それは C++ と言うより
C++/CLI という別言語を使う事になるので誤解しないように。
.NET使ったCLIによる実装は、よっぽど何か事情がある場合か、
あるいは予めそれが普通のC++ でない事を知った上で物好きが使う物。
926デフォルトの名無しさん:2010/05/05(水) 12:27:27
第三者だが、これは分かり易い説明で感謝。
これからは.NETが主流になるのかな。

しかし、C++/CLIは分かりにくかったぞ・・・
927デフォルトの名無しさん:2010/05/05(水) 12:38:41
C++/CLI はC++と言うよりむしろ C# のコードを C++風に書けるだけ
コンパイルして出来る exe 自体、ネイティブじゃない
928デフォルトの名無しさん:2010/05/05(水) 12:38:42
.NET+C#で、早くしたいところはDLLとかで補う感じ?
929デフォルトの名無しさん:2010/05/05(水) 12:59:56
>>928
最終的にネイティブDLLとのやりとりで間にマーシャリングが必要になるから、
単純にそうすれば早くなるとは言えない。 というか、もうその辺の話はスレチ
930デフォルトの名無しさん:2010/05/05(水) 13:06:13
.NetやるならくらいならQt使うわ
931デフォルトの名無しさん:2010/05/05(水) 13:21:26
>>924-
みなさんありがとうございました。
openglを使ったGUIアプリを作ろうと思っていたので
C++ということしか頭にありませんでした。
違いがよくわかりました。

openglでお絵かきソフト的なIFつけるとなると…どうしたらいいんだろうか…
932デフォルトの名無しさん:2010/05/05(水) 13:27:22
>>931
glut でも使えば?と言うかOpenGLはただの C向け3D描画関数群なので
ソフトのUI なんて話になると、そもそもOpenGL以前にそのターゲットプラットフォーム上で何らかの手段で
それが構築出来ないと話にならないので、自分で動き理解した上で考えてググった方がいい
933デフォルトの名無しさん:2010/05/05(水) 13:37:54
>>932
なるほど。仰るとおりですね。
glutは以前使っていたのですが、コンソールでの利用しかしておらず

windowsしか考えていないのでwindows上でいかに構築して
そこにopenglをぶち込めるかで検討しろということですよね。
934デフォルトの名無しさん:2010/05/05(水) 13:46:47
そういう事。win32でボタンクラスをCreateWindowして張り込んでウィンドプロシージャでさくっと処理してもいい、
ごちゃごちゃして面倒だったり、物量多そうなら Qt だとか wxWidget だとかを利用してもいいしって感じ
935デフォルトの名無しさん:2010/05/05(水) 22:34:08
strlenはなぜextern "C"をしなくても、C++で使えるのですか?
936デフォルトの名無しさん:2010/05/05(水) 22:45:44
string.h にはちゃんと extern "C" って書いてあるよん
937935:2010/05/05(水) 22:47:45
>>936
そうでしたか、ありがとうございます
938デフォルトの名無しさん:2010/05/05(水) 22:57:27
std::priority_queueでポインタを格納:ポインタの指す先の優先度でソートしたいんですが、どう書けば良いでしょうか?
939デフォルトの名無しさん:2010/05/05(水) 23:04:37
>>938 ググッたら一瞬で答え見つかったけど、これじゃダメなの?
http://support.microsoft.com/kb/837697/ja
940デフォルトの名無しさん:2010/05/05(水) 23:10:08
>>939
ポインタの指す先で調べたいのでどうにも・・・。
リンク先の情報を応用すれば大丈夫なんでしょうか?

コードで言うと、
std::priority_queue< Object* > Queue;
Queue.push( new Object() );
といった感じで・・・。
941デフォルトの名無しさん:2010/05/05(水) 23:16:00
オペレータオーバロードがソートの鍵なんだから
そこ応用すれば普通に出来ると思うけど
942デフォルトの名無しさん:2010/05/05(水) 23:20:29
struct Comp : std::binary_function<Object *, Object *, bool>{ bool operator () (const Object *a, const Object *b) const{/*比較*/}; };

std::priority_queue<Object *, std::vector<Object *>, Comp> q;
943デフォルトの名無しさん:2010/05/07(金) 00:44:37
構造体のアドレスを表示するにはどうしたらいいですか?
ためしに
struct a;
struct *b;
b=&a;
とやってbと&aを確認しても違うアドレスが出てきます。
そもそも構造体なのでアドレスはひとつではないと思うのですが一つしか出てこないため確認の仕方が間違ってるようなきがします。
944943:2010/05/07(金) 00:51:22
上のstructは適当な構造体です
945デフォルトの名無しさん:2010/05/07(金) 00:52:29
どういう風に確認してるんだ?
946943:2010/05/07(金) 01:02:22
http://codepad.org/j5Wbhl69
ちゃんとnewとdeleteが動いてるか確かめたくて上のようなやつ作りました
947デフォルトの名無しさん:2010/05/07(金) 01:34:50
で?

それと>>943となんか関係あるの?
948デフォルトの名無しさん:2010/05/07(金) 02:01:00
>>946
そのコードのどこに>>943のコードがあるん?
949デフォルトの名無しさん:2010/05/07(金) 07:16:43
>>943 は多分勝手な思いこみで目が見えなくなってる
950デフォルトの名無しさん:2010/05/07(金) 08:39:16
>>943
&a と b は同じになるはずだよ。
951デフォルトの名無しさん:2010/05/07(金) 11:01:14
>>950
>>944 で struct は適当な構造体と書いてあるので、
もし違う構造体なら、&a と b は同じになるとは限らないよ。
952デフォルトの名無しさん:2010/05/07(金) 11:11:52
>>943
これなら同じになるんじゃない?

/* Cなら */
struct st;
struct st a;
struct st *b;
b = &a;

// C++なら
struct st;
st a;
st *b;
b = &a;
953デフォルトの名無しさん:2010/05/07(金) 18:16:03
>>952
いや、違う型の構造体へのポインタへ代入する場合ね
954デフォルトの名無しさん:2010/05/07(金) 18:42:41
>>953
どういう意味?

struct st1;
struct st2;

struct st1 a;
struct st2 *b;
b = (struct st2*)&a;

ってこと?

それでもbと&aは同じだよね?
955デフォルトの名無しさん:2010/05/07(金) 18:58:37
struct st{};
main(){
struct st a;
struct st *b;
b=&a;
}
956デフォルトの名無しさん:2010/05/07(金) 19:01:41
struct{}a,*b;
main(){
b=&a;
}
957デフォルトの名無しさん:2010/05/07(金) 19:37:34
>>954
struct A {
int a;
};
struct B {
int b;
};
struct AB : public A, B {
}

AB ab;
B* b = &ab;

// b != &ab となる
958デフォルトの名無しさん:2010/05/07(金) 19:42:55
アップキャストとか壮大な話になってきたな。
959デフォルトの名無しさん:2010/05/07(金) 19:49:42
hogeというclassで
friend ostream& operator<<(ostream& out, hoge h);
のように宣言して、関数の中身はクラスの外に別書きする場合、書き始めはどうなりますか?
960デフォルトの名無しさん:2010/05/07(金) 19:51:30
friend ostream& hoge::operator<<(ostream& out, hoge h);
961デフォルトの名無しさん:2010/05/07(金) 20:09:53
<<960
ありがとうございます
962デフォルトの名無しさん:2010/05/07(金) 20:49:28
959
ですが、960で書き始めるとfriendがクラスの外にあるって内容の警告が出ます。
あと、must exactry take one argumentってエラーも出ました。

関数の宣言オンリーではなく、関数の中身をクラスの外に書く場合の書き方がわかる方お願いします
963デフォルトの名無しさん:2010/05/07(金) 21:04:53
friend書いちゃだめ
964デフォルトの名無しさん:2010/05/07(金) 21:35:53
>>963 そうそう頭ごなしに否定しなくても friendがかわいそうじゃないか
たとえばlhsが自クラスでは無い場合。
complex& operator+(double lhs,const complex& rhs);
たとえばlhsとrhsが対称な場合
void swap(hoge& lhs,hoge& rhs);
friendを使うのは、こんな場合にメンバを外部に晒さずに実装できること。
965デフォルトの名無しさん:2010/05/07(金) 21:38:29
>>962
クラスの外がだめならクラスの中に書けばいいじゃない。
class hoge
{
friend void func1(int);
};
void func1(int)
{
}
966デフォルトの名無しさん:2010/05/07(金) 21:45:22
>>964
friend 書いちゃだめって、こういう事じゃないの?
http://codepad.org/7Ermo55E

>>961
正解はこれ。てか、なんでこんな質問でgdgdになってんだよ
967デフォルトの名無しさん:2010/05/07(金) 21:47:11
>>960 の時点で丸ごと間違い
968デフォルトの名無しさん:2010/05/07(金) 22:13:52
>>966,965
ありがとうございます
クラスの外に書くときにフレンドは要らないとわかったのですが、
voidではなく、istreamやostreamなどの場合も有効でしょうか?
must take exactly one argumentというエラーが出てしまいます。。
969デフォルトの名無しさん:2010/05/07(金) 22:21:58
>>964
その場合もfriend使わないだろ普通
970デフォルトの名無しさん:2010/05/07(金) 23:59:42
>>965
マリー・アントワネット風でワロタw
971デフォルトの名無しさん:2010/05/08(土) 00:00:16
そうさ・・・俺らは誰ともフレンドにはなれないのさ・・・
972デフォルトの名無しさん:2010/05/08(土) 00:01:46
俺は孤高の戦士
973デフォルトの名無しさん:2010/05/08(土) 00:04:09
孤高のプログラマはフレンドなど当てにせん
974デフォルトの名無しさん:2010/05/08(土) 00:22:26
つまり、プライベートは見せられない、って事ですね。 非リア充だけに
975デフォルトの名無しさん:2010/05/08(土) 10:25:18
#define private public
976デフォルトの名無しさん:2010/05/08(土) 11:35:00
>>975
だからそう言う未定義動作をだな…(ry
977デフォルトの名無しさん:2010/05/08(土) 11:36:51
ヘッダファイルの先頭に
#if defined(private) || defined(protected) || defined(public) || defined(class) || defined(struct)
#error you must die!
#endif
って書くべきだろうか。
978デフォルトの名無しさん:2010/05/08(土) 11:38:47
>>975みたいなのやるルーピー現実に存在するのか?
979デフォルトの名無しさん:2010/05/08(土) 16:22:05
その手の小細工するより、エディタの置換機能で
 private を public に置き換えたほうがいいかと
980デフォルトの名無しさん:2010/05/08(土) 17:31:59
singletonでgetInstanceをstaticなメンバ関数ではなく、
namespaceに属する関数で実装しているコードを発見しますた

お前らはどう思いますか?

namespace hoge {
Test getInstance();
}

class Test {
public:
Test();
~Test();
}
981デフォルトの名無しさん:2010/05/08(土) 17:42:59
>>980
諸般の事情からfriend関数で実装したのかな?と思った
982デフォルトの名無しさん:2010/05/08(土) 18:51:25
singleton の意味ねーなーとしか
でも理由は何かあるんだろうな
何だろう?
983デフォルトの名無しさん:2010/05/08(土) 19:19:34
>>980
それのどこがシングルトンなんだ?
984デフォルトの名無しさん:2010/05/08(土) 19:27:10
>>983
馬鹿なのか?
985デフォルトの名無しさん:2010/05/08(土) 19:29:31
>>983
別にこのまま書かれてた、って話じゃないと思うの
986デフォルトの名無しさん:2010/05/08(土) 19:30:41
>>984
無意味な煽りはいらんよ
987デフォルトの名無しさん:2010/05/08(土) 19:35:16
>>983
定義を省いてるだけだろうよ
988デフォルトの名無しさん:2010/05/08(土) 20:07:25
>>983 の人気に嫉妬
989デフォルトの名無しさん:2010/05/08(土) 21:27:56
え、>>980はSingletonにならないだろ…
990デフォルトの名無しさん:2010/05/08(土) 21:30:25
つまり・・・・・どういうことだってばよ?
991デフォルトの名無しさん:2010/05/08(土) 22:12:42
なんかVIPPERが紛れ込んでる予感ェ・・・
992983:2010/05/09(日) 03:35:06
>>987
それは分かるけど、>>980を見る限り、発見したというコードが
本当にシングルトンだったのかすら疑問に思えるのよ。
993デフォルトの名無しさん:2010/05/09(日) 08:35:58
唯一のオブジェクトしか扱ってないならシングルトンなんだろうと思うけど
994デフォルトの名無しさん:2010/05/09(日) 09:05:39
>>992
>本当にシングルトンだったのかすら疑問に思える
俺もうっすらそんな気はしてるw でもそれはそれとして、
質問は単にどう思うかってだけなのでどう思うかだけ答えればいいかなとw
995デフォルトの名無しさん:2010/05/09(日) 09:07:11
あ、なるほど
戻り値の型が参照でもポインタでもないわなw
996デフォルトの名無しさん:2010/05/09(日) 10:32:29
次スレ上等

スレを勃てるまでもないC/C++の質問はここで 15
http://pc12.2ch.net/test/read.cgi/tech/1273368706/
997デフォルトの名無しさん:2010/05/09(日) 10:44:31
乙乙
998デフォルトの名無しさん:2010/05/09(日) 10:45:27
999デフォルトの名無しさん:2010/05/09(日) 20:00:25
1000デフォルトの名無しさん:2010/05/09(日) 20:01:15
梅完
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。