スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net
木構造のループですか‥やってできないことはないだろうけれどもめんどくさいね goto の連発だね 遅くなったけどideone用に書き換えたコードがこれです
http://ideone.com/nJqdHZ
やりたいことは単に階層構造のテキストデータを読み取って、置換したり変形することです。
Visual StudioでDebugビルドしたものを実行すると、id: 248 とか表示されるあたりでスタックオーバーフローが起きて停止します。
ちょっと調べたところだと再帰→ループへの展開は定番みたいですね。
そっちの方向で考えてみたいと思います。どうもありがとうございます。
(…でも、250程度の数の階層くらい頭を使わずに書いたコードでも動いてくれという気がスル) >>102
こっちのVS2015でも再現しました
スタックサイズ1M(デフォルト)→2Mにしたら動いたけど >>104
Dataのデストラクタ実行後に(暗黙的に)実行されるsubitemsの解放処理 >>105
gcc7.1.0だとdeleteがループ処理になってるな
Clang4.0.0でも同じ
VC2017でもスタックサイズ変更なしで行けた ああ、独り言だしスレ違いだからスルーして。でも、どうしても言いたいし、雑談スレもないから
ここに書かせて。。
俺はC/C++が大好きなんだけど、GtkとかQtとか大好きなんだけど、Pythonが両方バインドしてるから
使ってみたんだけど、import文がある言語(Java、D言語、Python)って脳の向きと逆向きに設計されてね?
すげえ、違和感あって、使ってるとキモくなってくる。その点、include文はいいわ・・。大好き。 JavaとCがそれほど違うようには感じられないけど クラスの構造とかどうしても合わんわ。。あと、普通に文書いてても違和感感じるw >>110
前方宣言自動でやってくれてるって思えば他はCと変わらない気がするけど。
どの辺が違うん? ファイル名に制約がかかる言語なかったっけ?
Java? javaは知らないがCは制約ある
正確にはファイル名じゃなくてincludeで指定する文字列だけど Cのexport文と一対一になってないというだけの話じゃね C#のusingも同じなのかな
やっぱいまいちわからん Cの制約って何だ?
vs2015だが、ファイル名全角スペースでもエラーでない >>114
Javaは何だっけ。。。
publicだかmainのあるクラスと同じファイル名じゃないととか、importの階層と同じだけフォルダ掘らないととかあった希ガス。 C++から3年ほど遠ざかっていた俺に最近のC++の何か凄いテクニックを教えてくれ。 c++1zで使えるようになるvariantとかどうかね
(記述の見掛け上という意味で)継承を使わず 多態を実現できる
現状はboostでお試し可能 >>121
サンキュー
ググってみるわ
もう浦島太郎状態 >>118
vcがそう実装してるだけで、他の処理系も同じようにエラーがでない保証はない
最低限のラインは、8文字+「.」+1文字で英数字のみ、ただし先頭は英字のみ、大文字小文字を区別する保証なし
規格上、inludeの文字列とファイル名が一致するかも定かでないから、気にしても無駄だけど ファイル名に制約という提起で
まさかファイル名や#includeに使えない文字の話になるとは思ってなかった あるアルゴリズムをメソッドとして実装したクラスがあって、
そのアルゴの中で20個くらいの定数を用いる。
そのアルゴリズムの亜種をサブクラスとして作りたいが、その亜種の中では定数の値を親クラスの値とは違う値にしたい。
こういう時、定数群はどうやって定義するのがいいでしょうか。
メンバ変数として全部const intで持っておいて、
コンストラクタの初期化の文法で各クラス固有の値を入れればいいでしょうか。
できれば外部ファイルにjasonとかで持たせられないかとも思ってもいますが、それだとコンストラクタ内のconst intの初期化より先には読み込めないですよね。
浅学で恐縮です。よろしくお願いします。 亜種が定数が違うだけならコンストラクタでええんでない?
アルゴリズムも似てるだけで少し違うとかなら使えんかも知らんけど >>128
定数ではなくメンバ変数でいいじゃないの?
外部から変更されたくないなら読み取りプロパティにすればよいし
亜種はサブクラスのインスタンス作成時にファイルを読み込むようにして
親クラスのメンバ変数を上書きするようにする。 コピーコンストラクタのところでエラーがでます。
>オブジェクトにメンバー 関数 "A::getFileName" と互換性のない型修飾子があります
>C2662 'const std::string &A::getFileName(void)': 'const A' から 'A &' へ 'this' ポインターを変換できません。
どう直せばいいのですか?
class A {
public:
A() {}
A(const A &a) {
this->setFileName(a.getFileName()); //ここでエラー
}
void setFileName(const std::string& fn) {
this->m_fileName = fn;
}
const std::string& getFileName() {
return this->m_fileName;
}
private:
std::string m_fileName;
}; linux mint18 32bit
python3をF5で実行できるエディターは無いでしょうか?
Geany 1.27ではpython2.7なので、python3.5を使用したいと思ってます
PC自体にはpytho3.5と2.7が入ってます >>131
A::getFileNameがconstメンバ関数ではないから
const std::string& getFileName() const { クラスのメンバ関数のポインタはすべてのインスタンスに共通で
例えばvectorに自作クラスを入れといてあとから要素の挿入・削除をして
インスタンスのメモリ上の位置が変わっても関数のポインタは変わらない
って理解であってますか? はい
関数の配置アドレスが実行時に変わるなんてことは起きないので
ちなみに同じインスタンスなのにメモリ上の位置が変わるなんてこともないと思うが Eigenに
operator*
でなくて逆向きかけ算の関数rdotを追加したい
つまり
some_object * eigen_matrix
するために
Eigen::EigenBase<Derived>::rdot
を追加して
eigen_matrix.rdot(some_object);
で計算できるようにしたい
しかし
no member function declared in class
というエラーになる
どうやったら後付けでmember function追加できるんだ?
Eigenの中はいじりたくない 元のクラス定義を変更せずにクラスにメンバ関数を追加することはできない Eigen3の実装みてるんだけど
class Matrix{
operator * const ...
}
でほとんどの関数がconstで統一されてるのに
transposeだけconstついたのと,ついてないの2つあるのは何故? そのほうが便利だ(と作者が思った)からだろう
const版
返されたtransposeはconstで変更不能
非const版
返されたtransposeは変更可能
変更すると間接的に元のmatrixも変更される プログラミング言語C++第4版の本を今頑張って読んでいます。
その中で、サンプルコードは著者のサイトでとURLが乗っているのですが、
これがトップページのURLしか書いてなくてどこからダウンロードできるかわからない状態です。
いろいろ調べたら、グーグルコードのサイトに飛ぶ場所を見かけたのでDLできるかと思いましたが、
グーグルコードは去年の一月には廃止されていて、ダウンロードができない状態です。
ほかにサンプルコードダウンロードできるような場所はあるのでしょうか。
色々と探しても同じような人は見当たりませんし、困っています。
どなたかご存知の方いらっしゃらないでしょうか。 >>144さん
返信ありがとうございます。
ダウンロードばかり気にしていたのかソースというところに気が付きませんでした。お恥ずかしい。
普通にダウンロードできまして、ソースも確認できました。
testingのソースコードが本に書いてあるコードと大体同じように書かれてたのでこれだと思います。
ただ、入門書ってわけじゃないからなのか、洋書だからなのかわかりませんが、
本で書かれているコードだいぶ端折っているなっていう感じなので、正確にこのサンプルで問題ないのかがわからないです。 143,145です。
すいません。145はなんか途中で書き込みをしてしまいました。
話を戻しまして、
でも、問題ないかがわからないのは、本もまだほとんど読めてないのと、C++も入門書を一回軽く読んだ程度の知識しかないので、わからないだけだと思いますので
本(サンプルも)を参考に自分でソースコードを記述していきたいと思います。
>>144さんのおかげで、ソースも手に入り、教えてもらったことで、モチベーションもあがりました(^^♪)
次に進めそうです。本当にありがとうございました。 他の言語結構熟練してたらべつだけど、
cプラにほとんど慣れてない状態で
この本を読んでも効率わるいだけとおもうがねぇ。 C言語の関数ポインタというものは関数ポインタとして作られたのか通常のポインタの改良なのかどちらなのでしょうか?
関数ポインタの引数の仕組みがよく分からなかったので質問してみました
よろしくお願いします 言ってる意味が良くわからないが
ポインタの性質は「型」で決まる
あるデータをどのように見なすか
それだけ
32bitだか64bitだかのデータを、文法上どう見なすかってだけ
関数ポインタの場合は関数のエントリーポイントと見なす
引数の数や種類や呼び出し方などは、型が知っている
型に基づいて呼び出すだけ >>150
極論言えば、配列のポインタも関数のポインタもただのポインタ。
対象が配列だから配列的にも振る舞える。
関数だから関数的にも振る舞える。
ただそれだけやね。
型は配列的とか関数的とかに振る舞う時のルール引数得るのに何回スタックからpushするかとかを教えるヒントにすぎない。
この辺はアセンブラ知ってると理解しやすいかもね。 変数のポインタはint *i;でアドレスだけを保持していて
関数ポインタはint (*func)(int i);でアドレスと引数リストを保持しているように思えます
引数が必要なのは分かりますが(int i)を勝手に付け足しても良いものなのかなと思いまして >>154
関数ポインタは、関数を指すポインタという意味。
引数リストは保持していないが、関数ポインタがポイントしている関数のプロトタイプは
コンパイラなら知ってるかもしれない >>154
何したくて何ききたいのかさっぱりだな
アドレスだけ見せられても、それが変数のアドレスなのか、関数のアドレスなのか、変数なら型は何なのか、関数なら引数あるのかないのか、あるならその型は・・・
アドレスだけじゃ解決できないよ >>154
住所だけ渡されても実際に行ってみたらわかるのと一緒で
ポインタはあくまでアドレスを格納してる
民家なのか病院なのか学校なのかは重要ではない
住所・アドレスの示す先にある情報を利用するだけ int *p;が逆参照したときにintとして扱えるように
int (*p)[10];が逆参照したときに配列として扱えるように
(君の言い分だと↑も[10]を勝手に付け足しているように見えるのかもしれないが)
型というものがあって、コンパイラは型を知っているから正しくアクセスできる
同じように
void (*p)(int i);としたとき、pはintを引数に取る関数のポインタという「型」になるから
その型をもってしてコンパイラは関数を呼び出せる
そう考えれば(int i)が付くのも当たり前、それが必要だからそういう文法になっている
「アクセスするときに必要となる情報を型として与えているのだよ」
特にCの場合は「そう見なしてくれ」という意味合いが強い
キャストして型を変えれば割とどうとでもなる面白い言語
単なるメモリブロックを配列や構造体と見なしてアクセスしたり
こういうことが出来る言語はあまりないので
低レベルでは未だにC系の言語が重宝されている ちなみに
>>157は間違ってるから気にしなくてよいよ
C言語は静的型だから「実際に行かなくても先にあるものが分かる」
というか、先に何があろうが、「型」の示すものがあるものとして扱う
だから、病院の型のポインタに君の家のアドレスを入れたら
君の家に病人が殺到してバグる
キャストしなければそういう代入は出来ないようになっているがな 逆に、C言語は静的型だから、「実際に行ってみても、それが何であるか分からない」
住所に行ってみても、名札も無ければ看板も無いので、それが何なのか分からない
そういった情報は全部メタ的に「型」にしかない
そして型はコンパイル時のコンパイラしか知らない
コンパイル後のコードには型情報は綺麗さっぱり消えてなくなってる
C言語はデータになんであるかを示す型情報が無い
実行時にデータから型を取得することはできない
なんで、関数ポインタの型にはそれを通して関数を呼び出せるだけの情報が必要
そういうことが出来る文法になってる >そして型はコンパイル時のコンパイラしか知らない
あとプログラマとね ありがとうございます
質問が分かりづらかったようですみませんでした
intとして扱えるポインタの型や配列として扱えるポインタの型、関数として扱えるポインタの型と言うようにポインタにも幾つかの型があるんですね
ようやく皆さんの言っていることが分かりました
他にもどんな型があるのか知りたいのですが、こういったことはどこに書いてあるのでしょうか? >>159
あぁ型を除いてあくまで「ポインタ」だけに言及しただけだ
「型に家だの病院だのの情報が含まれている」と言っておけばよかったか >>162
なんか勘違いしてる。
ポインタはポインタが指す先のデータ型をポインタの型と言ってるだけで、
ポインタに根本的に異なる種類があるわけじゃない。
たまに見る「ポインタはアドレスだ」っていうのはそういう意味だけど、
アドレスという言い方は初心者には分かりやすいかもしれないけど
不正確なので、そういうレスは要注意 >>164
アドレス、でいいと思うよ、どんなときに不正確になるの? 日下部さんだね、一連の馬鹿吊り上げの手法はたいしたものだ
彼にかかると面白いように釣れるんだね >>166
void型のポインタに関してはアドレスでいいと思うよ >>166
++演算子使ったときとか
ヌルポインタとか ヌルポはアドレス0を示すポインタと区別が付かない。
ポインタ演算はアドレス計算で間違いないと思うが。 0を示すものに1を加えたとき、1になって欲しいのがアドレス
そうとは限らないのがポインタ なら、そこまで言うなら
アドレスには型が無い、あっても整数型、intptr_tとか
ポインタには型があって、*や->や()を使って指し示すものにアクセスできる
という大いなる違いがある
アドレスを静的型でラップしたものにポインターという名前を付けた、程度 アドレスとポインタは一緒だとおもうよ,ポインタに型がある,とかいうのはCコンパイラ言語仕様側の都合にすぎないし
アドレスの整数値とポインタの表現する整数値が食い違う例(ただし NULL とか far/near はわかっているから除く:−)ってそんなにないんじゃないの? アドレスとポインタは違うと思うけどなあ
アドレスは数値そのもの、ポインタはその入れ物
だから「int型のアドレス」とは言わないし、「ポインタ0x12345678番」とは言わないし >Cコンパイラ言語仕様側の都合にすぎないし
あほだなぁと思うのは、ここで言うポインタというのは
C言語の仕様で定められたポインタのことじゃないのか?
C言語の仕様として「ポインタ」が定められていて
それに関してどうこうって時に
C言語の仕様の都合だから〜とかイミフ
C言語のポインタにC言語の仕様以外の意味なんかないだろ >>180
インクリメントしているのは入れ物の中身では? >>178の例えだと中身はアドレスってことになるが、ポインタのインクリメントは
アドレスのインクリメントとは違うだろう。 「アドレス0x12345678番をインクリメントする」のだから間違いでは無いと思うよ
ただ数値をいくつ増加させるかはポインタの型(つまり入れ物の型)に依存する だからそれがポインタのインクリメントだろう。
わざわざ入れ物だ中身だと意味がよくわからない例えは余計。 >>185
「アドレス0x12345678番をインクリメントする」は、
a=0x12345678で、*a++ ではないか? 何が言いたいのか良く分からないんだが
アドレスとポインタは違うものでポインタはアドレスを入れるものってだけの話だよ
アドレスそのものに型はないがポインタには型がある
ポインタのインクリメントとは、ポインタの型に従ってアドレスをインクリメントする >>188は>>186宛ね
>>187
表現が悪かったね
「アドレスが指すデータをインクリメントする」じゃなくて「アドレスそのものをインクリメントする」だよ
4バイト長のデータなら「アドレス0x12345678番を0x1234567C番にインクリメント(増加)する」 >>176 >>178 >>188 が正しいだろ
ポインタとアドレスをごっちゃにしてる馬鹿は入門書からやり直せ ポインタ型変数がポインタなのか?それに入っているのがポインタなのか?
もしかしたらポインタというのは存在しないのではないか? 何を訳の分からないことを言ってるんだ?
Cの規格書に出てくるんだからあるに決まってるだろ
当たり前だがポインタ型変数に入っているものはポインタだ
多くの処理系で機械語レベルでは単にアドレスというだけ
同じように浮動小数点型変数に入っているものは浮動小数点だ
これも多くの処理系で機械語レベルではIEEEのホゲホゲというだけ >>193
つまり、機械語レベルではアドレスと言うものが、Cではポインタと言われているのか? 基本的にポインタの値は低レベルではアドレス値だけど
機械語レベルではアドレスと言うものがCではポインタと言われているとは限らない 多分、根本的に、型というものが理解できてないんだと思うよ >>195
ちょっと待って。そこをはっきりさせてくれよ。 AならBだけど、BならAとは限らないってだけ
これぐらいは高校の数学で習うだろ
もしくはアップキャストは常に成功するけど
ダウンキャストは成功するかわからない、といったところか char *p のとき、
p はポインタ?それともポインタ型変数?
pに入っているのはポインタ?それともアドレス?
ポインタってどれ? >>199
pは(char)ポインタ型変数で、入っているのは(char)ポインタ値
ポインタ値の実態はアドレスでかつ整数値のことが多いってかそれ以外の環境は見たことも聞いたこともないな