1read 100read
2012年5月プログラム16: C言語なら俺に聞け(入門編)Part 101 (1001) TOP カテ一覧 スレ一覧 2ch元 削除依頼
魁け! Ruby 1.9.X (293)
C++11/C++1y 15 (284)
Ruby最高や! (191)
クラス名・変数名に迷ったら書き込むスレ。Part21 (485)
P2P型の完全匿名掲示板はまだ出来ないの?その2 (691)
制御系なら俺に聞いてもいいぜ(10) (489)

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


1 :12/05/04 〜 最終レス :Over
C言語の入門者向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 100
http://toro.2ch.net/test/read.cgi/tech/1333108892/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 157代目
http://toro.2ch.net/test/read.cgi/tech/1335517816/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
長くなりそうなコードはcodepadに貼り付けてもいいでしょう
http://codepad.org/
http://ideone.com/

2 :
すみません。教えてください。
mikrocというコンパイラを使ってPICマイコンで電子工作をしてるのですが、
指定した桁の値を取り出すにはどうすれば良いのでしょうか?
例)x = 12345;という変数の中の値を、a = 1;b = 2;c = 3;d = 4;e = 5;
というように取り出したいです。
C言語についてはPICで遊ぶために0からのスタートでして、ほぼ初心者です。
よろしくお願いします。

3 :
>>2
取り出したい桁を右からn桁目とすると
「(n-1)回、10で割った整数」を10で割った際の余りを求めれば良い

4 :
>>2
>>3のやり方が正攻法だと思う。
バッファを余計に使って良ければ、sprintfを使うのが簡単かな。
char buf[10];
int x = 12345;
sprintf(buf, "%d", x);
これで、buf[0]: 1, buf[1]: 2, buf[2]: 3, buf[3]: 4, buf[4]: 5
となります。

5 :
ビットフィールドへのポインタを関数に渡したいです。
しかしポインタのアドレスはバイト単位であり、
無理だということが分かったのですが何か良い方法は無いでしょうか?
なぜこんな事がしたいかと言いますと、とびとびの複数のビットフィールドに対し
同じ処理を行いたく冒頭の事が出来ないか試行錯誤していました。
ご助言頂けると嬉しいです _ _

6 :
>>3>>4さん!
とてもわかりやすい回答ありがとうございます。
早速実験してみます!

7 :
>>5
同じ処理がしたいのならやればいいじゃん。
どうしてもポインタが必要な処理なの?
もうちょっと具体的に状況を書いてみて。

8 :
>>7
レスありがとうございます!状況としてはマイコンの制御のためにコードを書いています。
具体的には以下の処理を行いたいです。
// 空行まで変数の宣言です。
struct bit {
 unsigned b0: 1;
 unsigned b1: 1;
 unsigned b2: 1;
 unsigned b3: 1;
 unsigned b4: 1;
 unsigned b5: 1;
 unsigned b6: 1;
 unsigned b7: 1;
};
union port {
 struct bit bit;
 unsigned char byte;
};
volatile union port *p2 = (union port *)0x00E4;
unsigned char sw2_before = 1, sw3_before = 1;
if(sw2_before == 0 && p1->bit.b7 == 1)
 p2->bit.b4 ^= 1;
if(sw3_before == 0 && p1->bit.b3 == 1)
 p2->bit.b5 ^= 1;
ですが、現状だとご覧のように同じようなコードが二回繰り返されているので
これを関数として抜き出したいんです。(空行以降の部分です。)

9 :
>>8
マクロで書けばいいんじゃね?
仮にビットフィールドへのポインタが有りだとしたらどんなコードを書く?

10 :
>>9
ありがとうございます!マクロですか、余り使ったことなかったのですが調べてみます!
仮にビットフィールドへのポインタが有りだとしたら以下の様にしたいです。
void led_toggle_switch(unsigned *led: 1, unsigned char before, unsigned char after) {
 if(before == 0 && after == 1)
  *led ^= 1;
}
led_toggle_switch(&p2->bit.b4, sw2_before, p1->bit.b7);
led_toggle_switch(&p2->bit.b5, sw3_before, p1->bit.b3);

