[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 05/09 15:49 / Filesize : 63 KB / Number-of Response : 254
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:56:37 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。 

過去ログ 
スレを勃てるまでもないC/C++の質問はここで 
pc11.2ch.net/test/read.cgi/tech/1167476845/ 
スレを勃てるまでもないC/C++の質問はここで 2 
pc11.2ch.net/test/read.cgi/tech/1178503366/ 
スレを勃てるまでもないC/C++の質問はここで 3 
pc11.2ch.net/test/read.cgi/tech/1187521676/ 
スレを勃てるまでもないC/C++の質問はここで 4 
pc11.2ch.net/test/read.cgi/tech/1221633708/ 
スレを勃てるまでもないC/C++の質問はここで 5 
pc11.2ch.net/test/read.cgi/tech/1230516307/ 
スレを勃てるまでもないC/C++の質問はここで 6 
pc11.2ch.net/test/read.cgi/tech/1231564903/ 
スレを勃てるまでもないC/C++の質問はここで 7 
pc11.2ch.net/test/read.cgi/tech/1232983248/ 
スレを勃てるまでもないC/C++の質問はここで 8 
pc12.2ch.net/test/read.cgi/tech/1235921779/ 
スレを勃てるまでもないC/C++の質問はここで 9 
pc12.2ch.net/test/read.cgi/tech/1240022781/ 
スレを勃てるまでもないC/C++の質問はここで 10 
pc12.2ch.net/test/read.cgi/tech/1242300936/ 
スレを勃てるまでもないC/C++の質問はここで 11 
pc12.2ch.net/test/read.cgi/tech/1245059383/ 
スレを勃てるまでもないC/C++の質問はここで 12
pc12.2ch.net/test/read.cgi/tech/1248010352/


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

50 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:31:51 ]
int& i = *(int*)NULL; // おk

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

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

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

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

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

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

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

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

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


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



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

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

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

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

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

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

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

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

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

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

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

>>60
C2360をググれ

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

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



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

69 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 18:21:37 ]
あー Oracle スレ落ちてんのか。それにしても C/C++ の話じゃねぇな。

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

72 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 20:46:01 ]
>>57
> intは値渡しだね。

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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



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

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


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


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


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

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


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


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

96 名前:87 ◆Nsutagdmm. mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 10:49:31 ]
変です

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

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

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

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


103 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 12:15:07 ]
>>104
あー、まだその辺な訳ね。
ずいぶんと因果な言語を選んだね君(笑)

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

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


106 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:04:54 ]
>>107
newとdeleteは1対1で対応するべきものです
newが無いのにdeleteしていたり、newしているのにdeleteが無いのは、どこか間違っている可能性が高いです

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

111 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:32:20 ]
無いよ

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

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

116 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:23:38 ]
>c = a; // 一応OK

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

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

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

123 名前:111 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:58:15 ]
>>124
前者はcharの*(ポインタ)が5個の配列
後者は、char が5個の配列の*(ポインタ)

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

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



128 名前:111 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 20:47:21 ]
型が違う

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

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

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

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

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


140 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 19:43:56 ]
そうだね

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

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


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

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

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



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


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







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<63KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef