X



【初心者歓迎】C/C++室 Ver.105【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0081デフォルトの名無しさん
垢版 |
2019/06/19(水) 08:25:58.04ID:huda4IDC
>>76
>>77
下位割り込みのリードが一命令で完了するなら「リードの途中でライト」が発生しないので割り込み禁止しなくていいということですか?
例えばリードライトの対象が配列なら割り込み禁止要、変数単体なら不要
0082デフォルトの名無しさん
垢版 |
2019/06/19(水) 09:03:32.83ID:bPRT+MIA
>>81
アセンブラ確認してほんとに一命令なら良いけどそうじゃないなら結局危険じゃない?
Cで1行だからアセンブラでも一命令とはかぎらんよ
0084デフォルトの名無しさん
垢版 |
2019/06/19(水) 09:22:03.41ID:RukLP400
たとえ1命令でも安全かどうかはcpuによる
あいまいな質問にはあいまいな回答しか返らない
マニュアル読むのが正解
0085デフォルトの名無しさん
垢版 |
2019/06/19(水) 09:54:17.80ID:huda4IDC
>>82
なるほど。極端な例ですがcでword変数への代入処理一行だったとしてもアセンブラでは上位バイト、下位バイトを分けて代入してるかもしれませんもんね。

>>83
そうです。

>>84
アセンブラで一命令でもまずい場合ありますか?例えでもよいのでご教授頂けたら助かります。
0086デフォルトの名無しさん
垢版 |
2019/06/19(水) 11:34:02.00ID:kjBiA8ae
vector<std::vector<char> > vec;
の二次元配列で、一行を削除するのはどうしたらよいのでしょうか。

int row = 1;
vec.erase(vec.begin() + row );
ではだめなんでしょうか。
0087デフォルトの名無しさん
垢版 |
2019/06/19(水) 11:40:44.36ID:kjBiA8ae
すみません。これでちゃんと動きました。
お騒がせしました。
0089デフォルトの名無しさん
垢版 |
2019/06/19(水) 20:53:07.15ID:RukLP400
>>85
だから一般論で答えられないって言ってんの
使ってるcpuのマニュアル読め
書いてあるから
0090デフォルトの名無しさん
垢版 |
2019/06/19(水) 23:49:00.15ID:v2+76oWz
>>79
>>80
回答ありがとう。
そもそもaddress-of演算子でIndex 0番を指定してるのに アドレス値じゃなくて 文字が出てくることが混乱の元だった。

char型については>> 演算子がオーバーロードされててc-stringとして解釈される。
実際のアドレスを出力したい時は
cout << (void *)&str[1]; とする
って感じでいいのかな?
0091デフォルトの名無しさん
垢版 |
2019/06/23(日) 01:18:33.15ID:X4lwQ0L+
学校の課題でバブルソートアルゴリズムを使った画像処理の課題で、VSの警告にfor-loopの定義が無効です:最初の条件はテストを満たしていません。ループボディは実行されませんと出てきます。これはどういった原因で出てくる警告なのか教えほしいです
0096デフォルトの名無しさん
垢版 |
2019/06/24(月) 06:51:52.73ID:lwUqObiG
FILE* file;
file=fopen("test.txt","w");
fclose(file);

これでソリューションのフォルダ内にtest.txtファイルが作られると読んでる入門書には書いてあるのですが
VisualStudioのフォルダ内、何処を探しても生成されてません;何処に有るのでしょうか?
0100デフォルトの名無しさん
垢版 |
2019/06/26(水) 01:39:16.88ID:6WTwK8fu
STLコンテナ「set」の特定要素を削除したいとき

set<int> s = {1,2,3};
for (auto itr = s.begin(); itr != s.end(); ++itr) {
cout << *itr << endl;
if (*itr == 2) s.erase(itr);
}

これの実行結果が
1
2
1
3
となるのですが、erase後に最初に戻っているように見えるのは偶然、つまり不定の動作ですか?
なお、正しいイタレータの使い方は以下のようになるのは承知してます