11 :
ビットフィールドを使わずに、ビット演算でやれば似たようなことはできるね。

12 :
>>10
bit位置を示す引数をもう一つ追加。
ledはビットフィールド変数ではなく、byteの方にすれば、
void led_toggle_switch(
unsigned *led: 1,
unsigned bitPos, // 1-7
unsigned char before,
unsigned char after)
{
if(before == 0 && after == 1){
*led ^= (1 << bitPos);
}
}

13 :
>>10
いえいえ

14 :
>>12
なるほど、こういうやり方もあるんですね・・・。全く思いつかなかったです・・・。
とても勉強になりました、ありがとうございます!
マクロも自分で書いてみました。スッキリ纏まって良い感じです!
#define LED_TOGGLE_SWITCH(led, before, after)\
if(before == 0 && after == 1) { led ^= 1; }
LED_TOGGLE_SWITCH(p2->bit.b4, sw2_before, p1->bit.b7);

15 :
ビットフィールドのレイアウトがどうなるかは未定義だし、
ビットごとに意味を割り当てるにしてもビットフィールドを使わないことが多いね。

16 :
もうビットフィールドなんて廃止したら‥‥‥

17 :
>>12
レスが付いた後だけど、今見返すと、第2引き数のコメント間違っているね。
誤)
unsigned bitPos, // 1-7
正)
unsigned bitPos, // 0-7

18 :
>>14
マクロ関数書くときは各引数を括弧でくくっておかないと、思わぬ動作をすることがある。
#define LED_TOGGLE_SWITCH(led, before, after)\
if(((before) == 0) && ((after) == 1)) { (led) ^= 1; }

19 :
>>14
いえいえ

20 :
随分とマトモな流れなんで、スレ間違えたのかと錯覚したわ。

21 :
まあオレのおかげなんだけどな、照れること言うなよな ははは

22 :
>>16
何で?

23 :
理解できないからだろ。聞いてやるなw

24 :
>>22>>23
>>16では無いのだが、ビットフィールドって処理系依存だからでしょ。
LSB、MSG並びと、宣言の順番がどうなるか、とか。
あと、ビットフィールドと共用体の合わせ技もよく使うが、
(>>8のportがまさにそれ)
共用体の一方で設定した値を他の型で読んだ時にどうなるかも処理系依存だったりする。

25 :
廃止する理由には見えないな

26 :
ビットフィールドはハードに依存した並びが必要ないときはどっち向きでも関係ない(1bitでフラグ的な使い方)
gccだとarchに依存したエンディアンで並び順は考慮でける
コンパイラによっては、並び順をオプション等で指定できるのもある
要は使い分けが出来るかどうか、ビットフィールド
ワケワカでやってハマったから、使えないっていう人がいるからね

27 :
0と1を入れるだけでも32bit変数を使うような時代にビットフィールドとか過去の遺物じゃないのかね

28 :
まさかCでやる全てが32bitのデフォだと思ってるのか?
今世紀最新の遺物だなお前
動く化石だ

29 :
>>27もよく解らんが、>>28の応じ方は輪をかけて解らん。

30 :
H8 の unsigned int は 16bit = 2byte
superH は 4byte

31 :
組込とかなら今でも現役だったりするのかね

32 :
ビットフィールドを絶対使えとかいってないでしょ
バカとなんちゃらは使いよう

33 :
そりゃそなんだけどさー、ビット演算とか、& | ~ でマスクかけてさくさく書いたほうが、結局楽じゃない?
I/Oのビットを立てたり下げたりするのって、普通こうするじゃん?
いや、C に 0xc6 表現以外にも 「0b11000110」とかあればもっといいんだけどさー。
この前、5bit ごとにデータをシリアル化したい、ていうお題がどこかであったけれども、そのときもビットフィールドを使いたいとか思わなかったなあ。
ここはビットフィールドじゃないとっ、ていうお題があるんだろうか?

34 :
書けるのに読めない人にはわからないことかも

35 :
bool型がどうしたって?

36 :
組み込みでは現役というか定石ですね。
マイコンメーカーが提供しているヘッダファイルにもバリバリ。

37 :
>>32
しかし、クズは使いようもないな。

