X



C言語なら俺に聞け 144
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 838a-3nWA)
垢版 |
2017/12/23(土) 19:33:43.89ID:dghfoRy20
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


http://mevius.5ch.net/test/read.cgi/tech/1509107288/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0002デフォルトの名無しさん (ワッチョイ 639f-buzn)
垢版 |
2017/12/23(土) 22:25:14.39ID:BUr3nOOf0
#include <stdio.h>

int main(int argc, char *argv[])
{
unsigned long long n[] = { 0x0820084008411c3e, 0x087f180408080810 };
int i;

for (i = 127; i >= 0; i--) {
putchar(n[i / 64] & (1ULL << (i % 64)) ? '*' : ' ');
if (! (i & 0x0f)) putchar('\n');
}

return 0;
}

https://paiza.io/projects/zyQ0Osccs4xaziOrVUF_cA
0003 ◆QZaw55cn4c (ワッチョイ 7f60-IIk+)
垢版 |
2017/12/24(日) 01:31:12.56ID:WikwUycQ0
乱数生成法について教えてください。
普通の乱数生成法は、ある乱数 x を発生させたとき、次の乱数を特定の関数 f で生成させていますが、
(すなわち、次の乱数は f(x) となる)、これは n + 1 番目の乱数を作るには、n 番目の乱数を知らなければならないことになります。

そうではなくて、n + 1 番目の乱数を f(n + 1) で計算できるもの( n + 1 番目の乱数を求めるのに n 番目の乱数を知らなくてもいいもの)はないでしょうか?
こういう乱数はテクニカルタームとしてはどのように呼ばれるのでしょうか?
0004デフォルトの名無しさん (ワッチョイ ffe3-bqMz)
垢版 |
2017/12/24(日) 02:41:31.08ID:rYvbui2B0
>>3
擬似乱数のことでいいんだよね?
今普通って言ったらメルセンヌツイスターだと思うんだけど、
「次の乱数は f(x)」 とか「f(n + 1) で計算」とかしないよ
数千bitほどの内部状態から数列を生み出すんだよ
じゃないと周期とか質が悪い
0007デフォルトの名無しさん (ワッチョイ 13f2-7LW1)
垢版 |
2017/12/24(日) 09:52:22.24ID:RXtl733r0
>(すなわち、次の乱数は f(x) となる)、これは n + 1 番目の乱数を作るには、n 番目の乱数を知らなければならないことになります。

それランダムにならんように思うが。
0011デフォルトの名無しさん (ワッチョイ 639f-buzn)
垢版 |
2017/12/24(日) 13:57:11.07ID:7ASFTRv40
>>3
普通の計算機である以上何かを元にして計算するしかないのでは?
f(n+1) を計算する時に f(n) を使わずに n を元にして計算する?
だったら乱数計算する前に必ずシードをセットするようにするしかないのではないか?
例えば rand() の直前に必ず srand() で種をセットするということね。
(実際これやると乱数にならないような気がするが)
0014デフォルトの名無しさん (ワッチョイ 2393-YNiV)
垢版 |
2017/12/24(日) 17:37:51.83ID:DT7VHm750
>>3 の質問の真意は
「(擬似)乱数列のn+1番目の値を出すためにn+1回のループを回す必要がない
アルゴリズムを紹介してくれ」だと思うよ。

n+1番目の乱数値を作るためにn番目までの乱数値を知る(次の値の計算に使う)
必要がある、という意味ではないでしょ。
001514 (ワッチョイ 2393-YNiV)
垢版 |
2017/12/24(日) 17:43:11.44ID:DT7VHm750
おっと、「〜だと思うよ」の部分は「〜じゃないかな?」に訂正させてくれ。
読み直したら、そこまで断定する自信がなくなった。

質問者 >>3 による見解を求む。
…と言っても、いずれにせよ俺には答えられない問題だけどネ。
0016デフォルトの名無しさん (ワッチョイ 03c6-MZER)
垢版 |
2017/12/24(日) 17:57:57.47ID:KMicyDdr0
Gtk+ 3.0のGUIツールの質問はこちらでも宜しいでしょうか。
glade3.18、C言語を使用しています。

