X



【初心者歓迎】C/C++室 Ver.103【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0617デフォルトの名無しさん
垢版 |
2018/10/31(水) 13:47:07.97ID:XAA9QXm2
悪貨は良貨を駆逐する
0619デフォルトの名無しさん
垢版 |
2018/11/01(木) 11:03:26.87ID:z733lC2q
初心者だから何でも許されるというのは間違った考え
安田はジャーナリストとしては初心者
無能に仕事を任せるのは損失
0622デフォルトの名無しさん
垢版 |
2018/11/01(木) 22:02:58.74ID:ydgxPLcy
プログラム全体でただ1つだけ走らせることが出来る、ある機能を提供するライブラリを作りたいんですけど
シングルトンで実装するのが一般的なんですかね よくわからん
0623デフォルトの名無しさん
垢版 |
2018/11/01(木) 23:40:18.35ID:BwvtJmQs
それただのcの関数やんけ
staticのメンバ関数で十分
0624デフォルトの名無しさん
垢版 |
2018/11/02(金) 00:29:41.77ID:Jt96ZoUI
スレッドの数なのか変数の数なのか
なんでライブラリがそんなことを強制せにゃならんのか
0626デフォルトの名無しさん
垢版 |
2018/11/02(金) 00:38:05.60ID:KoqyjIsr
リエントラントな関数にしとけば平気
0627818
垢版 |
2018/11/02(金) 08:51:49.18ID:PHrFLYGt
>>819
そんな考えだったら、スレタイの、【初心者歓迎】をはずせ。
0629627
垢版 |
2018/11/02(金) 11:02:16.38ID:PHrFLYGt
失礼しました。
0630627
垢版 |
2018/11/02(金) 11:07:37.07ID:PHrFLYGt
>>818>>819さん、ごめんなさい。
0632デフォルトの名無しさん
垢版 |
2018/11/02(金) 13:50:23.22ID:33vh4D4i
vector<int> v{1, 2, 3, 4};
と定義して &v[0] からのバイト列にアクセスすると
01 00 00 00, 02 00 00 00, 03 00 00 00, 04 00 00 00
と連続して確保されているようですが
●これは仕様上保証されていますか?

また
vector< vector<int> > w{{1, 2}, {3, 4}};
と定義して &w[0][0] からのバイト列にアクセスすると
01 00 00 00, 02 00 00 00, ?? ?? ?? ??, ?? ?? ?? ??
後半がランダム?

になるようですが
連続に
01 00 00 00, 02 00 00 00, 03 00 00 00, 04 00 00 00
と確保されるように2次元のvectorを定義するにはどうすれば出来ますか?
それとも出来ないのでしょうか?
0635デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:03:14.42ID:Jb5Djrng
vector の連続性について
 ttp://cranehouse.dojin.com/program/vector.html
 ttps://www.wdic.org/w/TECH/std::vector#xE3x83xA1xE3x83xA2xE3x83xAAxE3x83xBCxE3x81xAExE9x80xA3xE7xB6x9AxE6x80xA7
0636デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:52:24.63ID:kca9Lljk
vectorには本体データの他に管理データもあったりするので
そのvectorを作ると間にゴミに見えるデータが入りうる
0637デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:54:42.97ID:KQJo2ZCc
ありがとうございます

int (*hoge)[要素数]; じゃなくて
int *hoge[]; みたいにポインタの配列になってるということでしょうか?
0638デフォルトの名無しさん
垢版 |
2018/11/02(金) 14:59:33.45ID:Jb5Djrng
w[0] が返す vector の次元(大きさ)と
w[1] が返す vector の次元(大きさ)は異なっててもいい
から、そもそも論で 2次元配列 とは等価にならんし
0640デフォルトの名無しさん
垢版 |
2018/11/02(金) 15:14:04.01ID:KQJo2ZCc
とりあえず「出来ない」という方向で仕様検討します
0641デフォルトの名無しさん
垢版 |
2018/11/02(金) 16:46:54.30ID:ggr9EF3w
>>632 >>640
array< array<int, 2>, 2 > w{ {{1, 2}, {3, 4}} };
0642はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/02(金) 17:22:12.50ID:0I6l0gim
適当なラッパーを作って
期待する形のバイト列にするイテレータをくっつける
とかいった方法が考えられるかなぁ。

まあ場合によるけど、
大きさがコンパイル時に確定してよいのなら、
>>641 の方式が確実だと思う。

多次元配列を作る場合ってほとんどの場合はコンパイル時か
オブジェクト構築時には大きさが決まってると思うんよね。
後から伸ばしたり縮めたりってあんまりしなくなくなくなくない?
0643デフォルトの名無しさん
垢版 |
2018/11/02(金) 18:31:51.95ID:ibjOz3iU
1次元での連続性の要求は理解できるけど、2次元以降の多次元で配置の連続性の要求って何処からきてる?

思い浮かぶのが画像データぐらいだけど、それなら1次元+演算でも代用可能だし…
0645デフォルトの名無しさん
垢版 |
2018/11/02(金) 23:47:26.58ID:NDSywfh9
環境に関して質問です。
windows10でcの環境作りたくて、コンパイラにminGWを入れたのですが、実行時エラーがでなくて不便です。
例えば、
char c='x';
printf("c: %s",c);
のように出力時のフォーマットを間違えたら、LinuxではRuntime error〜となにかしらエラーがでていたのに、エラーも何も出ずに(c: すら出ないで)終了します。

minGWの仕様なのか否か。
または、
windows10でminGWを使い、実行時エラーを出す方法を教えてください。
0646はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 00:16:22.42ID:q3m1JbMq
>>645
言語仕様的には未定義なので、実行した結果がどうであっても言語仕様通り。
ランタイムに捕捉できることを期待しない方が良いと思う。
C/C++ っていうのはそういうもんだから。
0647デフォルトの名無しさん
垢版 |
2018/11/03(土) 00:23:55.55ID:v6aDDcip
>>645
minGWを使ったことないんで間違っているかも知れないが
GCCならGDB使えば実行時エラーを捕捉出来るんじゃないか?
0648デフォルトの名無しさん
垢版 |
2018/11/03(土) 00:52:51.51ID:JdxI4C+o
>>647
gdbで捕捉できるんですが、gcc実行のみでRuntimeErrorを表示させるにはコンパイラ変えるしかないですかね?
もともとvmにLinux入れて、c言語を学ぼうとしてた初心者の集まりなんですが、vm重いからwindowsに移行しようと、環境設定が簡単な方法をいろいろ試してるところです。
なので、Linuxでできてたことができなくなることが不安という感じです。
0649デフォルトの名無しさん
垢版 |
2018/11/03(土) 01:02:20.38ID:v6aDDcip
>>648
例えば、GCCの代わりにVC使ったとしても
エラーを捕捉出来るかどうかは分からないよ
どちらかと言えばOS側の仕様な気がするし
0650デフォルトの名無しさん
垢版 |
2018/11/03(土) 01:09:09.93ID:JSD3MLAZ
たまたまアクセスしたアドレスがアクセス違反でもない限り、そもそもエラーにしようがない気がするのだけど、どうやって補足してるの?
0652デフォルトの名無しさん
垢版 |
2018/11/03(土) 04:50:14.05ID:AAuGyX2A
>>645
エラーレベル上げるとかそう言うフラグがコンパイラに無かったかな?
その初期値が違ってるだけじゃ無いの?
0653デフォルトの名無しさん
垢版 |
2018/11/03(土) 04:51:37.68ID:AAuGyX2A
あ、実行時か。
Cは実行時エラーの処理も自分で補足して書くものよ?
そう言う言語としか言えない。
0654デフォルトの名無しさん
垢版 |
2018/11/03(土) 09:37:50.89ID:1nZCEE4t
不定や未定儀を自らトラップするコードを記述するのは難易度高いな… 例外が捕まれば御の字だが
0655はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 10:13:55.37ID:q3m1JbMq
アドレスが 0 付近のページはプログラムミスでアクセスされやすいってことはわかっているので、
Windows でもなんか特別に予約してたような気がしたんだが、手元の資料で見つからんな……。
0658はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 11:26:29.27ID:q3m1JbMq
>>657
NULL はあくまでも「無効なポインタ」を表し、意味のある番地ではない。
けど、うっかり意味のある番地としてアクセスしたら 0 番地だから、
その付近へのアクセスがあったらたぶん駄目なプログラムとして検出しようねっていう話。
0659はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 11:29:39.54ID:q3m1JbMq
今回の場合は char をポインタとして解釈してしまった場合ってことになるけど、
(0 ではないが) 0 に近いアドレスなので、その付近のページは
トラップ用に予約しておいたらあかんプログラムの検出に便利やんというわけ。
0660はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 11:36:04.04ID:q3m1JbMq
本筋とは関係ないけど念のために補足しておくと、ヌルポインタがゼロというのは、
そういうアーキテクチャがほとんどだと思うけど言語仕様の保証はない。

整数のゼロと互換性はあるという扱いで、
つまりは、ヌルポインタを整数にキャストするとゼロだし、
ゼロをポインタにキャストするとヌルポインタになることは保証されるが、
ヌルポインタのビットパターンが整数のゼロと等しいことは保証されない。
(なので移植性が必要ならポインタの配列を memset とかで初期化したりするのは駄目)
0661デフォルトの名無しさん
垢版 |
2018/11/03(土) 13:12:43.48ID:LENdvKRs
>>ゼロをポインタにキャストするとヌルポインタになることは保証されるが

そうだっけ。定数のゼロだけでは?
0662はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/03(土) 14:56:28.34ID:q3m1JbMq
>>661
そういや C++ ではそういう変更もされたような気がするな。
以前は確かに定数に限らずゼロはヌルってことだったはずだが。

C では今でもヌルはゼロ (と相互に変換される) だと思う。
0664デフォルトの名無しさん
垢版 |
2018/11/04(日) 13:52:28.75ID:5RY1Lh2I
>printf("c: %s",c);

va_list な関数でフォーマットからパラメータの妥当性チェックって
コンパイル時に出来るもんなのか?
0669デフォルトの名無しさん
垢版 |
2018/11/05(月) 22:44:26.18ID:3jCTliha
面倒なので出力書式には%sのみを使うこととし引数の型の分だけstringに変換する同名関数用意して必ず文字列にしてしまうという力技
0670デフォルトの名無しさん
垢版 |
2018/11/06(火) 11:51:03.34ID:rqFrnjhJ
>>669
オブジェクト指向的にはそれが正解なんだよな
0672デフォルトの名無しさん
垢版 |
2018/11/06(火) 13:01:56.11ID:tKDIv/D4
cout << left << hex << showbase << setfill('0') << setw(8) << i << eol;
より
cout << i.tostring("0x%-08x") << eol;
とかなら %書式 にはあまりこだわらないんだけど
前者の仕様だと %書式 の方が描きやすいから
結局普及しない原因
0673デフォルトの名無しさん
垢版 |
2018/11/07(水) 23:51:04.79ID:JJvWWnsQ
よくint型のサイズとかエンディアンが処理系依存って解説を目にしますが
この「処理系」ってコンパイルするマシンのCPUですか?
それともプログラムを実行するマシンのCPUですか?
0674デフォルトの名無しさん
垢版 |
2018/11/07(水) 23:57:40.81ID:vv5bGR61
>>673
コンパイルするプログラムや出来たプログラムを実行するOSやハードウェアなどの諸々の環境
0676デフォルトの名無しさん
垢版 |
2018/11/08(木) 00:05:29.53ID:M68F6j6d
ターゲットになる処理系にあわせてコンパイルするからな
べつにターゲットになる処理系でコンパイルする必要はない
0677673
垢版 |
2018/11/08(木) 00:44:14.28ID:ZMRuomnT
ありがとうございます
ちょっとプログラムを見直してみます
0678デフォルトの名無しさん
垢版 |
2018/11/08(木) 10:49:50.86ID:2uuB+50R
>>673
CPUで変わるのはもちろんだが
クロスコンパイルも可能なので
コンパイル時のオプションでも変わる
0679デフォルトの名無しさん
垢版 |
2018/11/08(木) 21:31:49.37ID:2V1Zc+AV
constexpr char *mes[] ={(char *)"error", (char *)"ok" ,(char *)"abc"};
みたいにキャストしないとワーニングがでるんだが、めんどくさいね。なんか方法ないの?
0680デフォルトの名無しさん
垢版 |
2018/11/08(木) 21:41:57.89ID:YKdO2F6s
constexpr const char *mes[] ={"error", "ok" , "abc"};

constexprが何にかかっていたか考えてみれ
0681デフォルトの名無しさん
垢版 |
2018/11/09(金) 03:42:19.86ID:RK/u55Qe
constつけたらワーニングが無くなるのだろうか? 何故なくなるの?

ポインタにかかるのか、ポインタの中身にかかるのか?という問いだろうけれども恐らくはポインタ自体
にかかるのだろう。そしてconstがポインタの中身にかかる。順番が逆だといろいろ不都合がしょうじる
から、このようになる筈だ。
しかし、constを追加しただけでwarnningが消える理由はなんなのだろうか? (char*)でキャストするのと
同じ効果を持ちうるのはなぜか? constにはそんな意味はない。「単に書き換えできないようにする」
と言う意味だろう。書き換えできないsringももちろんあるから矛盾が生じるのだ。その矛盾を
解決する可能性があるとすれば書き換えできないstringがすなわちchar*と同じである場合に限る。
つまり
const string とは char* の事なのだ。
あってる?
もしあってるとすれば、
constexpr (char*) char *mes[] ={"error", "ok" , "abc"};
でもOKな筈だね。そうでないと矛盾する。この方が分かりやすいね。
0682デフォルトの名無しさん
垢版 |
2018/11/09(金) 04:05:10.44ID:RK/u55Qe
そしてワーニングはすべてきえたが、エラーになった。w
0683デフォルトの名無しさん
垢版 |
2018/11/09(金) 04:08:12.56ID:RK/u55Qe
constexpr const char *mes[] ={"error", "ok" , "abc"};
これをクラスのなかで定義したいのだが、クラスの中で定義するとエラーになる。クラス内だけで使いたいのに
外部に引き出すのは面倒だ。どうしたらいいの?
0685はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/09(金) 11:35:02.44ID:yH/J6wNO
>>681
書いている意味はさっぱりわからんが、文字列リテラルの型は const char[] だ。
そんでもって >>679 の場合の文字列リテラルは暗黙の型変換で const char* になる。
const char* を char* に入れようとしたら型が合わないがキャストで無理やり合わせることも出来るという簡単な話。

だが、型から const を剥がしたからといって文字列リテラルを書き換えてよくなるわけではない。 (← 重要!)

const を剥がすだけなら問題はないが、
書き換えたら駄目 (未定義) にもかかわらず型から const を外すのは馬鹿馬鹿しい間違いの元。
よくわからんままキャストしたら警告が消えた〜〜っていうのはC/C++ の歴史で何十年も繰返してるので
古参ならうんざりするほど見てきた駄目なパターンだと思う。
とりあえずキャストってのはほんとにやめて……。

(ちなみに C では文字列リテラルの型は char[] だが、書き換えるのは未定義ってことになってるという更なる闇がある)
0686デフォルトの名無しさん
垢版 |
2018/11/09(金) 11:51:24.81ID:p9aTnaT/
x ワーニング
△ ウォーニング
0692デフォルトの名無しさん
垢版 |
2018/11/09(金) 12:46:06.80ID:p9aTnaT/
KING KONG
0696デフォルトの名無しさん
垢版 |
2018/11/09(金) 17:01:38.84ID:s4ONASkx
今調べてきた。確かにwikiとかでもウォーニングってなってんな
発音記号もcの逆みたいのが使われている
でも実際の発音を聞くと、あの方が近いぞ。まあどっちでもええわ
0699デフォルトの名無しさん
垢版 |
2018/11/09(金) 20:21:57.93ID:GUqFOdkW
5chで発音ガーとか何回見たことか…
なのでそういう奴が居そうなスレでは原語(warning)で書くのが基本
0700デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:19:39.32ID:RK/u55Qe
「文字列リテラル型」って表現はよくわからない。文字列はリテラルじゃないの?
文字列のリテラル型というのであればリテラル型でない文字列ってあるんだろうか?
リテラルって何? 英語をやくしたら文字列って意味だろ。
0702デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:29:35.20ID:RK/u55Qe
A character literal is a type of literal in programming for the representation of a single character's value within the source code of a computer program.

「文字列リテラル」ってキャラクターリテラルのことだろうか?
それなら日本語にすると「文字列」でOKと思う。文字列リテラルって文字列列ってことか?
つまりA character literal literal **str のこと?
0704デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:31:35.81ID:RK/u55Qe
それなら文字列配列だよな。
0706デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:33:25.58ID:RK/u55Qe
>>703
アッごめん。704は無視して。
リテラルって、堅物って意味のほうか? そうなんだ。
0707デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:39:02.77ID:RK/u55Qe
literalって頭が固くて融通が利かないって意味があるみたいだから、”abc”というように値が固定した
文字列って意味なんだね。
ということは
char literal 'a'
char literal "abc"
int literal 0x111
ということか。
0708デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:40:08.63ID:RK/u55Qe
まちがってる
char [] literal --> "abc"
0710デフォルトの名無しさん
垢版 |
2018/11/09(金) 21:56:52.98ID:9K071fMF
"literal"って「文字通り」ってことだろう。
ソースコード中に埋め込まれた、値そのものを表す記述のこと。
0712はちみつ餃子 ◆8X2XSCHEME
垢版 |
2018/11/10(土) 01:32:44.99ID:BAJLxFPC
リテラル型という用語もあるが、リテラル型がいわゆる「リテラル」とは限らないので気を付けてな。
0713デフォルトの名無しさん
垢版 |
2018/11/10(土) 04:45:24.06ID:p/77GMIT
>よくわからんままキャストしたら警告が消えた〜〜っていうのはC/C++ の歴史で何十年も繰返してるので
>古参ならうんざりするほど見てきた駄目なパターンだと思う。
>とりあえずキャストってのはほんとにやめて……。

void uprint( char * message);
こういう関数って普通にあると思うが、そうすると
uprint((char *)"abc");
こんなふうにキャストしないでwarnigを取る方法ってありますの? 
そもそも関数の定義の仕方が悪いって意見? C++ってcと混在一体で使うところに多大な
メリットがあるわけで、cだとstringとか使えないし、どうすりゃいいのよ。
0714デフォルトの名無しさん
垢版 |
2018/11/10(土) 04:56:10.50ID:p/77GMIT
あっ、わかった。C++の場合はvoid uprint( const char * message); も作っておけばいいのか。
納得。
■ このスレッドは過去ログ倉庫に格納されています

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