プログラムの動きについて
プログラムの動きについて
画像が消されたので復元させて頂きました。 by softya(ソフト屋)
自分なりには正しいと思うのですがおかしな所があったら教えて下さい。
上記のようにプログラムの解説をコメントで付けました。自分なりには正しいと思うのですがおかしな所があったら教えて下さい。
Re: プログラムの動きについて
ソースコードはcodeタグを用いて貼り付けてもらえると引用がしやすいので良いです。
コメントどうこうより、まずインデントを学習されたほうが良いと思います。
コメントもコメントで、冗長なコメントが多いです。 こんなのはコメントよりif (!ptr)を見れば一瞬で分かることですよね。こういう、プログラムを見れば一瞬で分かるようなことはコメントを書かないほうが良いです。
良いコメントのコツは、プログラムを見ただけでは分からない、この関数は何をする関数なのかとか、このif文は何をするif文なのかとか、高レベルなコメントを書くことです。
コメントどうこうより、まずインデントを学習されたほうが良いと思います。
コメントもコメントで、冗長なコメントが多いです。 こんなのはコメントよりif (!ptr)を見れば一瞬で分かることですよね。こういう、プログラムを見れば一瞬で分かるようなことはコメントを書かないほうが良いです。
良いコメントのコツは、プログラムを見ただけでは分からない、この関数は何をする関数なのかとか、このif文は何をするif文なのかとか、高レベルなコメントを書くことです。
Re: プログラムの動きについて
「3ヶ月前の自分は他人」というプログラミング上の格言(?)に従い、
3ヶ月くらいたってから同じコードをながめてみて、
そのコメントによってコードの動きがすべて理解できたとすれば、
「あぁ、3ヶ月前に書いたコメントは正しかったんだ」ということがわかるかもしれません。
また、
while (1)
が無限ループを指すことなどについて、
「あぁ、これはコードを読めばすぐにわかる、むだなコメントだ」というようなことも
ついでにわかるかもしれません。
3ヶ月くらいたってから同じコードをながめてみて、
そのコメントによってコードの動きがすべて理解できたとすれば、
「あぁ、3ヶ月前に書いたコメントは正しかったんだ」ということがわかるかもしれません。
また、
while (1)
が無限ループを指すことなどについて、
「あぁ、これはコードを読めばすぐにわかる、むだなコメントだ」というようなことも
ついでにわかるかもしれません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: プログラムの動きについて
他の人が書いたプログラムなのでソースコードをそのまま書かないほうがいいとおもいました
とりあえずコメントは合っているでしょうか?
とりあえずコメントは合っているでしょうか?
最後に編集したユーザー net921 on 2012年5月03日(木) 20:59 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
前の質問を放置しないようにお願いします。
「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タグで投稿して下さい。
「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 さんが書きました:他の人が書いたプログラムなのでソースコードをそのまま書かないほうがいいとおもいました
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
8: bufの最後の文字のアドレスをpEndに代入(見できなかった場合はNULL(0)を代入)
でよろしくお願いします。
でよろしくお願いします。
最後に編集したユーザー net921 on 2012年5月05日(土) 17:21 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
規約違反になりますので前回の質問を先にお願いします。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に代入
でよろしくお願いします。
解決なら解決マークと解決状況の投稿、未解決なら再質問をして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
申し訳ないですが解決した状況を説明して下さい。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に代入
でよろしくお願いします。
解決なら解決マークと解決状況の投稿、未解決なら再質問をして下さい。
その答えでは、他の人の参考にはなりませんのでプログラムが出来ているなら投稿をお願いします。
※ 規約に書いてある義務事項です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
では、各トピックに分かるように書いて頂けますか。net921 さんが書きました:諦めてしまったので解決です。
僕にはまだ早いみたいです。
それと
規約にある通り無闇な削除は許されませので画像を削除しようと考えている場合は規約上問題です。net921 さんが書きました:一時的であればいいみたいです
元のプログラムで投稿に問題が有るなら元のプログラムの作成者に許可を取っていただけると助かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
元プログラム自体にバグが見受けられます。
コメント以前の問題ですが、どうされますか?
コメント以前の問題ですが、どうされますか?
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に代入
→ ②だけではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
ごめんなさい。net921 さんが書きました:ありがとうございます。
プログラムを書きなおすとしたらどのように書き直せばいいのでしょうか?
19:ptrにbufの最後の文字のアドレスを代入
については私の勘違いなので、こう修正させてもらいます。
19:ptrにbufの最後の文字のアドレスを代入
→ つまりどういう意味が?ってところが大事なので、それを書いて下さい。
ちょっとトリッキーな処理なのでおすすめ出来ない処理ではあります。
22は、最後にセパレータ文字が来た時に暴走する恐れがあります。
16を12の前にやる方が良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
無理言ってお願いしたら載せてもいいとのことでした。
ここまで出来ました。
あとはどのように変えればいいのでしょうか?
ここまで出来ました。
あとはどのように変えればいいのでしょうか?
最後に編集したユーザー net921 on 2012年5月05日(土) 17:13 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
22もよく考えたら大丈夫ですかね。申し訳ない。
新しく書き換えたプログラムでも問題なく動作しますので、これで行きましょう(私はこちらの方が好き)。
ただ、非常に脳内トレースし辛いプログラムですね。
コメントに関しての注意点は書いた通りですが、修正されていない所も多数ありそれはご自分で考えないと意味が無いのではないでしょうか?
じっくり考えて下さい。そして今回もNULLとヌル文字か混同されています(今度は全部逆になっただけ)。
出だしのpEndから大きく説明が間違っていますので、コメントだけを見てプログラムが書けますか?やってみてください。
新しく書き換えたプログラムでも問題なく動作しますので、これで行きましょう(私はこちらの方が好き)。
ただ、非常に脳内トレースし辛いプログラムですね。
コメントに関しての注意点は書いた通りですが、修正されていない所も多数ありそれはご自分で考えないと意味が無いのではないでしょうか?
じっくり考えて下さい。そして今回もNULLとヌル文字か混同されています(今度は全部逆になっただけ)。
出だしのpEndから大きく説明が間違っていますので、コメントだけを見てプログラムが書けますか?やってみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
出だしのpEndから大きく説明が間違
ここはどのように直せばいいでしょうか?アドレスをひとつずらす(1回目のループでは二個目の区切り文字の所)②
→ いいえ違います。それと元プログラムに重症なバグがあります。
最後に編集したユーザー net921 on 2012年5月05日(土) 17:16 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
22の件は解決しています。
pEnd = buf + strlen(buf); //bufの最後の文字のアドレスをpEndに代入(なかった場合は\0を代入)
についてはstrlen(buf)で求まるのは何の長さでしょうか?
そしてそれをbufに足すと何の値が求まるのでしょうか? ここの解説が間違っています。
あと(なかった場合は\0を代入)はNUL文字の説明だと思いますが、こんな動作していますか?
NULLとヌル文字の言葉を正しく使い分けて下さい。
と言うことで8からひとつづつコメントを考えて行きましょう。
pEnd = buf + strlen(buf); //bufの最後の文字のアドレスをpEndに代入(なかった場合は\0を代入)
についてはstrlen(buf)で求まるのは何の長さでしょうか?
そしてそれをbufに足すと何の値が求まるのでしょうか? ここの解説が間違っています。
あと(なかった場合は\0を代入)はNUL文字の説明だと思いますが、こんな動作していますか?
NULLとヌル文字の言葉を正しく使い分けて下さい。
と言うことで8からひとつづつコメントを考えて行きましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
(なかった場合は\0を代入)
は16行目ですね。多分。OKですか?
>trlen(buf)で求まるのは何の長さでしょうか?
'\0'を含まない文字列長
です。
いったいpEnd = buf + strlen(buf); は何を求めているのでしょうか??
は16行目ですね。多分。OKですか?
>trlen(buf)で求まるのは何の長さでしょうか?
'\0'を含まない文字列長
です。
いったいpEnd = buf + strlen(buf); は何を求めているのでしょうか??
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
それも違います。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]の値。
それぞれどうなるでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
(なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?
>(1)buf[0]に格納されている値。 A
>(2)buf[1]に格納されている値。 \0
>(3)strlen(buf);が返す値 1
>(4)pEndのポインタ値。わからない
>(5)pEnd[0]の値。 わからない
こんな感じでOKですか?
>(1)buf[0]に格納されている値。 A
>(2)buf[1]に格納されている値。 \0
>(3)strlen(buf);が返す値 1
>(4)pEndのポインタ値。わからない
>(5)pEnd[0]の値。 わからない
こんな感じでOKですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
> (なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?
これは、どの行の事を行っているのでしょうか?
>>(4)pEndのポインタ値。わからない
>>(5)pEnd[0]の値。 わからない
>こんな感じでOKですか?
わからないのはOKじゃないですよね。
理解できていないもののコメントを書けるはずはないので勉強しましょう。
配列、文字列、ポインタに関しての理解が不足していますのでお持ちの入門書などをまず確認して下さい。
参考サイト。
「C言語ポイント学習(文字列・ポインタと配列)」
http://www2.netf.org/pointer3.html
最後にprintf()をつかって
pEnd = buf + strlen(buf);
を私の書いた問題(1)~(5)を検証するプログラムを書いてみてください。
これは、どの行の事を行っているのでしょうか?
>>(4)pEndのポインタ値。わからない
>>(5)pEnd[0]の値。 わからない
>こんな感じでOKですか?
わからないのはOKじゃないですよね。
理解できていないもののコメントを書けるはずはないので勉強しましょう。
配列、文字列、ポインタに関しての理解が不足していますのでお持ちの入門書などをまず確認して下さい。
参考サイト。
「C言語ポイント学習(文字列・ポインタと配列)」
http://www2.netf.org/pointer3.html
最後にprintf()をつかって
pEnd = buf + strlen(buf);
を私の書いた問題(1)~(5)を検証するプログラムを書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
#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);
}
>(2)buf[1]に格納されている値。 0
>(3)strlen(buf);が返す値 1
>(4)pEndのポインタ値。cccccccc
>(5)pEnd[0]はアクセス違反みたいです。
でした。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
肝心の
pEnd = buf + strlen(buf);
が無いのでエラーになりますよ。
あとインデントは正確に。
pEnd = buf + strlen(buf);
が無いのでエラーになりますよ。
あとインデントは正確に。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
pEnd = buf + strlen(buf);
の場所が違います。
printf("%d\n",buf[1]);
が%dで
printf("%p\n",pEnd[0]);
が%pなのは何故ですか?
【補足】
少し心配になりました。
・C言語の命令は上から順番に実行される。
・初期化・代入されていない変数の値は不定
ということは理解されていますか?
の場所が違います。
printf("%d\n",buf[1]);
が%dで
printf("%p\n",pEnd[0]);
が%pなのは何故ですか?
【補足】
少し心配になりました。
・C言語の命令は上から順番に実行される。
・初期化・代入されていない変数の値は不定
ということは理解されていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
#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]);
}
0
1
0035FB65
00000000
(1)に「値」と書いてあったので値にしました。
%pはアドレス値を出力するためです。
補足については理解しています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
pEndとpEnd[0]の違いは何でしょうか?net921 さんが書きました:(1)に「値」と書いてあったので値にしました。
%pはアドレス値を出力するためです。
あと(6)としてbufのポインタ値を追加しておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
pEndはpEnd[0],pEnd[1]...のまとまったもの
pEnd[0]はpEndの要素みたいな感じですか?
これでいいのでしょうか?
pEnd[0]はpEndの要素みたいな感じですか?
これでいいのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
まぁ、そうあわてないで下さい。net921 さんが書きました:pEndはpEnd[0],pEnd[1]...のまとまったもの
pEnd[0]はpEndの要素みたいな感じですか?
これでいいのでしょうか?
常に机の前に座っている訳ではないので。
pEndとpEnd[0]は扱える値が違いますし操作するメモリも違います。
ポインタを配列操作する意味をよく考えてみましょう。
そこで質問です。pEndとpEnd[0]でそれぞれ扱う値の型と値の範囲を答えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
これはどういう意味でしょう?net921 さんが書きました:そうしたらアドレス値もかわります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
アドレスを指定していないから適当なところに作られるのではないでしょうか?
型と値の範囲
とは
int char longとかですか?
型と値の範囲
とは
int char longとかですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
うーん。一般論で答えを聞きたかったんですが質問の仕方を変えましょう。net921 さんが書きました:アドレスを指定していないから適当なところに作られるのではないでしょうか?
例を書きます。一般的なWindowsPC限定の話ですが、
char aa;
と有った場合aaの型はcharで値の範囲は-128~127までで16進だと0x00~0xffです。
これと同様に
char *pEnd;
定義されていた場合のpEndとpEnd[0]のそれぞれ型と値の範囲を説明してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
これを答えるのを忘れていました。
>> (なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?
>これは、どの行の事を行っているのでしょうか?
これは16行目の ptr = strpbrk(buf,Sep); //最初の区切り文字のアドレスをptrに代入①です。
>char *pEnd;
>定義されていた場合のpEndとpEnd[0]の型と値の範囲を説明してみてください。
わかりません
>> (なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?
>これは、どの行の事を行っているのでしょうか?
これは16行目の ptr = strpbrk(buf,Sep); //最初の区切り文字のアドレスをptrに代入①です。
>char *pEnd;
>定義されていた場合のpEndとpEnd[0]の型と値の範囲を説明してみてください。
わかりません
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
そんな事はしていません。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]についてお応え下さい。
それでも分からないという事であれば、別の説明も考えてみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
急ぐ理由を教えて下さい。net921 さんが書きました:もう時間がないのでとりあえずプログラムの修正とコメントの修正をお願いします。
今日中です。
理解することが大事で、単に答えを書くことはご本人のためにはなりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
課題・宿題ではないということですね?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,","); //「,」で区切る
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
いろいろなところが短くなっています。
なんとなくですがわかります。
strpbrk(buf,Sep); //文字がない場合は、NULL ポインタを返す。
でいいですか?
なんとなくですがわかります。
strpbrk(buf,Sep); //文字がない場合は、NULL ポインタを返す。
でいいですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
短くしたというよりわかりやすくしたつもりなんですけどね。net921 さんが書きました:いろいろなところが短くなっています。
なんとなくですがわかります。
strpbrk(buf,Sep); //文字がない場合は、NULL ポインタを返す。
でいいですか?
strpbrkについては半分正解ですがstrpbrk(buf,Sep);に説明としては説明不足です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
コメントをつけるとしたらどの行がいいですか?
あと、僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムを比べるとsoftya(ソフト屋) さんのほうが完璧に動くのでしょうか?
あと、僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムを比べるとsoftya(ソフト屋) さんのほうが完璧に動くのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
どっちも同じ動きをしますので問題ありません。net921 さんが書きました:コメントをつけるとしたらどの行がいいですか?
あと、僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムを比べるとsoftya(ソフト屋) さんのほうが完璧に動くのでしょうか?
元のままでやってもらって構いません。
どの行にコメントを付けるかについては、No: 19のソースコードに付けるなら
8,12、16,18,19,21,22,24,26行目でしょうね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
No: 19のソースコードのコメントの修正をお願いします。
僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムは処理速度が変わったりするのでしょうか?
僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムは処理速度が変わったりするのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
私の話はどうなったのでしょう?net921 さんが書きました:No: 19のソースコードのコメントの修正をお願いします。
僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムは処理速度が変わったりするのでしょうか?
No: 14で間違っているところは指摘したはずですが、理解出来ないところは質問して下さい。
そして、pEndについても理解して下さい。ここで理解できないと後半も理解できるはずがありません。
ちなみに速度はコンパイラの最適化で同等だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
①と②にコメントを書くとしたらどのように書けばいいでしょうか?
最後に編集したユーザー net921 on 2012年5月05日(土) 17:17 [ 編集 1 回目 ]
Re: プログラムの動きについて
宿題ではないのですが明日先生に説明するのです。
原稿10枚ほど書く必要があるので(すべてプログラムのことではないのですが)また3分の1くらいしか終わっていません。
急いでいます。
原稿10枚ほど書く必要があるので(すべてプログラムのことではないのですが)また3分の1くらいしか終わっていません。
急いでいます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
それじゃ余計理解しないといけません。
中途半端だとすぐ化けの皮が剥がれますよ。
中途半端だとすぐ化けの皮が剥がれますよ。
#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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
① ←何度も言いますが理解して下さい わかりません
c言語おすすめ本
(アフェリエイトが貼られていたので削除しました。 管理人)
c言語おすすめ本
(アフェリエイトが貼られていたので削除しました。 管理人)
最後に編集したユーザー net921 on 2012年5月05日(土) 18:45 [ 編集 3 回目 ]
Re: プログラムの動きについて
なぜ+1が必要かどうか分からないなら、消して実行してみてください。
Re: プログラムの動きについて
ちょっと気になったんですが。net921 さんが書きました:宿題ではないのですが明日先生に説明するのです。
質問にあったソースコードは先生に指定されたものってことではないのですかね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
投稿から時間も大分立っているみたいですが、+1をした場合としない場合の違いは試されたのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
もちろん試しました。
*sep_ptrには10行目の処理で¥0ですね。
+1がないと次のループのときにループを抜けてしまいます。
あと、修正する部分は何処でしょうか?
*sep_ptrには10行目の処理で¥0ですね。
+1がないと次のループのときにループを抜けてしまいます。
あと、修正する部分は何処でしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
今の現状を見せてください。net921 さんが書きました:もちろん試しました。
*sep_ptrには10行目の処理で¥0ですね。
+1がないと次のループのときにループを抜けてしまいます。
あと、修正する部分は何処でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
c言語おすすめ本
(アフェリエイトが貼られていたので削除しました。 管理人)
(アフェリエイトが貼られていたので削除しました。 管理人)
最後に編集したユーザー net921 on 2012年5月05日(土) 18:44 [ 編集 2 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
ちゃんと突っ込まれても解説できるならこれでOKだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムの動きについて
c言語おすすめ本
(アフェリエイトが貼られていたので削除しました。 管理人)
(アフェリエイトが貼られていたので削除しました。 管理人)
最後に編集したユーザー net921 on 2012年5月05日(土) 17:42 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
申し訳ないですがアフィリエイト付き広告でしたので一時的にアフィリエイトを外させて頂きました。
OKかどうかは管理人間で協議させて頂きます。
個人的見解としては話の脈略も何いので広告とみなさるかと思います。
OKかどうかは管理人間で協議させて頂きます。
個人的見解としては話の脈略も何いので広告とみなさるかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
このトピックと関係ないので【雑談】トピックを新たに立ち上げて下さい。net921 さんが書きました:皆さんはプログラムを始めて何年くらいですか??
それとユーザー登録者はプロフィールに大体書いてあると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
極端にアフィリエイトしているのを嫌がる人もいるので、公の場である掲示板で何も言わずにアフィリエイトするのは嫌われる原因になることがあります。net921 さんが書きました:アフィリエイトはだめなのですか?
アフィリエイトをどうするかは管理人(Dixq)さんと協議中です。
[補足]
掲示板が荒れる & 他の広告を呼び込む などの害も考えられます。
ついでに言うなら、ご自分のサイトのアクセス数で勝負すべきものを他人の掲示板のアクセス数が多いところで稼ぐのは悲しい事ではないでしょうか?。 [少し修正]
あるいは、こう考えてみてください。みんなが好き勝手にアフィリエイトリンクしているサイトを信用することが出来るでしょうか? 単に広告したいだけじゃ?と疑いたくなりませんか?[追記]
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
報告いたします。
管理人(Dixq)さんとの協議の結果、アフィリエト・リンクは掲示板的にNGと言うことになりました。
フォーラムルールは後ほど変更してもらうことになりますが、ご了承下さい。
管理人(Dixq)さんとの協議の結果、アフィリエト・リンクは掲示板的にNGと言うことになりました。
フォーラムルールは後ほど変更してもらうことになりますが、ご了承下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムの動きについて
あちこち規約に違反して書き換えている様ですのでトピックを閉鎖しました。
それと消された記事についても後日修復する予定です。
それと消された記事についても後日修復する予定です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: プログラムの動きについて
既に投稿された文章を正当な理由なく削除する行為は規約違反になります。また、不正に削除された内容は後日復元する決まりになっています。
本掲示板は自由に利用して欲しい旨記載しておりますが、アフェリエイトについては、利用規約の
「一般常識に反する行為と管理者が判断する行為」
に該当すると判断したため、利用規約に追加しました。
今後アフェリエイトを使って購入を促す行為は自粛頂ますようお願い致します。
本掲示板は自由に利用して欲しい旨記載しておりますが、アフェリエイトについては、利用規約の
「一般常識に反する行為と管理者が判断する行為」
に該当すると判断したため、利用規約に追加しました。
今後アフェリエイトを使って購入を促す行為は自粛頂ますようお願い致します。