ページ 11

プログラムの動きについて

Posted: 2012年5月03日(木) 20:18
by net921
画像が消されたので復元させて頂きました。 by softya(ソフト屋)
namonaki1223.png
namonaki1223.png (25.07 KiB) 閲覧数: 18931 回
上記のようにプログラムの解説をコメントで付けました。
自分なりには正しいと思うのですがおかしな所があったら教えて下さい。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 20:24
by beatle
ソースコードはcodeタグを用いて貼り付けてもらえると引用がしやすいので良いです。

コメントどうこうより、まずインデントを学習されたほうが良いと思います。
コメントもコメントで、冗長なコメントが多いです。

コード:

if (!ptr){ //ptrが0(NULL)であれば下記を実行,そうでなければelse文を実行
こんなのはコメントよりif (!ptr)を見れば一瞬で分かることですよね。こういう、プログラムを見れば一瞬で分かるようなことはコメントを書かないほうが良いです。
良いコメントのコツは、プログラムを見ただけでは分からない、この関数は何をする関数なのかとか、このif文は何をするif文なのかとか、高レベルなコメントを書くことです。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 20:33
by net921
とりあえずコメントは合っているでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 20:57
by box
「3ヶ月前の自分は他人」というプログラミング上の格言(?)に従い、
3ヶ月くらいたってから同じコードをながめてみて、
そのコメントによってコードの動きがすべて理解できたとすれば、
「あぁ、3ヶ月前に書いたコメントは正しかったんだ」ということがわかるかもしれません。

また、
while (1)
が無限ループを指すことなどについて、
「あぁ、これはコードを読めばすぐにわかる、むだなコメントだ」というようなことも
ついでにわかるかもしれません。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 20:58
by net921
他の人が書いたプログラムなのでソースコードをそのまま書かないほうがいいとおもいました
とりあえずコメントは合っているでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 20:59
by softya(ソフト屋)
前の質問を放置しないようにお願いします。
「DXライブラリで立方体を描画したい • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=10568
「設定ウインドウの作成 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=10567

で、今回のプログラムはNUL文字とNULLが混同されているなど修正ポイントが多すぎるのでぜひcodeタグで投稿して下さい。
net921 さんが書きました:他の人が書いたプログラムなのでソースコードをそのまま書かないほうがいいとおもいました
じゃあ、コメントだけ投稿して下さい。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 21:17
by net921
一時的であればいいみたいです

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 21:42
by net921
8: bufの最後の文字のアドレスをpEndに代入(見できなかった場合はNULL(0)を代入)

でよろしくお願いします。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 21:48
by softya(ソフト屋)
net921 さんが書きました:8: bufの最後の文字のアドレスをpEndに代入(見できなかった場合はNULL(0)を代入)
10:無限ループ
12:最初の区切り文字のアドレスをptrに代入①
14:ptrが0(NULL)であれば下記を実行,そうでなければelse文を実行
16:bufのアドレスがbuf最後の文字のアドレスより大きいまたは同じであれば実行
17:無限ループを抜ける
19:ptrにbufの最後の文字のアドレスを代入
21:①で得たアドレスの中をNULLにする。
22:アドレスをひとつずらす(1回目のループでは二個目の区切り文字の所)②
24:$からNULLがあるところまで表示
27:②のアドレスをbufに代入

でよろしくお願いします。
規約違反になりますので前回の質問を先にお願いします。
解決なら解決マークと解決状況の投稿、未解決なら再質問をして下さい。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 21:53
by softya(ソフト屋)
softya(ソフト屋) さんが書きました:
net921 さんが書きました:8: bufの最後の文字のアドレスをpEndに代入(見できなかった場合はNULL(0)を代入)
10:無限ループ
12:最初の区切り文字のアドレスをptrに代入①
14:ptrが0(NULL)であれば下記を実行,そうでなければelse文を実行
16:bufのアドレスがbuf最後の文字のアドレスより大きいまたは同じであれば実行
17:無限ループを抜ける
19:ptrにbufの最後の文字のアドレスを代入
21:①で得たアドレスの中をNULLにする。
22:アドレスをひとつずらす(1回目のループでは二個目の区切り文字の所)②
24:$からNULLがあるところまで表示
27:②のアドレスをbufに代入

でよろしくお願いします。
規約違反になりますので前回の質問を先にお願いします。
解決なら解決マークと解決状況の投稿、未解決なら再質問をして下さい。
申し訳ないですが解決した状況を説明して下さい。
その答えでは、他の人の参考にはなりませんのでプログラムが出来ているなら投稿をお願いします。
※ 規約に書いてある義務事項です。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 21:56
by net921
諦めてしまったので解決です。
僕にはまだ早いみたいです。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 21:59
by softya(ソフト屋)
net921 さんが書きました:諦めてしまったので解決です。
僕にはまだ早いみたいです。
では、各トピックに分かるように書いて頂けますか。

それと
net921 さんが書きました:一時的であればいいみたいです
規約にある通り無闇な削除は許されませので画像を削除しようと考えている場合は規約上問題です。
元のプログラムで投稿に問題が有るなら元のプログラムの作成者に許可を取っていただけると助かります。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 22:01
by net921
画像については大丈夫です。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 22:18
by softya(ソフト屋)
元プログラム自体にバグが見受けられます。
コメント以前の問題ですが、どうされますか?

コード:

8:stlrenとポインタの計算の考え方が間違っていると思います。ちなみに文字列の終端はNULLではなくNUL文字です。
\0とかヌル文字とか表現するならOKですが、NULLはNULLポインタ値と混同するので避けて下さい。

10:無限ループ → 私も不要だと思います。

12:最初の区切り文字のアドレスをptrに代入①
 → 最初だけに限定しません。

14:ptrが0(NULL)であれば下記を実行,そうでなければelse文を実行
 → これも見て分かるコメントです。書くならNULLはどういう意味か書くべきです。

16:bufのアドレスがbuf最後の文字のアドレスより大きいまたは同じであれば実行
17:無限ループを抜ける
 → これも見て分かるコメントです。書くならbreakも含めて抜ける条件を簡潔に書くべきです。

19:ptrにbufの最後の文字のアドレスを代入
 → これは元プログラムのバグだと思います。と言うかsep処理が継続しないのでプログラム的に変では?
[訂正]間違えました、後で訂正してあります。

21:①で得たアドレスの中をNULLにする。
 → 上と同様にNULLとヌル文字を混同しています。また、元のプログラムも書き方が悪いです。

22:アドレスをひとつずらす(1回目のループでは二個目の区切り文字の所)②
 → いいえ違います。それと元プログラムに重症なバグがあります。
[訂正]これも問題なかったです。ただ自分の趣味で直してもらいました。

24:$からNULLがあるところまで表示
 → $からって何処でしょう?

27:②のアドレスをbufに代入
 → ②だけではありません。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 22:22
by net921
ありがとうございます。
プログラムを書きなおすとしたらどのように書き直せばいいのでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 22:29
by softya(ソフト屋)
net921 さんが書きました:ありがとうございます。
プログラムを書きなおすとしたらどのように書き直せばいいのでしょうか?
ごめんなさい。
19:ptrにbufの最後の文字のアドレスを代入
については私の勘違いなので、こう修正させてもらいます。

19:ptrにbufの最後の文字のアドレスを代入
 → つまりどういう意味が?ってところが大事なので、それを書いて下さい。
 ちょっとトリッキーな処理なのでおすすめ出来ない処理ではあります。

22は、最後にセパレータ文字が来た時に暴走する恐れがあります。
16を12の前にやる方が良いと思います。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 22:36
by net921
無理言ってお願いしたら載せてもいいとのことでした。


ここまで出来ました。
あとはどのように変えればいいのでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 22:48
by softya(ソフト屋)
22もよく考えたら大丈夫ですかね。申し訳ない。
新しく書き換えたプログラムでも問題なく動作しますので、これで行きましょう(私はこちらの方が好き)。
ただ、非常に脳内トレースし辛いプログラムですね。

コメントに関しての注意点は書いた通りですが、修正されていない所も多数ありそれはご自分で考えないと意味が無いのではないでしょうか?
じっくり考えて下さい。そして今回もNULLとヌル文字か混同されています(今度は全部逆になっただけ)。
出だしのpEndから大きく説明が間違っていますので、コメントだけを見てプログラムが書けますか?やってみてください。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 22:58
by net921
出だしのpEndから大きく説明が間違
アドレスをひとつずらす(1回目のループでは二個目の区切り文字の所)②
 → いいえ違います。それと元プログラムに重症なバグがあります。
ここはどのように直せばいいでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 23:14
by softya(ソフト屋)
22の件は解決しています。

pEnd = buf + strlen(buf); //bufの最後の文字のアドレスをpEndに代入(なかった場合は\0を代入)
についてはstrlen(buf)で求まるのは何の長さでしょうか?
そしてそれをbufに足すと何の値が求まるのでしょうか? ここの解説が間違っています。
あと(なかった場合は\0を代入)はNUL文字の説明だと思いますが、こんな動作していますか?
NULLとヌル文字の言葉を正しく使い分けて下さい。

と言うことで8からひとつづつコメントを考えて行きましょう。

Re: プログラムの動きについて

Posted: 2012年5月03日(木) 23:23
by net921
(なかった場合は\0を代入)
は16行目ですね。多分。OKですか?
>trlen(buf)で求まるのは何の長さでしょうか?
  '\0'を含まない文字列長
です。
いったいpEnd = buf + strlen(buf); は何を求めているのでしょうか??

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 00:13
by softya(ソフト屋)
net921 さんが書きました:(なかった場合は\0を代入)
は16行目ですね。多分。OKですか?
それも違います。
ヌル文字を代入している所はありません。
[訂正]ヌル文字を代入している所は一箇所だけありますが16行目ではありません。
net921 さんが書きました: >trlen(buf)で求まるのは何の長さでしょうか?
  '\0'を含まない文字列長
です。
いったいpEnd = buf + strlen(buf); は何を求めているのでしょうか??
そこを考えないと意味が無いんですが、じゃあ例題を出してみましょう。

"A"と言う1文字の文字列がbufに格納されていたとします。bufのポインタ値は0x10000と仮定します(実際は違います)。
この状況で、
(1)buf[0]に格納されている値。
(2)buf[1]に格納されている値。
(3)strlen(buf);が返す値
(4)pEndのポインタ値。
(5)pEnd[0]の値。
それぞれどうなるでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 08:34
by net921
(なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?

>(1)buf[0]に格納されている値。 A

>(2)buf[1]に格納されている値。 \0

>(3)strlen(buf);が返す値 1

>(4)pEndのポインタ値。わからない

>(5)pEnd[0]の値。 わからない

こんな感じでOKですか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 10:34
by softya(ソフト屋)
> (なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?

これは、どの行の事を行っているのでしょうか?

>>(4)pEndのポインタ値。わからない
>>(5)pEnd[0]の値。 わからない
>こんな感じでOKですか?

わからないのはOKじゃないですよね。
理解できていないもののコメントを書けるはずはないので勉強しましょう。
配列、文字列、ポインタに関しての理解が不足していますのでお持ちの入門書などをまず確認して下さい。

参考サイト。
「C言語ポイント学習(文字列・ポインタと配列)」
http://www2.netf.org/pointer3.html

最後にprintf()をつかって
pEnd = buf + strlen(buf);
を私の書いた問題(1)~(5)を検証するプログラムを書いてみてください。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 13:11
by net921

コード:

#include <stdio.h>
#include <string.h>

 
void main(void )
{
	char *ptr,*pEnd;
char buf[] = "A";
printf("%d\n",buf[0]);
printf("%d\n",buf[1]);
printf("%d\n",strlen(buf));
printf("%p\n",pEnd);
//printf("%p\n",pEnd[0]);
printf("%p\n",ptr);


}
>(1)buf[0]に格納されている値。 65

>(2)buf[1]に格納されている値。 0

>(3)strlen(buf);が返す値 1

>(4)pEndのポインタ値。cccccccc

>(5)pEnd[0]はアクセス違反みたいです。

でした。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 13:15
by softya(ソフト屋)
肝心の
pEnd = buf + strlen(buf);
が無いのでエラーになりますよ。

あとインデントは正確に。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 13:19
by net921

コード:

#include <stdio.h>
#include <string.h>

 
void main(void )
{
	char *ptr,*pEnd;
	char buf[] = "A";
	
	printf("%d\n",buf[0]);
	printf("%d\n",buf[1]);
	printf("%d\n",strlen(buf));
	printf("%p\n",pEnd);
	pEnd = buf + strlen(buf); 
	printf("%p\n",pEnd[0]);


}
65

0

1

cccccccc

00000000

でした。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 13:22
by softya(ソフト屋)
pEnd = buf + strlen(buf);
の場所が違います。
printf("%d\n",buf[1]);
が%dで
printf("%p\n",pEnd[0]);
が%pなのは何故ですか?

【補足】
少し心配になりました。
・C言語の命令は上から順番に実行される。
・初期化・代入されていない変数の値は不定
ということは理解されていますか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 13:27
by net921

コード:

#include <stdio.h>
#include <string.h>

 
void main(void )
{
	char *ptr,*pEnd;
	char buf[] = "A";
	pEnd = buf + strlen(buf);
	printf("%d\n",buf[0]);
	printf("%d\n",buf[1]);
	printf("%d\n",strlen(buf));
	printf("%p\n",pEnd);
	printf("%p\n",pEnd[0]);


}
65
0
1
0035FB65
00000000

(1)に「値」と書いてあったので値にしました。
%pはアドレス値を出力するためです。
補足については理解しています。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 13:29
by softya(ソフト屋)
net921 さんが書きました:(1)に「値」と書いてあったので値にしました。
%pはアドレス値を出力するためです。
pEndとpEnd[0]の違いは何でしょうか?
あと(6)としてbufのポインタ値を追加しておきます。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 13:31
by net921
pEndはpEnd[0],pEnd[1]...のまとまったもの
pEnd[0]はpEndの要素みたいな感じですか?

これでいいのでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:15
by net921
これでいいのでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:30
by softya(ソフト屋)
net921 さんが書きました:pEndはpEnd[0],pEnd[1]...のまとまったもの
pEnd[0]はpEndの要素みたいな感じですか?

これでいいのでしょうか?
まぁ、そうあわてないで下さい。
常に机の前に座っている訳ではないので。

pEndとpEnd[0]は扱える値が違いますし操作するメモリも違います。
ポインタを配列操作する意味をよく考えてみましょう。
そこで質問です。pEndとpEnd[0]でそれぞれ扱う値の型と値の範囲を答えてみてください。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:34
by net921
そうしたらアドレス値もかわります。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:35
by softya(ソフト屋)
net921 さんが書きました:そうしたらアドレス値もかわります。
これはどういう意味でしょう?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:37
by net921
アドレスを指定していないから適当なところに作られるのではないでしょうか?
型と値の範囲
とは
int char longとかですか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:45
by softya(ソフト屋)
net921 さんが書きました:アドレスを指定していないから適当なところに作られるのではないでしょうか?
うーん。一般論で答えを聞きたかったんですが質問の仕方を変えましょう。
例を書きます。一般的なWindowsPC限定の話ですが、
char aa;
と有った場合aaの型はcharで値の範囲は-128~127までで16進だと0x00~0xffです。
これと同様に
char *pEnd;
定義されていた場合のpEndとpEnd[0]のそれぞれ型と値の範囲を説明してみてください。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:48
by net921
これを答えるのを忘れていました。
>> (なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?
>これは、どの行の事を行っているのでしょうか?
これは16行目の ptr = strpbrk(buf,Sep); //最初の区切り文字のアドレスをptrに代入①です。

>char *pEnd;
>定義されていた場合のpEndとpEnd[0]の型と値の範囲を説明してみてください。
わかりません

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 14:57
by softya(ソフト屋)
net921 さんが書きました:これを答えるのを忘れていました。
>> (なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?
>これは、どの行の事を行っているのでしょうか?
これは16行目の ptr = strpbrk(buf,Sep); //最初の区切り文字のアドレスをptrに代入①です。
そんな事はしていません。
strpbrk関数について調べてみてください。
net921 さんが書きました: >char *pEnd;
>定義されていた場合のpEndとpEnd[0]の型と値の範囲を説明してみてください。
わかりません
そうです。
そこが分かっていないと、この関数の機能にコメントを付けることは出来ません。
なので、そこを勉強しましょう。

ここのサイトをじっくり読んでみてください。
※ 書かれた情報が古いのでintが2バイトになっていますが、現代の一般的なWindowsPCのintは4バイトです。
「第10章 ポインタ」
http://www9.plala.or.jp/sgwr-t/c/sec10.html
http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
http://www9.plala.or.jp/sgwr-t/c/sec10-3.html
読んで理解した上で、pEndとpEnd[0]についてお応え下さい。
それでも分からないという事であれば、別の説明も考えてみます。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:01
by net921
もう時間がないのでとりあえずプログラムの修正とコメントの修正をお願いします。
今日中です。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:05
by softya(ソフト屋)
net921 さんが書きました:もう時間がないのでとりあえずプログラムの修正とコメントの修正をお願いします。
今日中です。
急ぐ理由を教えて下さい。
理解することが大事で、単に答えを書くことはご本人のためにはなりません。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:08
by net921
この続きはどんどん質問していくのですが、理由は明日から学校です。
よろしくお願いします。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:16
by softya(ソフト屋)
net921 さんが書きました:この続きはどんどん質問していくのですが、理由は明日から学校です。
よろしくお願いします。
課題・宿題ではないということですね?
であれば、基礎的なことか理解しましょう。
コメントが書けるのは2次的な事で根本を理解しなければ意味はありません。

たとえば、このプログラムを私流に書き直すと次のようになります。
どうです? 同じ動作をするプログラムだと理解できますか?

コード:

#include <stdio.h>
#include <string.h>

void StrTok(char *buf,char *Sep)
{
	char *pEnd = buf + strlen(buf);
	while( buf<pEnd ){
		char *sep_ptr = strpbrk(buf,Sep);
 		if( sep_ptr!=NULL ) {
	        *sep_ptr = '\0';
        }
        printf(">%s \n", buf);
        if( sep_ptr==NULL ) {
			break;
		} else {
			buf = sep_ptr + 1;
		}
	}
}

void main(void )
{
	char buf[] = "$GPGGA,,,,,,0,02,,,,,,,*64";
 	StrTok(buf,","); //「,」で区切る
}

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:22
by net921
いろいろなところが短くなっています。
なんとなくですがわかります。
strpbrk(buf,Sep); //文字がない場合は、NULL ポインタを返す。
でいいですか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:25
by softya(ソフト屋)
net921 さんが書きました:いろいろなところが短くなっています。
なんとなくですがわかります。
strpbrk(buf,Sep); //文字がない場合は、NULL ポインタを返す。
でいいですか?
短くしたというよりわかりやすくしたつもりなんですけどね。
strpbrkについては半分正解ですがstrpbrk(buf,Sep);に説明としては説明不足です。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:30
by net921
コメントをつけるとしたらどの行がいいですか?
あと、僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムを比べるとsoftya(ソフト屋) さんのほうが完璧に動くのでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:36
by softya(ソフト屋)
net921 さんが書きました:コメントをつけるとしたらどの行がいいですか?
あと、僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムを比べるとsoftya(ソフト屋) さんのほうが完璧に動くのでしょうか?
どっちも同じ動きをしますので問題ありません。
元のままでやってもらって構いません。

どの行にコメントを付けるかについては、No: 19のソースコードに付けるなら
8,12、16,18,19,21,22,24,26行目でしょうね。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:38
by net921
No: 19のソースコードのコメントの修正をお願いします。
僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムは処理速度が変わったりするのでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:46
by softya(ソフト屋)
net921 さんが書きました:No: 19のソースコードのコメントの修正をお願いします。
僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムは処理速度が変わったりするのでしょうか?
私の話はどうなったのでしょう?
No: 14で間違っているところは指摘したはずですが、理解出来ないところは質問して下さい。
そして、pEndについても理解して下さい。ここで理解できないと後半も理解できるはずがありません。

ちなみに速度はコンパイラの最適化で同等だと思います。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 15:57
by net921
①と②にコメントを書くとしたらどのように書けばいいでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:08
by net921
宿題ではないのですが明日先生に説明するのです。
原稿10枚ほど書く必要があるので(すべてプログラムのことではないのですが)また3分の1くらいしか終わっていません。
急いでいます。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:14
by softya(ソフト屋)
それじゃ余計理解しないといけません。
中途半端だとすぐ化けの皮が剥がれますよ。

コード:

#include <stdio.h>
#include <string.h>
 
void StrTok(char *buf,char *Sep)
{
    char *pEnd = buf + strlen(buf);//① ←何度も言いますが理解して下さい。
    while( buf<pEnd ){//←コメントが必要です。
        char *sep_ptr = strpbrk(buf,Sep);//分割する文字がない場合は、NULL ポインタを返す。 ←NGパターンしか説明していません。
        if( sep_ptr!=NULL ) {//分割する文字があった場合そこのアドレスの中を\0にする。←で結局どうなるの?と言った感じのコメントです。これは何のために行っていますか?こうすると何処に影響があるんでしょう?
            *sep_ptr = '\0';
        }
        printf(">%s \n", buf);//bufの\0まで表示。
        if( sep_ptr==NULL ) {//分割する文字がなかったらなくなったらループを抜ける
            break;
        } else {
            buf = sep_ptr + 1;//←②sep_ptrが指している値はなんでしょうか?そして、それを+1する意味は?
        }
    }
}

int main(void)
{
    char buf[] = "$GPGGA,,,,,,0,02,,,,,,,*64";
    StrTok(buf,","); //「,」で区切る
    return 0;
}

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:22
by net921
① ←何度も言いますが理解して下さい わかりません
c言語おすすめ本

(アフェリエイトが貼られていたので削除しました。 管理人)

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:40
by h2so5
なぜ+1が必要かどうか分からないなら、消して実行してみてください。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:47
by net921
buf = sep_ptr;//ポインタを次の文字に移動
でいいですか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:57
by net921
buf = sep_ptr;//次の文字のアドレスを代入
でいいですか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:57
by ISLe
net921 さんが書きました:宿題ではないのですが明日先生に説明するのです。
ちょっと気になったんですが。
質問にあったソースコードは先生に指定されたものってことではないのですかね。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 16:59
by net921
いや、指定されてはいないです。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 18:33
by softya(ソフト屋)
投稿から時間も大分立っているみたいですが、+1をした場合としない場合の違いは試されたのでしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 19:42
by net921
もちろん試しました。
*sep_ptrには10行目の処理で¥0ですね。
+1がないと次のループのときにループを抜けてしまいます。
あと、修正する部分は何処でしょうか?

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 19:45
by softya(ソフト屋)
net921 さんが書きました:もちろん試しました。
*sep_ptrには10行目の処理で¥0ですね。
+1がないと次のループのときにループを抜けてしまいます。
あと、修正する部分は何処でしょうか?
今の現状を見せてください。

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 19:49
by net921
c言語おすすめ本

(アフェリエイトが貼られていたので削除しました。 管理人)

Re: プログラムの動きについて

Posted: 2012年5月04日(金) 21:17
by softya(ソフト屋)
ちゃんと突っ込まれても解説できるならこれでOKだと思います。

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 17:09
by net921
c言語おすすめ本

(アフェリエイトが貼られていたので削除しました。 管理人)

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 17:23
by softya(ソフト屋)
申し訳ないですがアフィリエイト付き広告でしたので一時的にアフィリエイトを外させて頂きました。
OKかどうかは管理人間で協議させて頂きます。

個人的見解としては話の脈略も何いので広告とみなさるかと思います。

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 17:31
by net921
皆さんはプログラムを始めて何年くらいですか??

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 17:35
by softya(ソフト屋)
net921 さんが書きました:皆さんはプログラムを始めて何年くらいですか??
このトピックと関係ないので【雑談】トピックを新たに立ち上げて下さい。
それとユーザー登録者はプロフィールに大体書いてあると思います。

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 17:41
by net921
アフィリエイトはだめなのですか?

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 17:48
by softya(ソフト屋)
net921 さんが書きました:アフィリエイトはだめなのですか?
極端にアフィリエイトしているのを嫌がる人もいるので、公の場である掲示板で何も言わずにアフィリエイトするのは嫌われる原因になることがあります。
アフィリエイトをどうするかは管理人(Dixq)さんと協議中です。

[補足]
掲示板が荒れる & 他の広告を呼び込む などの害も考えられます。
ついでに言うなら、ご自分のサイトのアクセス数で勝負すべきものを他人の掲示板のアクセス数が多いところで稼ぐのは悲しい事ではないでしょうか?。 [少し修正]
あるいは、こう考えてみてください。みんなが好き勝手にアフィリエイトリンクしているサイトを信用することが出来るでしょうか? 単に広告したいだけじゃ?と疑いたくなりませんか?[追記]

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 18:54
by net921
解決しました。

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 21:05
by softya(ソフト屋)
報告いたします。
管理人(Dixq)さんとの協議の結果、アフィリエト・リンクは掲示板的にNGと言うことになりました。
フォーラムルールは後ほど変更してもらうことになりますが、ご了承下さい。

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 22:28
by softya(ソフト屋)
あちこち規約に違反して書き換えている様ですのでトピックを閉鎖しました。
それと消された記事についても後日修復する予定です。

Re: プログラムの動きについて

Posted: 2012年5月05日(土) 23:39
by Dixq (管理人)
既に投稿された文章を正当な理由なく削除する行為は規約違反になります。また、不正に削除された内容は後日復元する決まりになっています。

本掲示板は自由に利用して欲しい旨記載しておりますが、アフェリエイトについては、利用規約の
「一般常識に反する行為と管理者が判断する行為」
に該当すると判断したため、利用規約に追加しました。

今後アフェリエイトを使って購入を促す行為は自粛頂ますようお願い致します。