C++の入門者向け解説スレです。 C言語はあってC++が無いのは寂しいので作成
2げと
3 :
デフォルトの名無しさん :2006/10/15(日) 17:00:43
上げ
相談室と初心者スレで十分だなぁ。
6 :
デフォルトの名無しさん :2006/10/22(日) 21:15:58
あげあげ
ファイルの内容全部を バイナリ入力する 場合は、どう書けば良いですか? char型の配列に入れてしまいたいです。
バイナリモードで開いた上で、istreambuf_iterator
実行効率という観点からは多分無駄はあると思うが・・・ ポータブルだし簡素ではあるけど。
C++初心者です。 C言語の知識で波形解析プログラムのソースを作りました。 このままではコマンドプロンプトでしか起動できないので、 今度はオブジェクト指向にならってGUIを実装させ、アプリケーション と言えるような代物にしたいと思ってます。 しかし、ソースが巨大でこれからどうすればいいか途方にくれてます。 いろいろ参考書を見てオブジェクト指向やUMLを勉強していますが 扱い方がいまいちわかりません。 アプリ開発の一連の流れを具体的に解説してくれるような書籍なんて ないでしょうか?
>>11 統合開発環境を選んで、そのマニュアルやチュートリアルを読むといいよ。
あと、オブジェクト指向と GUI とは、親和性は高いのは確かだけど、直接は関係ないよ。
Windowsプログラミング本の定石 > Win32APIを使うなら > Visual C++(1)はじめてのWindowsプログラミング 翔泳社 > ↓ > Windows 2000プログラミング標準講座 翔泳社 > ↓ > プログラミングWindows 第5版(上)(下) アスキー > > MFCを使うなら > Visual C++(1)はじめてのWindowsプログラミング 翔泳社 > ↓ > Visual C++(2)はじめてのオブジェクト指向プログラミング 翔泳社 > ↓ > Visual C++(3)はじめてのMFCプログラミング 翔泳社 > ↓ > 標準講座MFC6.0 翔泳社 > ↓ > MFCによるWindowsプログラミング アスキー > ↓ > プログラミング Microsoft Visual C++ .NET Vol.1 基礎編、Vol.2 活用編 日経BPソフトプレス > (MFCによるWindowsプログラミングがあればVol.2だけでもよい) > ↓ > MFCインターナル アジソンウェスレイパブリッシャーズジャパン > > スレッド関係 > Advanced Windows 改訂第4版 アスキー > > サーバー関係 > プログラミング Microsoft Windows 2000 日経BPソフトプレス
SDLを使うと楽だよ。
>9 vector使ってよければ、これだけで済む。ややごちゃごちゃした印象は拭えないが。 std::ifstream inputFile("infile", std::ios_base::binary); std::vector data(std::istreambuf_iterator<char>(inputFile.rdbuf()), std::istreambuf_iterator<char>()); >11 オブジェクト指向とGUIに直接の関係性は何もない。 ただ相性が良いからGUIプログラムにオブジェクト指向が良く使われているだけ。 お前に必要なのはおそらくGUIプログラミング。 WindowsならWindowsプログラミングとかを謳っているような本を選べ。
Turbo C++ なんてどうだ? 楽にGUIを組めるよ。
>>12-16 ありがとうございます。
GUIって聞くとオブジェクト指向って観念を持っていました。
僕は学生なのですが、学校のPCにはVisualC++6.0が入っているので
これを使っていきたいです。
13さんのあげてくださったプログラミング本を参考にさせていただきます。
>>15 すみません、vectorについて教えてください。
VB辺りでGUIだけ作って、現行コマンドライン版アプリを起動すればいいような気がする。
>> 10
了解しました。
>>9 で挙げたサイトの例では最後に
while( !iter.equal(end_of_stream_iterator) )
// operator++とoperator*の両方を使用する
cout << *iter++;
という記述があり、そこで全てのストリームを標準出力
しているのだと思いますが、標準出力ではなく、
charに入れておきたい場合、どうすれば良いですか?
(Cの基礎みたいな話になってしまってすいません。)
初めにファイルサイズが分かれば charをその分配列で
確保してから
int i = 0;
while( !iter.equal(end_of_stream_iterator) )
char[i] << *iter++;
と書けば良いのでしょうか?
だとすれば、スマートにファイルサイズを得る方法は
あるのでしょうか?それともループ回数をカウントして
サイズを調べるのでしょうか?
>>20 大きさを知りたいだけなら、ファイルの終わりまでシークしてtellpを呼べばいい。
中身を読み込むために大きさを知りたいのなら、>15。そもそも大きさを知る必要がない。
std::vectorは単なる動的配列で、その使い方は大したことない。
22 :
デフォルトの名無しさん :2006/10/24(火) 20:44:11
ずっとVB6.0でゲームを作っていたのですが、そろそろC++に移行したいと考えてます。 ただ、VC++6.0が中古なんかで安く売ってますが…… やはり、最新のVC++2005の方が初心者としても扱いやすいのでしょうか? C++2005 Suiteなんかもありますが……どれがもっとも扱いやすいのでしょうか? VB5.0とVB6.0でも、使ってみると結構あちこち違いがありましたので、 C++でもそういったことがあるのではないかと……。 プログラミング以前の問題ですみませんが、よろしければ教えてください。
C++自体は、ISOが標準を定めており、それは1998年に制定されてからほとんど変わっていない。 VC++は版を重ねる度にその標準へ準拠している度合いが高まっている。 もちろん最近のVC++は、.NETへ対応できるようになっているが、 VB-VB .NETの断絶とは違い、標準C++のソースはそのままコンパイルできるようになっている。
>>22 Expressがタダなんだからまずそれを試せばいい
MFCがないが、ゲームなら要らないだろう
#include <iostream> using namespace std; int main() { int num; int* pT; cout << "何人のテストの点数を入力しますか?\n"; cin >> num; pT = new int[num]; cout << "人数分の点数を入力してください。\n"; for(int i=0; i<num; i++){ cin >> pT[i]; } for(int j=0; j<num; j++){ cout << j+1 << "番目の人の点数は" << pT[j] << "です。\n"; } delete[] pT; return 0; } このコードでポインタpTがcin >> pT[i];のところで点数を記憶してますが、 ポインタを配列名に使えるのでしょうか?ポインタはアドレスを格納する変数なのに整数値を記憶できるのでしょうか?
ポインタに対して、*の間接参照演算子ではなく、 配列のように[]の添え字演算子を利用することができる。 ポインタの場合、p[i]は*(p + i)と同じ。
>>21 、15
すいません、15さんのアドバイスにに気が付きませんでした。
ありがとうございました。
しかしvectorの使い方と言えば、
vector<chara> vChar
vChar.push('a');
というように、テンプレートとして<>を書いて使うものしか知りません。
実際、例の2行目の
std::vector data(std::istreambuf_iterator<char>(inputFile.rdbuf()), std::istreambuf_iterator<char>());
をコンパイルすると
「クラステンプレートを利用するにはテンプレート引数リストが必要です」
というエラーが出るのでてしまうのですが、どうすれば良いのでしょうか?
std::vector<char>の間違いだろうな。
std::vector<string>を使おう
32 :
デフォルトの名無しさん :2006/10/25(水) 03:09:15
class ClassA{ public: ClassA(){・・・・;} friend ClassA operator●(const ClassA& x, const ClassA& y) { ・・・・; } } class ClassB{ public: operator ClassA(){return ・・・・;} } で引数x,yにClassB型の値が代入された場合、x,yはClassAのコンストラクタによってClassA型に 変換されるのでしょうか? それともClassBの変換関数によってClassA型に変換されるのでしょうか?
>>32 ClassA のコンストラクタは引数なしのものしか宣言されていないので
ClassB → ClassA の変換はできない。というわけで、おそらく
変換関数の戻り値によって初期化される。
>>33 早々の回答ありがとうございます。
つまり、(デフォルト)コンストラクタについてはオブジェクトを新たに作成したり[ClassA x]、意図的に
使わない限り[ClassA* x=new ClassA()]呼び出されることはない・暗黙に呼び出される場面はないと考え
ればよいのでしょうか?
35 :
32 :2006/10/25(水) 04:29:04
>>33 失礼しました。回答の内容取り違えてました。
ClassA のコンストラクタは引数なしのものしか宣言されていない
=ClassA内に「ClassA(ClassB c){・・・・;}」というコンストラクタが存在しない
という意味ですよね。申し訳ありません。ちなみに、このコンストラクタが
ClassA内に存在した場合も結果は同じになるのでしょうか? 連続質問で誠に
恐縮です・・・。
36 :
22 :2006/10/25(水) 08:36:25
>>23 え? VC++とVC++.NETというのは、別のものだったのですか?
VC++.NET 2003の時期バージョンが、VC++2005だと思ってました……。
>>24 Expressは、MFCがないだけの違いだったのですか。
確かに、それならまずはExpressから試してみようかと思います。
ただ、C++ Builderというのが、VBと同じRADで、VC++よりコンパイラが
速いと聞いており、とっつきやすいかなとも思っているのですが……
やはり一般的なのはVC++なのでしょうか?
C++では、ゲームはDirectXをメインに使っていこうと思っているので、
RADはあまり必要ないかとは思うのですが……。
>VC++よりコンパイラが速い 幻想にして幻覚。 コードの内容にも寄るが、最適化性能でVCの右に出るコンパイラはまずない。 最適化を最大の売りにしてるICCですらほとんど勝てない有様。 コンパイル速度のことを言ってるならそうかもしれないが、それほど膨大なコードを書くわけでもあるまい。
38 :
22 :2006/10/25(水) 13:37:50
>>37 すみません、確かにコンパイル速度のことです。
ゲームプログラミングの本で、C++ Builderのコンパイラが付属していたりしたので、
VC++と比べてどちらがよいか迷っていたのです。
雑誌やネット記事には、長所ばかりが書いてあって、具体的な問題点などが書いてないので、
どうにもどれもこれもがよいように見えてしまって……。
ですが、やはりここは一般的なVC++の2005Expressから入って、じっくり勉強してゆこうと思います。
ありがとうございました。
>>36 > VC++.NET 2003の時期バージョンが、VC++2005
これは間違っていないが、VC++ 2005も.NETプログラミングに対応している。
VB 2005も.NETと付いていないものの、プログラミング言語としてはVB .NETであることと同じ。
40 :
22 :2006/10/25(水) 18:51:35
>>39 話がのびてしまうのですが、たとえばネット対戦のゲームを作成しようとした場合は、
.NETの、.NET Frameworkを利用したほうが作りやすいものなのでしょうか?
.NET Frameworkで作ったソフトは、配布する際、その環境に、.NET Frameworkが
インストールされている必要があるとかで、ゲームにはあまり利用されていないようですが、
今後はゲーム制作にも多く利用されていくようになるのでしょうか?
それとも、やはり現在一般的なVC++&DirectXの環境が最適なのでしょうか?
どうにも、.NETの利便性がいまだによく掴めないままでいるのです。
今後は何もかもが.NETの時代だと、あちこちでは言われているようなのですが……。
よろしければこの点についても教えてください。
41 :
25 :2006/10/25(水) 19:11:42
>>26 お礼遅くなりました。ありがとうございます
つまり配列名がポインタ名だった場合、それは*(p+i)を意味するということでよろしいのでしょうか?
>>37 Borland のほうがコンパイルが速いってのはガチ。
>それほど膨大なコードを書くわけでもあるまい。
コンパイルに 1 秒かかるのと 5 秒かかるってのでは差はデカイぞ。
コンパイル速度に差がありすぎるから、俺はコンパイラ非依存なコードを書くとき
開発中は主に Borland を使う。もちろんリリース版のコンパイルには VC++ を使うが。
Boostの一番おいしいところが使えないBCCはカス
>>41 そういうこと。
実は、式の中で配列は原則その先頭要素を指すポインタに変換される規則があり、
逆に配列に対しての添え字演算子を使った場合も、その式は成り立つ。
45 :
デフォルトの名無しさん :2006/10/26(木) 02:15:34
C++板盛り上がれ〜♪
>>42 1秒と5秒の差が問題になるほどコンパイルするのか?
普通は入力やデバッグに対して充分無視できる程度しかコンパイルしないと思うのだが。
>>46 感覚の問題だから実際にやってみてもらわんとわからんと思う。
Windows のデスクトップを右クリックした時にポップアップメニューがでるまでに
ちょっとでも待たされたら嫌だろ? それと同じような感じ。
そもそも最適化なしでコンパイルして、5倍も速度差がつくのだろうか。 まさか、最適化しつつ遅いなんて無意味なことを言うわけもないとは思うのだけどね。
49 :
デフォルトの名無しさん :2006/10/26(木) 02:46:13
コンパイル時間の話題はもういいよ。
50 :
デフォルトの名無しさん :2006/10/26(木) 03:14:12
>>25 おぬし、拙者と同じ棒用派だな?(笑)
俺もその本にはとても世話になったよ。
51 :
デフォルトの名無しさん :2006/10/30(月) 19:54:50
俺に聞け〜
52 :
デフォルトの名無しさん :2006/11/20(月) 04:34:06
for(;; p_turn = !p_turn){ とはどう言う意味でしょうか? あと for(;;)と言うのも参考書に載っていますが 意味がわかりませんので これら二つの、ご助言を宜しくお願い致します。
>>52 do while (p_turn = !p_turn); と同じ。
それから
for(;;)は while (1) と同じ
マルチかよ死ねカス
56 :
デフォルトの名無しさん :2006/11/20(月) 13:09:21
>>53 有難うございました。
>>54-55 それを書いたの私ではありません、私以外の誰かがしたことです。
それを、"マルチかよ死ねカス" なんて酷い
>>56 そう思うんならそこ行って「これは私ではありません」と書いてこいや
58 :
デフォルトの名無しさん :2006/11/20(月) 19:12:30
>>53 違くね?
for (初期化式; 継続条件式; 再初期化式)じゃねーの?
for(;; p_turn = !p_turn)
これだと初期化なし、条件式なしで再初期化時に p_turn の否定を p_turnに入れてるだけじゃねーの
p_turn = !p_turn は比較演算じゃない、否定を代入してるだけ
つまり
while (1){
p_turn = !p_turn;
・・・・
・・・・
}
だろ
59 :
58 :2006/11/20(月) 19:13:35
違った while (1){ ・・・・ ・・・・ p_turn = !p_turn; } こっちだな
60 :
デフォルトの名無しさん :2006/11/20(月) 20:33:46
神様教えて 継承したクラスで、 class A{ private: int data; public: int DataCal(){ return data*2; } int getData(){ return DataCal(); } ・・・ } みたいのがあるときに、継承クラスでDataCalをオーバーライドしたとすると class B :public A{ public: int DataMod(){ return data*3; } ・・・ } このときってgetDataもオーバーライドしないといけない??
61 :
デフォルトの名無しさん :2006/11/20(月) 20:40:05
DataCalをオーバーライドしているようには見えないな。 ぶっちゃけvirtualつけろって話。
63 :
デフォルトの名無しさん :2006/11/20(月) 20:46:22
あ、みすった_| ̄|○ class A{ private: int data; public: int DataCal(){ return data*2; } int getData(){ return DataCal(); } ・・・ } class B :public A{ public: int DataCal(){ return data*3; } ・・・ } です。 >61 getData()はオーバーライドしなくても、 class BでオーバーライドされたDataCal()が使われる?
これはひどい オーバーライドではなくて隠蔽だろう
65 :
61 :2006/11/20(月) 20:49:00
getData() は virtual 宣言したほうがいい A *a; B b; a = &b; a->getData() は クラスAのgetData()が呼ばれる
67 :
デフォルトの名無しさん :2006/11/20(月) 20:58:20
まぁ、とにかく virtual調べてきます_| ̄|○
68 :
61 :2006/11/20(月) 21:06:37
ぶりぶり
つまり、こうだな。 do {...; } while (p_turn = !p_turn, 1);
>>63 俺もまだ未熟だから詳しいことはいえないんであれだが・・・
オーバーロードとか意味間違えてるんじゃないのか?
たぶんおまいさんがやりたいことを実行するなら、
DataCalを仮想化しないとだめだろ。
継承、オーバーロード、仮想化っていうのをいまいち理解してないと思うんだが。
71 :
デフォルトの名無しさん :2006/11/20(月) 22:53:15
追加
>>61 getDataを仮想化する理由が意味不明。
むしろこのクラス設計なら絶対仮想化しちゃいけない。
>>71 それはなに?
#c99ならtrueだろ、ってのは判らんでもないが。
あー
>>61 すまねええ。俺が間違ってたorz
よく見たらめちゃくちゃやってるな・・・
>>63 よ・・・
getDataとか関数に名前与えてるのに中身に余計な関数書くんじゃねえよ。
命名規則ぐらいちゃんとしてこいや。
75 :
デフォルトの名無しさん :2006/11/20(月) 23:34:31
>>74 >>61 だけど
>>65 は勘違い...スマソorz
>>63 んでvirtualにすんのはA::DataCal();
そうしないとA::getData()がよばれるがA::getData()内のDataCal()はA::DataCal()を呼び出す
virtualにすればA::getData()はB::DataCal()を呼び出すようになる
とA::dataはBからアクセスできないんじゃないか?Aのプライベートメンバだし
protectedで宣言しなきゃいかんのでは?
76 :
デフォルトの名無しさん :2006/11/21(火) 01:20:01
初心者には親切にね。
>>75 >>63 の場合作法の段階から間違ってると思うんだよね・・・。
getData()を行うならば、
そいつはプライベートからdataの値を取ってくるだけにするべきなのに、
そうではないし。
スマートに書こうとすればこうなるはず。
classA側の処理
int& getData() { return data; }
classA, classBのDataCal処理
virtual int DataCal() const { 各々の処理; return 返したい値; }
コレならすっきりしてわかりやすいと思うんだけど。
getData側にconst入れ忘れた・・・。訂正。 const int& getData() const { return data; }
const int& なんて戻り値使うのはマトモなアプリ書いた/読んだことのない奴だけ。 荒らしっぽいレスですまんが、老婆心からのコメント。
>>79 戻り値変数でもまったく問題ないけど、
ちょっと今回は思うところもあって、俺は参照でもいいと思うんだけど。
クラスAにはint dataっていう変数を持ってるのは確実、
内部でgetData()*2という計算をDataCal()で持とうとしている。
そんな理由でconst int&にしたんだけど間違ってだろうか?
普通の代入の場合は参照の値のコピーが行われるからint getData();と同じように振舞うしさ。
81 :
80 :2006/11/21(火) 16:31:32
あ、ちなみに今回に限りなのでそこは忘れないでくださいな(;´Д`)
そんな理屈こねくり回すまでもなく、ポインタサイズ以下の基本型をconst参照で返す奴は普通逝け沼。 外にどうしてもアドレス公開したいのなら別だが、そういうコードが求められる状況はかなりぬるぽ。
正直const参照が求められる状況ってのは、 まあ読み込んだ3Dオブジェクトを利用するとかいう大量データを扱う時なんだけどさ(;´Д`) まあ変に屁理屈書いてすまん。
>>82 ポインタサイズ以下の基本型なんてのを意識するのはGenericとはいえんな
そんなのはコンパイラの仕事だ
>>84 Generic な人でもいつかどこかで int くらい使うだろ。
86 :
デフォルトの名無しさん :2006/11/26(日) 19:07:40
C++でmakeは必須?
だが時代遅れ。
C++が?
それもある。
92 :
デフォルトの名無しさん :2006/11/27(月) 06:13:20
処女のように清らかで美しいソースが見たいです あまり実用的でなくてもいいです どこか参考になるところはありませんか?
C++自体が既に非処女言語なので無理
94 :
デフォルトの名無しさん :2006/11/27(月) 13:03:26
最近C++初めました、Cのコードはそこそこ読めて、書けます クラスの概念がよくわかりません 入門書では、車(オブジェクト)に対してハンドル、タイヤetc(メソッド)の関係のように 比喩した解説が多いのですが分かり辛いのですが 要するにCのtypedefやenumのような構造体と同じだと思うのですが そのように理解してもOKですか? 簡単な事を難しく解説して初心者をかく乱している気がするのですが・・・・・
> 簡単な事を難しく解説して初心者をかく乱している気がするのですが そのとおり。
初心者が簡単に理解できるように比喩を使って解説しているわけだが 分析・設計段階の話なので実装のことは考えないほうが吉。 データベースの正規化が自分の感覚としては近いかな。
>>99 >>97 です
>>データベースの正規化が自分の感覚としては近いかな。
あたらずしも遠からずって事で納得しました。
>>98 ×そのとおり
○そのとおり
>>100 ×あたらずしも遠からず
○当たらずとも遠からず
>>97 実装上は、C++のクラス ≡ C++の構造体 ⊃ Cの構造体、
C++の構造体 ≒ Cの構造体+(その構造体に関与する)関数。
継承だとかテンプレートだとかは脇に置いて、取り敢えず
Cで構造体とそれを操作する関数を纏めたものがクラスって認識で医院で内科医?
そのとおりはそのとおりだろ。
そのとおりだね。
>×そのとおり >○そのとおり 吹いた。馬鹿だ。
その通り!!
そ の と お り !!!!
107 :
デフォルトの名無しさん :2006/12/06(水) 22:33:00
オーバーライドされる関数にvirtualを指定したりしますが、なぜですか? 別にvirtualを指定しなくてもオーバーライドできますよね? 教えてください。
仮想関数でぐぐれ
>>107 派生クラスがオーバーライドするんだと言う意思表示だと思えばいい。
基底クラスにvirtualがなかったらただの隠蔽だな
ちょうどサンプルがあった。 #include <iostream> class A { public: void func() { std::cout << "A::func()" << std::endl; }}; class B : public A { public: void func() { std::cout << "B::func()" << std::endl; }}; class C { public: virtual void func() { std::cout << "C::func()" << std::endl; }}; class D : public C { public: void func() { std::cout << "D::func()" << std::endl; }}; int main() { A *a = new B(); a->func(); C *c = new D(); c->func(); return 0; }
virtual付けないとコンパイル時に結合(静的結合)されてしまうので 実際の型に応じた関数を呼び出してくれないという例か
派生クラス側のメンバ関数の宣言にもvirtual を付ける流儀が多いようだがそれはなぜか、 という質問かと思った。
>>115 いや、そういう質問だろう。多いというわけじゃなくて、まちまちなのが気になってるみたい。
>>107 にはオーバーライドされる関数とあるが、それが基底クラスのもの
かどうかは書いてないので、どっちの話題かは確定できないな。
>>117 いや、基底クラスのものだったら(virtual付けないと)オーバーライドできないんだから、
>>107 みたいな質問は出ないでしょ。
よって、派生クラス側のメンバ関数に付けるvirtualのことかな。
C++の関数の引数の質問で、しょぼいんですがお願いします><; int hogehoge[10]; func( hogehoge ); void func( int b[] ){ } と書いた場合、int bは int* b ですか?それとも int* &b ですか?
121 :
デフォルトの名無しさん :2006/12/07(木) 23:24:01
基底クラスかどうかなんてわかるの?
>>119 void func( int b[] ){ }
を
void func( int *b ){ }
か
void func( int *&b ){ }
かって話なら
void func( int *b ){ } これ
124 :
デフォルトの名無しさん :2006/12/08(金) 00:19:45
STLのmapのイテレータは要素数が変化しても無効にならないって本当?
>>124 本当。
map のイテレータが無効になるのは、それが指す要素がコンテナから削除されたときだけ。
>>125 本当だったんだ。
mapがそうならlistやsetも?
>>126 map がそうだからってわけじゃないけど list や set もそう。
129 :
Nw :2006/12/08(金) 00:40:13
Cじゃないんですけど。゚(゚´Д`゚)゚。 BASICで書いて頂けませんか? 10: 20: ってな感じで・・ 1.数A,B,Cを入力してA>BかつB>CならA*B*Cの計算を、A>BかつB≦Cなら A+B+Cの値を、A≦BならA/B+Cの値を求めるプログラム。 2.1+2+3+・・・・+X の合計が初めて200を超える X の値を表示するプログラム。 3.1,3,5,7,9,・・・・, X までの和を求め、和が1000を超えない X の最大値を表示するプログラム。 4.X,Yを入力し、X=1でY=2なら"A"と、X=3でY=4なら"B"と、X=5でY=6なら"C"と表示し、 上記以外の数字の組み合わせを入れたときはプログラムの最初に戻るプログラム。 5.2つの数XとYを入力し、両方マイナスのときは√(X*Y)を、どちらか一方がプラスのときはX*Yを、 両方プラスのときはX/Yのそれぞれの値を表示するプログラム。 6.自然数MからNmでの和と平均を求めるプログラム。(NとMの値は入力するものとし、M<Nとする) S=M+・・・・+N 7.Y=3X^3 +2X^2 +X +15 において、Xの値を-10から10まで、0.5刻みで変化させてYの値を求めるプログラム。 8.AAB+BB=BAA つまり、(100×A+10×A+B)+(10×B×B)=(100×B+10×A+A)となるAとBを 求めるプログラム。(A,Bは一桁の整数) 9.ABA×B=BCBつまり(100×A+10×B+A)×B=(100×B+10×C+B)となるA,B,Cを求めるプログラム。 10.三角形の辺A,B,Cにおいて、それぞれを1から20まで変化させたとき、直角三角形となる組み合わせをすべて 求めるプログラム。 11.Y=6X^2 - 5X - 9 の式において、-10≦X≦10 の範囲でYの最大値を求めるプログラム。 (Xは、0.2刻みとする)
断る。スレタイ嫁
>Cじゃないんですけど。゚(゚´Д`゚)゚。 BASICで書いて頂けませんか? ここはC++だ!!!!! 出直せ。
132 :
デフォルトの名無しさん :2006/12/08(金) 01:28:37
仮想関数を使うべきか、純粋仮想関数を使うべきか悩むときがある。 皆さんは、どんな使い分けをしていますか?
抽象クラスにしたいとき。
実装するのが面倒くさいとき。
「基本の動作」を定義しておいてあげた方が親切そうなら、普通に仮想関数を用意してあげる。 例えば別に無視してしまっても構わないイベントをハンドリングするコールバック関数とか。 使う側に「必ずここは自分で実装してもらわないと困る!」って強制したい場合は純粋仮想にする。 例えばクラス保守責任者の名前を文字列で返す関数を組み込め!とか上司の命令で決まったなら、 純粋仮想にして各担当者にオーバーライドしていただく。 至極簡単。
C#ではoverrideが追加されたよな、逆にオーバーライドしない指定のnewと共に。
モジラのルールは、アレだよ。 モジラ内ではそう決まっちゃったからそうするしか無いのかもしらんが、 何かの指針になる様なルールじゃねえっすよ。 うん。 でもまあ、これに限っては付けた方がいいのかね。 書かないで済むものは書かないのがC++流って気もするけど。
テキストエディタでプログラムを書くときは、エディタは何を使用していますか?
手頃なテキストエディタ。
>>69 > do {...; } while (p_turn = !p_turn, 1);
whileの中のこの式ってありですか?どういう意味ですか?
代入が成功したらtrueで繰り返しというのはわかるのですが、その後ろの
",1"がわかりません。
>>142 代入に失敗も糞も無い。
do while 使うんなら do {...; p_turn = !p_turn; } while(1) で同じこと。
と思ったけど、 continue とか使うと違うのかな?
>>143 あれ、代入に失敗も糞も無かったでしたっけ?
> do {...; p_turn = !p_turn; } while(1)
これはわかるんですが、それをwhile (p_turn = !p_turn, 1);という書式に
書き換え可能なんですか?
>>142 ちがうよ
while (p_turn = !p_turn, 1);
そもそも上の式では p_turn = !p_turn は評価されない
while の式として評価されてるのは 最後(一番右の) 1 だけ
つまり while は常に ture でループするってこと
>>143 , 145 ご教示ありがとうございます。
> そもそも上の式では p_turn = !p_turn は評価されない
代入は実行されるんですよね?こういう書式が可能とは知りませんでした。
while(1){p_turn = !p_turn;...}と同じですよね?
条件として評価できるものがくるまで、式を何個も置くということも
できるのですか?
>>146 > カンマ演算子ってやつだ。
ご教示ありがとうございます。調べてみます。
149 :
145 :2006/12/09(土) 22:05:06
>>146 書き方悪かった、結果が評価されないって意味だ
>>147 追記しとく
while が繰り返しをするかどうかは式評価で決まるわけだが
「,」は左の式を評価した後に右の式を評価しろというもの
たとえば while( a == b , a < 10 , b < 50 ) という式があったとする
この式の評価は左の a==0 を評価し、次にa < 10 を評価、最後に b < 50 を評価するのだがこの式全体の評価は最後の b < 50 だけで決まる
最初と真ん中の a == b と a < 10 は意味を成さない(意味の無い比較)
使い方とすれば while( a=a*2 , b=a+10 , b < 50 ) のように式の中で代入をして最後に比較したいときなど
>>149 「評価」を言語の動作についての用語として使うなら「結果が評価されない」も意味不明だろ。
あと「式全体の評価は〜」もおかしい。「式全体の値は〜」ってところか。
>>149 追記ありがとうございます。
>最初と真ん中の a == b と a < 10 は意味を成さない(意味の無い比較)
最初の有効な条件式を評価する、ということではないのですか?
例えば、こんなのは可能ですか?
int i = 0;
while(i++, i < 10){...}
>>151 条件式かどうかは関係ない。可能かどうかは、人に聞く前に自分でやってみろ。
153 :
151 :2006/12/09(土) 22:20:17
i > 0になったところで、永続ループになりますか?
154 :
145 :2006/12/09(土) 22:30:20
副作用とか大丈夫だったっけ?
>>152 家のPCに開発環境なんて入れてません。
というか、スレタイ見てね(はーと
>>154 ありがとうございます。
問題ない=10回繰り返す=i > 0になったところで、永続ループにならない、
と理解しましたが、OKですね。
月曜日に試してみます。
俺に聞けスレだったな。スマンカッタ。
>>157 そう言われてしまうと、こちらもスマンカッタ。
そして二人の間に友情が芽生えた
>>155 なんかあったっけ?
聞くのはいいが、開発環境くらい入れとけと
vectorのn番目の要素のイテレータをずばっと得るにはどうすりゃいいの? it = vec.begin(); std::advance(it, n); は思いついたけどこれって線形時間掛かるんじゃなくて?
いいえ。
vec.begin()+n ちなみに大抵の処理系でstd::advanceは各イテレータコンセプトについて 適切に実装されているから上のような書き方をする必要はない。 規格でそう決まっていたかはシラネ
規格でそう決まっている。 24.3.4
THX
advanceなんてあるのか 今までforループ使ってた… 勉強になるな
あはは。普通に+演算子オーバーロードされてるじゃーん。気付けよ、俺。orz
>>162-164 d
【標準出力の画面を消去する方法】 一つ目の標準出力 (例) cout << "前画面\n" をしてから、 二つ目の標準出力 (例) cout << "次画面\n" をしたときに、 ------------------------ 前画面 次画面 ------------------------ ではなく、最初に出力した内容を消去して ------------------------ 次画面 ------------------------ とする方法を教えていただけますか?
>>168 標準ではできない。たぶんコンソール操作を行うライブラリを使う必要がある。
>>170 コンソールアプリなら
#include <conio.h>
void clrscr(void);
これ使えねー?
>>171 >void clrscr(void);
使い方は、
ヘッダをインクルードして、
clrscr();
ですよね?
エラーが出てしまいます。(なんで?)
VS EEでは使えないのでしょうか?
(.\main.cpp(73) : error C3861: 'clrscr': 識別子が見つかりませんでした)
WindowsSDKを入れましょう
>>173 WindowsSDKってのは、Windows Platform SDKのことですか?
これは、
高機能でパフォーマンスに優れた Windows アプリケーションを
作成できます。
と書いてありました。
私はコンソールアプリケーションで作成していますが、いいですか?
ダウンロードは、3つくらい候補があるようですが、
英語で私には難しいかもしれません。
PSDK-amd64.exe 1.3 MB
PSDK-ia64.exe 1.4 MB
PSDK-x86.exe 1.3 MB
>>175 >VS EEって何?
Visual C++ 2005 Express Editionです。
>>175 >VS EEって何?
略している人がいましたが、VSなんて略さないかもしれないですね。
略すならVCかも。
>>174 PlatformSDKとWindowsSDKは違う。
Platform SDK + NET SDK = Windows SDK
>>179 >PlatformSDKとWindowsSDKは違う。
>Platform SDK + NET SDK = Windows SDK
そうですか。
>>168 \nの代わりに\rを使うとそういう風になる環境は結構ある。
Windowsのコンソールもそうなっているはず。
>>182 >\nの代わりに\rを使うとそういう風になる環境は結構ある。
これはその行の先頭へ復帰する、というだけだったと思いますが......
行の先頭に戻れても前の行は消せないだろカス
システムエラー時以外で例外を使うのはダメプログラム? 例えば、ファイル名を決めていないのに上書き指示を受け取ったときとか。
その例外に対処するのが至近距離にいるなら、通常のエラー処理で十分な気はする。 まとめて受け取り処理できる受け皿があるなら、普通に例外投げれば。 上記の例は例外対象じゃないだろ。 設計エラーな気すらする。
書き込み禁止になってたりした時には例外飛ばしたいような気もするし、 名無しの場合も例外でもいいんじゃないかという気もする。 Windows でメニューに上書きコマンドを持つソフトなら、 メニューアイテムをグレイにしなきゃならんから事前にチェックする ことになると思うけど。
よくわからんのだが、名無しで書込み禁止なんて状況、あるんだ? デタラメにハッシュとかで名前作ってみたらたまたま既に居て書込み禁止だったよとか、そんな状況?
std::logic_error の出番だな。
文字列ストリームのostringstreamへの出力に限界ってあるのでしょうか? ostringsteam ret; ret << "****************"; って感じで、文字列ストリームを宣言して、 テキストファイルを読み込んで、 内容を編集し、 文字列ストリームに出力します。 プログラムの最後で、 ofstream fout と生成した出力オブジェクトfoutに fout << ret.str(); という風に出力しているんですが、 なぜかある一定サイズ(28行くらい)を超えると、 ダイアログが出て 『問題が発生したため、****.exeを終了します。 ご不便をおかけして申し訳ありません』 と言われます。なぜでしょう?
コードと環境晒せよ
下で使うメンバ関数のgetはCのgetcharと似ていると思います。 同じくCのgetchに似ている関数ってありますか? #include <iostream> using namespace std; int main() { int ich; while( (ich = cin.get) != EOF ){ cout.put(ich); } }
ない。 基本的にC++の入出力はCのそれと同じ機能を持っている。 ちょうどgetchar/(f)getcはstd::istream::getに対応している。 しかしgetchは標準でないので、C++に対応するものはない。
>>196 回答感謝です。
そうですか。
わかりました。
関数の引数に****.c_str()を入れて、関数内でファイルからデータを読み込むのは どうすればいいのでしょうか・・・・? ****=ファイル名
****.c_str() ていうことは、 **** はstringですよね? stringにファイル名を入れてそのファイルをreadするなら ○-----○-----○-----○-----○-----○-----○-----○----- string ----- = "パス名"; ← ----は文字列 (末尾に、"\\") ---- += "ファイル名" filein.open((----.c_str()), ios::in); ○-----○-----○-----○-----○-----○-----○-----○----- でだめですか?
なにこの頭悪そうな流れ。
203 :
デフォルトの名無しさん :2006/12/17(日) 17:07:09
coutで2350000と表示したいんですが、 どうしても2.35e+06と表示されるんですが、どうしたらいいでしょうか?
204 :
デフォルトの名無しさん :2006/12/17(日) 19:16:58
いきなりすいません。 Visual C++でC++を書いていたのですが、 どこかのショートカットキーを押してしまい、 スペースが・で表示されたり、 Tabが→(矢印)で表示されるようになってしまいました。 どうすれば元に戻せますか?
>>204 (VCのエディタの設定が変わったのでしょうかね?[ツール]-[オプション]とか適当にいじってもダメですか)
私は設定にはあまり詳しいわけでないのでお答えできませんが、
VCのシリーズによって、微妙に設定方法って違うかもしれませんね。
(基本的には同じだと思いますが)
>>203 double d = 2350000.;
std::cout << std::ios::fixed << d << std::endl;
207 :
デフォルトの名無しさん :2006/12/17(日) 20:11:20
>>204 204です。
205さん、アドバイスありがとうございます。
[ツール]-[オプション]をいじってみたのですが、
今のところ元に戻りません…
209 :
デフォルトの名無しさん :2006/12/17(日) 22:37:19
>206>208 どうもありがとうございました。 問題は解決されました・・
210 :
デフォルトの名無しさん :2006/12/18(月) 00:02:30
関数アダプタかまして作り出したオブジェクトって、 元にしたオブジェクトが死んだら使えなくなるの? 関数アダプタって、どう言う仕組みで実装できてるのだ?
Visual C++ を使っています。
行列の固有値と固有ベクトルを求めるため、
ttp://www.neuro.sfc.keio.ac.jp/~masato/source/ このサイトにあるヘッダーファイルとリソースファイルを組み込み、マニュアルに示されているとおり、
#include <stdio.h>
#include "matrix.h"
void main(void)
{
Matrix A(2, 2), X;
Vector lamda;
A[0][0] = 3.0; A[0][1] = 2.2; // 行列 A 3.0 1.2
A[1][0] = 1.2; A[1][1] = 2.0; // 1.2 2.0
X = A.eigen(&lamda);
printf("\neigen value = ");
lamda.print();
printf("\neigen vector =\n");
X.print();
}
として、コンパイルしたところ、
1番目の引数を 'Vector *' から'Vector &'に変換できません。(新しい機能; ヘルプを参照)
というエラーが出ます。どうようにすればよいのかぜひ教えてください。
212 :
204 :2006/12/18(月) 00:19:44
Visual C++の表示が変わってしまった件が解決しました。 (ctrl+R) + (ctrl+W) で元に戻りました。 205さん、ありがとうございました。
>>211 ざっと見た感じ
X = A.eigen(&lamda)ではなくて
X = A.eigen(lamda);じゃないか?
(実際に確かめてないのであしからず)
>>213 すでに試してみました。固有値は0が二つ、固有ベクトルは[0.5914,-0.8964]が二つ返され、うまくいきませんでした、
215 :
デフォルトの名無しさん :2006/12/18(月) 00:44:04
ifstreamでファイル名が日本語のものを読み込むにはどうすればいいのでしょうか?
>>215 #include <clocale>
setlocale(LC_CTYPE, "");
217 :
デフォルトの名無しさん :2006/12/18(月) 00:48:09
VisualStudio2005Express入れました 一から全部教えてください m(_ _)m
219 :
デフォルトの名無しさん :2006/12/18(月) 01:00:38
>>216 すごい!解決したかもです。ありがとうございます
>>218 以下のチェックで必ず引っかかってましたが216さんので引っかからなくなりました
ifstream ifs(argv[1]);
if(!ifs)
return 1;
>>219 そのままファイルに日本語書き込めるか?
ライブラリがバグッててどうしようもなかったと思うんだが。
221 :
デフォルトの名無しさん :2006/12/18(月) 01:49:29
>>220 バグリました
引数の日本語は消え、変数内に日本語を使用するとそこで処理が止まりアプリが落ちる感じで…
振り出しに戻ったところでございます。よき方法があればご教授をTT
>>221 SP1 が出てるから、試してみるといいかもしれない。
むしろ、試してみて報告たのむ。
223 :
デフォルトの名無しさん :2006/12/18(月) 17:13:39
C++で質問です。 String str[] = {"aa", "bbb", "ccccc"}; のような配列の要素数を得るにはどうしたらいいのでしょうか。
まさしくそのような配列なら、sizeof(str) / sizeof(str[0]) でOK。
225 :
デフォルトの名無しさん :2006/12/18(月) 17:24:04
Integer型をgcc3以降のg++でも使えるようにするためにはどうすれば良いでしょうか? 今は2.95.3を併用してctype.oでごまかしながら使ってます。
Boostを使って良(くてコンパイル時定数でなくても良)ければ、 <boost/range/size.hpp>をインクルードしてboost::size(str)という手もある。
>>224 >>226 ありがとうございます。
>>224 の方法で出来たのですが、それを少し変えて
const string a[] = {"aa", "bbb", "ccccc"};を
int function(const string str[]) const {
return (int)sizeof(str)/sizeof(str[0]);
}
のような関数でfunction(a);として要素数を出すようにしたら、
戻り値が0になってしまうのですが、なんででしょうか。
>>227 引数として得た配列のサイズを得ることはできません(固定サイズの場合を除く)。
もし問題がなければ、std::vector などを使うのが良いと思います。
template <typename T, std::size_t N> std::size_t array_size(T (&)[N]) { return N; }
>>227 仮引数でのTの配列型は、Tへのポインタ型へ変換される規則。
>>228 boost::sizeは、普通の引数として配列の引数を受け取るが。
(配列に対する部分特殊化は、正に229のようなことをやっている)
度々申し訳ありません。
>>229 の方法で、
function() {
const string a[] = {"aa", "bbb", "ccccc"};
array_size(a);
}
のようにした場合、上手くいくのですが、下のようにすると上手くいきません。
function2() {
const string a[] = {"aa", "bbb", "ccccc"};
function1();
}
function1(const string b[]) {
array_size(b);
}
VisualStudio .NET 2003環境で以下のようなエラーが出てしまいます。
「'size_t array_size(T (&)[N])' : 'T1 (&)[N] 用のテンプレート引数を
'const std::string []' から減少できませんでした。」
どこがまちがってるんでしょうか。
VisualC++ 2005 Expressを使ってWindowsソフトが作って見たいと思ったのですが windows.hがインクルードできません。 Cの知識はあるのですが、C++の知識はないです。 何が原因でしょう?
すいません訂正です。 function2() { const string a[] = {"aa", "bbb", "ccccc"}; function1(a); // ← }
235 :
233 :2006/12/18(月) 23:23:27
すいません、聞かなかったことにしてください・・・。
>>232-233 226/229の方法は、配列にしか使えず、ポインタには使えない。
配列型は引数に取れないが(>231)、配列への参照型は引数に取れる(配列へのポインタ型も可)。
というわけで次のようにすればいい。
template <typename Range>
void function1(Range& b) {
array_size(b);
}
>>236 ありがとうございます。その方法で出来ました。
C++にはtemplateという便利なものがせっかくあるのに
使いこなせないというのはもったいないので、これから勉強し直そうと思います。
238 :
デフォルトの名無しさん :2006/12/19(火) 08:17:38
lseek関数っていうものがいまいちよく分からないんですけど、 分かりやすく教えてください、エロい人。
>>238 判らない人は使わなくて宜しい。
ファイルストリーム系のfseek()使えば?
一次元配列の問題で、 六個の整数を配列に記憶して配列の中から最大値と最小値を出せって問題なのですが これは配列に入っている数字をif文で総当りの式書かないとできないのでしょうか? 配列使って応用が効きそうだなとは思うのですがなかなかその先に考えがいけません。 何かヒントなどいただけないでしょうか?
241 :
デフォルトの名無しさん :2006/12/19(火) 14:16:43
C++でHTTP通信をするには、どうすればいいですか?
>>240 「ソート」とか、「ソート 配列」でググってみろ
>>240 ヒントというか・・・
気に入ったTVが一番安く買える値段を探すときに、あなたならどうしますか?
探している途中、今まで見つけた中でいちばん安い値段をメモしておいたり・・・
>242 >243 すいません追記で 使っていいのはif文とfor文だけです。
>245 はぁ?w 元からできるよw ひとつだけ言わせてくれソ−ト使わないとこんな問題もできないんですか?wwwwww 入門スレだからどれくらいできるやついるか試しただけ、 だけどこんな初歩の問題もできないなんてwwwww このスレの価値なし
やれやれ・・。 次の質問どうぞ。
>>241 処理系定義の機能を使う必要がある。よって、環境が明示されて
いなければ答えようがない。
配列内の整数値を整列させたいのですが、qsort()を始めとしたソートアルゴリズムは使いたくありません。 どういう方法があるでしょうか。
整列させたいのにソート使いたくないとはこれ如何に。
アルゴリズムを使わない方法と言えば、 ・他の機械(やプログラム)にデータを渡してソートしてもらう ・ユーザにデータを示してソートしてもらう ・並べ替えを一切せず、低い確率でのみ正常動作するという仕様で我慢してもらう くらいしか思いつきません・・・
qsort()を始めとしないソートアルゴリズムを使えばいいじゃないか。
逆に考えるんだ。 今あるデータをソートするのではなく 最初から整列したデータを用意するんだ。
それでいけました。ありがとうございます。
255 :
デフォルトの名無しさん :2006/12/20(水) 10:13:55
.open,.closeとfopen,fcloseって何が違うんでしょうか?
256 :
デフォルトの名無しさん :2006/12/20(水) 10:16:48
C++でラプラシアンフィルターを作りたいのですが誰か教えてください
なに?
>>255 。
.open,.closeとfopen,fcloseの違いが分からない?
>>255 それは無理矢理違いを探そうとするからだよ
逆に考えるんだ
「基本的に全く違うもので、どんな共通点を持つのか」
と考えるんだ
259 :
デフォルトの名無しさん :2006/12/20(水) 18:36:29
C++でラプラシアンフィルターを作りたいのですが教えてもらえないですか
×しずぎ ○しすぎ
262 :
デフォルトの名無しさん :2006/12/20(水) 18:51:24
Visual C++を使用しています。 文字列操作を行うプログラムなんですが、 data[256] = "abc,de f,,,,,, g"; char finder = ','; //検索用文字 をstrchr()とmemset()とmemcpy()を用いて ,をのぞいた文字列(abcde f g)を出力させたいのですが、どのように すればいいかサッパリ… どんな感じで組み立てればいいか教えてもらえませんか?
>>262 strchr()とmemset()とmemcpy()を使わないで一文字ずつ辿るのが手軽だと思うよ
というかstrchr()とmemset()とmemcpy()を使わないといけない≒宿題なら別なところ行け
>>262 というかVC++使っててC++スレに質問来るんだから
std::string使えよ…
>>262 文字列処理でmemset()だとかmemcpy()なんか使うなよ。
266 :
デフォルトの名無しさん :2006/12/21(木) 01:24:45
std::string使ってremoveみたいなん使えばすぐすむ話じゃん あとCならmemmoveを使った方がね
267 :
デフォルトの名無しさん :2006/12/21(木) 20:15:57
java始めて3ヶ月の者です。質問なのですが、C++を勉強すればCも勉強したことに なりますか?たとえて言うなら、大型自動車の免許を取れば普通自動車も運転でき ちゃう、といった感じのイメージで捉えていいのかということです。C++を勉強すれば Cも書けるようになるのかということです。
大型免許の例えはうまい、その考えでいいと思う。 できるけど、慣れないのでやや面倒かもしれないということはあるだろう。
269 :
デフォルトの名無しさん :2006/12/21(木) 20:31:12
やはり、そうですか。回答どうもです。
大型は普通をもってなきゃ取れないけどな。
自衛官になればおk
戦車…
たいていのC++できる人ってC++始める前にCやってるんじゃないかな
275 :
デフォルトの名無しさん :2006/12/21(木) 22:32:56
C++が主に使われてる分野ってなんですか?ゲームですか?組み込み式?
GUI
277 :
デフォルトの名無しさん :2006/12/21(木) 23:42:46
随分抽象的な回答ですね。
278 :
デフォルトの名無しさん :2006/12/21(木) 23:48:39
え? C++やったらCの知識は要らないんだよね 式にするとC++ - C = C+ みたいに…
279 :
デフォルトの名無しさん :2006/12/22(金) 00:11:13
C++-C=1じゃね?
ワロタ
C++-C=0
C++ - C = ++
マジレスすると、CはC99でC++とは違う道を歩き始めたから C99の新機能は勉強しておいて損はないと思う。
と言ってもinlineやboolなど、明らかにC++を意識したとしか思えない機能も結構あるけどな。
285 :
デフォルトの名無しさん :2006/12/22(金) 01:04:52
wikiで「上位互換はなくなった」という記事を読んだ
可変長配列は便利だ。 ヒープを使わない点もパフォーマンス狙いのときには利用価値がある。
>>286 可変長配列で使うメモリはどこから取ってくるの?
スタックじゃねーの?
多分alloca()に似てるとオモ
あ、誤解してた。 C99でいう可変長配列は実行時にサイズを決定できる配列のことか。 サイズを動的に変更可能な配列という意味ではないんだね。 それならヒープでなくスタックに領域を取れるね。
gccだとalloca()で実装されてたりするね。<可変長配列
292 :
デフォルトの名無しさん :2006/12/22(金) 07:58:45
すみません、教えてください。 下記のように宣言されてる関数を使いたいのですが 呼び出すとアクセス違反でエラーになってしまいます。 long WINAPI Reset( long Port, long *Sts ); こんな感じで呼び出しています ----- long *sts; Reset(1, sts); ---- たぶん第2引数のstsの渡し方が原因と思うのですが、ポインタ関連を理解してないからですかね?
>>292 Resetがどんな動作かによる
Stsに何かを返すのなら
long sts;
Reset(1, &sts);
294 :
292 :2006/12/22(金) 09:57:53
>>293 stsはステータスを返すようになってます。
ご指摘のとおりにコーディングしなおしたら無事動きました。
自分のは入れ物を用意してなかったからエラーになったんですね。
ありがとうございました。
あと、もう一つ質問させてください。
このReset()の仕様書をみるとstsに返される値(ステータスワード)の一覧が
こんな感じになっています。
SW1 SW2
E1 00 正常終了
E1 01 エラー
E2 10 待機中
stsはlong型なのでSW1(2バイト)とSW2(2バイト)ということになるのですか?
また、stsからSW1とSW2を切り分けるのはどうすればいいのでしょうか?
本来この関数作った人に聞くべきなんでしょうが、推測でもいいのでよろしくお願いします。
>>294 上位バイトと下位バイトに分けるんなら
short sw1 = sts&0xFFFF;
short sw2 = (sts
>>16 )&0xFFFF;
SW1と2でどちらが上位か分からないから逆かもしれん
仕様書とか言ってるってことは仕事?
もしそうならCの基礎も急いで勉強した方がいいような…
296 :
292 :2006/12/22(金) 13:00:52
>>295 ビット操作ってやつですね。
はい、仕事じゃないです。
趣味です。
勉強がんばります。
仕事じゃないならのんびり頑張れー
":"がわかりません。 class m_stack : public stack { private: const unsigned int stack_size; public: m_stack(const unsigned int size) : stack(size), stack_size(size) { } } これで最後の行のm_stack()はclass stackのコンストラクタを 実行し、次にstack_size()を実行するということですか? どうして{ }の中に記述しないのですか。よろしくお願いします。
>これで最後の行のm_stack()はclass stackのコンストラクタを >実行し、次にstack_size()を実行するということですか? その通り >どうして{ }の中に記述しないのですか 初期化と代入の違い
ありがとうございます。おことば、かみしめて考えてみます。
301 :
デフォルトの名無しさん :2006/12/22(金) 21:59:51
あの〜、、 演算子のオーバーロードで、インクリメント演算子を 前置と後置用でそれぞれ定義した場合、クラスのメンバにそれぞれインクリメントするようにしたんだけど、 A A::operator ++(){ this->x++; this->y++; return *this; } A A::operator ++(int nouse){ this->x++; this->y++; return *this; } 例えばob2(1,1)の場合,ob1 = ++ob2;とすると、結果ob1(2,2),ob2(2,2)になるのですが、 ob1 = ob2++;この場合、後置だからob1(1,1),ob2(2,2)の結果にするにはどのようにすればいいですか? 上記だと後置のオーバーロードでもob2++が評価されてから、ob1に代入されてしまいますし・・。
>>301 コピーを作ってそいつをインクリメントすればよい。
A A::operator ++(int) {
A temp(*this);
return ++temp;
}
追記 前置インクリメントは、戻り値の型をAへの参照型にした上で*thisを返すようにすべき。
>return ++temp; これでいいの? A A::operator ++(int) { A temp(*this); this->x++; this->y++; return temp; } じゃないかな?と思ったんだけど
305 :
301 :2006/12/22(金) 22:29:53
>>302 ご返信ありがとうございました。
コピーを作成するのは思いつきませんでした。
>>304 ありがとうございます。無事解決しました。
お二人とも感謝です^^。
>>304 グハッ、何寝ぼけたことを書いたんだろう俺_| ̄|○
でもさ、こうで良くないか。
A A::operator ++(int) {
A temp(*this);
++*this;
return temp;
}
>>306 それも考えたんだけど
なんか後置式の中に前置式を入れるのヤダったから
変数も2つだけだし
でも拡張性とか考えれば
>>306 がいいんだろうけどね
あとは
>>301 の好み次第かな
Effective C++かなんかにも後置インクリメント・デクリメントは前置版を使って実装しろと書いて張ったはず。
>>298 stack_size は変数だから、実行するのはおかしいだろ。
stack_size(size) は m_stack のメンバ stack_size を size で初期化している。
310 :
デフォルトの名無しさん :2006/12/24(日) 00:12:47
素朴な疑問ですが代入演算子のオーバーロードに virtual をつけるような場面ってありますか? virtual Foo& operator=(const Foo& foo); ???
代入演算子は継承されないんだから、仮想にしてもしなくても 同じなんじゃねーの?
312 :
デフォルトの名無しさん :2006/12/24(日) 00:42:27
>>311 継承されるような気がするんだが・・・ VC++2005
#include <iostream>
using namespace std;
class Base {
public:
virtual Base& operator=(const Base& base) {
cout << "Base" << endl;
return *this;
}
};
class Sub : public Base {
public:
virtual Base& operator=(const Base& base) {
cout << "Sub" << endl;
return *this;
}
};
void func(Base& base) {
Base a;
base = a;
}
int main() {
func(Base());
func(Sub());
return 0;
}
311は全てのクラスで暗黙の内に定義されるoperator =が、 基底クラスのoperator =を隠すことを言いたいのだと思う。
1つのスレッドでいくつものソケットを扱うことってできるのでしょうか? たとえば、1つのスレッドで何箇所からも同時にダウンロードする とか ご教授願います
316 :
デフォルトの名無しさん :2006/12/24(日) 17:50:15
C++って何?
プログラミング言語の1つ。 Cを基にしており、Cと互換な部分が多いことも売りの1つ。 その一方で、オブジェクト指向プログラミングやジェネリックプログラミングなど比較的最近の プログラミングパラダイムを取り入れたマルチパラダイムな言語になっている。 こんな感じでいいか?
318 :
デフォルトの名無しさん :2006/12/24(日) 19:47:48
C言語はじめてみたいと思っていますが、 CとC++ってどちらを選んでよいのかわからないのですが、 どのように選んだらよいでしょうか。
319 :
デフォルトの名無しさん :2006/12/24(日) 20:01:49
12月24日にそんなカキコミをするような奴はCだろうがC++だろうが やっても負け組み決定。 良くて半可通じゃね??
320 :
デフォルトの名無しさん :2006/12/24(日) 20:26:48
321 :
デフォルトの名無しさん :2006/12/24(日) 20:35:06
>>319 12月24日に2ちゃんねるやってるあなたも負け組みなんでしょ?
322 :
デフォルトの名無しさん :2006/12/24(日) 20:35:58
ちょっと中腰でタイプさせてもらうがすまん 今からパーティ行かなきゃならんのでレスできませんよ。
323 :
デフォルトの名無しさん :2006/12/24(日) 20:40:56
C++ばっかりやってると頭がおかしくなりますよ。
C++やってると、Kusakabe氏に遊んでもらえませんよ。
327 :
デフォルトの名無しさん :2006/12/29(金) 20:34:21
C++で入出力に関するライブラリを使用する際、 iostream系とstdio系を混ぜないようにとはよく言われるのですが、 C++でstdioではなくiostreamを使用する積極的な理由とはなんでしょうか? 別に積極的とは言わないまでも、こういう理由からstdioではなくて iostreamが必要という回答があれば教えてください。
>>327 printf()だとクラスの入出力が面倒くさい、あるいはできない。
ストリームなら、多重定義によってコンパイル時に自動判別
してくれるのでとても助かる。
逆に組み込み型の入出力しかしないなら、printf()とscanf()だけの
方がいいと思う。現時点では。
328の言うような「こっち側」だけでなく、 「あっち側」もiostreamでは自由度が高い。 ストリームバッファクラスを書けば、 ファイルやメモリに限らずどんなものに対しても入出力できるようになる。
コンソール画面に、複数の項目を表示し、 方向キーでいずれか(1つ)の項目を選択させ、 選択された項目を下のように括弧( [ と ] )で囲みたいです。 ※ 画面に表示される項目はvectorになっており(vector<string>)、 pop_backすることで、項目の数は、変動します。 全通りのパターンを書く以外に何かいい方法があれば教えてください!! 例) 項目数が9で[メニュー4]を選択した場合の表示 メニュー1 メニュー2 メニュー3 [メニュー4] メニュー5 メニュー6 メニュー7 メニュー8 メニュー1 メニュー2 メニュー9 (横2列で表示)
率直に考えたらこうなったが問題あるか?ただしコンパイル・実行は全く行っていない、悪しからず。 typedef std::vector<std::string> MenuItem; void ShowMenu(MenuItem item, MenuItem::size_type selected) { & using std::cout; & for (MenuItem::size_type i = 0; i < menuItem.size(); ++i) & { & & if (i == selected) & & & cout << '['; & & cout << item[i]; & & if (i == selected) & & & cout << ']'; & & cout << (i & 1 ? '\t' : '\n'); & } }
>>331 >率直に考えたらこうなったが問題あるか?ただしコンパイル・実行は全く行っていない、悪しからず。
いいえ。問題なんてとんでもない。利用させていただきます。
ありがとうございました。
333 :
デフォルトの名無しさん :2006/12/30(土) 01:48:34
C++はスレッドとかGCとか標準GUIライブラリの 規格化はしないの?
istream& operator>>(istream &,const char *) の定義をヘッダでするとリンクエラー吐くのは何故?in .net2003 cppファイル内なら通るんだけど
>>335 俺のエスパー値が低くてわからないので、
症状が再現する最小限のコードを晒してくれ。
337 :
327 :2006/12/30(土) 07:15:46
>328 >329 必要な局面があるという事がわかって安心しました。 C++の勉強中ですが、iostream系もサボらずに覚えようと思います。
>>333 スレッドは提案が出ていたと思う。
>>335 inline付ければ平気。
インラインでない(かつテンプレートでない)関数をヘッダで定義すると、
それをインクルードした全てのcppファイル(そしてそれをコンパイルしたobjファイル)にその関数の定義が含まれてしまう。
するとリンク時に同一名のシンボルが複数見付かったというエラーになる。
そもそもその関数を定義するのはなぜ?自分で書かなくても(std::istreamのメンバとして)標準ライブラリにあるだろうに。
339 :
デフォルトの名無しさん :2006/12/30(土) 12:47:06
実行ファイル化した物や開発環境でデバッグファイルを作成した物は 問題なく読み込めるのですが、少しでもファイルの内容に変更を加えるだけで error C2146: 構文エラー : ';' が、識別子 'lpDD' の前に必要です。 error C2501: 'LPDIRECTDRAW7' : 識別名を宣言するのに、型が指定されていません。 というエラーが出て、自家用PCでのVisualC++での開発が頓挫しております。 この場合、どうすればこの構文エラーがなくなってくれるのでしょうか・・・
340 :
デフォルトの名無しさん :2006/12/30(土) 15:23:14
main() { int*p; if(1) { int x; = 3; p = &x; } printf("%d", *p); } xがスコープから外れてるので使えないと思ったのですが vc2003だと 3 と出力されました。 これの出力はどのコンパイラでも 3 になりますか? それとも実装や状況に依存しますか?
>>339 LPDIRECTDRAW7 が宣言されているヘッダをインクルードすればいいんじゃない?
344 :
デフォルトの名無しさん :2006/12/30(土) 15:32:44
クラス図の書き方がよくわからないのですがどういう決まりがあるんですか? 線の先が▲だったり、■だったりするのがよくわかりません
JavaとかC#は一つのクラスにつき、一つのソースファイルを使う傾向があるようですが、 C++の場合は一般的にどうするべきなのでしょうか。 複数クラスを機能別にソースファイルに分けるべきなのでしょうか、 それともJavaのように一つずつクラス毎で分けたほうが良いのでしょうか。
>>338 わかりやすい説明ありがとう
いや楽がしたくて
int a, b;
cin >> "(" >> a >> "," >> b >> ")";
みたいに出力と対称に入力出来るようにしてみた。
あと
>>336 もありがとう
> JavaとかC#は一つのクラスにつき、一つのソースファイルを使う傾向があるようですが、 そんなことありません。
Javaはそうだろ
>>345 分けるべきだな
ひとつの関数でも分ける
プログラミングの苦痛は、大きいクラスでも
大きい関数でもなく、大きなファイルから来る。
これは少し冗談だがBoostでも見ればだいたいこれくらいで
分けたらいいというのは分かるぞ
そうしてリビジョン管理もろくにできない香具師が量産される罠。
確かに(-_-)
Visual C++ express Editionで、コンソールアプリケーションを使っていて ↓のようなウォーニングが出ます。動作事態は問題ないのですが、 出さないようにする方法を教えてください。 d:\rankpro\addmatchresult.cpp(43) : warning C4996: 'getch' が古い形式として宣言されました。
ヘッダincludeするまえに #pragma warning(disable:4996)
#include <vector> class Integer { const int i; // ここのconstが問題 public: Integer(int i) : i(i) { } }; int main() { std::vector<Integer> vec_int; vec_int.push_back(Integer(1)); } なぜこのコードがコンパイルできないのか理解できません。 4行目のconstがなければ通るんですけど。。。。 コンパイラはGCC3.2.3です。
vectorの要素には代入演算子が必要。 自分で書いてないから暗黙の代入演算子がコンパイラによって作られる。 暗黙の代入演算子がconstメンバ変数に代入しようとしてアウト。
constは引数か定数でしかあまり使わないな〜
STLのコンテナの要件は、代入演算子じゃなくてコピーコンストラクタだよ。 その部分以外は正しいけどね。
>>357 vector の push_back() ならコピーコンストラクタだけで
実装できそうだな。エラーメッセージは?
>>358 暗黙で定義されるのはコピー代入演算子
>>360 規格23.1.3
コンテナに格納されるオブジェクトの型はCopyConstructibleかつAssignable
364 :
357 :2007/01/04(木) 11:35:59
皆さんありがとうございます。 エラーメッセージはこんな感じです。 コピー代入演算子でエラーが出ているようです。 また、push_back()をしなければエラーは出ません。 /usr/include/c++/3.2.3/bits/stl_vector.h: member function 内の `Integer& Integer::operator=(const Integer&)': /usr/include/c++/3.2.3/bits/stl_vector.h:895: `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<_Tp*, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Integer, _Alloc = std::allocator<Integer>]' から実体化されました /usr/include/c++/3.2.3/bits/stl_vector.h:498: `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Integer, _Alloc = std::allocator<Integer>]' から実体化されました const_member.cpp:12: ここで実体化されました /usr/include/c++/3.2.3/bits/stl_vector.h:895: non-static const member `const int Integer::i', can't use default assignment operator メンバ変数をconstにするのは、関係のある複数の変数をひとまとめにするためだけに クラスを使いたいからです。 Cの構造体にコンストラクタをくっつけるだけみたいな。 だから最初に載せたコードのInteger::iは本当はpublicメンバです。 やりたいことをスマートに実装する方法はないものでしょうか。 あえてメンバをconstにしなくても困らないっちゃあ困らないんですが。
>>364 インスタンスをconstで宣言して代入じゃ問題が?
367 :
デフォルトの名無しさん :2007/01/07(日) 16:38:31
火葬軽症って何ですか?
文法等で規定されている形式的な継承であるかどうかに関係なく、 実質的に継承関係になっているような継承のこと。
継承元は実体化できないよ〜ん 必ず継承して実体化できるようにしてね(はぁと)
370 :
デフォルトの名無しさん :2007/01/07(日) 23:26:58
ダイナミックキャストって、動的に判断されるのだよな? クラスのインスタンスにクラス情報でも勝手に組み込まれて、 グローバル領域にクラス相関図情報みたいのが勝手に作られてるのか?
371 :
デフォルトの名無しさん :2007/01/07(日) 23:41:26
>>368 ,369
もっともらしく嘘を教えていただきまして
ありがとうございます
372 :
357 :2007/01/08(月) 00:00:36
>>370 手元にある本には、処理系によって異なりうるが、仮想関数テーブルのなかに
型情報を収めたテーブルへのポインタが格納されると書いてある。
だからdynamic_castは多相型(仮想関数をひとつ以上持つクラス)の
オブジェクトにしか適用できないらしい。
ひどいミスだ。 ちなみにオブジェクトと言ってもポインタかリファレンスね。
class Base { public: int n; }; //仮想継承 class D1 : public virtual Base { /* 〜 */ }; class D2 : public virtual Base { /* 〜 */ }; class Derivation : public D1, public D2 { /* 〜 */ }; この例のような状態は特に菱形継承(ダイアモンド継承)と呼ばれる。 仮想継承でない(D1, D2の部分のvirtualを取り除く)場合、DerivationのインスタンスにはD1の基底のBaseのnとD2の基底のBaseのnという2つのnが別に存在することになる (メンバ関数も同様)。仮想継承した場合、 DerivationのインスタンスにはBaseの部分はただ1つしか存在しない。D1の基底とD2の基底が共有されている状態である。 C++ではクラスの多重継承・仮想継承が共に使用できる。しかしC++を基にしているJava、C#、Dではいずれも使用できない。
375 :
デフォルトの名無しさん :2007/01/08(月) 01:42:50
>>374 ありがとうございました。
よく分かりました
vector<int> vec1; vector<int>::iterator iter; int tmp; cout << "項目を入力:" << endl; while (cin >> tmp) vec1.push_back(tmp); cout << "表示方法を数字で選択:" << endl; cout << "\t1\40入力順" << endl; cout << "\t2\40逆" << endl; int choise; cin >> choise; ※ cout << choise << endl; switch(choise){ (以下省略) 上のソースで※の行のcinが無視されてしまいます。 だから例えば※の1行上で int choise = 0; 等とすると最後までchoiseは0のままです。 入力できるはずのところで入力できません。どうしてでしょうか?
while (cin >> tmp) vec1.push_back(tmp); をどうやって抜けてる?
cinにstd::ios::failbit立ってるんとちがう? cin.clear()してみ。
380 :
376 :2007/01/08(月) 03:10:27
>>379 できました。ありがとうございます。
Ctrl-Z が failbit フラグをonにするということですか?検索してみましたがよくわかりません。
>>380 正しくは、cinがEOFを検出した事でstd::ios::eofbitが立つが、
std::ios::eofbitが立つ時は必ずstd::ios::failbitも立つ。
failbitが立ってしまうとそのストリームに対する操作はclear()と
close()以外は無効になる。
>>371 あほな当て字をするからまともに答えてもらえないんだよ。
おれも仮○包茎の説明をしよかと思って思いとどまった。
なにせマたちはスルーカが足りないからね。
384 :
デフォルトの名無しさん :2007/01/09(火) 01:49:22
longをstringに変換する方法を教えてください。 お願いします。
>>384 sprintf
snprintf
stringstream
strstream
boost::lexical_cast
でググって、好きな方法を選べ
386 :
デフォルトの名無しさん :2007/01/09(火) 01:56:10
>>385 ありがとうございます。
それ以外のにします。
387 :
デフォルトの名無しさん :2007/01/09(火) 01:58:10
388 :
デフォルトの名無しさん :2007/01/09(火) 02:02:31
ダライアス継承の利点を教えてください
何、そのシューティングっぽい継承。 ダイアモンド継承なら知ってるけど。
391 :
デフォルトの名無しさん :2007/01/14(日) 21:12:30
C++で、適当な多次元配列を定義して、その型名をtypeid演算子によって表示するプログラムが分かりません。教えて下さい。
あああ
>>391 型名というか名前は実装依存だが。
int n[1][2][3];
std::cout << typeid(n).name() << std::endl;
よろしこ UINT max; UINT foo; if(1 < foo < max) { 処理 } このように書くと、 warning C4804: '<' : 演算中の 'bool' 型の使用方法が安全ではありません warning C4018: '<' : signed と unsigned の数値を比較しようとしました。 こんなときはどうしたらいいですか? 1にUINTの1だ〜と宣言させればよいかと思い UINT 1なんて書いたら、コンパイラに馬鹿にされました int 1と書いたらそんなものを付けるなともっと馬鹿にサレマスタ VS2005 SDKデツ
if (1 < foo && foo < max)
>>395 394です
サンクス、馬鹿にされなくされなくなりましたが
foo && foo
でなんで直ったのか、もっと分からなくナリマスタ
解説してもらえませんか
foo && foo じゃなくて (1 < foo) && (foo < max) と捉えろ
>>395 です
>>398 サンクス良く分かりマスタ
が、1にプレフィックスを付ける方法とかは無いのですか?
1u
>>400 ちょww、お前ソレいま教えるなよ、こいつなんか勘違いしたまま先に進んじゃうぞw
>>400 1uだとやっぱり、
warning C4804: '<' : 演算中の 'bool' 型の使用方法が安全ではありません
warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
これが出るんだよね・・・・
403 :
デフォルトの名無しさん :2007/01/16(火) 16:26:11
「計算式対応電卓」 ・計算式を文字列として入力すると、その計算を行い、結果を出力するプログラムを 作成せよ。 -入力文字列を解析し、数値と演算子に分けて計算する。 -例:計算する式を入力してください。終了:end 使用可能演算子:四則演算(+-*/) 1+2 答えは3です。 ・必ず四則演算のほかに、使用可能な演算子を追加せよ。 入力する際の演算子記号は任意にきめてよい。 -例:あまりを求める % 二乗を求める ・繰り返し何度も計算できるようにする。
前置法 中置法 後置法について調べてから
あとは
>>404 のスレで
406 :
デフォルトの名無しさん :2007/01/16(火) 20:37:52
初期化が必要なコンストラクタしかないクラスインスタンスの配列を生成するにはどのように書けばよいのでしょうか? class A { public: A(int a); }; このクラス定義に対して A *ADim=new A[100]; //初期化がないと言って怒られます よろしくお願いします
byte 配列でメモリを確保してからひとつづつ placement new で初期化かなー。
409 :
406 :2007/01/17(水) 00:08:00
1個だけであれば A a(0); あるいは A *a=new A(0); でインスタンスが生成できますが これを100個配列として生成する記述の仕方がわかりません。 よろしくお願いします
std::vectorでも使っておけ。
#include <cstdlib> #include <memory> A *ADim = (A*)std::malloc(sizeof(A) * 100); std::uninitialized_fill_n(ADim, 100, A(1234)); 別々の初期値が要るならraw_storage_iteratorで。
たしかにそれをやってくれるのがvectorなわけだよな
>>409 A(0) を100個でいいなら
std::vector<A> ADim(100, A(0));
414 :
デフォルトの名無しさん :2007/01/17(水) 19:12:42
#include <iostream> using namespace std; int main(void) { unsigned char x,y; cout << "2つの値を入力してください。\n"; cin >> x >> y; x -= '0'; y -= '0'; int a = x + y; int b = x * y; printf("x = %d, y = %d, x + y = %d, x * y = %d",x,y,a,b); return 0; } これで出力したら10以上の数値が出ないんですが、 どうしたら出るようになるか教えてください。
>>414 xとyをint型か何かにする。
なんだかんだいって(signed/unsigned) charは文字を扱うためのもの。
416 :
デフォルトの名無しさん :2007/01/17(水) 19:20:00
そうしたいのはやまやまなんですが、 宿題で『unsigned char』と『printf』ははずせないんです…。
文字列して atoi じゃダメなのか?
クラスって今まで頭の中で理解してたつもりだったが、クラスを使う場面が無かった (あったけどうわべのだけ理解していた)のですが、Win32APIを弄りだしたら 物凄くクラスを使うと便利ということが分かったばかりの初心者です。 privateで宣言した TCHAR *buffer[512]; というコンストラクタをデクストラクタする時に foo::~fooSet() { delete buff; } とすると、警告が出るのですが使い方間違ってますかというより、privateな変数は デクストラクタしなくてもいいのでしょうか? warning C4156: 'delete' の配列でない形式を使った配列の削除は、定義されていません。 warning C4154: 配列の delete が定義されていません。配列は、ポインタに変換されます。 VS2005 SDK
buffer は配列であって new で確保したものじゃないだろ? delete するなら buffer[0] とかだ
↑ スマソなれない言葉なんで(^^; ×デクストラクタ ○デストラクタ です、よろしく
>>421 サンクス
>>buffer は配列であって new で確保したものじゃないだろ?
そうです
buffer[0]したら警告が止んだ、これでいいのか、なるほど。
よくねー newしてないものをdeleteしちゃダメ。
当たり前だ・・・・ 何も知らないという事は恐ろしい
そう言うなよ兄者 処でクラスって楽しいですね、これからは全てクラス化しようと 決心シマスタ
> privateで宣言した > TCHAR *buffer[512]; > というコンストラクタを それコンストラクタじゃなくてメンバ変数だよ、多分 あと、デストラクタするってのも普通言わない
>>428 なるほど、拙者承知した
処で、兄者はC++使いのつわものと拝見したが、Win32APIの関数もクラス化して
ライブラリィとか作ったりしたこともあると思うのだが、どんなものを作ったのか
教えてくれまいか、コードを書いてくれとは言わないが、これは便利だった役にたった
という物があったら教えてくれましか。
ATLとかvectorとか見たら目眩がするのでいっそ自分で作ったほうがましかと思う次第であるのでヨロシク
> 自分で作ったほうがましかと思う 自分で作っても劣化版になるだけ。車輪の再発明と言う。 だいたい曲がりなりにも金を取ることもある製品なんだから作っているのはそれなりのプロだ、自分よりスキルがないわけがない。
まぁ勉強のためにしてるんだからいいんじゃないの
ATLとかVectorとかとてもプロが作ったものとは思えないのですが、単に 作者が自分の技術に心酔して一般には使いにくい塵を売りつけたおぞましい物にみえますが・・・・・
433 :
428 :2007/01/17(水) 23:14:41
>>429 何で用語の間違い指摘しただけでそんな認定受けなきゃならんのだ
質問するとき用語が間違っているとトラブルになりやすいからわざわざ指摘したんだが…
覚えたてなら用語を間違って覚えてる場合もあるだろ
あとオレはそんなにC++が得意なわけじゃないから
APIのラッパークラスも書いた事無いよ
書く予定も無い
まあ、使い捨てなものとか勉強目的のはあったと思うが、
少なくとも使い回せるようなのは一つも
今のオレが書けないような汎用性の高いライブラリが色んなサイトで公開されてるし
>>432 それよりもっと使いにくいものなんて世の中ごまんとある。
ところで、ATLはATL::CHandleなんかの小物が便利だよ。
なるほど。 コピーコンストラクタが無い場合には自前で placement new で初期化する必要アリか・・・
std::uninitialized_fill_n(ADim, 100, 1234); ならコピーコンストラクタは要らないんじゃね?
>>406 には、そういう質問が出てくる段階においては、
C++ではデフォルトコンストラクタが無いクラスの配列は
基本的には無理とするのがベター。
VC7.1(VisualStudio.NET2003)でコンソールアプリを作成しています。 独自拡張の出力ストリームを以下のように作成しました。(一部省略) // 拡張ストリームバッファ class streambuf2 : public std::basic_streambuf< wchar_t, std::char_traits< wchar_t > > { public: // 必要最低限の仮想関数をオーバーライド } // 拡張ostream class ostream2 : public std::basic_ostream< wchar_t, std::char_traits< wchar_t, > > { private: streambuf2 m_sb2; public: ostream2() : std::basic_ostream< wchar_t, std::char_traits< wchar_t, > >( &m_sb2 ) { } // 特にオーバーライド無し } つづく
442 :
441 :2007/01/20(土) 16:11:48
上記
>>441 のように作成したストリームを用いて
以下のように文字列を出力すると、入力文字列のポインタがうまく判別されず(?)、
文字列のoperatorとは違う関数がよばれ、文字列のアドレスが数字で表示されてしまいます。
ostream2 cout2;
cout2 << L"TestString";
出力結果:00,524,1F0
どうしてこのような現象になってしまうのでしょうか?
原因がわからず困っています。
なお、以下のように二回同じ文字列を出力した場合、二回目は正しく文字列として出力されます。
ostream2 cout2;
cout2 << L"TestString";
cout2 << L"TestString";
出力結果:00,524,1F0 TestString
また、初回をbasic_stringでわたしてやった場合は以後普通に動作するようです。
ostream2 cout2;
cout2 << basic_string< wchar_t >("TestString");
cout2 << L"TestString";
出力結果:TestString TestString
同じ値をそのまま二回渡して呼ばれるoperator関数が、変わる事ってありえるのでしょうか???
とりあえず/Zc:wchar_tをつけたらどうか? プロジェクトのプロパティ→C/C++→言語→wchar_tをビルトイン型として扱う
444 :
441 :2007/01/21(日) 02:24:08
>>443 さんに指摘してもらったオプションをON/OFF
切り替えても変化がありませんでした。
なお、同一ソースをlinuxに持っていって実行した所、
上記の問題は発生しませんでした。
もしかしたらVS2003のバグなんだろうか・・・一応SPは当ててあるのですがorz
別の場所でなにかしらのメモリを上書きしてしまっている可能性とかもありえるのかな・・・
とりあえずデバッグでステップインしたらどうか?
VC++の例のロケール絡みのバグ?
std::stringはコピーオンライトだとずっと思ってました・・・ 少なくとも私の使ってるGCCでは違いました。ショック!
copy on write は参照を数えておかなきゃならないから、 マルチスレッド/マルチコア/SMPで効率が悪くなることもあって ずいぶん前に流行らなくなったような記憶がある。
そのうちわかるさ
って、ここ、C++ のスレだった。 新スレキボンヌ。
std::iostream から >> で std::string として 文字列を取り出すってことができないのは悲しい。
いろいろと誤解しているとしか思えない
勘違いしてました。 #include <string> じゃなくて #include "string.h" としていたために、 以前自分が作ったクソ文字列クラスを使ってました。 もちろん >> 演算子なんて定義してませんでした。 テヘッ
ぜんぶ orz:: 名前空間に入れよう。 そうしよう。
C++って、変数cに1足してるんですか?
いいえ。
変数Cでしょ
その理論でいくとC#の#って何の演算なんだ?
文字列連結だ CにJavaとかDelphiとかSQLとかくっつける
>>460 Cの拡張版という意味で++、つまりワンステップ上の、ということでは
>463 C++++の+4つをくっつけて#じゃないっけ?
C♯なんだから、半音上がっているんだよ。 もう半音上がったら当然Dだな。
# って♯(シャープ)じゃなくて#(ナンバー)だよね。 シーシャープじゃなくて、シーナンバーとするべきだ。
シャープ記号をASCIIに入れなかった昔の偉い人に文句言え。
C#の#はprotectedのことかと思ってた。
C# ←犬と木
次でぼけてっ!
>>472 (プロデューサーの声)
それだと
>>471 以前がまともな事言ってたみたいになるけどいいのか?
倍精度型は変数名に#を後付する、ってならったよ。
そうそう、単精度は!で文字列は$、整数型にも%を忘れないようにね。
476 :
デフォルトの名無しさん :2007/03/01(木) 00:24:35
base class を作るメリットって何ですか? デメリットはありますか?
. __ ______ . /日 「 日\_\ ∴∵∴ |. │/ \ ┃ .|モツニ| おいらをどこかのスレに送って! ∵∴ ______\.ハ,,ハ.|_/__/ お別れの時にはお土産を.持たせてね! ()__|_日 ('(゚∀゚∩(@)目〓〓」_┐ ∴∵ \_====―― ̄ \__┐ ∵∵∴ <_<_| └― __┐ ' .</</√ 現在の.所持品:
479 :
デフォルトの名無しさん :2007/03/01(木) 15:06:53
>>476 C++で基底クラスを作らないとなると
C++の機能の半分も使っていないということになるな
メリットとかデメリットとかいう以前の問題
必要なら作る、不要なら作らない。
必要・不要は基本的に設計時の問題。
>>476 メリット
ベースクラスで共通の動作を提供できる。
継承関係によるポリモーフィズムができる。
デメリット
基底クラスと派生クラスの間に比較的密な関係が生まれやすい。
ときに基底クラスの存在が邪魔に感じることがある。
481 :
デフォルトの名無しさん :2007/03/01(木) 17:55:03
system,execの違いは何ですか
system : 標準関数 exec : 非標準関数
483 :
デフォルトの名無しさん :2007/03/01(木) 19:07:27
?
>>481 systemはShellを経由して外部のプログラムを起動する。
spawnは直接外部のプログラムを起動する。
execは自プロセス内に外部のプログラムをロードし実行する。ただしWindowsではspawnと同じ動作になる。
execやspawnは本来unixのapiであり、Cの標準関数ではない。
485 :
デフォルトの名無しさん :2007/03/15(木) 12:38:35
stlのvectorって配列として使っても大丈夫でしょうか? vectorは配列のindexが隣同士でも データ自体は隣同士に並んでないって可能性も考えた方がいい? begin()で配列の先頭を取って配列として使いたいんですが。 環境はVC.net2003です。
>>485 >データ自体は隣同士に並んでないって可能性も考えた方がいい?
もしそんな変態処理系があったら、それは「標準に準拠している」とは
呼べない。でも
>begin()で配列の先頭を取って配列として使いたいんですが。
それはまた話が別。
vector のイテレータは大抵ポインタなんで結果的に大丈夫だろうけど
先頭アドレスはできれば &hoge[0] で取るよろし。
>>485 勿論、push_back()などの操作をした後はポインタ取り直さないとダメよ。
&*vectorhoge.begin():
&hoge.front();
>>485 配列の数が完全に固定されているときは配列
可変長になる可能性があるときは、迷わずvectorを使いましょう
>>486-490 レスありがとん。
ロベールさんとこに
>実はvector が純粋な配列であるという保証はありません。
>vector の性質上それで問題ないように見えますが、それは仕様として定められていないのです。
>例えば、サイズが大きくなるとあるサイズで分断してメモリを確保するようになっていたとしても、
>誰も文句は言えないのです。
なんて書いてあるからstringあたりを使おうかと迷ってたんです。
char_traitsとか意味不明ですし
可変長配列はvector使う事にします。
確かに規格では当初vecotrが配列代わりとして使えるようにする規定がなかったのだが、 後から&v[0] + n == &v[n]が保障される記述が追加され、 なおかつ実際問題それ以前からそうなっている実装ばかりだったし、 vectorを動的な可変長配列として使うのは全く問題ない。
おめーらそろいもそれってvector<bool>の事を無視ししやがって。 ...と思ったもののvector<bool>なんて異物はどうでもいいか。
そろいもそれって
舌噛んだのか
>>491 stringに関しても
>>492 と同じようなことが起っているので
contiguous memoryとして使って良いよ。と委員会の偉いひとが言ってた
98年以前にC++の公式仕様ってあったっけ? 禿本とARMが仕様ってこと?
強いて言うならドラフトも参考にされていたとは思う
>>496 >stringに関しても
>>492 と同じようなことが起っているので
>contiguous memoryとして使って良いよ。と委員会の偉いひとが言ってた
kwsk
親クラスのprivateなメンバー関数は子クラスでも継承して使用できますが 孫クラスからは継承して使用できないのでしょうか?
>>501 private は子クラスでも使えないよ。
>>502 ごめんなさい
protectedでした、子クラスも孫クラスからでも使えました。
504 :
デフォルトの名無しさん :2007/03/23(金) 06:38:47
class A { public: static A* create() { return new A; } }; // B-Yまで省略 class Z :public Y { }; int _tmain(int argc, _TCHAR* argv[]) { A*a = Z::create(); //ここでZのオブジェクトを返す様にしたい return 0; } テンプレートとか実行時型情報か何かを使えば createをオーバーライドせずにZのオブジェクトを返すようなことはですか?
自分自身をメンバに持つクラスなんて作れるんすか? そんな事したら無限再帰して再起不能になっちゃうんじゃないすか?
はあ?
508 :
506 :2007/03/23(金) 13:15:44
勘違いしてました そのまま打ち込んで中身に適当なテストコードしこんでコンパイルしたらちゃんと動いちゃいました すいません
>>506 はやればできる子
ちょっとだけアレなだけで
基底クラスCFoo 派生クラスclass CHoge : public CFoo 派生クラスCHogeから派生したclass CVar : CHoge この様な関係がある時、CVarクラスから基底クラスCFooのprotectedなメンバ関数への継承関係は成り立たないのでしょうか? class CFoo { protected: void SetFlg(bool flg = true){m_flg = flg;}; private: bool m_flg; 省略 class CHoge : public CFoo { 省略 class CVar : public CHoge { このクラス内でSetFlg()関数を使いたいのですが・・・
>>510 > このクラス内でSetFlg()関数を使いたいのですが・・・
で、どうなったの?
>>510 です説明不足すみません
CHogeクラスにて、SetFlg()関数を使う場合
CHogeのヘッダーファイル
#include "CFoo.h"
class CHoge : public CFoo
{
この様に書くことでHoge.cppの実装として
void CHoge::Set()
{
bool flg = true;
CFoo::SetFlg(flg);//←この様に派生元を書かなくても、
SetFlg(flg);//この様に継承して使えるのですが
}
これと同じようにChogeクラスの孫クラスCVarの実装で同じようには使えないのでしょうか?
>>512 実行していないがコンパイルは出来たぞ。
class CFoo
{
protected:
void SetFlg(bool flg = true){m_flg = flg;};
private:
bool m_flg;
};
class CHoge : public CFoo
{
};
class CVar : public CHoge
{
public:
void func()
{
bool flg = true;
//CFoo::SetFlg(flg);
SetFlg(flg);
}
};
坊やだからさ。
>>514 だからどうなったのさ?
コンパイルエラーから理由がわからないのかってことだよ。
すごい初歩なんですけど void SetStr(LPSTR str , LPSTR readStr , int i , int *txtLen) { str = (LPSTR)malloc(*txtLen+1); strncpy(str , readStr + i - *txtLen, *txtLen); str[*txtLen] = '\0'; return; } strに渡した内容を改竄して、再び戻ってもstrを使用したいのですが メモリ確保のポインタが悪いのか上手くいきません。どうすればできますか? お願いします。
void にするくらいなら、str のポインタ返せばいいのに。 それがどうしてもできないのなら、引数をLPSTR* str にして 関数の中のstr を *str に。 呼び出し元のstr を &strにすればいいかも。
ってここC++じゃないのか
>>517 戻して欲しいものへのポインタを渡して、そこに戻して欲しいものを入れてもらうワケよ。
intを戻して欲しいなら、intへのポインタを渡してそこにintの値を入れてもらう。
あなたの場合は、SetStr()でmalloc()したアドレスを戻したいのだよね?
ならばLPSTRへのポインタを渡すのだ。
521 :
517 :2007/03/26(月) 17:44:24
つーかstd::string使えて
523 :
デフォルトの名無しさん :2007/03/28(水) 04:29:16
世界一わかりやすいCプログラミングの授業 (単行本) Lepton (著) この本はお薦めでしょうか?
525 :
デフォルトの名無しさん :2007/03/28(水) 10:17:28
自分がnewで作られたオブジェクトかどうかを自分で知る方法無いですか?
new をオーバーライドしてフラグ入れとけば
つ More Effective C++
newは「オーバーロード」するもんじゃね?
たしかにoperator newやoperator new[]を関数として定義できるが、 526の用途に使えるかというと微妙かもしれない。 規格上処理系依存や未定義の動作になるかどうかすれすれだと思う。
自分がヒープにいるかどうか調べるだけじゃだめなの??
そもそも、何でそんな事をしたいのかが気になるなあ。
>>528 オーバーロードもできるが、グローバルなやつを再定義することで
仮想関数のオーバーライドと同様に処理を置き換えられる。
534 :
529 :2007/03/29(木) 01:09:33
>>531 そんな気がすると思っただけ、特に何か考えたわけではない。
>>534 >規格上処理系依存や未定義の動作になるかどうかすれすれだと思う。
「そんな気がする」と思っただけでこんな発言するな。
クラスにoperator newを定義して、確保したメモリ領域をすべて覚えておく、とか思ったが、 std::vectorに直接格納されたらどうしよう。
vectorの領域再確保が起きたときに ポインタが無効になってしまう可能性があるという話か。
vector使うのは危険
なぜだ、理由を書け
すみません。 オライリーのAI入門始めようと思うんですが、 本家からダウソできるAIDemo2-2見たんですが難しいです。 関数群の解説だけでもお願いします。
541 :
540 :2007/03/29(木) 15:14:00
だけってのはおかしいか。失礼しました。
教えてください。delete NULLは無害ですか? 例えば char *p = new char; if (p != NULL) { delete p; } としなくても char *p = new char; delete p; で安全ですか?
安全です
どの道、newに失敗してもpにはNULLは入りませんし。
>>543 ということは、世の中にあふれている
if (p != NULL) delete p;
のif文は無駄ということですか?
古いC++は p != NULL
VC++ 6.0は新しいC++でしょうか?
>>548 古いな。たしかデフォルトだと new からヌルが返ってきたはず。
ちょっと分からなくなってきました。 delete NULL; が安全かどうかはC++が新しい古いで変わるのでしょうか?
>>550 ISO の国際規格に準拠した C++ コンパイラなら安全。
VC++ 6.0 は準拠していない部分が多い。
あ、 ISO の規格に対応する日本語訳の JIS 規格でもいいよ。
VC++ 6.0 の delete のインプリメントは free なので delete NULL は桶。
>>550 誰か安全じゃないなんて書いたか?
NULLを返すロートル仕様のnewでない限り、NULLにならないんだから問題ないだろ。
>>556 new がヌルを返さなくても、 new の結果を保持していた変数に
ヌルが代入されることはあるだろう。たぶんそのことじゃないかな?
free nullで死ぬ古のコンパイラの表を見た記憶があるが VC++は含まれなかったと思われ。 ちなみにVC++でnewが失敗するとか考えるだけ無駄だ 失敗するときはOSが死んでいる
>ちなみにVC++でnewが失敗するとか考えるだけ無駄だ >失敗するときはOSが死んでいる にゅ、newをオーバーロードしてるかも知れないじゃないかッ
newの例外拾う実験なんてやるだけ無駄ってことなんですね・・・ 一度やってみましたがメモリ使用量が1.5Gとか行ってばからしくなってやめたのを思い出した
OSが死にますか、そうですか。
>>558 そうだな。お前みたいな奴が書いたプログラムがそこらじゅうで動いてるだろうからな。
>>542 まったくもって安全。
ただ、本筋とは関係ないけどnewは失敗時にNULLを返すんじゃなくて、
例外を投げる。
だから上下のコード両方ともNULLをdeleteする呼び出し経路は存在しない。
bad_alloc例外か
566 :
デフォルトの名無しさん :2007/05/03(木) 02:30:47
000 ・・・ 00A ・・・ Z00 ・・・ ZZZ のように、数字と文字の混じったものを作成したのですが、 どうすればよいかわかりません。 よろしくお願い致します。 環境:Visual C++ EE
>>566 #include <stdio.h>
int main() {
const char tc[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char buf[4];
for (int i=0; i< (sizeof tc - 1); i++)
for (int j=0; j< (sizeof tc - 1); j++)
for (int k=0; k< (sizeof tc - 1) ; k++) {
buf[0] = tc[i]; buf[1] = tc[j]; buf[2] = tc[k]; buf[3] = 0;
puts(buf);
}
return 0;
}
他意はないが、ちょっと改変してみた。 #include <stdio.h> int main() { const char tc[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char buf[4] = { 0, }; for (const char *i=tc; 0 != (buf[0] = *i); ++i) for (const char *j=tc; 0 != (buf[1] = *j); ++j) for (const char *k=tc; 0 != (buf[2] = *k); ++k) puts(buf); return 0; }
普通は再帰にするだろ。 #include <iostream> #include <string> using namespace std; void order(int n, string& buf) { static const char Letters[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if(n == 0) { cout << buf << endl; } else { for(int i = 0; Letters[i] != '\0'; ++i) { buf += Letters[i]; order(n - 1, buf); buf.resize(buf.size() - 1); } } } int main() { string buf; order(3, buf); }
// さらに改変。ところでこんな風にauto_ptr使うのって駄目なんでしょうか? #include <vector> #include <string> #include <memory> #include <iostream> #include <fstream> std::auto_ptr< std::vector<std::string> > make_seq() { const char tc[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; std::auto_ptr< std::vector<std::string> > ret(new std::vector<std::string>); char buf[4] = { 0, }; for (const char *i=tc; 0 != (buf[0] = *i); ++i) for (const char *j=tc; 0 != (buf[1] = *j); ++j) for (const char *k=tc; 0 != (buf[2] = *k); ++k) ret->push_back(buf); return ret; } std::ostream& dump(std::ostream& out, std::vector<std::string>& strs) { typedef std::vector<std::string>::size_type strs_type; for (strs_type i = 0, end = strs.size(); i < end; ++i) out << strs[i] << std::endl; return out; } int main() { std::ofstream fout("out.txt"); dump(fout, *make_seq()); return 0; }
>>570 std::auto_ptr なんか使わずに make_seq 関数を std::vector<std::string> を
継承したクラスにでっちあげてしまえばいんじゃない?
ソースの自動生成って簡単なんですか? classの構造としては悪い例なんで恐縮なのですが 例えばC++で、hoge.hに class hoge { int m_i; public int get_i(); }; みたいなのがあるとき、それに対応するhoge.cppで自動的に、 int hoge::get_i() { return m_i; } のような定義を生成するようなやつです
>>572 その例だとインライン関数にした方がいいと思うから、
#define PROPERTY_GET(type, name) private: type m_##name; public: type get_##name() { return m_##name; }
とかいうマクロを作ったのでいいと思うけど、
このソースを見て他の人がどう思うかは知らん。
思い切って各処理系で独自拡張されているプロパティの機能使うのもありだとは思うけど。
>>572 真面目にやるとかなり大変だとは思うけど、自分の目的が果たせるだけの
手抜きなものであれば比較的楽にできると思う。でも、下手にそんなもの
作るよりはマクロでお茶を濁したほうが正解だと思うぞ。
やっぱ大変なんすね… なんか{と}の対応をとったり空白行読み飛ばしたり 宣言の行の構文解析をしたりと大変だとは思いましたが… 素直に他の方法を検討するか、腰据えてコンパイラ、リンカの分野まで勉強するかしかないようですね 今回はVCの__declspec(property())使うことにします ありがとうございました
本当に適当でいいなら 構文解析とか必要ないんじゃないかな。 class hoge { を探して、 }; が見つかるまでの間に、 *** get_+++(); ってだけ書いてある行が見つかったら、 hoge.cpp に *** hoge::get_+++() { return m_+++; } を追加、とか。
コンストラクでファイルオープン処理入れたら、同僚に普通そんなことはしない と言われたんだけど、やっぱり駄目なの?
・エラー処理が難しい。 ・グローバルなオブジェクトにされた場合、プログラム開始から終了までファイルが開きっぱなしになる。
・メンバ変数にすると、それを所有してるクラスを作る時に ファイルが開かれてしまう。 これがいいか悪いかは状況次第ではあるかもしれないけども。
普通ファイルを開かないコンスタラクタつけるだろ
>>578 「普通」とかいういいかげんな理由でプログラミングしないこと。
ほんとうに駄目だとしたら書き換えるのはわりと面倒になるだろうから、
何が困るのか具体的に聞いてみるといい。
> ・エラー処理が難しい。
例外投げればいい。
> ・グローバルなオブジェクトにされた場合
> ・メンバ変数にすると
完全に使う側の問題だろう。都合が悪いならポインタにすればいいし。
コンストラクタの例外って色々と面倒臭いんだぜ。
>>583 「色々」って、また胡散臭いことを言う。具体的に頼む。
RAIIの原則に従えばコンストラクタでファイル開くのはぜんぜんおかしくない コンストラクタ内の例外安全はスマートポインタで確保
>>586 それは書いた奴が C++ のオブジェクトモデルを正しく理解していないだけ。
コンストラクタが完了したオブジェクトについては必ずデストラクタが呼ばれる。
「他のメンバのスキルが怪しそうな場合は〜」ってのがオマエモナーって感じ。
>>586 そこで書いてるのって、
コンストラクタで例外飛んだらデストラクタ起動しないよ。
としか書いてないような気がする。
正直、そんなあたりまえの事で使うなっていわれてもなぁ
ついでにそのすぐ下ではデストラクタでの例外に付いて、
的外れな問題点を書いてるし。
本質的な問題はそこじゃねー
件の文章を読んでると、
例外安全性についての基本的知識が欠如してるっぽいから
参考にするのは無理があるな。
結局はRAIIが徹底出来ていないだけだな。
これいじって、A のデストラクタを呼ぶ方法はある? #include <iostream> using namespace std; class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; class E { public: E() { throw exception(); } }; class B { A a; E e; }; int main() { B b; }
呼ばれんぞ
593 :
デフォルトの名無しさん :2007/05/03(木) 21:45:21
g++ 4.0.1 で -ansi -pedantic 付きでコンパイルしたが、 全く呼ばれないぞ。
ほんとだ。 g++ 3.4.4 @Cygwin でも ~A が出ない。 ↓こうしたら出た。 - B b; + try { B b; } catch(...) { }
>>591 例外が一切ハンドリングされない場合はデストラクタを呼ぶかは未定義。
例えばg++とかはデストラクタ呼ばずにabortする。
>>590 main関数を
try{B b;}catch(...){}で囲めばデストラクタが呼ばれる.
調べてみたのでメモっておく。 15.3 "Handling an exception" p9 "If no matching handler is found in a program, the function terminate() is called; whether or not the stack is unwound before this call to terminate() is implementation-defined."
>>586 これ2chたまに見るな
出される度にボコボコにされてるけどw
C言語版は良いと思うけどね
もう1つ質問! Cで関数を分割していく過程で、キーになる値などは引数で渡したりするのが一般的だと思いますが C++だとキー項目をクラスのメンバにして、引数で渡さずに直接メンバ変数として参照するケースが多いみたいですが これって、複数の関数内部で共通的に使うものならば、なんでもメンバ変数にしとけばいいってことですか? 今までCしか開発したことがなかったので、どうクラスを作っていいか悩んでばかりです。
>>601 「なんでも」ってことはない。共通で使う値になんらかの制約があったり、
自然にオブジェクトが見出せたりするときはクラスが適任。
>>601 OOもどきがやりたいなら、お願いだからOOの勉強してからにしてください。
今まで普通にCを使いこなせていた人なら 構造体の使い方はよくわかっているはずだし それを拡張したclassの基本的な使い方がわからないはずは無いのだが。
class が構造体の拡張とか笑えるぞ。 カプセル化だけじゃなく、ポリモーフィズムも class の根幹であり、 これは C では(不可能ではないが)なじみの薄いところだ。
んな事誰でも知ってるって。 FILE*の中身(実装)を知らなくてもopen/read出来ることと 逆にいえばデバイスの種類がファイルの実体でなくても同じように読み書きできること これをわかっている奴が 継承による多態が理解できないわけ無いっての。 その程度もわかってない奴が、偉そうなこと言うなよ。
それは無理あるだろw C だと普通それは分岐で実装するんだよ。
言語仕様としてのサポートの有無があるかどうかの差だけだけど。 もしかして、デバイスドライバとかで 普通に関数ポインタがメンバに入ってるの知らないの?
あと、プラグインとかモジュールとか言われるものも 関数ポインタのテーブルへのポインタ、 つまりC++におけるvptrを登録することによって動作を変える そういうのも珍しくない。 もちろん、普通のコードで当たり前に使っているというわけじゃないけど そういうものを理解できる人、つまりCを使いこなせてる人が C++のクラスを理解できないなんて、ありえないんだよ。
>>608 俺はデバドラも触る人間だから知ってるけど、
デバドラなんて普通の人は触らないぞw
理解できはしても、構造体の単なる拡張というイメージではないと思うが。
構造体とクラスの話題のようなので質問です structをアクセス指定子がデフォルトでpublicであるclassって 認識で使っちゃっていいんでしょうか?
人によるとしか。
非OOP的に使うなら、俺は別にかまわないと思っている。
テンプレートの述語クラスとか。
C++ではポインタの宣言を int* p; と書くことが多いようですが、なんで int *p; こう書かないのでしょうか? Cではこの書き方が一般的なのに。
int *p; が一般的? C でも両方ともよく見るぜ。 まあ、C++ ではほとんどみないけど。 理由はワカランが、一行に複数の変数を宣言しないスタイルが広まったから、 わざわざ *p と書く必要性が薄くなったんじゃないかね? int* p; の方が見やすいし。
•禿が自著でint* p;のスタイルを使った。 •ポインタとは別に参照int& r;があり、int *pは「*pがint」と読めるというルールが全ての型に通用しなくなった。
int* p, *q; と書くと馬鹿みたいだね。
私はCでもC++でも int * p; と書きますが。
622 :
616 :2007/05/04(金) 22:10:09
なるほど。 ありがとうございました。
623 :
デフォルトの名無しさん :2007/05/14(月) 21:12:03
拡張子のhとhppは同じ意味? h = hpp
624 :
デフォルトの名無しさん :2007/05/14(月) 21:16:28
>>623 hppはC++のヘッダであることを明示するとかなんとか聞いた
C++の場合hでも事実上変わらないからhにしてる場合も多いが
Boostではhppで統一してたな
何でだろう?
何かツールの都合で Cのヘッダと区別したいとか
Cのソースでインクルードしないでねっ♥
628 :
デフォルトの名無しさん :2007/05/21(月) 22:23:08
コンストラクタについて教えてください。 class test { public: test() { std::cout << "コンストラクタ1" << std::endl; } test(int i) { std::cout << "コンストラクタ2 : " << i << std::endl; } }; test t; // これは、「コンストラクタ1が呼び出される」 test t2(1); // これは、「コンストラクタ2が呼び出される」 test t3(); // 何も呼びだれない。 なぜ、t3()は何も呼び出さないのか教えてください。 環境:MinGW C++(3.4.2)
test型のオブジェクトを返す関数の宣言だから。
>>628 test t3(); は test型のオブジェクトを返す関数の宣言だから。
何という結婚具合
test()を読んでいるわけではないと。。。 オブジェクトを返すと。 すいません、意味がわかりません。
int f( int i ); は判る? test f( int i ); も判る? test f( void ); は、どう? test f(); になると? みんな関数の宣言なわけよ。
634 :
デフォルトの名無しさん :2007/05/21(月) 22:45:49
C++の仕様によれば、 変数の初期化と関数宣言のどちらにも解釈できるコードは、 関数宣言として解釈される。 これはCとの互換性を保つための仕様。
構築済みのオブジェクトから自分のコンストラクタを明示的に呼ぶような処理ってまずいですか?
なんとも気持ちの悪い仕様ですね。 有難う御座いました。
637 :
デフォルトの名無しさん :2007/05/21(月) 23:02:32
>>635 生成済みのインスタンスを対象にするなら、
先にデストラクタを呼んでおかないとまずいだろう。
よくわからんがplacement newの事を言ってるんだろうか
コンストラクタを呼んでるつもりで、実は自分のクラスの テンポラリオブジェクトを生成しているだけだったりする ってのがよくあるオチ。
643 :
デフォルトの名無しさん :2007/05/22(火) 00:34:38
VisualC++2005やってるんですが、一つのプロジェクトの中にソースがたくさんある(入門書のサンプルを順番に練習中のためint mainが複数存在する)場合、 それらのソースをひとつずつビルド→実行することは出来ないのでしょうか? 要するにコマンドプロンプトで「bcc32 〜.cpp」ってやるような単純な手順を、VC++上でやりたいという話なのですが…
645 :
デフォルトの名無しさん :2007/05/22(火) 02:41:05
>>644 単にテストが目的なら
それぞれ普通の関数にしてmain()から順々に呼んでやればいいんじゃね?
647 :
デフォルトの名無しさん :2007/05/22(火) 19:49:55
hppとcppと分けて実装してますか? それとも、hppの中にすべて実装していますか?
>>647 ヘッダ内にあるべきものと、そうでないものの
区別が付かないと申すか?
exportが無いコンパイラでのtemplateライブラリとかは hppの中に書かざるを得ない…
int *p; int x = 10; p = &x; printf("%d", *p); これでは10が表示されるみたいですが、 char *p; p = "aaaa"; printf("%s", *p); こうするとエラーがでます。printf("%s", p)とすればaaaaと表示されます。 1番目に書いたほうは理解できたのですが、 同じように考えて2番目もするとエラーでした。 この違いはなんなんでしょうか?
うお。C++スレへ書いてしまった。スレ汚し申し訳ない。
>>652 ■ .hpp に書くもの
・他所の .hpp や .cpp から利用することがあるもの。
・宣言
・クラス定義
■ .cpp に書くもの
・他所の .hpp や .cpp から利用することがないもの。
・クラス定義以外の定義
655 :
644 :2007/05/22(火) 22:55:16
結局いまのオイラにはBCCでやったほうが早いようです。皆さんありがとうございました。
ヘッダでも内部リンケージしかないものは書いてもいいだろ。 初期化とか。
初期化??
コンストラクタ、デストラクタのことなんでね?
なんでそれが内部リンケージなんだ? インライン関数にしてればそうなるけども、 そうでなければ外部リンケージじゃん。
きっと>657はコンストラクタをインラインに書かないといけないと思っているんだよ。
インライン関数や静的なconst整数定数は内部リンケージだけど、 インライン展開されなければ実質的には外部リンケージになるんだよね? まあ、要するに、実体が1つしか作られないんだよね、という質問。
>>662 インラインかどうかとリンケージは関係ない。
お勧めーーーなC++の教本を教えてください。
Accelerated C++
>>665 レスども。本屋にでも行って調べてきまつ。
はじめはどのコンパイラがお勧めなんでしょうか? 教えてくだしあ><//
>>668 ありがとうございます。
ダウンしたフォルダの中にexeがなかったのですが
どうすればいいでしょうか?・・・
PCの知識なしにプログラムを学ぶとか無理だよ
今時PCの知識が無い奴と言えば XPデフォルト拡張子非表示で そもそもexeを知ってるわけ無いだろ というわけで釣乙
プログラミングを学ぼうとするなら Windowsみたいな欠陥OSを使っていてはおぼつかない。 Cドライブをフォーマットして、PC UNIXを入れなさい。 そうすれば最新のg++でプログラミングできる。
>>672 PC UNIX って NTFS にインストールできるの?
>673 やろうと思えばできるよ
>>674 インストールはできるけど、動かないよとかそんな落ちじゃなくて?
マジに普通にうごくの?
>>672 それはunixが使える人間の戯言
相手のレベルも考えず自分の主観だけで「俺様理論」を振りかざすのは愚行でしかない
初心者にunixを薦める場合、そもそもunixをインストール出来るか否かが問題
使えるようになるかどうかが、さらに問題
結果的にはコンパイル以前の問題で躓く可能性が高い
開発環境はGUIじゃないと使えない椰子は多いだろうね
今時のUnixなんて、どれも大してインストールは難しくないだろ。 #インストールだけなら それこそ、それさえできない香具師がプログラミングだなんて烏滸がましいと思うぞ。
そもそもインスコイメージが見つかりませんとかw
だいたい、Winのアプリのインスコできてるのか?
>>676 それは最近のPC UNIXを知らない人間の戯言
インスコの簡単さも知らず自分の主観だけで以下省略
今のは超簡単になってるよな Linuixとかさ おじさんビックリだよ
まあ、M$のより簡単だな
684 :
678 :2007/05/26(土) 23:31:49
>>681 PC Unixに限らないよ。Sparc版Solarisだってとっても簡単。
PCと違ってバリエーションが少ない(なんせ自社製ハードしかない)から
組み合わせで苦労することもないし。
linux対応のドライバが無いから新しいPC買うまで様子見
よっぽど新しいものでなければ 大概対応してるけどね
>687 インスコに必要なデバイスに対応してないってことは あんまりないでしょ オンボードのサウンドすらあっさり認識されるよ と俺はLinux板でアドバイスしてるよ まあおまいらも騙されたと思ってインスコしてみそ
インスコというやつは厨くさくて
>690 まあ板違いだからな言葉も違う 廚の振りしたプロも多いよ
>>689 俺の知ってるLinux厨はでかい態度で、できるできるっていうわりに
実際にやらせたらできないことが多かったんでどうもLinux厨は信用ならん。
しかも、そいつできなかったことに対して自分の間違いを認めたことは一度もなし。
まぁ、おまえがどうなのかは知らんが、Linux厨に限らず俺が見てきた
オープンソース派なヤツはおしなべてそんなヤツが多すぎ。
Linux使っていることに何か特別な気分でいられるんだろうね。 周りがWindowsばかりだからw 目的があって使っているならまだしも・・・ 多種さまざまな目的において、Windowsの方が使いやすいし なんといってもデバイスドライバやソフトウェアの種類がLinuxへの 完全な乗り換えを思いとどまらせる。まぁ、KNOPPIX使うことはあるけど。 大学じゃUNIXでC言語の授業を受けてたけど、自宅じゃWindowsで
694 :
678 :2007/05/27(日) 02:25:28
>>688 昔あった「ラップトップEWS」は確かに富士通製だったけど、
その後はOEMしかなかったと思ったのだけど……
出してたっけ?
#某芝で売っているEWSは剥がれ掛けのラベルの下に「Sun」の文字がw
>>694 おととしあたりに共通化の発表したと思った。
それまでは単なるOEMでは無かった。
大学のJavaの授業ではWin上でEclipseを使ってたけど 家ではOSX上でEclipseを使ってます>< Eclipseさえ動けばなんでもいいよ
Eclipseは糞
演算子のオーバーロードをしない場合に起こりうる現象は?
?
整数クラスを作って演算子をオーバーロードしない(できない)設計の場合、 a+b*cのかわりに、a.add(b.multiply(c))みたいな不自然な書き方を 使用者が強いられるって話じゃないの。
702 :
デフォルトの名無しさん :2007/06/07(木) 02:03:56
ifstream.read(配列,読み込みsize); ↑でEOFまで達すると、seekgで読み込み位置修正は無理でしょうか?
>>702 一回 clear() すればたぶん大丈夫。
ファイルから16進数表記された文字列を読込んで、 それを数値に変換する事は可能でしょうか?
可能ですよ
トンツートンツーでもできるよ
sscanf, strtol あたりを使えば。
解決しました、有り難うございます。
CまたはC++で文字列の末尾から5文字(終端文字も含む)にはどうしたらいいですか?
文字列の中から指定した文字の個数を数える手段はありませんか? 例えば yoshio という文字列から o が2つあるといった感じで
712 :
デフォルトの名無しさん :2007/06/30(土) 05:00:45
>>710 ん?末尾から5文字にはどうしたらって、見捨てないで普通に使ってくださいな。
714 :
デフォルトの名無しさん :2007/06/30(土) 05:16:40
文字列の中から指定した文字の個数を調べてくれる手段はありますか? 例えば yoshio という文字列から o が2つあるといった感じで あるとしたらどういうものがありますか?
#include <string> #include <algorithm> #include <cassert> int main() { using std::string; { // <<710の問いに対するエスパー回答 string str("123456789"); int n(5); string::size_type len = str.length(); string::const_iterator e(str.end()); assert( str.substr(len-n, len) == string(e-n, e) ); } { // <<714の問いに対する(ry string str("nullponullpo"); string::size_type num(0); string::iterator i(str.begin()), e(str.end()); while ( i != e ) { i = std::find(i, e, 'l'); if (i == e) break; ++num; ++i; } assert( num == 4 ); } }
おい天才、教えてください const 配列のアドレスと要素数を取得する関数は↓のうちどれが一般的ですか? (例はint型配列を取得する関数の宣言) @void getArray(const int*& array, int& num); Aconst int getArray(const int*& array); Bconst int numofArray(); + void getArray(const int*& array); C他あればそれを教えてくだされ
何がやりたいんだ? #define ELEMOF(array) (sizeof (array) / sizeof *(array)) みたいなことがやりたいのか? それならこうだぜ。 #define ELEMOF(array) (sizeof ELEMOF_((array))) template <typename T, size_t N> char (&ELEMOF_(const T (&)[N]))[N];
あ、すまん。違うな。ようやく理解した。 int size(); const int* data(); みたいなのを作るんじゃないか?
boost::addressof()とboost::size()がまさにそれなんだが…
そっちじゃない。
そっちです。
どっちやねん
723 :
716 :2007/06/30(土) 13:14:36
>>718 う〜ん、やっぱり関数の戻り値として取得するのがいいですかね。
要素数を求める用と配列のアドレスを求める用の関数を実装して取得するようにします。
ありがとう
構造体を返す
それは不便にしかならない
>>714 の質問の答は別のスレにありますた
int n = strspn(s.c_str(), "\t"); < こんな感じ。 sはstring型
std::countでよくね?
って思ったが、やってみたら
>>726 じゃだめぽだった orz
729 :
デフォルトの名無しさん :2007/06/30(土) 21:22:35
>>728 m9 三 9m
彡 ∧∧ ミ
m9 (^Д^) 9m プギャプギャプギャプギャー!!
ヾヽ\ y ) 彡
m9/三 9m
∪ ̄ ̄ ̄\)
>>729 ある文字列から、指定した1文字の数を検索する方法を教えてくれYO!
だからstd::countとかboost::count使うのがいい
>>731 使い方の例を教えてください、おながいします!
>>732 いろいろやってみればいいだろ。
それをしないからお前はいつまで経ってもそうなんだ。
726にならうなら、 int n = std::count( s.begin(), s.end(), '\t' );
735 :
デフォルトの名無しさん :2007/06/30(土) 21:55:14
>>733 はぁ?教えられないくせに自分は知ってますよだ?ちゃんと yoshio の中から o の数を
って具体的な例を挙げて質問しているじゃん。答えられないならしゃしゃり出てくるなよ
所詮お前もあれだろ?質問者を見て、自分より劣る奴にはでけぇ面できる役立たずの
ウドの大木だろ? スレタイ 読んでから二度とお前はこのスレでレスするな。
少なくともお前みたいな、知らない奴を叩くだけの奴に答えてもらいたいなんて思う奴はいない。
失せろ、クズw
736 :
デフォルトの名無しさん :2007/06/30(土) 21:57:04
答えられないくせにでしゃばるだけのうざいバカ。いるよな、こういう奴。
んで、あまりにも的外れなレスするから、そいつが発する言葉は全て無視されて
周りは「あっ、なんか知ったかのバカがほざいているよ」って思われてるんだよねw
知っているなら知っていると、知っていることを示すレスをすりゃ良いのに、
そんなんだからいつまで経ってもそうなんだ。何がそうなんだか知らないがそうなんだw
733 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 21:50:35
>>732 いろいろやってみればいいだろ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
何がそうなの?w
バカが何ほざいてんだか よそでやってくれ
>>734 thanks a lot.助かりますた。
boost::countの方は size_t n = boost::(s, '\t'); ちなみにこっちは非標準のboost::range_exのargorithm.hppだから適当にリポジトリから拾ってきてね
↓答もしないくせに煽るだけのバカはお前だろw
737 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 21:59:03
バカが何ほざいてんだか
よそでやってくれ
スレタイ読んでからこのスレの意味を理解しろや、ボケが。
↓何これ?お前のはレスになってねーんだよ、そういうのは茶化しって言うんだよ。
733 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 21:50:35
>>732 いろいろやってみればいいだろ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
それをしないからお前はいつまで経ってもそうなんだ。
>>737 バカはおめーだろ。バカは。答える気がないのに質問している人を煽るだけかよ?
周りからしてみりゃ、お前が答える能力がないくせに、なんとなく知っているって話だろ。
具体的にどういうものがあるかも示せないくせに、さも知ったような口聞くんじゃねーよ、
ヘボプログラマーw お前みたいな三流以下はプログラマーに向いていないどころか
知った気になって間違った不適切な手法を用いてバグを出しまくって、信頼を失って
仕事も入らなくなるんだよなw
742 :
デフォルトの名無しさん :2007/06/30(土) 22:04:22
>>740 C++なら俺に聞け(入門篇)、ただし、基地外のぞく
基地外警報発令
>>742 だからおめーに聞いてねーってwwww でしゃばるだけのまともな回答をしない奴が
何俺に聞けとか偉そうにしてんだよ?お前みたいな役立たずバカになんて聞いてねーし
レスしてもらいたいなんて思わないよ。医者だとしても治療とか言って
治療したつもりが悪化させてしまうような奴な医者を誰も頼らないし
そんなのは医師免許を剥奪するのが望ましい。して、お前は医師免許すら持っていない
偽医者だから、引っ込んでろ。
>>742 うわっ、お前の口キムチくせぇ。頼むからその口開かないで祖国に帰れ、な?
745 :
デフォルトの名無しさん :2007/06/30(土) 22:07:41
基地外、基地外、基地外、基地外
>>745 もうええって。確かに調べれば出る罠。けどお前は役立たずのクズ。お前のレスは無駄すぎ。
自分で↓ここまでやったから。後は知ったかのお前をとっくに超えている俺にひれ伏すんだなw
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string s;
char src;
int n;
printf("Input 文字列> ");
cin >> s;
printf("Input 検索文字> ");
cin >> src;
cout << static_cast<int>(count( s.begin(), s.end(), src )) <<endl;
return 0;
}
747 :
デフォルトの名無しさん :2007/06/30(土) 22:14:48
危険ですので基地外にプログラミング教えないでください
基地外でも理解する頭がありゃどんどん理解してプログラミングが出来てくるから 安心しろw ここで知らない奴を見つけては煽るだけのバカよりよっぽどマシだから。 いずれこのスレは俺が主体となってレスするようになるから、低レベルな自分が 通用するような今の現状で満足していろ。自民党が参院選で負けてその後悲惨な 結末をたどるように、初心者を叩くだけで自分は出来た気になっちゃっているアホは いずれ時間の経過とともに年をとって、苦労するだろうw
こいつはしばらく前から居着いてる基地外だからスルーよろ。
751 :
デフォルトの名無しさん :2007/06/30(土) 22:19:46
われわれは、基地外を叩いてるんだよ、基地外をな
↓スルーの種類のコピペ
理解する頭はあるんだよ、俺は。レベルは高くないけど大学で理系の分野を専攻していて 基本的なことは習ったから。論理演算子やプログラミングの授業もあったし 実験や研究でもそれに関する内容があったし。ただ、プログラミングを本格的にやるような 学科じゃなかったから、最近になってやり始めたのさ。言語の実装について理解できれば 後はそれと数学的な理論を用いてより推敲されたコードを記述してオマエラをあっと言わせてやんよ? やっぱ大学くらい行くべきだな。ちょこっと専門学校でかじったくらいの奴らにはぜってぇ〜負けないw
今の大学って四年でも ポインタ理解してない奴が多いイメージがあんだけど
>>753 countの使い方くらい検索すればでてくるだろ?
この前宿題スレで大学大学言ってた奴かw?
758 :
デフォルトの名無しさん :2007/06/30(土) 22:32:48
基地外マスター、大学を出てるんだら 言語の実装をココで聞かなくていいじゃね
ふふっ、そうだな。下を見て見下すような奴らに言語の実装を聞く方がおかしかった。反省するよ。 ちょっくらC++の参考書でも買ってくる。オマエラに聞くよりマシだろうからなw
今の大学だろうが、昔の大学だろうが、卒業しても ポインタ理解してない香具師なんかいくらでもいたろ
んで、俺が ポインタを理解していない とでも?実態はメモリ上のアドレスを示すもんだろ。 だから何?もちろんポインタなんてC言語じゃ普通に使っているが?ナイト不便だしな。
>実態はメモリ上のアドレスを示すもんだろ あー、判ってないな。
763 :
デフォルトの名無しさん :2007/06/30(土) 22:48:07
765 :
デフォルトの名無しさん :2007/06/30(土) 22:51:32
762 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 22:46:44
>実態はメモリ上のアドレスを示すもんだろ
あー、判ってないな。
↑こいつは多分、ポインタを配列だと勘違いしているんだろうな。
ポインタは言葉が持つ意味のごとく「指し示すもの」。
ttp://www.techscore.com/tech/C/6.html プログラムで使用されるデータは、全てメモリに保持されます。
C言語で作成されたプログラムも同様に、変数が保持するデータは全てメモリで管理されます。
通常プログラマはメモリのどこに変数のデータが管理されているか意識しなくて良いようになっていますが、
データが格納されているメモリアドレスを操作する仕組みも提供されています。
それを「ポインタ」と呼びます。
はいっ、間違っているってならこういう説明をしているサイト全てに抗議してこいよw
もちろんzipcode
767 :
デフォルトの名無しさん :2007/06/30(土) 22:53:17
760 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 22:38:09 今の大学だろうが、昔の大学だろうが、卒業しても ポインタ理解してない香具師なんかいくらでもいたろ ↑こいつ、大学出ててもポインタを知らないような奴ならでけぇ面が出来る 専門学校卒っぽいな。所詮この程度。しかも自分が分かっていないことを露呈www ↓ 762 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 22:46:44 >実態はメモリ上のアドレスを示すもんだろ あー、判ってないな。 ↑お前ガナーwwwww ポインタはアドレスを示すものだよ。ちゃんと実態を把握しましょうね、専門学校w
768 :
デフォルトの名無しさん :2007/06/30(土) 22:53:41
______ ___ ____ _____ __ ___ /___ / | / / | /__ __/ [][] / / _| |_ / / / / / / ̄ ̄|. l / / / / |_ レ'~ ̄| / /. / / / /. / / | |___ \ \ / /| | / / / / /  ̄ ̄ / \__| \ \ /_ / | |_ / / / / / / ̄ ̄ ̄  ̄ ̄ .|__| \/ / / / / / / / /____. / / / / / / / | / /  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄  ̄
770 :
デフォルトの名無しさん :2007/06/30(土) 22:55:14
>>764 えっ?えええええええええええ!?お前、メモリについても無知か・・・
そもそもコンピュータって、何か演算処理する場合、一度メモリにデータが書き込まれて
それをCPUが読み込んで処理して、場合によってはHDDやその他の記憶装置に
保存する仕組みがあるのは、3流大学の情報系の授業でもやるぞ?w
お前、コンピュータの五大装置とその役割を説明してみろよ?w
あぁあ、お前が低学歴だってのがバレちゃっただけだな・・・たかが count くらいで
偉そうにするから・・・やれやれ。
>>763 × 実態
○ 実体
まーこんな揚げ足取る以前にどうも分かってない気がすんだが。
ポリモーフィズム使いこなそうと思うと曖昧な知識じゃやってけんぞ。
772 :
デフォルトの名無しさん :2007/06/30(土) 22:59:58
>>764 =
>>762 ポインタも知らないくせに大学を出ていてもポインタを知らない奴を持ち出して
自分の方が上だと勘違いする奴がこんなスレで偉そうに知らないくせに
知ったような口を聞いて、答にもならないレスをしていたと い う の か?
頼む、笑いが止まらない、お前は二度とこのスレで質問者にレスするな。邪魔。
いずれ俺がこのスレで主体となってレスするから、それまでにお前はこのスレから離脱しろ?な?
お前にプログラミングは向いてない。なぜなら、プログラムを動作させる
汎用電子計算機について全く理解していないから。
車の運転においても、国によって道路交通法は違う。車の運転(アクセル、ブレーキを踏む程度)
で運転が出来た気になっていて、その国のルールを無視するような運転をする奴に
運転免許なんて与えられないよな。お前はそんな感じでキーボードを叩けるくらいで
コンピュータを使えた気になってしまっていることに気づけ。お前どこの学校卒だ?痛々しい。
773 :
デフォルトの名無しさん :2007/06/30(土) 23:00:23
774 :
デフォルトの名無しさん :2007/06/30(土) 23:01:49
>>771 でた〜〜〜、その程度のことを指摘して、今度は自分は知っていますよアピールですか?wwww
まぁ、変換ミスしたことは認めるけど、それで ポインタ について知らなかったことにはならないからw
あと、何度も言うようだが、C言語ではポインタなんて当たり前のように使っているし、ないと不便。
C言語だろうと、C++だろうと、どちらも汎用電子計算機に計算処理をさせるためのコードの記述を
その実装された仕組みにあわせてすることにはなんら変わりは無い。メモリのアドレスすら
知らない奴が、ポインタについて知っていないと評価するなんてちゃんちゃらおかしいことだw
きちがい、おまえすごいな。 すごいお前がなんで、高卒PG見習いの俺だって知ってるcountの使い方が解らないんだよ。 だから、バカにされたんだぞ。
776 :
デフォルトの名無しさん :2007/06/30(土) 23:04:24
>>774 でた〜〜〜、その程度のことを指摘して、今度は自分は知っていますよアピールですか?wwww
まぁ、変換ミスしたことは認めるみたいだけど、それでポインタについて知ってることにはならないからw
あと、何度も言ってるようだが、C言語ではポインタなんて当たり前のように使っているし、ないと不便。
C言語だろうと、C++だろうと、どちらも汎用電子計算機に計算処理をさせるためのコードの記述を
その実装された仕組みにあわせてすることにはなんら変わりは有る。ポインタすら
知らない奴が、メモリのアドレスについて知っていないと評価するなんてちゃんちゃらおかしいことだw
>>775 countの使い方を知らないのはいいけど、教えてもらっても使い方を検索もできないで、
教えろって暴れるのがどうしようもないっていうか。
778 :
デフォルトの名無しさん :2007/06/30(土) 23:06:18
764 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 22:48:55
>>761 メモリ上のアドレスって何?
このレスにはマジ吹いた。飲んでたジュースを噴出した画面とキーボードと
PC本体がコーラまみれになっちまったぜい!賠償を請求するニダ!
779 :
デフォルトの名無しさん :2007/06/30(土) 23:06:39
>>774 count知らなかったの?ウチの小学生の娘も笑ってますよw
__,. -─-- 、_
, - ' _,´ --──‐- )
,イ´__-___,. -‐ '__,. - '´
`ー----, - ' ´ ̄ `` 、__
__,ィ ヽ. `ヽ.
, '⌒Y / 、ヽ ヽ ヽ.
/ / i /l/|_ハ li l i li ハ
. // 〃 /l i|j_,.//‐'/ lTト l、l j N i |
{イ l / l li //___ リ_lノ lル' lハ. ソ ___◎_r‐ロユ
i| /レ/l l l v'´ ̄ , ´ ̄`イ !| ll,ハ └─‐┐ナ┐┌┘ _ ヘ____
ハ| ll∧ハヽ ト、 '''' r==┐ '''' /l jハ| ll ll /./┌┘└┬┘└┼────┘ロコ┌i
〃 ‖ レ'¨´ヽiへ. _ 、__,ノ ,.イ/|/ ノ ll l| </  ̄L.l ̄ ̄L.lL.! ┌┘|
ll ll { ⌒ヽ_/ } ー‐<.__ ′ l| ‖
‖ ‖ ヽ, /、 〈 |:::::::| `ヽ ‖
‖ {. ハ ヽ Y`‐┴、::::v l ‖
‖ |iヽ{ ヽ_ゾノ‐一’::::ヽ. | ‖
‖ |i:::::`¨´-- :::......:...:.:.::.}| ‖
‖ |i::::::ヽ._:::_:::::::::::::::::::_ノ | ‖
‖ |i::::::::::::i___:::::::::::/ |
jj::::::::r┴-- `ー‐ '⌒ |
〃:::::::マ二 _,ノ
//::::::::::::i ー 一 '´ ̄::.
,','::::::::::::::i::::::::::::::::::::::i::::::ヽ
>>777 悪い、俺、countの質問をした奴じゃないから。いつから俺がcountを質問した奴になったんだ?
俺はレベルは高くないけど一応工学部に所属していたことのある、プログラミングを
趣味で始めた程度のビギナー。分かる?それでも電子計算機について学んできたから
それなりに知識はあるわけ。まぁ、if文とかで使われる式の評価や真偽については
高校でならう命題や集合などの知識があれば出来ないことはないだろうけど
やっぱ大学レベルは必要だなw
ドクロちゃんって小学生だったのか
ドクロちゃんは14才 ザクロちゃんは9才 バベルちゃんは何歳だろう
>>779 countを知っている程度で、知らない奴にそこまで得意気になれるお前って、そうとうレベルが低いんだな・・・
分かるよ。要するにお前はあれだろ?自分が出来ることで、それが出来ない他人を見つけては
俺はすげー!お前よりできる!って自慢しに来る奴だろ?人それぞれ得意不得意はあるし
経験したしないの差はあるけどさ。1つだけ用いてそこまで得意気になれるあんたには脱帽したぜ。
高学歴高収入の奴を目の前にしても、そいつが出来ないことだけを用いて
自分はそいつより優勢だと感じたいんでしょうね・・・哀れ、チーン。
>780 あなたの所属していた工学部では、 全員ポインタをマスターしていたというわけで?
786 :
デフォルトの名無しさん :2007/06/30(土) 23:13:49
>>784 そんな事くらいで得意げになるわけねぇじゃんw
最後に。ポインタの実体はアドレスです。誰かさんが検索しろって言っていたが その検索したどこのサイトを見ても メモリのアドレス について語られています。 ポインタの前で用いられることのある * <これは間接演算子。まさか、ケツ穴だと思った?w
なんだこのスレは
きちがいは大学の工学部に所属していたことあるのか、でも、普通なら卒業したといわないか。 所属だけなら、先生の秘書でも工学部に所属って言わない?
790 :
デフォルトの名無しさん :2007/06/30(土) 23:21:47
ksk
C++覚えたてのキの字が鬼の首を取ったように暴れるスレか。
>>787 いや、掛け算と思った、orz
メモリアドレスでも論理と物理あるだろ
>>787 ネットのヘンな解説ばっかり見てるなよ。
ポインタ=アドレスという知識では、はっきりいって浅い。
>>787 たしかに実体としてはメモリアドレスになっている実装ばかりなんだが、
C/C++の標準規格の文書では、ポインタについての部分でもそれ以外でも、
メモリアドレスという概念には一切言及されていない。
(例外があるとすれば単行&演算子の名称がアドレス演算子ということだが、それも名称だけ)
だからポインタ=アドレスと言うとみんなよってたかってぼこぼこにしてくる。
ああすまん単行ではなく単項ね。わかっているとは思うけど。
メンバ変数ポインタとか明らかにアドレスじゃないよね。
>実態はメモリ上のアドレスを示すもんだろ どうでもいいけど、ここだけ「だろ」って語尾。つまり同意を求めちゃっている。 自信がないことがばればれ。だからもう、後は必死になって取り繕うしかなくなっている。 なんつーか、毎週ご苦労さん。
>>796 みたいに説明という説明をせず、そうではないこともあるとか言って
ポインタそのものが使いこなせているわけでもないのに知ったかぶるからたたかれるんだよ。
何が間違っているかすら説明していないし、本質を説明してないだろ、お前は。
メモリ上のアドレスを知れ
ひとつおりこうになったね。 がんばって、はやくわれわれを「あっ」といわせてください^^
「ハードに近いレベルが基本的なことなんだ」とか勘違いしてそうだな。
>>802 良いのかい?
俺はノンケでも喰っちまう男だぜ?
>>800 何が言いたいんだ?事実だぞ?そういうことでたぶらかして何が楽しい?
んじゃ間違っているなら間違っている点を指摘しろよ?
逆にさぁ、お前らの屁理屈を通したら、ポインタはアドレスを示すものではない?
ってことを正当化させて相手を完全に否定しようとしているとしか思えない。実にきめぇ。
自分のほうがより理解している、知っている!って誇張したいんだろ。
とりあえず検索するなり、ポインタを扱ってみりゃ誰だってわかる。
メモリ上にデータが一時的に書き込まれる、それを参照してプログラムは
演算処理をしている。そんなの大学じゃ普通に習うぞ?
あとな、なんだかんだ言ってもそういう基本原理を人間が都合よく 実装 して
仮想して実際にあるように装っているわけだろ?お前、画面に映った美女を
実際にいるかのように思っているエロゲヲタだろ?ぼくちんの○×ちゃんは
画面に映っているだけの存在じゃない、俺にとっては妻だとかなw
とにかく、お前らしつこいくらい ポインタ について噛み付いてくるくせに
お前らこそポインタについて説明はなんらしていないじゃん。
そういう説明が不適切だ!不適切になることもある、程度しか言えないなら
結局お前らがポインタについて理解していないだけ。
それから、そういう説明をしているサイトや学校に対してお前らは抗議してこい。
そしてお前らの糞な説明をした講義でもしてこいw
結局理解できて無いじゃん。 というか人の話聞いてないな、お前。
>>805 「最後に」といいつつ、見てることは見てるんだな。
ああ、最後にと言ったやつとは別人ってこと?
頼むから、多重継承してるクラスのメンバ関数ポインタとか メンバ変数ポインタとかの構造を理解してから出直してきてくれ。
809 :
知ったかの勝ち逃げパターンw :2007/06/30(土) 23:43:16
800 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 23:35:44
>実態はメモリ上のアドレスを示すもんだろ
どうでもいいけど、ここだけ「だろ」って語尾。つまり同意を求めちゃっている。
自信がないことがばればれ。だからもう、後は必死になって取り繕うしかなくなっている。
自信がないことがばればれ。だからもう、後は必死になって取り繕うしかなくなっている。
自信がないことがばればれ。だからもう、後は必死になって取り繕うしかなくなっている。
自信がないことがばればれ。だからもう、後は必死になって取り繕うしかなくなっている。
自信がないことがばればれ。だからもう、後は必死になって取り繕うしかなくなっている。
自信がないことがばればれ。だからもう、後は必死になって取り繕うしかなくなっている。
お前が必死になってそれは違う、違う、そうじゃな〜〜いって言うだけで
まったく説明が出来てないバカwwww
とりあえず、メモリ上のアドレスを示すものじゃないならそれについて説明を求めまーーすwwww
悪いがポインタについてと、ポインタを扱うとはまた別物だから。
それから、ポインタだけで話をするなよ。言葉そのものが意味するものは pint の名詞 pointer だから。
http://dictionary.goo.ne.jp/search.php?MT=pointer&kind=ej&mode=0&base=1&row=0 何かを指し示すものには変わりはない。電子計算機上においては、メモリのあるアドレスを指し示している
ことには変わりはないんだし。やれやれ、バカに理解させるってのが無理だってことがヨークわかった。
所詮低学歴ってこの程度の屁理屈でしか言い返しができないんだよな。それも正当性のない屁理屈w
811 :
デフォルトの名無しさん :2007/06/30(土) 23:45:34
>>811 「挙げられる。 」だよ。
例として 挙げられてるだけであって、それがすべてじゃない。
お前の知識は、全体集合の中の、よく挙げれられる一部の例だけしかないってこと。
残念だったな。
都合の悪いレスは必死こいて無視する。実にゆとり的。 ん?ひょっとして理解できてないだけだったりするのかな。
#include <iostream> struct A { int a; }; void show(int (A::*mp)) { int* p = reinterpret_cast<int*>(&mp); std::cout << *p << std::endl; } int main() { int (A::*mp1) = &A::a; int (A::*mp2) = NULL; show(mp1); show(mp2); } これ実行してみ。 何て出力されるか? それはメモリ上のアドレスか?
結局チミはだれな訳? 逆ギレしつつもcountを教えてもらった人? 自分で実装してみろ、って言った人?
大学の教育課程でお教授が言ってることなんて うそばっかりだから。だまされるなよ。
817 :
デフォルトの名無しさん :2007/06/30(土) 23:53:57
>>764 メモリのアドレスも知らない奴がポインタを知ったように語る、もはや論外。プギャーはこいつだろw
764 名前:デフォルトの名無しさん 投稿日:2007/06/30(土) 22:48:55
>>761 メモリ上のアドレスって何?
819 :
デフォルトの名無しさん :2007/06/30(土) 23:55:49
>>817 論理アドレスと物理アドレスのどっちなのかって聞いてんだろ。多分。
さっきから暴れてるキの字はさっさとJISのページに行ってC++の規格読んで来い
824 :
デフォルトの名無しさん :2007/07/01(日) 00:00:06
これがわからないならプログラミングなんてやめな>メモリのアドレスも知らん香具師 #include <stdio.h> int main(void) { int *a,b=3; printf("b : %p / %d \n",&b,b); printf("a : %p / %d \n",a,*a); a=&b; printf("a : %p / %d \n",a,*a); return 0; }
>>824 でスレタイも読めないかわいそうな子だということが判明しました。
>>824 いいから
>>814 を実行してみろや。
それとも C++ スレで stdio.h とか書いてるお前には理解できないか?
SegmentationFault(core dumped)
得意がって未初期化のポインタを参照とはね・・・
829 :
デフォルトの名無しさん :2007/07/01(日) 00:04:56
>>823 はぁ?お前今の流れ読めてねーだろ?ポインタの話だろ、ポ・イ・ン・タ。
わかるぅ?ポインタの実体がアドレスだってのはわかっているし
そのアドレスに記録されているデータを参照するのに使われている間接演算子についても
>>824 で証明済み。まぁ、恐らくアホは b の前の & が理解できないだろうけどなw
都合の悪いレスには無反応wwwwwwwwwwwwww
>>824 テストプログラムとは言え
初期化してないポインタで参照するのは感心せんなぁ・・・
ポインタがメモリ上のあるアドレスを指し示していることが理解できない奴がこんなスレで 偉そうに答えにもなっていない答えをレスしていたなんて・・・結局、どこへいっても、 自分より劣る奴を見下したい奴はいるんだね。
>>829 ポインタの実体をアドレスと呼ぶのは確かだが、
それは必ずしもメモリアドレスとは限らない。
もっと抽象化された存在だ。
それは
>>814 で証明済み。
どこに突っ込まれてるのか理解してないようだな。
834 :
デフォルトの名無しさん :2007/07/01(日) 00:08:33
831 名前:デフォルトの名無しさん 投稿日:2007/07/01(日) 00:06:19
>>824 テストプログラムとは言え
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
↑やっちまったな。ポインタについて理解していない証拠が出ました。はいさようならw
>>829 くだらないHPを参考に挙げまくってた流れからすれば妥当だ。
今お前に必要なのは、そこら辺の解説ページではなくC++の規格だよ。
C.で作成した物をgcc.でconpile.をして、 error.出力を出さずに実行で、文字列が変わらずに その後書き換えを試そうとするとcuerser.を移動すると 文字化けが生じる状態はどの様な状態ですか?
世の中ポインタの実装にメモリアドレスを使わないものもあったらしい。
C++ではなくCの話だが、許してくれ。
http://www.kouno.jp/home/c_faq/c5.html#17 > 5.17:
> ヌルポインターに0以外の値を使用するマシンや、
> 異なる型のポイン ターに異なる内部形式を持つマシンは本当に存在するのか
(中略)
> Symbolics社のLISPマシンは、タグ付きアーキテクチャなので、
> そもそもポインターを数値で表すという通常の概念さえ持たない。
> (基本的には、存在しないのハンドル)をCのポインターとして使っている。
ちなみに、最後の行は日本語でおkだが、原文だとこうなっている。
it uses the pair <NIL, 0> (basically a nonexistent <object, offset> handle) as a C null pointer.
>>834 int *a,b=3;
printf("b : %p / %d \n",&b,b);
printf("a : %p / %d \n",a,*a); ←←←←←←←←←←←←←
839 :
デフォルトの名無しさん :2007/07/01(日) 00:10:06
>>831 =
>>833 > どこに突っ込まれてるのか理解してないようだな。
そのままそっくり返します。ポインタについて理解していないのはお前の方。
↓ポインタを数値データと思っていた勘違いの証拠
初期化してないポインタで参照するのは感心せんなぁ・・・
はい、以後放置よろw
>>814 みたいな書き方って今も普通なのか?なんか10年ぐらい前に
みたっきりで今みねーような気がするんだが
>>836 志村ー、スレタイスレタイ。
他所行ってらっしゃい。
>>839 これはひどい・・・
まさかここまで基地外とは。
844 :
デフォルトの名無しさん :2007/07/01(日) 00:11:53
>>834 >int *a,b=3;
>printf("b : %p / %d \n",&b,b);
>printf("a : %p / %d \n",a,*a);
*aを表示させようとしている時点で
どこのアドレスを指し示しているのか未定義。
つまり、定義した時に入っているゴミデータを参照している。
基本的にこういうのは忌避するもんだけど。
int (A *mp1) とか書いたら保守するとき大変じゃね? 1個や2個ならいいけどこれがいっぱいあるとさ...
847 :
デフォルトの名無しさん :2007/07/01(日) 00:13:33
831 名前:デフォルトの名無しさん 投稿日:2007/07/01(日) 00:06:19
>>824 テストプログラムとは言え
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
初期化してないポインタで参照するのは感心せんなぁ・・・
ttp://www9.plala.or.jp/sgwr-t/c/sec10.html ここでもポインタについてアドレスの話が・・・ざわざわざわっ
>>844 人間、抽象的なことより具体的なことのほうが理解しやすいからね。
だからメモリアドレスの話をするのが手っ取り早い。
でもそれは、ポインタを理解するための足がかり。
>>814 改造して遊んでてふと思ったんですが
メンバポインタってクラスの先頭からのオフセットなんでしょうか?
>>845 知っていてわざとやっているに違いないだろ。
汲み取ってあげようよ、その必死な意図を。
>>824 すまん、俺、メモリよくわからんが、お前の言っているメモリは何を言ってる
たとえば、ハードのメモリ(の論理アドレス)なのか?
>>850 運が悪いと落ちることもあるんだがな・・・。
>>849 メンバ変数ポインタはオフセットで実装してある場合が多いだろうね。
だからヌルポインタのビット表現が 0 では困るということで、
ヌルポインタのビット表現が 0 にならない例の 1 つでもある。
「#include <stdio.h>はおまじないです」と比べればまだ高尚な部類で、 趣味グラマとしてはそんくらいの理解で十分だろう。 パソヲタに説明するにはちょうどいいしな。 結局は正しい定義を言われて素直にへぇボタン押さなかった必死な子が悪い訳だけど。
>>849 そういう実装になっていることが多いし、それが率直な実装だと思う(俺の主観だが)。
>>850 今はそういう問題ではないと思ってあげようよ。824がかわいそうだ。
>>846 普通は typedef するだろうけど、
まあこのプログラムでは
ポインタであるということが目立った方がいいんじゃないかな。
>>853 そいつは俺も知らなかったな。
やたら更新頻度高くなってからヲチしていたが
初めて参考になった。今後気を付けるわ。
メンバ変数ポインタと メンバ変数のアドレスを入れられた普通のポインタとは別だかんね。 念のため。
おまいらよ、C++入門スレに来てるキチガイにメンバ変数ポインタの話は酷じゃね
じゃあ、もっと使う可能性の高い 多重継承したクラスのメンバ関数ポインタの話でもするか?
861 :
デフォルトの名無しさん :2007/07/01(日) 00:27:32
もうポインタの話はやめろ。俺が決定的な証拠(原爆)を落としてやるから ポインタについて実体がアドレスということを否定した香具師は反省しろ ↓の実行結果が物語っているものがわからんのなら、マジでプログラミングなんてやめろ。 #include <iostream> using namespace std; int main() { int *a,b=3; cout << "a : " << a <<endl; cout << "*a : " << *a <<endl; cout << "b : " << b <<endl; cout << "&b : " << &b <<endl; a=&b; cout << "after a=&b " <<endl; cout << "a : " << a <<endl; cout << "*a : " << *a <<endl; return 0; }
>>841 それって本当にメンバ変数ポインタ取るために使ってる?
メンバ関数ポインタのために使ってるのがほとんどじゃね?
はいはい、コアダンプコアダンプ。
865 :
デフォルトの名無しさん :2007/07/01(日) 00:29:47
866 :
デフォルトの名無しさん :2007/07/01(日) 00:31:22
>>864 本当にお前がやめろ、痛すぎ。メモリのアドレスすら知らないバカが
電子計算機の基本部分にかかわることを無視して、コードだけしか見えていない
仕組みも知らん奴が口出しするなよ。
861は原爆にしてはインパクトが薄いよな 831みたいな余計なあほを露出させるほどの隙があるというかなんというか
>>862 boost::lambdaで多用するよ。
メンバ変数へのアクセスは基本的にlambda::bindへ
メンバ変数ポインタとインスタンスを渡す形になる。
じゃあメンバ関数ポインタのアドレスと言うかオフセットってどうやってみるんだろう A { void f() {} }; ってのがあったときに void (A::*mfp)(void) = &A::f; ってして これをint型のポインタにして出力しようとしても駄目だった あとstatic void f();の時はメンバポインタすら作れなかった うーんややこしいぜ
>>869 >駄目だった
具体的に書こう。何が駄目だったの?当然static_castじゃ無理だよ。?
>static void f();
普通の関数ポインタしか取れないよ。
呼ぶのにクラスのインスタンス不要なんだから。
ったく、電子計算機の原理についてまったく知らない奴らが得意気にプログラミングについて コードを知っているだけで理解した気になっているのか。もう一度お前らに課題を課す。 汎用電子計算機の五大装置について述べよ。んじゃな、あばよ、下を見て叩くだけしか出来ない 低レベルな香具師ら。
とりあえず、printfの万能性に期待して、 printf("%p %p %p %p\n", &A::f,-1,-1,-1)とか。 (正確には、%pはsizeof(&A::f)/sizeof(void*)個だけ要るけど。)
bind、functionも関数ポインタの悪用・・・もとい応用だな これ使ってその辺にある戻り値voidの関数を悉くスレッドに出来るのが boost::threadライブラリで、こいつを参考にしてATLと上手く連携が取れるwindowAPI版作って見ようと思ってたり
メンバ関数ポインタのサイズって、 多重継承してたら 8 とかになってたりするんだよな。 メモリアドレスにさらに+αが存在してる。
あれか、記憶、演算、入力、出力、制御、とかって奴か。 中学の時に習ったけど、知ってるからどうなのよ、って話だな。
>>874 そこら辺はD&Eとかに書いてありそうだな。持ってる人ヨロ
>>869 メンバ変数へのポインタは整数型へすら変換することができないことになっている。
ただ、extern "C"を使ったり可変長引数を使えばC++コンパイラを出し抜けるはず。
もっとも、メンバ関数へのポインタは、860も少し指摘しているが、
継承やら仮想関数の場合やらを考慮しないといけないので、
大抵普通のポインタよりサイズが大きい場合がある。
静的メンバ変数は、普通の関数と同じで、ただの関数へのポインタになる。
>>871 入力装置、出力装置、演算装置、制御装置、記憶装置だよな。
順番がおかしいかもしれないが。
そんでもってC/C++の標準規格は、電子計算機の原理なんて
どうでもいいようになっているとか言っていい?
VC++ だと仮想継承してると 12 になって、 GCC だと仮想継承してても 8 なんだよな。 最新バージョンではまた違ってるかもしれんが。
演算装置と制御装置の違いって何よ。
ググレ
このせいで、メンバ関数ポインタは void* に渡せないんだよな。 だから、任意のパラメータを取る関数なりなんなりに 直接渡すことはできないんだな。
D&E日本語版にはかかれてないね。 禿が言ってるのは、「昔はメンバ関数ポインタなんかなかった。 ところで、無理矢理、thisを第一引数にとる関数ポインタにキャストして 使ってる香具師がいて、こういうのは禁止させたいから、 あたらしくメンバ関数ポインタってのを作ったよ」 ってだけ。
>>876 メンバへのポインタという説はあるが、実装についての話は特にない。
#include <iostream> extern "C" { struct A { void f(){} static void sf(){} }; } int main() { void (A::*mpf)(void) = &A::f; void (*sf)(void) = &A::sf; std::cout << reinterpret_cast<int*>(mpf); } とりあえずコンパイラ(cl.exe)を出し抜くのは無理でした
>>882 this をレジスタ渡しすることもあるしな。
>>884 俺が考えたのは分割コンパイル。
a.cppでextern "C" void hoge(void (someclass::*)());と宣言して、
b.cppでextern "C" void hoge(long pmf) {}なんて具合に定義するという感じ。
ググった。何だこりゃ。こんなん教えて飯食ってるのかな。 制御 主記憶装置内に保存されているプログラムを読み込み、読み込んだプログラムに従ってコンピュータの各装置に動作を指示します。 演算装置 制御装置の命令に従って、データに対し演算処理などを行います。制御装置と演算装置を合わせて CPU(Central Proccessing Unit: 中央処理装置)といいます。 記憶装置 記憶装置には主記憶装置と補助記憶装置があります。主記憶装置はCPUが読み込むプログラムやデータを保存しておき、 CPUの命令に応じてデータを各装置に送ります。主記憶装置はメインメモリとも呼ばれます。 主記憶装置は大きな容量のデータは保存することができず、またコンピュータの電源を切るとデータは失われてしまいます。 このような主記憶装置の不便なところを補う役割を果たすのが補助記憶装置です。主記憶装置は補助記憶装置に対して、 必要に応じてデータの書き込みまたは読み込みを行います。 (例) メインメモリ、ハードディスク、フロッピーディスクなど 入力装置 主記憶装置にデータを入力するための装置です。 (例) キーボード、マウス、スキャナなど 出力装置 主記憶装置から送られてきたデータを文字や画像として表示する装置です。 (例) ディスプレイ、プリンタなど
ポインタの話はどうでもいいけど #include <stdio.h> ってそんなにダメなの? 「これ書くような奴は頭悪い」とか思われるようなものならやめる
C++ なら cstdio 使う。 この場合、識別子が std 名前空間内に入ってる。
global namespaceに混じるのはありがたくないわな
>>888 PGになってから使ったこと無いような言葉ばかりだな
学生ってそんな言葉で電子計算機の話をしてるのか(電子計算機という言葉も、前に使ったの何時かな)
理想 <cstdio> namespace std { int printf(const char*, ...); //.. } <stdio.h> #include <cstdio> using std::printf; //.. 現実 <stdio.h> int printf(const char*, ...); //.. <cstdio> #include <stdio.h> namespace std { using ::printf; //.. } OTL
stdio.h は C でも使うしねえ。 まあ、神経質に分けてくれてるコンパイラもあるかもしんないよ。
>>887 出来たけどなんか4263941とかおかしい値になった
やり方がおかしいのかなぁ…
>>896 普通のアドレス値じゃね?
おかしい値か?
⊂( ゚д゚ ) ヽ ⊂ ) (⌒)| ダッ 三 `J
まあ、どんな実装があるか分からんし、 cstdio で慣れた方がいいと思うよ。
>>871 今更だけど、このスレにいるような人間は、
電子計算機の原理や五大機能より、チューリングマシンのほうが馴染み深いのかもしれない。
んじゃ、これならおkか?ポインタ”変数”に”格納される値”はアドレスの”番地”とか。 確かにポインタの実体はアドレスってのは不適切とも言えるだろうけど。 ん?もうポインタの話は終わり?そりゃすまんこった
ほら、そこの君、そうそう、君だよ君。ん?自分かって?反応した君が君さ。 マウスのポインタって言ったらどうよ?矢印って言う?そりゃOSが便宜上 矢印の形をしたものをマウスのポインタとして用いているだけであって ポインタって言ったら そこを指し示しているもの であって、さしている場所が実体じゃないよね? そういう説明ならおkか?
ポインタの実体はアドレスだよ。 & だってアドレス演算子って呼ぶし。 でも、メモリアドレスとは限らないけどね。
ちと変か。矢印がマウスのポインタの実体ではなく、指し示すために使っているもの ってか、混乱してきた。ポインタの話すまそ。
>>904 なるほど。それでいこう。スレ違いすまそ。
// test1.cpp struct A { int x; void g(){}; void f(){} }; extern "C" { void hoge(void (A::*)(void)); } int main() { void (A::*mpf)(void) = &A::f; void (A::*mpg)(void) = &A::g; hoge(mpf); hoge(mpg); } // test2.cpp #include <iostream> extern "C" { void hoge(long* pmf) { std::cout << pmf << '\n'; } } で一応いけましたが、オフセットじゃなくて絶対座標が出ちゃいました インスタンスが無いのに?って思ったんですがそもそもどういう形で コードになるかまだよく分からんのでとりあえずおkってことで 助言くれた人tnxc
メンバ関数ポインタは普通に関数のメモリアドレスが入ってることがほとんど。
アドレスの”番地”
TLBの事を言ってるの?
>>909 まずいか?住所の番地って言わない?○○町の3−2−4みたいな
その数字の部分って漢字で表現したんだが・・・
漢字 > 感じ。また茶化されそうな予感・・・やりづらいね、頭の固い?理系?の方々って。
913 :
デフォルトの名無しさん :2007/07/01(日) 02:44:36
俺俺ポインタ: ポインタはアドレスを指しているんだよ その先にあるものシラネ。ひょっとしたら、遠く離れたお前のPCのHDDかもしれんぞ。 覗いたら、お前のプライベートエロ画像丸見えだった。だから、ポインタの実体には注意汁、テヘ
ポインタは、理解出来ているが構造体とか理解出来ていない俺がいる。 ポインタ←間接参照だろう? アドレス云々じゃなくて。 間違っていたらつっこみよろしく。
915 :
デフォルトの名無しさん :2007/07/01(日) 06:27:03
>>914 ポインタは書き換えが可能。
演算も出来る。
ちなみに、間接参照専用の機能が参照という機能ですよ。
>>914 > アドレス云々じゃなくて。
またそれか・・・ポインタが持つ情報はアドレスを示すためのものだろ?
番地が表示されるソースが過去ログに出てるでしょうに。
>>915 ああ、すまんすまん。
書き換え云々もコミで書いとったが、詳しく書いていない俺が悪いな。申し訳ない。。
参照専用機能は知らんかったがいる人にはいるのかもな。
注意すればいいだけのような気もするが。
>>916 へ?意味が解らんというか無意味な議論にならんか?
>>またそれか・・・ポインタが持つ情報はアドレスを示すためのものだろ?
示しただけでは意味が無いんじゃない?
アドレス先の内容を加工出来ないと・・・。
と思うんだが。
>>917 ちなみに参照の利点。
・普通の変数と同じ様に使える(修飾子要らず)。
・ポインタの変わりに参照を引数として渡せる。
・安全性が高い。
そして欠点。
・書き換えが出来ない。
・ポインタとは違うプログラムを書かなければならない(*を外す)。
C++にそんな機能があるとは知らなかった
>>917 > 示しただけでは意味が無いんじゃない?
いや、だから・・・(絶句)。ポインタをどう使うか?ではなくて
ポインタそのものが何か?って話なんだが・・・ OTL
>>920 目的と手段を混同してない?
ポインタがアドレスです。というのは、解ってるし。
それを利用するのも解るけどね。
一応、なんちゃって高級言語なんだからあまり意識しすぎない方がいいと思うんだが。
とりあえず突っ込んでおく。過去ログ嫁。ポインタ変数にはアドレスが入っているってのは 過去ログのソースに参照できるものあり。
>>922 解っている人間に言っているのか、解っていない人間に向かって言っているのか解らん。
924 :
デフォルトの名無しさん :2007/07/01(日) 07:34:43
どちらにしろ、言語仕様の実装は俺達は知る必要は無いんだから、適当にやろうぜ?
>>924 賛成。一応、ふざけていても高級言語なんだから。
ポインタの番地が変わるソースも過去ログにあるやん・・・
914 名前:デフォルトの名無しさん 投稿日:2007/07/01(日) 05:33:53 ポインタは、理解出来ているが構造体とか理解出来ていない俺がいる。 ポインタ←間接参照だろう? アドレス云々じゃなくて。 間違っていたらつっこみよろしく。 ↑こいつわかってないだろ?
わかってなくてもいいじゃん
構造体やクラス理解出来ないのに ポインタだけ理解できる訳無いじゃん
ポインタ=アドレス+型情報だけどな。
ねねね、メンバ変数へのポインタのアドレスって アセンブラだとどうやって表現してるの?
thisからの相対アドレスじゃないの
that
>>927 >>929 ん〜
>>914 だけど、解っているんだから仕方ない。
概念的には、ポインタ内のアドレス先にアクセスする。という事だろう?
それ以上の事は必要な時に覚えればよかんべ。と思っている。
俺の場合、所詮、趣味だしな。
お前誰やねん、914は俺だけど。
俺が真の914です
なんでこの板って ID 出す設定じゃないんだろうな。 出た方が便利だろうに。
習得難易度の問題じゃなくて 密接な関係があるのにポインタだけ理解ってのはねーよ。 ベクトル分かんないが数学マスターしたぜ!、みたいな感じ。 昨晩の害吉程度の知識しか持ってないと思う。
理解して無いけどポインタを使った処理はまぁまぁ使ってる程度でいいじゃんもう 大体そういう細かいところは躓いた時に必死で調べて理解するもんだし 最初からそんな細かいところまでやってたらすぐに挫折するぜ
>>939 >>914 のその一だが。
いや、俺C++を理解したとは書いていないから、勘違いされても困る。
勉強中なんだ。
ポインタは解っている。ほかは、おいおい解るかもしらん。
その程度だって。
>>914 の3ですが参照とかの方をよく使っててポインタあまり使わないから
動的確保した構造体のポインタの動的多次元配列とかされると
頭がパニくってエラー多発させちゃいます
ところで、次スレいる? いや要らないと俺は思っているんだけど。
質問スレと合流ってことで話しついたんじゃないの?
一応改めて書いておかないと、誰か立ててしまうかもと心配になった。
C++でAPIを作成したとして、それをどのように配布したらいいかのガイドラインとかありませんかね?
んなもんねぇ。 強いて言えば糞GPLだけは選ぶなってことだけだな。 あとはいくつか公開されてるライブラリ眺めて ドキュメントの書き方とかまねてみればよし。
>>948 どうもです。
いろいろなライブラリを参考にして真似ようと思います。
C++を捨ててCに書き直す
Cを捨ててC++に生きる
書を捨てて街に出る
仕事を捨て引き篭もる
俺は ソースコードを右からうけて左にバグつきで受け渡す。
>>954 バグは取り除いて右に戻してください、おながいします。
客から来た仕様をPGへ受け流すの歌〜
957 :
デフォルトの名無しさん :2007/07/04(水) 15:43:46
出力が変です どうしたらいいですか?? 空白で改行されます #include <fstream> #include <string> using namespace std; int main(int argc,char *argv[]){ if(argc!=2)return 0; fstream fp(argv[1],ios::in); if(!fp)return 0; string str; while(!fp.eof()){ fp >> str; cout << str<<endl; } return 0;} ●入力ファイル (名詞 (普通名詞 ((読み しめきり)(見出し語 〆切 (しめ切 1.6) (しめきり 1.6))))) ●出力 (名詞 (普通名詞 ((読み しめきり)(見出し語 〆切 (しめ切 1.6) (しめきり 1.6)))))
そりゃ fp >> str; は空白で区切られた文字列を読み込む処理だから当たり前じゃ・・・。 getline(fp, str); みたいなことがしたいの?
959 :
957 :2007/07/04(水) 15:45:33
fp >> str; のところで既に改行されているようです・・・どうしたら
960 :
957 :2007/07/04(水) 15:46:25
>>957 cout << str<<endl; < 志村ー endl endl
962 :
デフォルトの名無しさん :2007/07/04(水) 15:58:59
追加質問なんですが・・三行目でエラーになるようです 実行時にです なぜでしょうか getline(fp, str); i=str.find( "((読み "); str=str.substr( i+7 ); cout << str;
ファイルとプログラムの文字コードが揃ってないとか? i が npos になってないかどうか確認とかした?
964 :
デフォルトの名無しさん :2007/07/04(水) 16:09:47
ここへ貼り付けるため簡略化したら動きました どうしたらいいでしようか? #include <iostream> #include <string> using namespace std; int main(){ string str="(名詞 (普通名詞 ((読み しめきり)(見出し語 〆切 (しめ切 1.6) (しめきり 1.6)))))"; int i=str.find( "((読み "); str=str.substr( i+7 ); cout << str; return 0; }
965 :
デフォルトの名無しさん :2007/07/04(水) 16:13:38
>>963 自己解決しました
出力が何も出ないので、はじめでエラーになっているのかと
おもったら一番最後で-1を返してきてエラーになっていました
解決してるのかどうかよく分からないけど、まあいいや。 とりあえず LISP 風の文法解析したいのなら、 もうちょっと真面目に構文解析の勉強した方がいいと思う。
967 :
デフォルトの名無しさん :2007/07/04(水) 16:49:41
追加です コピペしたファイルだと (名詞 (普通名詞 ((読み しめきり)(見出し語 〆切 (しめ切 1.6) (しめきり 1.6))))) の 読みが検索できるのですが、元々の巨大なファイルだと失敗して-1を返します 文字コードが違うのでしょうか??どう対処したらいいでしょうか??
968 :
デフォルトの名無しさん :2007/07/04(水) 16:53:37
「 ((」をサーチするようにしたら成功しました すみません
読みだけ分かりゃいいの?
970 :
デフォルトの名無しさん :2007/07/04(水) 17:23:31
半角カタカナ、全角カタカナのstring型をすべて全角ひらがなへ変換するにはどうしたらいいですか
971 :
デフォルトの名無しさん :2007/07/04(水) 17:36:36
iccインストールしたんですけどvc++2003.netに統合できないんです。 誰かわかる人いたら教えてください。 お願いします。
973 :
デフォルトの名無しさん :2007/07/04(水) 17:50:37
>>972 ひらがな、カタカナが混じっているやつを一度にひらがなへ変換できるやつはないですか
ほかは知らないが、WindowsならLCMapStringがある。
975 :
デフォルトの名無しさん :2007/07/04(水) 18:05:29
976 :
デフォルトの名無しさん :2007/07/04(水) 19:08:46
>>974 サンクス 出来ました!
#include <iostream>
#include <string>
#include <winnls.h>
#pragma comment(lib, "kernel32.lib")
using namespace std;
string henkan(string text){
int size =text.size()*2+1;
char *s = new char[size];
LCMapString(GetUserDefaultLCID(),LCMAP_FULLWIDTH|LCMAP_HIRAGANA,
text.c_str(), text.size()+1,s,size);
string ss=s;return ss;
}
int main(){
string sr="ヘンカンシテミルヨ ドウナッタヨ???";
cout << henkan(sr)<<"\n";
}
チェックするなら、半角カナでも濁音半濁音入れた方がいいと思うよ。
978 :
デフォルトの名無しさん :2007/07/04(水) 19:17:31
"ベンキョウシテミルオ ドウナッタヨ???" べんきょうしてみるお どうなったよ???
ヴってどうなるんだ?
ヴヴヵヶ
981 :
デフォルトの名無しさん :2007/07/04(水) 19:55:09
たびだひすみません coutで"あ"を10進数で表示させるにはどうしたらいいのでしょうか??
982 :
デフォルトの名無しさん :2007/07/04(水) 20:06:01
これでいいんでしょうか?値がマイナスになるんですが string str="あい"; cout << (char)str[0]+((char)str[1]<<8);
ヒント: unsigned char
えっと、宿題で出たんですけど、まったくわからないんで・・・C言語のプログラムです。 スーパーのレジの処理を行うプログラム。 品物の値段を入力していき、最後に0(ゼロ)を入力すると消費税を加算した金額を表示する。 さらに、預かり金を入力すると、お釣りを表示する。 <出力結果例> いらっしゃいませ XXX←値段を入力 小計=XXX円 XXX←値段を入力 小計=XXX円 0 小計=XXXX円 消費税XX円 合計金額XXXX円 お預かり金額(入力させる) お釣り XXX円(お釣りは1万円何枚、5000円何枚などを表示させる)
985 :
デフォルトの名無しさん :2007/07/04(水) 20:17:19
>>983 順序どおりのはずなのに値が離れています・・これであっているんでしょうか
string str="ぁあ";
cout << (unsigned char)str[0]+((unsigned char)str[1]<<8)<<"\n";
cout << (unsigned char)str[2]+((unsigned char)str[3]<<8)<<"\n";
40834
41090
>>985 ヒント: ビッグエンディアン的に格納されている
987 :
デフォルトの名無しさん :2007/07/04(水) 20:22:44
>>986 こっちにしたに良い具合になりましたよ サンクス!
cout << (unsigned char)str[1]+((unsigned char)str[0]<<8)<<"\n";
cout << (unsigned char)str[3]+((unsigned char)str[2]<<8)<<"\n";
33439
33440
荒らしは止めたまえ
埋めるんなら↓の注意書きを
>>943-945 このスレは質問スレと統合されます
次スレはありません
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。