X



【初心者歓迎】C/C++室 Ver.103【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん垢版2018/07/01(日) 05:02:07.56ID:FOGWQSv4
こんばんは。質問です。
Win32APIで現在OSが再生中の音声の値を取得する方法を教えてください。
その瞬間の値をLR各1個取れればいいですが、ある程度連続的に配列に取り込めるほうがベターです。
スペクトラムアナライザを作ろうと思います。
Windows10/Visual Studio 2017/ C or C++です。
0005デフォルトの名無しさん垢版2018/07/01(日) 21:54:36.84ID:Z8xp56Jv
もしかして、実行時刻や国によって計算結果が異なるのかも知れない
あるいは、希に発生する宇宙線の影響を検出したいという意図が有るのかもしれない
あるいは実行環境のバグを検出しその後の処理を切り替えたいとか
0007デフォルトの名無しさん垢版2018/07/01(日) 23:32:19.32ID:lS5AQxvk
>>6
そもそも浮動小数点数で無理数を正確に表すこと自体が不可能だけど、どこまでの精度を求めてるの?
0010デフォルトの名無しさん垢版2018/07/02(月) 01:18:41.69ID:3LeesGvV
√2と√2をかけ合わせたらちょうど2を返す無理数クラスなら作れそう
すでにありそう
素因数分解が必要そうだから結構面倒になるかな?
0011デフォルトの名無しさん垢版2018/07/02(月) 07:01:13.71ID:tvgYkj/r
無理数というか、冪の底と指数をそれぞれ有理数で持つ、
という形式ならいけそうだな。

有理数クラスの約分に相当する処理を自動的にやらせる感じ。
0015デフォルトの名無しさん垢版2018/07/04(水) 21:59:31.57ID:gFgZc5FG
18Z
0016デフォルトの名無しさん垢版2018/07/05(木) 12:54:37.46ID:u9CJaon8
vcのcl.exeでc書いてるんだが、20億バイトのmallocがnull返します。
何とかなりませんか?
0018はちみつ餃子 ◆8X2XSCHEME 垢版2018/07/05(木) 14:58:16.26ID:l9X7uzb+
実メモリが載ってなきゃ意味ないぽよ。 とマジレス。
まあ今どきはそういうデスクトップマシンも無くはないけど……。
0019デフォルトの名無しさん垢版2018/07/05(木) 15:06:00.77ID:ppxwAApK
(vc ってあるから Windows 前提で)
malloc のアロケーターの実装とセットになって
OS がよきに計らってくれないものなのかな
0020デフォルトの名無しさん垢版2018/07/05(木) 15:43:13.14ID:I5nj7cYg
20億バイトって約2GB、31bitで表せる範囲ではあるのか。
プロセスあたりメモリ2GBの制限に引っかかってるのかな。
この20億バイトのmallocの他にもメモリを使っててトータル不足とか。

プロセスで使えるメモリを3GBにする設定とかあるんだっけ。
あとはOSを64bitにするか。
0021はちみつ餃子 ◆8X2XSCHEME 垢版2018/07/05(木) 18:08:24.53ID:l9X7uzb+
あ、 20 億ってたったの 2GB か。
でもまあメモリ空間が足りないとどうしようもないよな。
0023デフォルトの名無しさん垢版2018/07/05(木) 19:23:00.99ID:I5nj7cYg
実際にやったわけじゃないけど、軽く調べたところ、
32bitのWindows上のプロセスで2GBより大きなメモリを使うためには…
・OSの動作モードを「カーネルで1GB, プロセスで3GB」のメモリ配分に変更
・リンク時にオプション /LARGEADDRESSAWARE を指定
…という具合に、動作環境と実行ファイルの両方での対処が必要みたい。

さらに加えると、Win32APIの HeapAlloc() を使わないとダメかも。
これはライブラリの malloc() がどう実装されてるかによるが。
0026デフォルトの名無しさん垢版2018/07/06(金) 18:42:29.85
for( a : コンテナ)ってしたときのアクセスは内部的にどうなってるんですか?
@コンテナのat(size_t)を呼び出している
Aコンテナにイテレータがあればイテレータ
Bコンテナにイテレータがなくat(size_t)があればat
0027デフォルトの名無しさん垢版2018/07/06(金) 19:28:48.49ID:cmD7yKAf
生配列の場合は*<配列のポインタ>、
コンテナ.begin()が定義されていれば*<コンテナ.begin()が返却するもの>、
そうでなければ*<std::begin(コンテナ)が返却するもの>
で要素アクセスする。

at()はオーバーヘッドがあるので、forに限らず、将来的にもコンパイラが知らぬうちに呼びだすことはないと思うよ。
0030はちみつ餃子 ◆8X2XSCHEME 垢版2018/07/06(金) 21:43:33.68ID:G+eTHi8Q
>>26
begin 関数と end 関数で帰ってくるイテレータで繰り返すようになってる。
標準ライブラリにあるコンテナの場合は std::begin と std::end が適用されて、
これは基本的にはそれぞれのコンテナのメンバ関数 begin と end をそのまま呼び出すが、
配列などのために特殊化した版が用意されている。

自分が独自に作ったコンテナを range based for に対応させたい場合は、
メンバ関数として begin と end を持っておけば std::begin と std::end 経由でそれが呼び出されるし、
非メンバ関数としてそのコンテナの型を受け取れる begin 関数と end 関数を用意してもよい。
どの名前空間にある begin 関数と end 関数が呼び出されるかは ADL で解決されるんだが、
このあたりの理屈は面倒なんで ADL をキーワードにしてググって。

独自に用意したコンテナについて、やりたければ at を呼び出すように作ることはもちろん出来るよ。

既存のコンテナについても、 std::begin と std::end を特殊化すれば、現実には挙動を変えられたりもするが、
std 名前空間にある関数をオーバーロードすることは禁止されていて、
std 名前空間内のテンプレート関数の特殊化も (全面的に禁止ではないが) 制約があるので、
規格の範囲内ではカスタマイズすることは出来ないと考えて良い。
0033デフォルトの名無しさん垢版2018/07/07(土) 14:03:43.69ID:0Eyv8LqD
ストラウストラップのプログラミング言語C++を読んでいるのですが、

auto を使えとか、

int a = 1;

よりも

int a {1};

のほうがいいだとか、書いてありますが、本当にこれにしたがったほうがいいのでしょうか?

他の本とスタイルが違うように思います。
0034デフォルトの名無しさん垢版2018/07/07(土) 14:47:52.08ID:cKmJS2is
いいよ。問題ない。
c++11以降はそっちが推奨。

ただ会社で使うと周りがついてこれないから直せと言われるかもしれない。
0035デフォルトの名無しさん垢版2018/07/07(土) 14:59:47.53ID:0Eyv8LqD
>>34
ありがとうございました。
0036デフォルトの名無しさん垢版2018/07/07(土) 15:18:56.50ID:kLxolQc6
ITドカタになりたいなら
現場のコーディング規約に従いなさい

ドカタになりたいのにドカタのオキテに従わないのよくない
ドカタにしばかれるぞ
0038デフォルトの名無しさん垢版2018/07/07(土) 18:24:29.21ID:ZyYEp/bp
整数の宣言時の初期化はどう書くのがオヌヌメなん?
int a = 100;
int b(200);
int c{300};
俺は昔はaで統一してて最近はbに統一してるけど、なんとなく
0040デフォルトの名無しさん垢版2018/07/07(土) 19:16:59.45ID:jTEKSr/V
>>38
『プログラミング言語C++』第4版ではc{300}の書き方をオヌヌメしてる。
(p.168 6.3.5 初期化)

C++11以降でないと使えないのが欠点だって。
0044デフォルトの名無しさん垢版2018/07/13(金) 19:58:04.79ID:Tk69mgcl
ASCIIコードのエスケープ文字列を変換してくれる標準関数ってなかったっけ?
2文字の "\n" を 1文字の 0x0a に変換してくれるような
0048デフォルトの名無しさん垢版2018/07/13(金) 22:11:34.91ID:Da3sJv8m
ソース中の \n はプリプロセッサが変換してくれるけど
標準入力とかの外部入力から \ n (0x5c 0x6e) を渡して
それが 0x0d になって欲しいんじゃないの?
0049デフォルトの名無しさん垢版2018/07/13(金) 22:16:42.49ID:Tk69mgcl
>>47 コマンドラインから "\n" て与えるとコード上の "\\n" 相当になる
わかりにくくてすまん

>>46 やっぱ無いのか。サンクス
0053デフォルトの名無しさん垢版2018/07/20(金) 11:04:37.70ID:o8SFlR7J
ロベールの本を読んでいます。
メンバ関数ポインタについて質問です。

int (*Calculator::mfp)();
int (Calculator::*mfp)();

のどちらが正しいかという話が書いてあります。


あとは「どこに」つけ足すかですが、これは簡単に考えると2種類考えられます。

int (*Calculator::mfp)();
int (Calculator::*mfp)();

しかし、静的メンバ変数として普通の関数ポインタを作った場合を考えると、前者
では問題があることが分かります。

typedef を使わず静的メンバ変数として普通の関数ポインタを作ると次のようになります。

class Calculator {
public:
static int (*mfp)();
};

int (*Calculator::mfp)();

静的メンバ変数の実態を定義する時には変数名の前に Calculator:: をつける必要があります。
しかし、もし前者の宣言法が正しいのであれば、この静的メンバ変数の実体定義と区別
がつきません。これでは困りますね。

ということで、後者の宣言法が正しいと推測されます。
0056デフォルトの名無しさん垢版2018/07/20(金) 13:09:16.56ID:IRIYugXE
メンバ関数ポインタの*つける場所、みんな迷っちゃうよね?ね?
でも心配しなくていいよ!

だって先頭に*付けたらstaticなメンバ関数ポインタの実体定義とグローバル変数として定義したメンバ関数ポインタが区別つかなくなっちゃうじゃん?
だからどこに付けるか分からなくなっても推測できるから安心だよ!ラッキー!

ってことじゃね?
(俺はググるけど)
0057デフォルトの名無しさん垢版2018/07/20(金) 15:13:15.86ID:E9KpD2Uv
型名 (*{名前}opt)(引数) と来たら関数ポインタ
型名 (クラス名::*{名前}opt) と来たらメンバ関数ポインタと
馬鹿の一つ覚えで認識しているのでこれ以上ややこしくされると困るわ
0058デフォルトの名無しさん垢版2018/07/20(金) 16:22:28.53ID:bI1d2ZJ+
(this の渡り方とか不安で メンバ関数のポインタは使わずに
 this を引数にする普通の関数のポインタを使っちゃう)
0059 ◆QZaw55cn4c 垢版2018/07/21(土) 00:44:08.31ID:w9jgnsOk
>>53
>int (*Calculator::mfp)();
これは、mfp は普通の関数(static メンバ関数=メソッド)のポインタ、int (*f)() と同じもの

>int (Calculator::*mfp)();
::*
->*
という演算子が別途存在する、と覚えておく
::*
->*
の使い方は、
https://mevius.5ch.net/test/read.cgi/tech/1434079972/39
0060 ◆QZaw55cn4c 垢版2018/07/21(土) 02:16:26.46ID:w9jgnsOk
>>59
訂正します
「=メソッド」は削除してください、これは間違いですね
static メンバ関数は、this を必要としない(普通の)関数
::*, ->* は「インスタンスメソッド」に使います
0061デフォルトの名無しさん垢版2018/07/21(土) 06:53:52.36ID:d0oYLoM2
>>59
実際別の演算子だし
使いどころも少ないので
どちらか迷うなんてことは今まで考えたこともないんだけど

ロベールさんは迷う事がよくあるってことなのかな?
0062デフォルトの名無しさん垢版2018/07/21(土) 13:29:03.35ID:Peen6N8v
コンピュータの基礎的なことを勉強するのに、
以下の本から読むというのはどうでしょうか?

その後、コンピュータアーキテクチャの本や
OSやコンパイラの本を読むというプランは
どうでしょうか?

低レベルプログラミング
Igor Zhirkov
固定リンク: http://amzn.asia/e6zmk4x
0065デフォルトの名無しさん垢版2018/07/21(土) 20:22:42.36ID:Peen6N8v
ロベールの本って細かいことが書いてありますが、それらは本当に重要なんですか?

柴田望洋訳のC++とどっちがいいですか?
0067 ◆QZaw55cn4c 垢版2018/07/21(土) 21:24:02.77ID:vWALYQin
>>64
C/C++ スレを粘着の侵略から守るため、必死で闘った。
しかしそれが正義などではなく、太古の昔から繰り返されてきた煽りあいの歴史をなぞっているだけである事もよく知っていた。
哀しかったよ。いや、馬鹿になった事がじゃない。C/C++ を勉強した事がだ。C/C++ は破産するまで終わらないゲームなのだ。
たぶん間抜けな猿が始めたに違いない。
fj へ戻れだと?道は一本きりではないか。
大切なのは自分の立場を見つけることだ。そこで何を煽るべきか何を煽るべきでないかを考える。
本物の目玉は鼻の上についている一組分、それだけだ。
そこから見てみろ、なにが見える?
0068デフォルトの名無しさん垢版2018/07/21(土) 21:42:47.68ID:Peen6N8v
ロベールの本を見ていると、C++って色々と文法面で無理をしているなと思います。
0069デフォルトの名無しさん垢版2018/07/23(月) 04:06:23.52ID:4YnpLRT9
C++の初心者スレってここであってますか。
改行に使うのって <<endl;で覚えて問題ないですか?
以前入門書を買ってその時は読んでる本が難しすぎて勉強自体やめてしまったんですが
先程ロベールの入門書を買ってきて始めたんですが、以前読んだ本には\nと書いてあった気がします。(うろ覚え)
どっち使っても変わらないですか
0071デフォルトの名無しさん垢版2018/07/23(月) 07:34:33.78ID:4YnpLRT9
\nとendlの違いは今読んでる範囲では全く説明されてないんですが。
他にC++初心者スレあったら誘導お願いします><
0072デフォルトの名無しさん垢版2018/07/23(月) 08:26:35.80ID:zCHmFbX3
>>71

ロベールの本で "\n" と std::endl の違いは説明されています。
0073デフォルトの名無しさん垢版2018/07/23(月) 18:40:36.42ID:4YnpLRT9
ほんとですか?
今読んでる限りでは特に説明がないような・・・
始めたばかりなので当然最後まで読んではいませんが後のほうのページで説明されてるんですかね
0074デフォルトの名無しさん垢版2018/07/23(月) 21:38:57.78ID:s5U2uI/C
>>69
\nは文字としての改行コード
endlは改行込みで且つバッファを即空になるまで書き出す命令

イメージとしては\nを読み込んだ時に呼び出される改行処理を直で呼び、且つflushも呼び出します

\nだけではflushが起こらずただバッファに\nという1バイトが入るだけ

何が違うのだろうか? それはいきなりアプリが落ちた時に判る
まだ書き出ししてないバッファの内容は消失する

なぜそんな危険があるのにバッファなんてものを使うのか?
それはIO装置がメモリに比べてとても遅いから律速されるためだ
一旦メモリに溜めておいて最低回数で一気に書き出した方が速い
0076デフォルトの名無しさん垢版2018/07/23(月) 22:01:16.52ID:4YnpLRT9
>>74
詳しくありがとうございます
今の段階ではなんのこっちゃ分からないですが…どちらで覚えても問題はないですかね
0078デフォルトの名無しさん垢版2018/07/23(月) 22:27:32.26ID:4YnpLRT9
いや・・・他の言語経験あるとかならともかく始めたばっかなもので^^;
アプリ作成経験なんて当然皆無ですしバッファの意味も分かりません…
だから今の段階で疑問に持つようなとこじゃないのかなと
0079デフォルトの名無しさん垢版2018/07/23(月) 22:31:20.54ID:4wFiAGCh
「問題無いですかね?」に対しては「いいえ」としか言いようがない
色々問題はあるだろうけど理解出来ないところが先ず問題だな
0081はちみつ餃子 ◆8X2XSCHEME 垢版2018/07/24(火) 03:37:52.21ID:2E8lmfNH
>>78
でも疑問を持ったから質問したんだろ?

違いの内容を (今は) 理解できなかったっていうのは仕方ないかもしれんが、
違いの説明をしてるのにそれを無視する結論では回答者を馬鹿にしていると取られても仕方ないぞ。

わからなかったのがバッファについてなら、それをキーワードにしてググればいくらでも解説が出てくるし、
それもよくわからなかったのなら「参考にして本を読み進めてみます」くらいの言葉で締めとけよ。
0082デフォルトの名無しさん垢版2018/07/24(火) 04:58:30.48ID:5g0GAsDx
>>81
もちろん感謝してますし、無視せずお礼も言ってるはずですよ。
まぁ文章力がないのでそういうふうに捉えられてしまったかもしれません。どうもすいません
読んでそうそう前の入門書と違う表記でモヤモヤしたのでそれが解決しただけで収穫だと思ってます
0083デフォルトの名無しさん垢版2018/07/24(火) 07:53:51.92ID:xxZGzbX2
>>78
おしっこに於ける膀胱がバッファに相当する
膀胱が無ければ腎臓により生産された尿は即排出せねばならない
君がデートの最中でもだ
0089デフォルトの名無しさん垢版2018/07/26(木) 21:11:18.78ID:JayUwZyZ
visualstudio2017Communityをインストールしたのですが空のプロジェクトを
新規作成しても何も出てきません。何が原因なのでしょうか?インストールする際にたくさん
選ぶ項目がありましたがその際に何か選択しわすれていたのでしょうか・・・?

環境はwin10 64bitです
0091デフォルトの名無しさん垢版2018/07/26(木) 21:59:35.89ID:JayUwZyZ
>>90
ありがとうございます
からのプロジェクトって何も書いてない真っ白なページが出てくるんじゃないんですか?
何も出てこないんですけど・・・・。
0092デフォルトの名無しさん垢版2018/07/26(木) 22:01:45.84ID:JayUwZyZ
何回かアンインストール、再インストール繰り返してるんですが
一回一回のアンインストール時間等もかなり長くキリがないので
どこどこのページでどれをインストールすればいいのか教えてほしいです;
0094デフォルトの名無しさん垢版2018/07/26(木) 22:56:12.25ID:JayUwZyZ
>>93
ありがとうございます
その手順で何回かやってましたが何も起こらずです;
砂時計が少し出てたので何かを読み込もうとしてる感じはありましたが・・・

今からインストールからやり直すのですが
ワークロード、個別のコンポーネントの項目でどれを選べばいいか教えてほしいです
用途はC++の入門書に書いてあるコードを実行です
https://gyazo.com/48057912d8ac21da300faaf6362919e4
0095デフォルトの名無しさん垢版2018/07/27(金) 00:15:04.17ID:Tjy3NERo
新規作成の空プロジェクト以外は何か出るの?
何も出ないって何かおかしいからイベントログ見てみるとか
0096デフォルトの名無しさん垢版2018/07/27(金) 00:40:23.04ID:VvnzXBkW
とりあえず
ユニバーサルWindowsプラットフォーム開発
C++によるデスクトップ開発
Visualstudio拡張機能の追加

この3つを選択してインストールしてるんですが他にも選ばなきゃいけないものがあるんでしょうか
0098デフォルトの名無しさん垢版2018/07/27(金) 04:41:40.30ID:VvnzXBkW
プロジェクトからCppを選んだらを選んだら
source.cppの真っ白画面出てきましたがやりかたあってるのかな…?
一応自己解決です
0099デフォルトの名無しさん垢版2018/07/27(金) 07:51:29.71ID:/nUzesew
あー、それのことを言ったつもりなんだがわかりにくかったか
空のプロジェクトはソースコード入ってないから自分で新しく入れろってこと
visual c++ 入門とかでググったら色々出てくると思うが
0100デフォルトの名無しさん垢版2018/07/28(土) 07:24:00.19ID:Z1+pBlcw
入門書のコードなんですが
http://codepad.org/OHOFfttDのコードだと狙い通りに昭和の年数が帰ってくるんですが
http://codepad.org/kq6vlVqaこちらだと思ったとおりに帰ってきません

参照渡しをすると、この問題は解決できるという答えは分かりましたが、サンプルコードの違いが分からないので
どういうときに参照渡しとやらを使えば良いのか分かりません
教えて下さい
0102デフォルトの名無しさん垢版2018/07/28(土) 07:50:15.13ID:A51WA8nQ
関数の引数は新たにデータの領域を作ってそこに値をコピーしてその引数に対して操作をするため
後者のコードでは、もとの変数には影響が及ばない。そのコピーではなく、もともとの変数を関数で操作をさせたい場合に引数を参照に指定する
0103デフォルトの名無しさん垢版2018/07/28(土) 08:13:40.83ID:u/a8W7PY
void func(int a) { a = 2; }
func(5); 別に問題ない リテラルを書き換えてるのではなく a はコピーとって コピー側を書き換えてる

void func(int &a) { a = 2; }
func(5); リテラルの書き換えになって駄目ー
0104デフォルトの名無しさん垢版2018/07/28(土) 08:19:47.29ID:Z1+pBlcw
>>102
回答有り難うございます
直接操作の意味がよく…分からないです。すみません
前者のコードはint shouwa = WesternToShouwa(western);
と戻ってきた値を代入してるから直接操作にならないんですか?
0106デフォルトの名無しさん垢版2018/07/28(土) 08:28:16.09ID:u/a8W7PY
後者のコードは
cin >> year;
WesternToShouwa(year);
って書いてて year が書き換わることを期待してるんやろ?

前社は 代入により書き換えてる
yearA = WesternToShouwa(year@);

@は呼び出しの前後で変わっていない が 代入演算子により Aで書き換えてる
0107デフォルトの名無しさん垢版2018/07/28(土) 10:03:32.12ID:Z1+pBlcw
>>106
ありがとうございます。
なんとなくわかってきたような…
どちらのコードも戻り値はかえってきてるんですよね・?
0108デフォルトの名無しさん垢版2018/07/28(土) 11:37:12.81ID:A51WA8nQ
両方のコードの20行目
前者はint shouwa = の部分で返った値をshouwa に格納してるが
後者は返った値がどこにも格納されてないのだ
0109デフォルトの名無しさん垢版2018/07/28(土) 11:49:20.96ID:Z1+pBlcw
>>108
なるほど!
返ってきた値を引数に直接入れることは不可能なんですね。でも仮引数で&を使えば直接値を変えることが可能になると。
分かりました。ありがとうございます
0110デフォルトの名無しさん垢版2018/07/28(土) 17:16:46.17ID:DikBMpfR
codepad.org/epS67q3p

↑のコードですが、 system() により、 Main1.exe というプログラムを
実行しています。

今、使っている IDE は、 Visual Studioです。

Main1.exe の置き場所ですが、プロジェクトのソースコードが置かれているところに
置くとうまくいきました。

もし、かりに、このプログラムの .exe ファイルを別の場所に持って行った場合に、
Main1.exe はどこに置けばいいのでしょうか?

その位置関係の指定方法が分かりません。
0113デフォルトの名無しさん垢版2018/07/28(土) 18:07:52.47ID:DikBMpfR
>>112

ありがとうございます。

今、Visual Studio から実行しています。

http://codepad.org/epS67q3p

↑このexeファイルの場所とMain1.exeの置き場所が違いますが、
うまく実行できています。

http://codepad.org/epS67q3p

逆に、Main1.exeを↑のexeファイルと同じ場所に置くとうまくいきません。

これは、 Visual Studio 上から実行しているからでしょうか?
0114デフォルトの名無しさん垢版2018/07/28(土) 18:12:14.33ID:DikBMpfR
>>112

ありがとうございます。
今、試してみたら、同じフォルダに入れることでうまく実行できました。
0115デフォルトの名無しさん垢版2018/07/28(土) 18:36:49.62ID:F9WoxQmy
VisualStudioはカレントディレクトリをソースのフォルダにしてるから、簡単に言うとソースフォルダに置いて実行している扱いになってる
0116デフォルトの名無しさん垢版2018/07/29(日) 01:20:19.62ID:pFjYaTQt
設定ファイルで指定できるだろ

相対パスの基準ディレクトリになれるのは、

1. カレントディレクトリか、
2. プロジェクトフォルダか、
3. 呼び出す方のファイルのあるフォルダ
0117デフォルトの名無しさん垢版2018/07/30(月) 13:39:08.45ID:7wjh0J3U
関数に配列(data, result)をポインタで渡し,奇数/偶数の判定結果(1:奇数,0:偶数)をresultに格納せよ.その結果を用いて,問題2のように,入力した番号が奇数か偶数かを出力せよ.


intdata[5] = {7, 10, 21, 30, 36};
 intresult[5] = {};←関数で{1, 0, 1, 0, 0}を得る

という課題が出たのですが、さっぱりわかりません;;
0121デフォルトの名無しさん垢版2018/07/30(月) 14:38:01.55ID:n1wK/LR0
「さっぱりわかりません」と書かれても、
どう分からないのか分からないと説明のしようもないのだわ。
もちろん、その課題の解答例を示すことはできるけど、
丸写しにしても分からない状態は解消しないだろうし。

とりあえず、判定したい情報が入った配列dataを関数に渡すことはできるのかな?
「引数として整数の配列を渡して、それに格納されてる値をそのまま表示する関数」
のような関数を作れる?
0126デフォルトの名無しさん垢版2018/07/31(火) 15:13:55.43ID:PCFGvven
何が良くて、何が駄目か、>>1に明記しないと
初心者を誘い込んでいたぶっている様にしか見えないな
0129デフォルトの名無しさん垢版2018/08/01(水) 03:37:53.71ID:DhLyFl3e
優しいC++という入門書を読んでるんですが
デフォルト引数についての説明が少なすぎてよくわかりません
どやって宣言するんでしょうか?プロトタイプ宣言の文にもデフォルト引数を書く必要があるんですか?
なんか簡単なコードを書いて頂けると助かります
0132はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/01(水) 06:08:28.66ID:oNWxQcbM
>>131
関数定義の場所でデフォルト引数を書くことも出来るけどね。
関数の定義は宣言を兼ねるので、宣言が不要ならば関数定義の箇所でデフォルト引数を書いておけば
それ以降の呼出し箇所でデフォルト引数が使われる。
ただし、宣言と定義の両方にデフォルト引数を書いたら駄目。