38 :
>>33
いちいち定数切るのが面倒。

39 :
質問です
n個の配列を作りたいのですが、下のソースでは、int m[n];の行で
constant expected
と言われます。どうしたら良いでしょうか。
SHARPのPC-G850VSです。
main(){
int n = 2;
int m[n];
}

40 :
nはdefine定義しろよ

41 :
>>39
ANSI-Cでは配列宣言の要素数は定数でなくてはなりません。
int m[2];
と書きましょう。

42 :
ビット単位の操作が必要なケースでレイアウトを気にしないでいいケースっていうのはかなり稀だと思うんだよな。
まぁ、必要っていう人が居るなら要るんだろうけど、レアケースであることにかわりはない。
gcc と vc++ ではビットフィールドを配置する上位下位が逆ってことで一部のライブラリで問題が起こるってことも聞いたことあるし。
gcc にはオプションで vc++ に合わせるモードもあるんだけど、ライブラリとして使う性格上、他のライブラリとの兼ね合いで
一律に逆転してもまずいっていう。 具体的には gtk がそれ。
あと、久々に規格を見直していて気付いたんだけど、ビットフィールドはなるべく詰め込むことが must なんだな。
> 十分な領域が残っている場合、構造体内のビットフィールドの直後に続く別の
> ビットフィールドはは同じ単位の隣接したビットに詰め込まなければならない。
> 十分な領域が残っていない場合、入り切らなかったビットフィールドを次の単位に入れるか、
> 又は隣接した単位の境界をまたがらせるかは、処理系定義とする。
(JISX3010:2003 の 6.7.2.1 から引用)
ここで言う「単位」がバイトのことなのかどうかがわらないんだが、原文ではどーなってんだろ。
いずれにせよ >>8 のような1ビットが8個の状況では1バイトに連続して配置されることが保証されてる。
あと、ちょっと本質的じゃないがビットフィールドの変わり種の使い方として構造体の代入抑制がある。
幅ゼロで const なフィールドがあると代入できなくなるんだと。
struct A
{

const int : 0;
};
てな感じ。

43 :
DirectXでビットフィールドはバリバリ現役だったりする

44 :
で、貴様らは入門スレで何を話してるんだ
おっさんだろ

45 :
> ANSI-ANSI-Cでは配列宣言の要素数は定数でなくてはなりません。
c言語に限らずこういうのを他の言語でも見かけるが、これって何で?
>>39の例の方が柔軟で良さそうに思えるのだけど。

46 :
>>45
ローカル変数はスタックに取るのが普通だから、
コンパイル時に配置を決めてしまいたいんだよ。

47 :
>>36
んー。定石ですか。

48 :
>>46
配置を決めたいのが理由じゃねーよ。
隠れて何かしないってのがCのポリシーだからだろ。
決めなくても実現できるのはわかるよな。

49 :
つーか、c99なら普通にできるだろ。

50 :
前スレでも出たが制限はあるけどな。

