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
0708デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 14:35:53.94ID:9kHA/gVX0
>>706
だれがビット単位で操作するしかないと言ったの?
0709デフォルトの名無しさん (ワイモマー MMbf-aajP)
垢版 |
2018/02/04(日) 14:40:21.25ID:uz8VZN5uM
>>707

1、はい。全ビットは反転してはまずいです。
2、マイコンの入力ポートです。

>>708

すみません。
そんなつもりではありません。
ということは、自分の望む計算式があるのでしょうか?
0710デフォルトの名無しさん (ワッチョイ d78a-IOOI)
垢版 |
2018/02/04(日) 15:00:01.65ID:mpGHvQVh0
>>709
イメージとしては、二つ目の変数の変化をEXORで抽出しながら変更用マスクを作成
そのマスクで一つ目の変数と再度EXOR演算、これで二つ目の変更ビット個所だけ一つ目のビットが反転する

ざっくりとした流れはこんな感じ
一つ目の値(状態)a、二つ目の値(入力)b、入力比較用変数c、変更ビットマスクd
c = input(b);
while(1) {
d = c ^ input(b);
c = b;
a ^= d;
}
0711デフォルトの名無しさん (ワッチョイ 9793-d/ts)
垢版 |
2018/02/04(日) 15:18:24.98ID:tHspdphL0
ちょっと整頓させてくれ。

>>702 の場合
二つ目の unsigned char
01001011 ... 最初の値
01001010 ... 新しい値
00000001 ... 変化したビット

一つ目の unsigned char
11010110 ... 最初の値
11010111 ... 二つ目の unsigned char の変化にともない新たに取るべき値
00000001 ... 変化したビット (二つ目の unsigined char の変化したビットと等しい)

>>703 の場合
二つ目が0b010000111に変化 ... ビット数が増えとるやん!


>>710 の言う通り「二つ目」のビット変化をexor(^演算子)で抽出した結果を
「一つ目」のビットに作用させれば良さそうだけど、
「二つ目」のビットが1から0に変化したときには「一つ目」にはどう反映させたいの?
0712デフォルトの名無しさん (ワッチョイ ffe4-TMol)
垢版 |
2018/02/04(日) 15:33:13.79ID:F4VHcN9w0
>>710

ありがとうございます。
何となくですが少しイメージが浮かんできました。

>>711

すみません。

二つ目が 0b01000011 に変化の間違いです。
0713デフォルトの名無しさん (ワッチョイ 179f-wbgk)
垢版 |
2018/02/04(日) 15:44:44.53ID:fXO59JwO0
まずはやりたいことを普通の日本語で書け。
0716デフォルトの名無しさん (ワッチョイ 97b3-C7gl)
垢版 |
2018/02/04(日) 17:03:35.16ID:NeQWIMjc0
2つめ着目ビットが 0 -> 1 となったとき 1つめ対象ビットを 反転/0/1 にする
2つめ着目ビットが 1 -> 0 となったとき 1つめ対象ビットを 反転/0/1 にする

0->1 でも 1->0 でも 1つめ対象ビットを反転すればいいのけ?

new_1st = old_1st ^ (old_2nd ^ new_2nd);
0717デフォルトの名無しさん (ワッチョイ ffe4-TMol)
垢版 |
2018/02/04(日) 18:21:03.27ID:F4VHcN9w0
>>716

正にその通りです!
その式で思ってる通りに制御できました!
ありがとうございましたm(_ _)m
0718デフォルトの名無しさん (アークセー Sxcb-/IWG)
垢版 |
2018/02/04(日) 22:32:58.82ID:ZlHMYtZlx
全くの初心者です。
「2の3乗を求める」という計算プログラムを勉強しています。
最終的には3^1024を求めたいのですが。
ネットで見ていると30乗ぐらいまではプログラムがあるのですが
1024乗ぐらいになると難易度的に難しくなるのでしょうか?
0719デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/04(日) 22:50:53.35ID:9kHA/gVX0
>>718
3^1024=(3^2)^512

3^2≒10ってことで、だいぶ大雑把だけど

3^1024≒10^512

