1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
175 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:06:43 ] 後ろ後ろ!
176 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:37:26 ] パーマン乙
177 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:25:19 ] std::basic_fstream<unsigned char> は使っても問題ないでしょうか?
178 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:36:39 ] >>177 見慣れないうえにあんまり意味無いと思うからお勧めはしない。
179 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:31:49 ] char_traits が定義されてないとダメなんじゃないかな。
180 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:13:48 ] std::basic_fstreamがstd::iostreamみたいにC++に規格として盛り込まれているのか、 あるいは処理系に依存するのかをききたいんじゃね
181 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:15:29 ] >>179 なるほど それでは std::char_traits 相当の UcharTraits を定義して std::basic_fstream<unsigned char, UcharTraits> とすると使えるでしょうか?
182 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:16:29 ] 理論上は使えるんじゃないかな? 多分。
183 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:41:47 ] >>180 やりたいことは put( unsigned char ) と write( const unsigned char*, streamsize ) を使ってバイナリデータをファイルに書き込むことです。 このとき1バイトは0から255を表現できないといけないので最低 unsigned char の型が必要です。 型が char の場合、どの処理系でも使える範囲は0から127までなので目的を果たせません。
184 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:54:15 ] >>183 バイナリデータとしてみると算術型は違ってもビットパターンを変更しないキャストは実質的に同じデータを指す。 writeはchar*を引数に取るけど、そのポインタがintであれwchar_tであれエンディアンとサイズが正常であれば問題ない。 つまり任意のデータのポインタをchar*として見ることは、その先にあるデータをビットパターンを変更せずにキャストする事に相当する。
185 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:01:01 ] >>184 キャストとはちょっと違う。 char* はオブジェクトの内部表現となる メモリの読み出し〜書き込みに使えることになっている。これは unsigned char も signed char も同じ。 ってことで、バイナリ出入力したいだけなら普通の fstream で十分。
186 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:15:47 ] ios::binary を指定しておけば fstream で何の問題も無くバイナリの入出力ができる。
187 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:00:02 ] >>185 それは仕様書で言えばどのあたりで分かるでしょうか? JIS X 3010-1993 は6章ぐらいまで目を通したのですが見当たりませんでした。
188 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:23:35 ] エンディアンについても実装がバラバラなのが許容されるのにオブジェクトの内部表現って言及されてるの?
189 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:39:28 ] >>187 185じゃないけど、 ISO/IEC 9899 [6.5.3.4] でどう? sizeof(char)==1の保証 → 単位粒度で扱えることの保証。
190 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:56:05 ] これかな 3.9 Types 2 For any object (other than a base-class subobject) of trivial type T, whether or not the object holds a valid value of type T, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.36) If the content of the array of char or unsigned char is copied back into the object, the object shall subsequently hold its original value. 36)By using, for example, the library functions (17.4.1.2) std::memcpy or std::memmove.
191 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:14:51 ] >>724 ID出る板限定+多少巻き添え有りで良ければ、 NGワードのIDの欄に「O」を加えると消せる。
192 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:17:35 ] もちろん誤爆
193 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:24:40 ] そんなあなたに性器表現
194 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:24:26 ] VBでビルドすると100KBくらいだったプログラムを ほとんど同じ構成(コード)でC++に移植したらサイズが900KBまでふくらみました これって正常ですか? VS2008、C++ 非MFCのアプリケーションです
195 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:28:09 ] ヒント: VBランタイムのサイズ
196 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:32:28 ] デバッグビルドしてるっていうオチでは?
197 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:39:43 ] >>195 C++はランタイムライブラリが大きいということですか? >>196 いえ、リリース用のビルドでそのサイズです 最適化オプションも分かる範囲で変更してみましたが あまり変化なしでした
198 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:43:50 ] >>197 VBはランタイムDLLが別だからその分を考慮しろ。
199 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:44:49 ] VBランタイムのサイズをご存知ないのか www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=7B9BA261-7A9C-43E7-9117-F673077FFB3C >ダウンロード サイズ : 1.0 MB >Visual Basic 6.0 を使用して作成されたあらゆるアプリケーションは、これらのファイルを必要とします。
200 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:48:10 ] >>198-199 >>194 のはVS2008のVBですが それもDLLが別ということですよね?
201 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:48:24 ] 現実にはそれで足りないプログラムが多数。
202 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:50:36 ] >>200 VB 2008のランタイムたる.NET Frameworkは数百MBある。 あと、一応聞いておくが、C++製はCLRフォームアプリケーションじゃないほうだよね?
203 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:52:49 ] >>202 >C++製はCLRフォームアプリケーションじゃないほうだよね? それです
204 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 20:28:33 ] >>190 なかなかいい情報ありがとう。 でもここでいっているコピーって memcpy() や memmove() を想定しているような気がする。 普通に char, unsingned char ポインタ経由で代入した場合も同じことが言えるのかな?
205 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:48:42 ] クリティカルセクションについて質問です。 クリティカルセクション用のクラスを作成しています。 外部からCRITICAL_SECTION構造体を渡さなくても済むように、 staticなメンバ変数としてCRITICAL_SECTIONオブジェクトを作成し、 それに対してInitializeやEnter、Leave、Deleteを行うようにしています。 しかし、ネット上で似たようなコード見つけられていないことから、 本当にこれでスレッドセーフが実現できているのか不安です。 何か問題はありそうでしょうか?
206 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:46:43 ] >>205 それだとお互いに無関係なクリティカルセクション同士でも排他してしまうな。 というか、二重にInitializeとかDeleteとかしてしまうのでアウト。 CRITICAL_SECTION構造体は非staticなメンバ変数にすればよろし。
207 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 23:11:40 ] >>206 なるほど、考えが足らなかったです。 ありがとうございます。
208 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:14:55 ] こういう時って、コンストラクタでInitialize、デストラクタでDeleteするのが いいんだっけ?
209 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:27:16 ] もう1つ、コンストラクタでEnterしてデストラクタでLeaveするクラスも欲しい。 いかにもWinSTLが持っていそうだ。
210 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:37:07 ] boostも持ってるな
211 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:49:00 ] >>204 190 は明らかに char や unsigned char の配列として(ポインタ経由で)読み書きした 場合のことを想定した記述だろ。 ほかには 3.10 p15 にある aliasing rule でも char, unsigned char だけ、 そういう直接アクセスを許すように特別扱いされてたりすることから、任意のオブジェクトに 対する char, unsigned char 経由でのアクセスは規格の意図として想定されているものと 考えられる。 よく見ると signed char はダメみたい。微妙だなー。
212 名前:デフォルトの名無しさん [2008/06/12(木) 12:08:09 ] charがsignedならどうなるの?
213 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:14:00 ] char と signed char と unsigned char はそれぞれ別の型 char が符号付きでも符号無しでも signed char とは関係ない
214 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:33:31 ] VBでは下記のように宣言して 違うクラスからでも sub.関数() が使用出来ていたのですが c++で同じ構成の共通関数を作ろうとしても参照エラーが出てうまくいきません 下記のコードをc++用にした場合 クラス、関数はそれぞれ どのように宣言するのが正しいでしょうか? Public Class main Sub ボタンクリック イベント sub.関数() '違うクラスの共通メソッド呼び出し End Sub End Class Public Class sub Public Shared Sub 関数() End Sub End Class
215 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:43:19 ] >>214 C++のソース貼らないと答えようがない。
216 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:44:18 ] class main { public: void button_click_event(); }; class sub { public: static void kansu(); }; void main::button_click_event() { sub::kansu(); } void sub::kansu() { } たぶんこんな感じ?
217 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:10:00 ] >>215 namespace test {//Namespace public ref class Form1 : public System::Windows::Forms::Form{//Class Form private: System::Void code_Click(System::Object^ sender, System::EventArgs^ e) {//イベント sub::kansu(); //共通関数 呼び出し }//イベント };//Class Form class Sub{//Class Sub public : void kansu(); };//Class Sub void Sub::kansu(){// 共通関数 };//共通関数 }//Namespace こんな感じです、共通関数を違うClassのForm1から呼びだして使いたいのですが 識別子が見つからない等のエラーが出てうまくいきません >>216 そのコードのように修正してみましたが クラス、識別子が見つからないという同じエラーが出てだめでした
218 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:22:02 ] ・void kansu() に static を付ける ・sub::kansu() の呼び出しは sub の定義よりも下で行う ・class Sub と sub::kansu で sub の大文字と小文字が異なる
219 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:25:47 ] あと ・エラーメッセージは一字一句正確に書け
220 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:29:36 ] >>218 うまく動きました、みなさんどうもありがとうございます >・class Sub と sub::kansu で sub の大文字と小文字が異なる コードではちゃんとなっているのですが ここに書くときに記述ミスしていました、申し訳ないです
221 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 18:17:23 ] >>211 3.9 p2 は 「そのオブジェクトを構成するバイトは、char または unsigned char の配列にコピーできる」に対して 「例えば、ライブラリ関数 std::memcpy または std::memmove を使って」という注釈があるけど char 配列の要素ごとの代入でコピーできるなら「std::memcpy や std::memmove も含まれる」のような ニュアンスで注釈を付けるんじゃないかな? それと 3.9 p2 はあるオブジェクトを char 配列にコピーして、その配列から元のオブジェクトにコピー したときにオブジェクトが元の内容に戻ることを保障しているだけで、同型の他のオブジェクトに対しては どうなるか分からないんじゃない? 3.9 p3 では char 配列を通さずに std::memcpy でコピーすればオブジェクトが同じ内容になるようです。 3.10 p15 は未定義ではないだけで結果は処理系定義ということもありえるんじゃない?
222 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 07:57:56 ] >>221 > char 配列の要素ごとの代入でコピーできるなら「std::memcpy や std::memmove も含まれる」のような > ニュアンスで注釈を付けるんじゃないかな? "for example" って書いてあるんだから、そういうことだと思うよ。 1.7, 1.8 より、 POD 型のオブジェクトはメモリ上で連続する バイト列とされている。 3.9.1 p1 により、 char, unsigned char はバイト中のすべての ビットが値に反映されることになっているので、これらの型を介して バイトを正確にコピーできる。 memcpy などの動作は引数の指すメモリ上の位置から連続する バイト列に対する操作として定義されているので、 char* を使って 同様にバイト列をコピーするコードを書けば同じ意味になる。 そのような操作に対する意味が 3.9 p2, 3.9 p3 の範囲で確定する。 これ以外のバイト操作( POD 型のオブジェクトに属さないバイトの 操作や、オブジェクトひとつに満たない部分的な操作)については 意味も動作も規定はない。(不定?)
223 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 08:14:03 ] 違うフォーム上のテキストボックス等のデータを取得するにはどうすればいいですか?
224 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 08:21:14 ] C++にフォームなんて概念ありません
225 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 10:20:30 ] >>223 初心者スレ、もしくはMFC, WTL, C++/CLIなどで該当するスレへ。 開発環境は必ず書くこと。
226 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 11:52:30 ] array<String>型の2次元配列 data[40][40] を作りたいのですが array<String^> ^data = gcnew array<String^> (40)(40); とするとエラーが出ます どうやって宣言したらいいですか?
227 名前:「CLI」で探せ mailto:sage [2008/06/13(金) 12:04:18 ] >>226 そんな気持ちの悪い記法は専用スレへどうぞ。
228 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 12:23:01 ] >>226 CLIはC++じゃないのですれ違い。
229 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 13:51:26 ] >>228 じゃ CLIなC++は何言語なんだよ?w バカかお前ww
230 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 13:55:45 ] C++/CLI
231 名前:デフォルトの名無しさん [2008/06/13(金) 14:00:53 ] A.hで中身まで記述した static void Func() { ・・・ }; を B.cpp、C.cppそれぞれでインクルードすると実体はそれぞれにできるんでしょうか?
232 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:02:42 ] >>229 >227
233 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:03:33 ] >>229 C++/CLIはC++を拡張した別の言語としてEcmaで標準化されてるよ。
234 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:03:59 ] >>231 はい。但し、そのFunc()を例えばB.cppでは使いC.cppでは使わなかったとすると、一つだけになるかもしれません。 # 勿論、どちらでも使わない場合は一つもないかもしれないわけで。
235 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:05:25 ] まぁそれをやるならせめて無名名前空間をつかってほしいところ
236 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:13:59 ] >>234 うわぁぁ。そうなんだ。 staticつければ必ずひとつになると思っていました。ありがとう。 こういう場合ひとつだけにするにはテンプレートにするしかないのかな。 ヘッダに記述すること自体の是非は別として。
237 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:19:46 ] >>236 いや、テンプレートにするかしないかとstaticかどうかは別の問題だから。 つーか、>231の場合でもどうせインライン展開されるから消えてなくなると思うし、 テンプレート関数にしたところでインライン展開されなければ複数できてもおかしくはない。 で、一つにしたい積極的な理由があるの?
238 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:42:06 ] いろいろ言われそうだけどVCのプリコンパイル済みヘッダーの#include <stdafx.h> が嫌だからなんです・・。 いろいろなコンパイラで使えればな〜と思っていたらどうしてもこれが邪魔で。 プリコンパイル済みヘッダーの設定変えればいいのでしょうけど、ファイルをコピー、 includeですぐに使えるような書き方はないかな〜と。
239 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:50:41 ] あ、見当違いなこと書いてたかも。 上記理由でどうせ同じ関数なんだからひとつにしてファイルサイズ減らせないかなと 思っていた次第です。
240 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:52:05 ] >>239 理由がそれだけなら、最適化するとどうせインライン展開されて消えてなくなるから気にするな。
241 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 15:27:25 ] というか、あちこちに同じ中身が生成されるわけだから ファイルサイズは逆に増えるよね。
242 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 15:33:47 ] う〜ん、いろいろありがとう。 とりあえず最適化に任せてみます。
243 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 16:11:17 ] ===foo.h=== #include "bar.h" class foo { (略)// barは出てこない }; ===foo.cxx=== #include "foo.h" (略)// barが出てくる とやるのと、 #include "bar.h" をfoo.cxxの中に持ってくるのは、 どちらにどういうメリットデメリットがあるのでしょうか。 また、一般的にはどちらの書き方が推奨されますか。
244 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 16:13:13 ] CLIって便利だよな 特に他言語で作ったクラスライブラリがそのまま使えるお得感は感動ものだ
245 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 16:17:15 ] >>243 ヒント:依存関係、カプセル化
246 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 17:46:14 ] >>243 後者。素直に使う所に書く、で必要十分。 前者にメリットは無い。fooを使うやつのコンパイルがbar.hの分遅くなるだけ。
247 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 18:14:43 ] 次のプログラムをエラー無くコンパイルしたいのですが、方法を教えてください。 //データの構造体----------- struct dataA { int m_dataA; CLSA * m_next //クラスのポインター }; //使用するクラス------------ class CLSA { dataA m_dat[100]; //データの配列 }; dataAの中にクラスのポインターを持つ。この状態ではCLSAが無いと言われます。 順番を変えるとクラスの中でdataA構造体が無いと言われます。 対処方法が無いでしょうか?
248 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 18:16:41 ] セミコロン抜けてた CLSA * m_next; //クラスのポインター
249 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 18:32:36 ] >>247 struct dataAの上に 「class CLSA;」を書く。 あと、どうでもいいけど何かよく分からないデータ構造だな。 dataA{ CLSA* m_parent; } とか dataA{ dataA* m_next; } とか CLSA{ CLSA* m_next; } なら分かるけど。
250 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:00:26 ] 出来ましたありがとうございます。基本的な内容ですねorz データ構造は root クラスインスタンス | |-ノード1クラスインスタンス | : |-ノード1クラスインスタンス | : |-ノード1クラスインスタンス | : |-ノード1クラスインスタンス のような多段構造のようなもので、ノード分岐の意味をdataAの内部で示しています。 意味自体が単独で作られたり渡されたりするので、1つの構造体にしています。
251 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:08:54 ] >>244 そのままシームレスに使えればだがな。 だが現実は・・・・ ハァー
252 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:04:32 ] >>222 3.9.1 p1 は「バイト中のすべてのビットが値に反映される」とはいっても、ビット列と値が 1 対 1 でないこともあるんじゃないかな。 例えば char が符号付きで符号ビットと絶対値で表現する場合、値 0 を表現するビット列が 2 パターンある。その処理系で char* を通して値 0 を読み、その値を char* を通して書く とビット列が変わる可能性があるんじゃないかな?
253 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:03:39 ] char型のコピーはbit列をそのままコピーすると言っているのでは
254 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 04:05:09 ] >>252 現行の規格で多少無理やり解釈すれば、 -0 と +0 は == で比較すれば 同じになるとしても、区別可能な(異なる value representation を持つ)二つの値 ということでコピーでビット列が変わる可能性は無い、とは言えそう。 ちょっと苦しいんで調べてみたところ、 C との互換性と合わせて見直しが 提案されているみたい。 www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2631.html この中で C99 の規格を基本的にはそのままパクりながら、 C99 では 保証が無いものの、 C++ で半ば慣習的に行われてきた char による object representation のコピーを保証するため、以下のような記述の追加が 見られる。 The types unsigned char and char may be used for “bitwise” copy. [Note: this means that if signed char has a negative zero which is either a trapping value, or will be forced to positive zero on assignment, plain char must be unsigned. ?end note] てきとう訳: 型 unsigned char と char は「ビット的」コピーに使ってもよい。 [注: これは、もし signed char が負のゼロをトラップ値として持つか 代入において正のゼロに強制されるのであれば、ただの char は unsigned でなければならない、ということを意味する。 -注ここまで] 提案とは別に、議論の中では C++ では2の補数を強制してしまうような話も 出ていたらしい。実際のところはそれでもいいのかもしれない。
255 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 13:48:22 ] 以下のような二種類の構造体のフィールドなのですが、 どちらがより適切なのでしょうか? struct A { int length; // textの長さ unsigned char text[0]; // 利用者側で好きに領域を確保して先頭を格納。 }; struct B { int length; unsigned char text[1]; }; 違いはtext[1]とtext[0]だけなのですが、 text[1]としてしまうと、 unsigned char text[] = "aiueo"; A* a = (A*)malloc(sizeof(A) + strlen(text)); としたときに(処理系依存ですが) intで4バイト、unsigned charがパディングされて4バイト さらに文字列の長さで5バイト確保されます。 これだとunsigned charがパディングされた4バイトは無駄な領域の気がします。 text[1]とするメリットはあるのでしょうか?
256 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 14:12:25 ] >>255 宣言より大きい配列のアクセスはお勧めできないと思う。 環境依存なしでそういう構造を作りたいなら struct A { int length; // textの長さ }; A* a = (A*)malloc(sizeof(A) + strlen(text)); で確保して char* buff=(char*)(a+1); で文字列にアクセス 文字列の構造体を作りたいなら以下の方がお勧めかな struct A { int length; // textの長さ unsigned char* text; };
257 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 14:24:31 ] >>255 unsigned char text[0]; はC89では認められていない。 C99から導入されたflexible array memberを使うなら、 unsigned char text[];
258 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 14:58:10 ] >>254 なるほど。 今回初めてC++の仕様書に目を通してみたけど未定義や処理系定義の部分が多くて 正確に解釈するのははなかなか難しいですね。 現状の処理系に合わせて処理系定義の部分を削っていけばかなりシンプルになると 思いますけど。
259 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:18:36 ] >>258 処理系を前提とした入門書を読もう。 処理系未定義はその後で。
260 名前:255 mailto:sage [2008/06/14(土) 19:20:57 ] >>256 さんどうもありがとうございます。 struct A{ int a; unsigned char c[0]; }; gcc -c -pedantic test.c としたら警告が出ました。 警告: ISO C forbids zero-size array 'b' gccの独自拡張で可能になっているけれどC89自体では禁止されている ということですね。
261 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:30:10 ] おい、お前ら、googleでソースコードの検索ができることを知ってましたか? www.google.co.jp/codesearch
262 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:31:46 ] お前が今まで知らなかったことに驚愕。
263 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:32:49 ] どういうときにつかうん
264 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:34:41 ] codeをsearchする時
265 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:54:24 ] >>261-264 自演乙
266 名前:デフォルトの名無しさん [2008/06/14(土) 20:56:31 ] >>265 自演じゃねーよ、タコが
267 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:58:47 ] >>266 イカですけど何か?
268 名前:デフォルトの名無しさん [2008/06/14(土) 20:59:26 ] >>267 創価、すまんかった
269 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:11:26 ] # include<iostream> using namespace std; void func(int a = 0,long int b = 1000, double c = 2.9751) { cout<<"This is func[i].\n"; cout<<"a="<<a<<", b="<<b<<", c="<<c<<"\n\n"; } void func(int a,double b =3.4152) { cout<<"This is func[ii].\n"; cout<<"a="<<a<<", b="<<b<<"\n\n"; } void func(long int a) { cout<<"This is func[iii].\n"; cout<<"a="<<a<<"\n\n"; } int main(void) { func(0,1000,2.9751); func(0,3.14152); func(0); return 0; } オーバーロード関数が呼び出せませんと言うエラーが出るのですが、 何処が間違えているかわかりませんか? 未熟な私に教えていただけたらありがたいです。
270 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:16:36 ] そんな かわいそうな つかいかたを するな
271 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:22:17 ] >>269 どれを呼んでいいのかワカンネ。とコンパイラ様は仰っておられる
272 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:23:24 ] >>269 とりあえず、2個目と3個目のfuncを関数ごと コメントアウトして実行してみ。
273 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 02:27:52 ] もう引数全部意図する型にキャストしちゃえよ
274 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 02:40:25 ] 既定引数と多重定義は「まぜるな危険」だろ。 危険といっても、だいたいコンパイルエラーか警告だけど。 必要なら既定引数を使わないで多重定義をがんばることもやる。 といってもこういうのはありにしているが。 void f(int x); void f(double x); void f(int x, int y, int z = 0); //実引数1個なら多重定義の解決の候補に既定引数は関係しない。 //実引数2個ならデフォルト引数を使うがfの候補は1つに決まっているので良し。
275 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:02:24 ] fcloseの定義はどこにあるのでしょうか? glibc-2.7のソースの中には無いようなのですが…