起動したgladeの右側のプロパティ画面で、

window1 GtkWindow
□|__box1 GtkBox
□□|__scrolledwindow1 GtkScrolledWindow
□□□|__viewport1 GtkViewport
□□□|____image2 GtkImage
□□□|__button1 GtkButton

のように配置すると、画面をマウスで引き伸ばしても、実行時window1のみが引き伸ばされてしまいます。
やろうとしている事は、ファイルの保存ダイアログの様に、マウスで引き伸ばしてもbutton1がwindow1と一緒に移動し、image2が引き伸ばしされている様に見せたいのですが上手くいきません。
教えてください。よろしくお願いします。
0018 ◆QZaw55cn4c (ワッチョイ 7f60-IIk+)
垢版 |
2017/12/24(日) 18:47:45.17ID:WikwUycQ0
>>14
はい、そのとおりです。
ハッシュ関数(たとえばSHA-2) に対して入力0, 1, 2, を与えて得られた出力を乱数として使用することに妥当性はあるか?

もっと踏み込むと、実はストリーム暗号として使用したく考えています。
ハッシュ関数を h(x)、
暗号鍵を k
平文を M
暗号文をC
として、
C = Mi xor f(n + k), n = 0, 1, 2, ....
とした場合に、この暗号に対してどのような解読方法が考えられるか?
0020片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd1f-1u/G)
垢版 |
2017/12/24(日) 19:24:00.18ID:gjaYlpPed
>>16
「引き延ばし」というのは専門用語じゃないよね。位置とサイズをちゃんと指定くれないと、人間にもわからないよ。
イベント駆動については勉強した? サイズを自動調整するには、イベント駆動で「サイズ変更」のイベントを捕まえるか、自動レイアウトにするしかないよ。
0022デフォルトの名無しさん (ワッチョイ 2393-YNiV)
垢版 |
2017/12/24(日) 19:46:51.17ID:DT7VHm750
>>3 >>18
ショボい線形合同法 f(n) = (f(n-1) * a + b) mod c なら、
f(n) = (f(0) * (a ** n) + b*n) mod c
という式が使える理屈だけど、現実には桁あふれとか
a ** n (べき乗)の計算でループするとか、実用できないだろうなぁ。

ところで詮索するわけじゃないけど
◆QZaw55cn4c って普段は教える側の人じゃなかったっけ?
0026 ◆QZaw55cn4c (ワッチョイ 7f60-IIk+)
垢版 |
2017/12/24(日) 20:23:36.25ID:WikwUycQ0
>>22
その変形は、ちょっと楽観しすぎていると思う
f(1) = af(x) + b
f(2) = a(ax + b) + b = a^2 x + ab + b
f(3) = a(a(ax + b) + b) + b = a^3 x + a^2 b + ab + b
f(4) = a^4x + b(a^3 + a^2 + a + 1)
f(5) = a^5x + b(a^4 + a^3 + a^2 + a + 1)
なんかもっときれいになりそうだけれども…