10進数で500桁以上の大きな数になりますね。
どの型の変数を使う?
0721デフォルトの名無しさん (ワッチョイ 9fb3-mP5N)
垢版 |
2018/02/04(日) 23:07:38.36ID:88eIJAAv0
>>718
やることは3に3を1,023回掛けるだけだから難しくはない
ただ>>719の言うようにかなりでかい値になる(ちょっとpythonで計算したら489桁だった)から普通のlong intとかではオーバーフローする
なので
多倍長整数 C言語
とかでググるがよろし
0725デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 00:05:41.82ID:atUOEIz80
BCD(二進化十進)ライブラリを拾ってくるのが汚れた大人だけど、
若者は勉強のためにBCDライブラリを作ってみては?
0726デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 00:06:32.23ID:atUOEIz80
おっと、更新せずに書き込んだらこんなことに(笑)
0728愛恥人
垢版 |
2018/02/05(月) 01:36:30.57
10進じゃないと0.1が無限に数字が続くらしい
よく分からんけど
0729 ◆QZaw55cn4c (ワッチョイ 9f60-soeb)
垢版 |
2018/02/05(月) 01:40:21.91ID:Qlm7SRQb0
>>728
10進だと 1/3 が無限に数字が続きますよね

それはさておき、多桁長+浮動小数点が落としどころではないかと
すると、BCD の意義がよくわからないのです
0734デフォルトの名無しさん (アウアウカー Sa2b-gGCH)
垢版 |
2018/02/05(月) 12:29:13.25ID:cbvE2oU2a
3進数なら歯切れの良い数なんだけどな・・・
0736デフォルトの名無しさん (ワッチョイ 179d-jn1r)
垢版 |
2018/02/05(月) 20:03:34.68ID:GlpP/XMd0
>すると、BCD の意義がよくわからないのです

科学技術計算は浮動小数点でいいが、リアルなお金の計算とかでは10進で計算するのがディフォールト
2進と10進では結果が大幅にちやうから。
ま俺の財産なら誤差0.1円くらいかもしれんが、、
0737デフォルトの名無しさん (スップ Sd3f-qmJt)
垢版 |
2018/02/05(月) 21:30:58.83ID:jWi5SYZhd
いま必死に考えてる
昔のCPUは絶対に持っていた機能だ
レジスタが8ビットだとすると、256以上のデータが表現できなくなるけど、そんなことはない
だから何か仕組みがあるはず
プログラマが勝手にこのビットが立ったら2の15乗だとか自由に決めて、8ビビットの重み付けをしてるんだとおもう
あとは計算と結果の表現次第だ
指数法則を使えばできそうだけど、これはなかなか面白い課題だね
0738愛恥人
垢版 |
2018/02/05(月) 21:36:06.47
ググれよw
0740デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 22:00:56.57ID:atUOEIz80
ゼッパチ(笑)
0747デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/05(月) 23:40:30.69ID:atUOEIz80
Reno版のカーネルのソース読んだとき、
VAXのHDDのドライバが分かりやすくてビビった。
メモリマップドI/Oだた。
0749デフォルトの名無しさん (アークセー Sxcb-/IWG)
垢版 |
2018/02/06(火) 00:31:17.27ID:WaNrl6wPx
とりあえず本買ってきて読んでいます。3月末ぐらいにはなんとか結果を出したい・・・
0750デフォルトの名無しさん (アークセー Sxcb-/IWG)
垢版 |
2018/02/06(火) 00:37:33.65ID:WaNrl6wPx
とりあえずプログラム初心者だが将来有望な頭脳をもった奴を
2人ほど用意した・・・。
0751デフォルトの名無しさん (ワッチョイ 179f-gGCH)
垢版 |
2018/02/06(火) 01:36:11.08ID:FVXSsnAc0
>>742
うーん。最上位ビット使えばできるのでは?
まあしかしアセンブラ使った方が効率はいいだろうな。
CPU違ったら動かんけど。
0752デフォルトの名無しさん (ワッチョイ 179f-gGCH)
垢版 |
2018/02/06(火) 01:43:46.77ID:FVXSsnAc0
>>748
滅多に使わない。
0753デフォルトの名無しさん
垢版 |
2018/02/06(火) 04:19:56.87
>>748
実ソースではvoidポインタしか見たことない
0754デフォルトの名無しさん (エムゾネ FFbf-EZPO)
垢版 |
2018/02/06(火) 13:31:15.57ID:HnlXhHfVF
3進数用にBCD3を定義する
1桁を2進数2bitで表現して
最下位桁の次に2bitのエンドコード11を付与する
例えば
0=00 11
1=01 11
2=10 11
3=01 00 11
4=01 01 11
5=01 10 11
6=10 00 11
7=10 01 11
8=10 10 11
9=01 00 00 11
...
3^1024=01 00 00 ...(00 が1020個(左右に書いたもの含めると1024個))... 00 00 11
0755デフォルトの名無しさん (ワッチョイ 9793-d/ts)
垢版 |
2018/02/06(火) 17:23:11.09ID:f2WbB5Mw0
>>754 議論の本質から逸れた混ぜ返しになるけど、
BCD が 二進化十進数 binary coded decimal の略なら、
3進数の場合は binary coded tricimal で BCT ではないかしら。

