TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
3Dアルゴリズム全般
【魔法】リリカル☆Lisp【言語】
Visual Studio Code / VSCode Part7
サウンドプログラミング5
C#は糞2.0
UWSC初心者用スレ
■特許庁新システムを作る■
Excel VBA 質問スレ Part56
バージョン管理システムについて語るスレ10
Java/C++ VS C# どっちが好きか教えて
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
- 1 :2017/11/04 〜 最終レス :2018/06/09
- エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.2ch.sc/test/read.cgi/tech/1500329247/
- 2 :
- >>1
乙
- 3 :
- unsigned long strtoulxn( char const* psz, size_t n )
{
unsigned long v;
for ( v = 0; *psz && n--; psz++ ) {
if ( ! isdigit( *psz ) ) {
continue;
}
v = 10 * v + ( *psz - '0' );
}
return v;
}
- 4 :
- これは酷いクソコード
- 5 :
- 実行速度
見やすさ
汎用性
コードサイズ
どれかひとつ位は満たさないと
- 6 :
- >>5
まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね
- 7 :
- >>3 の関数は前のスレッドの終わりに出た
"12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、
てお題の答案かな。
…と思ったけど、NUL終端文字列が仮定されてるね。
どういう流れで投稿されたんだろう?
- 8 :
- size_t n で文字数を受けとるからNUL終端である必要は無いのでは
- 9 :
- if (strncmp(psz, "12 34 56", 8) == 0) return 123456;
- 10 :
- 相変わらず片山はクソコードしか書かないな
""だと不定値返る数値変換なんてゴミ
- 11 :
- >>10
確かにクソコードだが不定値は返らんぞ
- 12 :
- >>9 は質問者に対する皮肉のつもりだったんだけど
- 13 :
- 意図的に糞コードを書いた事もわからないクソがいるとは
こんな簡単なコードの動作も理解できてないようだし
- 14 :
- 初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと
しかも後付けで言われてもあんまり支持できないなぁ。
せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。
「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。
>>3 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、
実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。
後置デクリメント評価値、ね。
- 15 :
- 誰も騙してないのにクソみたいなプライドが高いな
- 16 :
- 出だしから勢いのいいうんこだな
何のスレか忘れてしまいそう
- 17 :
- psz = "", n = 0 はいいけど
char a[8] で psz = a, n = 8 を渡すと不定値どころか鼻から悪魔の糞コード
仕様も理解せずに余計なことしてバグを作り込む知ったかの典型
- 18 :
- >>3
●パフォーマンス
*pszが3回も出てくる
代入して持っておいた方が
チープなコンパイラでは速度が変わる
isdigit
どうせ数字が連続してる前提のコードなんだから
関数を呼ばずに'0' '9'と比較しちゃおう
そうのが速い
関数コールは一般的に遅い
●見やすさ
forループにいくつも入れない
while (n--) か for (size_t i= 0; i < n ; i++)
null文字はbreakで
●仕様
null文字とサイズ、両方で停止は仕様としては問題ない
パフォーマンス最優先であればそれぞれの特別版を作ればいい
文字数もスペースの位置も固定で
パフォーマンス最優先なら
ループアンロールするのが一番
- 19 :
- >>10
人違い。
- 20 :
- >>18
> null文字とサイズ、両方で停止は仕様としては問題ない
だからダメだっつーの
知ったかは黙ってろよ
最低限サイズチェックを先にやらないとダメ
- 21 :
- 仕様として「両方で停止は問題ない」よな?
判別の順番は問題だ
順番が逆
そもそも相談者の仕様がおかしい
- 22 :
- 先に大きさでチェックしてから 内容の nul チェックする
for ( v = 0; n-- && *psz; psz++ ) {
これなら、存在しない指し先のデリファレンスしないし
ただ、
ショートサーキット前提の記述をよしとするかどうかはわからん
- 23 :
- int str2i( const char *s, size_t n )
{
int v = 0;
while ( n-- ) {
char c = *s++;
if ( c == '0' ) break;
if ( '0' <= c && c <= '9' ) v = v * 10 + ( c - '0' );
}
return v;
}
- 24 :
- 片山以外に文字化けするブラウザ使ってる奴いるのか
あとnull文字って初心者が背伸びしてる感じがして微笑ましいな
- 25 :
- ソフト歴35年ですが
- 26 :
- PC(プロセスコントローラー)のプログラマーですが何か?
ってのは居たが
- 27 :
- isdigitが関数コールな処理系ってあるのか?
ここって車輪の再発明好きな人多いのかね
- 28 :
- isdigitは、ロケールの関係で遅くなる可能性があるはず。256バイトの配列を使うのが最速だ。
- 29 :
- ちょっとした演算よりメモリアクセスの方が遅いこともあるよ。
本当に配列が最速?
(試したわけではないので配列が最速かもしれない……)
- 30 :
- 配列www
ないない
仮に>>23より速くても
- 31 :
- int str2i( const char *s, size_t n )
{
int v = 0;
while ( n-- ) {
char c = *s++;
switch (c){
case '¥0':
goto brk;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
v = v * 10 + ( c - '0' );
break;
}
}
brk:
return v;
}
- 32 :
- これのがまだマシ
- 33 :
- 普通に>>23でいい
- 34 :
- gotoとかwwww
って思った人いるんだろうか
- 35 :
- switch である必要ないな
- 36 :
- >>34
ああ、素人はgoto嫌うよな
>>35
もちろん必要は無い
テーブルよりは色々な面でマシってだけ
普通に if ( '0' <= c && c <= '9' ) で良い
一目で意味がわかるし高速
- 37 :
- &&って条件分岐が入るけど、本当に高速?
- 38 :
- そこはctypeで判定だね
- 39 :
- >>37
とおもってアセンブリ吐かせてみたら、すごかった。
48引いた上で、符号なしで10未満か判定してるので、
余分な条件分岐してなかった。
- 40 :
- >>37
&& では分岐しなかった。
'0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。
addl $-48, %eax
cmpl $10, %eax
setb %al
賢いな!
直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。
- 41 :
- 俺の知識も時代遅れになったな。シンプル伊豆ベスト。
- 42 :
- もっと >>40 を高速化できないかと思って考えてみたが、
'0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。
ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜
- 43 :
- >>42
まるで昔は速かったかのようだ
- 44 :
- >>42-43
Z80 ですら足し算と XOR は 1 クロックだったわ。 スマソ
- 45 :
- ん?
8086はビット演算の方が速いぞ
- 46 :
- >>21
> 仕様として「両方で停止は問題ない」よな?
相談者でないとわからん
途中に'\0'があるケースについては書いてないから
> そもそも相談者の仕様がおかしい
それはお前が決める話じゃない
- 47 :
- >>22
> ショートサーキット前提の記述をよしとするかどうかはわからん
if(p != 0 && *p != '\0')
みたいなのは普通に書かない?
- 48 :
- >>47
俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない
- 49 :
- >>46
わからないならだまってれば
正確な要求仕様がわからない事くらい誰でもわかる
両方でとまる関数は片方で止まる関数の機能を含むので
問題になる場面は普通は考えられない
質問に書いてない、文字列の途中にNULL文字とか
いうアホな事を心配しない限り
- 50 :
- 全角数字の方がまだ可能性がある
- 51 :
- >>49
こういう思い込みの激しい奴が要らんバグを作り込むんだよな...
- 52 :
- isdigit関連で性能測ってみた。
環境: Core i7-2600 / gcc 6.4 (-O2)
rund() & 0xff の値で条件分岐して、真ならさらに rand() を呼ぶ、を10億回ループ。
条件式はASCII前提。
数字: 条件式 < int配列ルックアップ < isdigit
英字: 条件式 <= int配列ルックアップ < isalpha
数字英字: int配列ルックアップ < 条件式 < isalnum
ロケールの影響か、isalphaなどはisdigitより遅い。
char配列ルックアップはint配列より遅い。
奇妙なことに、配列ルックアップでも、数字だけより、英字も入ってくると遅くなる。なぜだ。
- 53 :
- あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。
- 54 :
- 最速なら前スレの>>995や>>997
>>997は演算の依存性が高いので
>>995の方が少し速いかな?
まあコンパイラや環境依存でしょう
x64前提なら、
64bit一気に持ってきて偶数奇数桁に分けて、
LEAで5倍してシフトして足すとか
AVXで乗算してから水平演算とか
色々と考えられるけど
まあ一応このスレのC言語の範囲で
- 55 :
- このスレの結論はこれか。
10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328;
これより速くする方法あるのか
- 56 :
- 何時の間に判定せずにすむようになったんだ
- 57 :
- 前スレの>>997が質問者だから
フォーマットは固定と思われる
- 58 :
- さすがに '0' * 111111 をコンパイル時に計算しないコンパイラは無いと思うので
このままで良い気はする
当然こちらの方が意味が分かりやすい
- 59 :
- ( ) を色々とかえて時間を測ってみたけどほとんど同じ
やっぱりLEAを多用してる
VS2017の64bit Releaseビルドの場合
- 60 :
- VPMOVZXBD xmm0, a
VPMADFWD xmm0, xmm0, [掛け算テーブル]
VPHADDD xmm0, xmm0, xmm0
VPHADDD xmm0, xmm0, xmm0
- 61 :
- AVXが使えるならこれ
- 62 :
- 微妙に間違った
メモリが連続してれば複数同時に出来る
連続してなくても複数同時にやった方が速い
- 63 :
- >>29でメモリアクセスに言及されてる話の流れの中で
10億回ループがいちいちキャッシュクリアされてるのかが気になる
- 64 :
- 普通はキャッシュに入ったままだが、
処理次第で可能性が無いことはない
他のキャッシュを汚染する可能性もある
HTTなどでは特に
他に良い方法が有るのにわざわざ面倒なテーブルにする意味がわからない
- 65 :
- std::vector<std::string>からchar*const[]を作成するいい方法ってないですか。
newするしかないですかね。
- 66 :
- >>65
vector<char*> に各要素 s の &s[0] を入れて済むなら new は要らなさそう。
- 67 :
- >>66
まあどうみても内部でnewしてるんだろうけど
- 68 :
- クラスの概念がわかりません
- 69 :
- 構造体みたいなもの
- 70 :
- >>68
クラスは構造体に関数を追加したようなもの。
クラス内部の関数はメソッドと呼ばれる。
メソッドからは、クラスのデータとメソッドを参照できる。
データとメソッドのそれぞれの項目をクラスのメンバーと呼ぶ。
クラスの実体はインスタンスと呼ばれる。メソッドからは、thisポインターにより、クラスのインスタンスを参照できる。
メンバーは、public:、protected:、private:によってアクセスを制御できる。アクセスできないメンバーを参照するとコンパイルエラーになる。
- 71 :
- class A
{
int a;
};
と書くとA::aは、privateになる。構造体と同じアクセスにするには
class A
{
public: int a;
};
と書かないといけない。このようにクラスのデフォルトのアクセスはprivateになり、構造体はpublicになるという違いもある。
- 72 :
- クラスはコンストラクタと呼ばれる特殊なメソッドがあり、インスタンスの構築に使われる。
また、インスタンスが破棄されるときに、デストラクタという特殊なメソッドが呼ばれる。
- 73 :
- コンストラクタの例。
class A
{
public:
int m_a;
A(int a) {m_a = a + 1; }
};
int main() {
A a(2);
printf("%d\n", a.m_a);
}
- 74 :
- 別のコンストラクタの例。
class A {
public: int m_a;
A(int a, int b) : m_a(a + b) { }
};
int main() {
A a(2, 3);
printf("%d\n", a.m_a);
}
- 75 :
- そんなの説明してやらなくてもネット上に無数の解説があるだろ。
ちゃんとした説明を読んで理解できないなら掲示板で短い説明読んだってわかりゃしねーよ。
- 76 :
- >>75
情報が多過ぎて迷子になってるんじゃないか。マニュアル読め、規格票読め、で終わればいいのだが。
- 77 :
- そう思うならなぜ現在地を聞く前に世界地図を渡すのか
- 78 :
- >クラスは構造体に関数を追加したようなもの
こういうアホってどこにでもいるんですね
- 79 :
- >>78
その理解で8割がたOKだと思うのだが、何が問題なの?
- 80 :
- >>76
チュートリアルだってたくさんあるじゃん。
- 81 :
- >>79
クラスがわからんやつにこんな説明しても通じないだろ
- 82 :
- 山田さんってどんな人?と聞かれて
原子の集まりだよ。って答えるようなもの
形式的にウソじゃあないんだが
そこじゃないだろっていう
- 83 :
- 純粋にC++のクラスそれ自体の概念というなら
C言語(ベース)でのオブジェクト指向プログラミングをサポートするために言語機能で用意された部品
オブジェクト指向プログラミングにおけるオブジェクト、オブジェクトの状態、
メッセージの送受信、メッセージを受けたときの振る舞いといった概念を具体化した仕組みの一例
- 84 :
- 記憶クラスについての質問の可能性
- 85 :
- 実のところはOOPを知らないからクラスをどう使えばいいのかわからない/
他人の真似でなんとなく使ってるけどなぜクラスを使うのかがわからないといったあたりの話だろ
- 86 :
- 下手にクラスを説明するやつが多いせいで、コーディング経験なくても理解できる概念的なものだと思われちゃう
クラスは実用あってこそ
- 87 :
- アニマルクラスがわんにゃー鳴くのがオブジェクト指向です
- 88 :
- メンバ関数を呼び出す際の
「オブジェクトにメッセージを送る」って言い回しも
C++だと分かりにくいね。
この表現がしっくりくるプログラミング言語というか
環境もあるのだろうけど。
- 89 :
- >>88
そういうのをベタで実現しているOO言語はないかな…
- 90 :
- smalltalkは?
- 91 :
- >>90
あれも結局、関数(メソッド)の動的なコールをそう呼ばせてるだけ
同じSmalltalkでもSmalltalk-72までさかのぼるとメッセージ送信と呼べなくもない仕組みにはなっているけど
それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと
まあ、ともあれC++の「オブジェクト指向」を説明するときには「メッセージを送る」とかはすっかり忘れていいよ
そもそもC++の設計者の提唱するオブジェクト指向は「抽象データ型(端的にはユーザー定義の型)」を
Simulaという言語から拝借した「クラス」という言語機能で実現することが主軸のアイデアなので
http://www.stroustrup.com/whatis.pdf
- 92 :
- 言語の意味論とそれを実現するメカニズムは別物だから、
仕組みがどうなっているかから考察するのは無粋だと思うけどなぁ。
まあ C++ は低水準レイヤでの仕組みを意識せざるを得ない、
意味論とメカニズムが不可分なデザインではあるから概念としてのメッセージ指向よりも
メカニズムに意識が引きずられてしまうというのは確かにあるかもしれない。
- 93 :
- メソッド呼び出しってメッセージパッシング感すげー出てない?
- 94 :
- >それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと
違いがわからないw
- 95 :
- >>93
メッセージパッシング言うなら、何かが静的に決定してる時点で興醒めだよ
http://wiki.c2.com/?AlanKayOnMessaging
- 96 :
- >>95
C++のポリモーフィックなメソッドは動的ディスパッチだろう
- 97 :
- >>91
>抽象データ型
これがすべてなのに、どうしてメッセージ駆動の話が今でももちきりなのだろうか?
- 98 :
- >>96
C++に「動的なものは何もない」という主張ではなく
「静的に決まる何かが一つでもある」時点でそれをメッセージングに例えるのは興醒めという意味
少なくともケイは彼のOOPにおけるメッセージングを「遅延結合の徹底」の目的で提案している
http://d.hatena.ne.jp/katzchang/touch/20080807/p2
「私が考えるOOPはメッセージング、状態処理のローカルでの保有・保護・隠蔽、
そして全ての物に対する強力な遅延束縛、これだけだ。
これはSmalltalkとLISPだけが実現できている。他のシステムでも可能かもしれないが、私は知らない。」
つまるところ、これはすなわち、SmalltalkやLispみたいな変態言語でもなければ、
(あるいはアクター機構のように、並列化を意識して本当にメッセージを送るのでもなければ)
無理して「メッセージパッシング」なんてたとえる必要は無いんやで、という話でしかない
- 99 :
- >>97
まったくもってその通り
- 100 :
- Cのキャストについて教えてください
int a,b;
long c;
の条件下で、a+b 、a*100+b*100(a*100、b*100のどちらもlong型になる)
がそれぞれlong型の解になるような場合のキャストとしては
1 c=(long)a+b;
2 c=(long)a+(long)b;
3 c=(long)a*100+b*100
4 c=(long)a*100+(long)b*100
とそれぞれ、どの記載が正しいのでしょうか?
100〜のスレッドの続きを読む
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
Excel VBA 質問スレ Part61
C++相談室 part146
Visual Studio 2015 Part8
Android SDK以外でのアプリ作成を全面禁止へ
【最強CUI】PowerShell -Part 2
【コメント】doxygen【コンソメ】
ネットワークプログラミング雑談
[RPA]PC自動化技術総合スレ[効率化] Part.6
おまいらのプログラムの勉強の仕方を教えろください
--------------------
WWEリアルタイムスレ497
【KFC】ケンタッキーフライドチキン 164【Ponta】
【駅メモ!】ステーションメモリーズ!309リンク
アイドルマスターSideM 愚痴スレ115
[BCD]ビットコインダイヤモンド ♦1
【#C96】コミケ3日目で熱中症が続出「心肺停止でAED要請」の情報 救急車が集結で騒然
【天田廃天皇】中核派全学連51【斉藤ニセ代議士】
【転倒】高野龍神スカイライン Part10【死亡】
【Bro】PENNYWISE 2曲目【Hymn】
神になりたければ漫画家になるべし
昔小学生が・・・
色違いポケモンを語るスレ 81キラーン
【ぞうさん】白鳥沙南でございます! 2頭目【大好き】
【グルコス】リンカちゃん専用【ACナビゲート】
3Dロボット対戦ゲーム Silver Knights -MISSION22
◆進.撃の巨.人ネタバ.レスレpa.rt1904
【マタ〜リ】バイク屋さんの集い【日記】Part28
発達障害Twitter監視スレ 13
一般的な公認会計士のやりがいって何?
【野球】<ダルビッシュ>敗戦後の“罰走命令”に苦言!巨人・阿部二軍監督に「無駄なランニング」 一部の批判に「パワハラ」と反論も★2
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