for (auto itr = s.begin(); itr != s.end(); ) {
cout << *itr << endl;
if (*itr == 2) itr = s.erase(itr);
else ++itr;
}
0101デフォルトの名無しさん
垢版 |
2019/06/26(水) 07:52:05.91ID:Re4GWmuT
>>100
erase で無効になったイテレータの使用により動作は未定義となります。
そのコードの場合は erase 直後にくるループ条件にある比較時点で。
0104デフォルトの名無しさん
垢版 |
2019/06/26(水) 14:50:08.20ID:7raG/MY1
未定義動作を起こしてるんで
プログラムがたまたまクラッシュもせずに最後まで動いたというレベルからの偶然
0106デフォルトの名無しさん
垢版 |
2019/06/28(金) 01:54:12.27ID:kYWVUvHS
constを外すのに使う const_cast<T&>(t) ですが、Tをいちいち書くのが面倒なので
そうだdecltypeを使えば楽できると思ったものの、remove_constも併用しないといけないみたいですね
参照だったらさらにremove_referenceも必要で、これじゃTがくっそ長くない限り有り難みが薄いですね
なんかもっといいやり方ないですかね?

const int i = 0;
const_cast<remove_const<decltype(i)>::type&>(i) = 1

const int& j = i;
const_cast<remove_const<remove_reference<decltype(j)>::type>::type&>(j) = 2;
0108デフォルトの名無しさん
垢版 |
2019/06/28(金) 02:11:51.51ID:4VImPalK
const_cast<decay_t<decltype(i)>&>(i)
で大体事足りる

まあ大抵は
using U=decay_t<...>;
とかしておくが
0110デフォルトの名無しさん
垢版 |
2019/06/28(金) 18:20:06.99ID:SuTGhcfs
作りたいものにC++が必要なので1から学んでるプログラミング初心者です

biginteger という型の使い方・使い道がよくわからず悩んでいます。
0111デフォルトの名無しさん
垢版 |
2019/06/28(金) 21:15:56.74ID:+JSlLfql
C/C++の標準にそんな型ないよ
C#にBigIntegerあるみたいだね
使い方は普通の整数型と同じ
使い道は、大きな整数を扱いたい時

使い道がわからないものを無理に使う必要ないんじゃね?
0114110
垢版 |
2019/06/29(土) 19:00:51.29ID:gqtgvd1f
標準の型じゃなくて読み込んでるライブラリ?のクラスだったみたいです
そっちのマニュアルを見て見たら詳しく書いてありました…
いろいろ教えていただきありがとうございました。
0115デフォルトの名無しさん
垢版 |
2019/07/24(水) 09:52:41.24ID:0j2752sC
オブジェクト指向を使ってないアプリを c++ (コンパイラはg++6)で作るのは良でしょうか?それとも推奨されないでしょうか?

当方、意図せずにそうなってしまいました。
Cで書いてるつもりだったのですが、Cでは認められないと知らずにブロック頭以外の所での変数の宣言などを使っていて、
エラーにならなかったのは、Makefile が c++
用の流用で、ソースの拡張子が.cc だったからでした。

こんな c++ コンパイラの使い方は、許される事なのか、良くある事なのか気になりました。
0116デフォルトの名無しさん
垢版 |
2019/07/24(水) 10:00:57.54ID:zKJbgf3R
Cで書いてるつもりがC++になってた、は良くはないけど別に気にすることじゃないかと
Cであることが要件ならCに直せばいいし、C++でもokならそれでもいいし
要件満たすものが出来てんならひとまずokじゃない?
0118115
垢版 |
2019/07/24(水) 12:47:15.91ID:qoUieyoj
>>116 どうもです。
ひとまず動いてるのですが、気になりました。

例えば、「完全にcで書いていてcでコンパイル出来るものでも、c++ 必要なものでも、どちらにも拡張子は .cc に統一して、どちらにも常にコンパイラは c++ を使う」と言う態度ってどうでしょう?
c++ が c の上位互換ならこれで良いように思えます。
0119115
垢版 |
2019/07/24(水) 12:48:43.68ID:qoUieyoj
>>117
そうなのですか?
私の見た情報が古かったのですかね。
0120デフォルトの名無しさん
垢版 |
2019/07/24(水) 13:31:50.28ID:zKJbgf3R
>>118
いや、プログラムってそもそも道具なんだから何で書かれてるかとかどうでもいいかと
複数人で開発していて他人もコードを見ることがある、技術情報として発信する、要件として言語の指定がある
とかいう縛りがあるならその縛りに応じるようにコードを書き直せば良い
個人的にはCでなければ困るというのでなければC++にするし、多少の困りくらいなら回避してC++にする
基本的にC++はCの上位互換
0121115
垢版 |
2019/07/24(水) 20:52:46.78ID:qoUieyoj
私が知りたかったのは、ソースを書くのに何言語を選ぶべきか、でははないです。
知りたかったのは、例えば、
「ソースが c -> gcc 。ソースが c++ -> g++」
をしないで
「一切合切どちらも常に g++ 」でも良いのか?でした。
0122デフォルトの名無しさん
垢版 |
2019/07/24(水) 21:07:11.23ID:0jLIOgkf
>>121
ダメです。兄弟はもう袂を分かちました。
30年前の仕様しか使わないと心に決めているならお好きに…
0123115
垢版 |
2019/07/24(水) 22:28:11.62ID:tRuObC3H
>>122
>>121
>ダメです。兄弟はもう袂を分かちました。
>30年前の仕様しか使わないと心に決めているならお好きに…