3進数が tricimal なのか、ちょいと自信がないけど、
とりあえずネット検索でヒットする言葉みたい。
0759755 (ワッチョイ 9793-d/ts)
垢版 |
2018/02/06(火) 19:06:57.63ID:f2WbB5Mw0
>>756
訂正ありがとう。確かに ternary が辞書に載ってる言葉みたいね。
triple あたりからの類推では到達できない綴りだったわ。
これからは注意して取り締まることにする。
0760デフォルトの名無しさん (ワッチョイ 57b3-iQWu)
垢版 |
2018/02/06(火) 19:11:28.74ID:Yrf3PZ3s0
取り締まり頑張ってね
0766デフォルトの名無しさん
垢版 |
2018/02/07(水) 07:37:48.03
2進数なら無駄なく表せるけど
struct {
bool b1:1;
bool b2:1;
bool b3:1;
bool b4:1;
bool b5:1;
bool b6:1;
bool b7:1;
bool b8:1;
}
3進数だと3バイトずつセットにしないと無駄なく表せないよね
3進数使うメリットあんの?
0769デフォルトの名無しさん (ワッチョイ d72b-Mu/V)
垢版 |
2018/02/07(水) 09:10:28.34ID:VNvdmR7o0
このあたりのソース揃ってるソフトでC言語の勉強してるわ。
スカパーの録画環境も構築できるし。
https://www65.atwiki.jp/psky/
0770恥人
垢版 |
2018/02/07(水) 09:17:15.35
へえ、おもしろ
0772デフォルトの名無しさん (スップ Sd3f-27VS)
垢版 |
2018/02/07(水) 17:58:56.36ID:jSJcfZwQd
const char ○○とchar ○○について。
○○はフォルダ名。

後者ではエラー、前者ではエラーにならない場合何が考えられますか?
CとC++だと記述が違うとかあります?
0773デフォルトの名無しさん (ワッチョイ d78a-uppE)
垢版 |
2018/02/07(水) 18:21:27.23ID:nJAlkrj20
恐らく何らかの標準関数の引数にでもした時にエラーが発生したんだろうけど、具体的なことが分からないので何とも言えない
constについてはCとC++では微妙に扱いが違う
0782デフォルトの名無しさん (ワッチョイ 97b3-C7gl)
垢版 |
2018/02/07(水) 19:49:53.17ID:I0UlpN+80
const 無しのポインタ変数にリテラル文字列を与えると

C++だと (リテラル文字列の)指し先を書き換える気あるのかボケェ と警告やエラーになるですよ

Cは過去のコードの互換性の為に黙ってることが多い
(けどオプションで警告したりエラーにしたりするんだっけか?)
0784デフォルトの名無しさん (ワッチョイ 57b3-wbgk)
垢版 |
2018/02/07(水) 22:29:07.83ID:MTpdY7NJ0
"!"!"!MOHYO!"!"!"2"

1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]

2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!

