1 名前:デフォルトの名無しさん [2012/07/15(日) 10:28:33.18 ] C言語の入門者向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 103 toro.2ch.net/test/read.cgi/tech/1341059858/ ★過去スレ 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++の宿題片付けます 158代目 toro.2ch.net/test/read.cgi/tech/1339338438/ ★C++言語については避けてください。C++対応明記スレへどうぞ。 ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。 # サイズが大きい場合はアップローダ等を利用してください。 codepad.org/ ideone.com/ ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
101 名前:デフォルトの名無しさん [2012/07/21(土) 20:52:34.13 ] やたああああああああああああ ideone.com/QkwnG
102 名前:デフォルトの名無しさん mailto:sage [2012/07/22(日) 10:16:31.58 ] 米国 「今のままなら朝鮮戦争が再開しても、日本は韓国に協力せず、無視することができる」 hayabusa3.2ch.net/test/read.cgi/news/1342918828/ 韓国が日韓軍事協定を破棄したことで生じた問題 両国間協力の座礁は、オバマ政権だけでなく、ブッシュ政権で 北東アジア政策を担当した筆者にとっても大きな失望だ。 韓日間の安保協力が突然、暗礁に乗り上げた。 最近問題になった情報交流協定のためだ。 また最近、日本の政治は右傾化し、日韓共同防衛協力を抜け出して日本独自に動こうとしている。 マイケル・グリーン米戦略国際問題研究所(CSIS)日本室長 . 2012/7/21 japanese.joins.com/article/994/155994.html?servcode=100§code=140
103 名前:デフォルトの名無しさん mailto:sage [2012/07/22(日) 10:24:28.29 ] なげーーーーーーーーーーーーーーーーーーーーーーーよ 変数wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
104 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 02:32:29.46 ] quin2decが手元の参考書に載ってない上にぐぐっても出ないんですが、 これはどういった働きをするんでしょうか?
105 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 03:55:40.74 ] >>104 見たこと無いのだが。 というか、それはどこに出てきたのでしょうか。 ただ、よくあるパターンとしては EXCELの関数では bin2decとかhex2decとかoct2decで 2進数だったり、16進数だったり、8進数だったりを10進数に変換する。 んで、そういう機能をC言語でする場合、 そのような名前の関数を作る事がある。 (ユーザ関数なので、名前はなんでも良いんだけど。) そのパターンで考えると quin → quintuple → 5倍 で、多分5進数を10進数に変換する関数っぽいけど、 所詮、ユーザ関数だから正しくは分からない。 もちろんquinさんを10進数に変換するとも考えられる。
106 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 04:33:50.43 ] >>105 おお、ユーザー関数なんてものがあるのですか。 通りで検索してもでてこないわけだ。 おっしゃる通り五進法を十進法に変換せよ、という問題で出てきました。
107 名前:デフォルトの名無しさん [2012/07/23(月) 05:36:56.10 ] 宿題スレでコードを書いたいただいたのですが、調べながらコードを見ていても理解できない部分が 多々あったので質問させてください。 問題文 ideone.com/WnbTA コード codepad.org/nqyygUO9 ・#define N 1024は何を意味しているのか ・quin2decが引数として文字を4つ受け取っているのはどこか ・どこで戻り値として返しているか ・受け取る五進数は4桁以下の非負正数(十進法の0〜624)であると仮定する、とありますが どこで仮定されているのか、あるいはもし仮定されていないならどうすれば良いか ・static char buff[N]; が何を意味しているのか 宿題スレでコードを貰っておきながらこちらで聞くのもどうかと思うのですが、 どうしてもわからなかったのでこちらで質問させていただきました。 よろしくお願いします
108 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 06:02:51.71 ] >>94 gameboyはbios用意しなくていいから問題ないっしょ
109 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 07:03:35.31 ] >>107 まぁ、マニアックなコードだな。 質問>・quin2decが引数として文字を4つ受け取っているのはどこか 問題文>4つの文字を引数として受けとる 確かに単文で見た場合、 「4個の(文字を)引数として受け取る」と読めなくもないが、 「4種類の文字を引数として受け取る」とも読めるし、「4桁の文字を引数として受け取る」とも読める。 それぞれの返答は ・quin2decは4種類の文字(列)を1つ受け取る。 ・コード内で4桁に制限してる箇所は・・・ないね。問題文でも4桁以外の桁数だった場合どうするとか書いていないから、 コードを書いた人が、プログラムの前提条件として受け取ったんだろうね。 ・4種類のチェックを行っている部分は switch文 質問>どこで戻り値として返しているか これは「戻り値」を返す方法は勉強している(もしくは教科書に書いてある)と思う。 返答としては31行目のreturn文なんだけど、再帰呼び出し(ある関数の中で、自分自身(の関数)を呼び出してる)をしているからイメージ沸きにくいかもね。再帰呼び出しで調べてね。 質問>・受け取る五進数は4桁以下の非負正数(十進法の0〜624)であると仮定する、とありますが・・・ 受け取る文字列の種類として負を表す文字自体がなく、「r,h,f,m,y以外の文字を受け取ったらエラーとする」ので気にしなくて良いと思う。 質問>・#define N 1024は何を意味しているのか 質問>・static char buff[N]; が何を意味しているのか Nを利用している箇所は static char buff[N]; と fgets(buff, N, stdin);の二ヶ所である。 問題文では「キーボードから文字列として受け取り」とある。 受け取る領域(入れ物)が必要である。static char buff[N];はそれを用意している。その際、領域の大きさ(N)を何かしら決める必要がある。 問題文としては「4桁の5進数」とあるから、4文字分+(改行コード分またはnull終端分)が必要最低限なのだが、 「4文字以上の文字列を受け取らない」とはあるが、キー入力される文字数は制限されていない。 そうした場合、十分な大きい値(1024)を用意したという事だと思う。 #define とは何かという質問だったら、教科書調べてね。 長いね。
110 名前:デフォルトの名無しさん [2012/07/23(月) 07:41:35.79 ] >>109 長々と説明ありがとうございます、おかげさまである程度理解ができました。 ただ、引数に関してがイマイチわからないのですが、単純に引数として受け取ってるのは y,m,f,hであり、swich文で入力した文字がそれに該当してるか調べてcaseで分けているということなんでしょうか? 戻り値については早速再帰呼び出しで調べて学習してきます。 #define文自体は調べて理解していたのですが、1024という数字の意味が理解できていませんでした。 領域の大きさを決める数字と聞いて納得できました。
111 名前:109 mailto:sage [2012/07/23(月) 08:24:22.91 ] >「4種類の文字を引数として受け取る」とも読める あ、そもそも5進数だし、「r,h,f,m,y」と書いてあるのだから、5種類の文字だね。。。あほだ。。。 >>110 私が質問の意図を理解していないから上手く説明できてないのだね。 >・quin2decが引数として文字を4つ受け取っているのはどこか 「quin2decが4つの引数を受け取っていない事を疑問に思っている」と読み取って良いかな? int quin2dec(char *s, int n) それに対する返答は「4桁の文字列として、一つの引数(s)を受け取っている」から。 ただし、実際には、コードは桁数(4桁以内である事)のチェックはされていない。「なぜチェックしていないのか」は、 多分、「問題文に桁数が不正の場合、どうするのか」が指定されていないからだと思う。 まぁ、もちろん 「int quin2dec(char a,char b,char c,char d)」として4つ受け取ってもコードを書いても良いのだけど。 ただ、こうした場合、3桁の文字が入力された場合、困るかな。 あ、「受け取った4文字中r,h,f,m,y以外の文字が一文字でも含まれた場合エラーメッセージを出してプログラムを終了する。」 quin2decが「r,h,f,m,y」以外の文字を受け取っちゃいけないとは、書いてないからいいか。 まぁ、C言語と言うより、「4つの文字を引数として受けとる 」の問題文の解釈の話のような気がする。 「引数を4つにしないといけない」と読むか、「引数を4桁の文字列として受けとれば良い」と読むか。 とんちんかんな回答かな?
112 名前:109 mailto:sage [2012/07/23(月) 08:36:19.66 ] >>110 あ、ちょっと勘違いしてそうなんで補足 >戻り値については早速再帰呼び出しで調べて学習してきます。 「再帰呼び出し」と「戻り値」は直接は関係ないよ。 「再帰呼び出し」がどういう動きをするかを勉強した方が良いよ。 で、「再帰呼び出し」をした結果、それぞれの「戻り値」がどうなるか、がややこしい(かも)。 と言うことね。 まぁ、これは、地道にそれぞれのステップを追って(プログラムが動いている順番を追って)、 その時の変数や戻り値がどうなっているかを書き出してみるのが確実だよ。
113 名前:デフォルトの名無しさん [2012/07/23(月) 08:40:54.94 ] >>111 わざわざありがとうございます。 私の知識が足りないので何を疑問に思っているのかが上手く伝えられていないんだと思います。 おっしゃる通りquin2decが4つの引数を受け取っていないのが疑問でした。 私の手元の参考書と比較するとquin2dec(char *s,int n)の*sとnを仮引数として受け取るのかな、と考えたのですが それだと仮引数が2つだけで、私は「引数を4つにしないといけない」と捉えたので2つ足りない事に疑問を感じていました。 分かりにくい質問だらけで申し訳ないのですが教えていただけるとありがたいです
114 名前:109 mailto:sage [2012/07/23(月) 09:41:20.81 ] >>113 このコードで、引数(s)と、引数(n)とはそれぞれ何を表しているのか。ということですね。 すんません。quin2decについて、真っ当に追ってないから、引数(n)ついて、きちんと理解してません。 っていうのが正直な所です。 ちょっと気合を入れて動きを追ってみましょう。 7行目の if ( !s || !*s ) return n; !s は s==0と同じ意味、sは(char *)だから sのアドレスが0だった場合(実際には、後述する「r,h,f,m,y以外」の文字だった場合) !*s は *s == 0と同じ意味、 sのアドレスが指しているcharの値0の場合だから、null終端だった場合 どちらかの場合、引数(n)をそのまま返す。 11-27行目のswitch文 switch文の引数は*sだからアドレスsの指しているcharの値を指している。 case 'y'からcase 'r'まで、break;がないから、該当した文字列以下の文は(break;まで)すべて実行され、switch文を終える。 よって、yだったら14,16,18,20行目が実行されるので m==4となる。 同様に fだったら、18,20行目が実行されるので m==2となる。 r,h,f,m,y以外だったらdefaultまで行き m== -1となる。
115 名前:109 mailto:sage [2012/07/23(月) 09:41:38.76 ] (続き) 29-30行目は まず m が 0以下という事は前のswitch文で「r,h,f,m,y以外」と言う事 その場合、30行目が実行される。 その時 引数(0,-1)でquin2decで再帰呼び出しされ、その戻り値が returnされているので、自分の戻り値となる。 で、再帰呼び出しされたquin2decでは7行目に引っかかるから、無条件に -1が帰ってくる。 (ということは 30行目は return -1;と記述しても問題ないような気がする。) 31行目は引数(s + 1, 5 * n + m)でquin2decで再帰呼び出しされ、その戻り値が returnされているので、自分の戻り値となる。 s + 1 は、sの次のアドレス(隣の文字のアドレス)にして quin2decに渡している。 注:再帰呼び出しされたquin2decの引数(s)が、自分の引数(s)の次のアドレスとなっている。 5 * n + m は 受け取った引数を5倍しているから、繰り上げ処理をして mを足している。 ふんふん、なるほど。それを繰り替えして、最後の桁まで行ったら、その戻り値が、呼び出し元に上がってくる訳か。 つまり、quin2decは引数(s)上から一文字ずつ処理して、引数(n)は、そのけた時点での十進数の値ということですね。 で、それを最終桁まで繰り返している。 自分だけが納得しているような気がする・・・。
116 名前:109 mailto:sage [2012/07/23(月) 09:46:03.32 ] >まず m が 0以下という事は前のswitch文で「r,h,f,m,y以外」と言う事 あ、0未満だね。
117 名前:107 mailto:sage [2012/07/23(月) 10:28:54.36 ] 細かい説明本当にありがとうございます。 じっくり読んでquin2decが受ける引数について理解できました! それだけでなく、あやふやで理解したつもりになっていたところも 説明を読んでいるうちに大分しっかりと理解できました。 せっかくの機会なので34-42行目のところも教えていただけないでしょうか? 理解した「つもり」だらけだったので、ここも見当違いな考えになっていそうです。 何だか結局全部丸投げみたいになってしまい申し訳ないのですが、よろしくお願いします
118 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 11:09:06.06 ] >>117 途中見てないが、chop()についてだけ。 目的: 引き数で渡されナル終端文字列の後方にある改行文字をchopする。 詳細: ・ナル終端文字を見つける。 ・一つ遡る。 ・その場所の文字が改行文字(或いは復帰文字)であればナル終端を書き込み、一つ遡る。 以上。
119 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 11:18:50.03 ] void chop(char * s) { char * p = strchr(s, '\0'); for (--p, p >= s && (* p == '\n' || * p == '\r'); --p) * p = '\0'; }
120 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 11:22:00.32 ] >119を書いて気付いたんだが、>107のコードは何も入力せずに入力を閉じるとバグるな。
121 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 11:55:59.51 ] >>118 ありがとうございます。 頑張ってみます
122 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 11:59:49.68 ] いえいえ
123 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 12:17:34.50 ] あっそーれ
124 名前: ◆QZaw55cn4c mailto:sage [2012/07/23(月) 12:21:29.66 ] >>109 俺のコードをよくもマニアックといったな。慰謝料にモリタポ払え
125 名前: ◆QZaw55cn4c mailto:sage [2012/07/23(月) 12:30:13.15 ] >>120 ご指摘感謝。 何も入力しないといっても、エンターキーのみの入力という意味なら、\r, \n がバッファに載るのでほとんど問題ないでしょうが、 しかしバッファの直前がたまたま \n, \r だったりすると、確かにバグりますね。 以下に修正しておきます。 codepad.org/k8fng7Hh
126 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 12:47:06.48 ] 何も入力しないってのはCTRL-Dのことだろ 的はずれにもほどがある
127 名前:109 mailto:sage [2012/07/23(月) 13:28:09.19 ] >>124 あ、本人? 勝手にコード解説しちゃって、ごめんね。 行間まで、思い込みで解説しちゃったから、 解釈の間違いあったら、正しといてください。 きっと、間違っているから。
128 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 13:34:07.13 ] なんだ、QZコードだったのか。納得。
129 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 14:31:44.81 ] 0.1次元バーコードか?
130 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 15:53:44.74 ] えィ
131 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 17:36:21.47 ] #define NULL ((void *)0) あるポインタをNULLで初期化すると、そのポインタはメモリ上の絶対アドレスである0番地を指すということなのでしょうか
132 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 17:42:33.91 ] >>131 0番地はワイルドカード。
133 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 17:46:25.38 ] 環境による としか言い様がない気分
134 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 17:49:08.12 ] 通常アドレスは仮想化してるから実際は指してないし参照できない
135 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 18:00:30.39 ] ttp://support.microsoft.com/kb/76945/ja 意味不明な日本語だけどMS-Cではプログラム終了時にNULLセグメントを調べて そこのデータが書き換えられていればエラーとした
136 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 18:05:41.86 ] 仮想記憶のない時代の話だな。
137 名前: ◆QZaw55cn4c mailto:sage [2012/07/23(月) 18:28:00.53 ] >>127 丁寧に解説いただき恐縮です。 > 30行目は return -1;と記述しても問題ないような気がする。 これは確かに。return 文を一箇所にしたいという意思だが、そのために if (!s || !*s) と複雑になってしまったので、どっちでかいても一長一短。んー。 >>128 んー、なにを納得したのかおしえてください。匂いますか、いや臭いますか?
138 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 18:35:30.76 ] ttp://ideone.com/d8x39 とシンプルに書けばいいのに再帰使ってソースを読みにくくしてるところ
139 名前: ◆QZaw55cn4c mailto:sage [2012/07/23(月) 19:17:48.17 ] え?再帰の方がよみやすいのですが?これって主観ですかね。
140 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 19:26:00.65 ] 隙あらば再帰にしてしまう→再帰ッカー 他にもCゲンガー、フォートランナー、コボラーなど
141 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 19:27:49.63 ] 2,3のコードがあげられてて そのうちの再帰使ってるのが「わからん」ちゅーなら 初心者やらにはワカランのだろ 強力だけれども面倒くさい、 とくにその手の初心者には 誰かにとっては読みやすくても、 ここら辺りで宿題出したり聞いたりする人物のレヴェルも考える 普通なら ね
142 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 22:52:42.03 ] すみません、どうしても解答がわからないのですが... 問.関数、void addlist(LIST *head,LIST *addata)を完成させろ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct name_list{ struct name_list *next; char *name; }LIST; void addlist(LIST *head, LIST *addata); int main(void){ LIST name0= {NULL, NULL}; LIST name1= {NULL, "B"}; LIST name2={NULL, "C"}; LIST name3={NULL, "D"}; LIST name4={NULL, "E"}; LIST addata = {NULL, "A"}; LIST *p; LIST *head; head=&name0; name0.next=&name1; name1.next=&name2; name2.next=&name3; name3.next=&name4; addlist(head, &addata); for(p = head->next; p != NULL;p=p->next)printf("%s\n,p->name"); どなたかお願い致します....(ノД`)
143 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 22:53:49.68 ] あ、一番下に return 0; } を忘れてました...
144 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 22:57:15.17 ] >>1 読むのも忘れてんぞ
145 名前:>>142 mailto:sage [2012/07/23(月) 22:59:04.90 ] >>144 ごめんなさい これは過去問でして、明日試験なんですけど聞ける友達がいない.... C言語です
146 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:00:32.52 ] リストの末尾に追加かね void addlist(LIST *head,LIST *addata) { LIST *p = head; while (p->next) p = p->next; p->next = addata; }
147 名前:デフォルトの名無しさん [2012/07/23(月) 23:04:27.30 ] PICマイコンを使用するためにC言語を勉強中です。 どうしてもプログラム中に、EEPROMへの読み書きを多用するので int型とlong型用の2つの値をEEPROMから読み込み、int型long型のそれぞれの変数へ代入する関数を作ったのですが、ポインタの使い方がよくわかりません hiとかloというのは2バイト以上の変数を1バイト単位に分割するために使用する”built_in.h”というヘッダファイル用の語句です このコードの何がダメなのかも分らないのでご教授ください よろしくお願いします void main() { int x; long y; read2byte(100,&x); read4byte(200,&y); } void read2byte(int a,int *b) { hi(*b) = EEPROM_Read(a); lo(*b) = EEPROM_Read(a+1); } void read4byte(int a,long *b) { highest(*b) = EEPROM_Read(a); higher(*b) = EEPROM_Read(a+1); hi(*b) = EEPROM_Read(a+2); lo(*b) = EEPROM_Read(a+3); }
148 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:10:09.88 ] >>147 バイトオーダーが違うかもしれない くらいしか分からん
149 名前:147 [2012/07/23(月) 23:11:54.31 ] 書き忘れました EEPROM_Read(a); というのはコンパイラ付属の関数で、aがEEPROMのメモリアドレスです
150 名前:>>142 mailto:sage [2012/07/23(月) 23:14:59.54 ] >>146 そもそもこのプログラムって何をしているものなのでしょうか....? ソート? あと、for文の上の addlist(head, &addate)というのは何なのですか?
151 名前:片山博文MZボット ◆0lBZNi.Q7evd [2012/07/23(月) 23:18:05.21 ] hi,loの定義をさらせ。 hi(*b)は左辺値ではないから代入できないと思われ
152 名前:147 [2012/07/23(月) 23:23:18.80 ] >>151 2バイト以上の値、例えばlong型(4バイト)を低いビットからlo,hi,higher,highestとバイト単位に分割するものです
153 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:26:02.62 ] >>150 うんにゃ わたされた head から末尾を探し出して、その末端にさらに 渡された adddata を繋げてる name0〜name4 までのリストを手で構築後 adddata 関数を呼び出してる 意図として name0〜name4 の後ろに adddata を連結しようとしてる と俺は解釈した
154 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:29:09.93 ] × adddata 関数を呼び出してる ○ addlist 関数を呼び出してる
155 名前:>>142 mailto:sage [2012/07/23(月) 23:30:02.40 ] >>153 ご丁寧にありがとうございます このプログラムはAがname0に入るわけでは無いんですか?? addataがname4の後に連結した時、whileが初めて回りだしてAが先頭に来るって事ですか? やばい日本語おかしくてスミマセン
156 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:36:07.74 ] printf() の出力結果は BCDEA の予定 ABCDE にしたいのなら void addlist(LIST *head,LIST *addata) { LIST *p = head->next; head->next = addata->next; addata->next = p; }
157 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:36:41.10 ] >>142 厳しいようだけど、 明日試験で、過去問で解答が分からない。ってのは 解答を教えても、明日の試験では違う問題がでるから意味が無いのでは? 解き方が分かっていないんだから。 このプログラムは、addlistが不明なのだが、明示されてるのだから、 そこを理解する所から、入るべき。 (まさしく >>150 の疑問を理解できる様になる事が大事) それから、足りない部分(addlistの中身)を考える。
158 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:37:14.59 ] × head->next = addata->next; ○ head->next = addata; なんかヒデェな… もう寝る
159 名前:157 mailto:sage [2012/07/23(月) 23:39:14.48 ] >このプログラムは、addlistが不明なのだが、明示されてるのだから、そこを理解する所から、入るべき。 まつがい。 このプログラムは、addlistが不明なのだが、明示されている所を理解する所から入るべき
160 名前:>>142 mailto:sage [2012/07/23(月) 23:40:52.16 ] レス下さった皆さんありがとうございます そもそも一晩(ではないんですけども)でやろうとした自分が悪いですね... 少し前の方から再度勉強しなおしてきます... ありがとうございました!
161 名前:片山博文MZボット ◆0lBZNi.Q7evd [2012/07/23(月) 23:41:19.46 ] *b = ((int)EEPROM_Read(a) << 8) | (int)EEPROM_Read(a+1); や *b = ((long)EEPROM_Read(a) << 24) | ((long)EEPROM_Read(a+1) << 16) | ((long)EEPROM_Read(a+2) << 8) | (long)EEPROM_Read(a+3); みたいに書かないといけない。
162 名前:デフォルトの名無しさん mailto:sage [2012/07/23(月) 23:47:27.06 ] >>147 君はまだEEPROMを使うべきではない(きり)
163 名前:片山博文MZボット ◆0lBZNi.Q7evd [2012/07/23(月) 23:58:54.84 ] 共用体を使う方法もある。 union I16{int i; struct {unsigned char LO,HI;}}; union I32{long l;struct {I16 LO,HI;} };
164 名前:片山博文MZボット ◆0lBZNi.Q7evd mailto:sage [2012/07/24(火) 00:14:51.03 ] 久しぶりにCやったら;とunionをつけ忘れたよ
165 名前:147 [2012/07/24(火) 00:26:01.62 ] >>161 レスありがとうございます。 その式と、下記の式だと自分には同じ動作だと思ってしまうのですが 何がどう違うのでしょうか?本当にわからないです>< void read4byte(int a,long *b) { highest(*b) = EEPROM_Read(a); higher(*b) = EEPROM_Read(a+1); hi(*b) = EEPROM_Read(a+2); lo(*b) = EEPROM_Read(a+3); }
166 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 00:29:04.57 ] >>165 hi とか lo がどんなものか分からないからこうしようぜ void read4byte(int a, long *b) { unsigned char *p; p=(unsigned char*)b; *(p+0)=EEPROM_Read(a+0); *(p+1)=EEPROM_Read(a+1); *(p+2)=EEPROM_Read(a+2); *(p+3)=EEPROM_Read(a+3); }
167 名前:片山博文MZボット ◆0lBZNi.Q7evd [2012/07/24(火) 00:33:47.87 ] >>165 恐らくhiマクロなどは内部でシフト演算を使っているので hi(*b)などは参照がなくなって左辺値になれないから代入対象になれない。ただそれだけ。
168 名前:147 [2012/07/24(火) 00:39:29.70 ] >>166 レスありがとうございます。 実は、>>165 で書いた式と、>>161 さんの書いた式で問題なく読み込みができたのですが、 PICマイコンのスレで同じような質問をしたところ、ポインタの使い方?がおかしいと指摘されて ここで質問させて頂きました。 一番気になるのはポインタの使い方の間違いと間違っているために起こり得る問題です。 long型(適当な値 99,999とか2,222,222)を一旦、EEPROMに書き込み、上記の式で読み込ませたところ 正常に読み込まれているので何が何だかさっぱりわかりません~~;
169 名前:147 [2012/07/24(火) 00:44:24.25 ] >>167 レスありがとうございます。 実は、>>168 で書いたよう、に教えて下さった式も自分で書いた式も問題なく読み込みできています。 本当に何がダメなのか、本当はダメではないのか分らず、困りましたorz
170 名前:片山博文MZボット ◆0lBZNi.Q7evd [2012/07/24(火) 01:00:20.84 ] ファイルbuilt_in.hを開いて中身を確認しなさい。 そこにhi,loの定義があると思われます。 それらをさらして下さい。
171 名前:147 [2012/07/24(火) 01:04:28.32 ] >>170 了解しました。下に晒します。 話変わりますが、例のコードはポインタの使い方って間違っていますかね? そこが気になります。 #define Lo(param) ((char *)¶m)[0] #define Hi(param) ((char *)¶m)[1] #define Higher(param) ((char *)¶m)[2] #define Highest(param) ((char *)¶m)[3] #define lo(param) ((char *)¶m)[0] #define hi(param) ((char *)¶m)[1] #define higher(param) ((char *)¶m)[2] #define highest(param) ((char *)¶m)[3]
172 名前:147 [2012/07/24(火) 01:06:18.61 ] 文字化けしたので、&とparamの間にスペース入れました #define Lo(param) ((char *)& param)[0] #define Hi(param) ((char *)& param)[1] #define Higher(param) ((char *)& param)[2] #define Highest(param) ((char *)& param)[3] #define lo(param) ((char *)& param)[0] #define hi(param) ((char *)& param)[1] #define higher(param) ((char *)& param)[2] #define highest(param) ((char *)& param)[3]
173 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 01:06:47.16 ] >>171 >>147 のままで合ってるよ
174 名前:片山博文MZボット ◆0lBZNi.Q7evd [2012/07/24(火) 01:08:49.01 ] 検証の結果、問題なし。 シフト演算じゃなくて&とキャストを使ってた
175 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 01:10:37.95 ] hi, lo マクロは左辺値になれる形式だな > PICマイコンのスレで同じような質問をしたところ、ポインタの使い方?がおかしいと指摘されて その指摘は hi, lo を関数だと勘違いしての指摘かもしれんね
176 名前:147 [2012/07/24(火) 01:11:22.58 ] >>173 マジですか? PICもC言語も始めて数か月程度しか経っておらず、ポインタを覚えるためにも初めて使ってみたのですが PICマイコンスレで指摘され、どうしても自信がありません><
177 名前:147 [2012/07/24(火) 01:14:57.23 ] >>174-175 レスありがとうございます! キャストとかの語句はまったくわかりませんでしたのでもっと勉強しないとダメですね どうもありがとうございました!
178 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 07:52:56.12 ] いえいえ
179 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 11:01:09.22 ] 連結リストの質問チラホラ出るけど、ポインタで教えるor ポインタtoポインタで教えるのは教員の好みによるものなのかい?
180 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 11:06:40.17 ] リストで二重ポインタなんか使わんだろ
181 名前: ◆QZaw55cn4c mailto:sage [2012/07/24(火) 12:25:23.77 ] >>180 え?使わない? 二重ポインタを使わないとなると、コピーコピーコピー、とルートまで延々コピーする格好の悪いことになるのだが?
182 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 12:31:00.60 ] >>181 それが正解だよ コピーコストが嫌ならリストオブジェクト全体の参照を取ればいい ノードの参照は共有しないのが常識
183 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 12:46:33.76 ] free()しちゃうとダングリングポインタが出来てしまう危険があるからか
184 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 13:12:59.51 ] ttp://ideone.com/k4BZz ふつー二重ポインタ使うでしょ
185 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 13:29:10.43 ] 二重ポインタってポインタが指してる先を変更したい時に使うんじゃないのか? それかポインタ配列か 話は変わるけどこういうのはcがfree()されるとaもbもダングリングポインタになってしまうけど 検出されないのな 当たり前か 後からaやbを使いまわす可能性があるし int main(void) { int *a, *b, *c; c = (int *)malloc(sizeof(int)); if (c == NULL) exit(1); *c = 123; a = b = c; printf("%d %d %d\n", *a, *b, *c); free(c); return 0; }
186 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 13:29:14.80 ] 使わねーよ。 アホすぐる。
187 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 13:30:18.83 ] >>185 お前はまったく理解していない。
188 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 14:51:53.24 ] for(i=0; i< 空欄B (float) ; i++) printf("%02x", *p++); この空欄Bに入る単語を答えよという問題があるんですが キャスト演算子(float)を セミコロン直前におくような 表現が思い当たりません。(問題文全体はもっと長いです。)どのような表現が入りうるのでしょうか?
189 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 14:54:21.10 ] sizeof
190 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 15:06:43.27 ] あー、失念してました。ありがとうございます。 ついでに printf(" %-12g",f); の意味も教えていただけないでしょうか? 問題が紙なので %ー12じゃなくくて %ーL2 かもしれませんが
191 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 15:09:38.05 ] すいません%-12gのほうはもういいです
192 名前: ◆QZaw55cn4c mailto:sage [2012/07/24(火) 18:43:39.47 ] >>185 C に「検出」などというお子様仕様は皆無。
193 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 18:47:15.43 ] コンパイラによっては未使用変数や未初期化変数のアクセスは検出するがCの仕様ではないよな。
194 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 18:52:58.26 ] ひょっとしてinlineってCの仕様じゃない?
195 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 18:55:30.07 ] C99から。
196 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 20:16:30.67 ] ソフト会社でC99での開発って結構あるの?
197 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 20:17:28.88 ] まずない。
198 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 20:18:43.63 ] ですよねー
199 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 20:24:23.89 ] >>192 無職のオッサンに上から目線で言われたくないなあ
200 名前:デフォルトの名無しさん mailto:sage [2012/07/24(火) 20:25:29.58 ] GCのアルゴリズムでも勉強したら?