>普段は
え?それはそうみえるだけじゃないでしょうか?
002722 (ワッチョイ 2393-YNiV)
垢版 |
2017/12/25(月) 06:33:17.53ID:kqgEt8jU0
>>26
本当だ。変形間違ってるわ。
ステップ毎に項数が増える漸化式の展開で必ず同じミスするなぁ。
0030デフォルトの名無しさん (ブーイモ MM67-nFIV)
垢版 |
2017/12/25(月) 09:54:22.59ID:8JScrlTJM
>>28
精度保証がそれなりで良ければ分母の逆数をニュートン法で求めて乗算。
整数の商が正確に必要で除数が一定なら逆数と補正をあらかじめ用意できる。
定数の除算をアセンブリで出してみると驚くよ。
0031デフォルトの名無しさん (ワッチョイ cf3f-tRgI)
垢版 |
2017/12/25(月) 11:53:59.36ID:9U/P4ALl0
整数を2の自然数乗で割るのは右シフト演算に置き換えられる
0034デフォルトの名無しさん (アウアウカー Sac7-vdkM)
垢版 |
2017/12/25(月) 12:46:35.23ID:Lg9qxqUaa
>>33
いや、そうだけど、ゼロの代入しても最適化されてマシン語ではそれになってることあると思うよ。CPUにもよるだろうけどね。
レジスタをゼロクリアする専用の命令があればそちらが使われるだろうし、多分その方が何も計算しない分だけ速い。
0037デフォルトの名無しさん (アウアウカー Sac7-vdkM)
垢版 |
2017/12/25(月) 13:37:06.87ID:Lg9qxqUaa
>>35
今時のC言語だと意味がないばかりかコンパイラの最適化の邪魔になりかねないので変な小技は忘れた方が良いと思うよ。registerとかと同じ。
0040デフォルトの名無しさん (ワッチョイ 03c6-MZER)
垢版 |
2017/12/25(月) 18:27:45.55ID:+TGgWy910
G_MODULE_EXPORT void
cb_activate(
GtkEntry *entry1,
GtkLabel *label1)
{
gchar *buf;
buf = g_strdup_printf("文字 %s",gtk_entry_get_text(entry1));
gtk_label_set_text(label1,buf);
g_free(buf);
}

上のプログラムを参考に、GtkTextViewから文字数を得て、label1に書き込むプログラムにしようと、マニュアルを調べていたのですが、上手くいきませんでした。
insert_at_cursorのイベントから動くようにするには、どうしたらいいのでしょうか。
初歩的な質問ですみません。よろしくお願いします。
0042デフォルトの名無しさん (ドコグロ MMdf-6aYH)
垢版 |
2017/12/25(月) 19:35:55.33ID:hykLc5AjM
>>34
> レジスタをゼロクリアする専用の命令があればそちらが使われるだろうし、多分その方が何も計算しない分だけ速い。
レジスタじゃなくてメモリーだけど68000のCLR命令はなぜか0を書く前に謎の読み出しを行うので遅かったりした
0043デフォルトの名無しさん (ワッチョイ 03c6-MZER)
垢版 |
2017/12/25(月) 19:44:53.59ID:+TGgWy910
>>41
Cソース
https://ideone.com/324qDo
UIソース
https://ideone.com/o3pHFq

コメントにした部分は、動くことは動くけれど、ラベルが反応しない。
今の非コメント部分は、main関数は動きますが、それ以外はエラーが出ます。
動かないのを知っていて、プログラムが中途半端に書かれています。
なので責めないでください。
迷走している様子が伝わってくると思います。
0045デフォルトの名無しさん (ワッチョイ 93fb-tRgI)
垢版 |
2017/12/26(火) 09:52:36.67ID:yJ/B7pz80
V850?
0052デフォルトの名無しさん (エーイモ SE8a-/kWs)
垢版 |
2017/12/30(土) 17:36:17.08ID:QxhO3HdGE
先輩方また教えてください
int 
hoge(int a,
_____int b)
{
____return a + b;
}

_は半角スペースだと思ってください。
こんな感じでintとhogeを別の行に書いたり
int aとint bも別の行に書いたり
こういう書き方をよく見るんですがどうしてこう書くんでしょうか?
C言語ではこういうルールがあるのでしょうか?
0053片山博文MZ ◆T6xkBnTXz7B0 (スププ Sdea-hOPe)
垢版 |
2017/12/30(土) 17:46:47.07ID:jArhle36d
それはコーディングスタイルとか、コーディングルールとかいうけど、会社や組織によって違う。
制御構造の構造を明確にするために、「インデント」したり文字の位置を揃えたりする。
まあ、初心者ならANSIスタイル使っておけば無難かな。
0056デフォルトの名無しさん (ワッチョイ 0b9f-RYVm)
垢版 |
2017/12/30(土) 17:52:13.74ID:Xyp0qNcm0
>>52
> こういう書き方をよく見る
嘘つくな。
というか、本当にそう思うのなら見るべきソースを間違っている。