どうもです。そうなのですね。
「一切合切 gcc 」はダメでも「一切合切 g++ 」なら大丈夫かと思ってしまいました。
なにぶん始めたばかりでして、この辺りの常識がないのです。
0124デフォルトの名無しさん
垢版 |
2019/07/24(水) 23:59:42.77ID:7wBUx5ir
良い悪いじゃないけど
実質的にCのプログラムでしかないなら純粋なCのプログラムとして書き直して
Cコンパイラとの組み合わせで使っていた方が幸せだと思うよ
0125115
垢版 |
2019/07/25(木) 13:26:54.50ID:A3AJFf0Q
その方がサイズも小さく速度も速いですかね。
トライしてみます。
0126デフォルトの名無しさん
垢版 |
2019/07/27(土) 08:53:41.05ID:zR8v2AWF
>>125
ブロック変数宣言の位置だけがブロックの冒頭ではないというだけなら、通常、
速度低下は全く無く、それをブロックの冒頭に書き直しても速くなることは
有りません。

また、コンストラクタ、デストラクタ、仮想関数、STL、コンテナなどを使わない限り
通常、C++がCより遅くなるということは有りません。
0128デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:51:14.97ID:DMRdHfR+
これからC++勉強しようと思うのですが、
開発環境は何を入れるのがおすすめですか?

Visual Studio Communityが無料で良いのでしょうか
他におすすめあれば御紹介願います

あと、C++勉強に当たっておすすめ定番の本あれば
ご教示ください
0129デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:55:30.85ID:vqN4pUkV
今時ならUbuntu入れてatomなりvs codeなり入れりゃいいんじゃないかな
純粋にc++の勉強したいなら

VCは独自仕様が酷すぎるから言語学習には不向き
0130デフォルトの名無しさん
垢版 |
2019/08/05(月) 23:01:28.37ID:nblSLoEW
VCの独自仕様が気に入らんのならVS2019で対応したLLVMツールセットを使えばいい
初心者にIDEなしはモチベ維持が困難
0131デフォルトの名無しさん
垢版 |
2019/08/05(月) 23:18:05.24ID:f20npl5p
独自仕様ならGCC、未実装ならVCってかんじだがどちらも独自仕様はオプションで制御できる
まあWindows環境でやるならVisualStudio使わないのはマゾ

おすすめできる定番の本についてはどれも一長一短だし
テンプレートの利用くらいまで扱ってればとりあえずなんでもいいと思う
0132デフォルトの名無しさん
垢版 |
2019/08/05(月) 23:29:17.63ID:vqN4pUkV
vcのは独自と言っても、なぜかコンパイルが通らない
なぜかコンパイルが通る
なぜかリンクエラーが起こる
みたいなあまり明文化されていないのだから面倒
structとclassがリンカで別物ってのは酷すぎる
0135デフォルトの名無しさん
垢版 |
2019/08/06(火) 00:52:13.35ID:pONItBAd
コマンドライン引数ってのが何を出来るものなのか全く分からないのですが、何が出来るものなんでしょうか?
書き方はまー分かったんですけど、空のメモ帳をドラッグ&ドロップすると意味あるみたいなこと書いてあるけど何も起こりません…

