C言語なら俺に聞け(入門編)Part 79

このエントリーをはてなブックマークに追加
601デフォルトの名無しさん
if(){
602デフォルトの名無しさん:2011/02/27(日) 16:35:10.92
C言語のpopen関数を使って別のアプリケーション(gnuplot)を起動して
そこにfprintf関数でコマンドを送っています
呼び出しもとのアプリケーションの出力のみならず、
送信したコマンドやgnuplotからの各出力も同じコマンドプロンプトに表示されてしまうのですが、
これらを非表示にしたり出力先を違うコマンドプロンプトにしたりすることは可能でしょうか?
603デフォルトの名無しさん:2011/02/27(日) 16:42:08.79
604デフォルトの名無しさん:2011/02/27(日) 18:38:12.94
#include<stdio.h> 
int count_bits(unsigned x) 
{int count=0;while(x){if(x&1U)count++;x >>=1;}return (count);} 
int int_bits(void) 
{return(count_bits(~0U));} 
void print_bits(unsigned x) 
{int i;for(i=int_bits()-1; i>=0; i--)putchar(((x>>i)&1U)?'1':'0');} 
int main(void) 
{unsigned nx;printf("非負の整数を入力してください:"); 
scanf("%u",&nx);print_bits(nx);putchar('\n');return (0);}
605デフォルトの名無しさん:2011/02/27(日) 18:39:50.47
上記のプログラムなんですが良く分からない所があります。 
まず1の補数はビットの反転ですよね?そもそも処理系によって補数って変わるんじゃないんですか? 
0の補数は11111~となるけど、-1が1111・・・0だから1111・・1の数、つまり0に対する1の補数って存在 
しないんじゃないんですか?そもそも1の補数か2の補数でビットが表現されてるのか処理系によって違う 
んじゃないんですか? 
後なんでmain関数内のscanfの書式が%uなのでしょうか?%dじゃないのでしょうか? 
%uは型の大きさのときにこう指定するのであって、実際にint型の数を関数にわたすわけ 
だから%dなのではないのでしょうか?
606デフォルトの名無しさん:2011/02/27(日) 19:03:07.95
0の補数って0じゃねーの?
607デフォルトの名無しさん:2011/02/27(日) 19:33:34.65
1の補数表現ではプラスゼロとマイナスゼロが存在する
2の補数表現ではゼロはただひとつだけ
負の数が1の補数表現か2の補数表現かは処理系によって変わる
%dはint型
%uはunsigned int型
変数nxはunsigned int型
608 ◆QZaw55cn4c :2011/02/27(日) 19:36:11.98
>>605
wikipedia で大体のことがわかりますよ。
http://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0
これによると、
「2進法における基数の補数」を略して 2 の補数
「2進法における減基数の補数」を略して 1 の補数
と呼ぶようですね。
で、
>処理系によって補数って変わるんじゃないんですか
正確には、負の数を 2 の補数とするか 1 の補数とするか、あるいはそれ以外にするかが、処理系によって変わります。
補数の概念が処理系によってかわるわけではありません。

>0の補数は11111~

>-1が1111・・・0
処理系によってかわります。負数を 1 の補数であらわすのならそうなります。
>1111・・1の数、つまり0に対する1の補数って存在しない。
確かに負の数を1 の補数とすると 0 の表現が二種類できます。それをどう扱うかは、(私自身は1の補数を負の数とする処理系をしらないので)よくわかりません。

>scanfの書式が%uなのでしょうか?
scanf() で入力された文字列を「符号なしの」10進数として解釈したいから、と推察されます。値をセットする変数 nx は unsigned int で宣言されています。
609デフォルトの名無しさん:2011/02/27(日) 23:37:42.86
と高卒低学歴が申しております
610デフォルトの名無しさん:2011/02/27(日) 23:48:26.40
> %uは型の大きさのときにこう指定する

sizeof は %u と教わっちまったのかな・・・
「何も考えずに」って
611デフォルトの名無しさん:2011/02/28(月) 00:03:35.57
>>610
sizeof じゃなくて l とかの長さ修飾子と勘違いしたんじゃないの とエスパーしてみるw
612デフォルトの名無しさん:2011/02/28(月) 02:07:49.09
>>604のコードに1の補数が一切関係ないことについて
613デフォルトの名無しさん:2011/02/28(月) 05:54:26.08
>>612
ビット反転してるじゃん?
614デフォルトの名無しさん:2011/02/28(月) 05:57:17.68
1の補数を求めるための方法にビットの反転があるだけで、
ビットの反転=1の補数を求めることじゃないから

>>604はunsignedの総ビット数を求めるために全てのビットをオンにするために0を反転してるだけ
615デフォルトの名無しさん:2011/02/28(月) 07:10:14.46
>>614
任意の値のビットオフを数えることが目的ならともかく、
>>604は全ビットが立ってる状態を表しているのだから、
0のビット反転でも、(1の補数表現で)0の補数でも、表現は自由だと思うが?
616デフォルトの名無しさん:2011/02/28(月) 07:15:49.21
~はビット反転であって、1の補数って意味じゃないよ

ビット反転=1の補数とか思い込んじゃったから>>605みたいな意味のわからないこと言い出すんだから
表現の自由とかいう問題でもないよ
617デフォルトの名無しさん:2011/02/28(月) 07:36:03.94
>>616
Cの規格上で、全てのビットが立っている状態を1の補数と読んでいるし
~演算子は、ビット単位の補数と読んでるが?
618デフォルトの名無しさん:2011/02/28(月) 11:39:03.32
お前ら規格もちゃんと読んで凄いな。
何気に優秀な人もいるんだろうな
619デフォルトの名無しさん:2011/02/28(月) 12:42:45.93
>>617
それは処理系3タイプの分類としての方便でしょ

補数=補う数
なので、絶対的な値ではないよ
620デフォルトの名無しさん:2011/02/28(月) 12:52:51.70
翻訳上の問題なのかもな
621デフォルトの名無しさん:2011/02/28(月) 13:07:22.34
原文でも同じだから読解力の問題かな
ム板らしく解説すると
> -- the sign bit has the value -(2^N -1) (one's complement).
この行の補足説明で one's complement を束縛してる
622デフォルトの名無しさん:2011/02/28(月) 13:10:02.53
-(2^n-1)ってunsignedじゃない気がするんだが
623デフォルトの名無しさん:2011/02/28(月) 13:14:17.02
signedでなければ出番は無い訳で・・・
624デフォルトの名無しさん:2011/02/28(月) 13:16:09.65
>>604はunsignedの話なわけで……
625デフォルトの名無しさん:2011/02/28(月) 13:17:50.06
ただのdumpな訳で・・・
626デフォルトの名無しさん:2011/02/28(月) 16:10:59.93
1の補数って何??
627デフォルトの名無しさん:2011/02/28(月) 16:13:31.39
2の補数から1引いた数
628デフォルトの名無しさん:2011/02/28(月) 16:27:54.87
>>626
http://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0

こんぴゅーたーのせかいでは
しんすう や けたすう がしょうりゃくされたばあいは
しんすうは2、けたすうはへんすうのかたのさいずとおきかえてください
629デフォルトの名無しさん:2011/02/28(月) 16:34:51.64
何故ひらがな?
630デフォルトの名無しさん:2011/02/28(月) 16:38:21.10
C言語ってそんなミクロな視点で数字扱わなきゃダメなの!?
普通にintとか宣言すれば後はビット列レベルの細かいことはコンピュータが勝手にやってくれるんじゃないんだ??
631デフォルトの名無しさん:2011/02/28(月) 16:59:27.12
>>630
扱わなくて済むなら扱う必要はないよ
でも、初心者にC言語を薦めるのは
そういったミクロな部分を学習しやすいって事だから
それを避けてCをやっても意味は薄れるよ
632デフォルトの名無しさん:2011/02/28(月) 16:59:32.49
いや別に
普段はintと宣言すれば後は勝手に上手くやってくれると期待してもっと重要な部分に思考を割くべきで間違ってない
まれに細かい視点で見ないと解決できない問題もあるので知識はあった方がよい
633デフォルトの名無しさん:2011/02/28(月) 17:04:30.51
>>630
勝手にやってくれるよ。
634デフォルトの名無しさん:2011/02/28(月) 17:36:19.24
>>630
ビット操作の効率の考慮とか右シフト演算をしなければ気にする問題ではない
635デフォルトの名無しさん:2011/03/01(火) 00:20:44.74
初心者なのですが、http://wisdom.sakura.ne.jp/programming/c/index.htmlを勉強した後何を勉強すればいいか迷っています・・・
なにかいい教材、サイトはありますでしょうか?
636デフォルトの名無しさん:2011/03/01(火) 00:22:17.50
637デフォルトの名無しさん:2011/03/01(火) 00:28:38.82
何を勉強すればいいかは自分が何をしたいかによる
ゲーム作りたいのにデータベースやサーバ サイドのプログラムを勉強したって仕方がない
638デフォルトの名無しさん:2011/03/01(火) 00:53:35.00
>>636勉強になりそうです ありがとうございます
>>637どの分野をやりたいかにかかわらず共通してやるべき事はhttp://wisdom.sakura.ne.jp/programming/c/index.htmlで終わりでしょうか
639 ◆QZaw55cn4c :2011/03/01(火) 02:00:01.29
>>638
「動的メモリ」から発展して、データ構造(リンクリスト・バイナリツリー)を追加して習得したほうがいいでしょう。
また再帰呼び出しも押さえておきたいし、頻出のアルゴリズムも理解しておきたいし。
で、なにか数冊くらいは、書籍でマスターしたほうがいいかもしれません。
640デフォルトの名無しさん:2011/03/01(火) 02:19:20.90
そんなことよりも、先ずは作りたいものを作ることだな
641デフォルトの名無しさん:2011/03/01(火) 02:27:24.79
>>638
大切なのは必要な機能を、どのような手段で実装すれば良いかを考える力を付けること
そのためには、>>640が言うとおり、自分が作りたいものを作るのが手っ取り早い
642デフォルトの名無しさん:2011/03/01(火) 02:44:16.82
OSでもいいし、言語処理系でもいいし、
ゲームとかでも良い
643デフォルトの名無しさん:2011/03/01(火) 02:56:04.40
地味な作業の繰り返しってことがわかってないと...
644デフォルトの名無しさん:2011/03/01(火) 03:37:15.17
俺は一通り覚えた後は、n進数ダンプツールとかポーカーとか作ったな。
とにかく何でもいいから時間が許す限り毎日何かを作ることだ。
自分だけのTIPSリファレンスを作るのもいい。とにかく何かしら作れ。
645デフォルトの名無しさん:2011/03/01(火) 04:18:31.19
ヒマなら電卓を作ると良いと誰かが言ってた。
最初は単純な四則演算から初めて、変数を導入して、底の変更、
少数の計算、簡単な関数の定義へとグレードアップして行くと、
大変に基礎の勉強になるらしい。

後はオープンソースで公開されているソースコードをひたすら
読んで、プログラムの構造とか、変数や関数の命名規則とか、
読み易いコードの書き方とかを勉強するのも良いと思う。
646デフォルトの名無しさん:2011/03/01(火) 04:22:34.67
647デフォルトの名無しさん:2011/03/01(火) 04:27:33.60
なるほど電卓かー
+‐使わずにビットシフトと論理演算使うのかな
648デフォルトの名無しさん:2011/03/01(火) 04:48:18.91
まともな電卓を実装しようとすると
基礎的な構文解析が必要になるし、多倍長整数演算もいる
Windows標準添付の電卓ぐらいでも、そんなに簡単ではない
649デフォルトの名無しさん:2011/03/01(火) 04:54:08.40
ごくごく基本的な所から始められて、なおかつ奥深いから、課題として丁度良いよね
RPN電卓なら構文解析もラクチンだし
650デフォルトの名無しさん:2011/03/01(火) 04:57:59.44
なんとなくビットシフトと論理演算で計算出来ればいくらでも桁数増やせそうな気がするけどそんなに簡単じゃないんだろうなきっと
651デフォルトの名無しさん:2011/03/01(火) 05:00:49.45
まぁ、手始めは2値入力させてそれらの和差積商を出力するくらいで委員でね
652デフォルトの名無しさん:2011/03/01(火) 05:10:59.56
作りたいものがないのにプログラミング勉強しても意味がないのだが
653デフォルトの名無しさん:2011/03/01(火) 05:31:12.86
つまり君はプログラミングの学習に於いてはテロスが重要だという意見のようだね。
プログラミングの目的・テロスとは何かを作る事だ。それがあって初めて行動が正当化される。
即ち正義が行われると言う事だ。

非常に興味深い。他に意見のある者は?
654デフォルトの名無しさん:2011/03/01(火) 06:55:15.80
具体的な知識いらないことだと、スレがよく伸びるなw
655デフォルトの名無しさん:2011/03/01(火) 14:23:59.23
linux上のgccで、ハードのレジスタを変更したいです。

HW_HOGE_REG 0x8005C060
上記アドレスの3ビット目に1を立てたいのですが、
先に読み出しを行うとするとエラーになります。

unsigned long address = *(volatile unsigned long*)0x8005C060;
printf("%ld",address);

上記コードで現在の設定値を呼び出そうとし、コンパイルし実行すると、
Segmentation fault
で終了します。

なぜでしょうか?
656デフォルトの名無しさん:2011/03/01(火) 14:26:10.70
>>655
保護されてるからだろ
そこにアクセスするためには前準備が必要
657デフォルトの名無しさん:2011/03/01(火) 15:07:57.69
>>656
操作したい場合は、どのようにすればよいのでしょうか?
658デフォルトの名無しさん:2011/03/01(火) 15:11:34.60
>>657
スペシャルファイルなら ioctl とか
659デフォルトの名無しさん:2011/03/01(火) 15:29:52.41
>>658
armCPUのレジスタでアドレスも不変なので、直接触りたいです。
逆にデバイスとして操作する方法がわかりません。
660デフォルトの名無しさん:2011/03/01(火) 15:31:59.51
>>659
write only じゃないよね
661デフォルトの名無しさん:2011/03/01(火) 15:35:21.54
>>660
先に状態を確認したく、
単純に読み込みを行っていますが、それも行えません。
662デフォルトの名無しさん:2011/03/01(火) 15:38:50.25
>>655
アホすぎるwww
重要なことを忘れてる
663デフォルトの名無しさん:2011/03/01(火) 15:39:39.10
>>661
つーかまずここでエラーになってることは間違いないのか?
664デフォルトの名無しさん:2011/03/01(火) 15:42:37.84
>>663
int main(int argc, char *argv[])
{
unsigned long address = *(volatile unsigned long*)0x8005C060;
printf("%ld",address);

return 0;
}

これだけのコードです。
665デフォルトの名無しさん:2011/03/01(火) 15:48:19.01
サーバー立てました
アドレスはhttp://192.168.1.1 です
666デフォルトの名無しさん:2011/03/01(火) 15:48:42.04
そのレジスタがユーザアドレス空間にマップされてねー
667デフォルトの名無しさん:2011/03/01(火) 19:58:09.94
そんなしょうもない理由なわけがない
668デフォルトの名無しさん:2011/03/01(火) 20:49:01.60
物理アドレス空間と論理アドレス空間って違うだろ
winならドライバ経由で物理アドレス空間にアクセスするけど
Linuxはどうするのか知らん
669デフォルトの名無しさん:2011/03/01(火) 21:18:08.38
>>664
カーネルに居るなら 仮想アドレス≠物理アドレス は request_mem_region() と ioremap_nocache() でなんとかなる筈
ユーザーランドから叩く方法は俺も知らんけど多分無理だと思う…
670デフォルトの名無しさん:2011/03/01(火) 22:29:30.08
何言ってるのかわかんね
日本語でおkだわ
671デフォルトの名無しさん:2011/03/01(火) 22:50:33.16
低脳には理解できないように書いているんじゃね
これを理解できない脳力・レベルじゃ、無理だからやめれとアドバイスしているんだよ
672デフォルトの名無しさん:2011/03/01(火) 23:07:37.70
>>670
linux良く分からんが訳してみた

カーネル空間からであれば、request_mem_region() と ioremap_nocache() 使って
仮想アドレス(≠物理アドレス)で直接ハードウェアの操作をできるはず
ユーザ空間から操作する方法は俺も知らんけど無理だと思う

まぁドライバとか作るならともかく、普通に実行しても動くわけないって意味かと…
正しいかどうかは知らんので自分で調べてくれ
673デフォルトの名無しさん:2011/03/01(火) 23:11:39.06
for(::) printf("やっぱ俺は低能だったかーヽ(`Д´)ノウワァァァン!!");
674デフォルトの名無しさん:2011/03/01(火) 23:12:23.97
puts() で良いじゃん
675デフォルトの名無しさん:2011/03/01(火) 23:12:42.86
あぁ、ちょい違うか
linuxでは、ハードウェアを操作するときに、
カーネル空間からさえ、仮想アドレスからじゃないと操作できないのに、
直接物理アドレス触っても動くわけないかな?
676デフォルトの名無しさん:2011/03/01(火) 23:12:43.37
エラーが出るコード?
677デフォルトの名無しさん:2011/03/01(火) 23:17:07.57
linuxじゃなくても、仮想アドレスモードなCPUからは
物理アドレスじゃアクセスできない。
678デフォルトの名無しさん:2011/03/01(火) 23:27:23.73
>>677
それってlinuxは仮想アドレスモードなCPUじゃないと動かないってこと?
679デフォルトの名無しさん:2011/03/02(水) 00:24:06.93
Cってどんなイメージかな???
鉄壁の騎士ってかんじ?

タフなナイトかな???

Rubyは紅色の短刀を持つRubyアサシンっておもいついたんだけど
680デフォルトの名無しさん:2011/03/02(水) 08:41:30.40
>>679
どう読むとそう読めるんだ? 100回読みなおせ。
681デフォルトの名無しさん:2011/03/02(水) 09:29:39.73
pythonは敵ぢんちに潜入して情報をとってくるpython探検隊のひと
682デフォルトの名無しさん:2011/03/02(水) 13:02:54.20
アホみたいな質問で申し訳ないす・・

関数へのポインタはA関数とB関数がある場合、A関数へのポインタの型とB関数へのポインタの型はちがいますか?
それとも同じ関数ポインタ型なんですか?

構造体Aへのポインタと構造体Bへのポインタが違う型という認識と同じような認識になるんでしょうか?
683デフォルトの名無しさん:2011/03/02(水) 13:16:34.64
>>682
厳密性のない解釈なら同じとも違うともいえる。従って、厳密に考えよう。
・構造体へのポインタの型
これは、構造体のメンバがどうであれ構造体の名前が違えば別の型として扱われる。
・関数へのポインタの型
これも同様に、プロトタイプ宣言も含めて一致して、初めて同じ型といえる。

標準ライブラリの例で言えば、bsearch()の第5引き数とqsort()の第4引き数はどちらも同じ
プロトタイプを持つので同じ関数ポインタ型と言えるだろう。
しかし、atexit()の引き数は違うプロトタイプを持つので違う関数ポインタ型となる。
--
bsearch()
int (*COMPAR)(const void *, const void *)
qsort()
int (*COMPAR)(const void *, const void *)
atexit()
void (*FUNCTION)(void)
684デフォルトの名無しさん:2011/03/02(水) 13:17:17.68
>>682
同じような認識でいいよ
引数や返り値の型が一緒なら一緒だし違えば違う
685デフォルトの名無しさん:2011/03/02(水) 14:33:57.55
>>682
違うよ。 コード書いてみれば?
686682:2011/03/02(水) 14:43:08.81
みなさんどうもありがとう。

基本的には、同じような認識で、厳密に言うと違うということなんですね。
しかし、構造体名や関数名がちがうだけで、別の型になってしまうんですね・・
メンバや引数が全く同じなら同じとしていいようにも思えてしまうんですが(素人考えでは)

Cでは、本当に細かいところまで厳密に定めてある部分が多々ありますね。

ようやく、Cのちょっと深い部分までわかるようになってきました。みなさん、回答ありがとうございました。
とくに、>>683さん、細かいところまで丁寧に解説してくださって、ありがとうございました。
687デフォルトの名無しさん:2011/03/02(水) 15:03:52.40
>>686
構造体にはタグ名があるからそれが違えば違う型だけど、関数にはタグ名はないからプロトタイプが一致すれば同じ型だよ。

>>685
何がどう違うのか判るようなコードを頼む。
688デフォルトの名無しさん:2011/03/02(水) 15:07:18.06
ID無い板で熱くなるなよ
689デフォルトの名無しさん:2011/03/02(水) 15:34:41.90
>>687
> 関数へのポインタはA関数とB関数がある場合、A関数へのポインタの型とB関数へのポインタの型はちがいますか?
違うよ。 コード書いてみれば?

> それとも同じ関数ポインタ型なんですか?
違うよ。 コード書いてみれば?

> 構造体Aへのポインタと構造体Bへのポインタが違う型という認識と同じような認識になるんでしょうか?
違うよ。 コード書いてみれば?


どのQに対するAなのか曖昧ですよね
スルースキルを養いましょう
690デフォルトの名無しさん:2011/03/02(水) 15:38:36.90
>>689
ちげーよw687が自分に対するレスと勘違いしただけだろw
691デフォルトの名無しさん:2011/03/02(水) 16:03:03.64
690=神
692デフォルトの名無しさん:2011/03/02(水) 16:07:22.86
神は句読点にwを使うんだ
693デフォルトの名無しさん:2011/03/02(水) 16:09:29.01
疑問符の間違いだろw
694デフォルトの名無しさん:2011/03/02(水) 16:13:09.98
神だからね
695デフォルトの名無しさん:2011/03/02(水) 16:59:02.53
マックミランだからね
696デフォルトの名無しさん:2011/03/02(水) 19:20:05.68
紙ですから
697デフォルトの名無しさん:2011/03/02(水) 19:25:50.15
そしておまえらは数年後に髪に見放されつつあることを知る…。
698デフォルトの名無しさん:2011/03/02(水) 19:28:17.41
while(0) printf("髪生えてキタ━(゚∀゚)━!");
699デフォルトの名無しさん:2011/03/02(水) 20:15:08.81
>>698
何がしたいの?コメント行?
700デフォルトの名無しさん:2011/03/02(水) 20:17:31.44
>>699
えっ?