デフォルト引数は関数呼出しのときに補われるのであるから、
関数呼出しのときにデフォルト引数が何かわかっていなければならないので、
分割コンパイルしたときに実装 (関数定義) 側にデフォルト引数が書かれていても
呼出し側でデフォルト引数が何かわからない。
それでは困るから、原則としてはプロトタイプ宣言の側にデフォルト引数を書くものだと思っておけば無難ってことになる。
0133デフォルトの名無しさん垢版2018/08/02(木) 04:15:29.78ID:fAfw4oAh
すいません入門書のfor文のコードなんですが
http://codepad.org/A357YvMb
19行目からどういう順番で動いて何やってるのか一切分からないので解説して下さい;
点数高い順に並べ替えてるみたいなんですが、どう動いてるのか分からないので全然納得出来ないです
0134デフォルトの名無しさん垢版2018/08/02(木) 05:55:02.70ID:RdYw4Wzo
>>133
まず先頭と2番目を比較し、2番目の方が大きければ先頭と入れ替える。
次に先頭と3番目を比較し、3番目の方が大きければ先頭と入れ替える。
・・・
先頭と末尾をを比較し、末尾の方が大きければ先頭と入れ替える。
ここまでで、先頭の要素は、他のすべての要素より大きくなる。
つまり、先頭の要素は一番大きい要素になる。(内側のループ1回目)

次に2番目と3番目、2番目と4番目・・・2番目と末尾で同じことをすることで、
2番目の要素は2番目に大きい要素になる。(内側のループ2回目)

あとはこれを繰り返せば、大きい純に並び替えられる。

詳しくは、「選択ソート』で検索。
0136デフォルトの名無しさん垢版2018/08/05(日) 18:48:49.49ID:IlbWYfru
どうか教えてください
C++言語プログラミングのクラス実装にて
文字列を合成するメンバ関数を以下のように書きました
std::string オリジナルクラス::getConectString()
{
return 文字列1 + 文字列2;
}

このあとに、合成された文字列の「長さ」を求めるためのメンバ関数を
int オリジナルクラス::getConnectLength()
{
return getConnectString().length();
}
とすると「長さ」が正しく求まりました
上記のように、getConnectString()というメンバ関数名に.length()を用いることは
使い方としてあっていますか?
よろしくお願いします
0138デフォルトの名無しさん垢版2018/08/05(日) 20:37:06.00ID:IlbWYfru
>>137
ありがとうございます
不安解消できました
0140デフォルトの名無しさん垢版2018/08/05(日) 21:03:53.86ID:IlbWYfru
>>139
メソッドチェーンを早速調べてみます
初めて知る言葉なので感謝です
0141デフォルトの名無しさん垢版2018/08/09(木) 06:33:36.32ID:PReqPOhL
入門書のコードなんですけど
http://codepad.org/iEAdMKmK
これをvisualstudio2017で実行するとstrcat,scrcpyの宣言を確認してくださいとか何とかたくさん出て実行できません
何が原因なんでしょうか?何かインストールのし忘れですか
0144デフォルトの名無しさん垢版2018/08/09(木) 13:47:27.82ID:NndPCS/I
「*_s を使え」は警告であってエラーじゃなかった記憶
include 行より前に
#define _CRT_SECURE_NO_DEPRECATE
を置くと警告は消せるけど

実行できません=コンパイルエラーなら
本質は >>142 の stdio.h と string.h のインクルード足らずでしょう
0145デフォルトの名無しさん垢版2018/08/09(木) 18:20:43.03ID:PReqPOhL
>>142->>144
ありがとうございます。
#include <stdio.h> #include<string.h>入れても結果は同じでした。(iostremをぬいても結果は同じでした)
https://gyazo.com/a4a296eff2f108205068ec8724814005
自分の環境がおかしいんですかね…入門書のコード自体は間違ってないんでしょうか?
>>143さんの
strcpy_s ,strcat_s という表記にしてみたらおかげさまで実行できました!
0146144垢版2018/08/09(木) 20:22:12.13ID:jMDw6MMS
スクショあり
「セキュアじゃないから使うな」はエラーになってるのな
0150デフォルトの名無しさん垢版2018/08/09(木) 23:46:51.29ID:N7zY56wf
>>148
最初の質問が>>141なら、既にcstringをインクルードしてるんだから、わざわざstring.hなんて書くべきではないと思うけど、最初の質問てどれのことだろう?
0151デフォルトの名無しさん垢版2018/08/10(金) 04:21:11.55ID:ZbqK12l8
class Abc {
public: int meas() {return 1;}
};
int Func() {return 1;}
int main()
{
Abc aa;
int (*flist[])() = {aa.meas}; // 1.error 非標準の構文
int(*fpFunc[])() = { Func ,Func}; //2.ok
}
クラスインスタンスのメンバー関数の関数テーブルをつくりたいんだができない。何か良い方法は
無いものだろうか? 2ができるのに1ができないのは解せない。
0153デフォルトの名無しさん垢版2018/08/10(金) 07:18:29.02ID:ZbqK12l8
回答ありがとう。
class CTest { public: void Func(); };
void (CTest::*fpFunc)() = CTest::Func;
問題なくコンパイルできたと思います。このように、メンバ関数ポインタの文法は
<戻り値の型> (<クラス名>::*<変数名>(<引数リスト>);

この説明は読んだが、それはインスタンスに対してはつかえないでしょ。
{aa.func,bb.func}
のように集合したい場合に使えないから上の例とは問題がすこし違うとおもう。
というかC++では仕様的に無理なのかな?
0154デフォルトの名無しさん垢版2018/08/10(金) 07:56:57.78ID:xeFjyQQA
>>153
無理だよ。
メンバ関数の実体はインスタンス毎にそれぞれメモリ上に配置されるのではなく、異なるインスタンスでも実体は一つ。だから、インスタンスごとにメンバ関数のアドレスが異なる訳ではないので、そういうことはできない。
メンバ関数をポインタ経由で呼ぶためには、インスタンスそのもののポインタと、メンバ関数ポインタをセットで使う必要がある。
0159デフォルトの名無しさん垢版2018/08/10(金) 11:57:40.37ID:LvXbuhRM
>>151
普通に
int main(){
Abc aa;
Abc bb;
int list[] = {aa, bb};

auto x = list[0].meas(); // 呼び出し

じゃダメなの?
0165デフォルトの名無しさん垢版2018/08/11(土) 07:05:15.22ID:eZwdztat
>>154
そういうことなのですか? 分かりやすい説明でスッキリしました。

>>159
そうですね。それだとイメージ的にはthisのポインターリストですからメンバーを含めてcと同様の関数テーブルをつくるには
PointerPareList[]={
{this1, メンバー関数のローカルポインター1},
{this2, メンバー関数のローカルポインター2},
{thisn, メンバー関数のローカルポインターn},
};
にすればよいのかな。でもローカルポインター(クラス内の相対アドレス)がとれない?でしょうね。それに実行方法も
問題ですね。

>>164
私もラムダを使う方法で実現しました。functionは知らなかったので使わずに関数ポインター配列でもできました。
ラムダ式を使うとすんなり動作しました。
0166デフォルトの名無しさん垢版2018/08/11(土) 07:22:17.85ID:WnJNWI2T
入門書のコードなんですが
http://codepad.org/IIJB22M5
これの11行目と12行目は何をする関数でこのプログラムで何の役割を担ってるんですか?
typedef,ファイルの分割、参照辺りから駆け足になってきて本の説明だけじゃ中々理解できません(+_+)
0167デフォルトの名無しさん垢版2018/08/11(土) 07:36:22.18ID:d91dd04/
getter/setterはaccessorアクセサというもので、メンバ変数をやりとりするための関数

なぜこんなものが必要なのかはJavaにて議論されてる
ttps://qiita.com/katolisa/items/6cfd1a2a87058678d646
ttp://d.hatena.ne.jp/Nagise/20141010/1412930502
ttps://geechs-magazine.com/tag/tech/20170215_2
ttps://teratail.com/questions/27789
ttps://www.deep-rain.com/programming/program/626
0168デフォルトの名無しさん垢版2018/08/11(土) 07:51:24.20ID:L4B/ldSd
>>165
ラムダ式を関数ポインタに代入できるのは、キャプチャしてない場合だけ。
今回の場合、元のオブジェクトをキャプチャする必要があるので、
関数ポインタに代入することは出来ないはず。
実際、手元のclang++ではビルドできなかった。
処理系の独自拡張でたまたま動作しているだけじゃないかな?
0169デフォルトの名無しさん垢版2018/08/11(土) 08:05:06.20ID:WnJNWI2T
>>167
java知らないので一瞬わからなかったです;
ドット演算子でメンバ関数表示出来ないからややこしいことしてたんですね
分かりました。ありがとうございます
0171デフォルトの名無しさん垢版2018/08/11(土) 08:50:14.12ID:eZwdztat
>>168
キャプチャしてません。(あまりよくわかってないが、、)
オブジェクトをグローバルで定義してるからだろうか?
組み込みなので頭で定義してる。

fpfunc funclist[] = {
[](bool tf ){ Seqif.ledon1( tf ) },
[](bool tf ){ Seqif.ledon12( tf ) },
[](bool tf ){ Seqif.ledon21( tf ) },
[](bool tf ){ Seqif.ledon35( tf ) }
}
0172デフォルトの名無しさん垢版2018/08/11(土) 10:06:46.89ID:WNr/dTgn
>>165
> PointerPareList[]={
> {this1, メンバー関数のローカルポインター1},
> {this2, メンバー関数のローカルポインター2},
> {thisn, メンバー関数のローカルポインターn},
> };
そのメンバー関数って要素ごとに異なるの?
異なるならこんな感じでやればいい
#include <stdio.h>
class Abc {
private:
int n;
public:
Abc(int n_) : n(n_) {}
int meas0() { return n + 0; }
int meas1() { return n + 1; }
};
int main() {
Abc aa(10);
Abc bb(20);
struct {
Abc& This;
int (Abc::*Func)();
} list[] = {
{ aa, &Abc::meas0 }, { aa, &Abc::meas1 }, { bb, &Abc::meas0 }, { bb, &Abc::meas1 }
};
for (auto x : list) {
auto n = (x.This.*x.Func)();
printf("n = %d\n", n);
}
}
0173デフォルトの名無しさん垢版2018/08/11(土) 18:31:52.91ID:WnJNWI2T
>>170
メンバ変数に直接アクセス出来ないから値だけを返す関数作ってるのかな?って
URL先見て理解したんですが間違えてますか;
0174デフォルトの名無しさん垢版2018/08/12(日) 09:04:38.07ID:0uSju4C4
メンバ変数を外部から書き換えさせないためのprivate指定と、
書き換えさせないけど値の読み出しはさせてやるためのget〜関数、
と考えるのが宜しいかと。
0175デフォルトの名無しさん垢版2018/08/12(日) 21:42:22.35ID:zeMljtXN
>>172
凄い。そういうことができるんですね。
メンバー関数のタイプはすべて同じなのだがクラスのタイプがことなるものが混在するばあいはどうすればいいだろ。
Abc aa(10);
Efg bb(20);
こんな場合。
0176デフォルトの名無しさん垢版2018/08/14(火) 03:08:53.25ID:nTdTTFHr
size_tを戻り値に使った関数が定義されてるんですけど、size_tはどういう型なんですか?
この入門書で、何の説明もなく使われてるんですが…
0179デフォルトの名無しさん垢版2018/08/14(火) 08:07:02.01ID:nTdTTFHr
>>177
ありがとうございます。照らし合わせたら何とか理解できました;
それとなんですが……ロベールってプログラミング初めてやるのに向いてる書籍ではないんでしょうか?
書籍スレで聞いたら噛みつかれたりしてまともじゃなかったので、、もしもっと簡単な本あれば教えてほしいです;
0180はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/14(火) 10:46:11.90ID:EPC9iky2
>>179
入門者向けというのは内容が簡単という意味ではない。
入門的なことを根本的な理屈から説明している本は難しいかもしれないが入門者にとっては有用だし、
でもそういうのはモチベーションが続かないっていう人にとっては理屈はともかく動作するものを中心に
した方が良いかもしれないし、学習のスタンスによるんじゃないの。
良いか悪いかというスカラ的な軸では評価できないよ。

俺はロベールの本とやらを読んだことが無いので具体的な評価はできないけども、
古いという点でややマイナス評価かな。
C++11 (C++ の仕様の 2011 の改定) が大きなターニングポイントなので、
それよりも古い仕様を想定した書籍は現代作法的にちょっと微妙な箇所があったりする。
0181 ◆QZaw55cn4c 垢版2018/08/14(火) 11:13:21.53ID:5K5qKv3G
>>180
C++11 or later をあからさまにターゲットにした和書は
https://www.amazon.co.jp/dp/4774174084/
しか持っていない、これも辞典形式で右辺値参照とかは詳しくない、いまはもうちょっと増えているかと期待するが
0182デフォルトの名無しさん垢版2018/08/14(火) 18:10:42.27ID:TB9AjC50
>>175
基本クラスを作って各々派生させるくらいしか思いつかなかった
#include <stdio.h>
class Base {
public:
iint n;
Base(int n_) : n(n_) {}
virtual int meas0() = 0;
virtual int meas1() = 0;
};
class Abc: public Base {
public:
Abc(int n) : Base(n) {}
int meas0() override { return n + 0; }
int meas1() override { return n + 1; }
};
class Def : public Base {
public:
Def(int n) : Base(n) {}
int meas0() override { return n + 10; }
int meas1() override { return n + 20; }
};
... 続く
0183デフォルトの名無しさん垢版2018/08/14(火) 18:12:17.45ID:TB9AjC50
int main() {
Abc abc(100);
Def def(200);
struct {
Base& This;
int (Base::*Func)();
} list[] = {
{ abc, &Base::meas0 }, { abc, &Base::meas1 },
{ def, &Base::meas0 }, { def, &Base::meas1 }
};
for (auto x : list) {
auto n = (x.This.*x.Func)();
printf("n = %d\n", n);
}
}
0184デフォルトの名無しさん垢版2018/08/14(火) 22:59:32.77ID:nTdTTFHr
>>180
いいお値段する本なので中々乗り換える決心が付きませんでしたが
これを機にもっと簡単なコードが沢山載ってて手で動かしながら直感的に覚えられる新しい版の本探してみます。
スレチにも関わらずアドバイス頂きありがとうございます(´ω`)
入門書≠簡単ではないんですね…苦しんで覚えるCみたいにいい意味でタイトルに偽りある本があればいいんですが
0185デフォルトの名無しさん垢版2018/08/15(水) 02:59:09.35ID:gGWJA2ph
>>182
参考になります。ありがとう。
0186デフォルトの名無しさん垢版2018/08/15(水) 03:01:14.65ID:gGWJA2ph
namespace Name1{
void func1(){}
}
namespace Name2{
void test{
Name1::func1(); //error になる。
}
}
vs2017でテストするとコンパイルOKなのだが、TIのccsコンパイラだとエラーになる。
TIの場合はNamespaceはクラスにたいしては有効だけれども、グローバル関数に関してはエラーになる。
これは正しい文法なのだろうか?
0187デフォルトの名無しさん垢版2018/08/15(水) 03:30:10.43ID:JotEkZGJ
pubgはUE4で作られてる
そのUE4はC++
銃弾の反動とかゲーム中にどんな計算されてるのか知りたいんだけどどうやったら知れますかね?
0188デフォルトの名無しさん垢版2018/08/15(水) 04:36:03.80ID:WdeJX/bN
>ロベールってプログラミング初めてやるのに
まず、プログラミングの初心者が、C++ を学ぶには数年以上掛かる!
Ruby など数言語を数年いじくりまわした人が、やっと、C++ を学ぶスタート地点に立てる

各言語の入門書は、決してプログラミング初心者向けではない!
数言語をいじくりまわした人が、その言語に関しては、知らないというだけ。
既に数年のコンピューターリテラシーを学んだ人が、各言語の入門書を学べる

つまり、プログラミング初心者と、各言語の初心者は違う。
まず、Ruby, Python, JavaScript など、軽量言語を数年やるべき

C++ は最難関!
20年以上、C で開発している中高年でも、ほとんどの人は出来ない!

それでも、やりたいのなら、ロベールしかない。
他の本では、絶対に無理だから!

漏れらみたいに、10言語を何十年もやってれば、速習でも読めるけど。
初心者がC++ なんて、時間の無駄
0189デフォルトの名無しさん垢版2018/08/15(水) 05:34:32.93ID:zJa27iMm
そこまですごいもんでも無いと思うがな
ストラウプスのネタ本を読んでからまったりと覚えれば良いと思うがな
0190188垢版2018/08/15(水) 05:36:14.55ID:WdeJX/bN
例えれば、プログラミングの初心者は、小学生だろ。
一方、C++ は高校生

小学生が、高校生の教科書を理解するには、10年掛かる。
読んでも理解できない

小・中・高と、簡単なものから順序よく理解していかないといけない

だから、プログラミングの初心者が、C++ から始めるのが根本的に間違い!
それとも誰か、プログラミングの初心者は、C++ から始めろって勧めた奴でもいたか?
0191デフォルトの名無しさん垢版2018/08/15(水) 05:38:50.07ID:fSWxnCwv
>>188
> プログラミングの初心者が、C++ を学ぶには数年以上掛かる
> Ruby など数言語を数年いじくりまわした人が、やっと、C++ を学ぶスタート地点に立てる

こマ?


> 20年以上、C で開発している中高年でも、ほとんどの人は出来ない!

新しいことを覚える気がないK&RかC89脳おじさんなだけじゃないの?


> 各言語の入門書は、決してプログラミング初心者向けではない!
> 既に数年のコンピューターリテラシーを学んだ人が、各言語の入門書を学べる
> まず、Ruby, Python, JavaScript など、軽量言語を数年やるべき

RubyやPythonやJavaScirpt の入門書も同様ではないの?
0192デフォルトの名無しさん垢版2018/08/15(水) 05:40:47.64ID:fSWxnCwv
そうしたら、RubyやらPythonの入門書の読み方、勉強の仕方を覚えるための

学習用擬似言語みたいなものが必要になってくるな
0196デフォルトの名無しさん垢版2018/08/15(水) 06:46:30.99ID:2ovpzQjs
>>189
「ストラウプスのネタ本」とは具体的にはどんな本なの?
言葉だけ見るとハゲ先生がC++に関して面白おかしく書き綴った
軽く読める本に思えて興味をそそられるんだが。

ネット検索できる程度の情報(タイトルとか)を教えて下さいな。
0197188垢版2018/08/15(水) 07:21:49.59ID:WdeJX/bN
禿の本は、小難しいだけ。
ロベールよりも遥かに難しいから、読んでも無駄

「苦しんで覚えるC」は、内容がない。
手順書だから、1〜2時間ぐらいで読める。
こう打ち込んだら、こう表示されるという内容

「たのしいRuby 第5版、2016」を3回読んだ方が、遥かにためになる。
Ruby は、C/C++ みたいに余計な儀式がない。
処理が、ソースコードそのままで表現される

スクエニなど、社員が数千人いても、募集しているだろ。
C++ なんて、千人中1人も出来ない

20年開発していても、資格を取れないとか、そんな奴ばっかりだろ。
そういう連中がどうやって、C++ の本を理解できるのか?w
無理や

Rubyの女神・女優の池澤あやかも言ってる。
初心者が大学で、Cから始めるから、皆プログラミングが嫌いになる。
Rubyから始めれば良いのにって
0198デフォルトの名無しさん垢版2018/08/15(水) 08:16:14.36ID:gGWJA2ph
でもCから始めるというのはそんなに間違っていないと思う。特に情報や電気、電子工学系など
本格的にプログラミングをやろうとする人に関しては正しい入門方法だと思う。
Cからの入門が適切な人にとっては、次はC++でもよいと思う。もともとC++はCを含んでいるので
初心者がC++から始めるというのはある意味正当な方法だろう。
具体的には、たとえばハードウエア割り込み信号を捉えるプログラミングは、他の言語では非常に
理解しずらいと思う。C++なら直接割り込みが起こったところをステップ動作で観測できる。
こんな言語は他にはないだろう。しかもそのデータをメモリーに蓄積して、適切に処理したのちに
さらにデータベースに格納するなど。微細な部分から非常に大規模な部分までをトータルにカバー
できるというダイナミックレンジにおいてもC++以外の言語はないのではないだろうか?

とはいえ自分もC++は毛嫌いしていままで使ったことはなかったが、使ってみればかなり便利だ。
0200デフォルトの名無しさん垢版2018/08/15(水) 11:19:42.54ID:PzLkDuyq
>>188
細かく道筋教えていただきありがとうございます
使いこなせるようになりたい言語はC++C#と決まってるので出来れば
この2つを覚えるのに有用な言語がいいんですがruby,python,javascriptの3つのうちどれが有用ですか
出来れば実行環境を用意するのに手こずらない言語がいいです。一度何処かのスレでjava勧められて環境変数が云々で挫折してるので‥
0201188垢版2018/08/15(水) 11:34:53.13ID:WdeJX/bN
この本を薦める。
たのしいRuby 第5版、2016

オブジェクト指向を学びたいなら、
スッキリわかる Java入門 第2版、2014

どの言語でも、環境構築が難しい。
だからプログラマではない、Excel エンジニアが多い

どの企業でもプログラマ募集ではなく、
コンピューターリテラシーがある人を求めているのは、そういうこと

数十のLinux コマンド・PowerShell のコマンドを知っている人とか、
環境変数PATH を知っている人とか

1. Ruby, Python, JavaScript,
2. Java, Kotlin, C#,
3. C, C++

言語の順番で言えば、C# は6番目。
5年後ぐらいw

1は軽量・動的言語、2は静的言語、3はポインターを扱う言語。
だから大学教育で、7番目のCから教えるのは、明らかな間違い
0202188垢版2018/08/15(水) 11:49:34.58ID:WdeJX/bN
ロベール1冊を読む時間よりも、以下の3冊の方が、
はるかに短時間で読めるし、身につく。

それぐらい、C++ は難しい・ややこしい。
C/C++ のようなポインタのある言語は、必要に迫られるまで避けるべし!

たのしいRuby 第5版、2016
みんなのPython 第4版、2017
スッキリわかる Java入門 第2版、2014
0203 ◆QZaw55cn4c 垢版2018/08/15(水) 11:50:30.19ID:a3nr9Eye
>>200
Java は「pathを通す」―環境変数 path を設定するだけで使えるようになりますよ
OS はなんですか?

私は Java を推薦します。
Ruby は癖があり、python はオブジェクト指向が徹底されず(private 変数を外から触れる)いまひとつ
0204はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/15(水) 12:17:21.11ID:h98LWHBZ
C++ を使えるようになりたいなら C++ を学ぶのが当たり前の道筋じゃん。
何言ってんの?
0206デフォルトの名無しさん垢版2018/08/15(水) 12:39:19.21ID:PzLkDuyq
C++はたくさん動画とかも上がってるし初心者にとっつきやすい言語と思ってたんですが
そうでもないんですか…
綺麗なゲーム作りたいから早くC++C#やりたいんですが厳しいですか;
>>スッキリわかる Java入門 第2版、2014
お薦めしてもらったスッキリjavaは買ったんですが前述の通りsdkが説明どおりにやってもインストール出来なくて…
C++やるためにvisualstudioはインストールしたんですけど、visualstudioあればRubyとかpythonも出来るんですか?
>>203
OSはwin10の64bitです。dokojava筆者の説明どおりにやってなんどもインストール・アンインストール繰り返しましたが駄目でした
とことん相性が悪いようです;;
0207 ◆QZaw55cn4c 垢版2018/08/15(水) 12:43:35.59ID:a3nr9Eye
>>206
https://techacademy.jp/magazine/8998
で Java インストールを試してみてください
以前トラブっているのを読んでいた限りでは、この方法が有効なはずです、Windows7, WindowsXP 時代からこうしてきました
0208デフォルトの名無しさん垢版2018/08/15(水) 13:31:25.14ID:PzLkDuyq
>>207
コマンドプロンプトでjavac10.0.2って出てきたんですがこれは成功いけてますか?
以前教えてもらった時はpowershellとか色々やっても
全然駄目だったのに……今回一発で出来たっぽいです
なんと感謝していいのやら;ありがとうございます…!
脱線してスレ違いになってすいません。
0210196垢版2018/08/15(水) 17:02:04.76ID:2ovpzQjs
>>199 ありがとう。『C++の設計と進化』はタイトルは知ってるけど
読んだことはない(お高いのでなかなか買う踏ん切りがつかない)。
『プログラミング言語C++』第4版の中でも何回か言及されてるから
いつか読もうとは思ってる。

…とか言いつつ、先刻まで「進化と設計」と覚えていた。
確かに「設計と進化」、設計して作ってさらに進化、じゃないと
話が合わないね。
0211デフォルトの名無しさん垢版2018/08/15(水) 17:32:30.42ID:zJa27iMm
何故そうなっているか?を書いているから良書だよ
丸暗記以外はしない人には不要かも知れないけど
0212デフォルトの名無しさん垢版2018/08/15(水) 21:50:43.50ID:VaT5tlrt
noexceptについてなんですが、標準ライブラリのコンストラクタとかって
実装が勝手にnoexceptを付けたりできますか?

cppreferenceによるとunordered_map()のデフォルトコンストラクタはnoexceptが付かないことになってますが
noexcept(unordered_map<string, int>()) の値を見てみたら、ideone.comではtrueになっていました。
Visual C++だとfalseです。
安全側、制約の強い側になるので実装によって異なっていても問題ないということですか?
0213188垢版2018/08/15(水) 23:40:56.26ID:WdeJX/bN
>>207 のリンクにあるような、
ユーザー・システム環境変数の画面のPATH をわからない人は、プログラマーにはなれない。
プログラマーになれない、Excel エンジニアが多いのは、PATH の仕組みがわからないから

数十ある、基本コマンドを勉強していないから

シェル(PowerShell・コマンドプロンプト)で、
「ruby 引数」のようなパス無しの「コマンド名 引数」でなぜ、
実行ファイルが探し出されるのか?

ruby で起動される実行ファイルは、ruby.exe, ruby.dll, ruby.sh なのか?
それらが同じフォルダにあれば、どれが起動されるのか?

こういう質問に答えられない人は、何十年プログラミングしていても環境構築できない

こういう人は、単なる土方プログラマーで、
コンピューターリテラシーがないから、企業が採用したくない人!

土方プログラマーはいらない!
コンピューターリテラシー、つまりシステムの知識がある人が求められている
0217デフォルトの名無しさん垢版2018/08/16(木) 01:24:16.82ID:IiF9TGTT
詳説 Cポインタ、2013、オライリー・ジャパン

ポインタの仕組みだけで、1冊出てるぐらいに難しいw
0218デフォルトの名無しさん垢版2018/08/16(木) 02:00:08.68ID:5ZuBlO3L
>>216
よく、スレで宗教戦争を起こしているでしょ

C言語がポインタの表記について混乱しているから、難しい。
に一票かなぁ
0220デフォルトの名無しさん垢版2018/08/16(木) 04:05:41.81ID:QPt6nAZj
>C言語がポインタの表記について混乱しているから、難しい。

混乱してるようには思えないんだが、どう混乱してるの? まあ確かに関数のポインターの型表記
などは難しいといえば難しいな。それを言うならC#だってラムダの型表記などはautoしてみないと
分からないようなことがある。ラムダもポインターに似たようなものだからね。
0221デフォルトの名無しさん垢版2018/08/16(木) 04:33:02.52ID:QPt6nAZj
Cは凄くいい言語だと思う。シンプルで綺麗で分かりやすい。ただC++は失敗作だ。しかし
C11あたりからその駄目部分をカバーしてきている。つまり使い方を選んで使えばC++は
非常に便利に使えるようになってきている。
本を読んでもC++の作者が書いた本は混乱していて分かりずらい。物事を複雑に考え過ぎて
混乱している。こういう人には綺麗な言語を作るのは難しいだろうと思う。今のC++はC#やJava
が作り出した成果を取り込んで、精神を叩き直されたC++だから元々のC++とは違うものだと思う。
0224デフォルトの名無しさん垢版2018/08/16(木) 08:51:18.80ID:E47+EAA3
>>215
ありがとうございます。
明示的に許されていたのですね。
今回はVisual C++でコンパイルできないコードをideone上でミニマムに
再現しようとしたところコンパイルできてしまって躓いていました。
0226 ◆QZaw55cn4c 垢版2018/08/16(木) 20:00:17.55ID:G1RQbz/X
>>221
>C11あたりからその駄目部分をカバーしてきている。
私は C++11 以降は「進んで追わない」と決心してしまった敗者ですが、
そういう敗者であっても、C++11 が以前の欠点をカバーしている、というのなら、それをおききしたいです
C++11 later の改良点をひとことでいうと、何なんでしょうか?
0227さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/08/16(木) 20:08:00.52ID:x8SR5C2S
【C++11の改良点のおさらい】
autoキーワードにより、イテレータの型名の指定を省略できるようになった。
std::map, std::setの高速版のstd::unordered_map, std::unordered_setが使えるようになった。
初期化リストにより、初期化が楽になった。
ムーヴにより、所有権の移動を高速化できる。
0229さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/08/16(木) 20:11:14.15ID:x8SR5C2S
範囲for文が使えるようになった。
constexprキーワードにより、さらなるコンパイル時計算の最適化が可能になった。
例外の扱いが改善された。
0234さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/08/16(木) 20:38:48.53ID:x8SR5C2S
C++11の改良点は、性能と使いやすさを両立させるものである。

例えば、初期化リストを使えば、要素をまとめて確保できるので高速化が期待できる。
ムーヴは、コピーよりも高速である。
0236デフォルトの名無しさん垢版2018/08/17(金) 01:09:51.00ID:z0QZs6fU
>>226
素人考えだけど
vector<int> vec = {1, 2, 3};
for (auto elem : vec) {
cout << elem << endl;
}
みたいなことが出来るのは実用的にはものすごくありがたいよ
濫用して読みにくくなるのは問題だけど、決まりきった処理を簡潔に書きたい場合はむしろ読みやすくなるわけだし
0237デフォルトの名無しさん垢版2018/08/17(金) 02:58:27.01ID:dtoRpN7Z
>>236
そういうところが凄く便利になったね。
でも過去の負の遺産も引きづっている。なかでもcoutは特に嫌いだ。
coutは使わないことにしている。コードが汚くなって台無しだ。
0239デフォルトの名無しさん垢版2018/08/17(金) 08:17:38.10ID:vsbGGS7B
スレ頭なんだけど
ルート2っていうのがそもそも代数的に定義されたもので、有理数の加減乗除で表すのは不可能
じゃあルート2が何で存在するかっていうと、その代数的性質を満たす仮の数(!)にどこまでも近づけるから
どこまでも近づくっていうのは、好きなオーダーで誤差を小さくすることが出来ることを言う

結局ルート2っていうのは任意の誤差で二乗して2になるような性質に近づく手続きのこと

誤差のオーダーを与えればそれを満たす数をただひとつ返す関数があれば
それはルート2 と数学的に同値

あんま役にたたないけど
0244デフォルトの名無しさん垢版2018/08/17(金) 10:56:33.19ID:IY1i+MSt
要するに数表だろ
実用的なのはデータベースで100TBくらいじゃねえの
0.0から6.24...まで0.00000000000000000000000000000001刻みで計算しとくんだろ
あとはルックアップテーブルに丸投げ
0245デフォルトの名無しさん垢版2018/08/17(金) 11:00:24.73ID:IY1i+MSt
計算速度は、CPUが計算するか、
CPU近くの独自回路のハードウェアで計算させるか、
CPUが三角関数の値を欲しがって遥か遠方のDBに問いかけて遥か遠方のDBから数表の値が返ってくる莫大な時間か
0246デフォルトの名無しさん垢版2018/08/17(金) 12:22:41.67ID:6wrElEJt
6.24...てなんだ?

ルートの計算なんて除算と同程度に速いんだから
タイムクリティカルな場所じゃなければ
毎回計算すれば良いよ

少なくともわざわざ>>13みたいにプログラマが計算しなくて良い
0247デフォルトの名無しさん垢版2018/08/17(金) 14:19:37.82ID:5jlDcaCQ
const WCHAR* const p = L"aaaa";
というconst WCHAR*を指すポインタ定数があるとき、

typedef const WCHAR* LPCWSTR;
と型宣言がされていると、

const LPCWSTR p = L"aaaa";
と書けるけど、このときなぜ後ろのconstが前に出てくるんでしょうか。
0248デフォルトの名無しさん垢版2018/08/17(金) 14:47:24.43ID:gx59GpAN
後ろでもいいはずだけど
なぜ前に出て“これる”か、ということなら
ポインタを修飾してることが明確だからかな
typedefしてないと*の後にしか書けない
0249デフォルトの名無しさん垢版2018/08/17(金) 15:33:34.55ID:5jlDcaCQ
>>248
これ後ろのままでもコンパイル通るんですか。
で、前でもコンパイラが理解できるからどっちでもOKと。

ただそれなら、
const const WCHAR* p = L"aaaa";
という記述も特別OKにしてもらいたかったです。
0250 ◆QZaw55cn4c 垢版2018/08/17(金) 20:08:44.29ID:+Gr68LyD
>>239
え?
一辺の長さが 1 の正方形を書けば、その対角線 √2 が静的に可視化されている、のですけれども
0251デフォルトの名無しさん垢版2018/08/17(金) 20:49:46.47ID:F1d5KQ2B
>>249
それだと*が2つ以上の時に困る
const const WCHAR** p

const WCHAR * const * p
const WCHAR * * const p
WCHAR * const * const p
のどれになるか分からん。
0252デフォルトの名無しさん垢版2018/08/17(金) 23:10:43.03ID:1w8Ax1c9
>>250
スレチだしレスするの迷ったんだけど

1辺が1の正方形を本当にかけるのか、対角線を引いたときに本当にルート2なのか、可視というが何が見えてるのか
って感じで、1を正確に測りとれるとか三平方の定理とか、対角線の長さを測りとれるとか
いろんな仮定が入ってる

結局仮のルート2に収束する数列とか、>>244の言う数表(ただし無限に続く)とかと同じ議論が起きちゃう
0253デフォルトの名無しさん垢版2018/08/17(金) 23:14:50.81ID:6wrElEJt
おまいら何百年前にされ尽くしたような議論をはじめるつもりか?
ルートなんて学校で習っただろ
0254デフォルトの名無しさん垢版2018/08/17(金) 23:17:45.37ID:uIPUTYG+
1/3というのはどうなんだろう
正確に三等分なんて、分子レベル素粒子レベルまでたどり着いても不可能だってことにならない?
0255デフォルトの名無しさん垢版2018/08/17(金) 23:19:38.08ID:6wrElEJt
コンピューターで扱う上では除算と非常に近い
(一般的には)近似値しか計算出来ないのも同じ
実は計算方法までそっくり
0257 ◆QZaw55cn4c 垢版2018/08/17(金) 23:30:57.65ID:+Gr68LyD
>>252
スレチも山の賑わい…

正方形も、その対角線も、静的に存在しており無限の過程を認識する必要はないでしょう?
その対角線を、例えば 10 進法表記に対応させるときに、無限の過程が発生するだけで

アキレスと亀の話と似ている気がします
0258デフォルトの名無しさん垢版2018/08/18(土) 00:14:18.80ID:lTbYGycG
もちろんデータとして扱う時は十進対応させなきゃ行けないので、有理数の加減乗除の届く範囲で近似が必要になる

ただ実数と有理数の間には実際にでかい隔絶があって、自然数からの加減乗除による拡大は有理数で止まる

あと本物の正方形を誰が見たこともないように、正方形や円っていうのは仮定の上にあるもの
実数の存在を正方形や円(パイ)に求めるのは、結局その仮定を無意識のうちに使用しているだけ
0259デフォルトの名無しさん垢版2018/08/18(土) 00:14:34.27ID:lTbYGycG
もちろんデータとして扱う時は十進対応させなきゃ行けないので、有理数の加減乗除の届く範囲で近似が必要になる

ただ実数と有理数の間には実際にでかい隔絶があって、自然数からの加減乗除による拡大は有理数で止まる

あと本物の正方形を誰が見たこともないように、正方形や円っていうのは仮定の上にあるもの
実数の存在を正方形や円(パイ)に求めるのは、結局その仮定を無意識のうちに使用しているだけ
0261デフォルトの名無しさん垢版2018/08/18(土) 00:36:22.64ID:gititOy1
脱線ついでに、
3次元の立方体はイメージ出来るけど、
4次元の立方体ってイメージ出来る物なのかな?
訓練を積んだ数学者なら出来るの?
例えば3次元立方体を2次元平面で切断したときに出来る図形と同様に
4次元立方体を3次元空間で切断wしたときに出来る立体をイメージ出来るの?
0262デフォルトの名無しさん垢版2018/08/18(土) 00:49:01.48ID:lTbYGycG
>>261
イメージ出来るって言うのを、頭のなかで回転したり任意の方から光を当てて影を見たり切断面かいたり
出来ることだとすれば四次元は比較的いける。その辺が専門の大学院生ならイメージできる
正多胞体(多面体、多角形の四次元ばーじょん)も発見されてるし、だいぶ見えてると思う

五次元もいける数学者が数人いるという噂もある
0263デフォルトの名無しさん垢版2018/08/18(土) 00:55:50.62ID:9sBD2gG5
高次元だとイメージよりアナロジーが先行するかな自分の場合
立方体より単体のほうがイメージしやすいが
立方体だと[0,1]^nに微分同相とかきっとそんなん
0264デフォルトの名無しさん垢版2018/08/18(土) 01:07:54.17ID:gititOy1
>>262
やはりスゴイと言うしかない
そういう人なら、ゴムボールを切らずに裏返しにする事も出来そうだ
勿論、頭の中でだけど
0266デフォルトの名無しさん垢版2018/08/18(土) 16:12:57.62ID:sAtTg2RR
>>239
√2は手続きではないだろう。
1に1を足した数に2ってラベルがついてるのと同じで、
(√2)^2=2となるような無理数にラベルがついてるだけ。当然2の平方根に完全に一致する。
そして誤差のオーダーを必要とする時点で近似的な取り扱いしかできないということになるのだから、
√2が必要であれば√2として持つしかないだろう。
10進小数点表記で任意精度で表すためにはその手続きが必要となるだろうけど。
0267デフォルトの名無しさん垢版2018/08/18(土) 16:29:04.35ID:H8XUQRKC
2は自然数の加減乗除で表せる(というかそれが定義)けど、ルート2はかけない
じゃあルート2の定義はっていうと、方程式の解であって、1と2の間に存在しそうだけど本当にあるの?って話
結局新しい仮定が必要になってきて、それが収束有理数列と同値で、この列は手続き=関数と同値

なんかスレチで荒らしてすまんな
困難わかってても実際はあまり役にたたたないし
0268デフォルトの名無しさん垢版2018/08/18(土) 17:52:26.48ID:sAtTg2RR
>>267
それは正の数の平方根数が実数上に確かにある存在の証明の手続きでしかないよね
実際に任意精度で√2を求められる関数を使って(√2)^2が2になるか確認するには無限の時間がかかるよね
正の数の平方根数が実数上に確かにあるという前提に基づけば単に√2は(√2)^2が2になる性質を持った無理数、
といった形で取り扱えば十分だし、「√2は手続きだ」は言い過ぎじゃないかな。
それを言い出したらほぼ全てが手続きになってしまう。「数学的に同値」というのは「√2は手続きでも表せる」ってだけでしょ。
0269デフォルトの名無しさん垢版2018/08/18(土) 19:07:39.30ID:Ruc+zSzi
>>264
4次元の立方体なんてイメージとしての意味をなさないだろ。w というか各辺が4mの
4次元立方体なら「各辺の長さ=4m」且つ「各々の辺が互いに直行する」というだけの話だから、
Leng(a,b,c,d) =(4,4,4,4)
cross(a,b) =true ; cross(a,c,)=true:  cross(a,d)=true;
ってことだけだろ。
性質として体積は4^4 とか表面積は=ん?になるとか
一寸考えれば誰でもイメージを膨らませることはできる。
0270デフォルトの名無しさん垢版2018/08/18(土) 19:51:41.56ID:gititOy1
>>269
一応ね、
4次元超立方体同士がすれ違うときに
接空間を頭の中に描けるかどうかかな
さらにそれらが自転していたらどうかとか
0271デフォルトの名無しさん垢版2018/08/21(火) 20:26:27.42ID:3mimrG+c0
モダンなC++はnewしたのdeleteしなくても自動でやってくれるって聞いたけどガセ?
ちゃんとスマポ使わないと漏れますよね?
0274デフォルトの名無しさん垢版2018/08/21(火) 20:33:53.94ID:Rfqd4rGm
プロセス終了させたときにdeleteされるとかそんなオチ
デストラクタが走らないからそれもないか
0277デフォルトの名無しさん垢版2018/08/21(火) 22:33:32.03ID:r2zII1ha
newしたポインタはスマポで管理して自分でdeleteを書く必要がないっていう話が
文章読めない人の中でねじまがったんだろ
0279デフォルトの名無しさん垢版2018/08/30(木) 06:57:53.59ID:kCgj5iLA
入門書ロベールで使い方の説明もなくunsigned charという型をでキャスト演算してるのですが
unsigned charはcharより沢山文字が格納できる型ってことであってますか?
またsize_tは整数型ってことであってますか?
0281デフォルトの名無しさん垢版2018/08/30(木) 07:23:29.48ID:kCgj5iLA
あってないですか..
ロベールにもろくに説明ないので弱りましたね(+_+)
Size_tはアドレスを整数値に直すのに使ってたり関数の戻り値に使ってる例題があったので
整数を表すなにかと思ってたんですが違ってます、か

ググってみてもイマイチ分かりません
https://www.wdic.org/w/TECH/size_t
0282デフォルトの名無しさん垢版2018/08/30(木) 08:43:34.49ID:GbaSH31o
ロベールって人の本は読んだことない(ネット公開版は少し見た)けど、
もっと先に進めば unsigned の使いどころとか size_t の説明とかが
詳しく載ってるって構成じゃないの?
この時点でコードの細かい部分まで理解する必要はない、てな感じで。

疑問は疑問として(忘れずに)保留しておいて、とりあえず読み進むのも手かと。
0283デフォルトの名無しさん垢版2018/08/30(木) 08:53:18.15ID:kCgj5iLA
char ch='C'
cout<<(int)(unsigned char)ch<<endl;
これは何をやってるコードなんですか?キャストって2つ一変に使えるんでしょうか。
特にコード自体に意味はなく文字は数字で表現されてると伝えたかったんでしょうか?
ロベール入門は章の冒頭から応用みたいな例題出すから意味がわからなくなります
0285はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/30(木) 12:59:10.03ID:8c0RjkhV
でも、言語仕様的にはビット表現に関する規定ってあんまりないんよね。
未定義な部分や処理系定義な部分もあるので、
ビット表現で考えていたら言語仕様的には実は未定義みたいなのに引っかかってそれはそれでぐぬぬぬぬってなることもある。

char については歴史的事情でややこしいのは確かだと思う。
char が符号付きか符号無しかは処理系定義だが、
char が符号有りだったとしても符号無しだったとしても signed char とも unsigned char とも違う独立した型になっている。

>>283
char が符号付きとして定義されていた場合に int にそのままキャストすると符号拡張されるから、
それを抑制するためにいったん unsigned char を経由したのではないかと考えられるが、
入っている値が 'C' であることが確定しているならば負数ではない値で表されることは保証されているので、
unsigned char にキャストする意味なく、いきなり int にキャストしても結果は同じ。
0286デフォルトの名無しさん垢版2018/08/30(木) 16:08:50.62ID:GbaSH31o
charの変数chを(ASCII文字でなく)1byteの数値を格納するために使う場合、
単なるcharがsignedかunsignedかは処理系依存だから、
変数に格納された値を正整数(一般に0-255)としてダンプしたいときは
いったん unsigned char にキャストしてから int にキャスト、
すなわち (int)(unsigned char)ch と書くのが確実であり良い習慣である。
……てな感じかなぁ。おそらく初心者にはサッパリ分からないだろうけど。

static_cast<int>(static_cast<unsigned char>(ch)) じゃろとか
そもそも 0-255 の範囲の数値なら unsigned char で変数宣言すべきとか、
ツッコミどころも色々あろうが、きっと後のページで説明されるよね。
0288デフォルトの名無しさん垢版2018/08/30(木) 16:45:57.86ID:GbaSH31o
>>287 いや、その点は試したんだ。俺の環境では…

char ch = 'C';
cout << (int)(unsigned char)ch << endl; // 67 と表示される
cout << (unsigned char)ch << endl; // C と表示される

少なくとも unsigned char が必ず int に変換されるとは言えない。
自動的に変換される処理系もあるかもしれんが、それはそれ。
0289はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/30(木) 17:36:17.31ID:8c0RjkhV
>>287-288

>>283 のケースで int への明示的キャストを外すと int へは変換されない。

std::operator<< がいくつかの基本的な型に対応するようにオーバーロードされている内には
unsigned char のシグネチャを持つものも用意されているので、
unsigned char 型の引数が与えられればそのままマッチする。

変換が挟まる余地はない。
0290286 == 288垢版2018/08/30(木) 17:37:27.96ID:GbaSH31o
たびたび失礼。
「試すんじゃなくて規格でどう動くべきか語れ」と言われればその通りだけど、
俺の能力を超えているということで。より有能な人の援護を期待。
0291デフォルトの名無しさん垢版2018/08/30(木) 23:00:44.23ID:kCgj5iLA
>>282->>285286
ありがとうございます
せっかく回答貰ったのですがunsigned charがどういう型なのかとかそういった説明が
本書で無いのでやはり何度読み返しても理解できませんでした
今は文字を符号なしの整数に直すおまじないってことで覚えておこうと思います
0292デフォルトの名無しさん垢版2018/08/30(木) 23:14:11.82ID:/0YXnEsV
まず補数についてお勉強しなさい
まずそっから

そしてそれを8bit、16bit、32bitで表現するとどうなるか
考察しなさい

わかった?
0293デフォルトの名無しさん垢版2018/08/31(金) 00:08:27.43ID:4ZfpOo1s
https://ideone.com/gFxr1T
どっかから拾ってきた関数のソース(なんかのlibcのソース)をコピペして
signed charとunsigned charの2進表現をダンプしてやったから
補数のお勉強が捗ったら、あとで参考にしなさい
0294はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/31(金) 00:18:16.04ID:NWzNDPzW
繰返すが、言語仕様上はビット表現についてたいした決まりがあるわけではない。
表現できる範囲に着目した方が理解しやすいんでないかなぁ。
0295デフォルトの名無しさん垢版2018/08/31(金) 00:19:55.81ID:4ZfpOo1s
決まりがなかったら
ビット演算なんかできない

バカのいうことなんか
ほっといていいからな
0296はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/31(金) 00:26:44.11ID:NWzNDPzW
実際に決まってないもんは決まってない。
1 の補数を使うようなのも許されるし、実際に存在する。
ポータビリティに配慮しなければなんでも出来るのが C/C++ の良いところだが、
ガチで規格を把握しようとすると未定義の罠だらけなんよな。
0297デフォルトの名無しさん垢版2018/08/31(金) 00:27:45.45ID:4ZfpOo1s
きっとバカのオツムでは
リトルエンディアンとビッグエンディアンの計算機では
ビット演算の結果がかわる

もしくは変わるようなクソみたいなコードを書く
もう察しがつくのが怖いわ。。。
0299デフォルトの名無しさん垢版2018/08/31(金) 00:42:21.23ID:4ZfpOo1s
uint32_t aho;
unsigned char* baka = (unsigned char*)&aho;

知恵遅れはこんなことを平気でする
そして計算機によって結果がかわっておかしいおかしいとかいうワケ
0303デフォルトの名無しさん垢版2018/08/31(金) 06:35:22.71ID:Df6BGOL7
負の数の内部表現は
少なくとも以下の3種類は存在する

1の補数
2の補数
符号ビット

マイナスゼロはトラップ値として使ったりする
0304デフォルトの名無しさん垢版2018/08/31(金) 08:21:09.97ID:kqLurM/K
https://ideone.com/ub97A1
すいません↑の29行目のコードって何してるんですか?
int size = sizeof student / sizeof *student;
sizeofで studentと*studentが3に化けて 3,3で割り算して1じゃないんですか
意味がよく分かりません;
0305デフォルトの名無しさん垢版2018/08/31(金) 08:43:55.47ID:CKe+Ima+
>>304
配列の定義が見えてる場合 "sizeof 配列名" は配列全体の総バイト数になるのよ。
対して "sizeof *配列名" は "sizeof 配列名[0]" と同じで配列要素1個のバイト数。

配列全体のバイト数 / 配列要素1個のバイト数 == 配列の要素数
配列の要素数を知るためのイディオムだな。

ちなみに sizeof student も sizeof *student も 3 にはならないと思うよ。
むしろ sizeof student / sizeof *student の計算でようやく 3 が得られる。
0306デフォルトの名無しさん垢版2018/08/31(金) 08:48:39.35ID:B6cJ6E2C
>>304
配列の要素数を計算しているかと
sizeof studentは、配列のバイト単位の長さ
sizeof *studentは、student型のバイト単位のサイズ
0307デフォルトの名無しさん垢版2018/08/31(金) 10:31:41.89ID:kqLurM/K
>>305-306
これ割り算じゃないんですね
なんとなく理解できました。ありがとうございます
この方法を使うと配列が増えてもループのとこ書き直さなくてもいいということですか
0308デフォルトの名無しさん垢版2018/08/31(金) 11:51:09.55ID:B6cJ6E2C
>>307
割り算だよ
バイト単位で配列のサイズ(個数)を算出しているだけ

>この方法を使うと配列が増えてもループのとこ書き直さなくてもいいということですか
そう
0309はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/31(金) 18:49:29.63ID:NWzNDPzW
>>302
そう。 キャストについてはビット表現は関係ない。
だから (規格ではっきり決めていない) ビット表現を中心に理解しようとするのは余計なことだっていう主張ね。
0310デフォルトの名無しさん垢版2018/08/31(金) 19:17:02.43ID:CKe+Ima+
でも具体的なビット表現、0か1がいくつか並んだものを見せて
「符号なしなら数値として〜、2の補数表現なら〜と解釈される。
それを符号拡張なりゼロ拡張なりすると…」
という具合に教えた方が理解は容易な気がするよ。

「規格では(値の範囲は決まっているが)ビット表現は決まっていない」の
一点張りで、抽象的な説明だけをしても分からんでしょ。

とりあえずcharは8ビット、負数は2の補数表現、のモデルで
話が飲み込めれば、その先のcharが8ビットじゃない処理系や
負の数の表現方法が異なる場合に進める。
どうせ大半の処理系は8ビット・2の補数だから無駄にもならんし。
8ビット・2の補数に凝り固まることのないよう、気をつけて教えるってことで。
0311はちみつ餃子 ◆8X2XSCHEME 垢版2018/08/31(金) 20:21:33.49ID:NWzNDPzW
>>310
俺も先にアセンブラを触ってたタイプだからビット表現からの理解をしたのでそれが自然なんだけど、
0 と 1 の集まりで表される世界が、
表現範囲が決まっているという考え方よりも感覚的にわかりやすいだろうかと冷静に考えると
一般的にはそうでもなくない? って思えてるってのもある。

レイヤを分けて考えるってのはそんなに簡単ではないよ。
「コンピュータの中でこう処理されている」というのを知った上でそれを忘れて (抽象の壁の向こうに追いやって)
「言語の考え方 (規格) ではこうなっている」という理解を持てるかどうか……。

どうせ C を使ってるとやっぱり現実のコンピュータが透けてみえちゃうんだから、
「言語の考え方はこう」というのを押さえておけば
あとは自動的に「それを実現するために内部ではこうなっている」という風に理解していけると思うんだがなぁ。
0312デフォルトの名無しさん垢版2018/09/01(土) 00:56:02.54ID:8bxP8UXu
>>311
具体的なものがあるからこその抽象化じゃないの。
抽象化したものだけでは具体的に動かすことができないから理解するのは難しいでしょ。
0313はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/01(土) 01:29:32.00ID:0H62RJv3
>>312
アセンブラの色々を自動化したみたいな立場からのスタートだから、
歴史的には具象から抽象へという形で成立しているが、
あくまで C を学び始めた人のスタート地点として、
「ビット表現、あるいは範囲が決まった値のどちらがなじみやすいか」という話。

普通の人が日常的に数値を扱うことはあるし、
その中には上限・下限が決まっているということもある。
でも、 0 と 1 の集合で表現するという考え方を日常的にしている人はかなり少数派だよ。
馴染みやすい方から入って行って最終的に「なるほど内部ではこう表現されるのか」
に至るのってそんなに不自然な道筋かな?
0314デフォルトの名無しさん垢版2018/09/01(土) 11:33:31.89ID:8bxP8UXu
>>313
だから具体的に動作させられる環境がないと勉強出来ない。
小学校で1+1を学んで中学でx+yのように抽象化してきたでしょ。
0315はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/01(土) 13:35:02.88ID:0H62RJv3
>>314
数値型変換の規則とかも数値として決まってる。
動作させるのにビット表現で考える必要は無いだろ。

なんらかのビット表現を割り当てて動作はするけど、
そりゃコンパイラの考えることで、
人が最初からどうしても把握しておかなきゃならないもんではない。
0316デフォルトの名無しさん垢版2018/09/01(土) 14:58:35.23ID:lb2h//8s
>>315
ビット表現を最初から考えておく必要も把握しておく必要もないけど、具体的な実体を知っていた方がイメージしやすく理解しやすいと思う。
そこまで忌避する理由が分からない。
0318デフォルトの名無しさん垢版2018/09/01(土) 16:37:00.14ID:/wwW4VSs
頭悪いからビット演算できないと自白してる
0319はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/01(土) 16:46:00.86ID:0H62RJv3
>>316
繰返すが、数値のビット表現は世間一般の感性からすると全く異質だ。
だから「(いきなり最初には) イメージしやすくない」と言ってるの。
無理してでも最初に身につけられたら後が楽ってことはあるかもしれんが、
イメージしやすいってことは無い。

ビット表現は C に慣れた人にとってあまりにも当然の大前提すぎて、
それをわからん奴にはだいぶんイラつくが、
すんなりとは納得できない方が普通だよ。
0320デフォルトの名無しさん垢版2018/09/01(土) 16:47:02.21ID:/wwW4VSs
はいはい
頭悪いからビット演算できないと
だからどうした
0321はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/01(土) 16:50:28.48ID:0H62RJv3
>>318
入門者の大多数が (十分に) 頭が良いと想定するのはそれこそ馬鹿げた判断だ。
とんでもない方向の思い違いが勢ぞろいなのが普通。
0322デフォルトの名無しさん垢版2018/09/01(土) 16:56:01.26ID:/wwW4VSs
健常者に届かないぐらい頭悪いから
オレはビット演算はあきらめた
と自白されても困るワケ
0323デフォルトの名無しさん垢版2018/09/01(土) 17:10:11.60ID:3YNLHjk8
外野から見ると自分は頭が良いと思い込んでそうなID:/wwW4VSsよりはちみつの方が賢そう
0324デフォルトの名無しさん垢版2018/09/01(土) 17:11:33.86ID:/wwW4VSs
オレは頭いいとか
ひとことも書いてないからな

キミラが健常者に程遠いほど
頭悪いわけ

それがわからない?
0325デフォルトの名無しさん垢版2018/09/01(土) 17:12:36.29ID:/wwW4VSs
まず途方もないほど頭悪いという自覚がない
それが致命的

バカを自覚できないからバカが治らない
0326デフォルトの名無しさん垢版2018/09/01(土) 17:14:33.25ID:np0z0HoI
はちみつさんの主張「初心者にビット表現から教える必要はない」を
当人がビット演算できない僻み、とか捉えるのは明らかに間違いだろ。
対立が昂じて厳しい言葉を使いそうになった場を茶化すのは俺も好きだけど。
(余計に険悪になったところで「お呼びでない…」と立ち去る流れまで込み)

実際のところ「初心者に2進数での数値表現を理解させることが困難か?」
については、今なら「コンピューターの中ではゼロイチで情報が記憶される」
くらいの基本知識は持ってるだろうから、昔よりは敷居が低いんじゃないかな。

…とは言え自分もマシン語ハンドアセンブル相対ジャンプ暗算から
入ったクチだから、経験に基づいたバイアスが強いかも知れん。
ビット表現を使わず初心者に説明する良い資料があるなら読んでみたい。
たぶん得るところは大きい。
0328デフォルトの名無しさん垢版2018/09/01(土) 20:41:28.08ID:V3Jbt1LZ
>>326
必ず半角カナを使ってレスしてるいつもの人は、常に持論は正しく相手は低能というスタンスで一方的に断定しかしないから、深く考えても仕方ないよ。
半角君のいってることはまともなこともあれば的はずれなこともあるけど、常に共通するのは周りの指摘や疑問には耳を貸さず、議論の流れも無視して自分の主張を繰り返すだけということ。
だから、斜め読みして受け流すだけでいいと思うよ。
0329デフォルトの名無しさん垢版2018/09/01(土) 20:56:42.17ID:/wwW4VSs
なるほど
知恵遅れは議論したつもりになってんのか
知恵遅れの場合議論できるレベルに到達してない

まずそこの自覚がない
0330デフォルトの名無しさん垢版2018/09/01(土) 21:11:37.01ID:DoChZsV8
C形式の二次元配列は先頭から一次元配列みたいな顔して普通にアクセスできると思うんですが
C++11以降でネストしたstd::arrayでもポインタを使って一次元配列のようにアクセスしても規格上セーフですか?

↓のコードのようにforループ一つで上下左右方向の繰り返しを済ませたいです
https://ideone.com/HbRfZu
0331デフォルトの名無しさん垢版2018/09/01(土) 22:08:01.79ID:/wwW4VSs
1次元の可変の列を行とみなして
そのそれぞれの行に可変の1次元の列がある状態になってる

つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
そもそもC++の規格とか関係ない

低学歴であれば低学歴であるほど
言語の規格なんかぜんぜん分かってないくせに
自分を大きくみせるために言語の規格がどうこういってるのだけは
よおく分かったわ
0332330垢版2018/09/01(土) 23:53:24.94ID:DoChZsV8
>1次元の可変の列を行とみなして
>そのそれぞれの行に可変の1次元の列がある状態になってる
>つまり、行毎にバラバラにそれぞの行のヒープができる作りになる
というのはどういうことでしょうか
行ごとにバラバラなので行をまたいでのアクセスはできないという意味でしょうか

C形式の多次元配列もネストされたstd::arrayも、各要素は連続したメモリ領域に置かれていますよね
というかC形式の(少なくとも)二次元配列は一次元配列として全要素にアクセスできると思っていたのですが
間違っていますか?
0333デフォルトの名無しさん垢版2018/09/02(日) 00:08:35.47ID:Tb3tt8fk
array 1個作ったら1個ヒープできるのはわかる?
0334はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/02(日) 00:20:34.44ID:vK23Frpo
>>326
昔から C を使っている人ってまさにそういう感じの低レイヤや
それに付随するあれこれの知識と一緒に習得してきた人が多いと思う。
だけど、 Teratail とか StackOverflow とかでの質問を見てると、
俺らがあまりにも当然の前提と思ってそこにあることにすら気づいてなかったものが
今の入門者にとってはハードル高いのかもしれないと感じることが結構あって、
教え方も昔の通りにはいかないんじゃないかねと思えてるの。
0335デフォルトの名無しさん垢版2018/09/02(日) 00:23:28.95ID:PYGLVvbR
>>330
Cでも未定義動作だよ。
JIS C (JIS X 3010:2003) 6.5.6 加減演算子
>  整数型をもつ式をポインタに加算又はポインタから減算する場合,結果は,ポインタオペランドの型を
> もつ。(中略)ポインタオペランド及びその結
> 果の両方が同じ配列オブジェクトの要素,又は配列オブジェクトの最後の要素を一つ越えたところを指し
> ている場合,演算によって,オーバフローを生じてはならない。それ以外の場合,動作は未定義とする。
0337デフォルトの名無しさん垢版2018/09/02(日) 00:26:27.09ID:Tb3tt8fk
バカは自分で引用してる文章の意味がわかってない
ホントなかわいぞうなぐらい頭悪い
0338デフォルトの名無しさん垢版2018/09/02(日) 00:27:46.09ID:Tb3tt8fk
バカはなんでとてつもなく自分がバカであるか
分かることは永遠にない
0341デフォルトの名無しさん垢版2018/09/02(日) 00:42:46.41ID:eH7Ohm4T
>>333
ヒープというのは動的に確保されたメモリのことでしょうか
ネストしたstd::arrayというのは、std::array<std::array<int, 2>, 3>というような意味で使っていました(リンク先のコードにある通り)
その場合メモリは動的確保されないと思いますが…

>>335
Cのその「配列オブジェクト」というのは多次元配列を一つのオブジェクトとして見るのではないということですか
ポインタと要素数を引数にとる関数に多次元配列を渡すコードをこれまで少なからず見てきた(教えられた)から勘違いしてたかも
0342デフォルトの名無しさん垢版2018/09/02(日) 00:50:28.37ID:Tb3tt8fk
ヒープといのはオレがウソ書いてた
そのまま書いたら固定で配列がスタックにできる

アホが引用してるのは
あきらかに全然関係ない頭悪いのを引用してる
0343デフォルトの名無しさん垢版2018/09/02(日) 00:54:46.07ID:Tb3tt8fk
array
┣array
┃┣ int
┃┗ int
┣array
┃┣ int
┃┗ int
┗array
 ┣ int
 ┗ int

こうなる
0344デフォルトの名無しさん垢版2018/09/02(日) 01:03:53.61ID:Tb3tt8fk
アホが引用してる部分は

たとえばこんなソースがあった場合、

int* ai_aho[3] = {1, 2, 3}
int* pi_aho = ai_aho;

for (int i = 0; i < 3; ++i, ++pi_aho) {
 *pi_aho = 1;
}

pi_ahoはループを抜けたあと
pi_ahoはソース上適切でないアドレスをさしてるが
こいつを参照しなければ問題ないということが書いてある
0345デフォルトの名無しさん垢版2018/09/02(日) 01:18:27.35ID:PYGLVvbR
>>341
int a[N][M] に対して a + i するときの「配列オブジェクト」は要素型 int [M] で要素数 N の配列のこと。
N を超えて加算すると未定義動作になる。
a[0] + i するときの「配列オブジェクト」は要素型 int で要素数 M の配列のこと。
同じく M を超えて加算すると未定義動作になる。

ポインタを受け取る関数に a[0] あるいは &a[0][0] を渡した場合も M を超えて加算した場合は同じ理由で未定義動作になる。
期待した動作をすることも多いだろうけど、信頼性や移植性は損なわれる。
0347デフォルトの名無しさん垢版2018/09/02(日) 01:20:32.56ID:Tb3tt8fk
(正)int ai_aho[3] = {1, 2, 3};
(誤)ai_aho[3] = {1, 2, 3}

目視で確認した
コレでいける
0348デフォルトの名無しさん垢版2018/09/02(日) 01:23:43.36ID:Tb3tt8fk
な、低学歴知恵遅れはなにも分かってない
まずなにも分かってないのに規格読んで分かったふりしてるのがよく分かる
0349デフォルトの名無しさん垢版2018/09/02(日) 01:25:42.40ID:Tb3tt8fk
低学歴知恵遅れが規格読んでも
規格なんか分かるわけがないからな

そもそも基本的にポインタがどう加算されるかすら分かってないのに
0350デフォルトの名無しさん垢版2018/09/02(日) 01:43:11.24ID:Tb3tt8fk
uint32_t aho[4];
uint32_t* p_aho32 = aho;
uint8_t* p_aho_8 = (uint8_t*)aho;
p_aho32++;
p_aho_8+=4;

どっちのアドレスも同じになる

配列の場合どうなるか
考え方はまったく同じだな
あとはもう分かるハズだ
0351デフォルトの名無しさん垢版2018/09/02(日) 04:27:28.97ID:xXZGLywM
ロベール05-09の関数内に引きこもりって章のサンプルコードが長すぎて読めません(3ページ使用)
<algorithm>ってファイルを始めてincludeしてるにも関わらず其れに関して何ら説明ないし…
この章に関しては静的変数はグローバル変数と同じように使えてプログラムが終わるまでずっと同じメモリを参照している
と覚えられれば必要十分ですか?
何か簡単なコードを書いて教えてくれると助かります

よろしくお願いたします。
0353デフォルトの名無しさん垢版2018/09/02(日) 06:49:15.39ID:p4iMlD/t
例によってロベール著を読んでないし、下のコードはCだけど、
関数内static変数の説明なら、CもC++も変わらんだろう。
(行数節約のため詰め込み・省略してるので良いスタイルじゃない)

#include <stdio.h>

static void in_static(void) {
 static int cnt = 0; /* staticな変数 */
 cnt++;
 printf(" static %d 回目!\n", cnt);
}

static void not_static(void) {
 int cnt = 0; /* staticじゃない変数 */
 cnt++;
 printf("not_static %d 回目?\n", cnt);
}

int main(void) {
 in_static(); not_static();
 in_static(); not_static();
 in_static(); not_static();
 return 0;
}

こんな感じかな。
このコードには盛り込んでないけど、グローバル変数と違って
「関数内static変数には、基本的には関数の外からはアクセスできない」
という性質もある。
0354デフォルトの名無しさん垢版2018/09/02(日) 07:47:30.33ID:xXZGLywM
>>353
違う言語にも関わらず書いていただきありがとうございます
実際に実行してみてかなりスッキリしました
自動変数と静的変数の違い、しかと理解できました
関数についてるstaticも気になるところですが読み進めたいと思います
0355デフォルトの名無しさん垢版2018/09/04(火) 08:18:27.05ID:bj+tb6HS
char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};
は出来ないのに
char* str[]={"aaaaaaa",iiiiiii","uuuuuuu"};
が出来るのはなぜですか?
ポインタと配列は密接な関係にあるんじゃないんですか

よろしくお願い致します
0356デフォルトの名無しさん垢版2018/09/04(火) 11:38:18.11ID:ClV8CEAe
"aaaaaa" とか "iiiiiiiii" とか "uuuuuuu" がchar*型だから
char型の配列に入れようとしても無理な話
0358デフォルトの名無しさん垢版2018/09/04(火) 12:51:15.55ID:bz6n3SY3
char str[]={"aaaaaa"};はできる
char str[]={"aaaaaa","iiiiiiiii","uuuuuuu"};はできない
char *str[] = {"aaaaaa","iiiiiiiii","uuuuuuu"};はできる
char str[][9] = {"aaaaaa","iiiiiiiii","uuuuuuu"};ならできる

一番目は長さを指定しない配列変数の宣言で初期化により長さが指定されている。
二番目は{"aaaaaa","iiiiiiiii","uuuuuuu"}は文字列の配列なので変数の型と一致しないためエラーになる
三番目はポインタの配列なので配列の各要素を対応する文字列で初期化できる
四番目は配列の配列なので文字列の配列で初期化できる(ただし要素数の指定は必要)
0359デフォルトの名無しさん垢版2018/09/04(火) 14:22:07.00ID:JAXadswE
>>355
前者の[]は、文字の「列」を表すから
後者の[]は、文字列ポインタの「配列」を表すから

charはcharacterの略称、characterは文字、それが複数個集まった列が文字列
列となっているものが根本的に違う
0360デフォルトの名無しさん垢版2018/09/04(火) 17:31:45.30ID:bj+tb6HS
>>357
なんかこの違いを仕様で片付けて覚えるのはあまりよろしくないみたいなこと本に書いてあったので
違いが知りたかったです
>>356,358,359
ありがとうございます
文字列リテラルはポインタ型だったんですね
それなら代入出来ない理由も納得出来ます。スッキリしました
0361はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/04(火) 17:48:16.60ID:f5HJ/2BD
>>360
厳密にいえば文字列リテラルの型は配列だよ。 具体的に言えば const char[] ね。
暗黙の型変換で const char* として解釈される場合も多いってだけ。
0362デフォルトの名無しさん垢版2018/09/04(火) 18:01:39.16ID:gZnu4stV
そのリテラル文字列はNULでターミネートされる
配列の長さが+1される

べつにNULターミネートしなくても
文字列は扱える

つまり長さが保存されないかわりに
NULでターミネートされてる
それをcでは文字列と呼称している
0363デフォルトの名無しさん垢版2018/09/04(火) 18:04:32.71ID:gZnu4stV
そして、charの配列要素が
1つの文字を表してるとは当然限らない

MBCのように連続する複数の配列の要素が
1つの文字を表すことが多い

で、strlen()で文字の数が返却されないのは当然
0368デフォルトの名無しさん垢版2018/09/04(火) 20:43:24.10ID:gZnu4stV
ユリウス日に変換してから計算するから
問題ない
0372デフォルトの名無しさん垢版2018/09/07(金) 06:40:53.97ID:Pk3Mmzkj
悪い例 (キャストの悪用、データサイズの勝手な仮定)
int wday = 5;
printf("%.4s\n", &((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]);

軽いジョークのつもりで書いてみたけど、セグメンテーション・フォールトが出て
動くまでに予想外に手間取ってしもうた。
原因はアドレス演算子 & の付け忘れだった。
0374デフォルトの名無しさん垢版2018/09/07(金) 07:46:30.50ID:Pk3Mmzkj
表示幅の指定で .3 なら >>371 と同じになるよ。
英単語の省略形にピリオドをつけたいのは好みの問題なの。

今は曜日も月名もピリオドを付けないのが一般的なのかな。
<time.h> の asctime() も3文字3文字だね。
0375372垢版2018/09/07(金) 17:37:51.74ID:Pk3Mmzkj
たびたび失礼、そしてまるっきり実用の役に立たない話ですまぬ。

&((int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat.")[wday]
「いったん[]で配列形式でアクセスしてから要素のアドレスを得る」
なんて回り道をしないでも
(int*)"Sun.Mon.Tue.Wed.Thu.Fri.Sat." + wday
と素直にポインタの足し算だけでいけたね。


…難解Cプログラムに凝る人の気持ちがちょっと分かった気がする。
0376デフォルトの名無しさん垢版2018/09/07(金) 22:40:13.74ID:B/yxkRYZ
intのサイズがcharのサイズの4倍でないと動かない
難解ではなくただの知恵遅れのコード
0377デフォルトの名無しさん垢版2018/09/08(土) 01:17:02.50ID:ejo+9snz
sizeofがイマイチ分からないです
型や変数のサイズを出す演算子ってのは分かったんですが
例えばこの例↓どういう風に化けてるんですか?
https://ideone.com/szVAAP
sizeof studentで要素数3だから3に化けると思うんですが、右の*studentは何に化けてるんですか?
0378はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/08(土) 01:27:45.49ID:VmsJpbI+
sizeof が返すサイズってのはバイト数だというのがよくわかってないのかな。
もう C++ では type_traits の std::extent を使って欲しい気持ち。
0380デフォルトの名無しさん垢版2018/09/08(土) 01:56:15.85ID:ejo+9snz
>>378
分かってないです
ロベールの入門書読んでるんですが説明が少なすぎてこの27行目の式が分かりません。
構造型のバイト数も分かりませんし…int3個とchar一個だから13バイト?
>>379
すいません、分かりません
sizeof(student) / sizeof(Student);が何に化けてるのか検討も付きません

ありがとうございます。
0381デフォルトの名無しさん垢版2018/09/08(土) 02:11:10.26ID:j/6nk0eH
https://ideone.com/aPMXLA
コレでなにが分からないか自分で説明できないなら
すべてを諦めたほうがいい
0382はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/08(土) 02:24:06.10ID:VmsJpbI+
>>380
int のサイズは処理系依存なので、具体的に何バイトとは言えない。
でもまあ現代的なパソコンなら 4 バイトのことがほとんどだろうね。
さらに言えば仕様上は構造体の要素の間にスキマがあいててもかまわない。

> int3個とchar一個だから13バイト?

この構造体中の char は MAX_NAME+1 個じゃん。

まあそれはそれとして、
sizeof student というのは、 student という配列の大きさを「バイト数で」返してきて、
sizeof *student というのは student 配列の要素ひとつの大きさをバイト数で返してくる。
つまり、配列全体の大きさを配列の要素の大きさで割ったら配列に含まれる要素の個数になる。
この場合は 3 ってこと。

sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
0383デフォルトの名無しさん垢版2018/09/08(土) 02:52:28.11ID:OyJ8jP1h
>>377, >>380
前にも質問してた人だな
まず、sizeofはメモリ上に確保された対象のバイト単位のサイズを返す(charは1バイト、intは4バイト)
sizeof studentは、配列全体(要素数 x Student型のサイズ)のバイト単位のサイズを返す、配列の要素数は返さない
sizeof *studentは、Student型のバイト単位のサイズを返す
それらの割り算をしてるのだから、結果は要素数になる
0384デフォルトの名無しさん垢版2018/09/08(土) 02:56:57.12ID:OyJ8jP1h
>>382
>sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。

個人的にそういう表記は嫌だわw
変数のサイズを求めるなら、その型名でって思う
0385はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/08(土) 03:03:57.30ID:VmsJpbI+
>>384
へー、私は逆に型名よりも変数名で書きたい派。
これは変数 student について調べたいのであって、
型 Student について調べたいわけでは無いので。
0386デフォルトの名無しさん垢版2018/09/08(土) 03:07:29.94ID:ejo+9snz
>>382
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
0387はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/08(土) 03:08:42.91ID:VmsJpbI+
>>384-385
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
0388デフォルトの名無しさん垢版2018/09/08(土) 03:13:32.57ID:OyJ8jP1h
>>385
型が表すサイズの定数だから、変数から取得するってのが気持ち悪いよ
sizeofなんて何か細かいことワチャワチャしたい時に型のサイズ欲しいよねーって感じの演算子だものw
0390はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/08(土) 03:22:37.80ID:VmsJpbI+
>>388
この場合くらいの小さなサンプルだとあまり気にならないけど、
その変数が何の型であるか知っていなければならないっていうのが、
読むときの負荷が高いと感じてしまう。

自分を信用してないというか、自分がアホだということを信用しているので、
色々忘れて読んでも良いように書きたいと思ってる。
0393はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/08(土) 03:48:16.76ID:VmsJpbI+
そもそも

for (int i = 0; i < size; ++i) {
Show(student[i]);
}

のところはモダンな C++ では (つまり C++11 以降では)

for (auto& e: student) Show(e);

と書けるので配列の要素数を事前に計算する必要なかったわ。
0394 ◆QZaw55cn4c 垢版2018/09/08(土) 03:53:09.60ID:t7GfMYxV
>>380

>>382
>sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。

私は、これはかなり紛らわしいとおもっているので、こういうときには必ず
struct FOO { int n; ..... } array[N];
int n = sizeof(array) / sizeof(array[0]);
としています、こっちの方が好きです

構造体の配列の第一番目を指すポインタ
struct FOO *p;
p = &array[0];
のときに *p は array[0] に入っている「構造体の一つの要素全体」を表します、すなわち *p イコール array[0]

しかし、この表現はすぐに直感的にイメージとして頭に入ってくるわけではなく、何度となく書いたり読んだりしてゆっくり染みこんでくるものだ、と私は経験しています
同様に p->n とか、これと等価な (*p).n とかの表現など
書き続ければ、あるいは読み続ければ、そういうのは、だんだんわかってくるのではないかな、と。
0395はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/08(土) 03:59:06.82ID:VmsJpbI+
C を使ってるときは感覚的に理解してて全く不都合なかったけど、
C++ のテンプレートやなんやかやを利用するようになると、
やっぱりちゃんとルールを把握せないかんなと思った。
0398デフォルトの名無しさん垢版2018/09/08(土) 10:37:06.40ID:ZUEeKRTR
>>388
何かの都合でその変数の型を変えた時に変更し忘れたらバグになる元
型で書く奴はアホだと言い切ってもいいレベル
0400デフォルトの名無しさん垢版2018/09/10(月) 18:57:43.66ID:70yMIW0+
c#から使うクラスライブラリをc++/cliで作っています。
クラス変数をoutで渡してメソッド内で値を入れたいのですが、c++側はどんな風に書けばよいでしょうか?
0403デフォルトの名無しさん垢版2018/09/17(月) 21:49:35.29ID:t753Z4pL
ロベール入門の内部リンケージ外部リンケージ云々の下りがちょっとよくわからないんですが
externを付けると別のcppの変数を弄れるってことであってますか?
0404デフォルトの名無しさん垢版2018/09/17(月) 22:34:28.19ID:t753Z4pL
externをつけると別のファイルのグローバル変数、関数を使えてローカル変数は使えないんですか?
0405さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/09/17(月) 22:40:39.04ID:yTXbMS5S
>>403
はい、そうです。
>>404
staticではないローカル変数は外側から参照できない。static付きの変数は静的に確保されるので、アドレスを使えば参照できる。externを付けるのはグローバル変数の宣言。
0407デフォルトの名無しさん垢版2018/09/17(月) 23:32:43.22ID:t753Z4pL
>>405
分かりました。
ありがとうございます
staticを付けると内部リンケージになって別のcppから使えない云々書いてありますが
アドレスを使えば弄れるんですか。よく分かりませんね(@@;
0409デフォルトの名無しさん垢版2018/09/18(火) 01:22:31.81ID:OdQP9+YI
>>407
リンクってのはシンボル(名前)とアドレスを付き合わせるってこと
プログラマが意識してアドレスを使うなら何でもあり
0410デフォルトの名無しさん垢版2018/09/18(火) 01:45:06.12ID:XTp+U7qP
そして次のページにて
ヘッダファイルに#ifndef#define#endifを定義すると2重定義防止ができると説明があるのですが
これを使えばexternとか関数プロトタイプを使わないで住むということでしょうか。
だとするんであればexternとかプロトタイプ宣言とはどう使い分ければいいんでしょうか;
0412デフォルトの名無しさん垢版2018/09/23(日) 16:56:38.50ID:dZPE20Nd
現在利用出来る無償のメモリリーク解析ツールってありますか?プログラム初心者でメモリリークの対策がよくわからないのでどういうところに対策する必要があるのかを知るのに利用したいです
0414デフォルトの名無しさん垢版2018/09/23(日) 18:38:22.45ID:cRG95Xcq
vs使えばexpressエディションでも標準装備されてる
0415デフォルトの名無しさん垢版2018/09/23(日) 23:53:10.56ID:nKMJRhW5
>>413>>414
ありがとうございます
すみません。言語はCなんですが、スマートポインタなるものは使えるのでしょうか
VSのほう先ずは試してみます
0416デフォルトの名無しさん垢版2018/09/24(月) 00:23:01.63ID:Kxio7RVg
とりあえずこんな感じのコードで軽くお試しできる
デバッグモードで実行するとデバッグコンソールにリークしてるログが出力される
コメントはずしてfree()で解放するとリークしてるログがなくなる

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

void aho(void) {
  void* p = malloc(100);
  // free(p);
}

int main(void) {
  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  aho();
  return 0;
}

↓詳細はココみなさい
https://msdn.microsoft.com/ja-jp/library/x98tx3cf.aspx

あとはもうできるハズだ
0419デフォルトの名無しさん垢版2018/09/24(月) 07:47:25.22ID:A22Aay1A
入門の+operator演算子で訳わからず詰んでしまったのですが
簡単に分かりやすく解説してるサイトないですか?
0421デフォルトの名無しさん垢版2018/09/24(月) 10:37:05.34ID:nAcFE6zY
>>416>>417
ありがとうございます
頑張ってみます!
0424デフォルトの名無しさん垢版2018/09/27(木) 01:59:28.90ID:HwqzTUAF
http://codepad.org/gwutTCie
AIUEOを何回も呼び出したいとき、引数のa, b, c, d, eの部分が共通なので
何回もa, b, c, d, eと書かなくても良いようにしようと色々試しましたが中々上手く行きません
別にコピペすればいいのでそんなに気にすることでもないと思うのですが、
こんなときはどのように書いたら良いのでしょうか?
0425デフォルトの名無しさん垢版2018/09/27(木) 02:11:57.91ID:Oj9x/TA+
>>424
意図を把握できてるか自信はないが↓のbinded_AIUEOみたいなことでいいのん?

void MACRO(int a, int b, int c, int d, int e, int s, int t) {
 auto binded_AIUEO = [=](int x, int y, int z){ AIUEO(a, b, c, d, e, x, y, z); };
 if (s < 0) {
  if (t < 0) binded_AIUEO(-1, -2, -3);
  else binded_AIUEO(3, 0, 7);
 }
 else {
  if (s < t) binded_AIUEO(4, 99, 8);
  else binded_AIUEO(333, 33, 3);
 }
}
0428デフォルトの名無しさん垢版2018/09/27(木) 12:00:19.82ID:QfV3dtaO
void foo(int argc, const char *argv[])
{
}

int main(int argc, char *argv[])
{
  foo(argc, argv);
  return 0;
}

VC++2008でコンパイルすると、
「error C2664: 'foo' : 2 番目の引数を 'char *[]' から 'const char *{}' に変換できません。」
ってなるんだけどなんで?
constから非constならわかるんだけど。
0429デフォルトの名無しさん垢版2018/09/27(木) 12:27:29.59ID:3irDnMHM
type ミスなのかコピペなのか判断に迷うとこだけど

'char *[]' から 'const char *{}' 後者が { } になってるあたりにヒントは無い?
0431428垢版2018/09/27(木) 13:06:59.87ID:QfV3dtaO
>>429,430
失礼。428の書き込みがタイプミスで、実際のソースコードは [] なのですが
コンパイルエラーになります。

>>430
なるほど・・・↓にも同じようなことが書いてありますね。
https://social.msdn.microsoft.com/Forums/ja-JP/24cd88de-2159-4e8b-aee7-3fa30d8647db/12509124521253112479123982144229031124343830625968123952819312?forum=vcgeneralja

ちなみにVC2003では通ってたらしいです。
0432デフォルトの名無しさん垢版2018/09/27(木) 14:04:18.04ID:rwW0e8CF
>>431
2010ではエラーにならなかったな
2008固有の問題なのかも知れない

foo(argc, (const char **)argv);
こうしてみたらどうだろう
0433デフォルトの名無しさん垢版2018/09/27(木) 17:43:51.14ID:HwqzTUAF
>>425 >>426 >>427
ありがとうございます
これのマクロ版を書くときはどのようにすれば良いのかと思いました
例えば #define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z)
とすると1, 2, 3, 4, 5ではなくa, b, c, d, eとそのままの文字で展開されてしまいます
0434はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/27(木) 18:37:57.80ID:nKTHsEzL
>>433
こんな感じかな?

#define MACRO(a, b, c, d, e, s, t) {\
#define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z) \
if (s < 0) {\
if (t < 0) BINDED_AIUEO(-1, -2, -3) \
else BINDED_AIUEO(3, 0, 7) \
}\
else {\
if (s < t) BINDED_AIUEO(4, 99, 8) \
else BINDED_AIUEO(333, 33, 3) \
}\
#undef BINDED_AIUEO \
}

この事例ではどうしてもマクロじゃなければ駄目という理由はなさそうだけど、
実際の利用シーンでは何か意味があるのかな?
0435デフォルトの名無しさん垢版2018/09/27(木) 19:16:32.64ID:Oj9x/TA+
>>434
それできたっけ?と思って試してみたらエラーになった
マクロの中では#は識別子の文字列化になる

可変長マクロを悪用してこんな感じにはできるけれども……おすすめはできない

#define packed_MACRO(s, t, ...) {\
 if (s < 0) {\
  if (t < 0) AIUEO(__VA_ARGS__, -1, -2, -3) \
  else AIUEO(__VA_ARGS__, 3, 0, 7) \
 }\
 else {\
  if (s < t) AIUEO(__VA_ARGS__, 4, 99, 8) \
  else AIUEO(__VA_ARGS__, 333, 33, 3) \
 }\
}
#define MACRO(a, b, c, d, e, s, t) {\
 packed_MACRO(s, t, a, b, c, d, e) \
}
0437はちみつ餃子 ◆8X2XSCHEME 垢版2018/09/27(木) 19:59:57.14ID:nKTHsEzL
いずれにしても、マクロでやるのはおすすめできないパターンには違いない。
関数でやってもインライン化されたら定数畳み込みとのコンボで実行コードはだいたい同じような感じになるだろうし。
0438デフォルトの名無しさん垢版2018/09/27(木) 23:31:02.83ID:HwqzTUAF
>>434 >>435 >>437
ありがとうございます
素直にそのままa,b,c,d,eと書こうと思います
この例じゃない実際のコードは、速度を重視した結果マクロを使用することになったのですが、
冷静に考えてみれば計算数回ぐらいしか変わらないのでそこまでやる必要は無かったかもしれません
0439デフォルトの名無しさん垢版2018/10/01(月) 09:57:17.34ID:a9wHa9+i
MSVC2017+Windows10でレジストリを読み取ろうとしています。
RegEnumValueW(hKey, 0, name, &nameSize, 0, &type, value, &valueSize)
を実行してtypeがREG_SZのレジストリ入力を読み取ることには成功したのですが、
value先頭のvalueSizeバイトのユニコード文字列をstd::stringに変換する方法が
わからなくて困っています。

具体的にはwindowsのフォント名を読み取っていて、"arial.ttf"に対して
valueの中身を見ていくと、a\0r\0i\0…となっています。

LPBYTEからstringなのでとりあえずwchar_t*にしてからstringにすればよいのかと思ったのですが、
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, (int)(valueSize), NULL, 0));
でサイズ取得してから
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, valueSize, buff, size);
しても要素がchar→wchar_tに変わっただけで、\0も1文字になってしまいます。

できれば日本語にも対応したいので、下位ビットだけ読む、みたいな方法以外の対応を
探しています。ご存知の方いらっしゃらないでしょうか。
0441439垢版2018/10/01(月) 12:06:04.72ID:xWoUpfbZ
>> 440
WideCharToMultiByteでできました!
MSDNでunicode文字列を返すと書いてあったのでUTF16LEかと誤解していました。
ありがとうございました。
書き込むかわからないですが、今後は蟻様と呼ばせていただきます。
0442デフォルトの名無しさん垢版2018/10/01(月) 12:54:37.87ID:6nDzbmUC
> UTF16LEかと誤解していました
いやそこは間違ってないと思うよ
wchar_t* -> utf-16 (winに限る)
string -> 8859-1, utf-8, 等
0447デフォルトの名無しさん垢版2018/10/01(月) 19:33:59.25ID:YHT/N1Mv
趣味の自作ゲームでC++を利用しています(多人数開発などは今後も予定なしで、人様のコードは読まない)

Cの「関数へのポインタ」ってC++のポリモーフィズムがあれば理解しなくてもなんとかなりますか?
関数へのポインタが手持ちの書籍だけではわからずにいるのですが、
柴田さんのポインタ本とか買ってまで理解する価値はあるでしょうか?
関数へのポインタの存在理由もわからずにいるので、頓珍漢な事を言っていたらすみません
0448デフォルトの名無しさん垢版2018/10/01(月) 19:46:15.36ID:46GwS6ij
C++のポリホーリズムの運用が完璧であれば問題ない
が、関数ポインタがその理解の助けになるかもしれない
0449デフォルトの名無しさん垢版2018/10/01(月) 20:33:18.13ID:YHT/N1Mv
ポリモーフィズム
(基底から派生させた各ザコキャラ(各々別クラス)のインスタンスを同じコンテナに入れて各々のメンバ関数(アクションなど)を実行する)
といったかんじで便利に運用できている(と思う)ので、
関数ポインタは理解しなくても大丈夫そうでしょうか
動的関数実行の他にはどんな用途に利用するものですか?
0451はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/01(月) 21:10:49.05ID:hbafP85H
>>447
抽象クラスを活用してるってこと?
それが上手くいっているならほとんどの場合はその方が良いと思う。

ただ、仮想関数ってのは (言語仕様で決まりがあるわけではないが、一般的なコンパイラでは)
オブジェクトが暗黙に仮想関数テーブルへのポインタを持つことで実現されていて、
仮想関数テーブルには関数ポインタが格納されている。

つまり、仮想関数は関数ポインタを辿る処理を自動化したものなので、
メカニズムをよりよく理解したいなら関数ポインタのことも知っておくとわかりやすくなるかもしれない。

仮想関数テーブルの説明は Wikipedia に簡単なものがある。
https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
0452デフォルトの名無しさん垢版2018/10/01(月) 21:30:32.77ID:YHT/N1Mv
>>仮想関数テーブルには関数ポインタが格納されている。
>>仮想関数は関数ポインタを辿る処理を自動化したものなので、
やはり関数ポインタが使われていたのですか

Cプログラム診断室のホームページを公開されてる藤原博文さんが
関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書かれていたので、初心者から脱したければ勉強すべきかもしれませんね
普通のポインタでも時々間違える事あるし、ポインタ本は買っておこうかな。

お答え頂きありがとうございました!
0453デフォルトの名無しさん垢版2018/10/01(月) 22:10:58.61ID:s5/CkhHO
VC++6.0で作っています。 MFCです。
普通にSDIを作りますが、そこからメニューバー等からダイアログボックスをモードレスで起動します。
すると、ダイアログを起動しながらメインウインドウも触れるようになるのですが、そのフォーカスを
モードレスダイアログとメインウインドウとをマウスを使わずにキーボードで切り替えることって出来ませんか

MSのWindowsOSのAlt+Tabではこれらはひとつとして認識されているようでこれでは切り替えられません
ちなみに、Windows7です
0454 ◆QZaw55cn4c 垢版2018/10/01(月) 22:13:30.74ID:BhbfBp00
関数ポインタの使い道って…qsort() にて比較関数を指定するくらいしか思い浮かばないのですが…
他の関数に(キャストしまくった)関数ポインタを渡すことはあっても、自分で関数ポインタをコールする (*f)() のはあまりないのです…
0455デフォルトの名無しさん垢版2018/10/01(月) 22:35:50.82ID:88z5+fOs
関数に関数を渡す関数型っぽいのとオブジェクト指向は根柢から違うんじゃないか?
0456デフォルトの名無しさん垢版2018/10/01(月) 23:51:48.96ID:zfKNS/F/
#include <stdio.h>
typedef struct tag_baka_t t_baka_t;
typedef int (*baka_func_t)(t_baka_t const* pt_baka);

typedef struct tag_baka_t {
char* text;
baka_func_t function;
} t_baka_t;

int call_baka1(t_baka_t const* ct_baka) { fprintf(stdout, "baka1:%s\n", ct_baka->text); return 1; }
int call_baka2(t_baka_t const* ct_baka) { fprintf(stdout, "baka2:%s\n", ct_baka->text); return 2; }
int call_baka3(t_baka_t const* ct_baka) { fprintf(stdout, "baka3:%s\n", ct_baka->text); return 3; }

int call(t_baka_t const* ct_baka) {
return ct_baka->function(ct_baka);
}

int main(int argc, char* argv[]) {

t_baka_t baka1 = { "boo", call_baka1 };
t_baka_t baka2 = { "foo", call_baka2 };
t_baka_t baka3 = { "woo", call_baka3 };

fprintf(stdout, "called baka1 -> returned %d\n", call(&baka1));
fprintf(stdout, "called baka2 -> returned %d\n", call(&baka2));
fprintf(stdout, "called baka3 -> returned %d\n", call(&baka3));
return 0;
}

C言語の構造体ならコレでいける
コレならバカでもチョンでも分かる
C++の構造体でも同じように書ける
0457デフォルトの名無しさん垢版2018/10/02(火) 00:33:32.81ID:Cp0nvcbE
>◆QZaw55cn4c

いつまで荒らし行為を続ける気だ
0458はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/02(火) 02:33:55.94ID:wuORmtyC
>>454
スクリプト言語の拡張を C で書いたりすると、関数ポインタを使うこともまあまあある。

言語に限らずプラグイン的なものだと関数ポインタのやりとりは結構あるんじゃない?
Regnessem のプラグインを作ったことが有るが、プラグイン側の関数を本体に登録したりする
処理に関数ポインタは使ったぞ。

それはそうと、関係ないけど Lisp Scheme スレに書いてた疑問は解消できたの?
0459デフォルトの名無しさん垢版2018/10/02(火) 04:50:47.05ID:Cp0nvcbE
これで確認完了
0460デフォルトの名無しさん垢版2018/10/02(火) 05:07:06.87ID:WWljJiuT
>>458
> Lisp Scheme スレに書いてた疑問は解消できたの?
身辺が忙しくなってしましました、暇をみつけてじっくり考えています(ちょっと最初の方に戻っています)
0465デフォルトの名無しさん垢版2018/10/04(木) 00:21:59.55ID:C6FTp/Pz
windows 10 でmingw5.3使ってて

#include <clocale>
#include <regex>
int main() {
std::setlocale(LC_ALL, "");
std::regex reg("^ [cC]");
return 0;
}

これでbad_allocが発生するんだけど、なんかだめなの?
0466デフォルトの名無しさん垢版2018/10/04(木) 07:26:56.12ID:TASd8bzQ
ファイルに書き込みを行うプログラムの章を勉強中なんですが
実行してもtextファイルに変化ありません…
visualstudioと同じフォルダに入れてもなんとも無い
どうすれば書き込み出来るんですか?
http://codepad.org/IJwmFcAD
0471デフォルトの名無しさん垢版2018/10/04(木) 16:40:22.50ID:TASd8bzQ
>>470
出来てないです。自分でデスクトップで作成したtest,txtファイルをフォルダに入れました
同名のファイルに書き込みが出来るプログラムかと思ってたのですがもしかして勘違いしてますか…?
0472デフォルトの名無しさん垢版2018/10/04(木) 16:45:04.26ID:qnqRQVWC
>>470
ファイルを絶対パスではなく相対パスで指定した場合は
プログラムを実行した時の作業ディレクトリが基準になる
0473デフォルトの名無しさん垢版2018/10/04(木) 17:45:40.20ID:TASd8bzQ
普通にプロジェクトと同じフォルダに出来てました。ありがとうございます
自分で作ったtxtファイルに書き込みがされるのかと思ってました…
0475はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/04(木) 20:10:36.56ID:1wg41Y30
>>465
mingw の setlocale は msvcrt の setlocale で、
空文字で呼出すとシステムにセットされているロケールになるんだけど、
日本語環境だともちろん日本語がセットされる。

で、どうにも std::regex はマルチバイト系の文字符号には対応してないっぽい。
英語、フランス語、ドイツ語とかで試すと問題なかったが、
日本語、中国語、韓国語で試すと bad_alloc になる。
bad_alloc になるのが意図的な動作なのかどうかわかんないけど。

std::wregex を使う分には日本語ロケールでも例外にはらない。
0476デフォルトの名無しさん垢版2018/10/05(金) 18:01:44.43ID:X1kF7PG7
クラスの宣言に下記のように書いたらエラーになりました

class test
{
char c[] = "abc";
}

このcという文字列はこのクラスの中でずっと定数として固定で使うのが目的です
class宣言部では宣言できないのでしょうか。どうしたらいいですか
char *c; とだけして、クラスのコンストラクタでnewで作るとか、定数なのでそんなことはしたくないのですが
0478はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/05(金) 18:21:51.16ID:Cnw78CfH
今どきは必要ないだろうけど、
古い仕様 (C++03) だとこう。

class test
{
static const char c[];
};

const char test::c[] = "abc";
0479デフォルトの名無しさん垢版2018/10/05(金) 18:43:28.91ID:X1kF7PG7
>>478
ありがとう。今どきは必要ないっていうのが気になりますが、今ではもっと他の方法があるということですか
C++の最新仕様では他の方法があるのでしょうか
0482デフォルトの名無しさん垢版2018/10/06(土) 15:18:56.24ID:n32kY+69
clsA a;
clsA b;
clsA c;
clsA *h[] = {&a, &b, &c};
void main{
h[0]->mfunc();
}
クラス配列のメンバー関数を呼び出すところでセグメントエラーになるんだが、なぜできないの?
0485デフォルトの名無しさん垢版2018/10/06(土) 16:46:18.35ID:5XBjQGBu
こんなのを見つけました。 下記でここってかいてある1行を書かないとエラーになります。ラベルの次に直接 } は来たらダメなのですか
}の直前にジャンプって出来ないのでしょうか
ここでfuncxは、funcx( CString& s, CString& sHit )となっています。sを与え小さくなっていきます
またこれでgotoを使わないようにはどう書けばいいでしょうか
これが楽なのでgotoを使っちゃいましたけど
コンパイラーは昔のVC++6.0です

CString ret, sHit;
do{
ret = func1( s, sHit );
if( sHit != "" ) goto label;
ret = func2( s, sHit );
if( sHit != "" ) goto label;
ret = func3( s, sHit );
if( sHit != "" ) goto label;
ret = func4( s, sHit );
if( sHit != "" ) goto label;
label:
ret = ret; <---- ここ !
}while( ret == "" && s != "" );
0487デフォルトの名無しさん垢版2018/10/06(土) 17:29:07.42ID:5XBjQGBu
ああ、goto labelのところ、continueでいいのか
forだけじゃなくwhileが後ろにくるパターンでも使えるのですね
でも、 label: が ) の前に使えないってのはなんででしょうね
0488デフォルトの名無しさん垢版2018/10/06(土) 17:31:40.03ID:5XBjQGBu
continueは、 { } の最後に飛ぶのではなく頭に飛ぶものだと思ってましたが、 
コンパイラは、} の方に飛ぶようにつくるのですね。 for でもそうなのか。 頭に飛ぶものと思ってました
0489デフォルトの名無しさん垢版2018/10/06(土) 17:55:44.09ID:FAIH8E2E
> ret = ret; <---- ここ !

ちなみにコレ
なにやってんの
0492デフォルトの名無しさん垢版2018/10/06(土) 18:10:02.18ID:FAIH8E2E
要するにになにもしたくなかったワケか
だったら余計なことしないで空文でいい
0493デフォルトの名無しさん垢版2018/10/06(土) 18:12:36.42ID:5XBjQGBu
>>492
ありがとう。 } の直前にジャンプしたかっただけです。 で、 label: と コロンでとめるとエラーになったので
ダミー文と入れました。 やってないけど、 セミコロンだけでよかったのですね
0494452垢版2018/10/09(火) 17:17:22.89ID:JymqGv4u
>>関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書いてしまいましたが誤りでした
正しくは、以下でした

Cプログラミング診断室
第2章 これでもプロ ポインタ
より
C言語中級レベル認定問題
関数へのポインタの配列とはどういうもので、どういう使い方があるでしょうか。

藤原先生の名誉のためにも訂正しておきます
スレ汚し失礼しましたm(_ _)m
0495デフォルトの名無しさん垢版2018/10/11(木) 17:09:46.75ID:6FntMPLi
std::tuple<hoge, fuga>
std::tuple<hoge, hage, ...>
std::tuple<fuga, hoge, hage, ...>
という具合に<>の中が何パターン(ほぼ無限)もある場合

template<typename T>と
std::tuple<T>
で代表させるみたいなこと出来ますか?

出来るなら
template<typename *>
std::tuple<*>
こんな感じが嬉しいです
0497デフォルトの名無しさん垢版2018/10/11(木) 17:26:33.96ID:6FntMPLi
ありがとうございます!
勉強してきます!!!
0498デフォルトの名無しさん垢版2018/10/12(金) 10:08:09.64ID:46Wm2YVF
MSVC 専用らしいのですが
_For_each_tuple_element の引数として指定されたλ関数の中で
_For_each_tuple_element を呼ぶ前に宣言した変数にアクセスするにはどうすれば良いですか


int i = 0;
std::_For_each_tuple_element(tuplevaluse, [](auto&& v){
fprintf(stdout, "%d: ", i++); // ← ここの i でエラー
fprintf(stdout, "%d\n", (int)v);
});
0499デフォルトの名無しさん垢版2018/10/12(金) 10:21:25.26ID:46Wm2YVF
解決しました

int i = 0;
std::_For_each_tuple_element(tuplevaluse, [&i](auto&& v){
fprintf(stdout, "%d: ", i++);
fprintf(stdout, "%d\n", (int)v);
});
0500デフォルトの名無しさん垢版2018/10/14(日) 10:27:05.28ID:eBgdRWtd
VC++6.0 MFCを使っています。

数秒間、処理を止めたいのですが、C言語のsleepという関数がありますが、これを使うのが一般的なのでしょうか
心配なのは、これを使って10秒とか時間を止めると、その間CPU時間が100%になったりしないのかという点です。
MFC環境で上手に処理を止めるのにはどうしたらいいのでしょうか。 OnTimerを使うとかしないとダメですか
0501デフォルトの名無しさん垢版2018/10/14(日) 11:05:53.59ID:eBgdRWtd
自己解決
MFCで、sleepという関数は使えませんでした
その代り、Sleepという関数が提供されていました
0502デフォルトの名無しさん垢版2018/10/14(日) 12:48:33.48ID:gKOdVSwA
>>501
MFCに限らず、UIスレッドの関数内で10秒もSleepで待つのはダメ。
そのウィンドウをユーザーが操作したら「応答なし」と表示されてしまう。

OnTimerで定期的に監視し続けるなり、
独自のメッセージを送って終了を通知するなりしないと。

もちろん、その間は
×ボタンを含めてすべてのコントロールを操作不可にしたり、
ユーザーが閉じられない別ダイアログをモーダルで出したりする対応も必要。
0503デフォルトの名無しさん垢版2018/10/14(日) 13:21:17.04ID:G4e8iFcg
いまどきのSleepは他プロセスを止めたりはしないぞ
0506デフォルトの名無しさん垢版2018/10/14(日) 16:30:02.81ID:nFpB0nHw
本来ダメなんだけどエクセルとかも盛大にUIスレッドで長期間マクロ実行したりするからね
数秒くらいならいいんじゃないの
金とってプログラム作ってる風でもないし
0507デフォルトの名無しさん垢版2018/10/14(日) 16:40:58.09ID:qQZu4oFT
>>506
Sleepで待ちたくなるということは、処理自体は
別スレッドなり別プロセスなりで動いているのだと思ったが
0508デフォルトの名無しさん垢版2018/10/14(日) 16:46:29.33ID:nFpB0nHw
俺はメインスレッドでそのまま何かやってると感じたな
sleep の挙動を5ちゃんで質問する人がすでにワーカスレッドを使ってるとは全く想定しなかった
0511デフォルトの名無しさん垢版2018/10/15(月) 07:46:47.81ID:PSoKrj1X
なんかえらい反感買っちゃったな
Sleep知らなくてもワーカスレッドは使ってるだろうという>>507の方が普通の感覚なのかな
0512デフォルトの名無しさん垢版2018/10/15(月) 10:28:47.73ID:/DZZgAIK
みなさん判りましたか
条件後出しするとこうなります
0515デフォルトの名無しさん垢版2018/10/21(日) 19:42:24.72ID:zGGokTqn
tupleの要素取り出すときstd::get<>以外の方法ありますか?
tuple[index]みたいに取り出せたら良いんですけど
0517デフォルトの名無しさん垢版2018/10/22(月) 16:17:14.28ID:H1W4+XYR
>>515

tuple の要素が char * だとして

std::vector<char *> vec;
int i = 0;
std::_For_each_tuple_element(t, [&h, &i](auto&& v){
printf("%d: %s\n", i++, v);
vec.push_back(v);
});
0518デフォルトの名無しさん垢版2018/10/22(月) 16:18:27.73ID:H1W4+XYR
ああ
色々間違ってるけど適当に読み替えてくれ
0519デフォルトの名無しさん垢版2018/10/22(月) 18:32:15.28ID:N4Dlk9u9
std::apply 呼んだ方が良いかな
0521デフォルトの名無しさん垢版2018/10/23(火) 08:46:28.85ID:0c85p6oM
すごく初級の質問なんですが、
int * x =3;
auto y=*x;
としたときに、コンパイラがyの型をintと推測するのはなぜでしょうか?
ポインタのポインタになるので、最初の*でint型の変数のアドレスを示すことになるまでは分かるのですが、
その後の*でアドレスのアドレス?を指すことになるので、元のint型の値を指すのは違うように思えてしまいます。
0522デフォルトの名無しさん垢版2018/10/23(火) 08:57:12.64ID:el+h+kWN
x は 0x00000003をアドレスとして認識
y(*x) は int型アドレス0x00000003にある値を指す
アドレス(x)のアドレスを指す場合は &x になる
0523デフォルトの名無しさん垢版2018/10/23(火) 11:21:13.83ID:1h9PfZX9
多分、変数yの型が省略されているから、
デフォルトのintと推定して処理しているのだろう
0525デフォルトの名無しさん垢版2018/10/23(火) 12:26:32.22ID:0c85p6oM
>>522
ありがとうございます。
ということは*がついてる変数は、変数がアドレスのときはそのアドレスに収納されてる値を指し、変数がアドレスに収納されてる値のときは、そのアドレスを指すという理解でよろしいんでしょうか?
0526デフォルトの名無しさん垢版2018/10/23(火) 12:51:45.73ID:wh2qZljY
>>525
違うよ。
型名の一部としての*と、式の中の演算子としての*が別物だと言うのは分かる?
1行目の方は「intをさすポインタ」という型を表すためのもの。
2行目は「xというint型の変数の値に対して、その値が指しているメモリ領域上にあるint型の値を参照する」という演算を行うというもの。
0529デフォルトの名無しさん垢版2018/10/23(火) 14:23:01.94ID:LNtdy1l4
Firefox だと右上メニューからエンコーディングで明示的に EUC-JP 指示で化け解消
(unicode にチェックが入ってたが、自動だとそっちに誤爆判別してた?)

Chrome での明示的なエンコーディング変更は拡張プラグインつっこまないとできないっぽい
0530はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/23(火) 16:21:42.79ID:L3KABBTH
C/C++ のポインタの表現が分かり難いってのは確かにあると思う。

宣言のときも * は変数名の側にくっついているものと考えれば理解しやすいんじゃないかな。
int * x; と宣言したとき、 *x が int であるような x を宣言したことになる。
0531デフォルトの名無しさん垢版2018/10/23(火) 16:53:31.99ID:yFsvvFWj
Cの頃は
int *hoge;
と書くことが多かったのに、

C++になってから
int* hoge;
と書く人が増えた。

悪い習慣だと思う。
0532デフォルトの名無しさん垢版2018/10/23(火) 17:02:30.81ID:oFF/C26V
Javaとかから入る人が増えたからかね?
その習慣はあかん。
ポインタは型じゃないから、例えば

int* a,b;

って書くとaは「int型のポインタ」で、bは「int型の変数」になる。
0533デフォルトの名無しさん垢版2018/10/23(火) 17:05:53.09ID:J7zWeAP4
ハゲのせい
0534はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/23(火) 18:09:41.43ID:L3KABBTH
>>532
いや、そこらへんは C/C++ のおかしなところで、ポインタはあくまでも型だ。
その上で文法上は * は変数名の側と結合するの。

もういっそ
std::add_pointer<int> a, b;
のスタイルを普及させればいいんじゃないのかなーと思う。
C++ だとなるべくスマートポインタを使う習慣が出来つつあるから、
その記法とも一貫性があるし。
0535デフォルトの名無しさん垢版2018/10/23(火) 19:19:19.30ID:6eYDBZzc
>>532
ポインタは型じゃないって言ったとき
じゃあなんて言うんだっけ
仕様でも厳密にはなんか型とは別のカテゴリとして扱われてたよな
仕様に詳しい人教えて
0536デフォルトの名無しさん垢版2018/10/23(火) 19:36:08.31ID:ArZ/Inm7
型変換は (型)式 と書くわけで型を単体で書く書き方はあるのに変数宣言は
型 変数[, 変数]...
じゃないからねえ

void f(void);

void (*f_ptr)(void) = f; // ふむ
void (*g_ptr)(void) = (void(*)(void)) f; // 関数ポインタ型の記法はこうか…
void (*)(void) h_ptr = f; // 型 変数で書いてみた→エラーかい!

みたいな
0538デフォルトの名無しさん垢版2018/10/23(火) 20:01:35.24ID:ArZ/Inm7
初期値式リストの個数が足りない場合残りの要素は0で初期化されるので

int a[5][6] = {};

でok
0541デフォルトの名無しさん垢版2018/10/23(火) 22:10:00.30ID:cC1ZIpo7
初期化値リストをつければ足りないところは0で埋められる
付けなければ初期化されない
太古から変わらない仕様
0543はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/24(水) 00:07:31.69ID:PadB6FUj
>>535
変数宣言の基本的な形式

型指定子 宣言子1, 宣言子2, …;

で言うと * は宣言子の一部ということになるが、
型指定子でないから型 (の一部) ではないというわけではない。
これは文法上の呼び名に過ぎず、
意味論的にはポインタは型の一部だよ。
0544デフォルトの名無しさん垢版2018/10/24(水) 00:25:51.42ID:shD/xjVg
視点の問題ではあるが宣言の構文上のポインタは型の種類ではなく入れ物の種類ともいえる
int *a, b;

int pointer a, int variable b;
を意味する省略構文であり意味論的に
variable:値をいれるもの
pointer:間接的に他の入れ物を指すもの
と区別されてると見ることもできる
0545デフォルトの名無しさん垢版2018/10/24(水) 00:41:21.11ID:ht/B3MxL
>>544
そういうのは単純なポインタ(foo*)の時にだけ通じる話で、配列や関数ポインタや引数込みでのそれらの再帰的な組み合わせとかも考えたら、きちんとBNFで理解して型の宣言の構文を定義通りに覚えるのが一番誤解がなくてシンプルだと思うよ。
0546デフォルトの名無しさん垢版2018/10/24(水) 00:41:23.34ID:8GMcdoBP
>>543レスサンクス
自分でも調べてみた
手元のc99ドラフト版から適当に抜粋

declaration:
 declaration-specifiers init-declarator-list ;

declaration-specifiers:
 storage-class-specifier declaration-specifiers
 type-specifier declaration-specifiers
 type-qualifier declaration-specifiers
 function-specifier declaration-specifiers

init-declarator-list:
 init-declarator
 init-declarator-list , init-declarator

init-declarator:
 declarator
 declarator = initializer

declarator:
 pointer direct-declarator

pointer:
 * type-qualifier-list
 * type-qualifier-list pointer

宣言時の * は declarator なんやね構文としては
0547デフォルトの名無しさん垢版2018/10/24(水) 00:47:37.13ID:pa4PW987
>>535
詳しい人とかハードル上げられるとな。。。
プログラミング言語C売っちゃったから、厳密な仕様は記憶の彼方だが、ポインタは厳密なカテゴリ的にもポインタだったと思う。

ここからは私の解釈だが、ポインタはアドレスを入れる「変数」。
当たり前じゃんと言われればそうなんだけど、感覚的にも型というより変数って感じ。

ポインタに型があるとすればOSがアドレスを扱うビット数と同じになる。
intとかの型はポインタが指す先にどの大きさのどういう扱いのデータがあるかを知る為で、ポインタ型そのものの大きさは変わらない。

んで、普通の変数とポインタはCだと大分違うように思うけど、アセンブリ言語だと

LD GR0,TEXT ; 変数TEXTの内容を読む。
LDA GR0,TEXT ; 変数TEXTのアドレスを読む。

程度の違いしか無いわけね。

この場合、内容もアドレスもレジスタが読むけど、Cにレジスタに相当する変数を用意する為にポインタが生まれたんだと思う。
0549デフォルトの名無しさん垢版2018/10/24(水) 00:54:55.11ID:pa4PW987
x Cにレジスタに
o CにLDA使用時のレジスタに
0551デフォルトの名無しさん垢版2018/10/24(水) 01:36:02.36ID:uSP3iZ9v
>>538
ありがとうございます説明が足りなかったかもしれません
メンバ変数の配列をコンストラクタでリスト初期化する場合どうしたらいいですか?
Hoge::Hoge() : mPiyo(0) ←これの二次元配列版を知りたいのです
0555デフォルトの名無しさん垢版2018/10/24(水) 11:21:48.24ID:wUNs4a59
> void (*)(void) h_ptr = f; // 型 変数で書いてみた→エラーかい!

当然知ってると思うけど

void (*h_ptr)(void) = f;

これは * と () の優先順位が原因だ

よく * と [] で混乱してるひともいるけど

char **hoge;
char *hoge[];
char (*hoge)[123]:
char (*hoge)[]: // エラーかい!
0556はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/24(水) 11:24:53.60ID:PadB6FUj
>>551
今では (C++11 以降では) 宣言時に初期化も書けるから、

struct Hoge {
int a[10][10] = {};
public:
Hoge(void);
};

って感じでも書ける。

複数のコンストラクタがあるときに、
どのコンストラクタが起動したときでも初期化はしないといけないみたいなときには、
この方式で書いた方が何度も同じことを書かなくてよいので面倒くさくなくて良いかも。
0558はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/24(水) 11:57:27.21ID:PadB6FUj
アセンブラとかから C に入門したら色々と自動化されてて
ありがたいなーってなってポインタで躓いたりしづらいけど、
レイヤが違うという意識を持ってないと変に機械の理屈に引きずられることもある。

言語の理屈だとポインタはアドレスを入れるものじゃなくて、
ポインタを値として見たものをアドレスと呼んだりもするってだけ。
結局はポインタにアドレスが入ってるんだけど、まずポインタありき。

ポインタに対する演算ってのは指す先をいくつ進めるとか、
指す先の間隔がいくつだというものであって、
アドレスを演算して実現するってのは実装上の都合。
アドレスが連続しているということさえ保証はない。

たとえば

char a[2];

とあったときに

(intptr_t)(&a[1])-(intptr_t)(&a[0])

が 1 になることは言語仕様では保証されない。
(これが 1 にならないような変な環境はまず無いと思うんだけど。)

具体的に機械でどう動いているかから見ると肌感覚として理解しやすい場合もあるのはわかるが、
言語の理屈と混同しないように、一旦それは抽象の壁の向こうに押しやる必要もある。
0559デフォルトの名無しさん垢版2018/10/25(木) 06:51:43.64ID:GIa2VIfF
ラムダ式でthisを指定してそのクラスのメソッドを呼び出したところ、そのクラスのメンバ変数がすべて0になっててコンストラクタも動作してない状態になってたのですが、使い方間違ってますか
0560デフォルトの名無しさん垢版2018/10/25(木) 07:15:13.40ID:kug3Loto
>>559
インスタンスが既に破棄されているのでしょう
c++ ではオブジェクトの寿命管理は自分でやる必要があります
(参照があるから破棄されないということはない)
0561デフォルトの名無しさん垢版2018/10/25(木) 11:40:30.80ID:5Cy/pQlU
>>559
[&*this]
こうしたっていう意味?
0562デフォルトの名無しさん垢版2018/10/25(木) 22:05:25.00ID:GIa2VIfF
ラムダ式にはthisを指定しました
インスタンスは生きています
ラムダ式内から直接呼ばずにグローバル変数に保持したインスタンス変数経由で同じメソッドにアクセスしたら正しい値が読み取れました
0563デフォルトの名無しさん垢版2018/10/25(木) 22:40:27.12ID:ovezBLdW
auto f = [this]() {... };
てな感じにキャプチャはしてるんだよね。してないとコンパイルエラーになるし。

デバッガでみておかしいだけならデバッガがうまく動いてないだけでは?
cout << this->hoge;
とかして見てみたらどうでしょう。
0564デフォルトの名無しさん垢版2018/10/26(金) 16:36:40.82ID:8hqqerJ0
>>562
>ラムダ式内から直接呼ばずにグローバル変数に保持したインスタンス変数経由で同じメソッドにアクセスしたら

warning読み飛ばしてるだけだと思うが
warningにそうしろって書いてあるはず
0565デフォルトの名無しさん垢版2018/10/26(金) 16:37:20.12ID:8hqqerJ0
あとグローバルにしなくても
ラムダ式を呼ぶ側の関数内のローカル変数で保持しても多分いける
0566デフォルトの名無しさん垢版2018/10/28(日) 23:19:51.00ID:CM0THx8+
複数のファイルをコンパイルするとき、ソースファイルの読み込み順番ってc++ではどのように決定されるのでしょうか?
0568デフォルトの名無しさん垢版2018/10/29(月) 00:15:12.84ID:LkYf8yJz
>>566
それぞれ別の翻訳単位として、独立に処理されるぞ。
依存関係があって先に読み込ませる必要があるファイルは、#includeで明示的に指定した順に読み込ませる必要があるよ。
0569はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/29(月) 01:17:32.57ID:wGJRVi/I
先に読み込ませれば (ヘッダを include したり宣言を書いたりしなくても) 定義したものが利用可能になると思ったってことなのかな?
0570デフォルトの名無しさん垢版2018/10/29(月) 11:30:00.64ID:VxCr7qKV
ならんやろ
0571デフォルトの名無しさん垢版2018/10/29(月) 12:50:50.62ID:X5D3cySa
ソースファイルの読み込み=ソースのコンパイルとして
makeなり 統合環境なりが 依存関係チェックして必要と思われた順にコンパイラを起動しコンパイルしてる
0572 ◆QZaw55cn4c 垢版2018/10/29(月) 19:30:19.13ID:MQrExvvX
>>571
>makeなり 統合環境なりが 依存関係チェックして必要と思われた順

別に make による依存度チェックが必須だとは思っていません
最悪、アプリケーションを構成する全ソースを全部コンパイルしたっていい
やっていることがよくわからないのなら、全部再コンパイルするバッチを書いてもいい、と思っています
0573デフォルトの名無しさん垢版2018/10/29(月) 19:53:08.30ID:QH06ucqh
>>572
確かに、時間が無駄になるだけで、それにより動作が変わってしまう等の害を及ぼすことはないからなー

結局 >>566 が聞きたかったことは皆目見当がつかんけどもw
0574デフォルトの名無しさん垢版2018/10/29(月) 19:59:30.68ID:+o2CKGU+
vectorで複数のstd::stringの各要素を収納して管理してみたいのですが、
実際、vectorの特定の要素にアクセスしてstringのデータを入れようとするとエラーになってしまいます。
例えば、次のようなコードの場合です。
std::string A = "bookA";
std::string B = "bookB";

std::vector<std::string> booktitle;
booktitle[0] = A;//コンパイルエラー

vectorで複数のstd::stringのデータを収納したい場合にはどうしたらいいのでしょうか?
0576 ◆QZaw55cn4c 垢版2018/10/29(月) 20:48:05.90ID:MQrExvvX
>>573
FreeBSD 2, 3, 4 (くらいかなあ) 時代には、OS カーネルを再度コンパイルすることはあたりまえだったんですけれども、最近はそういう話はすたれてしまいましたね…
0577デフォルトの名無しさん垢版2018/10/29(月) 21:00:10.54ID:+o2CKGU+
>>575
ありがとうございます。
例えば、vectorにpush_backで100個のstd::stringのデータを入れたけれど、38個目のデータを別のものに変更したいという場合、
38個目のstd::stringのデータを直接指定して別のものをいれるということはできないんでしょうか?
0579デフォルトの名無しさん垢版2018/10/29(月) 22:57:36.19ID:oZEcP9DN
>>577
c の普通の配列みたいに中身に拘らずとりあえずサイズ100の配列を用意したい場合は
v.resize(100) でいけるのでその辺りも併せて覚えておきましょう
0580デフォルトの名無しさん垢版2018/10/29(月) 23:25:38.01ID:Id14AobK
関数の中でポインタ変数を作ったら、その関数から出る時、ポインタ変数は消えるけど、ポインタ変数の中身はどっか別にあって消えないってことで良いんですかね?
その中身を消すのがdelete関数ってことですか?ややこしいな・・・
0581デフォルトの名無しさん垢版2018/10/29(月) 23:52:04.87ID:JGxixszg
そのとおり
記録には残らないが記憶に残る
0582デフォルトの名無しさん垢版2018/10/30(火) 00:19:02.74ID:tYtIFLkW
ありがとう。すみませんもう一つ。
ポインタ変数のアドレスを格納するのに、なぜ二重ポインタが必要なのかがいまいちわかりません。
単に”番地”を格納するだけなら普通のポインタでも良いような気がしてしまいます。
0583デフォルトの名無しさん垢版2018/10/30(火) 00:27:02.34ID:Md8WzUxK
それは、32ビット浮動小数点のビットパターンを32ビットintに入れておけば
float型とかいらないと言ってるようなもの
0584デフォルトの名無しさん垢版2018/10/30(火) 00:36:21.09ID:H/liFP07
アドレス値がほしいとき
引数でアドレス入れる変数のアドレスを渡すことがある
0585デフォルトの名無しさん垢版2018/10/30(火) 00:46:04.26ID:0KkuIlNz
>>582
情報量としては実際のところメモリアドレスなので同じだけれど型が違う

pがint へのポインタなら
*p はアドレス位置にある int を返すし、
p++ すると int のサイズ分増えるし、
p[i] はintのサイズかけるiのメモリ位置にある int になる

上記の int を char やポインタ型に入れ替えると動作が異なることがわかる。
なんの型で読み書きするのかとかサイズの計算なんて人がコードで書けばいいじゃん、
という流儀もあるだろうがcは違う

例外としてなんの型だか不明なものを扱うときには、
とりあえずvoid*で保持しておいて計算やアクセスするときに
明示的に型を指定して用いることもある
0586デフォルトの名無しさん垢版2018/10/30(火) 00:55:27.51ID:H/liFP07
アドレス渡さないと変数(今回の場合アドレスを格納する領域)に値を格納できない
コレはどんな変数でも同じ

アドレスを格納する変数もただの変数だからな
0587デフォルトの名無しさん垢版2018/10/30(火) 07:33:46.97ID:rZekkOWs
>>580
>ポインタ変数の中身はどっか別にあって消えないってことで良いんですかね?
(ポインタ変数の中身はポインタだが、ポインタが指してる先と読み替えよう)
指してる先はどっか別にあってって、言語が自動で作ってくれるわけじゃないよ
ポインタが指す先もプログラマが作らなきゃならない
だから消える所に作れば(自動変数な)消えるし、消えない所に作れば(静的変数やnewな)消えない

>>582
二重ポインタ(って表現もナニだが…)も
ポインタを指してるってだけの普通のポインタだから
0588デフォルトの名無しさん垢版2018/10/30(火) 12:09:39.01ID:yVkeMr3S
「戻り値ではなく、引数の書き換えで呼び出し元に新たな値を渡したい」

・関数側宣言はポインタで受けて 呼び出し側は変数に&つけてポインタを渡す (c/c++)
 関数実装の際 *でデリファレンスして代入

・関数側宣言は参照で受けて 呼び出し側は変数をそのまま渡す (c++)
 関数実装の際 そのまま代入
0589デフォルトの名無しさん垢版2018/10/30(火) 15:15:26.58ID:p4LrBCE7
>>582
freeしたあと確実にNULL代入したいためにポインタのポインタで管理しておくことはある
0590デフォルトの名無しさん垢版2018/10/30(火) 15:17:35.76ID:p4LrBCE7
あと二重ポインタとかダブルポインタとかいう用語は使わない方が良い

ポインタのポインタ(たまにポインタの配列)
配列のポインタ

のどっちかにしろ
0591デフォルトの名無しさん垢版2018/10/30(火) 15:22:49.70ID:yVkeMr3S
void my_free(void** ptr) { free(*ptr); *ptr = NULL; }
.......

char *data = malloc(size);
.......
.......
my_free(&data);
/* これ以降 data = NULL になってるから参照するとヌルポになる */
0592デフォルトの名無しさん垢版2018/10/30(火) 15:59:22.21ID:KCmKruF1
ポインタほんとむずい
0596デフォルトの名無しさん垢版2018/10/30(火) 21:19:57.26ID:4lskY4LV
自分がそう呼ぶかどうかはともかくとして、
ダブルポインタやdouble pointer でググればわかるようにそう呼称されることも大変多いわけだから
ポインタのポインタをダブルポインタと呼ぶことが多いことを知らんでいるわけにはいかんのが現実
0600デフォルトの名無しさん垢版2018/10/30(火) 21:51:59.77ID:ri95Blut
素朴な疑問だけど、ビット演算の | と論理演算の ||
前者を「オア」と呼んで後者を「ダブルオア」と呼ぶ?
0601 ◆QZaw55cn4c 垢版2018/10/30(火) 22:01:11.64ID:ojdn3tn8
>>600
|| は論理演算子の「論理or」
| はビット演算子の「ビット or」…あまりそういういいかたはしないような気もしますが
0602デフォルトの名無しさん垢版2018/10/30(火) 22:05:37.02ID:ri95Blut
ダブルポインタの流れで気になったのよね
言葉だけの疎通で どう言ってたかな?と

※ 「ビットor」 「or」 後者は前後の文意で汲んでくれ のような使い方してるわ
0603デフォルトの名無しさん垢版2018/10/30(火) 22:10:43.59ID:4lskY4LV
明示的にビット毎のorを指すときは bitwise or と書くけど日本語ではなんていうんだ
教科書なら「ビット毎の論理和」でいいんだろうけど古臭い

声に出して読むときは2つ組みの方をオアオアとかアンドアンド
0605デフォルトの名無しさん垢版2018/10/30(火) 22:30:53.82ID:4lskY4LV
>>604
世間で使われてる用語を使わず「理屈で言えばこうだ」と
勝手に言葉を作ってると造語症と思われるぞ
0607デフォルトの名無しさん垢版2018/10/30(火) 22:43:13.11ID:J31Dj26+
double linked list のdoubleは行きのポインタ(リンク)と帰りのポインタでdoubleだし
日本語より論理的と言われがちな英語も割といい加減だよね
日本語では双方向リストと実に論理的な呼称
0608デフォルトの名無しさん垢版2018/10/30(火) 22:47:46.33ID:fzlT+aGo
いや double pointer, triple pointer と増やしていけるし数学的なのかな
これ式で日本語でたまに使われるのは2重(2段)ポインタ、3重ポインタか
0610はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/30(火) 23:08:47.77ID:/tj4m1Wy
>>603
JIS だと「ビット単位のOR演算子」と「論理OR演算子」と書かれている。
あくまで訳語のひとつでしかないけど、JIS の性格を考えれば公式訳と言ってよかろ。

| と || の代替表記として bitor と or があるので、発音するときはこれでいくのもアリかもね。
0612はちみつ餃子 ◆8X2XSCHEME 垢版2018/10/30(火) 23:23:20.21ID:/tj4m1Wy
C99 をざっと見た感じでは double を指すポインタは "pointer to double" という書き方になっているけど、
カジュアルな場面で double pointer と言わないとも言い切れないだろうし、
これについては >>595 の言い分に説得力を感じる。

英語がよくわかる人の肌感覚ではどんなもんなんやろね?
0614デフォルトの名無しさん垢版2018/10/30(火) 23:42:13.26ID:H/liFP07
だからな

ただの変数だからな
ただのポインタも例外じゃない
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ですか?
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"};
みたいにキャストしないとワーニングがでるんだが、めんどくさいね。なんか方法ないの?
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); も作っておけばいいのか。
納得。
0715デフォルトの名無しさん垢版2018/11/10(土) 06:25:16.23ID:7XNdxnac
>>702
>for the representation of a single character's value
a がついてるだろ。 つまりこれは1文字のことを言ってるんであって、複数文字ではないよ
で、主語を見ると、A character literalってあるから、そもそもこれは1キャラクタのリテラルの定義
なので、複数キャラ、単語等のリテラルの定義は他にあるはず
0717デフォルトの名無しさん垢版2018/11/10(土) 07:11:22.05ID:p/77GMIT
charactor literalって命名は違和感あるな。
float literal 123.4 だぜ。 おかしいだろ。 float leteral なら"123.4"なら許せる。そもそもliteral使うところが
おかしい。
英語にだってconstantって言葉あるんだから、constantをつかったらいいのに。ところがconstはconstant
のことかと思いきや、read only 変数のことなんだよね。w
0718デフォルトの名無しさん垢版2018/11/10(土) 09:00:12.85ID:jxhvzDRc
何がおかしいのかさっぱり分からん。
"文字通りの"という意味に囚われてるのかもしれないが、ソースコード上に123.4とあったらまぎれもなく文字通りだろう
0719デフォルトの名無しさん垢版2018/11/10(土) 09:56:00.85ID:0TCzpeyH
>>713
勘違いしてね?

void f(char * message)
void c_f( const char * message)
のとき、
char *p = "abcde";
f("abc");
c_f("abc");
f(p);
c_f(p);
は全部警告なしで通るぞ。 問題があるのは、
const char *cp = "abcde";
としたときの
f(cp);
だけがエラーあるいは警告になる
2017の最新のVC++
0721デフォルトの名無しさん垢版2018/11/10(土) 10:14:48.88ID:D3ftxXru
>>717
さらに追加
言うように3や3.14を定数と呼ぶとしても、リテラルと呼ぶことを排除できないと思うよ。
例えばこうなる。

「ソース中に3や3.14などの定数を記述する場合は数値リテラルを用いる。
数値リテラルは8進数、16進数、10進数の3種に大別されそれぞれ以下の形式である」

など。
0722デフォルトの名無しさん垢版2018/11/10(土) 10:16:41.25ID:p/77GMIT
そうなの? TIのCCSってのを使いはじめたところだが、warning出まくりでいやになる。
TI独自の問題? それとも警告レベル下げてるんじゃない。
問題なしだなんてとんでもない。問題大ありだよ。
そもそもC++ってCompileが全く通らない。なんでこんなにいちいちエラーをだすのかと腹が立つ。w
0725デフォルトの名無しさん垢版2018/11/10(土) 10:23:27.63ID:p/77GMIT
>>721
>「ソース中に3や3.14などの定数を記述する場合は数値リテラルを用いる。
>数値リテラルは8進数、16進数、10進数の3種に大別されそれぞれ以下の形式である」

違和感あるのは俺だけ?
「ソース中に3や3.14などの定数を記述する場合がある。。
定数は8進数、16進数、10進数の3種に大別されそれぞれ以下の形式である」
このほうが自然とおもうが、、、
0727デフォルトの名無しさん垢版2018/11/10(土) 10:47:21.32ID:9vqEahoA
>>725
一般的な意味での定数なら8,16,10進数に限らず3進数だろうが78進数だろうが好きに考えることができるけど、ここで8,16,10進数だと限定していっているのは、あくまでもC/C++の構文の要素である「数値リテラル」な訳だから、全く別の概念として明確に区別して考えた方がいいよ。
言語仕様のBNFとか見てくればもう少し理解できるようになるかも。
0728デフォルトの名無しさん垢版2018/11/10(土) 11:43:56.10ID:p/77GMIT
Wikiの説明はわかりやすいね。
でもconstのサンプルにはメッセージテーブルとかが良くかいてあるけど、ROM配置
じゃなくてRAM配置になるんだね。組み込みだとRAMが少ないから使えない。
constは役立たずというか貴重なRAMを消費する邪魔もの。
0729デフォルトの名無しさん垢版2018/11/10(土) 11:44:26.40ID:/RO766KL
そういう話ではなく
コンピュータサイエンスにおける「リテラル」の用法についての批判でしょ。

恐らくコンピュータサイエンスを学び始めたばかりの日本人が、
リテラルという用語を使い始めた英米の専門家に対して行う、
英語として不自然である、という批判。
0730デフォルトの名無しさん垢版2018/11/10(土) 11:47:06.40ID:p/77GMIT
>>724
組み込み観点ではそういう考え方はまずいんじゃない?
なるべくconstは使わない方が良いような気がする。RAMが貴重だからね。
0739デフォルトの名無しさん垢版2018/11/10(土) 19:49:46.05ID:p/77GMIT
>頼むからまずはcの基本を勉強してくれ

これが基本じゃなのか? 高度な質問をしているつもりはないが、、、
頼むからまずは基本に答えてくれよ。

まずVSなど他のC++はしらない。自分の感想はTIのCCSコンパイラについてだけ。しかし一般的に
組み込み系には通じると思う。

const 定義すると.bssに配置される。.bssはRAMである。組み込みマイコンではRAMとROMに分かれて
いるがRAMは非常に貴重だ。ちなみに今使ってるCPUは4kしかない。ROMは256kバイトある。
constでメニューテーブルなどを書くのは愚の骨頂だろ。そもそもconstなどなければこういう間違いは起こらない。
故にconstは有害だ。
どうだ理路整然としてるだろ。
0742736垢版2018/11/10(土) 19:56:06.79ID:hWkce6N8
>>627は、俺だ。
0743デフォルトの名無しさん垢版2018/11/10(土) 20:01:42.68ID:2010ximS
constだけで飯が3杯食えるスレってあったよな確か。
飯一食1000円とすると、3杯で3000円。
constには3000円の価値があるってことだ。
しらべえによると、3文は90円だそうだから、早起きの33倍、constのほうが価値があるってことだ。
0744デフォルトの名無しさん垢版2018/11/10(土) 20:03:36.88ID:p/77GMIT
>>741
そういうトイレは有害だ。ただしい。

結局んところconstはリードオンリーの意味しかない。リードオンリーのテーブルを作るのであればconstexprを
使えばいい。
リードオンリーの変数って何か意味があるんだろうか? 先ずは変数でありながら変更できない
のだから、実質的には変数ではない。本質的に存在自体が矛盾している。
たとえばリードオンリーであってもロックしたりアンロックできるのであれば意味がある。一旦ロックしたら
そのまんまってのでは、録に役にたたない。
0745デフォルトの名無しさん垢版2018/11/10(土) 20:04:25.53ID:2010ximS
>>744
ヒント:メモリーフェンス。
0746デフォルトの名無しさん垢版2018/11/10(土) 20:09:30.23ID:p/77GMIT
>>740
ん。それは矛盾するだろ。基本的にC++のconstは変数だ。だから初期値は代入する。
それ以後はアクセスできない。少なくともRAMに配置する変数だ。ということは言える。
.bssに配置されるのかどうかはリンカでコントロールできるのかもしれない。ROMにだって無理やり配置は
可能だ。そういう無理やりのことをいってるのではない。あくまで自然なありかたとしてのconstだ。
0747デフォルトの名無しさん垢版2018/11/10(土) 20:10:49.63ID:p/77GMIT
>>745
言いたいことはわかるが、チャンと説明してみて、自分の間違いに気が付いた方がいい。
0748デフォルトの名無しさん垢版2018/11/10(土) 20:11:09.68ID:2010ximS
変数じゃなくてもメンバはconstで修飾できるぞ。
0750デフォルトの名無しさん垢版2018/11/10(土) 20:24:15.32ID:p/77GMIT
>>749
それは知らなかったが、その肝はなんなの? 結局はリードオンリーってディフェンスしたいって
ことではないの? 

物理的に書き込み可能ならリードオンリーにしてもディフェンスになんかならないでしょ。
ディフェンスするならライトプロテクト機能がどうしても必要だからね。
アクセスできないようにするには、Privateにして不可視にすればいい。これでディフェンスになる。
グローバルにさらしてなお且つリードオンリーにしておきたい変数がはたして必要だろうか?
 必要性はないと思う。
具体的にどんな意味があるのよ。
0751デフォルトの名無しさん垢版2018/11/10(土) 20:25:53.82ID:2010ximS
知らないで難癖付けてたのかよ。
0752デフォルトの名無しさん垢版2018/11/10(土) 20:26:38.74ID:p/77GMIT
>変数じゃなくてもメンバはconstで修飾できるぞ。

出来て何の意味があるのかということが知りたい。意味がないなら邪魔だな。
0753デフォルトの名無しさん垢版2018/11/10(土) 20:30:17.34ID:2010ximS
高橋マナ著やさしいC++から始めたほうがよい。
0754さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/11/10(土) 20:37:38.39ID:GxjHn4EZ
メンバ関数プロトタイプの後ろをconstで修飾すれば、その関数の中ではthisがconstなポインタになり、
その関数の中ではconstではないメンバー関数は呼べなくなる。
つまり、constキャストを使わないと、thisを変更できなくなる。
0755デフォルトの名無しさん垢版2018/11/10(土) 20:38:58.59ID:AVLSNDa3
>>752
あなたの言葉を借りるとconstはコンパイル時に「ディフェンス」するので
ランタイムで「ディフェンス」するよりも少ないコストで問題を発見できる
これは意味があることだ
0756さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/11/10(土) 20:43:43.52ID:GxjHn4EZ
関数の仮引数の型をconstで修飾すると、対応する実引数は変更できなくなる。
ただし、その仮引数にconstではない引数を渡すことはできる。
const付ければ多分変更されない。変更しようとすると、多分コンパイルエラー。
0758さまよえる蟻人間 ◆T6xkBnTXz7B0 垢版2018/11/10(土) 20:51:32.82ID:GxjHn4EZ
void func(const int& n)
{
...
}

funcの内部では(constキャストしないと)nは変更できない。多分。裏技使えば出来るかも。
0761デフォルトの名無しさん垢版2018/11/10(土) 21:06:11.15ID:p/77GMIT
>>754
 説得力がありそうな意見だが、残念ながら意味がよくわからないので一寸調べてみた。
2のことかな。

メリット
1.参照渡しに const 修飾子をつけることにより、引数の中身を書き換えないことを宣言することができる。
  ポインタ渡しに const 修飾子をつけることにより、引数の中身を書き換えないことを宣言することができる。
2.const オブジェクトを引数にすると、そのオブジェクトのなかで呼び出せるメソッドは const メンバ関数のみ。

1はたしかにメリットがあると言わざるを得ない。
2は使い方次第だな。自分の場合はわざわざそこまで面倒なことはしない。
0762デフォルトの名無しさん垢版2018/11/10(土) 21:07:06.71ID:p/77GMIT
>>755
一理ある。
0763デフォルトの名無しさん垢版2018/11/10(土) 21:11:56.84ID:p/77GMIT
>>759
自分も最近しったんだが、組み込みで使うとC++は非常に効果を発揮する。(らしい。あまりできてない、、、)
すくなくても、クラスやnamespaceを使えるだけでも大いに助かる。Cと滅茶苦茶相性がいい。
ごちゃ混ぜでもスパゲティでも何ら問題ない。
組み込みでは絶対にC++を使うべき。
0764デフォルトの名無しさん垢版2018/11/10(土) 21:18:06.51ID:p/77GMIT
>マニュアルで .cinit section を検索しろよ
ありがと。検索してみます。
0767デフォルトの名無しさん垢版2018/11/10(土) 21:35:12.51ID:D3ftxXru
>>746
君は何も知らずに妄想だけから判断して>>730の考えに至ったわけじゃん。>>714からの流れでね。

関数の引数を char* と const char * にしたときの違いは、
君が勘違いしている、ではなく、なにかを読んで知ろうともせず
自分だけの想像で決めつけているような「このポインタが定数(変更不可)かどうか」ではなく、
ポインタが差している char 値が変更不可かどうかなんだ。

で、
君の考えはおそらくここに書いてないものも含めて8割がた
間違ってるから誰にもそれを一々教えることは無理なんだよ。
だから本を読むとかして基本を学んで欲しい。
今の君は想像で英語に文句つけてるくせにアルファベットも知らない子供みたいな状態。
0768デフォルトの名無しさん垢版2018/11/10(土) 21:35:33.57ID:p/77GMIT
>高橋マナ著やさしいC++から始めたほうがよい。

C++は使い始めたばかりでよくわからないが、多重人格的で昔のC++と最近のC++が混在している
気がする。C++は糞って言ってる人は昔のC++をみていて、C++は最高って言ってる人は最近追加
された仕様を見ていると思う。
だからC++は基礎からやると駄目な言語だね。基礎は飛ばしてしまったほうがいい。
追加された仕様部分が秀逸だね。
だからあくまでも自分の意見だが「やさしい、、、、」ってのは寧ろ難解で駄目なのが多い気がする。
特にC++の生みの親が書いたような本が最も駄目だと思う。
0769デフォルトの名無しさん垢版2018/11/10(土) 21:37:16.52ID:0TCzpeyH
ID:p/77GMIT

もうこいつの相手をするのはやめよう。 単なる荒しだわ。 ここで終わり
0770デフォルトの名無しさん垢版2018/11/10(土) 21:37:40.22ID:D3ftxXru
>>767
>君が勘違いしている、ではなく、なにかを読んで知ろうともせず
>自分だけの想像で決めつけているような

ここ表現が変か
何も調べてないんだから単なる妄想であって勘違いですらないということ。
0771デフォルトの名無しさん垢版2018/11/10(土) 21:39:45.42ID:p/77GMIT
>>767
だれも最初は子供だからね。
視野が狭いのであって、思考がまちがっているんではないというところに気が付いてほしい。
だから視野が広がれば正しい結論にいたる。
そして結論は761
0772デフォルトの名無しさん垢版2018/11/10(土) 21:45:54.25ID:9vqEahoA
>>768
C++は近年追加された仕様の方が複雑怪奇で迷走しているという意見もあるし、勝手な思い込みで基礎を蔑ろにするのはやめた方がいい。
constの理解についても、組み込みのCをやった経験に基づく自分の経験と思い込みを当然のものとして他人の話を聞くから理解が進まないのでは?
RAMにおくかROMに置くかとかも本来はC言語としては未定義とか処理系依存な部分であって、組み込みにおける常識をベースにCの言語仕様を理解しようとするから齟齬が生まれるのだと思う。
0775デフォルトの名無しさん垢版2018/11/10(土) 22:12:42.07ID:mjExs0JA
このスレにいるような低学歴知恵遅れは
引数だけでなくメソッドにもconstつけるべきというのすら分かってない
クラスの引数にconstつける意味を分かってなさそうだからな
0776デフォルトの名無しさん垢版2018/11/10(土) 23:08:29.94ID:yzCMB8/E
セクション配置の話なのにメソッドのconst関係ねーだろ
意味わかってないのはてめーだ、いつものことだが
0777デフォルトの名無しさん垢版2018/11/10(土) 23:17:52.02ID:mjExs0JA
やっぱり低学歴知恵遅れはなにも分かってない
0778デフォルトの名無しさん垢版2018/11/11(日) 02:36:59.36ID:ARqR0CiK
bss セクションは、リンカの文書を見れば?

メモリ配置と、文法のconst は関係ない。
基本的に、言語の文法と実装は、関係ない

実装は、JavaScript の文法に関係ない、DOM とか

できる限り、const を使うべき!
使っても、マイナスにはならないから

たぶん、Effective 本にも書いてある
0779デフォルトの名無しさん垢版2018/11/11(日) 05:11:06.80ID:mI2pOyKp
>組み込みだってconst変数がRAMに置かれるなんて常識は無いよ。この人の思い込み。
そのことを初心者にもわかるように詳しく説明してみてください。といっても解り過ぎている人には
初心者が何がわからないのかわからないとおもう。解らない人はどこまでもわからない。なので
質問を変えて差しあげます。

質問1.constは多用な機能がある。そしてその機能を実現するには最初の一回だけは書き換え
可能である必要があると思うが、もしconstをROMに配置してその機能をどう実現すればいいのだろうか?
 実現不可能だとおもう。
このことが正しいならconstは当然RAMに配置されるのが常識だろう。いかがだろうか?

質問2.もしconstが一度も書き換え可能である必要がないとすれば、constはROMに配置
されるべきだろう。だからconstは必ずROMに配置すべきだというのが常識となる。この考えは
どこがまちがっているだろうか?

質問3.質問1と質問2の前提はどちらが正しいのだろうか?
0780デフォルトの名無しさん垢版2018/11/11(日) 05:52:29.65ID:mI2pOyKp
完璧な質問のつもりだったが、質問を書いてみて今初めて見落としている穴が分かった。
0782デフォルトの名無しさん垢版2018/11/11(日) 09:46:34.66ID:mI2pOyKp
>>772
C++は低レベルの処理に向いているのだから当然のように処理系のハードとの接点が多い。
処理系依存の部分はC++でフォローできないというだけで、だからといって処理系を意識しないでいい
ということにはならない。C++を使う場合には処理系を強く意識する必要がある。

>できる限り、const を使うべき! 使っても、マイナスにはならないから

処理系を強く意識するなら、こういう結論にはならないと思う。constは意に反してRAMに配置され得る。
組み込み系においては、RAMを多用すればすぐにRAMがパンクする。
constはいくつかのメリットがあることは解ったが、無条件に使えばやはり有害になる。少なくとも自分が使った
限りでは滅茶滅茶有害だった。
では被害を少なくするにはどうすればよいか? それに答えてほしい。

static const char* s_A; // -> BSS section
static const char* s_B = "b";// -> Data section
static const char* const s_C = "c";// -> Data section
static const char s_D[] = "d";// -> Read only Data section
static char s_E[] = "e";// -> Data section
static char s_F[128]; // -> BSS section

const char* s_B = "b";// -> ここで嵌った。これは.bssに配置される。
0784デフォルトの名無しさん垢版2018/11/11(日) 13:40:16.62ID:96wp+TZd
'\0' と L'\0' って違うんだな
0785デフォルトの名無しさん垢版2018/11/11(日) 13:56:09.62ID:D6x0hMat
すいません、C++でゲームやGUIアプリなどを開発したいのですが
メソッド抽出やクラス設計といったプログラム設計に関する書籍って
どんなものを読めばいいんでしょうか?おすすめとかありますか?
ググっても、プログラム設計の本があまり見つかりませんでした・・
デザインパターンに関するものはあったんですが
もうすこし初歩的な内容のものがあれば教えてくださいm(__)m
0787はちみつ餃子 ◆8X2XSCHEME 垢版2018/11/11(日) 14:45:39.68ID:u4gHMHSK
>>786
ワイド文字の内訳は未定義で、 Unicode になるとは限らないし、その大きさも決まってない。
2 バイトになって欲しいなら L ではなく u を使うと UTF-16 になることは保証されるよ。
0788デフォルトの名無しさん垢版2018/11/11(日) 14:47:19.00ID:FGv1lmue
>>782
挙げられた例でconstの付加によりRAM使用量が増えている例が見られなくて
「マイナスにはならない」が正しいように見えるんだけど、何を見て有害だと言ってるの?
0789デフォルトの名無しさん垢版2018/11/11(日) 16:46:50.89ID:FyMTXkCl
>>782
> const char* s_B = "b";// -> ここで嵌った。これは.bssに配置される。

s_Bはconst宣言されてない只の変数だからいいとして
"b"がconstだけど.bssに配置されるってこと?
0790デフォルトの名無しさん垢版2018/11/11(日) 17:54:46.45ID:96wp+TZd
>>785
他の言語で造ったことあるか?
それがまだでいきなりC/C++ならやめとけ
0792デフォルトの名無しさん垢版2018/11/11(日) 21:59:31.70ID:YkGULP39
それ、C++でもないただのCでEmacs風エディタ作るっていう古臭い本だろ。
しかも一般的な設計論みたいなものはほとんどなくてエディタの実装テクニックがメイン。
0794はちみつ餃子 ◆8X2XSCHEME 垢版2018/11/12(月) 01:54:44.09ID:Y5bf1y1v
>>793
普通はな、本を勧める状況ってな、
相手は読んだことがないのが当たり前なんだよ。

主題が違う本を挙げるからには、
どういう点で好ましいのかくらいは書いてくれ。
0797デフォルトの名無しさん垢版2018/11/12(月) 14:29:20.92ID:AHq3PbYw
初心者です。
bool変数hogeの真偽で反対の代入をする場合につきまして、
int a, b;
if (hoge) { a=1; b=2; } else { a=2; a=1; }

int a=1, b=2;
if (! hoge) { a=2; a=1; }
はどちらのほうが好ましい書き方ですか?
完全に好みの問題ですか?
0799デフォルトの名無しさん垢版2018/11/12(月) 15:37:05.52ID:D6ILV7Jx
>>797
偽(false)の時だけならif(!hoge){...}の方。
0800デフォルトの名無しさん垢版2018/11/12(月) 15:38:56.82ID:Tf74ZWQr
新スレを作りました。利用してください。

0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/

***********************************************************************

1 名前:デフォルトの名無しさん[] 投稿日:2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室

***********************************************************************
0802785垢版2018/11/12(月) 18:39:23.46ID:x/TsFEZq
>>791
ありがとうございました。読んでみます。
プログラミングの良書って絶版になること多い気がしますが気のせいですかね・・。
0804デフォルトの名無しさん垢版2018/11/12(月) 20:59:20.33ID:CbD+/v6g
int a=1;
int b=2;
if (!hoge) {
 const int c = a;
 a=b;
 b=c;
}

俺だったらこうかな。
0805デフォルトの名無しさん垢版2018/11/13(火) 18:27:28.63ID:90McxFB4
>>796
+1
0806デフォルトの名無しさん垢版2018/11/13(火) 18:30:06.08ID:90McxFB4
>>797
int a, b = 2 - !!hoge, 1 + !!hoge;
0809デフォルトの名無しさん垢版2018/11/13(火) 22:19:44.32ID:kE0CzrCg
>>797
多人数で開発する場合は、前者のほうが好まれると思います。
可読性が高いのでコードレビューしやすいですし、改修もしやすいです。
後者は、1行目と2行目の間で、aかbの値を変更する改修が入ってしまうと
2行目のif文に入らない場合に、望む結果が得られません。
プログラマになりたいとかでなければどっちでもいいと思いますが
難しい書き方をすると、時間経って読み返したときに、
自分でも何を書いたかわからなくなりますよw
0810 ◆QZaw55cn4c 垢版2018/11/13(火) 23:35:32.38ID:q+gBL2L3
>>797
else を使わなくて済むのなら、そうしたほうがいい、とはよくききます
0812はちみつ餃子 ◆8X2XSCHEME 垢版2018/11/14(水) 02:13:50.61ID:I7yQY6ax
>>797
状況によっても違ってくると思う。 一般的には前者だろうけど、
{ a=2; a=1; } が例外的な場合として特別扱いしてるってことを強調したい理由があるなら後者で書くこともあるかもしれん。
0813デフォルトの名無しさん垢版2018/11/14(水) 02:36:40.11ID:JMGKlnVy
いや、効率を考えたら断然最初の else を使う方では?
後者のやり方では hoge が偽の場合、無駄な代入をすることになる
もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど
0814デフォルトの名無しさん垢版2018/11/14(水) 02:38:54.17ID:JMGKlnVy
すまん自己レス
> もっともコンパイラが賢ければ無意味な代入を端折るコードを生成するかもしれんけど

これはムリだった。てことでやっぱり前者
0816デフォルトの名無しさん垢版2018/11/14(水) 11:29:46.12ID:Hh1ptiAj
設計者の意図が伝わりやすいのは前者
0817デフォルトの名無しさん垢版2018/11/14(水) 11:45:30.11ID:ND9bKuyE
int a=1;
if(!hoge){
a=2;
}

のa=1は通常の代入じゃないからね。
これは基準値で初期化しんだからよ。

こっちのが効率は良いよ。
0819デフォルトの名無しさん垢版2018/11/14(水) 12:07:57.04ID:XWwMTSMS
多分タイポでa,bの値を条件によって入れ替える処理だと思うぞ。
0820デフォルトの名無しさん垢版2018/11/14(水) 12:08:42.29ID:zVp4oIsl
int a = 1 * (!hoge) + 2 * (!!hoge);
線型代数
0822デフォルトの名無しさん垢版2018/11/14(水) 13:41:43.62ID:B+lK3N2V
>>815
どういう最適化?
初期化されても参照される前に代入が起こる可能性があるから
hoge の判定の後まで初期化を遅延させる、つまり実質 else を使ったのと
同じコードが生成されるということかな?
そこまで出来そうな気もしなかったのだけど
0823デフォルトの名無しさん垢版2018/11/14(水) 15:05:08.52ID:sW4kyFkZ
初期値として意味があるなら後者でいい気はするが
なんか例が微妙というか、プログラムの流れがなんか不自然
0824デフォルトの名無しさん垢版2018/11/14(水) 15:14:44.43ID:XWwMTSMS
だよね。
だからやっぱタイプミス(タイポ)で条件によってa,bを入れ替える/入れ替えないを切り替える処理と見た方が自然。
0825デフォルトの名無しさん垢版2018/11/14(水) 20:24:55.58ID:PBXirj6B
>>822
797の後者のコードがLLVM IR 2命令に最適化される
%2 = select i1 %0, i32 1, i32 2
%3 = select i1 %0, i32 2, i32 1
%0がhoge、%2がa、%3がbにあたる
0826デフォルトの名無しさん垢版2018/11/14(水) 21:42:49.91ID:1o5yT6ol
>>825
ありがとう。なるほど、すばらしい
これをまんまC/C++に書き戻すと

int a = hoge ? 1 : 2;
int b = hoge ? 2 : 1;

ということかな
でもこれだとhoge を2回チェックしてるので却って非効率な気もするけど
まぁ LLVM はまだ中間形式だから、これをターゲットコードに落とすところで
hoge の判定を一回で済ませるようにさらに最適化するのは簡単そうではあるね
0827デフォルトの名無しさん垢版2018/11/14(水) 21:44:23.61ID:1o5yT6ol
とは言え C/C++は効率ファーストな言語なんで、最適化を当てにして
ユルいコードでOK、てのも如何なものかという気はする
最適化は所詮、処理系依存だし

まぁ >>823 の言うように、その値で初期化することに強い意味があるなら
その書き方を優先する、そういうトレードオフがあることは認めるけど
0833デフォルトの名無しさん垢版2018/11/15(木) 16:41:41.66ID:APQKN+QS
>>829
もちろん原則論に過ぎないよ
あと、原則論と言えば「変数は定義時点で必ず初期化せよ」というのもあるわけで
初期化忘れを防ぐためにそういうコーディングルールを設けている所も多いはず
その場合は後者の方が望ましいことになる
初心者はむしろ効率より堅牢性を重視した方がいいかもね
0834デフォルトの名無しさん垢版2018/11/15(木) 18:14:33.63ID:/yCJioVE
>>830-831
副作用でるやつ
0835デフォルトの名無しさん垢版2018/11/15(木) 22:00:21.20ID:cIF0PQeg
inline void debug_pulse(int no){
#if(DEBUG == 1)
switch(mode){
case 0: pulse(A0); break;
case 1: pulse(A1); break;
case 2: pulse(C5); break;
case 3: pulse(F0); break;
}
#endif
}

1.この場合 debug_pulse(3);は pulse(F0)と同じになる。
2. #define DEBUG 0 にすると全て跡形もなく消える。
1,2は正しい?
0841デフォルトの名無しさん垢版2018/11/16(金) 05:03:45.34ID:qDPFPFK+
>2.この世の全てが無くなるとは思えない。質問が不適切。
質問の意図は
inline void debug_pulse(int no){ }はコードを生成しない。これは正しいか?
である。
質問の理解が不適切。
0845デフォルトの名無しさん垢版2018/11/17(土) 10:49:41.98ID:B4GISbTr
modeがどうかは質問の趣旨と関係ないのでどうでもいいが(modeがglobalとか適当に)

inline void debug_pulse(int no){
switch(mode){
case 0: pulse(A0); break;
case 1: pulse(A1); break;
case 2: pulse(C5); break;
case 3: pulse(F0); break;
}
}



inline void debug_pulse(int no){
}



にしかならないから

1.は「ならない」
2.は「消える」
0846デフォルトの名無しさん垢版2018/11/17(土) 10:50:51.46ID:B4GISbTr
ああ 2. で消える条件は
debug_pulse() を呼んでる部分が無いことが前提だから

2. 「消える」「消えない」どっちとも言えない

だな
0848デフォルトの名無しさん垢版2018/11/17(土) 13:20:26.13ID:yMNF1uQT
inlineをどう扱うかなんてコンパイラ次第
どんなコードが吐かれるかが知りたければ
吐かれたコードを見るのが一番
0849デフォルトの名無しさん垢版2018/11/17(土) 22:18:09.47ID:PyYM1CbT
inline void debug_pulse(int no){
#if(DEBUG == 1)
switch(no){
case 0: pulse(0xA0); break;
case 1: pulse(0xA1); break;
case 2: pulse(0xC5); break;
case 3: pulse(0xF0); break;
}
#endif
}
1.この場合 debug_pulse(3);は pulse(0xF0)と同じになる。
2. #define DEBUG 0 にすると全て跡形もなく消える。
1,2は共に正しい?
0850デフォルトの名無しさん垢版2018/11/17(土) 22:20:38.34ID:/DEd7oJ8
そもそもpulseがなんなのかわからんから
なにが書いてあるのか意味不明
0852デフォルトの名無しさん垢版2018/11/18(日) 03:24:10.19ID:P3SzQi6N
次スレからは、

【初心者歓迎】C/C++室 Ver.103【環境依存OK】 を、
【上級者用】C/C++室 Ver.104【環境依存OK】

にした方がいいな。
0854デフォルトの名無しさん垢版2018/11/18(日) 13:06:07.95ID:OtDWWVpG
いいかお前ら、これから>>852が理解できないことは一切書いちゃだめだぞ。
ここが初心者専用でなく初心者歓迎であってもだ。
回答するのはお前らだからな。
0855 ◆QZaw55cn4c 垢版2018/11/18(日) 14:38:54.74ID:KS5/UdBT
>>852
@すでに上級者スレはありますが?
Aそもそも上級者と初心者の境目をどう定義しますか?
0857852垢版2018/11/18(日) 16:35:58.45ID:P3SzQi6N
>>855
過去レスから、自ずと答えが出るだろ。
0863デフォルトの名無しさん垢版2018/11/18(日) 21:35:53.00ID:2nMU53A+
そもそも論言っていい?w
なんで初心者でも上級者でも質問したらきちんと回答してくれるこのスレがあるのに、自分が気に入らないからって勝手に新スレ作るの?
そういうのを躊躇なくやれちゃう人が本当に怖い・・・
0866 ◆QZaw55cn4c 垢版2018/11/18(日) 22:09:26.83ID:KS5/UdBT
>>863
そうそう、そうですよね
初心者には初心者のための回答がつき、上級者には上級者にふさわしい回答がつけば、それで必要にして十分ですよね
なんでスレを分ける必要があるのですか?>>852
0869 ◆QZaw55cn4c 垢版2018/11/19(月) 00:28:37.15ID:MufxDZB0
>>867
>他者排除姿勢
とても興味があるのであえてお聞きしてもいいですか?
私のどういう点に「他者排除姿勢」を感じたのでしょうか
0874デフォルトの名無しさん垢版2018/11/19(月) 15:26:04.17ID:3MOWhUti
#include <stdio.h>

int main() {
float f = 262143.98;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
f += 0.01f;
fprintf(stdout, "%f\n", f);
return 0;
}

// why 厚切り json
0876デフォルトの名無しさん垢版2018/11/19(月) 15:40:16.18ID:oi0OLObs
オーバーフローじゃなくて
マシンイプシロンの問題
0878デフォルトの名無しさん垢版2018/11/19(月) 22:43:09.35ID:dp3XdjsI
様々な処理系依存についてそれぞれ具体的に何に依存してるのかってどこで調べられますか?
ソフトを作って配布するにあたって、ユーザーの環境をwindows7以降のPCに限定するとして
ユーザー側の環境に依存するもの
ユーザー側の環境に依存するがwin7以降のPCでは共通なので実質非依存とみなせるもの
コンパイル側の環境に依存するのでコンパイルしてしまえば非依存とみなせるもの
に分けて調べたいです
0880デフォルトの名無しさん垢版2018/11/20(火) 06:11:07.08ID:N6+XqoZ1
>>878
まとめて書いてある所なんか無いよ

普通はコンパイラの範疇なものは実行環境に依存しない
一緒に提供しない外部のコードを使う部分(DLL, API, ドライバ)は依存する
と思っておけば良いけど
環境を判断して動作を変えるコードもあるし
実行速度は当然環境に依存する
特定の環境の場合にタイミング依存で発生する問題もある

確実に実行環境に依存しないなんて確証を得られるコードなんてごく限られた範囲になるんで
そんなものに頼らず
出来るだけより多くの環境で評価するのが望ましい
0881デフォルトの名無しさん垢版2018/11/20(火) 10:23:14.85ID:jmuJusIM
README (.txt) (.md) (.rst)
0882デフォルトの名無しさん垢版2018/11/21(水) 12:28:30.64ID:kLl3Gqvz
某本で読んだんだけど、クラスの中にポインタ変数もたせる場合って、コピー禁止にするのが一般的?
コピーコンストラクタを書くのがめんどそうだし、そもそもクラスを代入やコピーをあんましないよね?
0883はちみつ餃子 ◆8X2XSCHEME 垢版2018/11/21(水) 12:44:01.50ID:5XDVWHjZ
>>882
そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話で、クラスの性質による。

コピーできない (コピーすると不整合が起こる) ようなデザインならコピーするなって言うだけじゃなくて
コピー禁止 (コピーコンストラクタの削除) にしておいたほうがうっかりコピーしなくて安全だねってだけの話。
0884デフォルトの名無しさん垢版2018/11/21(水) 22:50:19.46ID:QmHGv3o9
排他主義は当然
低学歴知恵遅れは板から排除するベキ
0885デフォルトの名無しさん垢版2018/11/21(水) 23:19:14.19ID:xWgjQGqb
>>883
> そのクラスがコピーできるようになっているべきかどうかは個別に判断すべき話
これ、全く尤もだし大事な事だと思うんですけど、判断基準を学校や職場で教えてないんですかね?
メモリが少ない組み込み環境だと選択肢はあるけど、C++でアプリを組むような環境だと、
- シングルトンはコピーしない
- それ以外はコピアブル(ディープコピー)にする
一択だと思うんですが。
0887デフォルトの名無しさん垢版2018/11/21(水) 23:42:08.80ID:yscr9wE/
>クラスの中にポインタ変数もつ
これは、pimpl (pointer implement)デザインパターンだろ

pimpl インスタンスの遅延初期化だろ。
こういうのは普通コピーしないし、コピーするとインスタンスを共有して危険になるとか

遅延初期化するようなものは、非同期読み込みとか、何か失敗する可能性が高い、ヤバイもの

1回目は、ファイルから読み込んで、2回目は、キャッシュから読み込むとか、挙動が変わったり

pimpl を使っていれば、普通と違うから、ヤバイと思っておいた方がよい。
pimpl を使うには、何か理由がある
0888はちみつ餃子 ◆8X2XSCHEME 垢版2018/11/21(水) 23:50:56.39ID:5XDVWHjZ
>>885
原則としてはその意見は正しいと思う。
特別な理由がない限りコピーは出来るべきだ。

その上でコピー可能にするための手間と使い勝手のトレードオフ、
要するに「割に合うか」という判断は実務的なことだから、一律には言えないと思う。
コピー可能に出来るけど、コピーする箇所が一個もなかったわっていうような結末だって
有りうるだろうし。

そういう見極めに簡単な基準を設けられるのなら苦労はないわ。
0889デフォルトの名無しさん垢版2018/11/21(水) 23:57:54.13ID:xWgjQGqb
>>887
pimplはAPIと実装を切り離して抽象化するためのもんだから、遅延とかキャッシュとか
実装詳細が関係しちゃいけないんじゃないですかね。
例えばマルチエージェントシミュレーションとかで、個々のエンティティの実装をpimplで隠した上に、
エンティティの複製は普通にやりますし。
0891デフォルトの名無しさん垢版2018/11/22(木) 00:03:02.39ID:hDud6tbH
>>888
> そういう見極めに簡単な基準を設けられるのなら苦労はないわ。
私は古い教育しか受けてないので、過去については全く同感なんですが、
最近はもっと抽象化してるんじゃないかな、と思ったんですよ。
0892デフォルトの名無しさん垢版2018/11/22(木) 00:06:21.53ID:LhS8U5R1
今はmoveがあるからとりあえずコピー禁止で作るな。
複製したオブジェクトが必要になる機会はあんまりない気がする。
vectorに突っ込んで連続したメモリに割り当てたいときとかかな。
0893デフォルトの名無しさん垢版2018/11/22(木) 00:16:19.69ID:hDud6tbH
>>892
read-copy-updateとか、マルチスレッディングで使うんですよ。
(スレッド間で同じ領域にアクセスすると、誰かが書き込むときにロックが掛かるから、
ポインタの参照先もコピーしてしまった方が良い)
0895デフォルトの名無しさん垢版2018/11/22(木) 00:35:05.56ID:hDud6tbH
>>892
私も>>888で言われるまで気付かなかったんですけど、個々のエンティティはコピーしても
シミュレーション系全体をコピーする、とか、大きなオブジェクトをコピーするときって確かに無いですよね。
むしろ万一コードが走ったらレスポンスが遅くなるから禁止すべき。
0896デフォルトの名無しさん垢版2018/11/23(金) 18:17:04.79ID:Fjl6cL2Z
でかいオブジェクトはコピーじゃなくてデータベースに入れてリビジョン管理するべきだよな
0898デフォルトの名無しさん垢版2018/11/24(土) 13:15:24.82ID:CDKSSVF4
>>891
コピーコンストラクタって言語機能があるから勘違いしがちだけど
コピーってオブジェクト指向一般的に言えば全くもって汎用的な処理じゃないんだよね
むしろ無理にコピー可を要求するとおかしくなったりパフォーマンスに悪影響することの方が多いぐらいだ
だから、C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
なんでまあ、基本的にはコピーはサポートしなくていい
そのクラスの要件としてコピーのサポートが必須だとはっきり分かったときだけサポートすりゃいい
0899 ◆QZaw55cn4c 垢版2018/11/24(土) 14:34:42.64ID:nrZVZwkF
>>898
>C++より進化したオブジェクト指向言語、例えばC#もJavaもコピーコンストラクタなんてサポートしてないだろ?
それはクラスは問答無用でヒープに置くことに統一した結果なのでは?
0900デフォルトの名無しさん垢版2018/11/24(土) 15:11:34.85ID:CDKSSVF4
C#には構造体があるがそれもコピーコンストラクタなどサポートしてないね
オブジェクト指向にはほとんど不要だから
0903デフォルトの名無しさん垢版2018/11/25(日) 09:06:53.31ID:lehzCciN
コピーコンストラクタなんて使ったことないよ
関数の引数も構造体はポインタで渡すべきだし、関数からの返り値も構造体で返すべきではない
あんなのは使うべきではない
0906デフォルトの名無しさん垢版2018/11/26(月) 03:48:18.53ID:bwBfDzyf
あるクラスのオブジェクトを静的/動的に確保した場合の互いのメンバ関数処理速度の差ってどれくらいなもんですかね
処理の規模にもよるのですか?
0908デフォルトの名無しさん垢版2018/11/27(火) 09:16:27.15ID:SZiCwtOh
今プログラミング言語C++4第四版読んでるのですが、中級者なのですが1ページから読んでます
テンプレートはあまり使ったことがなく、テンプレートの章を読んでいるのですが理解出来ているのか出来ていないのか分かりません
皆さんこの本はどんな感じで読みましたか?
0909デフォルトの名無しさん垢版2018/11/27(火) 09:40:16.02ID:jIxWA8zR
テンプレートは大分前に読んだが、ぜんぜんスマートだとは思わんかったしプログラムもでかくなりそうだったし
くだらねえと思って、読むのやめたよ。 別に使わなくてもプログラム出来るしな
0911デフォルトの名無しさん垢版2018/11/27(火) 17:54:30.60ID:7Rl1V70s
テンプレートは書くのはちょっと難しいというかアレだが
使うのは簡単だから、まずstd::vectorとか使ってみれば?便利だから
使い方が分かれば作り方もわかるようになるだろう

あとコピーの話でもめてたようだが、オブジェクトのコピーはC++の特徴だからなぁ
C言語からのもので、構造体が値型と同じようにコピーできるっていう
そのおかげでスタックにオブジェクトを確保してRAIIが出来るまぁこれも特徴的だわ
一方で配列が=でコピーできないのもC言語からのもので
構造体より配列の方が他の言語で言うところのオブジェクトと似たような仕様になってるw
参照するとポインタに格下げになるのもJavaやC#のオブジェクトと一緒だね
0912デフォルトの名無しさん垢版2018/11/27(火) 18:01:09.09ID:7Rl1V70s
もしC言語の構造体が配列の仕様と同じように
アクセスしようとするとポインタに格下げになってコピーできない仕様だったのなら
C++のクラスはもうちょっとモダンな仕様になってたかもしれないよね
値渡し出来ないからコピーの事を考えなくてもよいし
GCないからキツイか
0913デフォルトの名無しさん垢版2018/11/27(火) 19:03:17.02ID:NSs5prW8
>>911
> 使い方が分かれば作り方もわかるようになるだろう
コンパイラの使い方が分かっても作り方が分かるやつはそんなに多くないが…
0914デフォルトの名無しさん垢版2018/11/27(火) 19:33:57.58ID:7Rl1V70s
その場合でも、例えばC言語のコンパイラを作りたいとき
C言語の使い方を理解せずにC言語のコンパイラを作るより
C言語の使い方を学習してからC言語のコンパイラを作る方が
賢明だろ
0915 ◆QZaw55cn4c 垢版2018/11/27(火) 20:17:27.09ID:X/MEoliS
>>906
性的・童貞的の差異よりも仮性・真性の差異を問題にすべきかと
0916 ◆QZaw55cn4c 垢版2018/11/27(火) 20:18:05.47ID:X/MEoliS
>>909
lisp のマクロとC++のテンプレートとは、どっちの方がイケてますか?
0917 ◆QZaw55cn4c 垢版2018/11/27(火) 20:18:59.91ID:X/MEoliS
>>911
>配列が=でコピーできないのもC言語からのもので
私はときどき夢想します、配列が=でコピーできたとしたら、どんな世界観がふりかかってくるのでしょうか?
0920 ◆QZaw55cn4c 垢版2018/11/27(火) 21:04:08.91ID:X/MEoliS
>>915
訂正します
静的・動的の差異よりも仮想か非仮想かを問題にすべきかと思います
0922デフォルトの名無しさん垢版2018/11/27(火) 22:10:55.41ID:F5dyxMID
>>910
ちょっとだ
まってて
0923デフォルトの名無しさん垢版2018/11/28(水) 14:52:38.77ID:SOoAorbX
>>918
実体化を明示すれば書けるよ
使う奴を全部列挙しなきゃならないけど、ロジックを共用できるのは大きい
0924デフォルトの名無しさん垢版2018/11/28(水) 23:40:54.22ID:eIhtGkxx
#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...
...
...
(略)
と、表示するには上記のサイトの様なプログラムをどのようにすれば良いのでしょうか?
宜しくお願いします。
0926デフォルトの名無しさん垢版2018/11/29(木) 00:21:59.55ID:kX/wXhND
>>924
別スレにも書き込んでたけどそっちでは相手にされてなかったね。
上記サイトと書いておいて、そのサイトが抜け落ちてるよ。コピペしたなら推敲もしような。

やりたいことは i*j+i*(j+1)を出力するということか?
0931デフォルトの名無しさん垢版2018/11/29(木) 12:32:34.75ID:f12HiZt9
この手の表現はネット検索でも探しにくいからなぁ。
検索ワードに含めることができない文字を使ってるかも知れんし。

Wikipedia で「顔文字」の「欧米型の顔文字」に例示されてるね。
P は大文字が普通なのか。小文字 p だと思ってたわ(てへぺろ)。
0933デフォルトの名無しさん垢版2018/11/29(木) 14:47:03.14ID:xfZAdJ8f
こないだTWITTERで orz の話題が流れてたわ。

「絵文字があるのにそういうので遊んでたんですね!」 → 「無かったんだよ (#^ω^)ピキピキ」
0934デフォルトの名無しさん垢版2018/11/29(木) 21:00:05.47ID:wegp6ebJ
全くの素人なんだがスタックサイズ以上の巨大なクラスをローカル変数として宣言したら即オバーフロー起こす?
0937デフォルトの名無しさん垢版2018/11/30(金) 08:17:26.96ID:J8op9N/7
スタックサイズのオーバーフローって普通、いちいちサイズ確認しながらエラー判断じゃなくて、
割り込み処理でやってるんだろ
0939デフォルトの名無しさん垢版2018/11/30(金) 14:20:25.90ID:fQi4U1HQ
宣言しただけでアクセスもせず関数も呼ばないなら、
エラーにならないのがほとんどかもな。
0942デフォルトの名無しさん垢版2018/12/01(土) 21:49:38.80ID:FAoigf3s
TinySchemeのカスタムインタプリタ作った時、例外の扱いやら引数チェックやら面倒で面倒で。
どうせみんなやってるんだから、標準のAPIがあれば車輪の再発明をせずにすむのに。
0943デフォルトの名無しさん垢版2018/12/01(土) 21:54:14.62ID:o8nGgYR0
#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::を付けてもだめでした。解かる方いましたらよろしくお願いします。
0946はちみつ餃子 ◆8X2XSCHEME 垢版2018/12/01(土) 22:08:39.24ID:OSJOUMnn
>>943
toupper は <locale> にある関数テンプレートと、 <cctype> に普通の関数がある。
どれだかわかんなくて混乱している。

toupper を [](char ch){return std::toupper(ch);} という風にラムダ式でくるむのが一番楽な方法だと思う。
0947デフォルトの名無しさん垢版2018/12/01(土) 22:24:03.10ID:FAoigf3s
> Guile
Cygwinの中じゃなきゃ動かないじゃないですかw
WindowsのGUIアプリのカスタマイズに入用だったんですよ。
0948はちみつ餃子 ◆8X2XSCHEME 垢版2018/12/01(土) 22:59:29.94ID:OSJOUMnn
>>947
Windows だけでいいなら、
言語処理系を組込んでしまうよりはインターフェイスを COM にしておいて
適当な (OLE オートメーションに対応した) 言語を使ってもらう方が簡単かも。
0949デフォルトの名無しさん垢版2018/12/01(土) 23:02:01.99ID:o8nGgYR0
>>945
コンパイル通りましたありがとうございます!
>>946
レスありがとうございます。ラムダはC#のをちょっとかじったくらいなのでよくわからないです。
0951はちみつ餃子 ◆8X2XSCHEME 垢版2018/12/02(日) 01:23:40.96ID:AEdnuZu9
Windows なら WSH がすごく良い仕組みなので、
その枠組みをぜひ活用して欲しいと思ってる。
0953デフォルトの名無しさん垢版2018/12/02(日) 16:20:56.00ID:qwr+Mk5T
今は日本語や漢字にとどまらず、Unicodeで許されるあらゆる言語の文字を使ってるから、表現性はとても豊か(何がだ)
0954デフォルトの名無しさん垢版2018/12/02(日) 16:34:18.61ID:FIqRJPSc
[](){}と括弧揃い踏みなところがラムダ式の素晴らしいところ
キャプチャの必要性が分かるまで15時間も掛かった
0956デフォルトの名無しさん垢版2018/12/03(月) 00:53:09.20ID:G9VPwKeW
#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;
}
}
0960デフォルトの名無しさん垢版2018/12/03(月) 06:05:42.99ID:szUqPRvW
>>956 が動かないってのはコンパイルエラーということだよね。

string x; だから x[i] の型は char で、
一方 stoi() が要求する引数は string であるからして...
0961デフォルトの名無しさん垢版2018/12/03(月) 15:49:30.56ID:bFjQrMvM
こういうことをしたいのではないか?

ここを    cout << stoi(x[i]) << endl;
こうする   cout << (isdigit(x[i])? x[i] - '0': 0) << endl;
0962デフォルトの名無しさん垢版2018/12/05(水) 04:14:09.40ID:yf36y6mU
クラスの中の宣言部分で
var a = new classA(32);
がある時にこの生成時間を測るには
p1out = 1;
var a = new classA(32);
p1out = 0;
ってやってP1.1をオシロで確認したらいいのだろうか?
0965デフォルトの名無しさん垢版2018/12/05(水) 11:50:29.68ID:UMfTWITZ
スタック領域に確保した変数のメモリはその変数のスコープ終了時に開放される
静的領域はスコープが終了しても開放されない
0966デフォルトの名無しさん垢版2018/12/05(水) 14:18:35.25ID:2sSegHBZ
だがちょっとまってほしい
本当にそれだけだろうか?
0968デフォルトの名無しさん垢版2018/12/05(水) 16:03:55.84ID:ccXzaFBs
静的領域は、アプリの実行前に確保する。
サイズも変動しない

スタック領域は、アプリの実行中に確保・解放する。
サイズも変動するし、領域を使い果たすと、stack overflow というエラーが起きる

事前にサイズがわからず、サイズが変動して、エラーが起きる可能性もあるので、
組み込み制御装置では、制限される事もある
0970デフォルトの名無しさん垢版2018/12/05(水) 17:12:15.31ID:ifntcr/4
組込だとスタック4つまでとかあるね。
下手に関数の中で関数呼び出し出来ない。

今はだいぶ緩和されてるけど、数が増えただけでPCほど緩くはない。
0971デフォルトの名無しさん垢版2018/12/05(水) 21:08:04.50ID:vV3Kttot
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文を使って書くと普通に上手く行くのですが、なぜエラーがでるのでしょうか
0972デフォルトの名無しさん垢版2018/12/05(水) 21:30:51.95ID:8vnwU0Eo
この前パソコンで100回くらいの再帰を書いたけど大丈夫だった
それともgccがよしなにやってんの?
0974デフォルトの名無しさん垢版2018/12/06(木) 06:42:35.96ID:6JYs1FEy
三項演算子が絡んだ式の (条件 ? 値A : 値B) 部分で
値Aと値Bの型が異なると、三項式(と言う呼び方で良いものか)全体としての
結果の型が確定しないからダメって感じかねぇ。

どうせ値を使っていない式文だからいいじゃん、は通らないと。
0975デフォルトの名無しさん垢版2018/12/06(木) 08:07:06.33ID:puhZa8TL
>>974
そうだね。
値A、値Bともに(void)でキャストすればコンパイルできた気がする。
そんなことするくらいなら素直にif/elseにすべきだけど。
0978デフォルトの名無しさん垢版2018/12/06(木) 09:05:40.26ID:THHCczvq
スタック領域は同じコンパイラでもオプションで変えられる事も多い(組み込みには言及しない)
末尾再帰だとループに展開されたりもするから(外から見た挙動が同じならC/C++はコンパイル後の表現を縛らない)、再帰イコールしぬとは限らない
0981デフォルトの名無しさん垢版2018/12/07(金) 14:38:45.55ID:lkrG/qbb
型の違いでっていうのも判るが
結局評価だけして代入しないなら
(副作用を期待しないって条件付きだが)
最適化で消される行かも知れんな
0982デフォルトの名無しさん垢版2018/12/13(木) 22:22:08.57ID:JDKMBsk/
https://ideone.com/pUrvlb
VisualStudioCommunity2017 ver15.9.4でこのコードをビルドすると
「error C2440: '<function-style-cast>': 'int' から 'Lit' に変換できません。」
というエラーが10行目で出るんだけど、何が悪いんだろうか。
0983デフォルトの名無しさん垢版2018/12/14(金) 01:28:14.98ID:l0obV/M9
Parser() { reg(Lit{ 1 }); } → Parser() { ::reg(Lit{ 1 }); }
コレでいける
理由は知らん
0985デフォルトの名無しさん垢版2018/12/27(木) 10:14:18.41ID:aMHl4+JJ
ubuntuで日本語含むファイル名を操作したいのでwoendirとかないのか探したんだけど見つからず、
wchar_tでファイル名処理した場合、いちいちmbstiwcsで変換するしかないの?
0986デフォルトの名無しさん垢版2018/12/27(木) 10:19:33.81ID:0qVX2+Xi
変換出来ない文字はどうすんの?
0989デフォルトの名無しさん垢版2018/12/27(木) 12:49:46.03ID:aMHl4+JJ
utf8のままどーやってopendirするのさ?
それができないから困ってるのに

DIR *dir = opendir("hogehoge");
struct dirent *dp;
dp=readdir(dir);
としたとき,dp->d_nameに入ってるファイル名ってのはcharだよね
このファイル名に手を加えようとする(renameとか)と、utf8の場合、いったんmbstowcsでwchar_tにでもコピーするとか、
wstringにでもコピーしないと文字コードと格闘する羽目になるよね。
もし、
wDIR *wdir = woprndir(L"hogehoge");
struct wdirent *wdp;
wdp = wreaaddir(wdir);
とかできればsonomama
wdp->d_nameはwcha_tなので文字の先頭バイト見て何文字なのか判断するなんて余計な操作しなくて済むと思ったわけ。
0990デフォルトの名無しさん垢版2018/12/27(木) 13:00:04.82ID:aMHl4+JJ
bashで
for i in *; do
$newname=`echo $i| myprogram`
mv $i $newname
done

で済ませてたんだけど、myprogramの方は単に文字処理だけで、
置換とか文字列削除とかややこしいところはwstringに変換してた。
bashに任せてたディレクトリオープンや、ファイル操作までC/C++でやらせようとなると、
再度wcstombsとか余計なコピーが必要になってなんだか思いっきり損してる気分になったので、
なんかほかの手がないものかと?
0991デフォルトの名無しさん垢版2018/12/27(木) 13:49:46.07ID:SzdNjvIa
>>989
utf8 を wchar_t* に入れるのはただのアホやろ
0994デフォルトの名無しさん垢版2018/12/27(木) 17:54:58.01ID:o7TBUkJP
無責任なこと書くけど、
Linuxならmountコマンドにオプション加えれば
ファイル名の文字コードをうまいこと透過的に変換してくれんか?

ファイルの実体に手を触れずにファイル名のコード系だけ変えたいなら、
struct dirent の d_name のバイト列をどう解釈するかの問題で、
ロケール関係ない話になりそうだし。
0997デフォルトの名無しさん垢版2018/12/28(金) 01:33:23.72ID:qtS4fp6w
>>991
それは違うだろ
ファイル名をcharに入れてregex_replaceあたりの正規表現で再びcharに入れる場合はともかく
全角半角変換みたいに文字コードそのものをいじりたい場合はwchar_tに入れるだろ
全角文字コード -= '!'-'!'
みたいな変換しようすれば
char *pBuf = Bufとして、
*pBufの値に応じて
((*pBuf<<16) +(pBuf[1]<<8)+(pBuf[2] )&(0x00ffff
みたいなバイトの組み立てが必要になるじゃん
*pBufの文字コードに応じて
pBuf +=3だのpBuf++だのインクリメント幅の調整も要るし
いったんwcha_tに入れるのは何も間違ってないと思うが
0998デフォルトの名無しさん垢版2018/12/28(金) 02:13:55.81ID:qtS4fp6w
シェルからファイル名をfgetwsで受け取ってるうちはwchar_tとwstringで処理してから
またシェルに出力を返せばすむけど
opendirにwchar_t版がないんで、正規表現以外の処理して、
シェルに任してた部分をC++で全部書こうとすると、
>>993のいうようにmbstowcsとwcstombsで処理を挟んでやらんとどーしよーもないと思う
0999デフォルトの名無しさん垢版2018/12/28(金) 05:55:59.60ID:ufThBpcD
c++builder10.3 community
IID_PPV_ARGSを使わない場合どうしたら良いか教えてください
何を入れたら良いのかわからないです
#include <windows.h>
#include <tchar.h>
#include <shlobj.h>
#include <shellapi.h>
#include <commoncontrols.h>
void __fastcall TForm1::Button1Click(TObject *Sender) {
IImageList *piml;

SHGetImageList(SHIL_JUMBO, IID_IImageList, (void**)&piml);// pimlがNULLになる

SHGetImageList(SHIL_JUMBO, IID_PPV_ARGS(&piml));// 成功
}
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 180日 2時間 20分 26秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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