使用環境Visualstudio2019 で見ているサイトhttp:ああwisdom.sakura.ne.jpあprogramming/c/c32.htmlです
0136デフォルトの名無しさん
垢版 |
2019/08/06(火) 11:26:59.34ID:qIlFvc4N
std::optionalが内部に値を保持する仕組みについてお聞きしたいことがあります
現在いくつかのサイトを巡り、値を保持するためにstd::aligned_storageで確保した領域に配置構文newで値を書き込んでいることがわかりました
このaligned_storageを使った場合に、std::vectorなどのサイズが可変な値が格納されるとどういった挙動になるのでしょうか
vectorの要素数が増えてサイズが大きくなると、alinged_storageで確保したサイズを超えてしまったりしないのでしょうか
0137デフォルトの名無しさん
垢版 |
2019/08/06(火) 14:04:02.23ID:AX25/xXa
根本的な部分の理解が足りていない気がするが直接の答えとしてはvectorのサイズは増えないので問題ない。
vectorが管理しているバッファのサイズは増える。
vectorはポインタを持っているだけ。
0139デフォルトの名無しさん
垢版 |
2019/08/07(水) 00:38:52.58ID:pFHPYbJE
VS2019でchar* name="ABC"みたいにやると
cont char*値を使用してchar*のエンティティを初期化することはできません。とエラーが出るんですけど
どうしたら実行できます?
ググったらcharの前にconst付けると直るみたいですけどこの例だと治りませんでした
http://ideone.com/YyFypJ
0141デフォルトの名無しさん
垢版 |
2019/08/07(水) 04:58:05.08ID:pFHPYbJE
>>140
それはやったんですけど出来ませんでした
paizaとかはconstとか付けなくても付けても出来ましたけどVSでは出来ないのでしょうか?
0146デフォルトの名無しさん
垢版 |
2019/08/07(水) 10:45:14.88ID:9Ff0DYo3
>>139
C/C++の言語仕様的には
const char *name="ABC";
で行ける可能性は高いんですが、分かりやすさのためには、
static const char szName[] ="ABC";  // szName[4] という配列を "ABC",0 で初期化。
const char *name =&szName[0];
とするものお勧めです。
0147デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:36:34.89ID:Io4EJaZl
少なくとも>>139のリンクにあるコードはchar*にリテラルを入れようとしてるのでNG
constをつけても駄目なのは生成後に代入しようとしてるから
てか意味もなくグローバルスコープの構造体とかやめろ
0148デフォルトの名無しさん
垢版 |
2019/08/07(水) 17:26:37.26ID:Io4EJaZl
あと特に理由がないなら文字列はstd::stringを使うべき
C言語じゃないんだから
0150デフォルトの名無しさん
垢版 |
2019/08/08(木) 08:01:13.41ID:kZ+216R/
>>147
構造体メンバに
const char *name;
と書いていて、構造体を生成後に後から name メンバに
Cの文字列リテラルの先頭アドレスを代入することは、
C/C++の言語仕様的にはいけるはずです。
なぜなら、xxx.name のように書いた場合、コンパイラの内部的には
const char* 型の左辺値(代入先)が有るのと同じように扱われるので、
ローカル変数に const char *aaa; aaa = "xxx"; と書いた場合と変わらなく
なるはずですから、C/C++ の言語仕様的には。
0151デフォルトの名無しさん
垢版 |
2019/08/08(木) 16:00:04.26ID:uMVCdDWb
独自のクラスに比較演算子==を実装する時、クラス内に定義するのとグローバルで定義するのとでは、実装の仕方以外に違いがあるのでしょうか?

また、例えば独自クラスとintの比較演算子==を実装する場合は、左辺にintがある場合と右辺にintがある場合の二つを用意する必要があるのでしょうか

ちなみに使用しているのはC++11です
0153デフォルトの名無しさん
垢版 |
2019/08/08(木) 16:35:41.72ID:uMVCdDWb
>>152
これって自分でやったところで解決できる質問なのでしょうか?
もちろん既に自分で実装していますが、自分で使ってみた感じではクラスでもグローバルでも一切の違いがないと「思います」
左辺と右辺のintについても、わざわざ2つの演算子を定義するしか方法がないと「思います」
0154デフォルトの名無しさん
垢版 |
2019/08/08(木) 23:38:32.45ID:gitRBAeC
クラス内に定義するのとグローバルで定義するのとってどういう意味でだ?
クラスのメンバ関数と普通の関数として定義するのとってこと?
あるいはクラスのstaticメンバ関数と普通の関数?
そういうのとは違ってクラス定義の中にメンバ関数の定義も書くのと
クラス定義の中では宣言だけで外に定義を書くのとってこと?
0155デフォルトの名無しさん
垢版 |
2019/08/09(金) 01:10:13.49ID:QHhCdgXb
>>151
クラス内に定義すると当然メンバー関数扱いなるのでprivateメンバーにアクセスできるが、左辺を自クラス、右辺をintにoperatorしか定義できない。
クラス外に定義すると、そのままではprivateメンバーにアクセス出来ないが、左辺、右辺どっちでも自由に定義できる。
0156デフォルトの名無しさん
垢版 |
2019/08/09(金) 01:23:46.70ID:QHhCdgXb
>>151
相手がintの場合はわざわざoperator==を定義しなくても、intへの型変換operatorを定義すれば勝手に変換してくれるので、そっちの方が楽だと思う。
0158デフォルトの名無しさん
垢版 |
2019/08/09(金) 11:09:20.14ID:0rjrOlB6
>>155
大きな違いとして出てくるのは実装面の都合になってくるわけですね
>>157 の方の言う通り楽な方で実装しようと思います

