【初心者歓迎】C/C++室 Ver.103【環境依存OK】
レス数が950を超えています。1000を超えると書き込みができなくなります。
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/ >>882
そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話で、クラスの性質による。
コピーできない (コピーすると不整合が起こる) ようなデザインならコピーするなって言うだけじゃなくて
コピー禁止 (コピーコンストラクタの削除) にしておいたほうがうっかりコピーしなくて安全だねってだけの話。 排他主義は当然
低学歴知恵遅れは板から排除するベキ >>883
> そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話
これ、全く尤もだし大事な事だと思うんですけど、判断基準を学校や職場で教えてないんですかね?
メモリが少ない組み込み環境だと選択肢はあるけど、C++でアプリを組むような環境だと、
- シングルトンはコピーしない
- それ以外はコピアブル(ディープコピー)にする
一択だと思うんですが。 >>884
君の辞書には排他主義という単語があるのか? >クラスの中にポインタ変数もつ
これは、pimpl (pointer implement)デザインパターンだろ
pimpl インスタンスの遅延初期化だろ。
こういうのは普通コピーしないし、コピーするとインスタンスを共有して危険になるとか
遅延初期化するようなものは、非同期読み込みとか、何か失敗する可能性が高い、ヤバイもの
1回目は、ファイルから読み込んで、2回目は、キャッシュから読み込むとか、挙動が変わったり
pimpl を使っていれば、普通と違うから、ヤバイと思っておいた方がよい。
pimpl を使うには、何か理由がある >>885
原則としてはその意見は正しいと思う。
特別な理由がない限りコピーは出来るべきだ。
その上でコピー可能にするための手間と使い勝手のトレードオフ、
要するに「割に合うか」という判断は実務的なことだから、一律には言えないと思う。
コピー可能に出来るけど、コピーする箇所が一個もなかったわっていうような結末だって
有りうるだろうし。
そういう見極めに簡単な基準を設けられるのなら苦労はないわ。 >>887
pimplはAPIと実装を切り離して抽象化するためのもんだから、遅延とかキャッシュとか
実装詳細が関係しちゃいけないんじゃないですかね。
例えばマルチエージェントシミュレーションとかで、個々のエンティティの実装をpimplで隠した上に、
エンティティの複製は普通にやりますし。 >>888
> コピーする箇所が一個もなかったわ
あっそうかっ >>888
> そういう見極めに簡単な基準を設けられるのなら苦労はないわ。
私は古い教育しか受けてないので、過去については全く同感なんですが、
最近はもっと抽象化してるんじゃないかな、と思ったんですよ。 今はmoveがあるからとりあえずコピー禁止で作るな。
複製したオブジェクトが必要になる機会はあんまりない気がする。
vectorに突っ込んで連続したメモリに割り当てたいときとかかな。 >>892
read-copy-updateとか、マルチスレッディングで使うんですよ。
(スレッド間で同じ領域にアクセスすると、誰かが書き込むときにロックが掛かるから、
ポインタの参照先もコピーしてしまった方が良い) pimpl は、DI(dependency injection)でも使うか >>892
私も>>888で言われるまで気付かなかったんですけど、個々のエンティティはコピーしても
シミュレーション系全体をコピーする、とか、大きなオブジェクトをコピーするときって確かに無いですよね。
むしろ万一コードが走ったらレスポンスが遅くなるから禁止すべき。 でかいオブジェクトはコピーじゃなくてデータベースに入れてリビジョン管理するべきだよな >>891
コピーコンストラクタって言語機能があるから勘違いしがちだけど
コピーってオブジェクト指向一般的に言えば全くもって汎用的な処理じゃないんだよね
むしろ無理にコピー可を要求するとおかしくなったりパフォーマンスに悪影響することの方が多いぐらいだ
だから、C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
なんでまあ、基本的にはコピーはサポートしなくていい
そのクラスの要件としてコピーのサポートが必須だとはっきり分かったときだけサポートすりゃいい >>898
>C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
それはクラスは問答無用でヒープに置くことに統一した結果なのでは? C#には構造体があるがそれもコピーコンストラクタなどサポートしてないね
オブジェクト指向にはほとんど不要だから IClonableが用意されているのはそれが必要だと判断されたからだわな >>897
循環参照や並行処理や、今や制限しか思い浮かばない…… コピーコンストラクタなんて使ったことないよ
関数の引数も構造体はポインタで渡すべきだし、関数からの返り値も構造体で返すべきではない
あんなのは使うべきではない あるクラスのオブジェクトを静的/動的に確保した場合の互いのメンバ関数処理速度の差ってどれくらいなもんですかね
処理の規模にもよるのですか? 今プログラミング言語C++4第四版読んでるのですが、中級者なのですが1ページから読んでます
テンプレートはあまり使ったことがなく、テンプレートの章を読んでいるのですが理解出来ているのか出来ていないのか分かりません
皆さんこの本はどんな感じで読みましたか? テンプレートは大分前に読んだが、ぜんぜんスマートだとは思わんかったしプログラムもでかくなりそうだったし
くだらねえと思って、読むのやめたよ。 別に使わなくてもプログラム出来るしな ID:lehzCciN
ID:jIxWA8zR
ちょっとだまってて テンプレートは書くのはちょっと難しいというかアレだが
使うのは簡単だから、まずstd::vectorとか使ってみれば?便利だから
使い方が分かれば作り方もわかるようになるだろう
あとコピーの話でもめてたようだが、オブジェクトのコピーはC++の特徴だからなぁ
C言語からのもので、構造体が値型と同じようにコピーできるっていう
そのおかげでスタックにオブジェクトを確保してRAIIが出来るまぁこれも特徴的だわ
一方で配列が=でコピーできないのもC言語からのもので
構造体より配列の方が他の言語で言うところのオブジェクトと似たような仕様になってるw
参照するとポインタに格下げになるのもJavaやC#のオブジェクトと一緒だね もしC言語の構造体が配列の仕様と同じように
アクセスしようとするとポインタに格下げになってコピーできない仕様だったのなら
C++のクラスはもうちょっとモダンな仕様になってたかもしれないよね
値渡し出来ないからコピーの事を考えなくてもよいし
GCないからキツイか >>911
> 使い方が分かれば作り方もわかるようになるだろう
コンパイラの使い方が分かっても作り方が分かるやつはそんなに多くないが… その場合でも、例えばC言語のコンパイラを作りたいとき
C言語の使い方を理解せずにC言語のコンパイラを作るより
C言語の使い方を学習してからC言語のコンパイラを作る方が
賢明だろ >>906
性的・童貞的の差異よりも仮性・真性の差異を問題にすべきかと >>909
lisp のマクロとC++のテンプレートとは、どっちの方がイケてますか? >>911
>配列が=でコピーできないのもC言語からのもので
私はときどき夢想します、配列が=でコピーできたとしたら、どんな世界観がふりかかってくるのでしょうか? >>917
もしそうなら、配列のサイズの情報が関数プロトタイプに付属していただろう。 >>915
訂正します
静的・動的の差異よりも仮想か非仮想かを問題にすべきかと思います >>918
実体化を明示すれば書けるよ
使う奴を全部列挙しなきゃならないけど、ロジックを共用できるのは大きい #include <stdi.h>
int main(void)
{
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
printf(" %2d", i * j);
}
printf("\n");
}
return 0;
}
あるサイトを参考に
簡単な九九の表を作ると
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15...
...
...
(略)
このようになると思いますが、
隣の数字を参照にして足して
3 5 7 9 11 13 15 17
6 10 14 18 22 26 30 34
9 15 21 27 33...
...
...
(略)
と、表示するには上記のサイトの様なプログラムをどのようにすれば良いのでしょうか?
宜しくお願いします。 >>924
別スレにも書き込んでたけどそっちでは相手にされてなかったね。
上記サイトと書いておいて、そのサイトが抜け落ちてるよ。コピペしたなら推敲もしような。
やりたいことは i*j+i*(j+1)を出力するということか? :-) 等、海外の顔文字(横向きver)
:-P でワンセットよ :-P
でひとつだよ。
頭を左に倒して無心になって見る。 この手の表現はネット検索でも探しにくいからなぁ。
検索ワードに含めることができない文字を使ってるかも知れんし。
Wikipedia で「顔文字」の「欧米型の顔文字」に例示されてるね。
P は大文字が普通なのか。小文字 p だと思ってたわ(てへぺろ)。 こないだTWITTERで orz の話題が流れてたわ。
「絵文字があるのにそういうので遊んでたんですね!」 → 「無かったんだよ (#^ω^)ピキピキ」 全くの素人なんだがスタックサイズ以上の巨大なクラスをローカル変数として宣言したら即オバーフロー起こす? まともなOSなら。
でもOSのない環境もあるし未定義。 スタックサイズのオーバーフローって普通、いちいちサイズ確認しながらエラー判断じゃなくて、
割り込み処理でやってるんだろ 環境依存
個々の話をしたいなら
> そのような質問は必ず環境を書きましょう 宣言しただけでアクセスもせず関数も呼ばないなら、
エラーにならないのがほとんどかもな。 自動変数を宣言しただけで使わないなら
最適化で消えちゃうこともあるかもな。 ああ、C++の標準ライブラリにLISPインタプリタが入らぬかのう…… TinySchemeのカスタムインタプリタ作った時、例外の扱いやら引数チェックやら面倒で面倒で。
どうせみんなやってるんだから、標準のAPIがあれば車輪の再発明をせずにすむのに。 #include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main(void)
{
string str;
getline(cin, str);
//cin >> str;
transform(str.begin(), str.end(), str.begin(), toupper);
cout << str << endl;
return 0;
}
このコードの「getline(cin, str);」と「cin >> str;」と「cout <<」
の部分にエラーが出るのですが何が原因かわかりますか?
別個にstd::を付けてもだめでした。解かる方いましたらよろしくお願いします。 GNU の公式なアプリケーション拡張用言語は Guile >>943
#include <string.h>
→#include <string> >>943
toupper は <locale> にある関数テンプレートと、 <cctype> に普通の関数がある。
どれだかわかんなくて混乱している。
toupper を [](char ch){return std::toupper(ch);} という風にラムダ式でくるむのが一番楽な方法だと思う。 > Guile
Cygwinの中じゃなきゃ動かないじゃないですかw
WindowsのGUIアプリのカスタマイズに入用だったんですよ。 >>947
Windows だけでいいなら、
言語処理系を組込んでしまうよりはインターフェイスを COM にしておいて
適当な (OLE オートメーションに対応した) 言語を使ってもらう方が簡単かも。 >>945
コンパイル通りましたありがとうございます!
>>946
レスありがとうございます。ラムダはC#のをちょっとかじったくらいなのでよくわからないです。 >>947
v8でjavascriptは?
自作アプリに組み込んでるけどwindows環境でも簡単に導入できる。 Windows なら WSH がすごく良い仕組みなので、
その枠組みをぜひ活用して欲しいと思ってる。 今は日本語や漢字にとどまらず、Unicodeで許されるあらゆる言語の文字を使ってるから、表現性はとても豊か(何がだ) [](){}と括弧揃い踏みなところがラムダ式の素晴らしいところ
キャプチャの必要性が分かるまで15時間も掛かった >>950>>951
今思えば全く勉強不足だった...
階層的データ構造(CADとか)はS式と思い込んでいたのよ #include <iostream>
#include <string>
using namespace std;
int main(void)
{
string x;
cin >> x;
for (int i = 0; i != x.size() - 1; ++i)
{
cout << stoi(x[i]) << endl;
}
} ⬆が動かないのですがどこが間違っているのかご教示下さい
C11は対応しています iはsize_t型にする。
文字コードや整数値に対しては、stoiは使えない。別の関数を使う必要がある。 >>957
念のために確認するけど C11 って書いてるのは C++11 の間違いだよね? >>956 が動かないってのはコンパイルエラーということだよね。
string x; だから x[i] の型は char で、
一方 stoi() が要求する引数は string であるからして... こういうことをしたいのではないか?
ここを cout << stoi(x[i]) << endl;
こうする cout << (isdigit(x[i])? x[i] - '0': 0) << endl; クラスの中の宣言部分で
var a = new classA(32);
がある時にこの生成時間を測るには
p1out = 1;
var a = new classA(32);
p1out = 0;
ってやってP1.1をオシロで確認したらいいのだろうか? スタック領域に確保した変数のメモリはその変数のスコープ終了時に開放される
静的領域はスコープが終了しても開放されない だがちょっとまってほしい
本当にそれだけだろうか? 静的領域は、アプリの実行前に確保する。
サイズも変動しない
スタック領域は、アプリの実行中に確保・解放する。
サイズも変動するし、領域を使い果たすと、stack overflow というエラーが起きる
事前にサイズがわからず、サイズが変動して、エラーが起きる可能性もあるので、
組み込み制御装置では、制限される事もある スタックの理解はCPUの動作原理から学んでいくとわかりやすいよ 組込だとスタック4つまでとかあるね。
下手に関数の中で関数呼び出し出来ない。
今はだいぶ緩和されてるけど、数が増えただけでPCほど緩くはない。 int num;
unordered_set<int> ust;
auto itr = ust.find(num);
itr == ust.end() ? ust.insert(num) : ust.erase(num);
とすると、
error: operands to ?: have different types
というエラーがでます
三項間演算子を使わずにif文を使って書くと普通に上手く行くのですが、なぜエラーがでるのでしょうか この前パソコンで100回くらいの再帰を書いたけど大丈夫だった
それともgccがよしなにやってんの? >>971
insertとeraseの戻り値の型が違うんじゃね? 三項演算子が絡んだ式の (条件 ? 値A : 値B) 部分で
値Aと値Bの型が異なると、三項式(と言う呼び方で良いものか)全体としての
結果の型が確定しないからダメって感じかねぇ。
どうせ値を使っていない式文だからいいじゃん、は通らないと。 >>974
そうだね。
値A、値Bともに(void)でキャストすればコンパイルできた気がする。
そんなことするくらいなら素直にif/elseにすべきだけど。 条件A ? (値A, 0) : (値B, 0)
とか?
if で良いだろ スタック領域は同じコンパイラでもオプションで変えられる事も多い(組み込みには言及しない)
末尾再帰だとループに展開されたりもするから(外から見た挙動が同じならC/C++はコンパイル後の表現を縛らない)、再帰イコールしぬとは限らない そう言えばC++20では[ , ]って形は多次元配列のために使われるんだな 型の違いでっていうのも判るが
結局評価だけして代入しないなら
(副作用を期待しないって条件付きだが)
最適化で消される行かも知れんな https://ideone.com/pUrvlb
VisualStudioCommunity2017 ver15.9.4でこのコードをビルドすると
「error C2440: '<function-style-cast>': 'int' から 'Lit' に変換できません。」
というエラーが10行目で出るんだけど、何が悪いんだろうか。 Parser() { reg(Lit{ 1 }); } → Parser() { ::reg(Lit{ 1 }); }
コレでいける
理由は知らん レス数が950を超えています。1000を超えると書き込みができなくなります。