3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{

41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end

{
0786デフォルトの名無しさん (ワッチョイ 2e80-2I1n)
垢版 |
2018/02/08(木) 02:47:50.39ID:31uXy/SD0
>>779-780
Rubyではパイプラインで、サブプロセスを実行し、結果を受け取れる。
例えば下は、メモ帳の実行ファイルの場所を探す

resText = ""
IO.popen("where notepad") { |io| resText = io.read }
puts resText

出力結果
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
0787786 (ワッチョイ 2e80-2I1n)
垢版 |
2018/02/08(木) 03:57:59.54ID:31uXy/SD0
>>779-780
Rubyではパイプラインで、サブプロセスを実行し、結果を受け取れる。
これで、サイトのHTML が取れる

resText = ""

IO.popen("curl サイトのURL") { |io| resText = io.read }

puts "終了ステータス : #{$?}", resText
0788デフォルトの名無しさん (ワッチョイ 319f-R9JW)
垢版 |
2018/02/08(木) 04:04:45.98ID:FQ2Hecmn0
>>779
system()ではなくpopen()使うと楽だ。
0792デフォルトの名無しさん (スップ Sdc2-Rwrx)
垢版 |
2018/02/08(木) 08:12:52.25ID:JMUgsKdMd
>>790
すまねぇ
正確に言うとcurlだった
実行ファイルってのを言いたかったんだけど紛らわしかったわ....

>>791
コマンドラインで実行をコード上からして
その結果をメモリに書き込みたいって感じ

int main()

char* buff[1024]
execv(curl..........)


子プロセス作成とかは書いてないけどこのexecvの結果をbuffにいれたい
0793デフォルトの名無しさん (ワッチョイ 4193-jcwv)
垢版 |
2018/02/08(木) 08:29:27.70ID:Mx6kxOEl0
>>779>>789 は同じ投稿者なのかな?

「curl.exeをsystemコールする」という文の意味は、
実際には curl.exe でなく /usr/bin/curl かどこかの Linux のコマンド、
systemコールと言っても system() 関数でなく execv() 関数で呼ぶ、
という条件でいいの?
0795デフォルトの名無しさん (ワッチョイ 4193-jcwv)
垢版 |
2018/02/08(木) 09:24:02.21ID:Mx6kxOEl0
#include <unistd.h>
#include <stdio.h>

int main() {
  int pp[2];
  pid_t pid;
  pipe(pp);   // パイプを生成 (エラーチェック略)
  pid = fork(); // プロセスを複製 (エラーチェック略)
  if (pid > 0) {
    // 親プロセス: 子プロセスから情報を受け取る
    close(0);   // 標準入力のディスクリプタを閉じる
    dup(pp[0]);  // パイプの入力を標準入力に複製
    close(pp[0]); // パイプの入力を閉じる
    close(pp[1]); // パイプの出力側は使わない
    char buf[1024];
    int nbytes = read(0, buf, sizeof(buf)); // 子プロセスからのデータ受け取り
    printf("[%*s]\n", nbytes, buf); // 受け取ったデータの確認
  } else {
    // 子プロセス: 外部コマンドを呼び出し、標準出力経由で親プロセスに送る
    char *cmds[] = { "/usr/bin/echo", "hello, darling", NULL }; // ダミーの外部コマンド
    close(1);   // 標準出力のディスクリプタを閉じる
    dup(pp[1]);  // パイプの出力を標準出力に複製
    close(pp[1]); // パイプの出力を閉じる
    close(pp[0]); // パイプの入力側は使わない
    // 外部コマンドの呼び出し (エラーチェック略)
    execv(*cmds, cmds);
  }
  return 0;
}
0796デフォルトの名無しさん (アウアウカー Sa69-OLJ2)
垢版 |
2018/02/08(木) 09:25:00.98ID:Bk9SeRO9a
自分で fork, exec するなら pipe() 作って dup() で繋げ。
やり方はUNIXやLinuxのシステムコールに関する入門書みたいなのがあれば必ず書いてあると思うのでそういうのを見るか、またはググれば世界中で解説やサンプルプログラムが見つかると思う。
かなり基本的な事だ。
0797795 (ワッチョイ 4193-jcwv)
垢版 |
2018/02/08(木) 09:25:52.35ID:Mx6kxOEl0
急造のデッチ上げだけど、こんな感じかな。

要点は、名前なしパイプを作って標準入出力と差し替える。
外部コマンドの標準出力はパイプを通って出ていく、
呼び出した側は標準入力を読むとパイプから入ってくる。

32行制限に収めるために行が詰めたら見にくいね。
0798デフォルトの名無しさん (アウアウカー Sa69-OLJ2)
垢版 |
2018/02/08(木) 09:26:09.44ID:Bk9SeRO9a
などと書いている最中に真上にサンプルプログラム出現w
0800デフォルトの名無しさん (ワッチョイ 4193-jcwv)
垢版 |
2018/02/08(木) 12:29:54.84ID:Mx6kxOEl0
親プロセス側は標準入力をパイプに差し替える必要ないね。
パイプのディスクリプタから素直に読みゃいいんだわ。

// close(0);   // (不要)標準入力のディスクリプタを閉じる
// dup(pp[0]);  // (不要)パイプの入力を標準入力に複製
// close(pp[0]); // パイプの入力側はまだ閉じちゃダメ!
  close(pp[1]); // パイプの出力側は使わない

// int nbytes = read(0, buf, sizeof(buf)); // (変更)
  int nbytes = read(pp[0], buf, sizeof(buf)); // 子プロセスからのデータ受け取り
  close(pp[0]); // 使用済みパイプの入力を閉じる
0804愛恥人
垢版 |
2018/02/08(木) 22:40:11.36
消えてる(>_<)
■ このスレッドは過去ログ倉庫に格納されています

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