>>156
型変換のオペレータを実装するのは思いつきませんでした
確かにそれが一番手っ取り早いですね
教えていただきありがとうございます
0159デフォルトの名無しさん
垢版 |
2019/08/10(土) 01:46:44.99ID:07GKNAvB
質問ですがリフレクションってのは何ナノですか?
これがないのがC++の欠点って言われてるそうですが
0160デフォルトの名無しさん
垢版 |
2019/08/10(土) 02:13:52.05ID:0AyH8q+k
ググって何がわからなかったのか書けよ
そういう気配り謙虚さがないからお前は伸びないんだよ
0164デフォルトの名無しさん
垢版 |
2019/08/13(火) 00:33:44.36ID:DG2S/APd
T[]は配列、Tなものが並んだもの
T*はポインタ、Tなものを指すもの
Tは、Tそのものとしか
配列は随所でポインタに変換されるから混同するのもわからんでもないが
0165デフォルトの名無しさん
垢版 |
2019/08/13(火) 01:11:53.36ID:7xRhzmxz
じゃあ配列を関数の実引数で与えるときに[]…って書かないで*ってするのはなんで??
0167デフォルトの名無しさん
垢版 |
2019/08/13(火) 05:41:26.72ID:DG2S/APd
配列を関数の実引数で与えるときに*なんてしない
int arr[NUM] = 0; func(arr, NUM);
普通こう書く

cでは、配列は構造体とは違い「満足なオブジェクト」ではないんだ
関数に配列そのものを渡すには構造体で包むなりしないとならない
面倒なんで普通はそんなことはしなくて、先頭要素へのポインタとサイズを渡す
上記func(arr, NUM);も、本当は配列そのものを渡したいんだけどできないから
そういう意味だと解釈される
0168デフォルトの名無しさん
垢版 |
2019/08/13(火) 07:20:08.26ID:j44aRWG6
つまり、めんどくせぇし表現乱立するくらいならvectorなりarray使えってことだな
0169デフォルトの名無しさん
垢版 |
2019/08/13(火) 16:33:08.61ID:qE6XkMY1
mallocした配列なら*
二次元配列なら**
三次元なら***

すんごく分かり易いじゃん
0170◆QZaw55cn4c
垢版 |
2019/08/13(火) 16:50:37.78ID:RSblMGL3
>>167
>cでは、配列は構造体とは違い「満足なオブジェクト」ではないんだ
私にいわせると、C の配列の扱い方こそ正義であり、まるまま渡せるという構造体の方が正義に反するやりかただと考えています
構造体の扱いに関しては、K&R1 のままの方が良く K&R2 は改悪だったと思っています
0173デフォルトの名無しさん
垢版 |
2019/08/14(水) 10:53:25.60ID:K0s/BHfQ
Cだけだといろいろ物足りないから
C++ をちょっと便利な C として
手を付けるのは あり?
0175◆QZaw55cn4c
垢版 |
2019/08/14(水) 16:51:47.26ID:tpn/GSyz
>>173
みんなそうやって C から C++ に移ってきたのだと、私は思います
0177◆QZaw55cn4c
垢版 |
2019/08/14(水) 20:13:46.55ID:tpn/GSyz
>>176
どんなところが「まともに使えていない」と感じられるものだったのでしょうか?
0178デフォルトの名無しさん
垢版 |
2019/08/14(水) 21:53:50.90ID:xRZNaRgT
いや、もうc言語とかいいじゃん、 c++使おうよ
配列で悩むのめんどくさくね?
配列のサイズ渡せないとか欠陥だからマジで
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況