いずれにしても、初心者がその手のコーディングスタイルについて考えるのは完全に時間の無駄だから、
どれでもいいから有名なコーディングルールを読んで、それを使うようにしろ。
お前が今読んでいるそのコードに対して追加/修正が求められているのなら、
グダグダ言わずにそのスタイルで書け。

繰り返すが、初心者がコーディングスタイルにこだわるのは全くの無駄だから、止めろ。
君が入門書を読んで勉強しているのなら、その本のスタイル通りに書け。
初めはそれでいい。
0058片山博文MZ ◆T6xkBnTXz7B0 (スププ Sdea-hOPe)
垢版 |
2017/12/30(土) 17:53:57.97ID:jArhle36d
C言語では文字列以外の空白はほとんど無視されるから、処理を一行に長〜く書くことが
できるけど、それでは人間には分かりにくいし、読みづらい。
0060デフォルトの名無しさん (スッップ Sdea-7LGL)
垢版 |
2017/12/30(土) 18:16:52.49ID:l+pzRLn8d
>>52
たまーに引数が多くて読みずらい関数とかをメンテするハメになったときに、コメントつけるためにやる程度。

例のような短いのでそんな事になってたら、元担当見つけて小一時間問い詰めろ。
0062デフォルトの名無しさん (アウアウカー Sacb-9mWg)
垢版 |
2017/12/30(土) 19:19:44.15ID:bLWDJrONa
>>52
人間が見る時の見易さのためだけにそう書いているのがある。言語としての決まりはない。
C言語で改行に意味があるのはダブルクォーテーションで括った文字列内とプリプロセッサが処理する#で始まる行ぐらいだ。
0063デフォルトの名無しさん (ワッチョイ ff89-OTe3)
垢版 |
2018/01/03(水) 19:26:04.56ID:AMJZwzU90
         ,,-―--、
        |:::::::::::::;;;ノ  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        |::::::::::( 」 <見るべきソースを間違っている。
        ノノノ ヽ_l   \______________
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬    |
0070デフォルトの名無しさん (ワッチョイ 3b89-2A+B)
垢版 |
2018/01/05(金) 11:52:20.32ID:e4FSU8sj0
char *p="aiueo"; //これが通るのは必要悪
const char *p="aiueo"; //本来こうであるべき
*(p+3)='\0'; //constついてりゃ並みのアフォなら気付けるはず
0073デフォルトの名無しさん (ワッチョイ 1fd6-2A+B)
垢版 |
2018/01/05(金) 17:54:32.46ID:SpC7EOR80
>>71
ブーメランおいしい?www
0074デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/05(金) 18:07:43.83ID:T2NhU/kFa
そういや前にどこにconst入れるとどこが定数扱いになるか色々やって調べたことあるなあ。
0076デフォルトの名無しさん (アウアウカー Sa4f-dSb4)
垢版 |
2018/01/05(金) 19:10:23.97ID:T2NhU/kFa
まあしかしコンパイラには char *p = "..."; の宣言で *p に書き込みアクセスするような記述を見つけたら警告ぐらい出して欲しいところだな。
実際に(少なくともデフォルトでは)動かないコード吐くわけだし。
0080デフォルトの名無しさん (ワッチョイ 1fd6-5YeV)
垢版 |
2018/01/06(土) 08:11:50.88ID:9HgF2CnS0
>>79
ISO/IEC 9899:2011 A.2.2に書いてあるんだが、おまえさんには見えないのか?

7.3) type-qualifier:
const
restrict
volatile
_Atomic

7.6) pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer

7.6) type-qualifier-list:
type-qualifier
type-qualifier-list type-qualifier
0082デフォルトの名無しさん (アウアウウー Sa8f-hL1C)
垢版 |
2018/01/06(土) 16:50:26.91ID:Dhtt7sCWa
あ、こういう問題作れるね。

