if(){
C言語のpopen関数を使って別のアプリケーション(gnuplot)を起動して
そこにfprintf関数でコマンドを送っています
呼び出しもとのアプリケーションの出力のみならず、
送信したコマンドやgnuplotからの各出力も同じコマンドプロンプトに表示されてしまうのですが、
これらを非表示にしたり出力先を違うコマンドプロンプトにしたりすることは可能でしょうか?
#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);}
上記のプログラムなんですが良く分からない所があります。
まず1の補数はビットの反転ですよね?そもそも処理系によって補数って変わるんじゃないんですか?
0の補数は11111~となるけど、-1が1111・・・0だから1111・・1の数、つまり0に対する1の補数って存在
しないんじゃないんですか?そもそも1の補数か2の補数でビットが表現されてるのか処理系によって違う
んじゃないんですか?
後なんでmain関数内のscanfの書式が%uなのでしょうか?%dじゃないのでしょうか?
%uは型の大きさのときにこう指定するのであって、実際にint型の数を関数にわたすわけ
だから%dなのではないのでしょうか?
0の補数って0じゃねーの?
1の補数表現ではプラスゼロとマイナスゼロが存在する
2の補数表現ではゼロはただひとつだけ
負の数が1の補数表現か2の補数表現かは処理系によって変わる
%dはint型
%uはunsigned int型
変数nxはunsigned int型
>>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 で宣言されています。
と高卒低学歴が申しております
610 :
デフォルトの名無しさん:2011/02/27(日) 23:48:26.40
> %uは型の大きさのときにこう指定する
sizeof は %u と教わっちまったのかな・・・
「何も考えずに」って
>>610 sizeof じゃなくて l とかの長さ修飾子と勘違いしたんじゃないの とエスパーしてみるw
>>604のコードに1の補数が一切関係ないことについて
1の補数を求めるための方法にビットの反転があるだけで、
ビットの反転=1の補数を求めることじゃないから
>>604はunsignedの総ビット数を求めるために全てのビットをオンにするために0を反転してるだけ
>>614 任意の値のビットオフを数えることが目的ならともかく、
>>604は全ビットが立ってる状態を表しているのだから、
0のビット反転でも、(1の補数表現で)0の補数でも、表現は自由だと思うが?
~はビット反転であって、1の補数って意味じゃないよ
ビット反転=1の補数とか思い込んじゃったから
>>605みたいな意味のわからないこと言い出すんだから
表現の自由とかいう問題でもないよ
>>616 Cの規格上で、全てのビットが立っている状態を1の補数と読んでいるし
~演算子は、ビット単位の補数と読んでるが?
お前ら規格もちゃんと読んで凄いな。
何気に優秀な人もいるんだろうな
>>617 それは処理系3タイプの分類としての方便でしょ
補数=補う数
なので、絶対的な値ではないよ
翻訳上の問題なのかもな
原文でも同じだから読解力の問題かな
ム板らしく解説すると
> -- the sign bit has the value -(2^N -1) (one's complement).
この行の補足説明で one's complement を束縛してる
-(2^n-1)ってunsignedじゃない気がするんだが
signedでなければ出番は無い訳で・・・
ただのdumpな訳で・・・
1の補数って何??
2の補数から1引いた数
何故ひらがな?
C言語ってそんなミクロな視点で数字扱わなきゃダメなの!?
普通にintとか宣言すれば後はビット列レベルの細かいことはコンピュータが勝手にやってくれるんじゃないんだ??
>>630 扱わなくて済むなら扱う必要はないよ
でも、初心者にC言語を薦めるのは
そういったミクロな部分を学習しやすいって事だから
それを避けてCをやっても意味は薄れるよ
いや別に
普段はintと宣言すれば後は勝手に上手くやってくれると期待してもっと重要な部分に思考を割くべきで間違ってない
まれに細かい視点で見ないと解決できない問題もあるので知識はあった方がよい
634 :
デフォルトの名無しさん:2011/02/28(月) 17:36:19.24
>>630 ビット操作の効率の考慮とか右シフト演算をしなければ気にする問題ではない
635 :
デフォルトの名無しさん:2011/03/01(火) 00:20:44.74
636 :
デフォルトの名無しさん:2011/03/01(火) 00:22:17.50
何を勉強すればいいかは自分が何をしたいかによる
ゲーム作りたいのにデータベースやサーバ サイドのプログラムを勉強したって仕方がない
638 :
デフォルトの名無しさん:2011/03/01(火) 00:53:35.00
>>638 「動的メモリ」から発展して、データ構造(リンクリスト・バイナリツリー)を追加して習得したほうがいいでしょう。
また再帰呼び出しも押さえておきたいし、頻出のアルゴリズムも理解しておきたいし。
で、なにか数冊くらいは、書籍でマスターしたほうがいいかもしれません。
そんなことよりも、先ずは作りたいものを作ることだな
>>638 大切なのは必要な機能を、どのような手段で実装すれば良いかを考える力を付けること
そのためには、
>>640が言うとおり、自分が作りたいものを作るのが手っ取り早い
OSでもいいし、言語処理系でもいいし、
ゲームとかでも良い
地味な作業の繰り返しってことがわかってないと...
俺は一通り覚えた後は、n進数ダンプツールとかポーカーとか作ったな。
とにかく何でもいいから時間が許す限り毎日何かを作ることだ。
自分だけのTIPSリファレンスを作るのもいい。とにかく何かしら作れ。
ヒマなら電卓を作ると良いと誰かが言ってた。
最初は単純な四則演算から初めて、変数を導入して、底の変更、
少数の計算、簡単な関数の定義へとグレードアップして行くと、
大変に基礎の勉強になるらしい。
後はオープンソースで公開されているソースコードをひたすら
読んで、プログラムの構造とか、変数や関数の命名規則とか、
読み易いコードの書き方とかを勉強するのも良いと思う。
なるほど電卓かー
+‐使わずにビットシフトと論理演算使うのかな
まともな電卓を実装しようとすると
基礎的な構文解析が必要になるし、多倍長整数演算もいる
Windows標準添付の電卓ぐらいでも、そんなに簡単ではない
ごくごく基本的な所から始められて、なおかつ奥深いから、課題として丁度良いよね
RPN電卓なら構文解析もラクチンだし
なんとなくビットシフトと論理演算で計算出来ればいくらでも桁数増やせそうな気がするけどそんなに簡単じゃないんだろうなきっと
まぁ、手始めは2値入力させてそれらの和差積商を出力するくらいで委員でね
作りたいものがないのにプログラミング勉強しても意味がないのだが
つまり君はプログラミングの学習に於いてはテロスが重要だという意見のようだね。
プログラミングの目的・テロスとは何かを作る事だ。それがあって初めて行動が正当化される。
即ち正義が行われると言う事だ。
非常に興味深い。他に意見のある者は?
具体的な知識いらないことだと、スレがよく伸びるな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
で終了します。
なぜでしょうか?
>>655 保護されてるからだろ
そこにアクセスするためには前準備が必要
>>656 操作したい場合は、どのようにすればよいのでしょうか?
>>657 スペシャルファイルなら ioctl とか
>>658 armCPUのレジスタでアドレスも不変なので、直接触りたいです。
逆にデバイスとして操作する方法がわかりません。
>>660 先に状態を確認したく、
単純に読み込みを行っていますが、それも行えません。
>>655 アホすぎるwww
重要なことを忘れてる
>>661 つーかまずここでエラーになってることは間違いないのか?
>>663 int main(int argc, char *argv[])
{
unsigned long address = *(volatile unsigned long*)0x8005C060;
printf("%ld",address);
return 0;
}
これだけのコードです。
そのレジスタがユーザアドレス空間にマップされてねー
そんなしょうもない理由なわけがない
物理アドレス空間と論理アドレス空間って違うだろ
winならドライバ経由で物理アドレス空間にアクセスするけど
Linuxはどうするのか知らん
>>664 カーネルに居るなら 仮想アドレス≠物理アドレス は request_mem_region() と ioremap_nocache() でなんとかなる筈
ユーザーランドから叩く方法は俺も知らんけど多分無理だと思う…
何言ってるのかわかんね
日本語でおkだわ
低脳には理解できないように書いているんじゃね
これを理解できない脳力・レベルじゃ、無理だからやめれとアドバイスしているんだよ
>>670 linux良く分からんが訳してみた
カーネル空間からであれば、request_mem_region() と ioremap_nocache() 使って
仮想アドレス(≠物理アドレス)で直接ハードウェアの操作をできるはず
ユーザ空間から操作する方法は俺も知らんけど無理だと思う
まぁドライバとか作るならともかく、普通に実行しても動くわけないって意味かと…
正しいかどうかは知らんので自分で調べてくれ
for(::) printf("やっぱ俺は低能だったかーヽ(`Д´)ノウワァァァン!!");
puts() で良いじゃん
あぁ、ちょい違うか
linuxでは、ハードウェアを操作するときに、
カーネル空間からさえ、仮想アドレスからじゃないと操作できないのに、
直接物理アドレス触っても動くわけないかな?
エラーが出るコード?
linuxじゃなくても、仮想アドレスモードなCPUからは
物理アドレスじゃアクセスできない。
>>677 それってlinuxは仮想アドレスモードなCPUじゃないと動かないってこと?
Cってどんなイメージかな???
鉄壁の騎士ってかんじ?
タフなナイトかな???
Rubyは紅色の短刀を持つRubyアサシンっておもいついたんだけど
>>679 どう読むとそう読めるんだ? 100回読みなおせ。
pythonは敵ぢんちに潜入して情報をとってくるpython探検隊のひと
682 :
デフォルトの名無しさん:2011/03/02(水) 13:02:54.20
アホみたいな質問で申し訳ないす・・
関数へのポインタはA関数とB関数がある場合、A関数へのポインタの型とB関数へのポインタの型はちがいますか?
それとも同じ関数ポインタ型なんですか?
構造体Aへのポインタと構造体Bへのポインタが違う型という認識と同じような認識になるんでしょうか?
>>682 厳密性のない解釈なら同じとも違うともいえる。従って、厳密に考えよう。
・構造体へのポインタの型
これは、構造体のメンバがどうであれ構造体の名前が違えば別の型として扱われる。
・関数へのポインタの型
これも同様に、プロトタイプ宣言も含めて一致して、初めて同じ型といえる。
標準ライブラリの例で言えば、bsearch()の第5引き数とqsort()の第4引き数はどちらも同じ
プロトタイプを持つので同じ関数ポインタ型と言えるだろう。
しかし、atexit()の引き数は違うプロトタイプを持つので違う関数ポインタ型となる。
--
bsearch()
int (*COMPAR)(const void *, const void *)
qsort()
int (*COMPAR)(const void *, const void *)
atexit()
void (*FUNCTION)(void)
>>682 同じような認識でいいよ
引数や返り値の型が一緒なら一緒だし違えば違う
686 :
682:2011/03/02(水) 14:43:08.81
みなさんどうもありがとう。
基本的には、同じような認識で、厳密に言うと違うということなんですね。
しかし、構造体名や関数名がちがうだけで、別の型になってしまうんですね・・
メンバや引数が全く同じなら同じとしていいようにも思えてしまうんですが(素人考えでは)
Cでは、本当に細かいところまで厳密に定めてある部分が多々ありますね。
ようやく、Cのちょっと深い部分までわかるようになってきました。みなさん、回答ありがとうございました。
とくに、
>>683さん、細かいところまで丁寧に解説してくださって、ありがとうございました。
>>686 構造体にはタグ名があるからそれが違えば違う型だけど、関数にはタグ名はないからプロトタイプが一致すれば同じ型だよ。
>>685 何がどう違うのか判るようなコードを頼む。
ID無い板で熱くなるなよ
>>687 > 関数へのポインタはA関数とB関数がある場合、A関数へのポインタの型とB関数へのポインタの型はちがいますか?
違うよ。 コード書いてみれば?
> それとも同じ関数ポインタ型なんですか?
違うよ。 コード書いてみれば?
> 構造体Aへのポインタと構造体Bへのポインタが違う型という認識と同じような認識になるんでしょうか?
違うよ。 コード書いてみれば?
どのQに対するAなのか曖昧ですよね
スルースキルを養いましょう
>>689 ちげーよw687が自分に対するレスと勘違いしただけだろw
690=神
神は句読点にwを使うんだ
疑問符の間違いだろw
神だからね
マックミランだからね
紙ですから
そしておまえらは数年後に髪に見放されつつあることを知る…。
while(0) printf("髪生えてキタ━(゚∀゚)━!");