C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
探検
C++相談室 part144
■ このスレッドは過去ログ倉庫に格納されています
2019/07/22(月) 13:18:35.52ID:gptRHpgT
330デフォルトの名無しさん
2019/08/04(日) 09:37:37.80ID:7855nA4b331デフォルトの名無しさん
2019/08/04(日) 18:06:02.62ID:24EQJs3u min(), max() マクロのような件は別として、標準的なライブラリであるところの
std::系の名前は、using namespace std; してもそんなに問題ないということは
無いんですか???
他のライブラリの名前空間 XXX も同時に using namespace XXX; した場合に
もし衝突が起きる場合は、using namespace XXX; だけはしないようにすれば、
特に問題ないような気がします。実際やってみたことが無いので経験者の意見を
聞いてみたいです。
std::系の名前は、using namespace std; してもそんなに問題ないということは
無いんですか???
他のライブラリの名前空間 XXX も同時に using namespace XXX; した場合に
もし衝突が起きる場合は、using namespace XXX; だけはしないようにすれば、
特に問題ないような気がします。実際やってみたことが無いので経験者の意見を
聞いてみたいです。
332デフォルトの名無しさん
2019/08/04(日) 18:48:22.76ID:xBRRtFJn 個人の趣味プログラミングならご自由に
仕事ならコーディング規約にあわせる
コーディング規約作る立場なら、チームにバカが混ざってる前提で非属人的になるようにルールを設ける
で経験を積めば積むほど自分がバカであることが身にしみてわかる
そういうことだよ
仕事ならコーディング規約にあわせる
コーディング規約作る立場なら、チームにバカが混ざってる前提で非属人的になるようにルールを設ける
で経験を積めば積むほど自分がバカであることが身にしみてわかる
そういうことだよ
333デフォルトの名無しさん
2019/08/04(日) 18:54:59.65ID:UDvg82p4 >>331
別に衝突しなくても問題は起こる。
using namespace stdで書いたコードをヘッダーのインライン関数に持って行く必要が出た場合とか、
using namespace std;
#inlucde "...."
となってしまっていてたまたま動いていたコードを、別の箇所でincludeしたときにエラーがでまくるとか。
別に衝突しなくても問題は起こる。
using namespace stdで書いたコードをヘッダーのインライン関数に持って行く必要が出た場合とか、
using namespace std;
#inlucde "...."
となってしまっていてたまたま動いていたコードを、別の箇所でincludeしたときにエラーがでまくるとか。
334デフォルトの名無しさん
2019/08/04(日) 19:00:40.18ID:Rn2rET4f >>333
ほとんど言いがかりレベルw
ほとんど言いがかりレベルw
335デフォルトの名無しさん
2019/08/04(日) 19:02:23.99ID:nZL08BTE std::くらい書けで終わる話をいつまで続けるつもりだ
336デフォルトの名無しさん
2019/08/04(日) 19:04:24.66ID:Is6FE1ys >>335
10万行とかのソースでそれをやりますか?
10万行とかのソースでそれをやりますか?
337デフォルトの名無しさん
2019/08/04(日) 19:06:21.58ID:UDvg82p4 >>336
ところどころについてたり、ついてなかったりするくらいなら、最初からstd::つける方がはるかにマシ。
ところどころについてたり、ついてなかったりするくらいなら、最初からstd::つける方がはるかにマシ。
338デフォルトの名無しさん
2019/08/04(日) 19:06:25.70ID:nZL08BTE やるよ
339デフォルトの名無しさん
2019/08/04(日) 19:09:16.58ID:6Wul5V0e 普通頻繁に使うライブラリをusingするだけで、名前空間ごとはやらんだろ
chrono使う時はたまにやるけど
chrono使う時はたまにやるけど
340デフォルトの名無しさん
2019/08/04(日) 20:26:05.66ID:uuq2lSJI ていうかstd::程度を書くのが面倒な人はC++向いてない
341デフォルトの名無しさん
2019/08/04(日) 20:49:37.11ID:i35UY3P6 size_tにだけ頑なにstd付けない人いるんですがなにか理由あるんですか
342デフォルトの名無しさん
2019/08/04(日) 20:52:21.46ID:Rn2rET4f >>336
1ファイルが10万行じゃないだろ(1ファイルならそこから直せw)
1ファイルが10万行じゃないだろ(1ファイルならそこから直せw)
343デフォルトの名無しさん
2019/08/04(日) 20:54:10.96ID:Rn2rET4f >>341
size_t は大昔からあるのと明らかに型名っぽい名前なのでわざわざバッティングさせる奴もいないからじゃね?
size_t は大昔からあるのと明らかに型名っぽい名前なのでわざわざバッティングさせる奴もいないからじゃね?
344デフォルトの名無しさん
2019/08/04(日) 21:52:28.11ID:UDvg82p4 >>341
size_tはC言語時代から存在してるから、もともとnamespace関係なく使える
size_tはC言語時代から存在してるから、もともとnamespace関係なく使える
345デフォルトの名無しさん
2019/08/05(月) 00:32:36.26ID:Al8hrMjU むしろstdにsize_tあったんだくらいの認識
346デフォルトの名無しさん
2019/08/05(月) 02:02:36.01ID:LDivZuKg おれも知らんかったなまぁ言われてみればたしかにそうだなsize_tってネィムスペィス上でも定義されてたのか今度から一貫性のためにstd::つけとこうかな
まぁ、editorのちょい設定いじるだけなんだがな(´・ω・`)
まぁ、editorのちょい設定いじるだけなんだがな(´・ω・`)
347デフォルトの名無しさん
2019/08/05(月) 12:35:07.05ID:uXNLYXLK >>340
そうでもない。
そうでもない。
348デフォルトの名無しさん
2019/08/05(月) 14:11:04.57ID:uXNLYXLK >>342
1ファイルの行数は関係有りません。
要は大きなプログラムを書いているとき、string で済むところを
全ての箇所で std::string と書くのかということです。
void func(std::string &somename, int a, int b) {
std::string aaa;
aaa = somename + "abc";
}
struct Txxx {
std::string name1;
std::string name2;
・・・・
};
↑のようにタイピングするのは余り賢いやり方だとは思えません。
1ファイルの行数は関係有りません。
要は大きなプログラムを書いているとき、string で済むところを
全ての箇所で std::string と書くのかということです。
void func(std::string &somename, int a, int b) {
std::string aaa;
aaa = somename + "abc";
}
struct Txxx {
std::string name1;
std::string name2;
・・・・
};
↑のようにタイピングするのは余り賢いやり方だとは思えません。
349デフォルトの名無しさん
2019/08/05(月) 14:19:44.18ID:EKfu+tDr そんなに面倒ならusing S = std::stringでもすればいいじゃん
350デフォルトの名無しさん
2019/08/05(月) 14:24:57.77ID:nblSLoEW 過度に賢く振る舞おうとして滑ってるパターン
それくらい普通に書けばいいじゃん
それくらい普通に書けばいいじゃん
351デフォルトの名無しさん
2019/08/05(月) 14:27:04.00ID:xQVlfAfV こういう奴って馬鹿丁寧に一文字ずつ全部打ってんのかね
補完って機能の概念がない世界に住んでんのかしら
補完って機能の概念がない世界に住んでんのかしら
352デフォルトの名無しさん
2019/08/05(月) 14:51:04.49ID:nl2V9bb6 >>348ってジョルノっぽいよな
353デフォルトの名無しさん
2019/08/05(月) 20:01:38.61ID:s1STjseD >>348
> 1ファイルの行数は関係有りません。
> 要は大きなプログラムを書いているとき、string で済むところを
> 全ての箇所で std::string と書くのかということです。
俺は書く。
> ↑のようにタイピングするのは余り賢いやり方だとは思えません。
お前の感想はどうでもいい
> 1ファイルの行数は関係有りません。
> 要は大きなプログラムを書いているとき、string で済むところを
> 全ての箇所で std::string と書くのかということです。
俺は書く。
> ↑のようにタイピングするのは余り賢いやり方だとは思えません。
お前の感想はどうでもいい
354デフォルトの名無しさん
2019/08/05(月) 22:09:13.72ID:B18jZANO >>348
高々数文字のタイピングに拘って名前空間のメリットが理解できないという主張を繰り返すお前さんの行動は、余り賢いやり方とは思えません。
高々数文字のタイピングに拘って名前空間のメリットが理解できないという主張を繰り返すお前さんの行動は、余り賢いやり方とは思えません。
355デフォルトの名無しさん
2019/08/05(月) 22:10:29.33ID:7u4aY/7T356デフォルトの名無しさん
2019/08/05(月) 22:17:59.20ID:vqN4pUkV 無駄だと思うならtypedefやusingすりゃいいじゃないか
そもそもstringって名前長すぎだろ
そもそもstringって名前長すぎだろ
357デフォルトの名無しさん
2019/08/05(月) 22:26:34.39ID:xngMWyKF usingである程度の広さのスコープでやるんが正解だろ。
まあこのある程度の広さってのが人によってだいぶ違うだろうが。
まあこのある程度の広さってのが人によってだいぶ違うだろうが。
358デフォルトの名無しさん
2019/08/05(月) 22:37:46.60ID:vqN4pUkV 少なくともstdは普通using namespaceしないよね
でかすぎる
最近良くやるのは
namespace fs=std::filesystem;
だな
まあこれもヘッダで使うなら独自namespaceに入れてからだが
でかすぎる
最近良くやるのは
namespace fs=std::filesystem;
だな
まあこれもヘッダで使うなら独自namespaceに入れてからだが
359デフォルトの名無しさん
2019/08/05(月) 23:33:53.82ID:/t1yyPXk using namespace std;をグローバルなスコープでやってしまうと
ソースコードを他に持って行ったとき困る
fooをstd::fooに変換するのはfooの種類が100台になると並みのエディタの置換機能では手間的にアウト
一方std::をとるのなら簡単にできる
std::をつけるのは将来への投資といえる
ソースコードを他に持って行ったとき困る
fooをstd::fooに変換するのはfooの種類が100台になると並みのエディタの置換機能では手間的にアウト
一方std::をとるのなら簡単にできる
std::をつけるのは将来への投資といえる
360デフォルトの名無しさん
2019/08/07(水) 02:10:18.89ID:/mJrMLHD 初心者除ける、上級勘違い中級者こそ、出て行ってくれないかな。
本当の上級者は、プログラミング初めての人でも、優しくあたってくれますよ。
本当の上級者は、プログラミング初めての人でも、優しくあたってくれますよ。
361デフォルトの名無しさん
2019/08/07(水) 02:48:46.85ID:tJwlIUsZ364デフォルトの名無しさん
2019/08/07(水) 08:04:40.03ID:go9nzBX4 入れ子となったクラスの内側のクラスから外側のクラスのprivateメンバにアクセスできるという
内側のクラスの特権はJavaやC#と同じくC++にもあるから、これを使って大規模なStateパターンでも書いた日には
ソースコードの行数も大規模にならざるおえない
このとき上記3言語の中で唯一大規模にならずに済むのはクラスの分割定義が可能なC#だけ
内側のクラスの特権はJavaやC#と同じくC++にもあるから、これを使って大規模なStateパターンでも書いた日には
ソースコードの行数も大規模にならざるおえない
このとき上記3言語の中で唯一大規模にならずに済むのはクラスの分割定義が可能なC#だけ
365デフォルトの名無しさん
2019/08/07(水) 09:17:55.92ID:eqkXQjzY まず日本語を勉強しましょう
366デフォルトの名無しさん
2019/08/07(水) 09:31:41.35ID:ZWXmwdWw 昨今のプログラミング用語における入れ子は界隈に限らず日常的に使われているが
プログラミング業界では特に再帰的構造を指す場合にも多く使われる
そこに非常に現代的な特殊用語たる「出し子」が加わると
一般人は入れ子と出し子が対になっていると思い込む
プログラミング業界では特に再帰的構造を指す場合にも多く使われる
そこに非常に現代的な特殊用語たる「出し子」が加わると
一般人は入れ子と出し子が対になっていると思い込む
367デフォルトの名無しさん
2019/08/07(水) 09:45:33.66ID:Io4EJaZl 入れ子の内側のクラスは別ファイルに定義できる
368デフォルトの名無しさん
2019/08/07(水) 09:55:09.68ID:FLvBFSJD 好きなだけわけてincludeすればいいじやん
369デフォルトの名無しさん
2019/08/07(水) 23:36:21.14ID:gdjRebyd スコープにあった変数名の長さにするべきとかそういうのお前らは習ってねーの?
370デフォルトの名無しさん
2019/08/07(水) 23:50:58.34ID:db+FOt2P そういう感覚的なルールいらない
チェックできないルールはなくていい
チェックできないルールはなくていい
371デフォルトの名無しさん
2019/08/08(木) 00:01:50.09ID:QQC8VFJ9 >>370
感覚的な部分を必要とすべきでないなら全てアセンブラで書けばか。
感覚的な部分を必要とすべきでないなら全てアセンブラで書けばか。
372デフォルトの名無しさん
2019/08/08(木) 03:03:18.83ID:2Zq4F03j373デフォルトの名無しさん
2019/08/08(木) 03:51:27.57ID:TsWml31+ errnoに謝罪しる
374デフォルトの名無しさん
2019/08/08(木) 05:46:38.89ID:FTUf1Nuq375デフォルトの名無しさん
2019/08/08(木) 06:53:52.07ID:5ZN2ymvH 頭悪そう
376デフォルトの名無しさん
2019/08/08(木) 10:31:27.94ID:llWdm4EH それは設計の問題でしょ
30億通りのstateパターンで設計する方が悪い
言語の問題じゃあないな
あり得ないヘンな例を持ち出してdisる詐欺師の方法だ
30億通りのstateパターンで設計する方が悪い
言語の問題じゃあないな
あり得ないヘンな例を持ち出してdisる詐欺師の方法だ
377デフォルトの名無しさん
2019/08/08(木) 21:15:10.76ID:lDut6bjR378デフォルトの名無しさん
2019/08/08(木) 22:58:59.35ID:TsWml31+ コンパイル時に発覚する程度のエラーなら許容範囲でしょ。
379デフォルトの名無しさん
2019/08/09(金) 00:11:55.59ID:LbUkdyT/ c++で想定外の場合にエラーメッセージとその行数を出して終了させたいのですが、
どのようにしたらできますか?
下記のようにしてもexitした行数が出ません。。
::fprintf(stderr, "error.\n");
exit 1;
perlのdie()のようなものをイメージしています。
どのようにしたらできますか?
下記のようにしてもexitした行数が出ません。。
::fprintf(stderr, "error.\n");
exit 1;
perlのdie()のようなものをイメージしています。
380デフォルトの名無しさん
2019/08/09(金) 00:39:22.71ID:Ps8ScE7S ::fprintf(stderr, "error. (line: \d)\n", __LINE__);
とか
とか
381デフォルトの名無しさん
2019/08/09(金) 22:56:01.92ID:nHekiGzf 丁寧にエラーメッセージ出すよりデバッガでバックトレースかけた方が早かったりするのは内緒
382デフォルトの名無しさん
2019/08/09(金) 23:44:34.34ID:4GlakzRE 右辺値参照ってconst参照という認識でOKですか?
383デフォルトの名無しさん
2019/08/10(土) 01:07:05.35ID:uRDSBt/F >>382
moveで中身を奪い取るからconstじゃだめよ。
moveで中身を奪い取るからconstじゃだめよ。
384デフォルトの名無しさん
2019/08/10(土) 06:27:08.55ID:9vKRFOhk >>381
そりゃデバッガ使える状況ならその方が速いことは誰でも知ってるだろw
そりゃデバッガ使える状況ならその方が速いことは誰でも知ってるだろw
385379
2019/08/10(土) 09:48:42.90ID:bGTBV06s386デフォルトの名無しさん
2019/08/10(土) 15:57:01.40ID:lQ/anG82 ググってもなかなか出てこないが__LINE__はlong型だったと思った!
387デフォルトの名無しさん
2019/08/10(土) 16:00:35.87ID:Azv7NalM388デフォルトの名無しさん
2019/08/10(土) 16:25:20.56ID:SX6PRfyx intでダメなファイルとかそもそもコンパイルできねーだろ。
389デフォルトの名無しさん
2019/08/10(土) 16:36:59.44ID:Azv7NalM 2GBの¥nの後にソースかいてみるとわかるかなw
390デフォルトの名無しさん
2019/08/10(土) 16:48:09.53ID:9vKRFOhk391デフォルトの名無しさん
2019/08/10(土) 16:57:47.58ID:Azv7NalM いや、多分そこまで考えてないから、コンパイラ上ではintもしくはsize_tで
マクロ展開時は文字列化して接尾の型指定とかつけないだろ
勝手につけられると逆に困るし
マクロ展開時は文字列化して接尾の型指定とかつけないだろ
勝手につけられると逆に困るし
392デフォルトの名無しさん
2019/08/10(土) 17:01:16.99ID:lQ/anG82 int型はターゲットアーキテクチャーで一番自然な型というのが本来の意味なのでソースコードの最大行数と関係する理由が無い
C++の最新規格ではどうなったかわからんが、longは規格上32 bit固定なのに対してintは16 bitのアーキテクチャーが有り得るはず
C++の最新規格ではどうなったかわからんが、longは規格上32 bit固定なのに対してintは16 bitのアーキテクチャーが有り得るはず
393デフォルトの名無しさん
2019/08/10(土) 17:02:52.50ID:sTg7TrG2 32bit固定?
394デフォルトの名無しさん
2019/08/10(土) 17:06:31.95ID:Azv7NalM longが32bit固定なシステムは64bitでは異端じゃね
まあwindowsはLLP64っぽいが
まあwindowsはLLP64っぽいが
395デフォルトの名無しさん
2019/08/10(土) 19:05:34.69ID:bGTBV06s バイナリファイルを一度に読み込もうとしています。
圧縮ありファイルと圧縮なしファイルを以下のように判定して読み込もうとしているのですが、
ファイルの全てを読み込む方法がわかりません。
@Aはどのようにしたら良いですか?
http://codepad.org/FwYwQ62R
圧縮ありファイルと圧縮なしファイルを以下のように判定して読み込もうとしているのですが、
ファイルの全てを読み込む方法がわかりません。
@Aはどのようにしたら良いですか?
http://codepad.org/FwYwQ62R
396デフォルトの名無しさん
2019/08/10(土) 19:14:37.23ID:J81sqFQj std::
これ自体は大した量ではないとは思うけど
これが何百何千と書かないといけないなら省略できる方法は必要だと思う
省略して且つ安全で簡単な方法が無いのが問題なんだと思う
ここまで読んででusing宣言を書き連ねたファイルを用意して
関数定義の次の行で#includeするのが今の所一番良い様な気がした
const何かも余りに書きすぎるので
これも何らかの形で省略できる記法を搭載できないのだろうかとは思ってる
classのpublic:
みたいに
const:
とかするとその後は記載しなくてもconst宣言になる
みたいな方法を搭載したりはしないのか?
と何時も疑問に思う
これ自体は大した量ではないとは思うけど
これが何百何千と書かないといけないなら省略できる方法は必要だと思う
省略して且つ安全で簡単な方法が無いのが問題なんだと思う
ここまで読んででusing宣言を書き連ねたファイルを用意して
関数定義の次の行で#includeするのが今の所一番良い様な気がした
const何かも余りに書きすぎるので
これも何らかの形で省略できる記法を搭載できないのだろうかとは思ってる
classのpublic:
みたいに
const:
とかするとその後は記載しなくてもconst宣言になる
みたいな方法を搭載したりはしないのか?
と何時も疑問に思う
398デフォルトの名無しさん
2019/08/10(土) 19:26:04.25ID:jgcB4xBs >>396
constこそusing書き連ねたファイル用意してincludeすればいいのでは
using cchar = const char;
using cuchar = const unsigned char;
using cint = const int;
using cuint = const unsigned int;
constこそusing書き連ねたファイル用意してincludeすればいいのでは
using cchar = const char;
using cuchar = const unsigned char;
using cint = const int;
using cuint = const unsigned int;
399デフォルトの名無しさん
2019/08/10(土) 20:32:30.45ID:pnnBC1tu >>396
その疑問の答えは、あなたが具体的な提案を標準化委員会に持っていかない理由の答えと同じでしょう。
その疑問の答えは、あなたが具体的な提案を標準化委員会に持っていかない理由の答えと同じでしょう。
400デフォルトの名無しさん
2019/08/10(土) 20:36:22.66ID:qcH7oj7q constじゃないのにmut書かされる方が面倒
401デフォルトの名無しさん
2019/08/10(土) 20:51:51.67ID:TQTMDKQQ c++20のimportで解決するだろうか。
402デフォルトの名無しさん
2019/08/11(日) 00:40:56.64ID:khTmYGk1 >>397
ありがとうございます。
とりあえず圧縮なしの方は以下で取得できたようです。
ここで一点疑問です。
mallocの値がぴったり正しいかの確認をしようと、下記5行目のdatasize+1を-2や-3にしたのですが、
printf()で最後まで値が正常に出てきます。
datasize-3としてもたまたま連続して拾っているだけなので問題ありだと思うのですが、
malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか?
unsigned char* data;
long datasize;
fseek(fp, 0, SEEK_END);
datasize = ftell(fp);
data = (unsigned char*)malloc(datasize+1); // +1を-2, -3にしてもprintf()では最後まで正常な値が出てくる。
if( data == NULL ){
exit(1);
}
fseek(fp, 0, SEEK_SET);
fread(data, 1, datasize, fp);
fclose(fp);
for(int i=0; i < datasize; i++){
printf("%02x\n", data[i]);
}
ありがとうございます。
とりあえず圧縮なしの方は以下で取得できたようです。
ここで一点疑問です。
mallocの値がぴったり正しいかの確認をしようと、下記5行目のdatasize+1を-2や-3にしたのですが、
printf()で最後まで値が正常に出てきます。
datasize-3としてもたまたま連続して拾っているだけなので問題ありだと思うのですが、
malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか?
unsigned char* data;
long datasize;
fseek(fp, 0, SEEK_END);
datasize = ftell(fp);
data = (unsigned char*)malloc(datasize+1); // +1を-2, -3にしてもprintf()では最後まで正常な値が出てくる。
if( data == NULL ){
exit(1);
}
fseek(fp, 0, SEEK_SET);
fread(data, 1, datasize, fp);
fclose(fp);
for(int i=0; i < datasize; i++){
printf("%02x\n", data[i]);
}
403蟻人間 ◆T6xkBnTXz7B0
2019/08/11(日) 00:49:51.23ID:KV8Qszx5 割り当てされてない領域に書き込むというのは、C/C++ではあり得る。
そこに他に意味のあるデータがあれば、そのデータは壊れる(データ破壊)。
そこに他に意味のあるデータがあれば、そのデータは壊れる(データ破壊)。
404デフォルトの名無しさん
2019/08/11(日) 07:16:49.27ID:bWvktEwN >>402
処理系によるけど大抵の処理系では指定されたサイズをきっちり確保とかはしなくて16バイト単位くらいで確保する
なのでそのdatasizeの値によっては-15とかしても大丈夫な場合すらあることがある
もちろん動作は保証されない
処理系によるけど大抵の処理系では指定されたサイズをきっちり確保とかはしなくて16バイト単位くらいで確保する
なのでそのdatasizeの値によっては-15とかしても大丈夫な場合すらあることがある
もちろん動作は保証されない
405デフォルトの名無しさん
2019/08/11(日) 08:16:38.18ID:8PrAFYrU > malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか?
malloc(datasize)で十分、malloc(datasize+1)だと1つ余分
freadでもprintfでもdatasize個までしかアクセスしていないので
malloc(datasize)で十分、malloc(datasize+1)だと1つ余分
freadでもprintfでもdatasize個までしかアクセスしていないので
406デフォルトの名無しさん
2019/08/11(日) 09:14:50.61ID:G1nCiIo0 とりあえずvalgrindかけてみるのが良い。
407デフォルトの名無しさん
2019/08/11(日) 10:12:56.60ID:rgBQlH0q 昔みたいにメモリ枯渇なんてそうないし誰かがデータ破壊やらかして休みに呼び出し食らいたくないので16バイトくらい余計に確保しとこ
408デフォルトの名無しさん
2019/08/11(日) 10:13:58.51ID:5go57VsQ なんでビット単位で確保できないんですか?
409デフォルトの名無しさん
2019/08/11(日) 10:36:40.97ID:x7hs8Ubh 面倒だし遅いし...
410デフォルトの名無しさん
2019/08/11(日) 10:41:05.01ID:EQYlQ9TU CPUがそう出来てないから
411395
2019/08/11(日) 11:36:18.32ID:khTmYGk1 >>404
malloc()は数を指定していて、for分でアクセスしているdataは配列だから最後はdatasize-1ということですね。
僕の理解と合いました。
malloc(datasize)とします。
ありがとうございます。
次にgzipの全読み込みも調べています。
とりあえず下記でout.dbと展開後のaaa.dbのcksum値が一致したのでちゃんと読み込めたと思います。
※1のところで配列に格納すれば良いと思うのですが、最初は配列の数が確定していないので
配列数を決定することができません。
読み込むファイルサイズはギガバイトクラスの大きなファイルなので、なるべく速度を維持したまま
一つの配列に格納したいのですが、どうすれば良いですか?
FILE *wfp;
gzFile rzp;
unsigned char buf[8192*1000] = {0};
rzp = gzopen("aaa.db.gz", "rb");
wfp = fopen("out.db", "wb");
while((cnt = gzread(rzp, buf, sizeof(buf))) > 0){
fwrite( buf, sizeof( unsigned char ), cnt, wfp );
※1 ここで全データを一つの配列に格納したい。
}
gzclose(rzp);
fclose(wfp);
malloc()は数を指定していて、for分でアクセスしているdataは配列だから最後はdatasize-1ということですね。
僕の理解と合いました。
malloc(datasize)とします。
ありがとうございます。
次にgzipの全読み込みも調べています。
とりあえず下記でout.dbと展開後のaaa.dbのcksum値が一致したのでちゃんと読み込めたと思います。
※1のところで配列に格納すれば良いと思うのですが、最初は配列の数が確定していないので
配列数を決定することができません。
読み込むファイルサイズはギガバイトクラスの大きなファイルなので、なるべく速度を維持したまま
一つの配列に格納したいのですが、どうすれば良いですか?
FILE *wfp;
gzFile rzp;
unsigned char buf[8192*1000] = {0};
rzp = gzopen("aaa.db.gz", "rb");
wfp = fopen("out.db", "wb");
while((cnt = gzread(rzp, buf, sizeof(buf))) > 0){
fwrite( buf, sizeof( unsigned char ), cnt, wfp );
※1 ここで全データを一つの配列に格納したい。
}
gzclose(rzp);
fclose(wfp);
412デフォルトの名無しさん
2019/08/11(日) 12:32:14.46ID:G+0fIs5w gzipって全部読まないと展開後の長さ分からないんじゃね
2パスにするとか
2パスにするとか
413デフォルトの名無しさん
2019/08/11(日) 17:00:08.00ID:x7hs8Ubh qiitaでさC++のタグ検索したらcppreference.comが公式リファレンスと書かれてたけどここ公式なの?
414デフォルトの名無しさん
2019/08/11(日) 17:08:33.67ID:CsmlJ4sC >>413
https://ja.cppreference.com/w/Cppreference:FAQ
このサイトの背後にいるのは誰ですか?
cppreference.com は世界中の C++ 愛好家のグループによって作成され、メンテナンスされています。
https://ja.cppreference.com/w/Cppreference:FAQ
このサイトの背後にいるのは誰ですか?
cppreference.com は世界中の C++ 愛好家のグループによって作成され、メンテナンスされています。
415395
2019/08/11(日) 18:01:46.19ID:khTmYGk1 >>412
コメントありがとうございます。
全部読む以外に調べる方法は無いんですね。
ということでrealloc()で拡張していくことを考えてみました。
下記で作られた解凍後のデータがgunzipで解凍したものと一致したので大丈夫そうです。
ありがとうございました。
#define MAX_BYTE 8192*1000
data = (unsigned char*)malloc(MAX_BYTE);
rzp = gzopen("aaa.db.gz", "rb");
long data_size = 0;
while((cnt = gzread(rzp, data+data_size, MAX_BYTE)) > 0){
data_size += cnt;
data_new = (unsigned char*)realloc(data, data_size+MAX_BYTE);
if( data_new == NULL ){
free(data);
::fprintf(stderr, "拡張失敗\n");
exit(EXIT_FAILURE);
}
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
}
}
gzclose(rzp);
// 解凍後データを書き込み
wfp = fopen("out.db", "wb");
fwrite( data, sizeof( unsigned char ), data_size, wfp );
fclose(wfp);
コメントありがとうございます。
全部読む以外に調べる方法は無いんですね。
ということでrealloc()で拡張していくことを考えてみました。
下記で作られた解凍後のデータがgunzipで解凍したものと一致したので大丈夫そうです。
ありがとうございました。
#define MAX_BYTE 8192*1000
data = (unsigned char*)malloc(MAX_BYTE);
rzp = gzopen("aaa.db.gz", "rb");
long data_size = 0;
while((cnt = gzread(rzp, data+data_size, MAX_BYTE)) > 0){
data_size += cnt;
data_new = (unsigned char*)realloc(data, data_size+MAX_BYTE);
if( data_new == NULL ){
free(data);
::fprintf(stderr, "拡張失敗\n");
exit(EXIT_FAILURE);
}
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
}
}
gzclose(rzp);
// 解凍後データを書き込み
wfp = fopen("out.db", "wb");
fwrite( data, sizeof( unsigned char ), data_size, wfp );
fclose(wfp);
416デフォルトの名無しさん
2019/08/11(日) 18:25:47.16ID:bWvktEwN417395
2019/08/11(日) 19:34:48.78ID:khTmYGk1418デフォルトの名無しさん
2019/08/11(日) 19:44:47.41ID:bWvktEwN >>417
> 2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
1回目(Pass 1)ではデータの格納はせずにサイズだけ取得する
合計サイズ分を確保して2回目(Pass 2)で実際に格納するってこと
> あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
そう言うこと
でかいデータはコピーにも時間がかかるからできるだけコピーしないようにした方がいい
> 2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
1回目(Pass 1)ではデータの格納はせずにサイズだけ取得する
合計サイズ分を確保して2回目(Pass 2)で実際に格納するってこと
> あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
そう言うこと
でかいデータはコピーにも時間がかかるからできるだけコピーしないようにした方がいい
419395
2019/08/11(日) 20:30:35.16ID:khTmYGk1 >>417
2パス良さそうですね。
gzread(rzp, data+data_size, MAX_BYTE)
のところを下記のようにNULLにしてもちゃんとファイルの最後まで動いているようなのですが、これがデータ格納せずにサイズを取得するということでしょうか?
gzread(rzp, NULL, MAX_BYTE)
2パス良さそうですね。
gzread(rzp, data+data_size, MAX_BYTE)
のところを下記のようにNULLにしてもちゃんとファイルの最後まで動いているようなのですが、これがデータ格納せずにサイズを取得するということでしょうか?
gzread(rzp, NULL, MAX_BYTE)
420デフォルトの名無しさん
2019/08/11(日) 20:43:01.53ID:khTmYGk1 すみません、NULLだとそもそも一回も取得できずに終わっていました。。
データ格納せずに一回ファイル精査するのってどうするんでしょうか?
データ格納せずに一回ファイル精査するのってどうするんでしょうか?
421デフォルトの名無しさん
2019/08/11(日) 21:37:44.09ID:vST/kP4M >>420
固定長のバッファを1つ用意して、そこに上書きしながら繰り返し読み込めばいい。内容は上書きされて読めなくなるけど、読み捨てるつもりなので気にしない。
固定長のバッファを1つ用意して、そこに上書きしながら繰り返し読み込めばいい。内容は上書きされて読めなくなるけど、読み捨てるつもりなので気にしない。
422デフォルトの名無しさん
2019/08/11(日) 21:42:34.43ID:bWvktEwN (最終的なところに)格納しないってことな
適当なバッファを1つ用意して毎回そこに格納しとけばいい
適当なバッファを1つ用意して毎回そこに格納しとけばいい
423デフォルトの名無しさん
2019/08/11(日) 21:43:08.15ID:bWvktEwN あっ、被ってた
424デフォルトの名無しさん
2019/08/11(日) 22:55:38.50ID:khTmYGk1 >>421,422
そういうことですか、理解できましたありがとうございます。
そういうことですか、理解できましたありがとうございます。
425デフォルトの名無しさん
2019/08/12(月) 00:27:35.40ID:Y24CRytA vectorだって償却定時間なのに
ホントに2回読む方が速いんか?
ホントに2回読む方が速いんか?
426デフォルトの名無しさん
2019/08/12(月) 00:55:04.06ID:owwy1DHX valgrindってみんな開発に使ってるの?死ぬほど遅いんですが
427デフォルトの名無しさん
2019/08/12(月) 09:13:50.21ID:QXujyVaw でかい領域のreallocで毎回コピーが発生するというのは都市伝説、
と言いたいところだが他のスレッドが動いているとそうとも言い切れないかそうか、
この場合の2パス方式はgzipが2回走るのがいかにも実行時間の無駄でいやすぐる
最初に大きめの領域をmallocして足りんかったら2パスに切り替えるという投機的なやり方のが良い
と言いたいところだが他のスレッドが動いているとそうとも言い切れないかそうか、
この場合の2パス方式はgzipが2回走るのがいかにも実行時間の無駄でいやすぐる
最初に大きめの領域をmallocして足りんかったら2パスに切り替えるという投機的なやり方のが良い
428デフォルトの名無しさん
2019/08/12(月) 09:18:32.18ID:QXujyVaw だいたいいかにgzip様といってもファイルを毎回1/10まで圧縮できるわけはないのだから
読み込むファイルサイズの10倍を確保しておけばほぼ1パスで済む
展開後の実サイズがわかったら展開後の実サイズぴったりにreallocで縮小すれば良い
ちなメモリの断片化はガン無視
実使用サイズの倍のメモリも用意できないようなプアな環境のならmallocやreallocする設計から見直さねばならない
見直すべき
読み込むファイルサイズの10倍を確保しておけばほぼ1パスで済む
展開後の実サイズがわかったら展開後の実サイズぴったりにreallocで縮小すれば良い
ちなメモリの断片化はガン無視
実使用サイズの倍のメモリも用意できないようなプアな環境のならmallocやreallocする設計から見直さねばならない
見直すべき
429デフォルトの名無しさん
2019/08/12(月) 10:16:31.87ID:Mc0sgLDk430デフォルトの名無しさん
2019/08/12(月) 10:19:40.97ID:QXujyVaw >>429
ヒープメモリはスレッドで共有される
もしヒープメモリを使う他のスレッドが一切無いなら
realloc()でサイズ拡大してもコピーは生じない(後ろに領域伸ばせるから
この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
(あのmalloc()実装例がmalloc()実装の全てとは言わんが基本
ヒープメモリはスレッドで共有される
もしヒープメモリを使う他のスレッドが一切無いなら
realloc()でサイズ拡大してもコピーは生じない(後ろに領域伸ばせるから
この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
(あのmalloc()実装例がmalloc()実装の全てとは言わんが基本
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- __トランプ、イスラエル支援で追加6.5億ドル承認、合計約200億ドル、この支出を国内課題への対応と比較して批判 [827565401]
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
- そういえばクマのニュース減ったよな
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 木曜日のんなっしょい❗(・o・🍬)仕放題スレ🏡
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