・ それぞれの違いについて説明せよ。

const char **p
char const **p
char * const *p
char ** const p
char * const *p
char * const * const p
char const * const * const p
char const ** const p
0083デフォルトの名無しさん (ワッチョイ 4b9f-Ogju)
垢版 |
2018/01/06(土) 18:52:18.14ID:0jo5cy8h0
>>82
悪問だけどな。結局の所、
・constは複数回指定できる
・constの右側の固まり全体が定数と見なされる
だけだし。逆に言えば、それらを別物/良問として認識するような奴は上達しないのだと思う。
(記憶の前処理としてabstractionする癖がない)

だからこれまでそんな馬鹿げた問題を出す奴はC界隈には居なかったし、今後も多分そうだ。
CodeIQの広告でその手の問題をよく見るが、あれじゃ「馬鹿です」と自己紹介して居るも同然だし。
まあ所詮リクルート(コード書いてない連中)だからそんなもんだが。
とはいえ、何らかのテストで簡単にそいつの実力を把握できる事が出来るのなら、役立つのも確かだが。

そしてそれ以前にconstが大して役に立たないからなあ。
0089デフォルトの名無しさん (ワッチョイ 9fb3-TPPA)
垢版 |
2018/01/06(土) 20:49:46.88ID:A2dnXNCo0
>>82
1: const char **p
2: char const **p
3: char * const *p
4: char ** const p
5: char * const *p
6: char * const * const p
7: char const * const * const p
8: char const ** const p

1と2、3と5は同じ
char **pとchar const * const *pのパターンがない

こういう奴はプログラマーに向いてない
0090デフォルトの名無しさん (ワッチョイ 0b9f-hL1C)
垢版 |
2018/01/06(土) 21:08:00.94ID:BwjYxRoc0
キリッ
0091デフォルトの名無しさん (ワッチョイ 4b9f-Ogju)
垢版 |
2018/01/06(土) 22:07:37.32ID:0jo5cy8h0
>>87
例外ではない。
char部分はCでは常にcons扱い(=int等に変更できない)だから
constが修飾する対象に仕様上なり得ないだけ。
だからその2つは結果的に同じ意味になる。

というかCは文法例外はほぼ無いはず。
0093デフォルトの名無しさん
垢版 |
2018/01/07(日) 06:32:55.29
自分流に解釈して覚えるのはいいけど、それが世界の真実かのように講釈するのは恥ずかしいから控えた方がいいよ
まあこのスレではいいけど、リアルの人間関係では陰で馬鹿にされるだけだよ
0094デフォルトの名無しさん (ワッチョイ 0bbb-2A+B)
垢版 |
2018/01/07(日) 19:53:30.95ID:8XJu4dlo0
>>91
charがintに変更できないのがconstだからだと?
おまえさん char c; *(int*)&c = 1; が許されないことと勘違いしているのか?
0095デフォルトの名無しさん (ワッチョイ 0bbb-2A+B)
垢版 |
2018/01/07(日) 19:54:10.54ID:8XJu4dlo0
いかん、間違えた
おまえさん char c; (int)c = 1; が許されないことと勘違いしているのか?
0096デフォルトの名無しさん
垢版 |
2018/01/07(日) 20:44:34.88
ほらね、共通語をしゃべらないから話が発散する
0098デフォルトの名無しさん (ワッチョイ 1f5b-5YeV)
垢版 |
2018/01/08(月) 15:27:35.06ID:u4QX+fVn0
>>97
当たらずといえども遠からず
自分で言ってて無理を感じるなら
それが正解だ
0099デフォルトの名無しさん
垢版 |
2018/01/08(月) 15:31:40.17
>>97
んなこたあない
>>94の書いてるコードと同義で、cの先頭アドレスからint分の領域に代入するだけで、cを拡張したり戻したりしてるわけではない
gcc 3.xやVC++2008では通ったが今のgccではコンパイルエラーになる記法
■ このスレッドは過去ログ倉庫に格納されています

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