キーボードから文字をCtrl-Dで終了するまで読み取り、
アルファベット、数字、その他に分類してそれぞれの数を数えて、
表示するプログラムを作る方法を教えてください。
改行文字も「その他」で数えます。
宿題がでたか?
3 :
仕様書無しさん:2001/07/02(月) 18:26
>>1 板違いの単発質問スレッドを立てるような低脳には
まともに教えても付け上がるだけで有害無益
板の空気を読んで出直せ!
5 :
仕様書無しさん:2001/07/02(月) 18:30
>>1 多分、何も知らない人のネタだと思うが、
それCだけの問題じゃないだろう
なんかK&Rの練習問題を、誰かがUNIX用にひねった
という感じですね。
環境は?
まぁ、K&Rみたいにやるなら
getchar()だね。
>>1 全スレッドの全過去ログよんでから、ここに来い
#include <stdio.h>
int main()
{
char s[1024];
int i;
int alpha_cnt=0, digit_cnt = 0, else_cnt=0;
gets(s);
for (i = 0; i < strlen(s); i++) {
if (isalpha(s[i])) {alpha_cnt++;}
else if (isdigit(s[i])) {digit_cnt++;}
else {else_cnt++;}
}
printf("alphabet:%d digit:%d else:%d\n", alpha_cnt, digit_cnt, else_cnt);
}
宿題が出たんです・・・・。
10 :
:2001/07/02(月) 18:34
>8
返事嬉しいのですが、while文かfor文を使ったプログラムを
教えてくれたら嬉しい限りです。
11 :
仕様書無しさん:2001/07/02(月) 18:34
>>8 なんかある意味すごいな。
でも、それ・・・、
まぁ、いいや!
13 :
>8:2001/07/02(月) 18:35
改行文字について考えました?
>>10 低脳の上に文字が読めない様だ...
それとも全角の「while文かfor文を使ったプログラム」
をC言語で書いて欲しいのか?
俺の仕事代わりにやってくれるなら解きましょう。
17 :
:2001/07/02(月) 18:37
void mainなんたらかんたらを使うプログラムじゃないと
先生に出せません。初心者です。
18 :
>8:2001/07/02(月) 18:37
getsの仕様は? 考えましたか。
>>13 考えてないよ。
だって、
>>1の答えじゃないもん(藁
それから
>>1よ、gets()は使うんじゃないぞ。
>>8はこんなプログラムを書いてはいけないという見本。
実際、単に教えるって本人の為にならないと思われ
っていうか、宿題を考える前に、ものを考えるってことはどういうことかを
認知すべき
21 :
:2001/07/02(月) 18:38
>15
なんですか?その仕事???
ガッコの宿題で、ちゃんとしたキー入力処理を求められるわけ無いじゃん
>>8 で正解
23 :
>19:2001/07/02(月) 18:41
了解。
>>22 いや、
>>8は「リターン」でプログラムが終わってしまうという致命的なバグが。
>>8は、しろーとじゃないのか?
isdigitやisalphaは、ctypeがいるだろ?
しかも仕様に合ってないしな。
大体この程度のもんなら、高校の教科書見ながらやればできるだろ?
>>24 「それはgets()の仕様」ってことでいいじゃん
宿題の要点は、for while の使い方
> 改行文字も「その他」で数えます
しっかし、こんなヴァカ厨相手に、なんでこんなにむきになってんだよ(w
29 :
:2001/07/02(月) 18:45
馬鹿だからおしえて!!!!!
馬鹿だから氏んでくれ!!!!!
32 :
仕様書無しさん:2001/07/02(月) 18:52
#include <stdio.h>
void main(void)
{
int c,b=0,n=0,etc=0;
for(;;)
{
c=getchar();
if ('a'<=c&&c<='z'||'A'<=c&&c<='Z')
{
b++;
}
else if('0'<=c&&c<='9')
{
n++;
}
else
{
etc++;
}
}
printf("アルファベットは%c個です。\n",b);
printf("数字は%c個です。\n",n);
printf("その他は%c個です。\n",etc);
}
こんなんどうすか?
33 :
:2001/07/02(月) 18:53
>25
それがわかんないんです
34 :
1:2001/07/02(月) 18:53
えーと、ターゲットはEBCDICを使ってるんですが・・・。
35 :
d?l:2001/07/02(月) 18:55
死んでくれのはずが氏になってる!!1
氏ねよ。
37 :
:2001/07/02(月) 18:57
氏にます
38 :
d?l:2001/07/02(月) 18:57
kukuku
39 :
:2001/07/02(月) 18:59
っていうかー、お前らわかんねぇんだろ?(核爆)
もう一回学校行きなおせや!!!(ぷ
Ctrl-Dで終わるっつーのがやっかいだね。Unixの場合。
41 :
仕様書無しさん:2001/07/02(月) 19:12
>>39 自分の思い通りにならないからと言って、相手のせいにするような
子供はいらん!な。
42 :
仕様書無しさん:2001/07/02(月) 19:31
はよ教えれ。
43 :
仕様書無しさん:2001/07/02(月) 19:42
そんくらい自分で数えろ
>>17 「void main」で書けと言われたのか?
教師のレベルも低そうだな。
今日はもう帰るから相手してらんないよ。
46 :
仕様書無しさん:2001/07/02(月) 20:21
無限ループのなかでgetCharを使えべきではない。
47 :
仕様書無しさん:2001/07/02(月) 21:34
って言うか、早く教えなさい。
期限は明日なのれす。
48 :
仕様書無しさん:2001/07/02(月) 22:02
>>44 void mainだろうが、int mainだろうがどうでもいいと思われ。
そんなことをグチグチいってる言語ヲタの方がアホ。
49 :
仕様書無しさん:2001/07/02(月) 22:12
でも教師がそのレベルじゃまずいだろーよ。
51 :
仕様書無しさん:2001/07/02(月) 22:28
だれかWindows版をMFCとかで書いてやれよ
先生なんてそんなもんだろ。
54 :
げんごちゃん:2001/07/02(月) 23:19
C言語の読解力をつけるためには、何したらベストですか?
55 :
:2001/07/02(月) 23:21
57 :
を?:2001/07/02(月) 23:30
while( *a++ = *b++ );
↑これって、何ですか?
何かの暗号ですか?
>>54 (1)Cコンパイラを書いてみる。(PASCALとかで)
(2)Cコンパイラの吐いたオブジェクトコードを研究する
62 :
仕様書無しさん:2001/07/03(火) 00:27
>57
新入社員ですが、whileでポインタ加算ですか?
でも、いつループを抜けるんだ?
63 :
仕様書無しさん:2001/07/03(火) 00:29
んー…
代入式の評価は常に真じゃなかったっけ?
64 :
仕様書無しさん :2001/07/03(火) 00:30
どうせ卒業してもお前みたいなぐうたらに職はない。
宿題はしなくていいから退学せよ。
66 :
仕様書無しさん:2001/07/03(火) 00:50
デニスリッチ−C言語学校へ逝けば?
67 :
仕様書無しさん:2001/07/03(火) 00:54
>58
が、ある意味正しいと思う。
初〜中級者に読みにくいような、自己満足ソースは駄ソ−スだろ。
なんでもかんでもポインタを使って省略して書けば良いってもんじゃない。
a[i]=b[i];でループ回した方が、何倍もわかりやすいと思うが?
いくらK&Rに載ってるからって、全て正しいとは限らんと思うぞ。
>> 57
K&R 2nd P105-P106 SECTION 5.6の
strcpy pointer version ver3.0
の焼き直し
69 :
>67:2001/07/03(火) 00:58
ある意味同感。
でも、読めないと困る。ってこともあるね。
>>67 あんなソースは、中級者くらいの知ったかぶりが書くソース。
だが、
a[i]=b[i];
と書くと、
ポインタと配列は意味が違うのでダメ。
strcpyがあるから、あんなソースかく必要ないがな。
71 :
仕様書無しさん:2001/07/03(火) 01:44
>>70 厳密にはmemcpy
strcpyには、NULLチェック入ってるよ
72 :
71:2001/07/03(火) 01:45
ごめん、撤回
氏んできます
73 :
仕様書無しさん:2001/07/03(火) 10:17
>>67 あの程度ならCの「定石」とか「慣習」のうちじゃないの?
>>70 a,bがcharのポインタとは限らないのでstrcpyじゃだめだ。
74 :
15:2001/07/03(火) 10:53
データベースAのテーブルaより、
フラグカラムXがTである行のINTカラムYを取り出し
Yを元にデータベースBのテーブルbより、CHARカラムZを取り出す。
そのZはあるファイルのある場所であり、
「サーバ名\フォルダ名\ファイル名」という形式になっている。
Zに記されたファイルをこのプログラムが起動されているホストに転送せよ。
なお、転送するファイルはLHAにて圧縮されているため、
転送と同時に展開することが望ましい。
これらの流れをあと半日でCで作ってくれ
>>1。
char stmt[1024];
char to_path[1024];
char *uri;
int db, rowset, ret;
db = db_connect();
stmt = "select z from B.b as b, A.a as a where a.X = 'T' and b.Y = a.Y";
rowset = execute_sql(db, stmt);
uri = get_data(rowset, 0);
ret = ftp_get(z, to_path);
ret = expand_lzh(to_path);
>>74 つうか、ちゃんとした仕様があれば、2,3時間で出来るんじゃねーの?
77 :
15:2001/07/03(火) 12:59
>>74-76
うぇーん、ネタにマジレスされたモナー
 ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
∩_∩
( ´Д⊂ヽ
⊂ ノ
人 Y
し (_)
78 :
仕様書無しさん:2001/07/03(火) 16:20
79 :
15:2001/07/03(火) 18:25
>73
悪い慣習デス。
あれを「読める」必要はありますが、バシバシ書いてるようじゃ、
オナニーソースだろうね。
81 :
70:2001/07/03(火) 23:26
>>73 a,bがchar *とは限らないっていうツッコミはあると思っていたよ。
だが、0までのループで代入っていうことは、文字列だろうと推測される。
unicodeのような8ビットcharではない文字の文字列だからといって、
strcpyのような関数がないわけではない。
例:wcscpy
結局は、あんなソースは書かなくていいってことだ。
82 :
仕様書無しさん:2001/07/04(水) 00:34
>>80 じゃあperlの
while(<>)
もおなにーだね。
どぴゅ
83 :
仕様書無しさん:2001/07/04(水) 05:32
あれは駄目駄目、これは駄目駄目、うるせーよ馬鹿!
84 :
仕様書無しさん:2001/07/04(水) 08:36
クレヨンしんちゃん♪
85 :
}:2001/07/04(水) 08:55
------------ 終冬 ------------
86 :
仕様書無しさん:2001/07/04(水) 09:06
87 :
:2001/07/04(水) 09:27
88 :
:2001/07/04(水) 09:32
>>87 そうですか。てっきり終という字を幅広にしようとおもって
失敗したのかと思っておりました。------- 糸冬 -------
89 :
仕様書無しさん:2001/07/04(水) 09:58
>>81 終端マークとしてヌルが入っている、ポインタの可変長配列かも
しれんぞ。
シグナルハンドリングはどうするの?少なくともSIGTSTPは殺さにゃいかんね。
>>1 には荷が重いね。
91 :
1:2001/07/04(水) 10:25
え?
コントロール+DでEOFが発生を暗黙のうちに仮定して
いるだけじゃないの?
入力ストリームの終わりの検出な。
UNIXだったら素直に書けると思うけど。俺が馬鹿なん
だな。
ごめん。
コントロールC, コントロールZ はどうすんのよ。
93 :
仕様書無しさん:2001/07/04(水) 11:36
実行時に端末モードをrawに設定すれば良いだけのこと。
終わったら元に戻すのを忘れるなよ。
stty(1)とstty(3)が参考になるじゃろう。
rawモードねぇ。
異常終了ではまりやがれ。by 厨房
stty sane^J
すばらしい。
複数プロセスのstdio をソケットにつなぎ通信を行うプログラムを作成したときに、
rawモードを設定するとかなり大変だったのですが、
sttyをみれば簡単にできそうですね。
いや全く、お恥ずかしい。。。。。
97 :
学生A:2001/07/04(水) 15:11
>>1 提出期限過ぎたかもしれんが、一応回答。
Cで描いたハズ
#include<stdio.h>
char *m[]={"others\t","number\t","alpha\t"};int t
[]={0,0,0};char c[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
,2,2,2,0,0,0,
0,0,0,2,2,2,2
,2,2,2,2,2,2,
2,2,2,2,2,2,2
,2,2,2,2,2,2,
2,2,2,0,0,0,0
,0,0,0,0,0,0,
0,0,0,0,0,0,0
,0,0,0,0,0,0,
0,0,0,0,0,0,0
,0,0,0,0,0,0,
0,0,0,0,0,0,0
,0,0,0,0,0,0,
0,0,0,0,0,0,0
,0,0,0,0,0,0,
0,0,0,0,0,0,0
,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,};main(){int i;char b[1024];while(
fgets(b,1024,stdin)){for(i=0;b[i];++i){++t[c[b[i]]
];}}for(i=0;i<3;++i){printf("%s%d\n",m[i],t[i]);}}
98 :
学生A:2001/07/04(水) 15:12
あちゃ。実際に描き込むとズレるね。
Cの形にしたつもりだったんだけど。
それぢゃ逝って来ます。
99 :
1:2001/07/04(水) 15:33
> コントロールC, コントロールZ はどうすんのよ
別にどうもしなくてもいいのでは?
コントロール+Dで入力の終了を感知するまで、
入力データを配列にためて、入力終了後出力する
という練習問題だからさ。
って、環境を限定せずに言ってもむなしいけど。
100 :
1:2001/07/04(水) 15:35
s/入力データを配列にためて/カウントして/g
>>101 100の意味は置換なので、配列必要なし。
紛らわしく書いてゴメン。
>>99 だから、rawモードが必要だと逝っているだろうがゴラァ。
104 :
仕様書無しさん:2001/07/04(水) 16:54
必要ないと思うけど
105 :
93:2001/07/04(水) 23:20
104はダム端末以下のよっぽどチープな環境が好きとみえるのう。
重ねて聞くがstty(1),stty(3)は調べたのじゃろうな。
ちなみに104の端末でstty -aを実行した結果はどうなっておるのじゃ?
なんか外れてるな。
C言語初心者の練習問題でしょうに。構造体すら習ってないような。
環境設定は教える方の責任で、この場合なら、eofが^Dになってれば
いいだけジャン。じじつ、たいていの環境ではそうなってるしね。
ストリームからの入力を仮定することで、このレヴェルの初心者を
混乱させないってどけのことでしょ。
105さんは、ひょっとして
で、^Z,^Cにこだわってる?
それなら答えは簡単で、対応する必要なし。
出題者の狙いからしてその必要はないと思う。
108 :
93:2001/07/05(木) 00:17
>>107 バックスペースのことを忘れてはおらんか?
>キーボードから文字をCtrl-Dで終了するまで読み取り
1の仕様だとバックスペースによって消されたはずの文字も
カウントに入れねばならん。
忘れてないよ。
出題者が、入力にストリームタイプ入力を仮定していたら
その必要なし。それくらいわかるよね。で、多分そうして
るよ。ま、せめて改行くらいは勘定してよと言う話でしょ。
1は。出題者が、初心者に向かってぜひ、BSも勘定しろと
いうなら、そのときはやってもいいけど。
特定OSでrawモード何たらを教えなきゃ一般的なC言語の初歩も
教えられないのかな。そう言う仮定は最小限でいでしょ。例えば
入力の終わりは^Dとすると、かさ。
もっと、言うとK&Rの1.6の配列の頭のサンプルプログラム
をいじったようなので出題者は納得すると思うよ。
111 :
なぞだし〜:2001/07/06(金) 00:40
pのポインタをp[i]で扱うのって、分かりやすくて楽なんですけど、
これってだめなんすか?
やっぱり*(p+i)やp++とかってしないと、ヴァカにされるんですか?
でもp[i]だって、ポインタでしょ?
その書き方でOKだよ。
いちいち括弧付きで*使うのがばかばかしいから[]使っていいのだ。
>>111,112
char buf[100];
char *p;
の場合、
buf[i]、p[i]はどちらも参照できる。
p++はOKだがbuf++はできない。
分かる?
ちなみに、p[i]と*(p+i)は同じだ。
そんなことを言ってるわけではない。
きみの日本語読解大丈夫?
主語を曖昧にして書いたの、わるかったよすまん。
反省している。
あ、また主語抜いた。
あぁ。よかった〜。[]でもいいんだ〜。
*でかけね〜と、プログラマじゃねぇ・・・みたいな感じだったから〜。
*で書かれているソースでも読むには読めるんだけど、
自分は基本的に添字演算子マンセーなもんで、*(p+i)って書くのが
苦手だったりします。アローも好きだったりします。
buf++が出来ないってのくらいは、重々承知しておりまするヨ〜。
118 :
おしえてん:2001/07/09(月) 23:24
ヴァカなもんで、ポインタ関連ではまっておりまする〜。
某誌に載ってた、配列のポインタがよくわからないんですぅ〜。
001 int umyu[3];
002 int (*umyu_p)[3];
003 umyu_p=&umyu;
で、なんで001行と002行の[3]の数値を合わせておかないと、
003行でコンパイルエラーになるのかが・・・はて???
でも配列のポインタって、
char *hanya[]={ "cc", "sakura", "moe" };
ってやると、上記みたく数値合ってない、配列のポインタが出来てますよね〜?
あぁ〜混乱してる〜。助けてくださいまし・・・。
002は配列のポインタではない。
つか
>char *hanya[]={ "cc", "sakura", "moe" };
って自分で書いてるじゃん。
002は意味的には2次元配列。
120 :
仕様書無しさん:2001/07/09(月) 23:32
>>118 それぞれの文字列が性的領域に取られて、そのそれぞれの
先頭アドレスが代入されるの。
この配列の初期値はアドレスの羅列と同義なの。
おわかり?
003はそれでいいの?
思惑とあってる?(&のことです)
123 :
おしえてん:2001/07/09(月) 23:51
早々なレス、ありがとぅですぅ〜。
上側の例だと、umyu_p[3][3]として、データにアクセスできますよね?
だとしたら、umyu_p[2][3]は、なぜ出来ないのかなぁ〜と。
コンパイルエラーの理由が良く分かってないんです〜。
たぶん、ショボイ勘違いか何かかと・・・。
hanya[3][7]は、定義ですると出来て、どうなってるか
っていう、概念的なものは、分かっているつもりなのですが・・・。
で、ナニしたいか・・・と言われても〜。
配列のポインタは押さえとかないと、まづいかなぁ〜と思ったり。
ぜんぜん押さえてないから安心しろ。
配列のポインタじゃなくてintを指すポインタの配列じゃねぇの、これ?
俺が馬鹿なのかな。
これでコンパイルできたけど?
(コンパイラはBCCとGCC)
int main()
{
int umyu[3];
int (*umyu_p)[3];
umyu_p = &umyu;
return 0;
}
002は”配列へのポインタ”であって、”ポインタの配列”じゃ無いから一次元では。
根本的な勘違いだと思うが、どうか。
128 :
仕様書無しさん:2001/07/10(火) 00:08
こういうのは内側から交互に読んでいくんだ。
int (*umyu_p)[3];
は
umyu_p is a pointer to array which has 3 elements of integer.
だから配列へのポインタだ。
131 :
おしえてん:2001/07/10(火) 21:16
ん〜。なんとなくですが、
配列のポインタとポインタの配列は、違うものだ・・・という認識で
よろしぃ〜んでしょうか?
>>131 int *umyu_p_array[3];
int (*umyu_p)[3];
printf("%d\n", sizeof(umyu_p_array));
printf("%d\n", sizeof(*umyu_p_array));
printf("%d\n", sizeof(umyu_p));
printf("%d\n", sizeof(*umyu_p));
やっとけ
秘伝 C言語問答 ポインタ編 柴田望洋著 2400円 SOFTBANK BOOKS
がお勧め。
ちなみに私、入社4ヶ月目に上司に個室に連れて来られ
「君、センスないから会社辞めなさい」だと・・・
まいった・・・ 転職先どうしよう (T_T)
やっていたのはVCでのC、C++言語。
>>134 良かったね。上司は幹部社員ですか?
会社都合で退職できますよ。その上、「能力なし」では労基局の認定する
解雇理由にはなりませんので、裁判を起こしても勝てますよ。
自分から、「辞めます」といわないこと。辞表を書かないこと。
の2点に注意し、必要なら、解雇という文字を入れた文書を
持っておくことですね。
文書は何でも良いです。
○○○付け解雇のため、社章、社員証、健康保険証を返却いたしました。
というものを、上司に、「返却した後で、紛失されたら困りますので、
認印をください。」ともらっておいてください。
上司が法律をわかっていそうなら、同僚等に、
「上司と話もしたくないので、お前から上司に返してくれない。
後で面倒になったらいやなので、お前の署名をしておいてくれ。」
といってもらっておいてください。後は楽しい結果が期待できます。
136 :
仕様書無しさん:2001/07/11(水) 23:52
うーむ……センスがナイ人間が業界にいると言うだけで、俺らに禍が降りかかって来るという事を135jは認識してるんだろーか。
最初の段階で辞めさせるのが正解では。
139 :
仕様書無しさん:2001/07/21(土) 13:49
おめーら、素数かどうか判定するプログラムつくれ!
おねがい(藁
#include <stdio.h>
int main(void)
{
printf("自分で作らんかい\n");
return 0;
}
141 :
仕様書無しさん:2001/07/21(土) 14:15
#include <stdio.h>
void main(void)
{
printf("そこをなんとか…");
}
142 :
仕様書無しさん:2001/07/21(土) 14:18
#include <stdio.h>
#define main どうにもならん
#define void どうにもならん
#define printf どうにもならん
どうにもならん どうにもならん(どうにもならん){
どうにもならん("どうにもならん");
}
143 :
仕様書無しさん:2001/07/21(土) 14:23
#include <stdio.h>
void main(void)
{
printf("できるんだったら馬路おねがい!");
}
144 :
仕様書無しさん:2001/07/21(土) 14:28
class Baka{
public:
145 :
仕様書無しさん:2001/07/21(土) 14:30
// i が 2,3,5,7,11 で割り切れないなら i は素数だ。
10 モシ x=ソスウ ナラバ 40 ニイケ
20 カケ "ソスウジャネー"
30 50 ニイケ
40 カケ "ソスウダ"
50 シネ
147 :
仕様書無しさん:2001/07/21(土) 14:35
while使うらしい
148 :
仕様書無しさん:2001/07/21(土) 14:43
#include <stdio.h>
#define is_sosu(i) (i%2&&i%3&&i%5&&i%7&&i%11)
int
main()
{
if(is_sosu(97))
printf("YES\n");
else
printf("NO\n");
}
149 :
仕様書無しさん:2001/07/21(土) 14:46
13とかは?
while使いたいんだけど。
150 :
仕様書無しさん:2001/07/21(土) 14:50
//ここまでクラスBaka
};
151 :
仕様書無しさん:2001/07/21(土) 14:52
152 :
仕様書無しさん:2001/07/21(土) 15:17
tasukete
153 :
仕様書無しさん:2001/07/21(土) 18:55
154 :
仕様書無しさん:2001/07/21(土) 19:26
100までなら2,3,5,7だけでいいぞ。
156 :
仕様書無しさん:2001/07/22(日) 04:43
>>142 ???????????????????
157 :
仕様書無しさん:2001/07/30(月) 06:43
158 :
仕様書無しさん:2001/07/31(火) 21:12
main(){
for(;;)
printf("てかさーいいじゃん他人の事なんて\n");
}
160 :
仕様書無しさん:2001/08/22(水) 07:00
あげ2
あげ荒らしクン暗躍中
162 :
:2001/08/24(金) 15:19
プログラム板が使えないのでこちらで質問
163 :
:2001/08/24(金) 15:21
struct test{
int iData:4;
};
この:4;
ってなんですか?
164 :
:2001/08/24(金) 15:22
この表現方法始めて見たんだけど何が行われてるのかさっぱり解りません。
4で初期化されるのかと思ったらそうでもないようで・・・・
>>164 キーワード:ビットフィールド
あとは検索エンジンにでも聞いてくれ
ビットフィールド
ああん
かぶった
すまぬ
168 :
:2001/08/24(金) 15:31
どうも。これから検索します。
って検索してみたけど難しそうですなぁ・・・・
piza2 がdj・・・
そしてネタを求めてここへ・・・
170 :
仕様書無しさん:2001/08/24(金) 15:48
ビットフィールドの指定って、
メモリの有り余っている現代に必要あるんですか?
その余ったメモリを私のコアメモリマシンに分けてください。
ちいさなことからこつこつと
173 :
仕様書無しさん:2001/08/24(金) 18:11
>>170 メモリマップドI/Oのビットの立て降ろし。
>>170 メモリは余っていてもレジスタはそうでもない。
ある程度ローレベルな制御をする時に
共有体、構造体、ビットフィールド、#pragma pack
等を組み合わせてピッタリと理想的な形になる事もあります。
普通のアプリ作っている分にはあんまし使わないかもです。
175 :
仕様書無しさん:2001/08/24(金) 23:22
struct kouzou{
  int a:3;
  int b:5;
  int c:20;
  int d:4;
};
ってあった時
kouzou.b = 5;
printf("%d",kouzou.b);
ってしてもゴミが入ってたら
5にはならないんですよね?
それともprintfがkouzou.bは5ビットだって判断してくれて
5を表示してくれたりするのですか?
>>175 なにもかも見当違いに見えますが…
まず何がしたいの?
177 :
仕様書無しさん:2001/08/24(金) 23:46
え?見当違いですか?(汗;
このソースはテスト用のもので意味はありません。
ようするに
printf等の関数は&(kouzou.b)から32bit(1 int)のフィールドを見て
intとみなすんですよね?特に5bitで1つのデータとして判断してくれませんよね?
178 :
仕様書無しさん:2001/08/25(土) 00:20
>>177 微妙に意味がわからないのですが。
printf自体は5bitでうんぬんを判断しないと思います。
ビットフィールドを名前つきで指定しているので
Cの仕様というかコンパイラが判断しています。
(もしかしたらちょっと違うかも)
ちなみにビットフィールドの値が順番どおり(下位から上位とか上位から下位)
格納されるとは限らず、コンパイラの実装に依存するはずです。
(普通のコンパイラは順番にセットすると思いますが。)
またビットフィールドの要素に対して&等をつけてメモリアドレスを取る事は出来ません。
(メモリアドレスの単位がずれるので)
>>175の人が「見当違いに見える」と言っているのは
5bitの領域に対して、5を代入しているので。
>それともprintfがkouzou.bは5ビットだって判断してくれて
>5を表示してくれたりするのですか?
の発言が、
「kouzou.bの値を表示してくれるのですか?」
「kouzou.bは5bitとっているので、5(領域数)を表示してくれるのですか?」
の二つの意味に取れるからでわないかと
一応今VC++6.0の混合モードで軽く確認してみました。
andで指定ビットを抜き出してからprintfをcallしています。
>「kouzou.bの値を表示してくれるのですか?」
>「kouzou.bは5bitとっているので、5(領域数)を表示してくれるのですか?」
>の二つの意味に取れるからでわないかと
確かに誤解を受けるのが当然な特殊なケースを挙げてしまいました。
私が意図したのは前者です。
質問しなおさせてもらうと
struct kouzou{
int a:3;
int b:5;
int c:20;
int d:4;
};
ってあった時
kouzou.b = 7;
printf("%d",kouzou.b);
ってしても
int c:20;
int d:4;
等の領域にゴミが入ってたら(ビットが立っていたら)
7にはならないんですよね?
という事です。
>ちなみにビットフィールドの値が順番どおり(下位から上位とか上位から下位)
>格納されるとは限らず、コンパイラの実装に依存するはずです。
>(普通のコンパイラは順番にセットすると思いますが。)
私の環境(win2k+gcc と Linux+gcc)は共に順番にセットされてました。
>>180 >andで指定ビットを抜き出してからprintfをcallしています。
え゛?そうなりましたか?(汗;
私の環境では1回予期せぬ値が出てしまいまして・・・・
他のミスだったのかもしれませんが・・・
これから再テストしてみたいと思います。
結果は明日にでも報告します。
お手数かけてすいません。
>てんさいぷろぐらまぁ
私も勘違いしていました(汁
フォローサンクス
>ちなみにビットフィールドの値が順番どおり(下位から上位とか上位から下位)
>格納されるとは限らず、コンパイラの実装に依存するはずです。
これは、CPUアーキテクチャに依存します。ちなみにインテル系は下位から上位に
なっています。(ご存知でしょうけど)
CPUアーキテクチャが違う物に対して同じソースを適用することがあるんで
ビット関係を多用すると移植沙汰になったとき地獄を見ることがあるので
極力使わないほうがいい。
あとそれと、実験したらすぐ分かることを掲示板に安直に書かないことを
お奨めします(汗
>>183 重要:以下結構あいまいな記憶なんで話半分でお願いします(にょ)
出来れば数多くのCPUとコンパイラを制覇し、
尚且つANSI-C互換コンパイラ作成をした事のある方等
フォロー、ツッコミ等してくれると助かります。
>これは、CPUアーキテクチャに依存します。ちなみにインテル系は下位から上位に
>なっています。(ご存知でしょうけど)
これはエンディアンの事を言っていると思うのですが、
エンディアンとは別問題としてビットフィールドの配置法が
(エンディアンによる物理配置の前段階で)
コンパイラの実装依存だったような気がしまス
ANSI規格では
「同型が並ぶ場合連続して配置」
とかは決まってたような気がするのですが、(前の書き方チョット間違ってました(汗))
LSBから MSBからとかは決まってないような気がします。
ついでにCの構文解釈の違い等でコンパイラ別で違いがでしたような。
struct hoge{
// unsigned は16bitとしまス
unsigned int n1 : 1;
unsigned int 15;
};
struct hoge BField;
BField.n1 = 1;
のレイアウトがコンパイラによって
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
と
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1と変わったり。
(ダミー領域を前に入れるか、見た目どおり後に入れるか)
一言で言うと、
>>183さんのおっしゃる通り、あんま使わない方が良いって事かな?
うーん・・・・・寝よう(泣
>>てんさいぷろぐらむぁ(偽)さん
本当にお手数かけてすいません。
まずお詫びします。
>私の環境では1回予期せぬ値が出てしまいまして・・・・
これは私のミスでした。恥じかきついでに内容を申しますと
struct hoge{
&npsp&npspint a1:2;
&npsp&npspint a2:4;
&npsp&npspint a3:26;
};
としてa1は2ビットあるから0〜3が入れられると判断・・・・
hoge.a1 = 3;
それでprintf("%d",hoge.a1);で3を期待しているのに-1が・・・・・
もう多くは語りません。int 型でした・・・・・・
わたしのつまらない間違いで本当にお手数をおかけしました。
でもおかげさまで私はとても勉強になりました。(汗;
ありがとうございました。
>ANSI規格では
>「同型が並ぶ場合連続して配置」
>とかは決まってたような気がするのですが、(前の書き方チョット間違ってました(汗))
>LSBから MSBからとかは決まってないような気がします。
そしてここが最終的に1番知りたいところでした。重ね重ねありがとうございます。
修正
struct hoge{
&npsp&npspint a1:2;
&npsp&npspint a2:4;
&npsp&npspint a3:26;
};
修正後
struct hoge{
  int a1:2;
  int a2:4;
  int a3:26;
};