スレを勃てるまでもないC/C++の質問はここで 13at TECH
スレを勃てるまでもないC/C++の質問はここで 13 - 暇つぶし2ch50:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/23 13:31:51
int& i = *(int*)NULL; // おk

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

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

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

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

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

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

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

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

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


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

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

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

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

60:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/24 14:55:48
cはスコープの頭じゃないと変数を作れないのさ!

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

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

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

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

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

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

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

>>60
C2360をググれ

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

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

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

69:デフォルトの名無しさん
09/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
09/12/24 17:53:50
環境書くの忘れてました。

SunOS 5.6
Oracle 8.1.6
CCコンパイラ

です。

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

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

72:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/24 20:46:01
>>57
> intは値渡しだね。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

85:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/29 11:56:31
>>85
class Asettings
が何か分からないから答えられぬ。

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

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

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

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


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


91:87
09/12/29 16:17:33
>>88
URLリンク(codepad.org)
こんなんも通ったよ。


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

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


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


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

96:87 ◆Nsutagdmm.
09/12/29 19:03:18
 URLリンク(codepad.org)
ちなみにこのソースはそちらの手元では通る?


97:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/30 10:49:31
変です

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

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

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

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


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

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

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


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

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

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

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

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

C++例外処理プログラミング
URLリンク(www.02.246.ne.jp)
この辺も読んだ方が良いかも。


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

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

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



char *c[5];

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

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

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

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

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


112:107
09/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:デフォルトの名無しさん
09/12/30 15:32:20
無いよ

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

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

116:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/30 16:56:59
だれか絵を描いてうpしてやれ

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


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

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

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


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

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

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

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

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


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

char *b[5];

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

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

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

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

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

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

129:107
09/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:デフォルトの名無しさん
09/12/30 20:47:21
型が違う

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

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

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


132:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/31 11:10:27
classの中で定義するtypedefってなにか呼び方があったような気がするんですが、何か知りませんか?
誘導型?とかそんな感じの

136:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/12/31 15:19:22
5:ポインタの書式指定子は%dじゃなくて%pだ
6:a[1]はアクセス違反。他と同じ場所を指すのはa[0][1]

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

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

多分、配列とポインタを混同してると思うので、C-FAQを読むといいよ
URLリンク(www.kouno.jp)


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

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

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


141:107
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/12/31 19:43:56
そうだね

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

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


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

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

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

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


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


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

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


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

153:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/01/02 20:22:30
>>153
C言語にはnamespaceすらない

んだったきがするが。

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


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

>>155
ぐろ~ばる☆

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

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

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



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


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

161:デフォルトの名無しさん
10/01/03 21:04:33
>>160
URLリンク(public.research.att.com)
このサイトで聞きなさい。


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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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


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


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

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

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

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

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

191:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/01/05 16:31:15
>>191
ECC6.2.1では00000001, 00000001

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

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

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

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


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

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

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


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

200:196
10/01/05 20:50:47
constants.hpp
macros.h

イマイチ

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

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


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

204:196
10/01/05 23:06:38
constants.hpp
macros.h
common.h
global.h
CONSTS.H
foundation.hpp

イマイチ

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

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

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

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

208:デフォルトの名無しさん
10/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
10/01/06 04:17:13
>>208
thx、打開できそうだ

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

224:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/01/11 15:53:29
>>223-224
うん、C99の機能。


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

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

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


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

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

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

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

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

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

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

235:デフォルトの名無しさん
10/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)> { ... }; ②

①と②って明確な違いってありますか?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch