2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2009/12/15(火) 10:56:37
スレを勃てるまでもない低俗な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/


2 :デフォルトの名無しさん:2009/12/15(火) 13:24:23
最近の小学校では台形の面積をもとめる公式も教えてないんだね

台形の面積を求めるプログラム
http://oshiete1.goo.ne.jp/qa5522539.html

3 :デフォルトの名無しさん:2009/12/15(火) 13:42:23
2点A(x1,y1)とB(x2,y2)があります
点ABを結んだ直線をCとします
点Aから直線C上を点B方向に距離xだけ進んだ点(x3,y3)を
求める式をC++プログラムで教えてください


4 :デフォルトの名無しさん:2009/12/15(火) 14:18:38
いいえ

5 ::2009/12/15(火) 15:52:44
自己解決

6 :デフォルトの名無しさん:2009/12/15(火) 17:53:51
g++&Windowsです。

#include <iomanip>
でも
#include <IOMANIP>
でも
#include <IoMaNiP>
でも問題無くインクルードできるようですが、

これは標準C++の仕様ですか?


7 :デフォルトの名無しさん:2009/12/15(火) 18:00:17
>>6
Windows の仕様です。
Linux に移植するときに泣けます。

8 :デフォルトの名無しさん:2009/12/15(火) 18:26:14
>>7
なるほど。
つまりファイルシステム自体が大文字小文字を区別しない
仕様になっているから、ということですね。
ありがとうございました。

9 :デフォルトの名無しさん:2009/12/15(火) 20:50:38
VC++2005で仕事場ではコンパイルおkなのに
自宅ではエラーが出ます。
エラーは、
fatal error C1083: include ファイルを開けません。'Src/foo.h': No such file or directory
と出ます。
同じプロジェクトを使ってるのになぜエラーが出るんでしょうか?

ソース部は
#include "Src/foo.h"
となっています。

フォルダ構成は
Project
 ¥Src
です。
Srcフォルダ内にfoo.hが確かに入ってます。
プロジェクトはフォルダごとコピーなので
プロジェクト設定に差はありません。

10 :デフォルトの名無しさん:2009/12/15(火) 21:27:48
fmtflags
っていうクラスはなんですか?


11 :デフォルトの名無しさん:2009/12/16(水) 08:42:57
屑スレが
消しとけ

12 :デフォルトの名無しさん:2009/12/16(水) 21:51:57
>>9
インクルードパスがフルパスになってないか?
その為ドライブが違うかディレクトリー構成が違っていないか?

13 :デフォルトの名無しさん:2009/12/16(水) 22:40:58
std::bad_allocを利用して例外処理をしているのですがちゃんと動作するか確認をしたいのですがどうすれば良いのでしょうか?
意図的にメモリリークなんて起こせるんですか?

14 :デフォルトの名無しさん:2009/12/16(水) 23:11:00
無限ループでリークさせまくるとか

15 :デフォルトの名無しさん:2009/12/16(水) 23:13:07
>>14
素早い回答ありがとうございます!早速試してみますね(・∀・)

16 :デフォルトの名無しさん:2009/12/17(木) 01:38:05
new char[(size_t)-1]のように明らかに確保できないほど大量のメモリを確保しようとするというのもいける。

17 :デフォルトの名無しさん:2009/12/17(木) 07:26:01
まて
メモリーリーク
の用語の認識がおかしくないか?


18 :デフォルトの名無しさん:2009/12/17(木) 17:31:31
確かにメモリリークする必要はないよな。

19 :デフォルトの名無しさん:2009/12/17(木) 17:37:32
operator newをオーバーロードして、たまにbad_alloc投げるようにするとか

20 :デフォルトの名無しさん:2009/12/17(木) 20:20:42
メモリリークとは 【memory leak】 - 意味/解説/説明/定義 : IT用語辞典
http://e-words.jp/w/E383A1E383A2E383AAE383AAE383BCE382AF.html
Yahoo!辞書 - メモリー‐リーク【memory leak】
http://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%83%AA%E3%83%BC%E3%82%AF&dtype=0&dname=0na&stype=0&pagenum=1&index=21171420429500


21 :デフォルトの名無しさん:2009/12/17(木) 20:23:21
for(unsigned int i=1;i<100;++i)
{
static unsigned long long sull=10;
sull*=sull;
new char[sull];
}
これでどうだ

22 :デフォルトの名無しさん:2009/12/17(木) 20:24:22




23 :デフォルトの名無しさん:2009/12/17(木) 21:55:16
>>21
ハンガリアンはダサい

24 :デフォルトの名無しさん:2009/12/17(木) 22:25:53
>>23
名前を考えるのもめんどくさかったんだよ!

25 :デフォルトの名無しさん:2009/12/17(木) 22:42:03
ハンガリアン無かったらWinアプリ作ときに困る

26 :デフォルトの名無しさん:2009/12/17(木) 23:30:19
>>21
だっせーーーーーーー!

27 :デフォルトの名無しさん:2009/12/17(木) 23:37:57
>>26

その調子だと生きるのもおつらいでしょう。

28 :デフォルトの名無しさん:2009/12/18(金) 13:27:57
singleton class の destractor で cout 使うのってだめなの?
borland developer studio 2006 だと実行時エラーになるんだけど
borland c++ builder 5 だと OK

#include <iostream>
class Sgtn {
Sgtn() {}
public:
static Sgtn& Inst();
~Sgtn() { std::cout << "Sgtn::~Sgtn" << std::endl; }
};
Sgtn& Sgtn::Inst() { static Sgtn inst; return inst; }
int main() { Sgtn::Inst(); return 0; }

29 :デフォルトの名無しさん:2009/12/18(金) 13:31:31
coutが先にデストラクトされてしまうとか?
グローバル変数のデストラクト順ってどうなってたっけ・・・

30 :デフォルトの名無しさん:2009/12/18(金) 13:32:48
神の味噌汁

31 :デフォルトの名無しさん:2009/12/18(金) 13:36:17
なぜかワロタw

32 :デフォルトの名無しさん:2009/12/18(金) 13:41:51
シングルトンよりカウンタ使って例外飛ばす方がクール

33 :デフォルトの名無しさん:2009/12/18(金) 14:53:46
クールミントガム

34 :デフォルトの名無しさん:2009/12/19(土) 03:35:03
C++にあってCに無い物の代表格として「参照渡し」が挙げられるわけだけど
書籍によるとC++の参照渡しは、特に呼び出し側が値渡ししてるのか参照渡し
してるのか見分けにくいことから参照渡しを多用することは慎むよう助言されている。

となるとC++ではいったいどういう風に”ポインタの値渡し”と”参照渡し”を使い分けるべきなんだろう?

まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど
果たしてそれで正しいと思う?

35 :デフォルトの名無しさん:2009/12/19(土) 04:14:43
const参照渡し以外はポインタの値渡しで

36 :デフォルトの名無しさん:2009/12/19(土) 04:45:11
>>35
> const参照渡し

これはなぜ参照渡しする必要があるの?

37 :デフォルトの名無しさん:2009/12/19(土) 10:14:33
プロジェクトによる

38 :デフォルトの名無しさん:2009/12/19(土) 12:49:00
>>34
>まあやろうと思えば”参照渡し”は片っ端から”ポインタの値渡し”に置き換えることはできるわけだけど
>果たしてそれで正しいと思う?
その書籍にはどういうときに参照渡しを使うのか書いてないの?
ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。

39 :デフォルトの名無しさん:2009/12/19(土) 13:14:40
>>38
> その書籍にはどういうときに参照渡しを使うのか書いてないの?
> ポインタ渡し、参照渡しそれぞれのメリット、デメリットを調べてみるといいよ。

うん、参照渡しの多用は自重すべきとは書いてあるけど
どういうときに参照渡しを使うべきかは詳しくは書かれてはいない(・ω・)

40 :デフォルトの名無しさん:2009/12/19(土) 13:20:43
エディタが教えてくれるから別に混乱なんかしないだろ

41 :デフォルトの名無しさん:2009/12/19(土) 13:21:04
>>39
> うん、参照渡しの多用は自重すべきとは書いてあるけど
まさかconst参照渡しまで自重しろと書いてあるの?
それなら・・・

よし!
その本をまず窓から投げ捨てるんだ!


42 :デフォルトの名無しさん:2009/12/19(土) 14:32:29
>>41
言われてみればconst参照渡しはシレっと紹介されていた気がする。
なんか重要なの?>const参照渡し

43 :デフォルトの名無しさん:2009/12/19(土) 14:36:52
>>42
const参照渡しは革命的に便利。
便利というか効率という点でもその他の意味でも必須。
残念ながら語りきれる気がしない。

>const参照渡しはシレっと紹介されていた気がする。
その本は本当にC++の本なのか!?
本気で捨てろと言いたくなった本はそれが初めてだ。

44 :デフォルトの名無しさん:2009/12/19(土) 14:56:25
その”const参照渡し”ってのは単に”ポインタ値渡し”に置き換えることはできないの?

45 :デフォルトの名無しさん:2009/12/19(土) 14:58:19
>>42
この程度のことはググればすぐに分かるから自分で調べろ。

46 :デフォルトの名無しさん:2009/12/19(土) 15:19:48
>>44
考え方が根本的に間違ってるよ。
ポインタ渡しは危険でバグの巣窟として有名。
この危険なコードを書かないように導入されたのが参照渡し。
ちなみにオブジェクトを最も安全に引数に渡せるのが「const付き参照渡し」なのでかなり重要です。

47 :デフォルトの名無しさん:2009/12/21(月) 14:03:59
namespace
{
class kuzu
{
public:
void muooon(void);
};
}

void kuzu::muooon(void)
{
}

↑これって定義の方にnamespaceつけなくてもそのファイル限定になる?


48 :デフォルトの名無しさん:2009/12/23(水) 07:37:49
・・・

49 :デフォルトの名無しさん:2009/12/23(水) 10:41:59
なる

50 :デフォルトの名無しさん:2009/12/23(水) 12:52:02
>>42
オブジェクトを渡すときはほとんどconst参照渡し。速いし安全。
渡したオブジェクトを変更したいときだけ非const参照渡しだね。
const参照渡しを主にして、非const参照渡しを控えるのならまだわかるけど。const参照渡しの説明が少ないのは理解しがたいな。


>>44
参照はポインターに比べて安全に使用できる。
void func2(const int& d)
{
}
void func()
{
int a;
{
int& b=a; //OK
int& c; //エラー
func2(a); //ok
}
}

参照は以上の例のように、初期化が必須なので参照先があることが文法上保障され、実体と区別なく安全に使える。
さらにスコープによって寿命が実体a>参照b>参照dになることが文法上保障されるから安全に使用できる。これは参照渡しでも同様。

だけど、この文法上の保障もポインタと併用すると安全性をぶち壊す危険な抜け道コードがいくらでも書ける。
これが文法上で危険性を排除できる参照と、自由だけど自己責任なポインタの大きな違いだと思うよ。


51 :デフォルトの名無しさん:2009/12/23(水) 13:31:51
int& i = *(int*)NULL; // おk

52 :デフォルトの名無しさん:2009/12/23(水) 15:29:05
>>50
それでも俺はint型といったオブジェクトではない変数はC++であっても参照ではなく
ポインタで渡すべきだと思う。ポインタが危険とはいえプログラムの可読性はあきらかに
ポインタ>参照
だ。

一方クラスといったオブジェクトはconst参照渡しを強く推奨する。
オブジェクトを渡すときはconst参照で渡すものという暗黙の了解が広く普及しているだろうし。

53 :デフォルトの名無しさん:2009/12/23(水) 18:28:49
ポインタが*iじゃなくてiでアクセスできる文法ならそれでよかった

54 :デフォルトの名無しさん:2009/12/23(水) 19:17:47
結局のところ可読性と安全性・最適化のどっちを犠牲にするかだな
関数名とか文脈でだいたいわかるから俺は参照使うけど

55 :デフォルトの名無しさん:2009/12/23(水) 20:33:05
>>54
> 関数名とか文脈でだいたいわかるから

それが我流プログラミングの始まりですわな(´・ω・`)

56 :43:2009/12/23(水) 23:38:25
>>43移行まじめに読んでないけど横槍レスしていいすか?

> ポインタが危険とはいえプログラムの可読性はあきらかに
> ポインタ>参照
明らかと言っていいかどうか分からんが、
思う思わないはまあ宗教論争だしなぁ。

・・・あとテンプレートが大好きな俺としては参照じゃないと気持ち悪くて仕方ない。


57 :デフォルトの名無しさん:2009/12/24(木) 01:26:52
>>52
intは値渡しだね。

58 :デフォルトの名無しさん:2009/12/24(木) 06:16:24
intをアドレス渡し(ポインタ渡し)や参照渡しするやつは何を考えてのことだろうか…?

コピー渡し(値渡し)の一択だろ

59 :デフォルトの名無しさん:2009/12/24(木) 10:12:49
>>58
無知が迷い込んで来たがな(´・ω・`)

60 :デフォルトの名無しさん:2009/12/24(木) 14:51:09
WindowsAPIが混じっているのですがご了承ください。
以下、strの宣言が悪いといってコンパイルエラーになります。

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg) {
   case WM_PAINT:
      HDC hdc;
      PAINTSTRUCT paint;
      char *str = "猫でもわかるプログラミング";

      hdc = BeginPaint(hWnd, &paint);
      TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str));
      EndPaint(hWnd, &paint);
      break;

以下のように、{を追加するとエラーが出なくなります。どうして{が必要なのでしょうか?

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg) {
   case WM_PAINT:
   {                    ←★追加
      HDC hdc;
      PAINTSTRUCT paint;
      char *str = "猫でもわかるプログラミング";

      hdc = BeginPaint(hWnd, &paint);
      TextOut(hdc, 10, 10, (LPCSTR)str, strlen(str));
      EndPaint(hWnd, &paint);
      break;
   }                    ←★追加

61 :デフォルトの名無しさん:2009/12/24(木) 14:55:48
cはスコープの頭じゃないと変数を作れないのさ!

62 :デフォルトの名無しさん:2009/12/24(木) 15:38:43
>>61
> cはスコープの頭じゃないと変数を作れないのさ!

あ〜、初心者がよくやる間違いだよなw
なんであんなへんてこな仕様にしたんだろう>変数の宣言場所は先頭部分のみ

63 :デフォルトの名無しさん:2009/12/24(木) 15:40:54
switch (x) {
 case A:
  int z;
  //...
 case B:
  // いつのまにかzがあるぞ
}

C++でも case B に突入すること考えて文句が出るはず

64 :デフォルトの名無しさん:2009/12/24(木) 15:46:14
>>60
コンパイラは何を使ってるの?
言語はC?C++?
エラー内容は?

VC++2008EEで試してみたけどコンパイルエラーは出なかったよ。

65 :デフォルトの名無しさん:2009/12/24(木) 15:55:30
ウィンドウプロシージャなんだから省略した部分にcaseがずらずら書いてあると見るべきだろう。

>>60
C2360をググれ

66 :デフォルトの名無しさん:2009/12/24(木) 16:50:07
C++ってライブラリ豊富なの?特に文字列かんれん

67 :デフォルトの名無しさん:2009/12/24(木) 16:54:32
最悪だ

68 :デフォルトの名無しさん:2009/12/24(木) 17:31:48
boostまで使えば

69 :デフォルトの名無しさん:2009/12/24(木) 17:51:07
ど素人です。
oracleと接続してデータ取りたいのですが、
以下のソースで実行したところ途中までしかデータがとれません。
※300000件中、16000件ちょいでデータがきれてしまう
何が原因かわかりますでしょうか?
切り貼りしたソースが足りなかったらすみません。

EXEC SQL OPEN CUR1;

EXEC SQL WHENEVER NOT FOUND DO break;

for (;;) {
EXEC SQL FETCH CUR1 INTO :item_data;
rows = sqlca.sqlerrd[2];
}
rows = sqlca.sqlerrd[2];

for (i=0;i<rows;i++) {
printf("%d\n",
item_data[i].item_seqno,
);
}

EXEC SQL CLOSE CUR1;

70 :69:2009/12/24(木) 17:53:50
環境書くの忘れてました。

SunOS 5.6
Oracle 8.1.6
CCコンパイラ

です。

71 :デフォルトの名無しさん:2009/12/24(木) 18:21:37
あー Oracle スレ落ちてんのか。それにしても C/C++ の話じゃねぇな。

>EXEC SQL FETCH CUR1 INTO :item_data;
構造体の配列らしいが、なんで上書きしてんの?

72 :デフォルトの名無しさん:2009/12/24(木) 20:20:47
template<typename T> struct Base
{ typedef T type; };

/* ○VC9/×GCC */
template<typename T> struct Derived : public Base<T>
{ typedef type type; };

/* ○VC9/○GCC */
template<typename T> struct Derived2 : public Base<T>
{ typedef typename Base<T>::type type; };

前者の記法は非標準なのでしょうか?


73 :デフォルトの名無しさん:2009/12/24(木) 20:46:01
>>57
> intは値渡しだね。

intを参照渡し、ポインタ渡しする人っている?
そういうときはreturnで返すのが常套じゃね?

複数のint型変数を返すときはint型配列のポインタ渡しか参照渡しするか、
そうでなければ構造体の参照渡しかポイント渡しにするのがセオリーじゃないの?

74 :デフォルトの名無しさん:2009/12/24(木) 20:57:08
>>66
豊富とは決して言えない
特に標準ライブラリは発狂物ww

でもboostを筆頭とする各種無償ライブラリとか
商用ライブラリとかまで含めれば豊富と言っていいとは思う。

75 :デフォルトの名無しさん:2009/12/25(金) 00:23:38
CやってからC++のstring比べれば天国だろ。

76 :デフォルトの名無しさん:2009/12/25(金) 01:48:11
>>66
初めからなんでも用意してある環境が欲しいなら、C/C++はおすすめできない。

77 :デフォルトの名無しさん:2009/12/25(金) 12:08:41
C++0xだと任意長テンプレートが組み込まれてるらしいですが、今はまだですよね
make_tupleのように任意長のテンプレートはどうやって作ってるんでしょうか?

78 :デフォルトの名無しさん:2009/12/25(金) 12:42:33
>>73
つ[配列にするほどでも、構造体にするほどでもないとき]

79 :74:2009/12/25(金) 20:23:31
>>75
確かにCやってからのstd::stringには泣いた。

80 :デフォルトの名無しさん:2009/12/26(土) 18:57:20
ふーん

81 :74:2009/12/26(土) 19:16:32
>>80
お前も俺達と一緒に泣けよ!

82 :デフォルトの名無しさん:2009/12/28(月) 11:39:50
文字列すべてに MFC の CString 使ってるバカの所為で
Linux への移植が大変だった、って意味では俺も泣いていいかな。

83 :デフォルトの名無しさん:2009/12/28(月) 11:44:00
CString作っちゃえ

84 :デフォルトの名無しさん:2009/12/28(月) 11:57:43
>>82
まて、そんなMFCのCStringだなんてクソと一緒にするな。
std::stringで書いてあればその苦労は全く無かったはずだ。全く。

85 :デフォルトの名無しさん:2009/12/29(火) 09:47:25
ちょいと相談。
template<class T>class Settings {
//
};
struct Arecord {
//
};
class Asettings : Settings<Arecord> {
//
};
こんなクラス構造があると思いねぇ。勿論、Aの他にもBやCもある。

んでもって、一々Arecordとするのも業腹だから
class Asettingsの中でstruct Record としてしまいたいってわけだ。
するってぇと、定義の順番の都合で巧くコンパイルできねぇ。
どうしたもんかね、こりゃ。

86 :デフォルトの名無しさん:2009/12/29(火) 11:56:31
>>85
class Asettings
が何か分からないから答えられぬ。

87 :86:2009/12/29(火) 11:58:00
>>85
ごめんカンチガイした。

template<class T>class Settings {
//
};
struct Arecord;
class Asettings : Settings<Arecord> {
 struct Arecord {
 //
 };
//
};
これじゃだめなの?

88 :デフォルトの名無しさん:2009/12/29(火) 13:09:02
>>87
ResTHX!
それだとダメだった。
Arecordが::Arecordで宣言されて
Asettings::Arecordで定義されるからだと思う。

89 :87:2009/12/29(火) 16:10:09
>>88
> Arecordが::Arecordで宣言されて
> Asettings::Arecordで定義されるからだと思う。
なるほど。たしかに。
Asettingsのクラス定義を分割できないって仕様がくせ者邪魔だなぁ。。


90 :87:2009/12/29(火) 16:15:29
>>88
 ttp://codepad.org/opJUGUor
ここでは通ったけど
中身を実装するとやっぱダメっぽい?


91 :87:2009/12/29(火) 16:17:33
>>88
ttp://codepad.org/YBqmrMtV
こんなんも通ったよ。


92 :デフォルトの名無しさん:2009/12/29(火) 17:13:14
>>91
残念ながら、これでアウト。外のArecordと内のArecordは別物なのよね。
ttp://codepad.org/eEpbQXgN

93 :デフォルトの名無しさん:2009/12/29(火) 17:32:18
>>92
codepadでは確かに通らないが、
それはg++が古いからでは?
俺の
g++ (TDM-2 mingw32) 4.4.1
および
Comeauの
http://www.comeaucomputing.com/tryitout/
このサイトでは通ったよ。


94 :>87 >93 ◆Nsutagdmm. :2009/12/29(火) 17:47:01
ちなみに
VC++ 2008でもbcc5.5.1でも通ったよ。


95 :デフォルトの名無しさん:2009/12/29(火) 18:03:57
うーむ。gcc3が通らないのが問題なのか。情報THX!

96 :87 ◆Nsutagdmm. :2009/12/29(火) 19:03:18
 ttp://codepad.org/XX7ZGdkK
ちなみにこのソースはそちらの手元では通る?


97 :デフォルトの名無しさん:2009/12/30(水) 10:46:28
私のコーディングスタイルって変ですか?

structが引数になるときは参照渡し、
classの時はポインタ渡し、
としているのですが、変ですか?

struct Point;
class Object;

Point Add(const Point &p1, const Point &p2);
shared_ptr<Object> Get(Object* base);

って感じなんですが・・・(^^;)

98 :デフォルトの名無しさん:2009/12/30(水) 10:49:31
変です

99 :デフォルトの名無しさん:2009/12/30(水) 10:51:43
そういう風に区別する必要性がないと思うよ。
ほとんどの場合参照で渡せば問題ないはず。
ポインタで渡すのは、nullの状態を作りたい場合くらいかな。

100 :デフォルトの名無しさん:2009/12/30(水) 11:00:29
structもclassも基本的には同じものだからね
区別する方がおかしい
structで書いたらダメ出しする老害は死ぬがいいよ

101 :デフォルトの名無しさん:2009/12/30(水) 11:06:32
structで書いてダメ出しされたのかw

102 :デフォルトの名無しさん:2009/12/30(水) 11:12:52
classはprivateがデフォルト、structはpublicがデフォルトなのが微妙な位置づけの違いだろうね。
個人的には、structはデーター構造作るときにアライン合わせるときとか、ただのメンバ変数の集合体を作るときだけとしている。
boostのソース読むときはclassとstructがごっちゃになってるので読みづらいな。明確な使い分けの無いほぼ同じ機能の構文が複数あるのは勘弁してほしいよ。


103 :デフォルトの名無しさん:2009/12/30(水) 11:31:46
そんなんがC++にはいっぱいあるよな(笑)

俺もstructはメンバ変数やメンバ関数含めほぼ全部publicにしているよ。
(つまりPODとまでは行かないが相当小さい簡易的なもの。)
全部publicでも大きなものはclassとしている。
逆に一つでもprivateにしたい場合はかなりの割合でclassとしている。

要は、読み手の受ける印象の違いだろうけどさ。


104 :97:2009/12/30(水) 11:53:59
わたしもstructはデータ、classはクラス(?)と扱うものとしてます・・・
なんかそっちのほうが個人的には読みやすいので (^^;

あと、クラスに参照だと基底クラスにキャストすることはできるのかな、とか思って。

趣味グラマなんでそこらへんがよくわかんないですm(_ _)m

105 :デフォルトの名無しさん:2009/12/30(水) 12:15:07
>>104
あー、まだその辺な訳ね。
ずいぶんと因果な言語を選んだね君(笑)

> クラスに参照だと基底クラスにキャストすることはできるのか
正確にはキャストじゃなくて暗黙の型変換の話だよね?
できます。
生ポインタで渡すのはあまり綺麗なスタイルではないことが多い。
(わざとポインタにすることもあるけど)

C++例外処理プログラミング
ttp://www.02.246.ne.jp/~torutk/cxx/exception/programming.html
この辺も読んだ方が良いかも。


106 :デフォルトの名無しさん:2009/12/30(水) 12:15:28
>>104 できるよ!!だから安心して参照を使ってね♥

107 :デフォルトの名無しさん:2009/12/30(水) 14:48:51
すごく基本的な質問ですが・・・

char **c = new char*[5];



char *c[5];

って、どういう違いがあるんでしょうか?
deleteはどっちの場合も必要?

108 :97:2009/12/30(水) 14:52:20
レスありがとうございます♪
そういえば参照を使う時でもshared_ptrは値渡しでいいんですよね??

109 :デフォルトの名無しさん:2009/12/30(水) 15:04:54
>>107
newとdeleteは1対1で対応するべきものです
newが無いのにdeleteしていたり、newしているのにdeleteが無いのは、どこか間違っている可能性が高いです

110 :105:2009/12/30(水) 15:05:06
>>108
値渡しじゃなくて、
「値渡しと同じ書き方」ね。
いいよ。
というかそれができるのが参照の利点なのさ。

111 :デフォルトの名無しさん:2009/12/30(水) 15:05:53
>>107
まず
> char *c = new char[5];
> と
> char c[5];
で考えてはいかがですか?


112 :107:2009/12/30(水) 15:31:31
回答ありがとうございます。

char *c = new char[5];

char c[5];
の場合は、後者には他の文字列ポインタを代入できないというくらいで
基本的には同じような扱い方でOKなんですよね?
で、関数を抜けるときは前者のみdeleteが必要ということですよね?

char **c = new char*[5];

char *c[5];
の場合のnewとdeleteの対応ですが、
後者はポインタの配列になると思うのですが
各要素に個別にnewを使っていた場合は、
また個別にdeleteしていくしかないということになるんですか?
関数を抜けるときに配列自体が開放される(?)ので
ついでに要素についても自動的に開放されるということはないのでしょうか?

113 :デフォルトの名無しさん:2009/12/30(水) 15:32:20
無いよ

114 :デフォルトの名無しさん:2009/12/30(水) 15:40:03
std::string使え

115 :デフォルトの名無しさん:2009/12/30(水) 16:05:48
>>112
前者に文字列ポインタを代入していいなんてどこに書いてあった?
ここにそれを晒した上で窓から投げ捨てろ

116 :デフォルトの名無しさん:2009/12/30(水) 16:39:41
>>112
配列のdeleteはdelete[]だから。
たとえば
char* c=new char[5];
に対するデリートはdelete[] c;だよ。

個別というのが
char* c[5];
c[0]=new char;
という意味だったら、
delete c[0]は必要だから。
スコープから抜けるときに配列は消えるけど中身は消えないからね。

スマートポインタをぐぐると便利だよ。


117 :デフォルトの名無しさん:2009/12/30(水) 16:56:59
だれか絵を描いてうpしてやれ

118 :デフォルトの名無しさん:2009/12/30(水) 17:06:25
> ついでに要素についても自動的に開放されるということはないのでしょうか?
そんな親切な言語じゃないところがC++のいいところであり悪い所でもある。


119 :107:2009/12/30(水) 17:21:56
みなさんご回答ありがとうございます。
おかげさまで何となく理解できた気がします。
ポインタ関係はややこしいですね。

>>115
char *a = "abcd";
char b[5];
char *c = new char[5];
b = a; // エラー
c = a; // 一応OK

上記のような意味で書いたのですが、用語の使い方を誤っていたかもしれません。


120 :デフォルトの名無しさん:2009/12/30(水) 17:23:38
>c = a; // 一応OK

OKじゃねーよ。
newしたバッファはどっかいっちゃうぞ

121 :デフォルトの名無しさん:2009/12/30(水) 17:26:18
文法上は正しいが、やってはいけないことだな

122 :デフォルトの名無しさん:2009/12/30(水) 17:33:35
ハッ!107はchar*はすべて文字列ポインタと呼んでるのか
そんな呼び方は窓から(ry

123 :111:2009/12/30(水) 17:39:59
>>107はちゃんと一応OKって言っているじゃん。
確かに一応OKなんだよ。
リソースを開放する気がないんなら。
そういう嫌がらせプログラムを組みたくなったときに必要な知識だ。


124 :107:2009/12/30(水) 17:51:20
何度もすみません。
もう1点いいですか?

char *b[5];

char (*c)[5];
は別物になるんですか?
どちらもポインタの配列なのではないかと思ったのですが、
入れ替えるとコンパイルが通らなくなるので・・・。

>>122
「文字列ポインタ」がまずかったですか?

125 :デフォルトの名無しさん:2009/12/30(水) 17:58:15
>>124
前者はcharの*(ポインタ)が5個の配列
後者は、char が5個の配列の*(ポインタ)

126 :デフォルトの名無しさん:2009/12/30(水) 18:52:27
まぁ、初心者が一度はドツボにはまるところだから仕方ない。
一度もはまらなかったらそれはそれで怖いし。

127 :107:2009/12/30(水) 19:04:09
ありがとうございます。
なるほど、配列のポインタになってしまうんですね。
実験してみたところ、
char *(c[5]); だとポインタの配列で
char (*c)[5]; だと配列のポインタという感じでした。
なんか直感と逆な感じがしますが・・・。

128 :111:2009/12/30(水) 19:26:55
>>127
よし。
 type
 ttp://wwws.kobe-c.ac.jp/deguchi/c/type.html
俺はこのページを紹介できる時を待っていたんだ(笑)
とても分かりやすかったんで必見!!

129 :107:2009/12/30(水) 20:44:54
とても有用なページを教えていただきありがとうございます。
つまり、char (*c)[5]; と宣言された変数cがあったとしたら、
そのcに対して (*c)[5] という操作をすれば char 型になるという意味なんですね。
ようやく飲み込めた気がします。

ですが、さらに疑問点が出て来ました(何度もすみません)。

1 : char (*a)[5]; // 配列のポインタ
2 : char *(b[5]); // ポインタの配列
3 : char c[5]; // 配列(のポインタ)
4 : char *d = "abcd"; // 配列のポインタ
5 : char **ea = a; // NG
6 : char **eb = b; // OK
7 : char **ec = &c; // NG
8 : char **ed = &d; // OK

また気になって上記のような実験をしてみたのですが、
予想に反して結果がぜんぜん一致しません・・・。
5、6行目に関して: char **x; という形だけを見れば
配列のポインタでもポインタの配列でもいけそうな気がしますが、
この場合は特別にポインタの配列と決められているということなのでしょうか?
7、8行目に関して:どっちも同じだと思うのですが、何か違うのでしょうか?

何度も申し訳ありませんが、ご教示よろしくおねがいします。
結局、教えていただいたページをちゃんと理解できていないかもしれませんが・・・

130 :デフォルトの名無しさん:2009/12/30(水) 20:47:21
型が違う

131 :デフォルトの名無しさん:2009/12/30(水) 22:47:53
>>129
5行目
配列へのポインタなんだから、
ポインタのポインタとは違うでしょ?

 a --> [  char型 ]       ea --> [ char*型 ] --> [ char型 ]
         [  char型 ]
         [  char型 ]
         [  char型 ]
         [  char型 ]

7行目
&c は c 、あるいは &c[0] と同じ意味を持つから


132 :デフォルトの名無しさん:2009/12/31(木) 08:31:19
void kakuhoMemory();

int main(void){
int row = 0;
char **url;

url = (char **)calloc(1,sizeof(char *))) == NULL);
url[0] = (char *)calloc(1000,sizeof(char))) == NULL);

for(row = 2;row < 10;row++){
kakuhoMemory(url,row);
printf("%p---%p\n",url,url[row - 1]);
}}