51 :
質問おねがいします
for文の中で、下のように10倍、100倍、1000倍、10000倍のような計算を
変数”i ”を使って一つに纏める簡単な方法はありますか?
よろしくお願いします。
for(i = 1・・・
x = x * 10;
-----------ここから下を省略したい--------------------
x = x * 100;
x = x * 1000;
x = x * 10000;

52 :
>>51
この程度がわかんなかったら
後々の学業に支障をきたすレベル
有体に言えば脳障害と見間違う程にひどい

53 :
for (i = 1; i < N; i *= 10)
{
x = x * i;
}

54 :
i *= 10;

55 :
>>52
お前が脳障害だろ。
>>51
まず日本語を勉強しろ。

56 :
>>55
ホンモノの脳障害の糞詰まりのクソ野郎がお出ましかw
巣にこもってでてくんなアホ

57 :
>>52
ごめんなさいorz
プログラムのプの字も知らず、あるきっかけで数日前にC言語というものを触り始めたばかりですorz
>>53
ありがとうございます。
"i*"が味噌なんですね?
ちょっとやってみます

58 :
>>55
すみませんどこか日本語おかしかったでしょうか?

59 :
やりたいことと例示している内容が違ってる気がする
32bit整数だとオーバーフローしてるし

60 :
>>51
x = x * 10;
-----------ここから下を省略したい--------------------
x = x * 100;
x = x * 1000;
x = x * 10000;
をそのまま解釈すれば
x = x * 10000000000;
だが、お前がしたいこととは違うんじゃないのか?
日本語ができないならせめて元のコードを示せ。

61 :
>>59>>60
ああ、そういうことですか
100億なんて数字は使わないし、計算できないですもんね
本当はこうでしたすみません
x = x * 10;
-----------ここから下を省略したい--------------------
x = x * 100;
x = x * 1000;

62 :
だからそれならx = x * 1000000;
でいいだろが。

63 :
for (i = 10; i <= 1000; i *= 10)
{
x += (x * i);
}
こういうことだろうか

64 :
ここはこの程度と宣う>>52に自分が脳障害じゃないってことを示して欲しいとこだな。

65 :
やべぇw
脳みそにクソが詰まった人間同士がクソの垂れ流しあいをしてるwww
素晴らしいw
相手はズブズブのシロートなんだから
やりたいことくらい察してやれよwww
ンなことだからオマイラは脳みそに怪しい部分をお持ちですね
とか言われんダよww

66 :
もう全部ソースを晒せばいいと思うんだ。

67 :
やりたいことは察してやるのではなく、引き出してやればいいのだ。

68 :
がなんか言ってるな。

69 :
しゃべるクソなんだからしょうがない

70 :
>>51
行き詰まったから質問してるんだろうけど、もっと手前で道を間違ったから行き詰まってるんだよ。
例えて言えばお前の質問は「どうやったらこの道を進めるんですか?」と言ってるようなもんだ。
行き止まりの進み方を聞いたってこっちは知らんがなとしか言えない。 そこは進めない。
「どうやったらxxに行けるんですか?」と聞いてくれれば、 xx がどこか言ってくれれば回答しようがあるんだよ。
要は「自分が行き詰まっているところ」じゃなくて「目的地」を示せってこと。

71 :
日本語でおk

72 :
>>48
というと、n個の配列を作る方法はあるのでしょうか。(n=2とは限らない)

73 :
mallocなりcallocでええやん

74 :
>>72
無い
そういう方法は標準では用意されてない
最初に配列の個数を決めたら後で変えることはできない
こういうのを静的配列と呼ぶ
実行時に配列の長さnを変えられるのは動的配列、
Cは動的配列を標準では提供していない
「C 動的配列」で調べれば出てくる

75 :
コテで無能自慢するのが流行りなんかね

76 :
知らなかったの?おっくれてるぅ

77 :
>>72
C99 ではかなり条件が緩和されてる。
http://seclan.dll.jp/c99d/c99d04.htm
ただ、ポケコンだと新しい処理系を使うってのも簡単じゃないだろうし…。
普通は malloc でメモリを確保して使うんじゃないかな。
int main(void){
int n = 2;
int* m = malloc(sizeof(int)*2);
//ここで m を使った処理
free(m); // ←メモリの解放
}

78 :
コテなしの無能発言よりはまし。NGできるコテつきは良心的ともいえる。

79 :
>>78
自己紹介お疲れ様です
これからも駄文の垂れ流し、よろしくお願い致します無能様

80 :
>>78
こういう内容の発言なのに自分がコテ付けてないってのは
かなり自家撞着なアホwww
「わたくし、アホでございます」と宣言してるようなモンだw

81 :
自己紹介はやめろ

82 :
          ____
       / \  /\  キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \   コテなしの無能発言よりはまし。NGできるコテつきは良心的ともいえる。
    |      |r┬-|    |   
     \     `ー'´   /   
    ノ            \
  /´               ヽ
            ___
       /      \
      /ノ  \   u. \ !?
    / (●)  (●)    \ 
    |   (__人__)    u.   | クスクス>
     \ u.` ⌒´      /
    ノ           \
  /´               ヽ
         ____
<クスクス   /       \!??
      /  u   ノ  \
    /      u (●)  \
    |         (__人__)|
     \    u   .` ⌒/
    ノ           \
  /´               ヽ

83 :
>>51
同じく初心者が頭振り絞って考えたけど
こういう事かな?
#include <stdio.h>
int main()
{
int x;
int i;
int j=10;

printf(" 整数を入力\nx=");
scanf("%d",&x);

for(i=0; i<=3; i++)
       {
        x = x*10;
        printf("x * %d = %d\n", j,x);
        j=j*10;
       }
return(0);
}

84 :
GNUスタイルは久々に見た
初心者向けの本やサイトでそのスタイルは余りにも見かけない
本当に初心者なのかが疑問に残る
初心者が何もせずに何も見ずにそのスタイルに行きついたなら
ある種の教祖的な素質がある

85 :
>>84
へぇー。 手元にある本をざっと見たら確かにその通りだわ。
でも、俺も昔は >>83 みたいに書いてた。
初心者的には括弧の位置が対応してた方が安心できるんじゃないかなぁ。
エディタの支援がある状況だとちゃんとインデント付けてくれるけど、
初心者はそれに慣れてないわけだし。

86 :
最初に使ったコーディングエディタがEmacsでショーも無い書籍を避けて進化すれば素養も昔は書いてたもクソもないよ

87 :
日本語でおk

88 :
>>73,74,77
有難うございます。とても勉強になります。
私は取り敢えず入門書を大体読み終えたのですが、まだまだですね…
以下のソースでテストしてみたところ上手く動作したので、今自分の作りたいものを作れそうです。
main(){
int n = 2;
int *m = malloc(sizeof(int)*n);
*m = 1;
*(m +1) = 3;
printf("%d, %d",*m,*(m+1));
}

89 :
>>86
因みに俺が最初に C のコーディングに使ったエディタは Vz だったよ。
教員もめんどくさいから最近だと VC++ 選ぶと思うけどな。
C の初心者に Emacs から指導するのは手間なだけだろ。

90 :
free(m);
忘れてました

91 :
>>88
free するかどうかの議論がまた始まるよー。

92 :
for( P=Root, Last=NULL; P != NULL; Last=P, P=P->Next )
この手のfor分は行数ケチスタイル?

93 :
そんな変なの見たことねぇ。

94 :
うん

95 :
>>92
意味的にループのための初期化、判定、インクリメントになってるなら、
ケチとかどうとか言う類のものじゃないと思うけどな。
俺はアリだと思うし、実際に書くよ。

96 :
リークの意味がわかってないアホにはうんざり

97 :
それはコードゴルフスタイル

98 :
LastとRootの語をどう使い分けてんのかわけわからん

99 :
とりあえず変数名を大文字で始めるのは気持ち悪い

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
Boost総合スレ part9 (937)
【GPGPU】くだすれCUDAスレ part5【NVIDIA】 (750)
スレ立てるまでもない質問はここで 119匹目 (156)
【バグ管理】 BTS使ってる?【追跡】 3 (900)
Androidプログラミング質問スレ Part22 (364)
Git 4 (559)
--log9.info------------------
D-51 (158)
思い出の京都市電 (131)
なつかしの京都市営バス (149)
東武・西武・南海に電機牽引の客レの時代があったら (201)
【市電】名古屋市交通局【地下鉄/トロバス】 (518)
京橋を出ますと次は京都の七条まで停まりません (265)
国鉄がいかにクソだったか語り合うスレ (230)
【黒貨車】国鉄時代の貨車を語ろう【コンテナ】 (976)
子供用絵本の鉄道を語る【ヲタの原点】 (256)
検札でトイレに逃げたら車掌室だった (182)
懐かしの東急沿線風景 (495)
首都圏の103系 (658)
マンモス電機EH10 (245)
【マニ20】20系固定編成客車スレ01【ナロネ20】 (576)
なつかしの神戸市電・市バス (162)
【国鉄】九州の廃止路線、駅を語るスレ【私鉄】 (229)
--log55.com------------------
情報システム課・電算課スレ Part10
福岡県庁スレpart20
国家公務員 公安警察 C
公務員やめたけど質問どぞ4
休職中の公務員集まれ35
【法の番人】千葉県庁Part49【政策法務課】
行旅死亡人 〜号外第42号〜
若手国税専門官雑談スレ第74部門