void kakuhoMemory(char **url,int row){
char **tmp;

if((tmp = (char **)realloc(url,sizeof(char *) * row)) == NULL){
exit(1);}
url = tmp;
if((url[row - 1] = (char *)calloc(1000,sizeof(char))) == NULL){
exit(1);}
}

133 :デフォルトの名無しさん:2009/12/31(木) 08:39:07
続き:
1つずつポインタの配列を増やしていき、
新しく追加された変数にcharの配列のアドレスを代入したいのですが
コンパイルして実行するとなぜか3回目でアドレスが短くなってしまい、
更にそれ以降はnilと表示されてしまいます。
以下に示します。
0x9da3008---0x9da3408
0x9da3008---0x9da37f8
0x9da3008---0x3f0
0x9da3008---(nil)
0x9da3008---(nil)
0x9da3008---(nil)
0x9da3008---(nil)
0x9da3008---(nil)
どこか間違っているのでしょうか。よろしくお願いします。

134 :デフォルトの名無しさん:2009/12/31(木) 09:17:57
>>133
ぱっと見変なとこ。
if((tmp = (char **)realloc(url,sizeof(char *) * row)) == NULL){ //呼び出し元ですでに確保してるはずだね。
url = tmp; // 引数のurlを上書きしてる。
if((url[row - 1] = (char *)calloc(1000,sizeof(char))) == NULL){ //上書きしたurlに保存しても呼び出し元には返せないね。



135 :デフォルトの名無しさん:2009/12/31(木) 11:10:27
classの中で定義するtypedefってなにか呼び方があったような気がするんですが、何か知りませんか?
誘導型?とかそんな感じの

136 :デフォルトの名無しさん:2009/12/31(木) 11:30:55
>>132
関数を
void kakuhoMemory(char ***url, int row)
{
char **temp;

if((temp = (char**)realloc(*url, sizeof(char*) * row))==NULL) exit(1);
*url = temp;
if((url[row-1] = (char*)calloc(1000, sizeof(char)))==NULL) exit(1);
}
にして、呼び出しを
kakuhoMemory(&url, row);
にする。

137 :107:2009/12/31(木) 14:03:57
>>130 >>131
お返事が遅れてしまいましたが、回答ありがとうございました。
なるほど a も &c も配列のポインタのポインタをとっても
結局は配列の一次(?)のポインタとして扱われるということなんですね。

1 : char (*a)[5];
2 : char c[5] = "abcd";
3 : a = c; // NG(以下、この行は無視してコンパイル成功したものとする)
4 : a = &c; // OK
5 : printf("a : %d , *a : %d , c : %d , &c : %d\n", a, *a, c, &c); // 全部一致する
6 : printf("a[1] : %c , (*a)[1] : %c , c[1] : %c\n", a[1], (*a)[1], c[1]); // a[1] はうまくいかない

くどいですが、実験してみたら上記のようになりました。
"[]"を単にアドレスから値を取得する演算子だと理解していたのですが、
かなり甘かったようです・・・。


138 :デフォルトの名無しさん:2009/12/31(木) 15:19:22
5:ポインタの書式指定子は%dじゃなくて%pだ
6:a[1]はアクセス違反。他と同じ場所を指すのはa[0][1]

139 :131:2009/12/31(木) 15:22:30
>>137
ちょっと >>131 の最後の一文について訂正。

char c[5]; において、c と &c[0] は等価なんだけど
ANSI-C以降の場合、&c は配列へのポインタなので、c と &c は同じじゃない。
K&Rだと同じなんだけどね

多分、配列とポインタを混同してると思うので、C-FAQを読むといいよ
http://www.kouno.jp/home/c_faq/c6.html#0


140 :デフォルトの名無しさん:2009/12/31(木) 17:16:48
モノステート シングルトン
使い分けがわからん

ぐぐると
>シングルトンパターンは汎用性、可搬性が必要なクラスに使用すべきでしょう。
>モノステイトパターンは元々「状態が不変」であることを表すパターンだと思うので、 「実体が一つであることを保証する」といった使い方には適さないでしょう。

具体的にどういう場面で使い分ければいいんだ?


141 :107:2009/12/31(木) 19:15:54
ご回答ありがとうございます。
なるほど・・・今度こそ理解できたような気がします(自信なし)。
char (*a)[5];
char c[5] = "abcd";
a = &c;
とした場合、printfとかで内容だけ見ると a == *a == c == &c となるけど、
実際は a と &c は配列へのポインタであり
そして *a と c は配列の最初の要素へのポインタということで、型が違うことですかね。
& や * という演算子は値→アドレス、アドレス→値の変換をする演算子だと
思っていましたが、この場合は例外的に型の変換が行われるわけですね。
C/C++ 難しすぎです!

142 :デフォルトの名無しさん:2009/12/31(木) 19:19:27
>>134さん
>>136さん
お二方のおかげでわかりました。
url=tmpじゃ確かに呼び出し元のurlの値は変わらないですよね。
それと>>136さんの
if((url[row-1] = (char*)calloc(1000, sizeof(char)))==NULL) exit(1);
の行のurl[row-1]の部分は(*url)[row-1]ですよね?


143 :デフォルトの名無しさん:2009/12/31(木) 19:43:56
そうだね

144 :デフォルトの名無しさん:2010/01/01(金) 23:18:27
>>141
> C/C++ 難しすぎです!
うん、これら2つ、特にC++は難しいことで有名。

どのくらいの趣味グラマになりたい?
正直 将来の職業にする気が全く無く、
楽しみたいだけならPythonとかRubyとかのような
もっと高級言語が良いんじゃないかと思うんだけど。


145 :デフォルトの名無しさん:2010/01/02(土) 00:19:47
それは高級なのか?

146 :144:2010/01/02(土) 11:05:10
>>145
俺は
C言語は低級言語、PythonとRubyは高級言語といって
恥じない代物だと思っているんだけど、
君はどう思う?

147 :デフォルトの名無しさん:2010/01/02(土) 11:22:09
むしろ君の方が恥ずべき代物

148 :デフォルトの名無しさん:2010/01/02(土) 16:57:22
Cが高級言語のなかでは、低級よりだってのは、誰しも認めるところだと思ってたけど。


149 :デフォルトの名無しさん:2010/01/02(土) 17:01:13
>>147
意味不明な煽りは止めてくれない?
asm と c しか無かった時代とはもう違うのだよ。


150 :デフォルトの名無しさん:2010/01/02(土) 17:32:56
そんな時代、いつあったんだろう…

151 :デフォルトの名無しさん:2010/01/02(土) 17:56:59
>>150
「しか」は言い過ぎたけど、
まあ察してくれよ


152 :デフォルトの名無しさん:2010/01/02(土) 19:39:50
>>144
PythonやRubyを高級言語と分類することには特に異論はないが、
プログラミングを職業とするということへの誤解を生む表現だな。

153 :デフォルトの名無しさん:2010/01/02(土) 20:03:54
こいつをご覧くだせー。

#include <stdio.h>
#define VIEW() printf("a = %d\n", a)

int a = 0;
void func(void);

int main(int argc, char *argv[]){
 int a = 10;
 VIEW();
 {
  int a = 20;
  VIEW();
 }
 VIEW();
 func();
 ::a = 30;  /* (1) */
 func();
 return 0;
}

void func(void){
 VIEW();
 return;
}

まあ、見ていただければわかると思うが、変数名についての実験を行った。
グローバル変数と同じ名前のローカル変数を使うと、そのグローバル変数を参照するには :: を使えばよい。
ところで、この :: (グローバル名前空間) って純粋 C でも使える?

154 :デフォルトの名無しさん:2010/01/02(土) 20:22:30
>>153
C言語にはnamespaceすらない

んだったきがするが。

155 :デフォルトの名無しさん:2010/01/02(土) 20:33:43
>>153 グローバル変数を使わなければよい。


156 :デフォルトの名無しさん:2010/01/02(土) 20:46:56
>>154
そうか...
Thanks!

>>155
ぐろ〜ばる☆

157 :107:2010/01/03(日) 00:50:30
>>144
まあ職業はともかく、実際C/C++で書かれているプログラムは多いですし
是非しっかり使えるようになりたいですね。
回答していただいた皆さん、ありがとうございました。

158 :デフォルトの名無しさん:2010/01/03(日) 02:43:09
CRITICAL_SECTIONはグローバル変数じゃないといけないの?
ネット上のサンプルのほとんどがグローバル。

スレッド生成のときに渡すのは駄目なの?



159 :デフォルトの名無しさん:2010/01/03(日) 09:31:46
>>158
Win32APIのCRITICAL_SECTION構造体かな?
グローバルにおく必要は無いよ。普通はメンバー変数に置く。
スレッド間の同期に使うものだからスレッド作成前に作ってかまわない。
CRITICAL_SECTION構造体はコピーできないからポインタ渡しで渡すこと。
ただ、質問のようにスレッド生成時に渡すものではなく、スレッド間で競合するリソースをアクセスするときに、そのリソースが持ってるCRITICAL_SECTIONの構造体を参照してクリティカルセクションに入るようにする。


160 :デフォルトの名無しさん:2010/01/03(日) 20:41:46
初心者質問ですいません
bool
false
の読み方が良くわからないので正しい読み方を教えて欲しいです

161 :デフォルトの名無しさん:2010/01/03(日) 21:04:33
>>160
http://public.research.att.com/~ttsweb/tts/demo.php
このサイトで聞きなさい。


162 :デフォルトの名無しさん:2010/01/03(日) 22:16:14
>>161
まったくわかりませんでした

163 :デフォルトの名無しさん:2010/01/03(日) 22:17:32
流暢な英語すげぇ

164 :デフォルトの名無しさん:2010/01/03(日) 22:20:09
bool ブール
false フォールス

165 :デフォルトの名無しさん:2010/01/03(日) 22:36:43
>>164
ありがとうございます
フォルスって読んでました

166 :デフォルトの名無しさん:2010/01/03(日) 22:37:57
>>161
長年のchar論争に決着が…!

167 :デフォルトの名無しさん:2010/01/03(日) 23:03:37
>>166
まさかcharを こう発音されるとは思ってなかったわw

168 :デフォルトの名無しさん:2010/01/03(日) 23:07:57
>>165
フォルス=陰茎

169 :デフォルトの名無しさん:2010/01/03(日) 23:19:00
char論争なんて無い
当然チャーだ

170 :デフォルトの名無しさん:2010/01/03(日) 23:27:20
>>168
それは間違い

171 :デフォルトの名無しさん:2010/01/03(日) 23:28:25
> Phallus
> ギリシャ語で「ふくらんだもの」のこと。
> 男性の性器、男根を意味する言葉。特に勃起した状態を指す
> なお発生学においては、男性の陰茎だけでなく女性の陰核も指す。


172 :デフォルトの名無しさん:2010/01/03(日) 23:33:29
phallusはファルス


173 :デフォルトの名無しさん:2010/01/03(日) 23:43:07
>>169
は?シャアに決まってるだろJK

174 :デフォルトの名無しさん:2010/01/03(日) 23:45:39
うけると思った?

175 :デフォルトの名無しさん:2010/01/04(月) 00:23:59
チャじゃねーの

176 :デフォルトの名無しさん:2010/01/04(月) 02:31:57
質問です。
std;;string str;の中に例えば
test,abcd,efg
と格納されていた場合、「 , 」の後だけを個別に取得出来ないでしょうか?

177 :デフォルトの名無しさん:2010/01/04(月) 03:23:17
find() して substr()…あ、いや
>std;;string str;
   ↑なんぞ

178 :デフォルトの名無しさん:2010/01/04(月) 13:03:52
>>177
ただのミスですw

ありがとうございます、ちょっとやってみます。

179 :デフォルトの名無しさん:2010/01/04(月) 13:31:30
>>177
うおおお!ありがとうございました!

簡易スクリプトのコマンドで悩んでいましたが、無事にコマンドと引数を取得出来ました。
凄い勉強になりました!ありがとう!

180 :デフォルトの名無しさん:2010/01/04(月) 15:33:04
何か引数のポインターがNULLだったときは例外投げろと言われたのですが、
JAVAのNullPointerExceptionみたいなのないですか。
どこをどう探してもC++にNULLっぽい例外がないのですが

181 :デフォルトの名無しさん:2010/01/04(月) 15:35:01
ない。自分で例外投げろ

182 :デフォルトの名無しさん:2010/01/04(月) 16:22:56
これで良い? ぬるぽ

/**
* JavaのNullPointExceptionに相当する例外クラス.
*/
class null_point_error : public std::logic_error
{
public:
null_point_error (const std::string& what) : logic_error(what) {};
};

183 :デフォルトの名無しさん:2010/01/04(月) 17:15:58
  ∧_∧
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ     人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡

184 :デフォルトの名無しさん:2010/01/04(月) 19:07:32
>>180
C++にはOSが検出するNULLポインタ例外またはアクセス違反例外は無い。しかし、VC等のベンダ拡張で構造化例外を使うとそれらの例外はキャッチできる。
C++の参照やイテレータはNULLを排除してるし、C++では特にNULLは使わなくっても設計できなくはない。



185 :デフォルトの名無しさん:2010/01/04(月) 19:24:19
MFCでダイアログベースの開発を行っています。
今回、クライアント側の要望で、ダイアログ、ウィンドの背景や、ボタンなどいろいろなアイテムを
スキンを使用したGUIにする要望がありました。 要は見た目の話ですが・・・・

そこで、市販のスキンライブラリー(スキン作成ソフト)を使用しようといろいろ探してみたのですが、
海外のものしか見つかりませんでした。
過去の業務で同じようなスキンライブラリを使用、または検討した人がいましたら、そのソフト(ライブラリー名)を
ご教授お願いできないでしょうか?一長一短もありましたら教えていただければうれしいです。

自分で探したところ、SkinCrafter(デモ版)が少し使いやすかったです。
ボタンなどのイメージを1枚ずつ1ファイルとして登録するのが少し面倒でしたが・・・


186 :デフォルトの名無しさん:2010/01/04(月) 19:27:21
ダイアログを変えたいならリソースDLLを使えばいいんじゃね?


187 :デフォルトの名無しさん:2010/01/04(月) 22:14:14
>>184 いや引数で Hoge* hoge みたいなのがあって
間違えてNULLを渡したら例外飛ばせコラーって上から言われたのですよ

188 :デフォルトの名無しさん:2010/01/04(月) 22:32:19
Hoge& hoge

189 :デフォルトの名無しさん:2010/01/04(月) 22:37:57
ウィンドウプロシージャのサブクラス化するために(http://www.geocities.jp/ky_webid/win32c/064.html
SetWindowLongでクラスのメンバ関数を渡そうとすると型が違うらしくコンパイルエラー
メンバ関数をstaticつけて静的にするとコンパイル通る、普通の関数でもおk

動的なクラスのメンバ関数のアドレスを(LONG)(LONG_PTR)に変換する方法ない?

190 :デフォルトの名無しさん:2010/01/05(火) 13:03:14
IEのプラグインを作成を考えています。 作成するのは初めてです。
プラグインdllが、外部のファイル操作(DB参照)、レジストリのパラメータ取得することは可能でしょうか?

191 :デフォルトの名無しさん:2010/01/05(火) 16:26:25
質問です。
以下のコードを実行するとx,yがそれぞれ
00000000, 00000001になるのですが
これはどういうことなんでしょうか?
コンパイラはGCCとVS2008Expressで同じ結果でした。

unsigned int i = 32, x, y;
x = 1u << 32;
y = 1u << i;
printf("%08x %08x\n", x, y);

192 :デフォルトの名無しさん:2010/01/05(火) 16:31:15
>>191
ECC6.2.1では00000001, 00000001

32bitモードでの32回以上のシフトは80286以上で未定義

193 :デフォルトの名無しさん:2010/01/05(火) 16:39:39
>>192
未定義なんですか。
ということは言語や処理系の問題ではないという事でしょうか?
左シフトは0埋めされるので必ず0になると思っていたんですが。
勉強になりました。

194 :デフォルトの名無しさん:2010/01/05(火) 16:51:37
>>193
IntelとかAMDからPDFをDLして嫁

195 :デフォルトの名無しさん:2010/01/05(火) 17:12:33
epollのEPOLLET相当のことをkeventでやりたいんだけどフラグとかってあります?
それともデフォルトでエッジトリガだったりしますか


196 :デフォルトの名無しさん:2010/01/05(火) 20:36:48
プロジェクトで使う定数一覧みたいなヘッダーファイルってなんて名前にしてますか
どうにも良い名前が考えつかない。

197 :デフォルトの名無しさん:2010/01/05(火) 20:46:23
>>196
constants.hpp
これじゃだめ?

198 :デフォルトの名無しさん:2010/01/05(火) 20:47:47
>>196
macros.h


199 :デフォルトの名無しさん:2010/01/05(火) 20:49:56
>>198
マクロかよw

200 :196:2010/01/05(火) 20:50:47
constants.hpp
macros.h

イマイチ

201 :デフォルトの名無しさん:2010/01/05(火) 20:52:48
common.h
global.h

202 :デフォルトの名無しさん:2010/01/05(火) 21:03:20
CONSTS.H


203 :デフォルトの名無しさん:2010/01/05(火) 22:12:21
typedef、定数、基底クラスのインタフェース
このあたりはいつも foundation.hpp としてまとめてる。

204 :196:2010/01/05(火) 23:06:38
constants.hpp
macros.h
common.h
global.h
CONSTS.H
foundation.hpp

イマイチ

205 :デフォルトの名無しさん:2010/01/05(火) 23:08:52
stdafx.h

206 :デフォルトの名無しさん:2010/01/06(水) 00:56:59
「プロジェクトで使う定数」なら
$(プロジェクト名)_constants.h

何に使う定数なのか自覚してるなら迷うわけがない
ただファイル数を減らしたいために関係ない定数を同じヘッダに書くのはどうかと

207 :デフォルトの名無しさん:2010/01/06(水) 01:03:53
>>187
何の例外投げればいいか上に聞け
何も指定されなければ他のコード見て真似しろ
分からなければstd::runtime_errorかstd::invalid_argumentでも投げとけ

208 :デフォルトの名無しさん:2010/01/06(水) 01:14:54
>>189
ない。だから、少し間接的な方法をとる。
ウィンドウハンドルに好きな値を関連付ける機能があるので、オブジェクトへのポインタを登録しておくというもの。

こんな関数をグローバルまたはクラスの静的メンバ関数として定義し、
SetWindowLongPtr(hButton, GWLP_WNDPROC, (LONG_PTR)ButtonSubWndProcEntry)のように渡す。
(この問題とは直接関係ないが、SetWindowLongPtr使え)
あと、SetWindowLongPtr呼ぶ前に、SetProp(hButton, TEXT("MyClass object"), オブジェクトへのポインタ);する。

LRESULT CALLBACK ButtonSubWndProcEntry(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
MyClass* p = static_cast<MyClass*>(GetProp(hwnd, TEXT("MyClass object")));
return p->ButtonSubWndProc(hwnd, msg, wp, lp);
}

209 :1889:2010/01/06(水) 04:17:13
>>208
thx、打開できそうだ

210 :デフォルトの名無しさん:2010/01/06(水) 13:15:21
>>204
ore_project_consts.h

211 :デフォルトの名無しさん:2010/01/06(水) 14:45:50
boost::shared_ptrはスレッド対応してるらしいんですが、std::tr1::shared_ptrのほうもスレッド対応してるんでしょうか?

212 :デフォルトの名無しさん:2010/01/06(水) 19:55:19
>>211
C++にはスレッドとかそういう概念自体が存在しないんじゃない?
もしそうだとすると
> std::tr1::shared_ptrのほうもスレッド対応してるんでしょうか?
実装次第ということになりそうだが。。。

213 :デフォルトの名無しさん:2010/01/06(水) 20:49:34
MT-safeかどうかを訊ねてるに決まってるだろ

214 :デフォルトの名無しさん:2010/01/06(水) 20:57:02
だから実装次第つってんだろ・・・

215 :デフォルトの名無しさん:2010/01/06(水) 21:06:55
>>198
Fortranだと、Macross.Fだな。

216 :デフォルトの名無しさん:2010/01/06(水) 21:18:28
>>211 VCのTRはスレッドセーフみたいだね。
C++0xはスレッドに対応するからスレッドセーフだと期待してるんだけどね。
boost::shared_ptrとstd::shared_ptrの違いとかどっかに書いてないかなあ?


217 :デフォルトの名無しさん:2010/01/06(水) 21:44:46
>>213
こいつ、死ねばいいのにね。

218 :デフォルトの名無しさん:2010/01/06(水) 21:51:06
ひどいこと言わないで

219 :デフォルトの名無しさん:2010/01/06(水) 21:59:39
まあ、実装依存っていう回答は無いわな・・・

220 :217:2010/01/06(水) 23:04:11
>>219
おい
他人のふりしないではっきり言えよ。

じゃあお前は
 std::numeric_limits<int>::max()はいくらを返すのですか?
って言われたらなんて答えるんだよ?

221 :デフォルトの名無しさん:2010/01/09(土) 21:21:43
本家sourceforgeがすごくつながりづらいんだけど俺だけ?

222 :217:2010/01/10(日) 23:14:50
>>219
おい、逃げないでちゃんとレスしろよ。

最近はバカが根性も失って、負けるとしっぽを巻いて逃げるから
もうどうしようもないな。

223 :デフォルトの名無しさん:2010/01/11(月) 12:30:45
こういうコードを見つけました。
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,
(float[]){0.3f, 0.3f, 0.3f, 1.0f});
{}で数値を囲んで関数に配列わたしてます。
gccだと、似たようなことしてコンパイル通りました。
これって、純粋なCの文法なんですか?

224 :デフォルトの名無しさん:2010/01/11(月) 14:40:43
>>223
void func(int*a){}
int main(void){func((int[]){1,2,3});}

を、gccで-pedanticオプションつけたら
foo.c:2: 警告: ISO C90 forbids compound literals
って出たから、C90じゃダメみたいだよ。

C99ではどうやら認められてるみたいだが。

225 :デフォルトの名無しさん:2010/01/11(月) 15:53:29
>>223-224
うん、C99の機能。


226 :デフォルトの名無しさん:2010/01/11(月) 18:16:26
explicitって引数2こ以上とvoidには無意味?

227 :デフォルトの名無しさん:2010/01/12(火) 00:19:38
>>226
voidってデフォルトコンストラクタのことを言いたいの?
なら君の言う通り。・

228 :デフォルトの名無しさん:2010/01/13(水) 20:30:14
コンストラクタやデストラクタにvoidって書いたらエラーにならなかった?


229 :デフォルトの名無しさん:2010/01/13(水) 23:31:28
なんないでしょ

230 :デフォルトの名無しさん:2010/01/13(水) 23:36:19
>>229
なるよ。

231 :デフォルトの名無しさん:2010/01/13(水) 23:39:41
>>229
なるだろ

232 :デフォルトの名無しさん:2010/01/13(水) 23:58:41
class T {
 void T(); //エラー
 T(void); //エラーじゃない
};

>>226-228の流れ、特に>>226は明らかに引数の話

233 :デフォルトの名無しさん:2010/01/14(木) 00:01:23
>>232
そうか。
よく読んでなかった。

234 :デフォルトの名無しさん:2010/01/14(木) 00:10:26
というか>>226が質問丸投げで出て来ない以上、
適当な返事になってもいたしかたあるまい。

235 :デフォルトの名無しさん:2010/01/15(金) 12:26:33
template <class func_t> struct Hoge;

template <class ret_t, class arg_t> struct Hoge<ret_t (*) (arg_t)> { ... }; @

template <class ret_t, class arg_t> struct Hoge<ret_t (arg_t)> { ... }; A

@とAって明確な違いってありますか?

236 :デフォルトの名無しさん:2010/01/15(金) 23:27:43
>>235
なんじゃこりゃ? 難解だなぁ〜。っていうかこういうの出来るのかな?
Hogeの中のfunc_tの型が、「@」はret_t型を返し、arg_t型の引数を取る関数へのポインタで、
「A」はret_t型を返し、arg_t型の引数を取る関数に特定されるということ?
一応違うバリエーションが作られるのではないだろうか?

237 :デフォルトの名無しさん:2010/01/16(土) 21:09:25
複数のif文とelse if文の上手な書き方を教えてください。

238 :デフォルトの名無しさん:2010/01/16(土) 21:32:15
条件から整数を導出する関数かクラスを作ってswtich caseか関数テーブルで分岐する。

239 :デフォルトの名無しさん:2010/01/17(日) 02:18:13
画面に表示されているものを全部消すにはどうしたらいいですか?
エスケープシーケンスを使った方法(printf("\x1b[2J");)では出来なかったので他の方法があれば教えてください

240 :デフォルトの名無しさん:2010/01/17(日) 13:29:26
環境を説明せずに、エスパーでも求めてるのか?
どの環境でも出来ることは、画面の行数分改行しろ、流れて消えるからw

241 :デフォルトの名無しさん:2010/01/17(日) 13:32:07
ディスプレイの電源を切る。

242 :デフォルトの名無しさん:2010/01/17(日) 13:40:15
うまくいきました!
ありがとうございました。

243 :デフォルトの名無しさん:2010/01/17(日) 13:40:42
どういたしまして

244 :デフォルトの名無しさん:2010/01/17(日) 13:47:24
行数分解行なのか? マジ正解だったか、エスパーになったのか俺w

245 :デフォルトの名無しさん:2010/01/17(日) 15:08:42
>>239
for (i = 0; i < 1000; i++) printf("\n");

コンソールの行数が1000行以上だと使えないんで、環境依存になるけど。

246 :デフォルトの名無しさん:2010/01/17(日) 15:42:04
>>244
初心者用プログラミングスレに長く居るとエスパーになるらしいよ。
もしかして君も?

247 :デフォルトの名無しさん:2010/01/18(月) 17:50:38
あるサイトの画像掲示板にアクセスすると
広告と画像が表示されるので
画像のみの直リンのURLを生成してアクセスすると403となるのですが、
これを回避する方法はないでしょうか?

248 :デフォルトの名無しさん:2010/01/18(月) 18:32:36
そのサイトが何を見て403にしてるのか調べてそこをうまくやればいいんじゃない?Referrerとか。
プログラムの質問かそれ?

249 :デフォルトの名無しさん:2010/01/19(火) 14:47:14
システムフックについて質問です
コンパイラは Borland C Compiler 5.5.1
OSはWindows XP SP2

ここに全部コード貼れないのでzipでうpします。
ソース(DLL用と、呼び出す本体):http://www.dotup.org/uploda/www.dotup.org575327.zip_4DPKVJyH4VjgO7MaoGhC/www.dotup.org575327.zip


キーボードをフックして、printf関数で何が押されたか、を見たいんですが
フォーカスがそのプログラムのウィンドウに来てるときじゃないと何故か反応しないんです。

何故でしょう。
日本語不自由ですみません。

250 :デフォルトの名無しさん:2010/01/19(火) 18:27:23
母国語でOK

251 :デフォルトの名無しさん:2010/01/19(火) 18:37:30
自分のプロセスだけなら共有データセグメントあたりだろ

252 :デフォルトの名無しさん:2010/01/19(火) 21:18:38
>249
・フック関数は、フックされた側のスレッドで実行される。
・GUI アプリでは stdout が開かれていないため printf は 使用できない。
・どうしてもコンソールに表示したいなら、
 フックされた側(フック関数)から、プロセス間通信でフックした側ににデータを送信する。


253 :249:2010/01/20(水) 04:43:19
>>252
なるほど、だからビープ音は鳴るけど表示はされないのか・・・
やってみます、本当にありがとうございます。

254 :デフォルトの名無しさん:2010/01/24(日) 17:15:24
asymptoteという図形記述言語があって見た目はcなのでそのつもりでさわっていたら
i++がエラーになった。調べてみると++iはありだがi++はないようだ。
もし、cで++iとi++のどちらかが使えなくなるとしたら
あなたはどちらを残したいですか?

255 :デフォルトの名無しさん:2010/01/24(日) 17:25:38
>>254
無論++iだろjk
i++しか残ってなかったら変なオーバーヘッドができちゃうかも
しれんだろ

256 :デフォルトの名無しさん:2010/01/24(日) 17:30:20
i++と--iしか使ったことねーな

257 :デフォルトの名無しさん:2010/01/24(日) 19:50:49
Cならi++
C++なら++i 言語名に矛盾が出るがw

258 :デフォルトの名無しさん:2010/01/24(日) 21:09:02
>>254
無論i++だろjk
++iしか残ってなかったら最初のゼロの時の処理がされてないかも
しれんだろ

259 :デフォルトの名無しさん:2010/01/24(日) 21:16:32
>>258
そりゃ無理あるだろw

260 :デフォルトの名無しさん:2010/01/26(火) 19:25:34
Windows上のキーフックについて質問です。
OSはXP Pro SP3です

あるウィンドウにフォーカスがあり、キーを押した後、そのメッセージをフックし、
そのデータを変更してそのウィンドウにメッセージを戻す方法はありませぬか?

例えば

ウィンドウA上で「キー」押す→

フックプロシージャで、もし押されたキーが、AならBに変換、
BならC、CならD・・・、というような処理→

メッセージを元のウィンドウに返す

こんな処理をするには、どんなAPIを使えばよろしいでしょうか

261 :デフォルトの名無しさん:2010/01/26(火) 19:27:20
>>260
ごめんなさい訂正です。

メッセージを元のウィンドウに返すには
どのAPIを使えば良いでしょうか。

262 :デフォルトの名無しさん:2010/01/26(火) 20:23:58
>そのメッセージをフックし
自分でヒントだしておきながらググらないとか

263 :デフォルトの名無しさん:2010/01/26(火) 22:16:09
>>262
一応ググりましたよ


LRESULT CALLBACK KeyboradHook(int code,WPARAM wParam,LPARAM lParam){
 unsigned long c;
 if(code==HC_ACTION){
  if(wParam<){
  /*入ってきたキーコードに+1する*/
   c=wParam+1;
 }
 
 return CallNextHookEx(hook_key,code,wParam,lParam);
}

264 :デフォルトの名無しさん:2010/01/26(火) 22:19:17
途中で送信してすみません
こんな感じのプロシージャです

LRESULT CALLBACK KeyboradHook(int Code,WPARAM wParam,LPARAM lParam){
 unsigned long c;
 if(code==HC_ACTION){
  if(wParam>='A'&&wParam<='Z'){
  /*入ってきたキーコードに+1する*/
   c=wParam+1;
  /*元のウィンドウにこのメッセージを戻すには?*/
  }
 }
 
 return CallNextHookEx(hook_key,code,wParam,lParam);
}

色々ググって見たんですが、どうすればいいのか見当付かずにここで質問した次第です

265 :デフォルトの名無しさん:2010/01/27(水) 07:35:00
CallNextHookExに変更したパラメタ渡せばいい

266 :デフォルトの名無しさん:2010/01/27(水) 07:36:25
あーキー変えるならSendInputとかで投げなおす場合もあるかな
この場合またフックされるが

267 :デフォルトの名無しさん:2010/01/28(木) 14:33:34
>>264です

お返事遅れましたが>>265-266さん
ありがとうございます。


268 :デフォルトの名無しさん:2010/01/29(金) 06:27:27
Linux上のCでシェルスクリプトをexec系の関数で実行して、スクリプト内でエラーが発生したらCでエラー処理を行う、ということを行いたいのですが、スクリプト内のエラーは認識してくれません。よい方法があればご教示お願いします。
カーネル: Linux 2.6.26-2-686 コンパイラ: gcc version 4.3.2 (Debian 4.3.2-1.1)
int main(int argc, char** argv)
{
 char *cmd="./test.sh"; /* 実行するシェルスクリプト */
 char *option="";
 pid_t pid;
 pid_t v_wait;
 int status;
 FILE* stout = fopen("out.txt", "w"); /* 実行結果をout.txtに記録 */
 if (( pid = fork () ) == -1 ) {
  fclose(stout);
  return 1;
 } else if (pid > 0) { /* parent process */
  fclose(stout);
  v_wait = waitpid(pid, &status, 0);
  if (WEXITSTATUS(status) != 0) {
   /* エラー処理をここで行いたい */
  }
 } else { /* child process */
  if ( stout == NULL ) goto error;
  if ( dup2(fileno(stout), 1) == -1 ) goto error;
  fclose(stout);
  dup2(1, 2); /* 標準エラーを標準出力へ */
  fflush(stdout); fflush(stderr);
  execlp(cmd, cmd, option, NULL);
 }
 return 1;
error:
 perror("err"); return 1;
}


269 :デフォルトの名無しさん:2010/01/29(金) 10:49:42
何をしたいのかわからん

エラーメッセージを受け取りたいならパイプを使え

270 :デフォルトの名無しさん:2010/01/29(金) 12:17:06
まあ popen/pclose 使うのが楽だし定石だよなあ。
それはともかく、test.sh 単体の実行結果はちゃんとエラーを戻してる?

271 :デフォルトの名無しさん:2010/01/29(金) 12:20:01
set -eすれば解決するというオチだろう。

272 :デフォルトの名無しさん:2010/01/29(金) 16:55:14
現在シェルスクリプト内で実行ログの取得とエラーチェックのため「>> 2>&1」と戻り値チェック(エラーがあればフラグを立てる)を全行に入れて、
シェルスクリプト実行が終わった時点でフラグが立ってたら(1つでもエラーがあれば)メールで実行ログを自分当てに送信という、処理をしてます。
が、処理を追加するたびに、これらも一緒に追加するのが面倒なので、シェルスクリプトには本来の処理だけやってもらって、ここの部分だけCで書けないかと思った次第です。
そのため、test.sh単体ではあえて戻り値を返さずに処理してます。

標準出力を吐き出すファイルと標準エラーを吐き出すファイルを別々にして、
標準エラーを吐き出したファイルが空でなければエラー処理…という方法も
考えましたが、実行ログには両方書き込まれた状態で作成したいので
どうしたら良いか悩んでます。


273 :デフォルトの名無しさん:2010/01/29(金) 20:23:26
int hoge( vector<double>& test){
int num;
for(iをtestのサイズ分まで増やす){
 if(VAL == test[i]){ num=i }
}
return num;
}
main {
vector<double> test;
testの中にデータを入れる。
int num = hoge(test);
vector<double>::iterator it;
it = test[num] ←testのnum番目のイテレータを取得したい
}

省略したコードで申し訳ないのですが、上記の中にあるような
処理がしたいです。何かよい方法はあるのでしょうか?

よろしくお願いします。

274 :デフォルトの名無しさん:2010/01/29(金) 20:28:06
it = test.begin()+num;

275 :デフォルトの名無しさん:2010/01/29(金) 21:46:04
ファイル名にワイド文字が入ってる場合にstd::fstreamで扱うことは可能でしょうか?

276 :デフォルトの名無しさん:2010/01/29(金) 21:46:09
advance(vegin(), num);

277 :デフォルトの名無しさん:2010/01/31(日) 09:20:28
DWORD dwSize = 1000;
char mes[80];
sprintf( mes, "%d", dwSize );
printf( mes );
で DWORD の値がmesに反映されないんだけど
DWORD の書式は %dでよかったっけ?

278 :デフォルトの名無しさん:2010/01/31(日) 09:27:03
%u

279 :デフォルトの名無しさん:2010/01/31(日) 10:14:19
thx


280 :デフォルトの名無しさん:2010/01/31(日) 10:15:27
http://www.sekai.nu/channel/moe/?m=n&p=1
のページにある画像データだけ直リンでダウンロードしようとしてるのですが
wget で
wget http://www......jpg
と入力しても403が返ってきてダウンロードできないのですが
どうすれば画像だけダウンロードできるのでしょうか?

281 :デフォルトの名無しさん:2010/01/31(日) 10:37:16
それはC/C++の質問?

282 :デフォルトの名無しさん:2010/01/31(日) 23:36:06
文字列から最初の'*'を探して、そこから後を削除するっていうのは↓でできるんですが

str.erase(find(str.begin(), str.end(), '*'), str.end());

文字列から最後の'*'を探して、そこから前を削除するっていうのは1行で書けますか?

str.erase(str.begin(), find(str.rbegin(), str.rend(), '*'));

としてもコンパイル出来ませんでした

283 :デフォルトの名無しさん:2010/02/01(月) 03:32:17
初めての質問です。
よろしくお願いいたします。

とあるWebブラウザゲームを定期巡回しながら
1.データ値取得
2.データ値から状況解析
3.解析結果をWebに入力

というプログラムを作りたいと思っています。

こういったことはC言語で可能でしょうか??

284 :デフォルトの名無しさん:2010/02/01(月) 06:23:56
>>282
str.erase(str.begin(), str.begin() + str.rfind('*') + 1);

285 :デフォルトの名無しさん:2010/02/01(月) 08:13:16
>>284
ありがとうございます
イテレーターって数字足してもいいものだったんですね

286 :デフォルトの名無しさん:2010/02/01(月) 10:28:59
>>283
可能だがこれからC言語を勉強しようというのだったらそのことだけに集中しても1ヶ月はかかると思われる
他に本業があってその合間に片手間で勉強とかいうなら1年はかかると思われる

287 :デフォルトの名無しさん:2010/02/01(月) 10:35:33
>>285
足してもいいイテレータと足せないイテレータがある
vectorとかstringは足してもいいランダムアクセスイテレータ
listとかsetのイテレータはランダムアクセスじゃないので足せない

288 :デフォルトの名無しさん:2010/02/01(月) 13:18:36
>>285
std::stringのメンバ関数とアルゴリズムはreverse_iteratorを受け付けないので
不便だと思う事がよくあるよな

この場合は逆変換メンバ関数base()を使って

str.erase(str.begin(), find(str.rbegin(), str.rend(), '*').base());

と書くとすっきりして読みやすいと思うがどうだろうか

289 :デフォルトの名無しさん:2010/02/01(月) 17:02:54
>>283
可能

290 :デフォルトの名無しさん:2010/02/02(火) 07:48:15
>>286
ご回答ありがとうございます。
C言語を扱うモチベーションが欲しかっただけなので
片手間ながらもやっていこうと思います。

ブラウザだけスクリプトブラウザというものを使えば
javascript , C , VBA 辺りを使えばできそうなので
なんとかやってみようと思います。


291 :デフォルトの名無しさん:2010/02/02(火) 15:19:16
バイナリファイルを一括でメモリに読み込む方法はわかるんですが
テキストファイルを一括でメモリに読み込む方法はありますか?

292 :デフォルトの名無しさん:2010/02/02(火) 15:21:58
同じでは?

293 :デフォルトの名無しさん:2010/02/02(火) 17:39:06
あります

294 :デフォルトの名無しさん:2010/02/02(火) 17:41:57
納入したからファイル整理してたら
バックアップごと全部消したぜ
もう製品も体験版もソースも残ってねぇぜ


いええええええええええええええええあああああああああああああああああああああああああああああああああああああああああ

295 :デフォルトの名無しさん:2010/02/02(火) 17:46:21
復元しろよ

296 :デフォルトの名無しさん:2010/02/02(火) 17:47:21
そんなたいそうな代物
あるわけねぇじゃん

いえええええええええええええええええええええええええあああああああああああああああああああああああああああああ

297 :デフォルトの名無しさん:2010/02/02(火) 17:49:19
バックアップの削除なんて個人の権限で出来るもんなの?

298 :デフォルトの名無しさん:2010/02/02(火) 17:50:55
じゃあバイナリから復元すればいいと思います。

299 :デフォルトの名無しさん:2010/02/02(火) 18:10:24
納入先に頼んでコピーしてもらえばいいじゃない

300 :デフォルトの名無しさん:2010/02/02(火) 18:58:11
>>297
個人経営なんじゃない?

301 :デフォルトの名無しさん:2010/02/02(火) 19:43:56
>>294
ちょ!
どうやってバグフィックスすんだ!!


302 :デフォルトの名無しさん:2010/02/02(火) 19:46:17
>>294
夜逃げでもすんのか?

303 :デフォルトの名無しさん:2010/02/02(火) 20:50:46
Glary Undelete とか使えばもしかしたら復元できる望みがあるかもしれない

304 :デフォルトの名無しさん:2010/02/03(水) 17:19:59
#include <stdio.h>

void init(int array[10][10], int width, int height);
void make_grider(int array[10][10]);
int check_life(int array[10][10], int width, int height,int x, int y);
void check_all_life(int array[10][10],int width, int height);
void print_lifes(int array[10][10],int width,int height);

int main(int argc, char* argv[])
{
int lifes[10][10];
int i;
init(lifes,10,10);
make_grider(lifes);
for(i = 0; i <= 2; i++) {
print_lifes(lifes,10,10);
printf("--------------------------------------------------------------\n");
check_all_life(lifes, 10, 10);
}
return 0;
}

void init(int array[10][10], int width, int height)
{
int x, y;
for(x = 0; x < height; x++) {
for(y = 0; y < width; y++) {
array[x][y] = 0;
}
}
}


305 :デフォルトの名無しさん:2010/02/03(水) 17:23:04
int check_life(int array[10][10], int width, int height, int i, int j)
{
int ans = 0;
ans += array[(i + height + 1) % height][(j + width - 1) % width];
ans += array[(i + height + 1) % height][(j + width) % width];
ans += array[(i + height + 1) % height][(j + width + 1) % width];
ans += array[(i + height) % height][(j + width - 1) % width];
ans += array[(i + height) % height][(j + width + 1) % width];
ans += array[(i + height - 1) % height][(j + width - 1) % width];
ans += array[(i + height - 1) % height][(j + width) % width];
ans += array[(i + height - 1) % height][(j + width + 1) % width];

return ans;
}


306 :デフォルトの名無しさん:2010/02/03(水) 17:24:15
void check_all_life(int array[10][10],int width, int height)
{
int x,y,live_neighbors;
live_neighbors = 0;
for (x = 0; x < height; x++) {
for (y = 0; y < width; y++) {
live_neighbors = check_life(array,width,height,x,y);
if(array[x][y] == 1) {
if(live_neighbors == 3 || live_neighbors == 2) {
array[x][y] = 1;
}
else {
array[x][y] = 0;
}
}
else if(array[x][y] == 0) {
if(live_neighbors == 3) {
array[x][y] = 1;
}
else {
array[x][y] = 0;
}
}
else {
array[x][y] = 0;
}
}
}
}


307 :デフォルトの名無しさん:2010/02/03(水) 17:26:32
void print_lifes(int array[10][10], int width, int height)
{
int x, y;
for(x = 0; x < height; x++) {
for (y = 0; y < width; y++) {
if(array[x][y] == 1) {
printf("[X]");
}
else if(array[x][y] == 0) {
printf("[ ]");
}
}
printf("\n");
}
}
C言語の習作としてLifeGameを書いてみたのですが実行すると
なぜだかきちんと更新されません。ここ数日考えてみたり
Web上のソースを読んだりしてみたのですがどうも原因が分かりませんでした
見落としている点がどこにあるのかお教え願います
よろしくお願いします。

308 :デフォルトの名無しさん:2010/02/03(水) 17:44:15
arrayを参照しながらarrayを更新しているためだ
check_lifeで新しい状態を計算するときに現在の状態と新しい状態をごちゃまぜに見てしまうため正しく動かない
新しい状態は別の配列に書き込み、全部のマスの計算を終えた後それをarrayに書き戻せば上手くいく
ところで何レスも消費しそうな長いコードはどこかにうpしてURLだけ貼り付けてくれ

309 :デフォルトの名無しさん:2010/02/03(水) 18:10:09
なるほど、よくわかりました。
説明をきいてよくよく考えたら確かにその通りでした。

初めての書き込みだったのでどうすればいいか分かりませんでした
今後お世話になることがあればきちんとそのようにしたいと思います。

310 :デフォルトの名無しさん:2010/02/03(水) 20:38:41
 codepad
 ttp://codepad.org/

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


ってテンプレートに入れようぜ。

311 :デフォルトの名無しさん:2010/02/04(木) 18:41:23
http://codepad.org/pyN4NCxd

なんでtest1がダメでtest2がおkなのはどうして?

312 :デフォルトの名無しさん:2010/02/04(木) 19:04:12
いや、どっちもダメだ
test1はそのダメさがあまりにあからさまなのでそれに気付いたコンパイラが親切にも警告してくれた
test2はコンパイラがそのダメさに気付かず見過ごしてしまっただけでダメなことには変わりない

313 :デフォルトの名無しさん:2010/02/04(木) 19:10:21
じゃあ例外でメッセージ送りたい場合ってどうするの?
const char *もダメで、stringじゃあ二重に例外発生の危険がある
配列を持たせて、そこにコピーすれば良さそうだけど長さが足りなくなるかもしれない

314 :デフォルトの名無しさん:2010/02/04(木) 19:13:40
>>312
分かりやすい!


315 :デフォルトの名無しさん:2010/02/04(木) 19:20:09
いいんじゃね
足りない分は切り捨てれば
なんなら末尾に "省略されました・・・全てを読むにはワッフルワッフル(ry" とでも付けておけば問題ない

316 :デフォルトの名無しさん:2010/02/04(木) 19:46:05
staticにすればいいと思うよ

317 :デフォルトの名無しさん:2010/02/04(木) 19:51:26
>>313
std::runtime_errorなりなんなりにメッセージを入れといて
投げればいいじゃない。


318 :デフォルトの名無しさん:2010/02/05(金) 13:57:27
>310
おもしろいね

319 :デフォルトの名無しさん:2010/02/05(金) 18:38:45
http://codepad.org/dCuop75L

こういう場合は投げた"abc"は一時オブジェクトなのでしょうか?

320 :デフォルトの名無しさん:2010/02/05(金) 18:42:44
リテラルっしょ? コードセグメントに埋め込まれたconst char *を投げてるだけでは?

321 :デフォルトの名無しさん:2010/02/05(金) 18:57:15
なるほどありがとうございました

322 :デフォルトの名無しさん:2010/02/05(金) 21:37:35
コンストラクタが10分の1の確率で例外を投げるようにして
こんなものを作ってみました。
ttp://codepad.org/1Uf0BQ68

1.
この
{
boost::shared_ptr<MyClass> p1(new MyClass);
boost::shared_ptr<MyClass> p2(new MyClass);
boost::shared_ptr<MyClass> p3(new MyClass);
boost::shared_ptr<MyClass> p4(new MyClass);
}
の部分で、(例えば)3つ目を生成する時に例外が発生した場合、
p1やp2のデストラクタは呼ばれていないのでしょうか?
私の環境で実行すると
ttp://uploader.rgr.jp/src/up1887.jpg
こんなことになりました。
それとも「実はデストラクタは呼ばれているが画面に反映されていない」だけでしょうか?

2.
また
boost::shared_array<MyClass> p(new MyClass[4]);
で失敗(例外を投げた)した場合は、p1〜p4は既に前のスコープを脱出する段階で
正常に破棄されているのでリソース漏れは無いと思うのですが、
pの途中まで生成された分は破棄されますか?

よろしくお願いします。

323 :デフォルトの名無しさん:2010/02/05(金) 22:49:16
>>322
try-catchでくくってごらん
int main()
{
try
{
std::srand((unsigned int)std::time(NULL));

{
boost::shared_ptr<MyClass> p1(new MyClass);
boost::shared_ptr<MyClass> p2(new MyClass);
boost::shared_ptr<MyClass> p3(new MyClass);
boost::shared_ptr<MyClass> p4(new MyClass);
}

{
boost::shared_array<MyClass> p(new MyClass[4]);
}
}
catch(...)
{
std::cout<<"例外が投げられた\n";
}
return 0;
}


324 :322:2010/02/05(金) 23:10:24
>>323
ありがとうございます。

ttp://codepad.org/dm1DTm2d
try-catchでくくってみました。

1.
 ttp://uploader.rgr.jp/src/up1892.jpg
2.
 ttp://uploader.rgr.jp/src/up1893.jpg

確かに両方とも問題無く破棄されているようです。
・・・しかし、だとすると>>322でデストラクタが実行されていない様に見えたのは、
「実はデストラクタは呼ばれているが画面に反映されていない」ということなのでしょうか?

325 :デフォルトの名無しさん:2010/02/05(金) 23:12:13
>>311
throwってオブジェクトはスコープ飛び越えるんじゃなかったっけ?

326 :322:2010/02/05(金) 23:14:12
追記:
int main_impl()
の様にわけてみても
try-catchなしの
ttp://codepad.org/gCiHDqlw
では
ttp://uploader.rgr.jp/src/up1894.jpg
ttp://uploader.rgr.jp/src/up1895.jpg
のように、デストラクタが動いている様子が確認できません。


327 :デフォルトの名無しさん:2010/02/05(金) 23:17:52
自動変数はデストラクトされる
配列もデストラクトされる

328 :デフォルトの名無しさん:2010/02/05(金) 23:38:52
>>327
だとすると>>322でデストラクタが実行されていない様に見えたのは、
「実はデストラクタは呼ばれているが画面に反映されていない」ということなのでしょうか?

329 :デフォルトの名無しさん:2010/02/05(金) 23:58:27
abortしたばあいはデストラクタは呼ばれずに即強制終了
http://codepad.org/ButwZVJU

そして例外をどこかで補足しないまま放置すると勝手にabortされてしまう

330 :デフォルトの名無しさん:2010/02/06(土) 09:42:01
abortの意味を考えると、オブジェクトのミイラを作るために
デストラクタを呼ばないのは妥当と思う。

331 :322:2010/02/06(土) 23:08:25
>>329-330
なるほど。
ありがとうございます。

332 :デフォルトの名無しさん:2010/02/07(日) 16:47:12
C++ではnewした場合としなかった場合では、
メンバへのアクセスに使う演算子( . と ->)が違います

なぜ、使い分けるのが面倒なのに、わざわざメンバへのアクセス方法を別にしたのですか?

333 :デフォルトの名無しさん:2010/02/07(日) 16:51:48
.と->が対等に存在するというより、(*p).Memberのシンタックスシュガーとしてp->Memberが導入された。

334 :デフォルトの名無しさん:2010/02/07(日) 17:16:32
>>322
Cでもポインタの場合はアロー演算子を使うじゃん。

335 :デフォルトの名無しさん:2010/02/07(日) 17:17:43
あっ、間違えた>>332宛な。

336 :デフォルトの名無しさん:2010/02/07(日) 17:24:56
>>332
newしたからという区別ではない。変数と参照はドット演算子、ポインタはアロー演算子だよ。


337 :332:2010/02/07(日) 17:34:53
>>333
ありがとうございました

>>335-336
なぜ、導入されたかを知りたかっただけ

338 :デフォルトの名無しさん:2010/02/07(日) 18:15:44
導入の経緯を言うなら、C++ではなくCの話な(構造体へのアクセス)

339 :デフォルトの名無しさん:2010/02/07(日) 19:15:04
>>338
申し訳ない
C言語を飛ばして、C++を勉強しているので

C言語はポインタばっかりだし、クラスが無いから勉強する気になれないんで
mallocとかの使いかたも知らないしorz

340 :デフォルトの名無しさん:2010/02/07(日) 19:25:55
C++ = C + class

341 :デフォルトの名無しさん:2010/02/07(日) 19:26:46
>>339
どーせJavaから入ってるんだろうけど
まずポインタってものを理解しろ

342 :デフォルトの名無しさん:2010/02/07(日) 19:27:53
あー、違うか。
C/C++では、(Javaのプリミティブ型と同じように)スタックにオブジェクトを確保できること、からかな。

343 :デフォルトの名無しさん:2010/02/07(日) 19:30:03
そうか、Javaから入ってきたらスタックでつまずくのか。

344 :デフォルトの名無しさん:2010/02/07(日) 19:37:51
classやstructのメンバとして
参照(ポインタ)ではなく実体を持てる、って点も同様だね。

345 :332:2010/02/07(日) 19:45:17
>>341
そうです、java出身

>>342
javaだとメモリが抽象化されすぎてる所が、嫌になったわけです
でも、C++だと明示的にdeleteするのが面倒くさいですね

>>343
ヒープは適当な所でdeleteすればいいだけですからね
でも、スタックは自動でdeleteしちゃうじゃないですか

346 :デフォルトの名無しさん:2010/02/07(日) 19:52:34
ローカルな自動変数だろうがヒープに確保しようが、関数に引数として渡してしまえば区別はなくなる。
参照型で引数を受け取ればドットでアクセスすることになるし、ポインタ型で受け取れば矢印でアクセスすることになる。


347 :デフォルトの名無しさん:2010/02/07(日) 20:03:46
>>345
スマートポインタやRAIIのような機構を使えば
明示的にdeleteするコードなんてほとんど書かなくなるよ

348 :デフォルトの名無しさん:2010/02/07(日) 20:05:38
>>346
実体も渡せる

349 :332:2010/02/07(日) 20:12:35
>>345
スマートポインタ→auto_ptrとかが代表
C++0xではauto_ptrが推奨されていなくて、shared_ptrがって話がありますよね

メモリ管理を楽にするプログラミングを覚えて、
生産性をあげたいのですがC++の入門サイトだとダメですね

てか、Javaスレと比べるとC++スレは親切な人が多いな〜

350 :デフォルトの名無しさん:2010/02/07(日) 20:16:22
>>349
0xにはshared_ptrだけでなく、auto_ptrライクなunique_ptrもあるよ。
unique_ptrはauto_ptrと違って、std::vectorなどのコンテナにも入れられる。

351 :デフォルトの名無しさん:2010/02/07(日) 20:43:11
>>349
おめー、なんか大きな勘違いをしてるみたいだから
一つだけ教えてやる。

>C++スレは親切な人が多い
これだけは絶対間違ってる。

352 :デフォルトの名無しさん:2010/02/07(日) 20:58:05
C++でCは避けて通れないぞ。
生産性云々言う前に、Cの勉強から出直すべし。
Javaで培ったオブジェクト指向脳が役に立つとすればその後だ。

353 :デフォルトの名無しさん:2010/02/07(日) 21:01:09
CとC++はぜんぜん違うぞ。そう、焼きそばとカップ焼きそばぐらいに

354 :デフォルトの名無しさん:2010/02/07(日) 21:35:01
両方ともうんこになれば同じ。

355 :デフォルトの名無しさん:2010/02/07(日) 21:51:22
C++を勉強すればCも分かるだろ。
CにあってC++では実現出来ないものってあるの?
既にCのスーパーセットではないとは言われてるけど。

356 :デフォルトの名無しさん:2010/02/07(日) 21:59:18
>>355
実現できない物議論をするのか?

じゃあバイナリエディタで直接書けばいいじゃない。
何でもできるよ。

357 :デフォルトの名無しさん:2010/02/07(日) 22:14:45
>>355
struct {
int a,b,c
} aaa = {.a = 10, .c = 0};
こんなん出来る?

358 :デフォルトの名無しさん:2010/02/07(日) 22:32:32
>>357
aとcだけ初期値を与えたいということであれば、コンストラクタを書けばいい。

.aや.cなどメンバを指定したいということであれば、ちょっと面倒。
マクロでやるかメンバ関数をチェインさせるか。

359 :デフォルトの名無しさん:2010/02/07(日) 22:53:42
C++よりCの方が綺麗にかけるっていう例はあるの?


360 :デフォルトの名無しさん:2010/02/08(月) 00:49:28
>>359
Cとの連携のために

#ifdef __cplusplus
extern "C" {
#endif

みたいなのを書かなくていいこと(当たり前だ)

361 :デフォルトの名無しさん:2010/02/08(月) 01:34:08
>>359
Cでできることは大抵C++でできるので、ほとんどない。
あったとしても、newって変数名が使えなくなったとか、キャストせずにやったところをキャストする必要が出てきたとか、
C++に書き直しても綺麗でなくなるとは言えないものが多い。

けど、Cの機能使って書いたら綺麗だろうに、
C++の機能を変に使ったが故に汚くなることはいくらでもある。

362 :デフォルトの名無しさん:2010/02/08(月) 07:03:10
浮動小数点の精度指定表示とか

363 :デフォルトの名無しさん:2010/02/08(月) 13:44:11
Cのほうがきれいって言うか
型名、変数名はC++のほうが長くなりがちでうざい
スコープ解決もあるし

364 :デフォルトの名無しさん:2010/02/08(月) 15:04:04
ただ、for (int i = と書きたい。

365 :デフォルトの名無しさん:2010/02/08(月) 15:13:41
それってC99ではOKなんじゃなかったっけ

366 :デフォルトの名無しさん:2010/02/08(月) 15:59:47
boost::formatを使えばある程度というかかなり綺麗に書ける

367 :デフォルトの名無しさん:2010/02/08(月) 19:03:25
+と*と()だけの数式ってLL(1)で解析できる?

368 :デフォルトの名無しさん:2010/02/08(月) 21:17:47
operatorのオーバーロードって普段は自分でやりますかね?
フレームワークとかライブラリの作者しか、使わないような気がするけど

369 :デフォルトの名無しさん:2010/02/08(月) 21:49:01
STLを使ってるならoperator()はよくオーバーロードする
後はコンパイラのデフォルトで困る場合operator=をオーバーロードするぐらい

370 :デフォルトの名無しさん:2010/02/08(月) 21:50:41
>>369
やっぱり、そんくらいだよな

371 :デフォルトの名無しさん:2010/02/08(月) 21:53:54
使いまくる
 ( )
 =

割とつかう
 比較各種
 ->
 *
 |

372 :デフォルトの名無しさん:2010/02/08(月) 22:04:24
STLコンテナになるための比較演算子も忘れるな

373 :デフォルトの名無しさん:2010/02/08(月) 22:05:04
って、書いてあったか
でも=と同程度以上には使うイメージ

374 :デフォルトの名無しさん:2010/02/08(月) 22:09:18
忘れてた++もイテレータで使うね

375 :368:2010/02/08(月) 22:14:49
ついでに、質問なんですが
std::cout << "str";は、C++の標準出力で有名ですが
std::coutはどうやって << の値を、受け取っているんですか?


376 :デフォルトの名無しさん:2010/02/08(月) 22:45:10
>>375
ついでかよ・・・。

377 :デフォルトの名無しさん:2010/02/08(月) 22:55:14
operator <<

378 :デフォルトの名無しさん:2010/02/08(月) 22:55:49
数値を入れたら括弧の付け方を生成するプログラムを作ろうとしてるんですが
さっぱりわかりません
こんな感じになってほしいんですが
どういう方針で作ればよいのでしょうか

n=2の場合
(1 2)
n=3の場合
((1 2) 3)
(1 (2 3))
n=4の場合
(((1 2) 3) 4)
((1 (2 3)) 4)
(1 ((2 3) 4))
(1 (2 (3 4)))
((1 2) (3 4))


379 :デフォルトの名無しさん:2010/02/08(月) 23:00:12
再帰が必要かな

380 :デフォルトの名無しさん:2010/02/08(月) 23:06:17
>>367
確かできるはず。
http://codepad.org/W286gdPj
数の処理がきたないのはごめんなさい。

381 :デフォルトの名無しさん:2010/02/08(月) 23:15:57
>make: `first' に対して行うべき事はありません.
gcc先生がこんなメッセージを出すわけですが、
何これ?

382 :デフォルトの名無しさん:2010/02/08(月) 23:24:47
何を make に食わした?

383 :デフォルトの名無しさん:2010/02/08(月) 23:27:45
LANG=C makeしてから聞け。

384 :デフォルトの名無しさん:2010/02/08(月) 23:41:02
>>382
作ったコードを単純に動かしてみただけ
ちゃんと動くけど、gccがメッセージを吐いているから気になっただけ

>>383
それ何してるの?
linuxを使っているんだけど、コマンド(emerge)を使って自動でインストールしたから
何がなんだかサッパリなんだけど

385 :デフォルトの名無しさん:2010/02/08(月) 23:41:16
そのままだろ
LANG=Cする必要も無い

386 :デフォルトの名無しさん:2010/02/09(火) 08:59:57
苦労しました。誰かもっとCOOLなの教えてくらはい
http://codepad.org/tSDffcxm

387 :デフォルトの名無しさん:2010/02/09(火) 15:23:05
http://codepad.org/CR8zyHne

388 :デフォルトの名無しさん:2010/02/09(火) 19:08:31
うは、大分すっきりしていますね
参考にさせていただきます

389 :デフォルトの名無しさん:2010/02/09(火) 19:44:37
セジウィックの本を見ながら機械的な再帰の除去に挑戦してるんですが
一か所だけどうしてもうまくいきません
show_dfs_raw4の箇所が分かる人いたら教えてもらえませんか

http://codepad.org/TbR5kRu1

木構造をpreorderで表示する関数。これを非再帰に書き換える
void show_dfs_raw(ptree& p){
cout << p->d;
if(p->l)show_dfs_raw(p->l); //LからR
if(p->r)show_dfs_raw(p->r);
}

390 :デフォルトの名無しさん:2010/02/10(水) 15:05:10
クラスのnew シタデーターを&aじゃなくてaでreturnすると、&aがアドレスを2回コピーするのに対して
return するときに一時変数にコピーするのと
returnしたデーターを保存するために変数にコピーするから2回コピーされるんですか?
保存しないで一時変数のまま使えば1回ですか?


391 :デフォルトの名無しさん:2010/02/10(水) 15:23:42
日本語でおk

392 :デフォルトの名無しさん:2010/02/10(水) 15:26:20
訂正
誤 シタデーター
正 したデータ

393 :デフォルトの名無しさん:2010/02/10(水) 15:33:30
Object& aaaa(){};
Object& bbbb(){};
Object cccc{

}

394 :デフォルトの名無しさん:2010/02/10(水) 15:35:08
Object& aaaa(){};
Object bbbb(){};
Object cccc{
return aaaa()*aaaaa();
}
Object dddd{
return bbbb()*bbbb();
}
これについて教えてください。
aaaaaというのは>>390の奴です。
効率は違うんですか?

395 :デフォルトの名無しさん:2010/02/10(水) 15:38:40
ccccとddddは()わすれました

396 :デフォルトの名無しさん:2010/02/10(水) 16:10:42
bbbbの関数の中で
return b;
ってやるじゃないですか
するとbは書き換えられないように一時変数にbのコピーコンストラクターで
コピーされますよね。
そのあとObject c=bbbb();ってやると2回コピーされますよね

397 :デフォルトの名無しさん:2010/02/10(水) 18:03:40
http://ja.wikipedia.org/wiki/C++0x#.E5.8F.B3.E8.BE.BA.E5.80.A4.E5.8F.82.E7.85.A7.E3.81.A8_Move_semantics

398 :デフォルトの名無しさん:2010/02/10(水) 18:08:19
右辺値って今のC++で真似できんの?

399 :デフォルトの名無しさん:2010/02/10(水) 18:11:24
>>396をお願いします。
本当に困っています。


400 :デフォルトの名無しさん:2010/02/10(水) 18:39:47
>>396
されない
それはコピーコンストラクタの特別な書き方
もしそういう書き方を避けたいならexplicitをコンストラクタに付けておく

そうすると Object c(bbbb()) って書き方しか出来なくなる

401 :デフォルトの名無しさん:2010/02/10(水) 18:54:24
bは値渡しだから一時変数にコピーするじゃないですか。
そのあと、一時変数を参照をcにコピーしたら一時変数は消えるから
cは何も指さなくなるからまた値渡しになって2回コピーされるじゃないですか?
aaaa()の場合は2回渡しても参照だからアドレス渡すだけで早いんじゃないですか?
この文で間違っているところありますか?

402 :デフォルトの名無しさん:2010/02/10(水) 19:34:17
回答者に対して失礼と言っていいレベル。

403 :デフォルトの名無しさん:2010/02/10(水) 20:09:00
なんか根本的なところでおかしい。
newするならポインタを取っておいてdeleteしなきゃダメ。

404 :デフォルトの名無しさん:2010/02/10(水) 20:35:07
アスペルガーっぽいなと見てたらその通りだったでござる

405 :デフォルトの名無しさん:2010/02/10(水) 20:38:46
NRVO

406 :デフォルトの名無しさん:2010/02/10(水) 20:40:55
>>401
確かにそうだな
ちょっと考えるとbbbb()の戻り値を入れる場所とcの場所はまず違う
そうなると一時オブジェクトの生成とcの初期化に2回コピーされそうだな

C++0xの右辺値参照こういう場合アドレス渡し出来る所はガンガン
アドレス渡しだけしてコピーを省略する仕組みになる予定

407 :デフォルトの名無しさん:2010/02/10(水) 20:46:09
>>400
そういう書き方をしたからどうだと言うのだね
http://codepad.org/ylXYtNpH

408 :デフォルトの名無しさん:2010/02/10(水) 22:06:29
関数の失敗をboolで返す場合って
true成功
false失敗
が一般的ですよね?

409 :デフォルトの名無しさん:2010/02/10(水) 22:36:03
>>408
というか関数の名前しだいじゃないかな?

bool xxx_is_failed(〜)
だったら
true失敗
false成功
になると思うんだけど?

410 :デフォルトの名無しさん:2010/02/10(水) 23:19:52
bool型が必要になったいきさつはExceptional C++ P220 項目45に書いてある
この本は相当キチガイじみているがそれでも必携の本だと思う

411 :デフォルトの名無しさん:2010/02/11(木) 01:23:32
#include <iostream>
using namespace std;

class Obj{
char a;
public:
Obj(){ cerr << "Obj()" << endl; }
Obj(const Obj&){ cerr << "Obj(const Obj&)" << endl; }
};

Obj val_val(Obj obj){ return obj; }
// Return local variable
// Obj &val_ref(Obj obj){ return obj; }
Obj ref_val(Obj &obj){ return obj; }
Obj &ref_ref(Obj &obj){ return obj; }

int main(){
Obj obj, t;
cerr << "val->val" << endl;
val_val(obj);
cerr << "ref->val" << endl;
ref_val(obj);
cerr << "ref->ref" << endl;
ref_ref(obj);
cerr << "assign val->val" << endl;
t = val_val(obj);
cerr << "assign ref->val" << endl;
t = ref_val(obj);
cerr << "assign ref->ref" << endl;
t = ref_ref(obj);
}

412 :デフォルトの名無しさん:2010/02/11(木) 01:26:11
実行結果
Obj()
Obj()
val->val
Obj(const Obj&)
Obj(const Obj&)
ref->val
Obj(const Obj&)
ref->ref
assign val->val
Obj(const Obj&)
Obj(const Obj&)
assign ref->val
Obj(const Obj&)
assign ref->ref

ここまで書いて気づいたけど、代入じゃコピーコンストラクタ呼ばれないじゃん。

413 :デフォルトの名無しさん:2010/02/11(木) 01:39:35
Objの定義に
Obj &operator =(const Obj &obj){ cerr << "operator =" << endl;return *this; }
を追加して同様に実行してみたら、代入なしの方は結果同じで、
代入ありの方の結果:
assign val->val
Obj(const Obj&)
Obj(const Obj&)
operator =
assign ref->val
Obj(const Obj&)
operator =
assign ref->ref
operator =

結論
呼び出し時に、値渡しなら1回コピーされる。参照渡しならされない
変数返したときに、値返しなら1回コピーされる。参照返しならされない

代入演算子の呼び出しも、恐らく同様。
参照渡しの参照返しなら(コピーコンストラクタでの)コピーは発生しないが、通常は代入演算子でコピーのような処理をすると思われる
(デフォルトでは、変数の中身全部コピーじゃねーの?多分

414 :デフォルトの名無しさん:2010/02/11(木) 07:51:53
>>408
何をもって成功/失敗とするのか曖昧なこともあるからね。

415 :デフォルトの名無しさん:2010/02/11(木) 08:27:20
char* の配列を確保したいのですが、サイズは定数ではなく変数にしたいです。
char **v = (char**) alloca(size);
↑のように書きましたが、これだと char *v[100]; とするのは別でしょうか?


416 :デフォルトの名無しさん:2010/02/11(木) 08:39:31
うん、別

417 :デフォルトの名無しさん:2010/02/11(木) 14:44:01
C++は途中で変数宣言できるらしいけど
while(1) int n;
とかやったら無限にメモリ領域を確保することになるの?

418 :デフォルトの名無しさん:2010/02/11(木) 14:45:32
No

419 :デフォルトの名無しさん:2010/02/11(木) 14:47:38
>>417
単に{]ブロックの最初で宣言したのと同じような意味合いになるだけ。

420 :デフォルトの名無しさん:2010/02/11(木) 15:02:27
while (1) new int();

421 :415:2010/02/12(金) 00:46:37
>>416
ありがとうございます。
char *v[100] 相当のことを alloc 系の関数でやるにはどうすればいいか教えてください。

422 :デフォルトの名無しさん:2010/02/12(金) 01:07:53
>>421
質問の仕方が下手だなぁ。それじゃ>416も「別」としか答えられないじゃないの。
エスパーするとこういう事?
num=100;
char **v = (char**)alloca(num*sizeof(char **));

423 :デフォルトの名無しさん:2010/02/12(金) 01:17:09
>>421
ちなみに、確保したのはあくまでchar*へのポインタの配列だから、それだけじゃ
v[i][j]="hogehoge";
みたいなのはできないよ。

分かってるかもしれないけど、念のため。

424 :422:2010/02/12(金) 01:32:24
あ、ミスったw
sizeof(char *)だ

425 :デフォルトの名無しさん:2010/02/12(金) 09:17:17
SSE4.2を使ったstrcmpとかstrlenってどれぐらい速いのですか?
jmpを使ったものに比べて何倍にもなるんでしょうか?

426 :デフォルトの名無しさん:2010/02/12(金) 09:31:20
すみません
Class Aを持つクラス Bがあって インスタンス名はcです。
Aにはconst a& aaaa();という関数があります。
aはAの中で保持しているデータです。
Bにはconst a& (){
return c.aaaa();
}
ってやると一時変数をリターンしたみたいな警告がでるようなきがします。
実験して無いのでわかりませんが、似たような状態で警告が出ました。
どうしたらいいですか?

427 :デフォルトの名無しさん:2010/02/12(金) 09:36:20
実際の状態では、クラスBはテンプレートでした。

428 :デフォルトの名無しさん:2010/02/12(金) 09:41:15
>>426
警告が出ないので再現出来ません

429 :デフォルトの名無しさん:2010/02/12(金) 09:45:18
コンパイラーはMINGWです。

430 :デフォルトの名無しさん:2010/02/12(金) 09:45:46
警告が出る最小限のソースを晒して下さい

431 :デフォルトの名無しさん:2010/02/12(金) 09:53:26
それがさっきの奴です。
コンパイルしてないので分かりません。
データーの型もテンプレートです。

432 :デフォルトの名無しさん:2010/02/12(金) 09:56:45
バカなの?
コンパイル出来て、警告が出るソースを出せって言われてるの。

433 :デフォルトの名無しさん:2010/02/12(金) 09:56:54
テンプレートもちゃんと書いたコードをcodepadにでも貼り付けて下さい
検証してみますから

434 :デフォルトの名無しさん:2010/02/12(金) 10:12:38
警告は参照を一時変数でリターンしているというような理由です。

435 :デフォルトの名無しさん:2010/02/12(金) 10:13:23
コードを晒せと言っているんですが見えませんか?

436 :デフォルトの名無しさん:2010/02/12(金) 10:19:06
本をまねしただけなので同じとはいえないのですが
C++ Templates: The Complete Guide の
Expression Templatesの章の
ArrayクラスのT operator[] constの戻り値を
&Tに変えたクラスと同じ状態だと思います。
有名な本だと思うので分かると思います。

437 :デフォルトの名無しさん:2010/02/12(金) 10:20:47
訂正
&TじゃなくてT&

438 :デフォルトの名無しさん:2010/02/12(金) 10:25:15
>>436
持ってないので知りません
「あなたが」晒してください

439 :デフォルトの名無しさん:2010/02/12(金) 10:26:28
じゃあ、持ってる人”だけ”に質問します。

440 :デフォルトの名無しさん:2010/02/12(金) 10:29:06
永遠に待っててくださいね^^
多分誰も答えません

441 :デフォルトの名無しさん:2010/02/12(金) 10:30:08
じゃ、持ってる人が現れるまで、黙って待っていなさい。

442 :デフォルトの名無しさん:2010/02/12(金) 10:30:46
今はコンパイラーと統合開発環境がない環境なので
残念ながらコンパイル可能なプログラムを提示することができません。
次回もってくるのでそのときから”持ってない人”は答えてください。

443 :デフォルトの名無しさん:2010/02/12(金) 10:31:28
>>442
だったら今質問すんなカス
エスパースレでも逝けや

444 :デフォルトの名無しさん:2010/02/12(金) 10:32:27
こういう質問者の癖に高飛車な奴には本当に腹が立つ

「教えて頂く」側の態度とは到底思えない

445 :デフォルトの名無しさん:2010/02/12(金) 10:35:14
教えて貰う側が教える側になると急に態度が急変するのもどうかと思う。

446 :デフォルトの名無しさん:2010/02/12(金) 10:35:32
>>442
codepadにコピペしたらコンパイルできる

447 :デフォルトの名無しさん:2010/02/12(金) 10:37:20
>>445
ガタガタ屁理屈抜かすな
答えが欲しかったら下手に出ろや
社会の常識も知らんのか

448 :デフォルトの名無しさん:2010/02/12(金) 10:41:23
答える方は答えなくてもなんにも困らない。質問する方は答が無いと困る。
どういう態度で質問すべきか分らないバカはのたれ死んでしまえ。

449 :デフォルトの名無しさん:2010/02/12(金) 10:42:53
日本人らしい短絡的な発想だね。

450 :デフォルトの名無しさん:2010/02/12(金) 10:44:36
もうみんなスルーしようぜ
本持ってても答えない方が、スレの今後のために良いと思う。

451 :デフォルトの名無しさん:2010/02/12(金) 10:45:11
俺も
本持ってるけど答えてやんない

452 :デフォルトの名無しさん:2010/02/12(金) 10:45:40
お前のコンパイルエラーが取れなくても全然困らない。
クズが困る事は、むしろメシウマ。

453 :デフォルトの名無しさん:2010/02/12(金) 10:46:48
>>449
2chを質問を入力するとポンと答えが出てくる便利な機械と勘違いしていないか?
画面の向こうにいるのは生身の人間である事をお忘れ無く

454 :デフォルトの名無しさん:2010/02/12(金) 10:54:25
>>426を想像でコードに落としてみましたが
http://codepad.org/nOL0Yx3H
gcc, msvcともにwarning なんて出ませんが…

455 :デフォルトの名無しさん:2010/02/12(金) 11:54:11
>>426
自己解決しました。

>>454
ありがとうございました。
aaaaの戻り値がTのやつがあったらしいです。

456 :デフォルトの名無しさん:2010/02/12(金) 12:09:38
でも確かではないので、よく調べてまた出直してきます。

457 :デフォルトの名無しさん:2010/02/12(金) 12:17:02
自分でプログラムをつくって実行した時に

free(): invalid next size (fast): 0x083c69b8 ***

が出るんだけどこれはメモリ領域を開放する部分を疑うべきなのだろうか?
同じプログラムをMac OS XのGCC 4.2でコンパイルして実行するとエラーが出ずに実行できるんだけど
FedoraのGCC 4.4でコンパイルして実行すると上のようなものがでてCore dumpしてしまうようなのですが

458 :デフォルトの名無しさん:2010/02/12(金) 12:20:37
デバッガのバックトレース使えよ…

459 :デフォルトの名無しさん:2010/02/12(金) 12:22:08
さっきから見ているがお前らどうして症状が再現する最小のソースを貼らないんだ?
会社の仕事のコードならわかるが、趣味のコードで見せたがらないってのがわからん

トランプを裏返しにして何のカードか当てろと言ってるのと同じだぞ

460 :デフォルトの名無しさん:2010/02/12(金) 12:24:38
最小のソースを作ることが問題の解決になってる場合が多いから、
作れない場合の方がおおい。

461 :デフォルトの名無しさん:2010/02/12(金) 12:29:58
なるほどね

じゃあ元のコードがバグだらけって事じゃん
質問が全く的を射ていないわけだ

462 :デフォルトの名無しさん:2010/02/12(金) 12:40:14
複雑に絡み合っているコードを単純にする作業はデバッグと一緒。

463 :デフォルトの名無しさん:2010/02/12(金) 13:34:36
aオブジェクトがオーバーライドされたoperator[]をもっているとき
aのインスタンスを作る関数の戻り値は値渡しにしたほうがいいですか?
そうしないと使うとき(*a)[x]という変な形になってしまうので、

464 :デフォルトの名無しさん:2010/02/12(金) 15:12:15
(*a)[x]に慣れる

465 :デフォルトの名無しさん:2010/02/12(金) 15:17:51
a->operator [](x)

466 :デフォルトの名無しさん:2010/02/12(金) 15:18:47
A &ra = *a;ra[x]

467 :デフォルトの名無しさん:2010/02/12(金) 15:20:27
素直にデータをクラスに保持しておいて
参照で返すのはオススメできませんか?

468 :デフォルトの名無しさん:2010/02/12(金) 15:23:35
なぜかというとクラスはデータのカプセル化が目的だから、
書き換えられたらだめとおもいました。

469 :デフォルトの名無しさん:2010/02/12(金) 15:35:42
a[1]=10;みたいな使い方をするんだったら
書き換えられるんだから参照にすればいい
そうじゃなければやめればいい

470 :デフォルトの名無しさん:2010/02/12(金) 15:37:21
参照にします。
ありがとうございました。

471 :デフォルトの名無しさん:2010/02/12(金) 17:33:33
>>425
SSE 4.2って文字列処理に役立つ命令ってあったっけ?

ついでだからSSE2版の比較。
http://labs.cybozu.co.jp/blog/mitsunari/2008/06/fast_strlen_and_memchr_by_sse2_1.html

472 :デフォルトの名無しさん:2010/02/12(金) 18:51:21
http://codepad.org/spYnVcUT
アルゴリズムC++の187,190ページにのっている
リストを実装に用いたマージソートなんですがmergeできません
main関数と表示などのスタブ的な箇所以外は
基本的にそのまま写してるんですが・・

そもそもこのコードだとmergeできないように思ったので
打ちこんでみたんですが
これって私の勘違いでしょうか?

473 :デフォルトの名無しさん:2010/02/13(土) 01:18:00
>>457
malloc/callocで確保してないメモリを解放してるか、既に解放したメモリを再び解放してるか、
どっかで配列のオーバーフロー/アンダーフローが起こってて、メモリの管理領域を壊してるかじゃないかなぁ。

確保したメモリかを確認し直して、多重解放してないか確認して(解放したらNULL入れておくといいよ)
ヒープ領域(大雑把に言うとmalloc/callocで確保したメモリのこと)の配列を中心に、変なことしてないか確認。

特に間違いがみつからなかったら、この手のバグは面倒なのが多いから、デバッガの利用を検討した方がいいかも。

474 :デフォルトの名無しさん:2010/02/13(土) 12:26:28
>>472
z->key = 99999999; を入れれば動く
mergeでa->next、b->nextを順に辿っていくといずれzに到達してz->keyも参照することになるが、
z->keyが不定値だとうまく動かないな

475 :デフォルトの名無しさん:2010/02/13(土) 13:20:33
>>474
http://codepad.org/jgeFBNmJ
ありがとうございます。動かせました!
z->keyと同じ値を持つデータがあると正常にソートされないこともわかりました

これってz->nextがzであることを利用しているけど
schemeなんかだと(cdr ('))はエラーだし
引数は破壊的変更しまくりなので
関数型言語でコード化するのは難しそうですね

476 :デフォルトの名無しさん:2010/02/13(土) 14:33:13
std::mapのキーって自動的にソートされてましたっけ?

477 :デフォルトの名無しさん:2010/02/13(土) 14:35:44
hai

478 :デフォルトの名無しさん:2010/02/13(土) 15:08:03
unordered_mapはソートされてない

479 :デフォルトの名無しさん:2010/02/13(土) 15:13:16
まぁそういう名前だしな

480 :デフォルトの名無しさん:2010/02/13(土) 16:13:53
>>477
昇順とか決まってるのかな?

481 :デフォルトの名無しさん:2010/02/13(土) 16:30:27
並び方は構築時に与えられる比較関数オブジェクト次第だよ

482 :デフォルトの名無しさん:2010/02/13(土) 17:36:53
>>473
ttp://handasse.blogspot.com/2009/02/cc.html
これを見てソース直して実行しなおしたらlinuxで動くようになりました
どうやら不連続な領域確保をやっていたのが(↑のページの上の方法)原因らしくて
メモリの確保を連続領域でできるように(↑のページの下の方法)変更したら実行できるようになりました

でもなぜMac OS Xのほうではプログラムを実行できたのだろう
メモリの扱い方がどう違うんでしょうかね

483 :デフォルトの名無しさん:2010/02/13(土) 18:14:43
>>482
直す前のコードにバグがあって、OSXの方ではたまたま動いてただけ。


484 :デフォルトの名無しさん:2010/02/13(土) 19:14:23
>>482
連続だろうが不連続だろうが、配列の範囲を越えたところに書き込まなければ起こり得ないバグ。

485 :デフォルトの名無しさん:2010/02/14(日) 14:37:35
C++のIDEはヘッダファイルを作った後に、自動で*.cppに定義をコピーしてくれないの?

つまり、hogehoge.hに↓のように宣言したら
void Hoge(Test* t);
自動でhogehoge.cppに関数をコピーしてくれる機能はないのか?ということ
void Hoge(Test* t)←自動で挿入
{
}

486 :デフォルトの名無しさん:2010/02/14(日) 14:45:58
>>483
というよりも、修正したと思っている方も実はまぐれで動いている。
9割がた間違いない。

487 :デフォルトの名無しさん:2010/02/14(日) 16:25:49
>>483-484>>486
いやいやちょっと待ってくれ
ああいうのは気まぐれでは動かないだろ
人を貶めるのはよしてくれ

488 :デフォルトの名無しさん:2010/02/14(日) 16:42:30
エラーを内包しててもコンパイラによっては表面化しないで動くことなんかよくあるぞw

489 :デフォルトの名無しさん:2010/02/14(日) 16:43:21
気まぐれというかオーバーランしてる領域の中身によりけり

490 :デフォルトの名無しさん:2010/02/14(日) 17:02:32
>>487
所詮お前はその程度のスキル。ww

491 :デフォルトの名無しさん:2010/02/14(日) 17:06:29
printfを挟んだらなぜか動きましたというのはよくあること

492 :デフォルトの名無しさん:2010/02/14(日) 17:10:22
落ちる所とは全然違う所に問題があるとか
オーバーランによるスタック破壊は本当に怖い

493 :デフォルトの名無しさん:2010/02/14(日) 17:43:55
ネタ元がメモリ解放を疑ってるのに
スタック話とかおよびじゃねぇよ

494 :デフォルトの名無しさん:2010/02/14(日) 18:05:04
ネタ元に信憑性が無い事はすでに判明している。
この場合は全てを疑うのが原則。

495 :デフォルトの名無しさん:2010/02/14(日) 18:10:53
>>494 (キリッ

それでどうしようてんだい?

496 :デフォルトの名無しさん:2010/02/14(日) 18:17:07
>>493
だから、解放時に落ちるのは管理情報壊してるからなんだって。
で、管理情報を壊してるってことはアンダーランとかオーバーランで他のも壊してる可能性が非常に高いし、
落ちなくなったときも、偶然管理情報が無事なだけって可能性が大いにありうる。

497 :デフォルトの名無しさん:2010/02/14(日) 19:09:12
>>487
メモリバグを起こす奴が何言っても説得力ないな

498 :デフォルトの名無しさん:2010/02/14(日) 19:43:53
>>487
バグは誰でも作ってしまうものだから、バグを作ったことで貶められる
ということはないよ。でもバグをろくに調べもせずに他人のせいにする
のは非難されるべき。



499 :デフォルトの名無しさん:2010/02/14(日) 20:55:48
処理に時間がかかりすぎる場合だけスキップさせたいのですが
どのように書けば良いでしょうか?
処理は分割できないので、間間に時間計測処理を挟むこともできません

try catchでできるのかなと思ったんですが、調べても出てこない
助けてください・・・

500 :デフォルトの名無しさん:2010/02/14(日) 21:09:16
OSに指定時間経過したら蹴り入れてくれるように依頼する。

501 :デフォルトの名無しさん:2010/02/14(日) 21:21:03
>>499
処理を別スレッドで動かしておいて
指定時間が経過したらスレッドを殺す


502 :デフォルトの名無しさん:2010/02/15(月) 12:52:50
int* I = new int[69]();
と後ろにカッコをつけてもintが0に初期化されませんなりません。
MINGWです。
おねがいします。

503 :デフォルトの名無しさん:2010/02/15(月) 13:45:53
>>502
それコンパイル通った?
普通はエラーになると思うんだけど
配列に対してのnewは初期化子が使えません

後からmemset()かstd::fill()でもするしかないです

504 :デフォルトの名無しさん:2010/02/15(月) 13:48:59
ついでに言うならば、クラスの配列に対して各々コンストラクタを
呼び出すには普通placement newを使う

デストラクタは自動的に呼び出されないので自分で I[n]->~a();
みたいにfor文で回す必要がある

505 :デフォルトの名無しさん:2010/02/15(月) 13:55:23
>>503
コンパイルとおりましたよ。


506 :デフォルトの名無しさん:2010/02/15(月) 14:03:26
コンパイル通ったし0になったな、VC++だけど

507 :デフォルトの名無しさん:2010/02/15(月) 14:11:05
>>505>>506
多分g++とVCの拡張文法だと思う
標準では>>502の書き方は許されていない

508 :デフォルトの名無しさん:2010/02/15(月) 14:16:41
g++はmingwと思いますが。

509 :デフォルトの名無しさん:2010/02/15(月) 14:32:22
>>508
分かってます
自分もMinGWは入れてあります

510 :デフォルトの名無しさん:2010/02/15(月) 14:45:54
で、MinGWで0になりましたか?

511 :デフォルトの名無しさん:2010/02/15(月) 14:51:28
だから拡張の独自仕様だろうが
そんな事をここで論じても仕方が無い

512 :デフォルトの名無しさん:2010/02/15(月) 14:52:38
独自仕様ではないと思いますが、
正式なC++の本に書いてありましたから。

513 :デフォルトの名無しさん:2010/02/15(月) 15:07:54
規格に明記されて無いものは全て独自仕様

514 :デフォルトの名無しさん:2010/02/15(月) 15:09:37
ttp://d.hatena.ne.jp/uskz/20080421

515 :デフォルトの名無しさん:2010/02/15(月) 15:10:34
ボーランドだとエラー

Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
a.cpp:
エラー E2243 a.cpp 5: new で確保した配列には初期化子が使えない(関数 main() )

516 :デフォルトの名無しさん:2010/02/15(月) 15:14:40
>>514
ありがとうございました。
バグっぽいですね。
独自仕様じゃないことが分かってよかったです。

517 :デフォルトの名無しさん:2010/02/15(月) 15:48:21
>>516
初期化子が配列では使えないという事には変わりないけどな

518 :デフォルトの名無しさん:2010/02/15(月) 16:18:59
バグが直れば使うからいいよ。

519 :デフォルトの名無しさん:2010/02/15(月) 16:21:40
いやバグとかそういう問題じゃなくてg++とVCでしか使えないわけだろ?
そういうのを使うのか

520 :デフォルトの名無しさん:2010/02/15(月) 16:28:25
g++はgccだから使えない。

521 :デフォルトの名無しさん:2010/02/15(月) 16:34:33
gcc4.3.2なら使えた

522 :デフォルトの名無しさん:2010/02/15(月) 16:46:10
4.3.2のインストールの仕方が分からないから
使いたくても使えない。

523 :デフォルトの名無しさん:2010/02/15(月) 23:27:55
入門したいのですが入門書のオススメありますか?

524 :デフォルトの名無しさん:2010/02/15(月) 23:54:28
>>523
http://pc12.2ch.net/test/read.cgi/tech/1263718091/

参考までに、私の入門書は
http://www.amazon.co.jp/dp/4875931735/
K&R1 と古いのでお勧めはしません。

525 :デフォルトの名無しさん:2010/02/15(月) 23:55:41
* C言語 変数の有効範囲(スコープについて) */
#include <stdio.h>
char *_String( void );
char *_String2( void );

void main(){
    char *pChar = _String();
    char *pChar2 = _String2();
    printf("Output Char:%s\n", pChar);
    printf("Output Char2:%s\n", pChar2);
}
char *_String( void ){
    char test[10] = "AAAAAABB";
    return test; /* 値が確保されているのはここまで */
}

char *_String2( void ){
    return "AAAAAABB"; /* 何でこれだけ維持されているのか? */
}

上の場合にchar *_String2( void )の戻り値が確保されている理由を教えてください。

526 :デフォルトの名無しさん:2010/02/15(月) 23:57:16
変数じゃない

527 :デフォルトの名無しさん:2010/02/15(月) 23:57:18
>>525
"AAAAAABB"はスタック上に確保されているわけではなく、BSS領域という
一般的にはグローバル変数と同じ領域に置かれている文字列リテラル

だから関数から抜けてもスタックが破壊されて無くなってしまうという事はない

528 :デフォルトの名無しさん:2010/02/16(火) 00:02:32
その"AAAAAABB" はどこに格納されてるのかな?

529 :デフォルトの名無しさん:2010/02/16(火) 00:10:27
はじめてのC++
誤解されることこの上ないタイトルが凄く好き

530 :デフォルトの名無しさん:2010/02/16(火) 02:12:56
C#で慣れ親しんできた者です。

C#では関数の引数に配列を渡す際は何も考えずに配列を渡せば良かったです。
関数内では受け取った配列のインデクサを調べれば配列の個数が分かったからです。

C++では配列を渡してもインデクサ等が無いので配列の個数を関数内で調べる方法が無いわけですが
こういうときはみなさんどうされているんでしょうか?配列の他に配列の個数をint型で渡したりして対処
されているんですか?

531 :デフォルトの名無しさん:2010/02/16(火) 02:18:12
>>525みたいなの、ダメだと思ってた……
文字列リテラルってグローバル変数と同じ時間存在してるのか。

532 :デフォルトの名無しさん:2010/02/16(火) 02:22:23
>>530
Cではそうするしかなかったし、C++でも普通の配列使うならそうするしかないが、
C++のSTLコンテナ使ってもいいなら、メンバ関数size()で個数が分かる。

533 :デフォルトの名無しさん:2010/02/16(火) 02:27:30
>>530
コンパイル時にサイズが分かる普通の配列ならテンプレートで調べる小技があるよ
動的確保だとどこかにサイズを保存しないとダメだね
そしてそれを親切にやってくれるのが標準ライブラリ

534 :デフォルトの名無しさん:2010/02/16(火) 02:29:57
>>530
ターミネータを使うとか

535 :デフォルトの名無しさん:2010/02/16(火) 02:30:50
>>532-533
C++では動的サイズの配列の受け渡しにはSTLを使えということですね。
ところでSTLを使った動的配列にはintといった型だけでなく
構造体やクラスの配列を格納することも可能ですか?


536 :デフォルトの名無しさん:2010/02/16(火) 02:30:54
リテラル文字列の寿命がグローバル変数のように長いって規格で保証されてるの?

537 :デフォルトの名無しさん:2010/02/16(火) 02:43:23
>>535
構造体やクラスなら、できた。
必要に応じてコピーコンストラクタを実装すること。

タイプミスじゃなく意図して「構造体やクラスの配列」って言ってるなら、
普通の配列はコピーコンストラクタがないのでコンテナに入れられない。コンテナをコンテナに入れることは可能。

538 :デフォルトの名無しさん:2010/02/16(火) 02:57:27
>>537
失礼しました
「構造体やクラスの配列」ではなく「構造体やクラス」でした

539 :デフォルトの名無しさん:2010/02/16(火) 06:46:02
>>526-527
ありがとうございます。

文字列リテラルと言う扱いになる為
グローバルな領域で確保されるから問題ないと言う事ですね。
この辺を重点的に調べればちゃんと人に説明出来そうですね。

>>528さん
そのどこの領域に格納されるのかが良く分からないので
人に説明する時にどう説明すればいいのか悩んでたんです。




540 :デフォルトの名無しさん:2010/02/16(火) 12:49:24
アセンブラ吐かせて読んでみれば

541 :デフォルトの名無しさん:2010/02/16(火) 14:59:20
>>525
質問と関係無いツッコミ失礼。
スコープってのは名前の有効範囲。ソースコード上での静的なもの。
動作時の変数の有無は寿命とか言う。

542 :デフォルトの名無しさん:2010/02/16(火) 23:20:52
C++はヘッダとソースが分離しているから見にくいな〜
やっぱり、メンバ変数にはm_、staticにはs_と付けないとダメなのかな

でも、ちょっとm_とs_はうざい

543 :デフォルトの名無しさん:2010/02/16(火) 23:25:37
>>542
そもそもメンバ変数を見なければいけない実装がおかしい
と言いたい。


544 :デフォルトの名無しさん:2010/02/16(火) 23:54:40
もしかして、100万回
>>525の_String2を呼び出すと、
全部"AAAAAABB"を確保するのか。

545 :デフォルトの名無しさん:2010/02/17(水) 00:01:38
えーとね、
文字列リテラルは
staticな無名の配列、くらいに考えて良いよ。
constかどうかはコンパイラ(オプション)依存。

546 :デフォルトの名無しさん:2010/02/17(水) 00:27:19
>>544
一箇所に確保してあるのもを100万回呼び出すだけ。

547 :デフォルトの名無しさん:2010/02/17(水) 01:40:21
それって規格で保証されてるの?

548 :デフォルトの名無しさん:2010/02/17(水) 11:11:00
文字列リテラルの記憶クラスはstatic

549 :デフォルトの名無しさん:2010/02/17(水) 14:20:52
>>548
Oh, good!

550 :デフォルトの名無しさん:2010/02/18(木) 10:44:55
よくクックブックなる本があるけど
あれの元ネタってThe art of computer programming?

551 :デフォルトの名無しさん:2010/02/18(木) 21:21:10
名前空間ってあんまり使われてないの?
ソフトの一部にだけしか、使われていない気がするんだけど

552 :デフォルトの名無しさん:2010/02/18(木) 21:22:16
お前の読んでるソースが偏ってんじゃねーの?

553 :デフォルトの名無しさん:2010/02/18(木) 21:27:13
クラスの名前が被らなったら、積極的に名前空間を使う必要は無いと思うだけど
読みにくいし、使いづらくなるだけの気がするんだけど

554 :デフォルトの名無しさん:2010/02/18(木) 21:37:45
俺は積極的には使わない派かなぁ
プロジェクト共通の名前空間で包むだけで
あとは衝突してから名前変えるか名前空間ネストするか考える

555 :デフォルトの名無しさん:2010/02/18(木) 22:11:10
短い名前空間なら大して負担にならないし、
俺は使っているよ。



556 :デフォルトの名無しさん:2010/02/18(木) 22:13:40
自分で名前が被らないよう制御できる範囲では、名前空間は必要ないからね
あれは主にライブラリのため

557 :デフォルトの名無しさん:2010/02/19(金) 11:30:55
集合Aを入力として、状態xを持つAの元個数を出力する関数の名前は
何にしたらいいですか?

558 :デフォルトの名無しさん:2010/02/19(金) 12:30:51
set.count_if(pred);

559 :デフォルトの名無しさん:2010/02/19(金) 12:42:48
ありがとうございます。
countって動詞ですか?
predってなんですか?
普通の関数にしたいんですけど
countX(SET A)でもいいですか?

560 :デフォルトの名無しさん:2010/02/19(金) 13:01:44
count【他動】数える、合計する
predicate【名】述語

好きにすれば? 自分で決めれ

561 :デフォルトの名無しさん:2010/02/19(金) 13:03:53
おねがいします。そこを何とか教えてください。

562 :デフォルトの名無しさん:2010/02/19(金) 13:05:43
じゃあそれでいいよ

563 :デフォルトの名無しさん:2010/02/19(金) 13:06:43
>>559 560のいいたかったのはこういうことだろう

struct S{
vector<int> v;
S(){for(int i=0;i<10;++i){v.push_back(i);}}
int count_if(bool (*pred)(int)){
int n=0;
for(int i=0;i<v.size();++i){if(pred(v[i])){++n;}}
return n;
}
};

//これがpred
bool after7(int n){return n>=7;}
bool iseven(int n){return (n%2==0);}
bool times3(int n){return (n%3==0);}


S s;//0-9を入れる
cout << s.count_if(after7) << endl; //7以降の数
cout << s.count_if(iseven) << endl; //偶数の数
cout << s.count_if(times3) << endl; //3の倍数の数

564 :デフォルトの名無しさん:2010/02/19(金) 15:43:20
一瞬 iseven が seven に見えたw

565 :デフォルトの名無しさん:2010/02/19(金) 16:00:49
i7にしか見えない

566 :デフォルトの名無しさん:2010/02/19(金) 22:04:53
aaa, bbb, ccc,・・・・・・・・
ddd, eee, fff,・・・・・・・・

って書かれたcsvから
aaa,bbb
ddd,eee

ってcsvを作りたいんだけど
検索かけても長いソースコードのばっかり。
20行ぐらいでシンプルに作れないのかな

567 :デフォルトの名無しさん:2010/02/19(金) 22:11:46
>>566
> aaa, bbb, ccc,・・・・・・・・
> ddd, eee, fff,・・・・・・・・
> って書かれたcsvから
> aaa,bbb
> ddd,eee
> ってcsvを作りたいんだけど
それで法則性が分かると思うてか?

Excelに貼り付けて3列目以降を削除しろ。


568 :デフォルトの名無しさん:2010/02/19(金) 22:16:37
わかってんじゃん。w

569 :デフォルトの名無しさん:2010/02/19(金) 22:42:17
>>567
ツンデレw

570 :デフォルトの名無しさん:2010/02/19(金) 23:48:30
C++の継承はポリモーフィズムをするためではなく、
実装を継承するためにやっている事が多い気がします

これって気のせい?

571 :デフォルトの名無しさん:2010/02/19(金) 23:52:46
継承はテンプレートで遊ぶために有ります

572 :デフォルトの名無しさん:2010/02/20(土) 00:27:43
>>570
C++では、継承以外にもポリモーフィズムを実現する手段が発達しているから、
相対的に、継承の中では実装の継承が多いように見えるのかもしれない。
あるいは、お前が出会ったコードor人間に
ポリモーフィズムが意識されるようになる前の古臭いやつの割合が多かったか。

573 :デフォルトの名無しさん:2010/02/20(土) 12:53:56
VC環境のプロファイラといえば何がオススメですか?

574 :デフォルトの名無しさん:2010/02/20(土) 12:59:23
継承とポリモーフィズムって違うの?目的と手段の関係?

575 :デフォルトの名無しさん:2010/02/20(土) 13:04:18
ポリモーフィズムを実現する手段のうちの一つが継承だよ

576 :デフォルトの名無しさん:2010/02/20(土) 15:37:14
でも、どっかなんか違う。

577 :デフォルトの名無しさん:2010/02/20(土) 17:38:13
テンポラリを関数に参照渡ししようとしたらコンパイラに文句をいわれるんですが
参照の寿命がその関数内のみだったら別に問題は起こらないですよね?

578 :デフォルトの名無しさん:2010/02/20(土) 17:40:18
>>577
無名一時オブジェクトはconst参照で渡せられるよ。



579 :デフォルトの名無しさん:2010/02/20(土) 21:51:09
pimplの読みは「ピンプル」でなんでしょうか?

580 :デフォルトの名無しさん:2010/02/20(土) 22:09:53
「ぱんぷるぴんぷるぱむぽっぷん」でいいよもう

581 :デフォルトの名無しさん:2010/02/20(土) 23:24:19
Javascriptやべぇ

"3" + 1 // '31'
"3" - 1 // 2
"222" - -"111" // "333" (???)


582 :デフォルトの名無しさん:2010/02/20(土) 23:25:21
でっていう

583 :デフォルトの名無しさん:2010/02/21(日) 02:28:58
>>574
ストリーム出力で数値も文字列も<<で出力できる(多重定義)とか
vectorがコピー可の型ならなんでも要素に取れる(テンプレート)とか、
複数の型のオブジェクトに同じ操作が適用できることはなんでも多態、ポリモーフィズムと言う。

>>577
それ認めると、
void f(double& x) {x = 42;}
で、
int i = 0;
f(i); // double型の一時オブジェクトを作ってそれを渡す
ここで、fから戻っても元のiは変わらず0のままという混乱必須の事態になるから
エラーにする決まりになった。

const参照ならその心配は要らないので>>578の言うとおりOK。

584 :デフォルトの名無しさん:2010/02/21(日) 09:11:56
NARHOUDOU!

585 :デフォルトの名無しさん:2010/02/21(日) 14:57:30
>>583
なるほど。それでエラーになるのか。

586 :デフォルトの名無しさん:2010/02/21(日) 16:07:59
>>583
なるほど
そのケースだと確かに不都合ですね
でも↓のようにテンポラリを参照渡ししつつ非const操作をしたいということもあると思うんですが・・・
ttp://codepad.org/eLp60FpV
こういうケースにはなにか回避手段があるんでしょうか?


587 :デフォルトの名無しさん:2010/02/21(日) 18:54:16
一時オブジェクトにしなければいい。そのほうが読みやすい。
int main(void)
{
std::ifstream a("Test.cpp");
cat(a);
return 0;
}


588 :デフォルトの名無しさん:2010/02/22(月) 00:46:54
>>586
この例では、cat(std::ifstream("Test.cpp").ignore(0))としたら一応できる。
ようするに*thisを参照型で返し、余計な作用がなさそうなメンバ関数を呼べばいい。
ostreamならflush()など。

根本的な解決としては、次の規格改定で今までの参照に加えて、こういう破壊操作前提のときに使える
一時オブジェクト含むrvalueを受け取れるrvalue参照というものが導入される。

現状では>>587の言うとおり変数を作ってしまうのが一番楽。

589 :デフォルトの名無しさん:2010/02/22(月) 19:46:02
てst

590 :デフォルトの名無しさん:2010/02/23(火) 12:46:15
7-zip32による圧縮ファイルの解凍を行うプログラムを作成しています。
SevenZip()によるコマンドでの解凍ではなく、

SevenZipOpenArchive()でアーカイブのハンドルを開いて、
解凍進捗をコールバックで取得しながら解凍する方法を探しているのですが、
サンプルソースが見つからず苦戦しています。
今のところ以下のように書いています。

unrar.dllでの解凍を以前したことがあるので、同じようにコールバックで自分でデータを書き込むか、
書き込みはAPI内で行っても、進捗情報はコールバックできるかと思っているのですが、
根本的に間違っているのでしょうか?

CString strPath = _T("C:\\XXXX");
//オープン
char* pPath = W2A(strPath);
HARC hFile = SevenZipOpenArchive(NULL,pPath,0);
if( !hFile ) {
_tprintf(_T("Error !! : Open \n"));
}

INDIVIDUALINFO stInfo;
if( SevenZipFindFirst(hFile,"*",&stInfo) == 0 ) {

do {
//何を記述するの?

}while( SevenZipFindNext(hFile,&stInfo) == 0 );
}
//クローズ
SevenZipCloseArchive( hFile );



591 :デフォルトの名無しさん:2010/02/24(水) 11:57:08
クラスをインスタンス化するとき、コンストラクタ内部や外部から、
コンストラクタ以外のイニシャライズメソッドを呼んで初期化させている例を見たことがあります
すべてをコンストラクタ内で書かないメリットには何があるのでしょうか?


592 :デフォルトの名無しさん:2010/02/24(水) 12:06:38
オブジェクトの生成時には初期化に必要な情報がそろっていないケースとか。
コンポジションしてるような状況ではよくある

他にはシングルトンみたいにインスタンスの数に制限をしたい場合とか

593 :デフォルトの名無しさん:2010/02/24(水) 17:54:52
常に使われるとは限らない場合があるからとか

594 :デフォルトの名無しさん:2010/02/24(水) 23:02:00
>>591
例外の話じゃね?
init()というメンバ関数を用意してだな…(ry

595 :デフォルトの名無しさん:2010/02/25(木) 04:25:50
>>591
そのクラスにresetメソッドがあるなら、コンストラクタとresetで処理内容がかぶる箇所を、privateな初期化メソッド作るかも。

596 :デフォルトの名無しさん:2010/02/25(木) 07:44:27
・コンストラクタで例外発生しちゃう可能性がある場合の回避方法として
・初期化処理に失敗する可能性がある場合、戻り値で判断したいから

597 :デフォルトの名無しさん:2010/02/25(木) 07:51:42
コンストラクタで例外出ても別にいいだろ

598 :デフォルトの名無しさん:2010/02/25(木) 10:15:13
デストラクタが呼び出されない (ので、メンバが中途半端に
割り当てられたまま残る可能性がある) ことが判ってれば
別にいいですが。

599 :デフォルトの名無しさん:2010/02/25(木) 11:38:02
>>597
世の中には「C++で例外を使わない」というコーディング規約もある。


600 :デフォルトの名無しさん:2010/02/25(木) 12:56:20
resetはいいけどinitはなんかいやだ

601 :デフォルトの名無しさん:2010/02/25(木) 19:53:17
>>598
メンバのデストラクタは適切に呼ばれるよ。
呼ばれないのはデストラクタの{}内。
>>599
なおさらinitはいらないね。


602 :デフォルトの名無しさん:2010/02/25(木) 19:59:44
>>601
> >>599
> なおさらinitはいらないね。
頭おかしいお前はレスする資格がない。

603 :デフォルトの名無しさん:2010/02/25(木) 20:15:03
initの失敗を返り値で判断したいってどういうケースだ?
ifの代わりにtry-catchでも別によくねーか?

604 :デフォルトの名無しさん:2010/02/25(木) 20:23:07
>>603
世の中には「C++で例外を使わない」
って>>599が言ってるけど、
コンストラクタで例外を無げない
というコーディング規約なら知って居るぞ。

その話をみんなしたいんじゃないのかい?

605 :デフォルトの名無しさん:2010/02/25(木) 21:36:31
C/C++にboolの排他的論理和ってありましたっけ?

606 :デフォルトの名無しさん:2010/02/25(木) 21:50:03
>>605
ビット演算でおk?

607 :デフォルトの名無しさん:2010/02/25(木) 22:14:11
いえ、boolです。ビットなら^ですよね

608 :デフォルトの名無しさん:2010/02/25(木) 22:21:17
boolなら!=が排他的論理和になる

609 :デフォルトの名無しさん:2010/02/25(木) 22:45:14
>>608
!!!
今日一番感動しました
今まで全く気付かなかった、ありがとうございます!

何か差し上げたいぐらい
んーむ最近感動したのはx mod yをx-y*(x/y)で定義できること(x/yの箇所はfloor(x/y)です)
これだと負の剰余もちゃんと定義できます
C/C++だと負のmodは実装依存なのがたまにきずですが

610 :デフォルトの名無しさん:2010/02/25(木) 22:51:35
>>609
水を差すようで申し訳ないのだが、
それは高校数学で習ったろ。

多項式の商と剰余を定義する場面で、
数Vで出て来たはず。


611 :デフォルトの名無しさん:2010/02/25(木) 23:34:05
>>610
>>609じゃないけど、高校のときはこんなのなんの役に立つんだばかばかばーかふんだっ!って思ってましたごめんなさい

612 :デフォルトの名無しさん:2010/02/25(木) 23:51:44
いや、小学生でもできる。

613 :デフォルトの名無しさん:2010/02/26(金) 08:10:08
キリッ

614 :デフォルトの名無しさん:2010/02/26(金) 11:13:23
>>601
>メンバのデストラクタ
の話などしていません。勝手に補完しないように。

615 :デフォルトの名無しさん:2010/02/27(土) 00:01:49
>>609
mod の定義は数学の教科書でもまちまち、というかどっちでも決めたいほうに決めろという態度のような。

616 :デフォルトの名無しさん:2010/02/27(土) 01:45:54
整数mをnで割った時、その商がq、剰余がrであることを
m ÷ n = q … r
と表記して、
m = qn + r かつ 0 ≦ r < n
とするのが普通の定義だろ
ていうか、これ以外の定義している数学の本なんて見たことない

617 :デフォルトの名無しさん:2010/02/27(土) 02:06:00
そんな定義ばかりじゃないということが大学で代数の勉強をすればわかるよ


618 :デフォルトの名無しさん:2010/02/27(土) 02:10:40
おま、数学科で院まで言った俺に何を言ってるんだ


619 :デフォルトの名無しさん:2010/02/27(土) 02:52:18
nが自然数っていう条件が要るだろう

>>617はここでも読んで勉強すればいいと思う
ttp://ja.wikipedia.org/wiki/%E5%90%88%E5%90%8C%E5%BC%8F
C言語の場合、マイナスの剰余を許したほうが処理に一貫性があるから、そっちで実装している場合が多いみたいだけど

620 :デフォルトの名無しさん:2010/02/27(土) 03:01:57
整数と言ってる時点で、加法・乗法・乗法逆元は定まってるし、>>617はおかしい。
除法は乗法逆元を掛けることで定義されるから。
おそらく、>>617はp 進数体とかの上での除法のこと言ってるんだろうけど。

整数の除法と言えば、>>616の定義しかない。

ただ、>>609で問題なのは負数に対するmoduloの定義。例えば、
-12 mod 5
が-2なのか3なのかは少し問題になるかもしれない。
普通は3なんだけど、順序の入ってない体での除法を考えた場合、
>>616の 0 ≦ r < nの部分の定義が使えないから、

a mod b ⇔ a - b * xのうち最も0と"近い"もの

という定義も考えられる。距離または絶対値が入ってることが前提になるが。
この定義だと、-12 mod 5 = -2となる。

621 :デフォルトの名無しさん:2010/02/27(土) 03:05:48
一応言っておくと、整数体があるって言ってるんじゃなく、整数を含む体が実数体しかないってこと。
>>620で言ったのとは別に、処理の都合で負数の剰余を許すこともあるみたいだね。

622 :デフォルトの名無しさん:2010/02/27(土) 03:06:49
で?

623 :デフォルトの名無しさん:2010/02/27(土) 03:11:13
>>616>>617に言ったんだよ。

624 :デフォルトの名無しさん:2010/02/27(土) 03:16:29
あと>>619の「合同式」は、同じmodという記号だけど、
>>609で問題になってるcongruence function(あえて和訳すれば「合同"関数"」)とは別物だよ。
Mod -- from Wolfram MathWorld
http://mathworld.wolfram.com/Mod.html

625 :デフォルトの名無しさん:2010/02/27(土) 08:31:27
小学生の子供にプログラミングを教えるなら、何の言語がいいですかね?
当方、コマンドプロンプト上で動かすものしか作れないのですが、それだけでは子供は楽しめないと思います
自作マリオを作りたいそうです

626 :デフォルトの名無しさん:2010/02/27(土) 08:42:07
C/C++スレでそれを聞いてどうするよ?
言語はどうあれ結果が視覚的に確認しやすいほうが飽き無いだろうな。

627 :デフォルトの名無しさん:2010/02/27(土) 09:08:53
マリオ作りたいなら、ファミリーベーシックでいいんじゃないの?

628 :デフォルトの名無しさん:2010/02/27(土) 09:10:41
子供の年齢を知るのが先だろん

629 :デフォルトの名無しさん:2010/02/27(土) 09:41:31
子供は26歳です(^ρ^)

630 :デフォルトの名無しさん:2010/02/27(土) 11:48:39
ひょっとしてピーターパンですか?サインください

631 :デフォルトの名無しさん:2010/02/27(土) 17:29:29
>>616,624
別物じゃないですよ。>>619にあるページの性質はすべて成り立ちます
しかもこの式はx,yは実数でも成り立つので
感動したというわけです
詳しくはtaocpを見てね

632 :デフォルトの名無しさん:2010/02/27(土) 19:04:51
>>631
勘違いするな。合同式と合同関数は別物だ。
a mod bと、a ≡ b (mod n)。書き方からして違う。
あと、その定義式はごく一般的なものだろ。
これ以外の定義があるのか?

633 :デフォルトの名無しさん:2010/02/28(日) 04:48:51
最近は猫も杓子もオブジェクト指向オブジェクト指向だけど
PS3や箱○といったゲーム開発用の場で使われている言語も
オブジェクト指向言語だったりするの?

それとも古き良きC言語のままだったりする?

634 :デフォルトの名無しさん:2010/02/28(日) 06:24:35
新年
C以外の最初のコンパイラはアセンブラで記述されたけど、
CコンパイラだけはCで書かれた。

635 :デフォルトの名無しさん:2010/02/28(日) 11:09:23
>>633
Cが古いは良いとして良かったかはともかく、PS3の説明会でC++も使えますよといってたぞ。
360はXNA(C#)とかも使えるみたいだぞ。

636 :デフォルトの名無しさん:2010/02/28(日) 12:48:10
>>634
最初にCでかかれたソースは何で書かれたCコンパイラでコンパイルしたの?

637 :デフォルトの名無しさん:2010/02/28(日) 13:50:48
>>635
> PS3の説明会でC++も使えますよといってたぞ。
> 360はXNA(C#)とかも使えるみたいだぞ。

C#でスピードなんて出せるの?

638 :デフォルトの名無しさん:2010/02/28(日) 13:57:04
ゲームの派手さにプロセッサの処理速度は関係ないんじゃないの。

639 :デフォルトの名無しさん:2010/02/28(日) 15:18:20
え( ´・ω・)?

640 :デフォルトの名無しさん:2010/02/28(日) 17:13:49
本読んでて、サンプルプログラムで分からないところがあるんだが誰か教えていただけないだろうか?
------------------------------------
template <class T>
class MyTemplateArray {
public:
T array[10];
T &GetValue(int item);
};
template <class T>
T &MyTemplateArray<T>::GetValue(int item) {
if (item > 9 || item < 0) {
return array[0];
}
return array[item];
}
--------------------------------
このGetValueの前の&はどういう意味なんでしょう?アドレスを返すって意味?
&をとっても問題なくコンパイルできて動作もするのですが。何のための&なんでしょうか?
よろしくお願い致します。

641 :デフォルトの名無しさん:2010/02/28(日) 17:15:13
目次から「参照」を探せ

642 :デフォルトの名無しさん:2010/02/28(日) 17:40:51
>>640
これで&がなかったら、テンポラリのオブジェクトが生成されるのかな?

643 :デフォルトの名無しさん:2010/02/28(日) 17:43:24
>>640
インデックスが範囲外だったら0として扱うって、なんかひどい仕様。

644 :デフォルトの名無しさん:2010/02/28(日) 18:11:45
>>640
そんな今すぐ本は投げ捨てろ。
しかし、範囲外だったらvectorみたいに例外を投げるとかassertするとかすれば良いのに。

645 :640:2010/02/28(日) 19:44:11
>>641
ありがとうございます。なんとなく理解できました。

>>642
参照で返す利点って何なんでしょうか?

646 :デフォルトの名無しさん:2010/02/28(日) 19:51:56
private継承、protected継承って自分はめったに使わないんだけど、プロは普通にたくさん使ってるの?

647 :デフォルトの名無しさん:2010/02/28(日) 20:00:50
private継承はたまーに。
protected継承はスコットメイヤーズ様すら
使い道がないらしいから必要ない。

648 :デフォルトの名無しさん:2010/02/28(日) 20:51:50
>>645
参照で返す場合は
myArray.GetValue(0) = 100;
など参照先の書き換えが可能。
あるいはTが極端に大きなクラスの場合、
参照で返せばテンポラリ生成のコストがかからない。

649 :デフォルトの名無しさん:2010/02/28(日) 22:04:15
>>645
ただし返す変数の寿命に注意。auto な変数の参照を返してはいけない。

650 :640:2010/02/28(日) 22:18:17
>>648
>>649
ありがとうございます。覚えておきます。

651 :デフォルトの名無しさん:2010/02/28(日) 22:20:17
そもそも、メンバ変数の参照返すって、やらないほうがいいんじゃないの?

652 :デフォルトの名無しさん:2010/02/28(日) 22:30:16
>>651
この例の場合はそもそもpublicなデータメンバだから参照で返しても問題ないのかもしれないけど、
そもそもpublicなところが、いかがなものかという気はする。

653 :デフォルトの名無しさん:2010/02/28(日) 22:42:35
メンバ参照返しってやっぱ悪手なん?
コンテナの要素アクセスとかは仕方ないとして
普段からProxyつかうように心がけた方がいいのかな

654 :デフォルトの名無しさん:2010/02/28(日) 22:44:51
そりゃ悪手じゃろ

655 :デフォルトの名無しさん:2010/02/28(日) 22:49:16
使用に際し中身を考慮する必要があるならstructでいいじゃねえかって話だ

656 :デフォルトの名無しさん:2010/02/28(日) 22:50:33
>>653
折角アクセス制限を設けてカプセル化しているのに、
敢えてそれを崩すという意味で悪手なのかもしれないけど、
それを踏まえた上でどうしてもそうしなければならないなら、
仕方が無いのかもしれないですね。

657 :デフォルトの名無しさん:2010/02/28(日) 22:51:07
やるとしてもconstな参照返してほしい。

658 :デフォルトの名無しさん:2010/02/28(日) 22:52:34
でも std::vectorの[]は参照を返してるな。
配列っぽくしたいときはしょうがないのか。

659 :デフォルトの名無しさん:2010/02/28(日) 22:59:37
みんな、Effective C++ 第3版に書いてあるじゃないか。
> 配列っぽくしたいときはしょうがないのか。
うん、そういうときはしょうがないからいいよって書いてあった。


>>653
元のオブジェクトが無効になってたとき、参照返しだとやばいことになる。
例えば
コピーコストを下げるために
const MyClass& temp = obj.m_func();
としていて、いざtempを使おうとした時に
実はobjが無効でしたとかなりうる。




660 :デフォルトの名無しさん:2010/03/01(月) 01:13:58
浮動小数点(IEEE-754)についての質問です。
内容が特殊なので、スレ違いの場合は適切なスレを教えて頂けるとたすかります。
※以下の数式の「^」はべき乗を表します。

IEEE-754によると浮動小数点の正の最小値は
符号部(s)=0、指数部(e)=00000000[8桁]、仮数部(m)=00000000000000000000001[23桁]
になります。
※ビット列:00000000 00000000 00000000 00000001

指数部が0の時は、仮数は[1.m]ではなく[0.m]なので
仮数は2^(-23)になります。
また、指数は[-127]ではなく仮数を1.mから0.mで表すことに
したため[-126]になります。

なので、この時の値は
(-1)^(0) * (2^(-23)) * 2^(-126)
=2^(-149) ---【A】
になると思います。

しかし、IEEE-754の仕様を見ると、これとは違い
( ( 1 + (2^(-52)) ) * (2^(-150)) ) * (2^(-149)) ---【B】
と書かれています。

どうして【A】ではなく【B】になるのでしょうか?
「( 1 + (2^(-52)) ) * (2^(-150))」がどこから出てきたのか
サッパリわかりません。

(参考)IEEE-754仕様
tp://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html
[32-bit Single Precision]の[Positive Denormalized]です。

661 :デフォルトの名無しさん:2010/03/01(月) 11:22:30
アセンブラのマニュアルで見たのを思い出した、たぶんデノーマル数
精度を下げて仮数部も指数として使える
適当に検索した
ttp://journal.mycom.co.jp/column/architecture/094/index.html

662 :デフォルトの名無しさん:2010/03/01(月) 11:58:49
ここで聞いて良いのかわかりませんが、お願いします。
VC2008 でプロジェクト、Win32コンソールアプリ→DLL+空の状態にチェック
でビルドしてDLLを作ろうとしています。RealeseでビルドしてもフォルダにDLLは作成されましたが、
libファイルが作成されません。設定か記述が間違っているのでしょうか。

a.cpp
extern "C"
int add(int a){
int b;
b=a+10;
return b;
}

a.def
EXPORTS
_add


663 :デフォルトの名無しさん:2010/03/02(火) 21:26:44
libファイルはdefファイルじゃなくて__declspec(dllexport)つければ作ってくれるはず

664 :デフォルトの名無しさん:2010/03/02(火) 21:37:03
defファイルがリンカに渡されてないんじゃないの

665 :デフォルトの名無しさん:2010/03/03(水) 00:44:29
>>661
情報ありがとう。
一応、指数部が0と255の時はデノーマル数。
1〜254の時はノーマル数というのは、何とか理解できます。

tp://babbage.cs.qc.edu/courses/cs341/IEEE-754references.html
の最下部「 They are represented by 〜」から最後までの文章で
それらしいことを書いているような気がするんだけど、訳せない・・・

符号 | 指数部 | 仮数部
0 00000000 00000000000000000000001

ビット列が↑のときの
 (-1)^(0) * 2 ^ (-126) * 2 ^ (-23) = 2 ^ (-149)
より半分の値を表せるようなことが書いてあるみたいなんだけど・・・


666 :デフォルトの名無しさん:2010/03/03(水) 08:58:04
>>663
これを使うとcppだけでdllとlibファイルが作れるんですね、ありがとうございます。

>>664
プロジェクトのプロバディ リンカ→入力→モジュール定義ファイルにab.defを指定してビルドしました

1>ab.def : error LNK2001: 外部シンボル "_add" は未解決です。
1>D:\マイドキュメント\Visual Studio 2008\Projects\ab\Release\ab.lib : fatal error LNK1120: 外部参照 1 が未解決です。

addが未解決らしく、ab.libを作ってくれません。>>662の記述以外にもプロバディをいじる必要があるのでしょうか?

667 :デフォルトの名無しさん:2010/03/03(水) 09:12:05
>>666
a.def
EXPORTS
add

アンダーバーが必要なら

a.def
EXPORTS
_add=add


668 :デフォルトの名無しさん:2010/03/03(水) 09:27:08
一般的な使用例を知りたいのですが、プリフィックスでg_を付けるのって、
ヘッダでextern宣言するグローバル変数に付けるべきものですか?
それとも、ソース内で関数の外に書くstatic変数に付けるべきものですか?

669 :デフォルトの名無しさん:2010/03/03(水) 09:41:33
>>667
できました!ありがとうございます。
しかし、この調子だと先が思いやられる…

670 :デフォルトの名無しさん:2010/03/03(水) 10:15:23
属性値(int),戻り値型のペアが定義されている。
属性値をテンプレート引数として渡して戻り値型の値を返すテンプレート
関数(又はクラス)を記述したい。


enum { a1, a2, a3}のそれぞれに対して
a1 => int
a2 => double
a3 => int *
と定義されているとします。

これを関数テンプレートで定義し、

int v1 = get<a1>(arg);
double v2 = get<a2>(arg);
int *a3 = get<a3>(arg);

のように、テンプレート引数に属性値だけ渡す形式で呼び出したいのですが、
どのように書けば良いでしょうか?

671 :デフォルトの名無しさん:2010/03/03(水) 10:20:40
いちいち特殊化すればいいんでない?

672 :670:2010/03/03(水) 13:17:06
template<> struct<a1> typemap{
typedef int ValueType;
};
template<> struct<a2> typemap{
typedef double ValueType;
};
template<> struct<a3> typemap{
typedef int * ValueType;
};
と特殊化定義して

typemap<a1>::ValueType
で参照する事にしました。

673 :デフォルトの名無しさん:2010/03/03(水) 13:27:17
a.cpp
#include"a.h"
extern "C"
int add(int a);

a.h
extern "C"
__declspec(dllexport) int add(int a){
int b;
b=a+10;
return b;
}
Vc++ 2008 のRealeaseでビルド、DllとLibファイル作成
-----------------------------------------
Tyty.cpp
#include<stdio.h>

int __stdcall add(int a);
int main(){
int c;
c=add(7);
printf("%d\n",c);
}
上のDllとLibファイルをtyty.cppと同フォルダにコピー
プロジェクトのプロバディ リンカ→全般→追加のリンクライブラリ ディレクトリ→Libファイルを指定

Realeaseでビルド
1>tyty.obj : error LNK2001: 外部シンボル ""int __cdecl add(int)" (?add@@YAHH@Z)" は未解決です。
1>D:\マイドキュメント\Visual Studio 2008\Projects\tyty\Release\tyty.exe : fatal error LNK1120: 外部参照 1 が未解決です。
---------------------------------------------------
exturn "C" してもリンクエラーが出ます。関数の宣言が間違えてるんでしょうか


674 :デフォルトの名無しさん:2010/03/03(水) 13:49:42
cppの方のプロトタイプ宣言のとこもextern "C"

675 :デフォルトの名無しさん:2010/03/03(水) 13:51:35
""int __cdecl add(int)" (?add@@YAHH@Z)"これは、どこで宣言したadd()と考えているのか

676 :デフォルトの名無しさん:2010/03/03(水) 14:01:34
すみません、extern "C"宣言 tyty.cpp

#include<stdio.h>
extern "C"
int add(int a);
int main(){
int c;
c=add(7);
printf("%d\n",c);
}
ビルドすると
1>tyty.obj : error LNK2001: 外部シンボル "_add" は未解決です。
1>D:\マイドキュメント\Visual Studio 2008\Projects\tyty\Release\tyty.exe : fatal error LNK1120: 外部参照 1 が未解決です。

3行目を int _addに変更するとエラーが 「〜”_ _ add”は未解決です」になりました。

677 :デフォルトの名無しさん:2010/03/03(水) 14:08:05
えーとさ、a.hとa.cppとtyty.cppでの関数宣言を合わせようぜ

678 :デフォルトの名無しさん:2010/03/03(水) 14:15:40
>>676
間違えましたtyty.cppの3行目を _addにすると「〜”add”は未解決です」になりました

679 :デフォルトの名無しさん:2010/03/03(水) 14:16:05
って>>673よくみてなかったよ。
追加のライブラリディレクトリには、libファイルの場所を入れる
で、入力の追加の依存ファイルのとこにlibのファイル名を入れる

680 :デフォルトの名無しさん:2010/03/03(水) 14:25:01
数値Nが与えられたときに2^nがNを超える最小のnを求めたい時に
ビット処理で簡単にこれを実現する方法ってありますか

N=7ならn=3
N=25ならn=5
N=60000ならn=16です

681 :デフォルトの名無しさん:2010/03/03(水) 14:28:01
>>679
ありがとうございます、できました。
ディレクトリってフォルダまででしたっけ…設定を終えたつもりでしたが間違ってました orz


682 :デフォルトの名無しさん:2010/03/03(水) 15:21:02
>>676
dllを利用する方は__declspec(dllimport)にしないとあかんよ


---dll.hpp---
// __stdcallは__cdeclなどに変えてもいいけど、同じ関数ではきちんと統一しないといけない
// なにも書かないとVC++なら__cdeclになる
extern "C" __declspec(dllexport) int __stdcall func(int x);

---dll.cpp---
#include "dll.hpp"

// 実装
int __stdcall func(int x) { /* ... */ }


***以上をDLLとしてビルド***


---use_dll.hpp---
// さっきビルドした時に作られたlibファイルをインポート
// これを書かない場合はプロパティでリンカの設定が必要
#pragma comment(lib, "dll.lib")

extern "C" __declspec(dllimport) int __stdcall func(int x);

---main.cpp---
#include "use_dll.hpp"

int main(void) { func(100); return 0; }

683 :デフォルトの名無しさん:2010/03/03(水) 15:34:23
>>680
for(n=0; N; n++, N>>=1);

684 :デフォルトの名無しさん:2010/03/03(水) 15:38:37
>>680
_BitScanReverse

685 :デフォルトの名無しさん:2010/03/03(水) 15:49:03
>>682
そんなことはない

686 :デフォルトの名無しさん:2010/03/03(水) 16:13:19
class A{ public: struct B{ int dummy; }; };
この場合の A::B を前方定義する方法はありますか?

687 :デフォルトの名無しさん:2010/03/03(水) 17:27:34
>>683-684
ありがとうございます
x86にはbsr命令ってそのまんまなのがあるんですね
キーワード検索したらHackersDelightのページにたどり着き
2章が公開されてて感動しました

688 :デフォルトの名無しさん:2010/03/03(水) 18:23:50
>>668
変数名のことだと思うのですが、命名法にきまりはとくにありません。
が、global という意味でなら関数外static変数よりは、複数のモジュール間でスコープが有効な変数に g なりなんなりをつけるような
考えかたはあると思います。
わたしはモジュール総体でスコープが有効な変数はほとんどつかいませんが、モジュール内でスコープが有効な変数
(関数外static な変数)のサフィックスにSをつけています。

689 :デフォルトの名無しさん:2010/03/03(水) 20:16:36
>>688
アプリケーションハンガリアン表記という。


690 :デフォルトの名無しさん:2010/03/04(木) 10:23:13
x=f(g(h( int(1) )));
のintの一時変数は ; まで存在しますか?

691 :デフォルトの名無しさん:2010/03/04(木) 11:13:22
します

692 :デフォルトの名無しさん:2010/03/04(木) 12:44:06
関数自体は例外を全く投げないのですが引数をコピーするときに例外を投げる関数があるとします
例えば

struct hoge
{
     hoge &operator = (hoge other) { swap(other); return *this; } // 最適化をしやすくするために引数からあえて参照を外す
     void swap(hoge &other) throw() { /*略*/ }
     //以下略
};

この場合operator = はthrow()を指定してもいいでしょうか?

693 :デフォルトの名無しさん:2010/03/04(木) 12:45:30
typedefを使えばvectorとlistの両方に使えるコードが
書けるそうですが、どういう事なのでしょうか?
typedef vector<string> s;
typedef list<string> s;
という書き方では後者のsが再定義されるのでエラーになりますし

694 :デフォルトの名無しさん:2010/03/04(木) 13:42:04
最小正剰余の求め方で一番処理速度の速いやり方教えてください。
yは自然数でxは整数です。
戻り値は -1<x<yです。
int mod(int x,int y){
if(x<0){
return ((x%y)+x)%y
}else{
return x%y;
}
}

695 :デフォルトの名無しさん:2010/03/04(木) 20:22:17
個別のyごとに最適化すれば?
たとえばx%2^nだったらx&2^n-1

696 :デフォルトの名無しさん:2010/03/04(木) 20:46:36
>>693
片方好きなほうをコメントアウトする。
どっちを使ったとしてもうまくいくよと言いたいのだと思う。

697 :デフォルトの名無しさん:2010/03/04(木) 21:19:47
だがコンテナを汎用化する意味は無い

698 :デフォルトの名無しさん:2010/03/04(木) 22:34:41
1年複利で0.15%の利息が付く銀行に、100万円預けたときの
各年ごとの預金額を表示するCプログラムです。

以下の2つのプログラムの実行結果が異なるのですが、理由がわかりません。
教えてください。



699 :デフォルトの名無しさん:2010/03/04(木) 22:35:59
■プログラム1
#include <stdio.h>
int main()
{
int year = 0;
int balance = 1000000;

while(year <= 10) {
printf("%2dyear: %d\n", year, balance);

balance = balance * (1 + 0.0015);
year++;
}
}

■プログラム2
#include <stdio.h>
int main()
{
int year = 0;
double balance = 1000000;
int balance_int;

while(year <= 10) {
balance_int = (int)balance;
printf("%2dyear: %d\n", year, balance_int);

balance = balance * (1 + 0.0015);
year++;
}
}

700 :デフォルトの名無しさん:2010/03/04(木) 22:39:02
ナローイング変換

701 :デフォルトの名無しさん:2010/03/04(木) 22:41:11
小数点以下

702 :デフォルトの名無しさん:2010/03/05(金) 00:05:28
printfをそれぞれ
printf("%2dyear: %f\n", year, (double)balance);
printf("%2dyear: %f\n", year, balance);
にしてみれば一目瞭然では

703 :デフォルトの名無しさん:2010/03/05(金) 00:14:10
>>700,701
レスありがとうございます。

でも、この2つのプログラム、同じことやってるように思えるのですが…。

[プログラム1]
◆balance = balance * (1 + 0.0015);
balance <- balance * 1.0015
int <- int * double
int <- double * double <暗黙の型変換>
int <-(小数点以下切り捨て)- double <キャスト>

[プログラム2]
◆balance = balance * (1 + 0.0015);
balance <- balance * 1.0015
double <- double * double

◆balance_int = (int)balance;
int <-(小数点以下切り捨て)- double <キャスト>




704 :デフォルトの名無しさん:2010/03/05(金) 00:29:04
礼を言ってるだけで理解しようとはしてないんだね。

705 :デフォルトの名無しさん:2010/03/05(金) 00:35:02
>>700-702
理解しました。

プログラム1のほうは預金高をint型で保持してる。
一方、プログラム2のほうはdouble型で保持していて、出力の際に
int型の一時変数に小数点以下を切り捨てたものを格納して、それを表示してるだけ
だから、小数点以下の数字が徐々に大きくなってきて、繰り上がった時に両プログラムの
値が一致しなくなるわけですね。

すんごい間抜けな質問してごめんなさい…。
答えてくれてありがとうございました。


706 :デフォルトの名無しさん:2010/03/05(金) 09:58:46
>>696
遅れましたが、ありがとうございます
vectorとlistの扱い方を学ぶ章だったので
何か上手いやり方があるのかと思い込んでました
また不明な点があれば、ご教授願います

>>697
先のvector<string>のような短いものであれば
typedefによる汎用化はかえって混乱を招く、ということでしょうか?

707 :デフォルトの名無しさん:2010/03/05(金) 22:40:37
コンテナによって可能な操作が異なるからじゃないかな
単純にtypedefを書き換えればすむわけじゃないケースが多い

708 :デフォルトの名無しさん:2010/03/06(土) 00:30:10
sprintf(FILENAME,"/users/maroyuki/C.csv");
ofs.open(FILENAME);
for(i=0;i<N;i++) ofs << 何か変数 << endl;
ofs.close();
としてファイル書き込みしたいのですが、空のcsvファイルができるだけで
データが出力されません
何か変数のところに文字列リテラルを入れると出力されるのですが、
整数を直接打ち込んだ場合は駄目です
何故でしょうか?

709 :デフォルトの名無しさん:2010/03/06(土) 02:22:10
>>708
"何か変数" が 空
それ以外に思い浮かばないので
無意味な省略せずに、ソース全張り&環境を明記するといいかもな

710 :デフォルトの名無しさん:2010/03/06(土) 07:38:11
char FILENAME[100];
sprintf(FILENAME,"/users/maroyuki/C.csv");
std::ofstream ofs;
ofs.open( FILENAME );
ofs<<var<<std::endl;
std::cout<<var<<std::endl;
ofs.close();
ではディスプレイ出力に成功しているので変数が空というのは無いはずです。
ソース全張りは申し訳ないですができません。

環境はMacOSX10.6+Xcode3.2.1+GCC4.2です。
コーディングミスでないようなので少しMac周辺で調べてみると、
http://forums.macrumors.com/showthread.php?t=796818
こんなのが見つかりましたので調べてみます。

ありがとうございました。

711 :デフォルトの名無しさん:2010/03/06(土) 10:49:03
>>707
ありがとうございます
今はコンテナ共通の操作(eraseとか)しか分かりませんが
これから先そういったケースに遭遇すると思いますので留意します

712 :デフォルトの名無しさん:2010/03/06(土) 11:24:05
インターフェースの問題もあるけど
ある処理に対して最適なコンテナはどれかなんて大抵の場合は最初からわかってるから
コンテナを汎用化しても使うのは結局ひとつに絞られるから意味ない

713 :デフォルトの名無しさん:2010/03/06(土) 11:39:39
万能コンテナが存在するならvector、list、map、、、などと色々用意されてないし。

714 :デフォルトの名無しさん:2010/03/06(土) 13:13:57
>>712-713
ありがとうございます
仰る通りです
学生の成績を管理するプログラムで
不合格の学生のデータをfailコンテナに振り分け、
もとのコンテナから削除していく場合、
データの数が多ければ多いほどvectorよりlistの方が処理が速いようですし

715 :デフォルトの名無しさん:2010/03/06(土) 13:16:51
まぁそれを補う意味でもイテレータがあるわけで
これもイテレータのカテゴリによって可能な操作が異なるけど

716 :sage:2010/03/06(土) 13:52:32
Perlの変数やJavaのantのような、文字列に埋め込まれた
「$変数」を解釈するようなC++のライブラリってない?

717 :デフォルトの名無しさん:2010/03/06(土) 13:54:56
まずはboostを調べる。なかったら諦める

718 :デフォルトの名無しさん:2010/03/06(土) 13:59:36
>>714
学生にはユニークな学生番号があるだろうからmapのほうが良くないか?

719 :デフォルトの名無しさん:2010/03/06(土) 14:03:44
おそらく彼が読んでる本はAccelerated C++

720 :デフォルトの名無しさん:2010/03/06(土) 14:59:20
(ある程度の)万能コンテナは、ないこともないよ。
Boost.MultiIndexとか。

721 :デフォルトの名無しさん:2010/03/06(土) 15:06:04
コンテナの一般化はコンセプトによって行われる

722 :デフォルトの名無しさん:2010/03/06(土) 17:26:56
>>718
そこはあえて処理速度を求めて vector<int>.at(学籍番号)でw

723 :デフォルトの名無しさん:2010/03/06(土) 17:29:55
初歩的な質問なんですが
ユーザー定義の型でabsを定義すると、
stdのabsが使えなくなくなります。
int等はstdのやつでそれ以外は自分で定義したのをつかいたいときは
どうしますか?

724 :デフォルトの名無しさん:2010/03/06(土) 17:40:08
自己解決しました。すみません。

725 :デフォルトの名無しさん:2010/03/06(土) 17:51:34
>>716
ない。
多くの場合、実行時には変数名などといった情報は残っていないので、現状では実現できない。

726 :デフォルトの名無しさん:2010/03/06(土) 18:25:17
>>723
自己解決したのか?

727 :デフォルトの名無しさん:2010/03/06(土) 18:57:45
こんなのがあったとき
struct T{int time;bool f(){--time;return time<=0;}};
vector<T> v;

vのデータについてf()を1回呼び出して真のものはvから削除、としたいんですが
イテレータが無効化?されてしまうのでうまくいきません
こういう場合どう書けばよいんでしょうか

728 :デフォルトの名無しさん:2010/03/06(土) 19:03:05
remove_ifとeraseをつかう

729 :デフォルトの名無しさん:2010/03/06(土) 19:26:50
>>723は自己解決していません。

730 :デフォルトの名無しさん:2010/03/06(土) 20:05:39
>>729 ワロタ
名前空間を使う
namespace oresama_sugee_lib
{
ore_vector abs(const ore_vector& a);
}


731 :デフォルトの名無しさん:2010/03/06(土) 20:31:27
レスありがとうございます

>>715
iteratorはインデックスの代わりになる、という程度の知識しかありません
>イテレータのカテゴリによって可能な操作が異なる
今はどういう事なのか分かりませんが、頭に入れておきます

>>718,720
すみません
まだそれらの知識はありません
mapはもう少しで出てくるみたいです
Boost.MultiIndexというのは、
この本では出て来ないようですので調べます

>>719
そうです

>>721
すみません、どういう事なのかよく分かりません

長文、失礼しました

732 :デフォルトの名無しさん:2010/03/07(日) 12:38:20
>>730
名前空間をつかっても
intのときとore_vectorを引数によって自動で選んでくれません。
教えてください。

733 :デフォルトの名無しさん:2010/03/07(日) 12:49:40
int b=static_cast<int>(static_cast<ore_vector>(abs(static_cast<ore_vector>(a)));

734 :デフォルトの名無しさん:2010/03/07(日) 13:18:46
すみませんが教えてください。

アラインメントについて実験する以下のようなコードを見つけたですが、
文字列に使われている \x で始まる文字の意味が分かりません。これはどんな文字なのでしょうか?

main ( void )
{
char *str = "\x01\x23\x45\x67\x89\xab\xcd\xef";
unsigned *u = (unsigned *)(str + 1);

printf ( "%08x\n", *u );
}


735 :デフォルトの名無しさん:2010/03/07(日) 13:21:10
制御文字などソース上表示不可能な文字を16進数で指定

736 :デフォルトの名無しさん:2010/03/07(日) 13:29:00
0で始まれば8進数、xで始まれば16進数、それ以外の数字なら10進数

737 :デフォルトの名無しさん:2010/03/07(日) 13:30:48
>>733
意味が分かりません。

738 :デフォルトの名無しさん:2010/03/07(日) 13:39:53
>>732
パラメタの型による多相ならテンプレートとその特殊化使えばいいだけじゃね?

#include <cstdio>

namespace ore {
template<typename T>
T abs(T x) { std::puts("!=<int>"); return x; }
template<>
int abs<int>(int x) { std::puts("<int>"); return x; }
}

int main() {
ore::abs("moge");
ore::abs(1);
ore::abs<int>('a');
}

739 :デフォルトの名無しさん:2010/03/07(日) 13:45:33
>>738
すみませんが、何がやりたいのか分かりませんでした。
関数を呼ぶのに<int>をつけなくちゃいけないのなら
別の名前にしてもおなじですよね。

740 :デフォルトの名無しさん:2010/03/07(日) 13:51:43
>>739
1こ目はintじゃない型を渡すから !=<int>って表示される方が呼ばれる
2こ目は整数(int)を渡すから<int>って表示される方が呼ばれる

3つ目はおまけでcharを渡してるけど明示的に<int>って指定することで<int>って表示される方も呼べるよってこと
そゆことじゃないの?

741 :デフォルトの名無しさん:2010/03/07(日) 13:53:46
intのときはstd::absが呼びたいんですけど。

742 :デフォルトの名無しさん:2010/03/07(日) 13:55:58
intで特殊化して自分でよべ

743 :デフォルトの名無しさん:2010/03/07(日) 14:00:21
それってただのラッパーじゃないですか?
そうゆうことじゃないんですよ。

744 :デフォルトの名無しさん:2010/03/07(日) 14:05:00
ラッパーじゃねーよカス

745 :デフォルトの名無しさん:2010/03/07(日) 14:05:42
結局スルーした奴の勝ちかよ

746 :デフォルトの名無しさん:2010/03/07(日) 14:08:14
型がswapを特殊化してない場合は
std::swapにオーバーロード解決して欲しいとかいう類のアレか

747 :726 ◆RpGtirBRdE :2010/03/07(日) 14:11:26
えーと、だいぶ 放置してたんだが、まだやってるのか。

>>723
> ユーザー定義の型でabsを定義すると、
> stdのabsが使えなくなくなります。
使えなくなるってなんだ?どういうこと?

エスパーすると、
ユーザー定義の型をMyClassとしよう。
//@ typedef MyClass T;
//A typedef int T;
のどっちかがコメントアウト解除されている時、
T x(適当な初期化値);
std::cout << abs(x);
みたいなコードで、@が有効なときにはユーザー定義のabsが、
Aが有効なときにはstd::absが呼ばれるようにしたいと、そういうことなの?



748 :デフォルトの名無しさん:2010/03/07(日) 14:14:51
template<T> T function(T a){
return abs(a);
}
Tがint等のときはstd::absが呼ばれて
Tがint以外のときはユーザー定義のabsが呼ばれるように
やりたいだけです。

749 :726 ◆RpGtirBRdE :2010/03/07(日) 14:17:52
>>748
そのコードを最初から書いてくれればこんなにみんな悩まなかったのに。

template<T> T function(T a){
using std::abs;
return abs(a);
}
が正解。

750 :デフォルトの名無しさん:2010/03/07(日) 14:19:39
もう 749 で放って置こう

751 :デフォルトの名無しさん:2010/03/07(日) 14:20:29
using stdはちゃんとやってますよ?
あと<typename T>でした。

752 :デフォルトの名無しさん:2010/03/07(日) 14:22:31
>using std


753 :726 ◆RpGtirBRdE :2010/03/07(日) 14:23:03
>>751
> using stdはちゃんとやってますよ?
どこでやってるの?
俺の画面に表示されている限りではやっているように見えないんだけど?
いい加減、死ねばいいじゃないかな?


754 :デフォルトの名無しさん:2010/03/07(日) 14:23:06
よくかんがえたらusing std::absはやってませんでした。
やってみます。有難うございました。

755 :デフォルトの名無しさん:2010/03/07(日) 14:23:40
EffectiveC++3版読めよカス

756 :デフォルトの名無しさん:2010/03/07(日) 14:24:01
ついに>>726がキレたwww


757 :デフォルトの名無しさん:2010/03/07(日) 14:27:49
仮に749が正しいとして
その関数以外の場所のabsは
using std::abs;無しで
std::absの方が呼ばれないと困るんですけど。
駄目ですよね?

758 :デフォルトの名無しさん:2010/03/07(日) 14:29:35
全員でもうこいつは無視しよう。
C++使うな。勝手に困れ。

759 :デフォルトの名無しさん:2010/03/07(日) 14:30:13
C++では無理です
お引き取りください

760 :デフォルトの名無しさん:2010/03/07(日) 14:30:48
> そうゆうことじゃないんですよ。
> ちゃんとやってますよ?
> 仮に749が正しいとして

だんだん横柄になってきたな。

761 :デフォルトの名無しさん:2010/03/07(日) 14:30:58
原理を知らずにやり方だけ覚えてもダメといういい見本

762 :デフォルトの名無しさん:2010/03/07(日) 14:37:22
 最近寒いから良い燃料なんじゃないかな

763 :デフォルトの名無しさん:2010/03/07(日) 14:46:39
>>762
悪い燃料だったろ!

764 :デフォルトの名無しさん:2010/03/07(日) 15:28:40
using std::abs; 無しでないと困る理由を書けば続くかも

765 :デフォルトの名無しさん:2010/03/07(日) 15:41:26
ライブラリーを使う人が
absを使うときusing std::absがいる
規定を知っていけないといけなくなるから。

766 :デフォルトの名無しさん:2010/03/07(日) 15:46:28
namespace mylib {
    template<typename T> T swap(T const& v) {
        using std::abs;
        return abs(v);
    }
}
template<typename T> T function(T const& v){
    return mylib::abs(v);
}

あとは全部mylib::absを使えばいい。
嫌なら知らん。

767 :766:2010/03/07(日) 15:47:34
×swap ○abs
失礼。

768 :デフォルトの名無しさん:2010/03/07(日) 15:48:10
それってただのラッパーですよね。

769 :デフォルトの名無しさん:2010/03/07(日) 16:10:01
>>732
説明不足だったかな。
これでいいかな。
namespace ore
{
class Hoge
{
int a;
public:
explicit Hoge(int a0):a(a0){}
int get()const{return a;}
};

inline Hoge abs(const Hoge& a)
{
return Hoge(std::abs(a.get()));
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int c=3;
int d=abs(c);//ADLで std::absが選択される
ore::Hoge e(3);
ore::Hoge f=abs(e); //ADLで ore::absが選択される。
return 0;
}

770 :デフォルトの名無しさん:2010/03/07(日) 16:13:24
>>769
ヘッダが抜けてた
#include <cmath>
を追加してね

771 :デフォルトの名無しさん:2010/03/07(日) 16:14:20
>>769
ありがとうございます。


772 :デフォルトの名無しさん:2010/03/07(日) 20:18:02
Cを知らずにC++をマスターすることは可能でしょうか?
C++の入門サイトなのにprintfが出てきたりCに書き直せだとか出てきて発狂しそうです

773 :デフォルトの名無しさん:2010/03/07(日) 20:22:08
可能だけど、大体の入門書はC前提、あるいはC部分は駆け足だから、Cの入門書ぐらいは読んでもいいだろう

774 :デフォルトの名無しさん:2010/03/07(日) 22:13:57
標準出力へ出力する選択肢として(f)printfは未だアリだと思うし、ほぼ上位互換なんだから覚えとけ。

775 :デフォルトの名無しさん:2010/03/07(日) 22:45:23
>>772
> Cを知らずにC++をマスターすることは可能でしょうか?
可能です。
でもC++しかしらなくてC言語を全く知らないとなると
今後 ちょっと不便だと思うよ。

職業としてもし使いたいなら結局は両方必要になる。




776 :デフォルトの名無しさん:2010/03/08(月) 00:03:59
多かれ少なかれC++の土台はC言語なんだから、C++をマスターした人が
C言語を知らないってのはありえないし、順番的にもC言語は知っておくべき

777 :デフォルトの名無しさん:2010/03/08(月) 00:09:59
多かれ少なかれってか多いぜ。

> C++をマスターした人が
> C言語を知らないってのはありえない
同意。
C言語を知らないで通ろうという方が面倒だと思うぜ。

778 :デフォルトの名無しさん:2010/03/08(月) 00:43:46
template <class T> mycls;

template <???> void std::swap< mycls<?> >(mycls<?> &lhs, mycls<?> &rhs)
{
・・・
};

テンプレートクラスのstd::swap特殊化って不可能?

779 :デフォルトの名無しさん:2010/03/08(月) 01:46:44
C言語は脆弱性の元
理想的には知らない方がいい

780 :デフォルトの名無しさん:2010/03/08(月) 01:52:47
ぜ、ぜいじゃくせい

781 :デフォルトの名無しさん:2010/03/08(月) 02:18:26
むしろCを知らない人って、
脆弱性云々の発生原因はどこにあるとか理解できるの?

782 :デフォルトの名無しさん:2010/03/08(月) 02:22:43
コア吐かせてデバッガでスタックトレース、メモリダンプ

783 :デフォルトの名無しさん:2010/03/08(月) 02:37:23
ある程度被る部分は別としても、C的な泥臭い部分を知らずに学んだ方がむしろ良いとも思う
(C++をやるのにmallocが必要か?)
ただそんな前提の入門書やサイトの存在を知らないのだが…

784 :デフォルトの名無しさん:2010/03/08(月) 02:39:02
Accelerated C++

785 :デフォルトの名無しさん:2010/03/08(月) 02:48:00
泥臭い部分を知らずにプログラムしたいならC++じゃなくて他の言語でいいじゃん

786 :デフォルトの名無しさん:2010/03/08(月) 02:53:58
最先端の3Dゲームみたいに速度が命といったソフトの開発にはまだCが現役なんじゃないの?

787 :デフォルトの名無しさん:2010/03/08(月) 02:57:31
C+のC++が使われてるんじゃね?

788 :デフォルトの名無しさん:2010/03/08(月) 03:02:01
むしろローテクな組み込み
とはいえ、もうCもさすがに減ってきたけどね

789 :デフォルトの名無しさん:2010/03/08(月) 16:05:04
速度に関するところはDirectXとか使うから
Cなんて使わないんじゃないの?

790 :デフォルトの名無しさん:2010/03/08(月) 16:12:24
え?

791 :デフォルトの名無しさん:2010/03/08(月) 16:26:07
標準の例外って使い分けしてる?
std::exception継承した自作例外しか使ってないんだがダメかな?


792 :デフォルトの名無しさん:2010/03/08(月) 19:18:05
intの入力値をdoubleで受けても
数値が切り捨てられることってないですよね?

793 :デフォルトの名無しさん:2010/03/08(月) 19:46:29
intが32bitなら大丈夫

794 :デフォルトの名無しさん:2010/03/08(月) 20:12:54
C++よりCの方が5%ほど速いらしい
ゲームでは大きいかもな>5%

795 :デフォルトの名無しさん:2010/03/08(月) 20:23:17
>>794
なにそれソースplz

796 :デフォルトの名無しさん:2010/03/08(月) 20:52:04
>>794
Cに幻想を抱いていませんか?

ソースを出そうぜ

797 :デフォルトの名無しさん:2010/03/08(月) 21:12:29
>>793 ありがと

798 :デフォルトの名無しさん:2010/03/08(月) 21:48:13
effective c++のどっかにそれっぽいことはあったと思う。
794じゃないし、本も手元にないからこれ以上言えんけど。

799 :デフォルトの名無しさん:2010/03/08(月) 22:17:17
>>798
あ、そうそう、effective C++に書いてあったわ

800 :デフォルトの名無しさん:2010/03/09(火) 23:06:55
postscriptのスレってありますか

801 :デフォルトの名無しさん:2010/03/09(火) 23:17:52
>>794
> C++よりCの方が5%ほど速いらしい
最近、久々に
Effective C++ 第3版を通読したんだけど
どこにも記述が見つからないですよ。


802 :デフォルトの名無しさん:2010/03/09(火) 23:40:26
>>801
俺が見たのは第2版の前書きにて

803 :デフォルトの名無しさん:2010/03/10(水) 00:29:47
ん?第2版だけど、後の方じゃないか?

804 :デフォルトの名無しさん:2010/03/10(水) 02:19:33
C++はCの機能を全部含んでるから、C++の方が遅いなんてことはありえない、なんて意見は誰も望んでいないよなー。

だとすると、C++の独自機能のうち、オーバーヘッドが大きいのはどの機能で、Cと互角orC++の方が早いくらいな機能はどの機能か?
って話が知りたいわけだ。
そして、オーバーヘッドが大きい機能を極力使わないようにしたところ、どれくらいC++らしさを保てるか、奇妙な難解言語になっていないか、
ということが重要になってくるわけだ。

一般にオーバーヘッドが大きいって言われているのに、virtualメソッド、iostreamでの読み書きがある。
関数オブジェクトはコールバックとそう変わらないらしいね。
std::vectorは、固定長配列よりは遅いが、自力で(mallocやらreallocやらで)可変長配列書くよりは
(優秀なプログラマなら互角に勝負できるらしいが、大多数のプログラマにとっては)早いようだ。
sizeをあらかじめ決めておき、配列形式でアクセスすると変わらんが、それだとvector使う意味が薄れる。

805 :デフォルトの名無しさん:2010/03/10(水) 03:11:28
>>740
> 3つ目はおまけでcharを渡してる
遅レスでごめん
>ore::abs<int>('a');
'a'ってintじゃないの?

806 :デフォルトの名無しさん:2010/03/10(水) 03:41:27
>>805
つ sizeof('a')

807 :デフォルトの名無しさん:2010/03/10(水) 14:19:14
static_cast reinterpret_cast const_cast
実行時コストはまったくのゼロでいいの?

808 :デフォルトの名無しさん:2010/03/10(水) 14:21:20
何で質問している奴がタメグチなの?

809 :デフォルトの名無しさん:2010/03/10(水) 14:23:58
>>807
そんな質問の仕方で本当に答えがもらえると思ってるの?

810 :デフォルトの名無しさん:2010/03/10(水) 15:51:02
はぁ?2ちゃんねるでなにいってんだ
答えられないならだまってろよカス


811 :デフォルトの名無しさん:2010/03/10(水) 15:52:33
素敵なインターネッツ プライスレス

812 :デフォルトの名無しさん:2010/03/10(水) 16:23:00
>>807
いずれも値のコピーをするので、最適化されなければコピーにかかる分のコストがある。
それ以外では多相ポインタに対するstatic_castはクラス階層の移動がある場合
アドレスを調整するため整数の加減算が発生する事がある。
いずれも無視できる程度だな。

813 :デフォルトの名無しさん:2010/03/10(水) 16:29:44
空気嫁

814 :デフォルトの名無しさん:2010/03/10(水) 18:26:54
>>813
読まなけらばならない空気などあるのでしょうか?

815 :デフォルトの名無しさん:2010/03/10(水) 20:53:16
意地悪したかったのに助け船だしちゃったヤツが居るから
とかそういうくだらない会話が繰り広げられているわけですね。


816 :デフォルトの名無しさん:2010/03/10(水) 21:36:46
オーバーロードしたオペレータの優先順位ってどうなるんでしょうか
元の演算子の種類と同じものを受け継ぐ?

817 :デフォルトの名無しさん:2010/03/10(水) 22:02:51
うん


818 :デフォルトの名無しさん:2010/03/10(水) 23:12:45
>>813
つ[シリコン嫁]

819 :デフォルトの名無しさん:2010/03/10(水) 23:25:35
#define って言語の機能として必要なの?
IDEでサポートするようなものじゃないの?

820 :デフォルトの名無しさん:2010/03/10(水) 23:44:01
>>819
> #define って言語の機能として必要なの?
> IDEでサポートするようなものじゃないの?
言語仕様にIDEを定義するつもりですか?


821 :デフォルトの名無しさん:2010/03/10(水) 23:48:59
>>819
#define はプリプロセッサ、言語の機能というよりは単なる置き換え。
IDE に取り込むのはむずかしいでしょう。なにせ無節操。

822 :デフォルトの名無しさん:2010/03/11(木) 02:46:33
Class instance;
instance.do_something();

Class *instance = new Class();
instance->do_something();
delete instance;
の使い分けを教えてください

823 :デフォルトの名無しさん:2010/03/11(木) 05:08:55
寿命

824 :デフォルトの名無しさん:2010/03/11(木) 07:37:33
速度

825 :デフォルトの名無しさん:2010/03/11(木) 12:22:31
>>822
前者は関数内でのみ有効。後者はinstance を delete するまで有効。寿命。

826 :デフォルトの名無しさん:2010/03/11(木) 12:29:11
>>822
前者はスタック上にメモリがとられ、
後者はヒープのメモリを使う。



自信なし。

827 :デフォルトの名無しさん:2010/03/12(金) 00:22:41
一度に確保できるメモリの大きさをコンパイルタイムorランタイムに調べる方法はありますか?

828 :デフォルトの名無しさん:2010/03/12(金) 02:02:36
>>827
コンパイル時は無理。実行時にsize_tの最大値でmalloc()&free()してみれ
ばいい。失敗したらサイズを減らす。



829 :デフォルトの名無しさん:2010/03/12(金) 12:15:32
DLLをregsvr32で登録したいんですが、「dll は読み込まれましたが、DllRegisterServer エントリポイントが見つかりません」と言われました。
以下を記述すれば登録できるDLLが作れますか?
DllMain :
DllGetClassObject : クラス ファクトリのインスタンスを作成する。前のトピックにて解説済み。
DllCanUnloadNow : DLL が安全にアンロード可能かどうかを問い合わせる。
DllRegisterServer : DLL のレジストリ エントリを作成する。
DllUnregisterServer : DLL のレジストリ エントリを削除する。

ネットで調べたんですがよく解りませんでした、DLLについて書いてある本とかHPはありませんか?

830 :デフォルトの名無しさん:2010/03/12(金) 13:07:49
>>829
スレ違い

831 :829:2010/03/12(金) 13:59:09
スレ違いでしたのでスルーしてください、すみません

832 :デフォルトの名無しさん:2010/03/12(金) 22:42:07
shared_ptr<int> p(new int);

これのコンストラクタ内部で例外が発生したらnew intで確保したオブジェクトは回収不能ですか?

833 :デフォルトの名無しさん:2010/03/13(土) 04:13:59
RAIIで確実にdeleteや削除子が呼ばれる。

834 :デフォルトの名無しさん:2010/03/13(土) 18:19:57
shared_ptrの中は俺らが心配するなんぞ0x10年早い

835 :デフォルトの名無しさん:2010/03/13(土) 18:44:02
shared_ptrのデストラクタ呼ばれないのにちゃんと指定した削除子で削除してくれるの?

836 :デフォルトの名無しさん:2010/03/13(土) 18:51:09
つうかshared_ptr関係なく例外でリークする例じゃん

837 :デフォルトの名無しさん:2010/03/13(土) 18:51:28
中でcatchしてdeleteしてthrowすんだよ
心配イラネ

838 :デフォルトの名無しさん:2010/03/13(土) 19:35:14
>>836
リークしないよ

839 :デフォルトの名無しさん:2010/03/13(土) 19:39:59
>>832
>template<class Y> explicit shared_ptr(Y * p);
>...
>Exception safety: If an exception is thrown, delete p is called.

聞く前にドキュメントを読むべき

840 :デフォルトの名無しさん:2010/03/13(土) 19:53:48
というか、何のためにshared_ptrを使うのかと

841 :デフォルトの名無しさん:2010/03/13(土) 22:25:11
コンストラクタで例外投げるとリークするって信じてる人がいるね。

842 :デフォルトの名無しさん:2010/03/13(土) 22:57:56
>>841
そんなアホが居るのか?

843 :デフォルトの名無しさん:2010/03/13(土) 23:42:49
例外投げたらいかんのはデストラクタだけだ

844 :デフォルトの名無しさん:2010/03/13(土) 23:56:16
ヒープに取ってるときはちょっとだけ注意が必要

845 :デフォルトの名無しさん:2010/03/14(日) 01:02:48
引数を受け取るnewを使うときも注意が必要

846 :デフォルトの名無しさん:2010/03/14(日) 01:05:44
引数を受け取るニュウ?

847 :デフォルトの名無しさん:2010/03/14(日) 01:55:07
Win32コンソールアプケーションでどんなときに×ボタンを押して終了してもメモリリークしないのはなぜですか

848 :デフォルトの名無しさん:2010/03/14(日) 01:55:56
よく計算されてるから

849 :デフォルトの名無しさん:2010/03/14(日) 02:01:33
>>845
newの代わりにmake_sharedを使うとリークしないし速い。

850 :デフォルトの名無しさん:2010/03/14(日) 02:08:14
make_sharedって速くなんの?中でnewしてるだけじゃなかったのか

851 :デフォルトの名無しさん:2010/03/14(日) 02:17:28
newだとshared_ptr内でもう一回newしなくちゃならないので合計2回必要だけど、make_sharedだと1回ですむから。

852 :デフォルトの名無しさん:2010/03/14(日) 02:18:26
>>850
shared_ptr<hoge>(new hoge);だと内部で参照カウントの領域を別にメモリ確保するが、
make_sharedだと1度のメモリ確保で両方収まる領域を用意する。
そのため、速くなると言うのは嘘とは言えない。

853 :デフォルトの名無しさん:2010/03/14(日) 02:22:53
なるほどねぇ
boostの中の人はほんとに優秀だな

854 :デフォルトの名無しさん:2010/03/14(日) 02:33:01
たまには、Boost総合スレ part8を思い出してあげてください
http://pc12.2ch.net/test/read.cgi/tech/1251446016/


855 :デフォルトの名無しさん:2010/03/14(日) 13:19:54
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
でc言語編でcの基礎やってからc++編やろうと思います
c言語編のどこらへんでc++編に移行したらいいと思いますか?
また、c++のどこらへんまでやったらSDK編移行していいと思いますか?

日本語下手ですみません

856 :デフォルトの名無しさん:2010/03/14(日) 13:24:58
目次をぱっと見た感じ、1部40章ぐらいまででいい気がする

857 :デフォルトの名無しさん:2010/03/14(日) 13:27:38
C++は20章ぐらいまで。後半はSTLライブラリの話とかだからそこはなくてもプログラミング出来る
ファイル入出力とかはSDKのほうにOSが提供してるやつがあるので
急ぐならC/C++のファイル入出力は飛ばしてもよいかも

858 :デフォルトの名無しさん:2010/03/14(日) 13:30:44
>>856-857
ありがとうございます。急ぎはしないのでゆっくりやってきたいとおもいます。

859 :デフォルトの名無しさん:2010/03/14(日) 14:07:33
テンプレート引数のオブジェクトがswapメンバを持ってればswap、なければstd::swapを使うように自動化することは出来ますか?

860 :デフォルトの名無しさん:2010/03/14(日) 14:14:01
釣りじゃないのなら
C++相談室スレか何かに載ってるので見てください

861 :デフォルトの名無しさん:2010/03/14(日) 14:36:51
>>855
ここ、C言語編とか良いながらWindowsも混ざってるぞ。

862 :デフォルトの名無しさん:2010/03/14(日) 16:25:32
gtkとかC言語で書かれているじゃん、でもC++でやるとgtkにクラスに継承関係が発生する
どうやって、C言語で書かれているコードに継承関係を作ってるの?

863 :デフォルトの名無しさん:2010/03/14(日) 16:36:56
構造体と共用体でどうじゃあこうじゃあしてポインタの縮小キャストをどうじゃあこうじゃあで構造体の先頭のメンバが決まっているからどうじゃあこうじゃあなんだよ

864 :デフォルトの名無しさん:2010/03/14(日) 16:57:58
vtblでググれ

865 :デフォルトの名無しさん:2010/03/14(日) 17:16:13
メモリの動的確保を何回かやったあとの
メモリの開放はfree1回でいいの?

866 :デフォルトの名無しさん:2010/03/14(日) 17:21:47
>>865
だめ。

867 :865:2010/03/14(日) 17:24:58
>>867
じゃあ、確保した回数だけ開放しなければならないのか

868 :デフォルトの名無しさん:2010/03/14(日) 17:30:14
安価ミスった
>>866

869 :デフォルトの名無しさん:2010/03/14(日) 17:31:48
  int*  p = new int;
  p = new int;
  p = new int;
  delete p;
  delete p;
  delete p;

とかするなよ。

  int* p0 = new int;
  int* p1 = new int;
  int* p2 = new int;
  delete p2;
  delete p1;
  delete p0;

みたいにするんだぞ。

870 :デフォルトの名無しさん:2010/03/14(日) 17:36:37
>>869
ありがとう
c++じゃないけどcも似たような感じでやればいいのね

871 :デフォルトの名無しさん:2010/03/14(日) 17:42:35
yes

872 :デフォルトの名無しさん:2010/03/14(日) 17:43:48
何もかも放り出してshared_ptr使えばいいよ

873 :デフォルトの名無しさん:2010/03/14(日) 17:57:12
>>869
> int* p = new int;
> p = new int;
> p = new int;
> delete p;
> delete p;
> delete p;
>
> とかするなよ。

int* p = new int;
いろいろな処理
delete p;
p = new int;
いろいろな処理
delete p;
p = new int;
いろいろな処理
delete p;

こうやれよ、という話かとおもた

874 :デフォルトの名無しさん:2010/03/14(日) 19:53:32
>>847
Windowsはウィンドウ(プロセス)ごとに仮想メモリ領域を割り当てて
そのメモリ領域内で内でプログラム(アプリケーション)を実行する。
×ボタンなどで閉じる時に、ウィンドウ生成時に割り当てた
仮想メモリ領域を解放するので、アプリがメモリリークしてても
OSとしてリークしない(しにくい)仕組みになっている。
だからと言ってdeleteしなくてもいいじゃん!というわけではないよ



875 :デフォルトの名無しさん:2010/03/14(日) 22:24:43
class A{
int x;
};
class B{
int x;
};

class C : public A, public B{
C(A a, B b) : A(a), B(b){}
void func()
{
cout<<A::x;
cout<<B::x;
}
};

この方法でクラスCのコンストラクタに
クラスAのオブジェクトデータを2つ以上使うにはどうすればいいですか?


876 :デフォルトの名無しさん:2010/03/14(日) 23:41:45
メンバ関数の戻り値にポインタを使っている場合、
deleteはどのタイミングですればいいのですか?

877 :デフォルトの名無しさん:2010/03/14(日) 23:46:44
>>876
そのポインタが何を指しているのか分からんし、
まーーったく答えようがない。

一見するとクソ設計に読めるが、
わざとポインタを返す方法もあるし。。。

878 :デフォルトの名無しさん:2010/03/14(日) 23:52:16
それがメンバ関数内でnewしたものならその関数を呼び出した元に責任があるだろうけど、
メンバ変数のポインタを返すようにしてるなら削除されたら困るだろうし(この設計はどうかと思うが)、
一概には言えないが、一つ言えるのは不必要になったら削除すれば良い。

879 :876:2010/03/14(日) 23:56:43
基本的に戻り値にポインタを使っちゃいけないんですね
わかりました

>>877-878
thx

880 :デフォルトの名無しさん:2010/03/15(月) 00:06:35
>>879
いやむしろ積極的にポインタを返すワザもあってだな・・・

まあいっか。

881 :デフォルトの名無しさん:2010/03/15(月) 00:07:25
>>879
Effective C++ぐらい読もうぜ。
あれを読まずしてC++を使ってもクソ設計しか書けないぞ。


882 :デフォルトの名無しさん:2010/03/15(月) 00:11:29
それを言ってしまえば、だいたいの質問は「Effective C++読め」で済んじゃうような、、、

883 :デフォルトの名無しさん:2010/03/15(月) 00:14:00
新規に確保されたメモリなら生ポかスマポを返す
クラス内と共有してるメモリやstatic変数へのポインタならスマポかアドレスをとられないようにラップしたポインタもどきを返す

884 :デフォルトの名無しさん:2010/03/15(月) 00:14:46
effective C++むずい(´・ω・`)

885 :デフォルトの名無しさん:2010/03/15(月) 00:21:10
プログラミングの本って、超簡単なのと難しいのしか無いよね
中級者へのステップアップが難しい

886 :デフォルトの名無しさん:2010/03/15(月) 00:22:58
>>882
済んじゃって悪くないだろ。
名著の誉れ高い本なんだし。

別に俺はこのスレで答え教えることを否定したい訳じゃ無いが。


887 :デフォルトの名無しさん:2010/03/15(月) 00:28:46
せっかくwebで議論の場があるのに、本を紹介して終わりってのもさびしいやね
実装方法を質問したつもりなんだけど、boostでおk、の一言がかえってきた時の脱力感はまったく嫌なものだよ

888 :デフォルトの名無しさん:2010/03/15(月) 00:47:08
>>875
それは継承では無理
包含(コンポジション)を使え
private変数の出力にはメンバ関数を用意する

889 :デフォルトの名無しさん:2010/03/15(月) 03:29:01
C#ではメソッドで
 return new string[] {"ahya", "hoge", "haya-n"};
みたいに配列をreturnすることができるわけだけど
C++は全く同じことってできたっけ?

890 :デフォルトの名無しさん:2010/03/15(月) 04:55:38
全く同じは無理だ。
std::vector と boost::fusion::make_vector() あたりで代用してくれ。

891 :デフォルトの名無しさん:2010/03/15(月) 10:02:43
関数を表示させるプログラムを作ってるのですが
次のようにしてもとびとびの値しか表示できません
こういうときはどうすればよいのでしょうか?
最終的には直線を複素変換で円にして表示するところまで作るのが目標ですが
それ以前のところで躓いてしまいました

int f(int x){return 5*x;}
int g(int y){return y/5;} //逆関数も試してみた
//x,yは画面の幅と高さの分だけループ。描画はwinapiを使ってます
void draw(int x,int y,HDC& hdc){
SetPixel(hdc,x,f(x),RGB(0,0,0));
// SetPixel(hdc,f(y),y,RGB(0,0,0));
}

892 :デフォルトの名無しさん:2010/03/15(月) 10:11:33
すいません、↑については自己解決しました
逆関数のほうは単にg(y)とすべきところをf(y)としてしまっていただけでした

893 :デフォルトの名無しさん:2010/03/15(月) 18:29:23
DirectXを使ってゲーム作っているのですが、カメラをマウスの移動方向で回転させたいと思っています。
DirectXInputを使わずにやろうと思い、次のようなソースを書いたのですが、カーソルの右と上への移動が過度にされ、
左と下への移動があまりうまく判定されません。どのように改善したらよいでしょうか。
POINT pos;//現在のマウス位置
POINT poso;//マウス左ボタンを押した位置
case WM_LBUTTONDOWN:
if(!isMouseDown){
poso.x=LOWORD(lParam);//マウス左ボタンを押した位置セット
poso.y=HIWORD(lParam);
}
isMouseDown=TRUE;
break;
case WM_LBUTTONUP:
isMouseDown=FALSE;
break;
case WM_MOUSEMOVE:
if(!isMouseDown)return 0;
pos.x-=poso.x;//差でマウスの移動方向を判定
pos.y-=poso.y;
if(pos.x<0)(回転角変更処理)
else if(pos.x>0)(回転角変更処理)
if(pos.y<0)(回転角変更処理)
else if(pos.y>0)(回転角変更処理)
poso.x=pos.x;//動かすたびに移動方向を判定できるようリセット
poso.y=pos.y;
break;
while( msg.message!=WM_QUIT )// メッセージループ
{
if(isMouseDown)GetCursorPos( &pos );
}

894 :デフォルトの名無しさん:2010/03/15(月) 20:50:16
>>890
おお!fusion渡しか。それいいね。ヒープも使わずスタックに積んで高速ときたか。最適化も効きそうだな。
それはいいテクニックだな。使わせてもらうよ。


895 :デフォルトの名無しさん:2010/03/16(火) 13:23:01
>>893
pos -= poso をしたらposは「現在の位置」ではなく「移動量」になる。
移動量のローカル変数を作るのがいいのでは。

posoをMOUSEMOVEで更新するとposoは「左ボタンを押した位置」ではなくなる。
現在の位置で更新すると「前回の位置」になるが、
a点からb点に移動する時に経路によって回転具合が変わるような回転がしたいならそれでいいが、
そうでないならposoはBUTTONDOWN時にセットするだけでおk。

896 :デフォルトの名無しさん:2010/03/16(火) 20:57:37
int d[10][10]={/* */};
これの最初のデータを参照で受ける方法がわからないんですが
文法的にどう書けばよいんでしょうか?

思いつくのを適当に試したんですがコンパイルできません
int *&a=d[0];
int &a[10]=d[0];
int &[10]a=d[0];
int &a[]=d[0];

897 :デフォルトの名無しさん:2010/03/16(火) 21:07:34
typedef int impo;
impo d[20][10];
impo (&a)[10] = d[0];

typedef int impo_10[10];
impo_10 &b = d[0];

898 :デフォルトの名無しさん:2010/03/16(火) 21:09:00
2次元配列なんだから右辺がおかしい

899 :デフォルトの名無しさん:2010/03/16(火) 21:09:17
int *a = d[0];

int (*a)[10] = d;

900 :デフォルトの名無しさん:2010/03/16(火) 21:20:06
うまくいきました。ありがとうございます

901 :デフォルトの名無しさん:2010/03/16(火) 23:23:42
1aだとかbeafだとかcafeといった16進数を
scanfかcinで整数値として読み込む方法はありますか

902 :デフォルトの名無しさん:2010/03/16(火) 23:26:00
すいません、自己解決しました
cin >> setbase(16) >> a;

903 :デフォルトの名無しさん:2010/03/16(火) 23:40:50
strrchr(str, c);のp-strの数字をint aに代入したいのですが
a=*(p-hikaku);では駄目でした。初歩だと思いますがどう記述すれば良いのでしょう?


904 :893:2010/03/16(火) 23:43:25
八百九十三です。(や○ざじゃないヨ)
ifのところを引き算して判定から単純に>と<による大きさの判定をしたところ、
意図したとおりの結果が得られました。
>a点からb点に移動する時に経路によって回転具合が変わるような回転がしたいならそれでいいが
その後おっしゃっている通り「移動する時に経路によって回転具合が変わる」ようにしたかったので、
このようにいたしました。
どうもお世話になりました。ありがとうございました。

905 :デフォルトの名無しさん:2010/03/16(火) 23:43:41
a = p - str;

906 :デフォルトの名無しさん:2010/03/16(火) 23:53:35
>903が何を言いたいのかよく判るな。
strchr(str, c);のp-strってなんだよpgr

907 :デフォルトの名無しさん:2010/03/16(火) 23:59:57
この程度推測できないでよくここに書き込めるなw

908 :デフォルトの名無しさん:2010/03/17(水) 02:57:25
>>903のコードは大体こんなのだと思うんだけど、 hikaku がわかんね。
char str[] = "abcdef";
char c = 'e';
char* p = strrchr(str, c);
int a = -1;
if(p){ a = p - str; }

909 :デフォルトの名無しさん:2010/03/17(水) 07:23:54
>>903
a=*(p-hikaku);では無くa=*(p - str);でした。
ネットとコードからコピペしたせいで間違えてしまいました、すみません。
a = p - str; できました、ありがとうございます。

910 :デフォルトの名無しさん:2010/03/17(水) 09:09:13
>>906
お前 C のプログラム書いたことないのか????

911 :デフォルトの名無しさん:2010/03/17(水) 10:02:16
どこで質問すればよいのか分からなかったのでここで、質問させていただきます。
"Windows Update"の"更新履歴の表示"で表示される更新プログラム(KB******と表示される箇所)のリストを取得する
方法をご存知でしたら教えていただけないでしょうか?
社内で指定されたセキュリティ更新のパッチが当てられているかをチェックするツールを作成するのが目的です。

開発環境はVisualStudio2008 C++(MFC)
Windows XPとVistaで上記のリストを取得する必要があります。

912 :デフォルトの名無しさん:2010/03/17(水) 10:13:08
>>911
Windows フォルダの下に WindowsUpdate.log といるファイルがあるから、
これを解析すればわかるんじゃない。

ttp://support.microsoft.com/kb/902093/ja

913 :911:2010/03/17(水) 17:09:20
>>912
ありがとうございます。
"更新プログラム"の行を解析して実現できそうです。
本当に助かりましたm(_ _)m

914 :デフォルトの名無しさん:2010/03/17(水) 20:58:42
よく関数の宣言に

int geometryOutputVertexCount () const

みたいにお尻に"const"をつけてるケースをまま見るんですがこれなんなんですか(´・ω・`)?

915 :デフォルトの名無しさん:2010/03/17(水) 21:00:17
このメンバ関数はconstだぜ
(オジェクトの内部状態を変えないぜ)

916 :デフォルトの名無しさん:2010/03/17(水) 21:37:36
std::mapを利用してデータテーブルを作成したいのですが
mapを要素にもつ配列を利用して二次元配列的にするか
mapのkeyを行数*最大列数+列番号として直線的に二次元配列を表現するのではどちらが効率的でしょうか?

917 :デフォルトの名無しさん:2010/03/17(水) 21:58:53
インデックスが整数、整数なら普通の配列でいいじゃん

918 :デフォルトの名無しさん:2010/03/17(水) 22:05:35
たとえばint型の二次元配列を実装するとき
空白のfieldと0を明確に区別したいのでmapを利用しようと考えました

919 :デフォルトの名無しさん:2010/03/17(水) 22:07:09
>>915
それは変数をstaticで宣言するのと何が違うんですか?

920 :デフォルトの名無しさん:2010/03/17(水) 22:07:50
↑失礼。間違えました

× それは変数をstaticで宣言するのと何が違うんですか?
○ それは変数をconstで宣言するのと何が違うんですか?

921 :デフォルトの名無しさん:2010/03/17(水) 22:27:25
>>920
constオブジェクトはconstなメソッドしか呼べない。
constでないオブジェクトはconstでないメソッドを呼べる。
constなメンバ変数を持つconstオブジェクトはconstなメソッドしか呼べない。
constなメンバ変数を持つconstでないオブジェクトはconstでないメソッドも呼べる。

922 :デフォルトの名無しさん:2010/03/17(水) 22:27:36
>>920
変数がconstだとその変数の値は変えられません。
メンバ関数がconstだとそのメンバ関数ではインスタンスの状態を変えられません。

923 :デフォルトの名無しさん:2010/03/17(水) 22:39:14
constは変わらないではなく変えられないというのが微妙なポイントだね。

924 :デフォルトの名無しさん:2010/03/17(水) 22:47:28
>>918
map< pair<int, int> >でいいよ

925 :デフォルトの名無しさん:2010/03/17(水) 23:14:05
>>918
こうすると値と空白を区別できる配列が作れる。
#include <boost/optional.hpp>
#include <iostream>

void func(const boost::optional<int>& Val)
{
if(Val)
std::cout<<"Value="<<*Val<<std::endl;
else
std::cout<<"space"<<std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
boost::optional<int> a[100][100];

a[10][10]=333;

func(a[10][10]); // 333が出力される。
func(a[11][12]); // 値が設定されていないのでspaceが出力される。

return 0;
}


926 :デフォルトの名無しさん:2010/03/17(水) 23:15:59
>>925 補足
もちろん0でも
a[10][10]=0;
とすればもちろんvalue=0と表示されて空白と区別できるよ。

927 :デフォルトの名無しさん:2010/03/18(木) 05:09:26
テキストファイルを処理するプログラムを書いていたのですが
わからないことがあったので教えてください。

一つのクラスの中で、ifstreamでファイルを読み込み、処理してから
コンソールに結果を表示するまでを行っているのですが、
クラスの宣言の時に、ifstreamの宣言をpublicにすると
クラスが終わらなくなりました。
ifstreamはpublicにしてたのは単なるミスで、全然privateでいいのですが
なぜ終わらなくなったのかが理解できません。教えてください。

クラスが終わらなくなったっていうのは
int myclass(){
//ここでクラスを呼ぶ
return 0;
}

int main(){
myclass();
cout << "main end";
return 0;
}
とすると、処理は終わって結果が表示された後、
main endが表示されずにプログラムが終わらない状態です。
処理中のメンバ関数はすべて動いていました。
ifstreamはちゃんとデストラクタでcloseしてます。

928 :デフォルトの名無しさん:2010/03/18(木) 06:50:35
アクセス指定を変えただけで挙動まで変わるなんて、普通はありえん。
publicは関係なくて、メンバ変数の宣言順が変わったせいじゃないのか?
ていうか「ifstreamの宣言をpublicにする」てどういう意味だ?

929 :デフォルトの名無しさん:2010/03/18(木) 09:56:54
「クラスが終わらない」って、結構斬新な表現

930 :デフォルトの名無しさん:2010/03/18(木) 09:57:22
クラスが終わらなくなりましたってなんじゃい!


931 :デフォルトの名無しさん:2010/03/18(木) 09:58:15
>>927
おい、ここはC/C++のスレだぞ?
どこの言語の話をなさっているのですか?

932 :デフォルトの名無しさん:2010/03/18(木) 10:14:12
問題児がいて終わりの会が長引くんですね。分かります。

933 :デフォルトの名無しさん:2010/03/18(木) 10:24:49
>>927
の人気にshit・・・もとい嫉妬

934 :デフォルトの名無しさん:2010/03/18(木) 12:19:11
>>927
ifstreamがありませんっ!!

935 :デフォルトの名無しさん:2010/03/18(木) 12:57:55
>>933
fack u

936 :デフォルトの名無しさん:2010/03/18(木) 14:54:44
日本語をしっかり

937 :デフォルトの名無しさん:2010/03/18(木) 17:58:30
>>927のコードは問題なさそうだ。ただの勘違いだろう。
クラスの定義もクラスを呼ぶ(?)処理も省略されているが、
>>927が絶対の自信を以って省略しているのだから問題ないはずだ。

938 :デフォルトの名無しさん:2010/03/18(木) 18:08:52
たしかに。

939 :デフォルトの名無しさん:2010/03/18(木) 19:11:35
たかしに。

940 :デフォルトの名無しさん:2010/03/18(木) 19:26:15
たにしか。

941 :デフォルトの名無しさん:2010/03/18(木) 19:31:03
隆史に。

942 :デフォルトの名無しさん:2010/03/18(木) 19:31:52
仕方にーやつらだ

943 :デフォルトの名無しさん:2010/03/18(木) 19:36:49
>>942
fuck u

944 :デフォルトの名無しさん:2010/03/18(木) 19:37:45
フックう?

945 :デフォルトの名無しさん:2010/03/19(金) 01:09:06
CでSTL相当の機能を使えるようにするフリーのライブラリはありませんか?

946 :デフォルトの名無しさん:2010/03/19(金) 01:13:51
CSTL

947 :デフォルトの名無しさん:2010/03/19(金) 01:22:30
thx

948 :デフォルトの名無しさん:2010/03/19(金) 19:58:36
.c -----------
char *p;
char *r1;

p=tion(URL);
r1=p;
MessageBox(hWnd,r1,p,MB_OK);
.h -----------
char *tion(char U[]){

char a[20]="D:\\Temp";
return a;
}
表示がp1、r1共に 0・になります。charの戻り値をMessageboxに表示させる方法を教えてください。
代用でグローバルアドレスにCharを入れて、戻り値はint等にする方法もあるらしいのですが、
戻り値Charの方が一般的ですよね?

949 :デフォルトの名無しさん:2010/03/19(金) 20:05:28
>>948
char a[20]="aaaa";はポインタのコピーではなく、スタック上の配列の初期化になる。この配列は関数から返るときに無くなる。
const char* a="aaa";とすると、グローバル上のリテラルのポインタが得られる。



950 :948:2010/03/19(金) 20:57:38
>>949
関数を終了したときに変数はスタックから消えてしまうのですね
static char a[20]="aaaa";
char* a="aaa";
できました、ありがとうございます。



951 :デフォルトの名無しさん:2010/03/19(金) 20:57:48
>>948
char* a = "abc" はコードのどっかに存在する "abc" リテラルへのアドレスを示すから戻り値は有効
ただし、戻り値に書き込みを行なうと例外を生じるから
const char* tion( char* U )
{
  char* a = "abc";
  return a;
}
とすべき、tion() 内に静的領域を配置して変更可能なトリッキーなコードを書きたいなら
char* tion( char* U )
{
  static char a[20] = "abc";
  return a;
}
この場合、a はヒープ上の領域だから 20Byte までなら書き込んでも良い、まぁこんな用途は普通無いけど

952 :948:2010/03/19(金) 21:23:25
>>951
950の10秒後に理解不足を補足した内容まで教えて頂けるとは感激しました。
ありがとうございます!


953 :951:2010/03/20(土) 00:05:10
>>952
10秒後にレスできると思うか?タイミングは偶然だ


954 :デフォルトの名無しさん:2010/03/20(土) 00:05:37
>>953
最近のエスパーをなめるなよ

955 :デフォルトの名無しさん:2010/03/20(土) 00:20:55
>>954
お前はエスパーなのか?羨ましいぞ


競馬で稼げるんだろうな...

956 :954:2010/03/20(土) 00:29:11
>>955
そしたらC/C++言語なんて、いやコーダなんてやめちまってもいいんだろうな。。。


957 :デフォルトの名無しさん:2010/03/20(土) 00:34:47
func(int x1, int y1, 〜);

って感じで同じ型の引数がもりもり続くんだけど、型を省略する文法とかないの?

958 :デフォルトの名無しさん:2010/03/20(土) 00:37:32
func(int x1, ...);

959 :デフォルトの名無しさん:2010/03/20(土) 00:39:01
そんなとこで省略したくなるとかwww

960 :デフォルトの名無しさん:2010/03/20(土) 00:39:13
>>957
関数のプロトタイプ宣言なら、Cならint func();でOK。

961 :デフォルトの名無しさん:2010/03/20(土) 00:40:58
構造体にまとめろよ

962 :デフォルトの名無しさん:2010/03/20(土) 00:42:23
同じ型で固定長なら配列でいいだろ。

func(int x[500]);

963 :デフォルトの名無しさん:2010/03/20(土) 00:44:12
>>957
関数を先書いてそれをコピペして ; 付けろよ
俺はいつもそうしてる

964 :デフォルトの名無しさん:2010/03/20(土) 00:50:10
そういえば、K&R時代は省略できたな
foo(x, y, z, s, t, u, p, q, r, たくさん)
int x, y, z, s, t, u, p, q, r, たくさん;
{
 /* something */
 return expression;
}
みたいに

965 :デフォルトの名無しさん:2010/03/20(土) 01:25:08
>>964
その例なら、
foo(x, y, z, s, t, u, p, q, r, たくさん)
{
 /* something */
 return expression;
}
でOKだ。

966 :デフォルトの名無しさん:2010/03/20(土) 13:57:31
STLで質問なんですが
今までずっと
map<int,int> v;
if(v.count(3)==0){v.insert(make_pair(3,3));}
みたいにやってたんですが

if(!v[3]){v[3]=3;}
cout << v[3] << endl;
こんなのでも動きます
これって問題ないんですかね?
なんかすごい冗長な書き方をしてきたのかもしれない

967 :デフォルトの名無しさん:2010/03/20(土) 14:05:37
普通findじゃねぇの
countなんてmultimapしか使わないと思ってた

968 :デフォルトの名無しさん:2010/03/20(土) 14:05:41
v[3]に要素が無かった状態で
if (!v[3]) が実行されると
v[3] = int();
と同様の処理が起こり、vの要素数が増えるわけだが
それで良いなら。

969 :デフォルトの名無しさん:2010/03/20(土) 14:15:32
>>967
なるほど
自分はsetでもcountを多用しますが
findのほうが王道なんですかね

>>968
わかりやすい解説ありがとうございます
すぐに代入するつもりなのでそこは問題ないです。
ただ、若干速度は落ちるかもしれないってことですね

970 :デフォルトの名無しさん:2010/03/20(土) 14:19:41
速度というよりチェックするつもりの処理で要素増えちゃうけどいいの?

971 :デフォルトの名無しさん:2010/03/20(土) 14:33:20
map<int,int> v;
cout << v.size() << endl;
if(!v[3]){cout << "none" << endl;}else{cout << "some" << endl;}
cout << v.size() << endl;
if(!v[3]){cout << "none" << endl;}else{cout << "some" << endl;}
cout << v.size() << endl;
試してみたけど、やっぱりだめかもしれない
これはなんたる副作用
気をつけます

972 :デフォルトの名無しさん:2010/03/20(土) 15:21:25
mapなのにv

973 :デフォルトの名無しさん:2010/03/20(土) 16:55:53
末尾への追加 > シーケンシャルアクセス > 探索 > コンテナ内の要素の交換 > 削除 > 挿入
この順番の頻度で操作が行われる場合に最も適したSTLのコンテナはvectorでしょうか?
mapで要素の追加順にアクセス出来ればそっちの方がいいような気もしますが、出来ますか?

974 :デフォルトの名無しさん:2010/03/20(土) 17:01:05
>>973
探索と順序が両方欲しい欲張りなあなたには、boost::multi_indexを紹介しよう。


975 :デフォルトの名無しさん:2010/03/20(土) 17:02:47
STLのコンテナ

976 :デフォルトの名無しさん:2010/03/20(土) 17:37:02
>>973
とりあえずvectorで作れ。
setなりmapなりに切り替えるのは、実際にボトルネックが発生してからでいい。
あとmapは追加順を覚えないから、必要ならmapとvectorを併用するとかで対応。
それかboost入れて>>974

977 :デフォルトの名無しさん:2010/03/21(日) 17:45:28
Linuxで使えるおすすめのC++のIDEありますか?

978 :デフォルトの名無しさん:2010/03/21(日) 17:56:13
qt creator

979 :デフォルトの名無しさん:2010/03/21(日) 18:14:59
Qt Creator いいね、何気に。


980 :デフォルトの名無しさん:2010/03/21(日) 18:31:09
あれはQtアプリを作るためだろ
>>977が聞いてるのは「C++の」IDEだ

981 :デフォルトの名無しさん:2010/03/21(日) 18:32:47
eclipseでいいんじゃね

982 :デフォルトの名無しさん:2010/03/21(日) 18:45:45
>>980
いや、案外C++のIDEとしてもそんなに悪くは
ないんですぜ。Qt Creator

俺はEclipse派だけどな!


ttp://blog.hiroaki.jp/2004/12/000199.html
ここでも同じ様な事考えている人がいる。

983 :デフォルトの名無しさん:2010/03/21(日) 20:15:31
>>981
eclipseってintelC++とかデバッガとか使える?あ、windowsで。

984 :デフォルトの名無しさん:2010/03/21(日) 21:54:12
そもそもVtuneがEclipseベースの気がする。

985 :デフォルトの名無しさん:2010/03/21(日) 21:55:00
>>977
Visual C++ Express Edition 2008

986 :デフォルトの名無しさん:2010/03/22(月) 04:39:01
WindowsでCPU名を取得する方法を教えてくれろ

987 :デフォルトの名無しさん:2010/03/22(月) 04:53:28
Cのfizzbuzzって、結局何バイトが最短だったの?

988 :デフォルトの名無しさん:2010/03/22(月) 12:41:40
4dmに73バイトのがのってる

989 :デフォルトの名無しさん:2010/03/22(月) 12:55:24
73バイトか・・・自分のより10バイト以上短いのか・・・

990 :973:2010/03/22(月) 15:18:31
悩みに悩んで今更EffectiveSTLを買ってみた。
もっと早くに買っておけば良かったと後悔しきり、、、

991 :デフォルトの名無しさん:2010/03/22(月) 18:42:51
他の人が作ったdllで圧縮や解凍をさせていただいているんですが
そのソフト配布する場合気をつけなければいけないことはありますか?
このdllは〇〇に著作権があります
と書くだけで配布できるんでしょうか?
一応フリーウェアとは書いてあるんですけど

992 :デフォルトの名無しさん:2010/03/22(月) 18:49:20
ライセンス嫁

993 :デフォルトの名無しさん:2010/03/22(月) 18:50:48
英語なんでわかりません

994 :デフォルトの名無しさん:2010/03/22(月) 21:05:52
>>993
一般論でどうこう言える問題じゃないんで、自分で読んで
判断できなかったら使わない方が無難。

995 :デフォルトの名無しさん:2010/03/22(月) 21:10:01
>>991
なんてライセンス?

996 :デフォルトの名無しさん:2010/03/22(月) 21:42:52
boostのshared_ptrが入ったクラスを作るとします。
class TestClass{
private:
boost::shared_ptr<int> hoge;
};

これで
void main(){
TestClass a;
TestClass b = a;

とした場合、デフォルトのコピーコンストラクタが呼ばれると思われますが、shared_ptrはどのようにコピーされるのでしょうか?
初心者の質問ですみません。

997 :991:2010/03/22(月) 21:48:51
そうかー一概に言えることじゃないのね
ライセンスとかよくわかりませんが
unrar.dllです。利用するためのサンプルソースもついてて
わかりやすいからこれにしようと思ったんだけど

998 :デフォルトの名無しさん:2010/03/22(月) 22:13:07
>>996
hogeが掴んでいるインスタンスがa.hogeとb.hogeで共有される。hogeの指す実体コピーはされない。

999 :デフォルトの名無しさん:2010/03/22(月) 22:17:25
>>997
> ライセンスとかよくわかりませんが
おいおい・・・。
おどかすようだが、(まあおどかしておくと)
下手打つと訴訟物だぞ。


1000 :デフォルトの名無しさん:2010/03/22(月) 22:25:43
>>991
裁判頑張ってください。応援します。

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

234 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)