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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
net921
記事: 70
登録日時: 13年前

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

#1

投稿記事 by net921 » 13年前

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

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

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

#2

投稿記事 by beatle » 13年前

ソースコードはcodeタグを用いて貼り付けてもらえると引用がしやすいので良いです。

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

コード:

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

net921
記事: 70
登録日時: 13年前

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

#3

投稿記事 by net921 » 13年前

とりあえずコメントは合っているでしょうか?

box
記事: 2002
登録日時: 14年前

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

#4

投稿記事 by box » 13年前

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

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

net921
記事: 70
登録日時: 13年前

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

#5

投稿記事 by net921 » 13年前

他の人が書いたプログラムなのでソースコードをそのまま書かないほうがいいとおもいました
とりあえずコメントは合っているでしょうか?
最後に編集したユーザー net921 on 2012年5月03日(木) 20:59 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

前の質問を放置しないようにお願いします。
「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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#7

投稿記事 by net921 » 13年前

一時的であればいいみたいです

net921
記事: 70
登録日時: 13年前

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

#8

投稿記事 by net921 » 13年前

8: bufの最後の文字のアドレスをpEndに代入(見できなかった場合はNULL(0)を代入)

でよろしくお願いします。
最後に編集したユーザー net921 on 2012年5月05日(土) 17:21 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#9

投稿記事 by softya(ソフト屋) » 13年前

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: プログラムの動きについて

#10

投稿記事 by softya(ソフト屋) » 13年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#11

投稿記事 by net921 » 13年前

諦めてしまったので解決です。
僕にはまだ早いみたいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#12

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:諦めてしまったので解決です。
僕にはまだ早いみたいです。
では、各トピックに分かるように書いて頂けますか。

それと
net921 さんが書きました:一時的であればいいみたいです
規約にある通り無闇な削除は許されませので画像を削除しようと考えている場合は規約上問題です。
元のプログラムで投稿に問題が有るなら元のプログラムの作成者に許可を取っていただけると助かります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#13

投稿記事 by net921 » 13年前

画像については大丈夫です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#14

投稿記事 by softya(ソフト屋) » 13年前

元プログラム自体にバグが見受けられます。
コメント以前の問題ですが、どうされますか?

コード:

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#15

投稿記事 by net921 » 13年前

ありがとうございます。
プログラムを書きなおすとしたらどのように書き直せばいいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#16

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:ありがとうございます。
プログラムを書きなおすとしたらどのように書き直せばいいのでしょうか?
ごめんなさい。
19:ptrにbufの最後の文字のアドレスを代入
については私の勘違いなので、こう修正させてもらいます。

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

22は、最後にセパレータ文字が来た時に暴走する恐れがあります。
16を12の前にやる方が良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#17

投稿記事 by net921 » 13年前

無理言ってお願いしたら載せてもいいとのことでした。


ここまで出来ました。
あとはどのように変えればいいのでしょうか?
最後に編集したユーザー net921 on 2012年5月05日(土) 17:13 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#18

投稿記事 by softya(ソフト屋) » 13年前

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

コメントに関しての注意点は書いた通りですが、修正されていない所も多数ありそれはご自分で考えないと意味が無いのではないでしょうか?
じっくり考えて下さい。そして今回もNULLとヌル文字か混同されています(今度は全部逆になっただけ)。
出だしのpEndから大きく説明が間違っていますので、コメントだけを見てプログラムが書けますか?やってみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#19

投稿記事 by net921 » 13年前

出だしのpEndから大きく説明が間違
アドレスをひとつずらす(1回目のループでは二個目の区切り文字の所)②
 → いいえ違います。それと元プログラムに重症なバグがあります。
ここはどのように直せばいいでしょうか?
最後に編集したユーザー net921 on 2012年5月05日(土) 17:16 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#20

投稿記事 by softya(ソフト屋) » 13年前

22の件は解決しています。

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

と言うことで8からひとつづつコメントを考えて行きましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#21

投稿記事 by net921 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#22

投稿記事 by softya(ソフト屋) » 13年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#23

投稿記事 by net921 » 13年前

(なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?

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

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

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

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

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

こんな感じでOKですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#24

投稿記事 by softya(ソフト屋) » 13年前

> (なかった場合は\0を代入)ではなく(なかった場合はNULLを代入)ですね?

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

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

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

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

最後にprintf()をつかって
pEnd = buf + strlen(buf);
を私の書いた問題(1)~(5)を検証するプログラムを書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#25

投稿記事 by net921 » 13年前

コード:

#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]はアクセス違反みたいです。

でした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#26

投稿記事 by softya(ソフト屋) » 13年前

肝心の
pEnd = buf + strlen(buf);
が無いのでエラーになりますよ。

あとインデントは正確に。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#27

投稿記事 by net921 » 13年前

コード:

#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

でした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#28

投稿記事 by softya(ソフト屋) » 13年前

pEnd = buf + strlen(buf);
の場所が違います。
printf("%d\n",buf[1]);
が%dで
printf("%p\n",pEnd[0]);
が%pなのは何故ですか?

【補足】
少し心配になりました。
・C言語の命令は上から順番に実行される。
・初期化・代入されていない変数の値は不定
ということは理解されていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#29

投稿記事 by net921 » 13年前

コード:

#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はアドレス値を出力するためです。
補足については理解しています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#30

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:(1)に「値」と書いてあったので値にしました。
%pはアドレス値を出力するためです。
pEndとpEnd[0]の違いは何でしょうか?
あと(6)としてbufのポインタ値を追加しておきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#31

投稿記事 by net921 » 13年前

pEndはpEnd[0],pEnd[1]...のまとまったもの
pEnd[0]はpEndの要素みたいな感じですか?

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

net921
記事: 70
登録日時: 13年前

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

#32

投稿記事 by net921 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#33

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:pEndはpEnd[0],pEnd[1]...のまとまったもの
pEnd[0]はpEndの要素みたいな感じですか?

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

pEndとpEnd[0]は扱える値が違いますし操作するメモリも違います。
ポインタを配列操作する意味をよく考えてみましょう。
そこで質問です。pEndとpEnd[0]でそれぞれ扱う値の型と値の範囲を答えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#34

投稿記事 by net921 » 13年前

そうしたらアドレス値もかわります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#35

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:そうしたらアドレス値もかわります。
これはどういう意味でしょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#36

投稿記事 by net921 » 13年前

アドレスを指定していないから適当なところに作られるのではないでしょうか?
型と値の範囲
とは
int char longとかですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#37

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:アドレスを指定していないから適当なところに作られるのではないでしょうか?
うーん。一般論で答えを聞きたかったんですが質問の仕方を変えましょう。
例を書きます。一般的なWindowsPC限定の話ですが、
char aa;
と有った場合aaの型はcharで値の範囲は-128~127までで16進だと0x00~0xffです。
これと同様に
char *pEnd;
定義されていた場合のpEndとpEnd[0]のそれぞれ型と値の範囲を説明してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#38

投稿記事 by net921 » 13年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#39

投稿記事 by softya(ソフト屋) » 13年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#40

投稿記事 by net921 » 13年前

もう時間がないのでとりあえずプログラムの修正とコメントの修正をお願いします。
今日中です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#41

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:もう時間がないのでとりあえずプログラムの修正とコメントの修正をお願いします。
今日中です。
急ぐ理由を教えて下さい。
理解することが大事で、単に答えを書くことはご本人のためにはなりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#42

投稿記事 by net921 » 13年前

この続きはどんどん質問していくのですが、理由は明日から学校です。
よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#43

投稿記事 by softya(ソフト屋) » 13年前

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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#44

投稿記事 by net921 » 13年前

いろいろなところが短くなっています。
なんとなくですがわかります。
strpbrk(buf,Sep); //文字がない場合は、NULL ポインタを返す。
でいいですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#45

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:いろいろなところが短くなっています。
なんとなくですがわかります。
strpbrk(buf,Sep); //文字がない場合は、NULL ポインタを返す。
でいいですか?
短くしたというよりわかりやすくしたつもりなんですけどね。
strpbrkについては半分正解ですがstrpbrk(buf,Sep);に説明としては説明不足です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#46

投稿記事 by net921 » 13年前

コメントをつけるとしたらどの行がいいですか?
あと、僕がアップロードしたプログラムとsoftya(ソフト屋) さんがアップロードしたプログラムを比べるとsoftya(ソフト屋) さんのほうが完璧に動くのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#47

投稿記事 by softya(ソフト屋) » 13年前

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

どの行にコメントを付けるかについては、No: 19のソースコードに付けるなら
8,12、16,18,19,21,22,24,26行目でしょうね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#48

投稿記事 by net921 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#49

投稿記事 by softya(ソフト屋) » 13年前

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

ちなみに速度はコンパイラの最適化で同等だと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#50

投稿記事 by net921 » 13年前

①と②にコメントを書くとしたらどのように書けばいいでしょうか?
最後に編集したユーザー net921 on 2012年5月05日(土) 17:17 [ 編集 1 回目 ]

net921
記事: 70
登録日時: 13年前

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

#51

投稿記事 by net921 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#52

投稿記事 by softya(ソフト屋) » 13年前

それじゃ余計理解しないといけません。
中途半端だとすぐ化けの皮が剥がれますよ。

コード:

#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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#53

投稿記事 by net921 » 13年前

① ←何度も言いますが理解して下さい わかりません
c言語おすすめ本

(アフェリエイトが貼られていたので削除しました。 管理人)
最後に編集したユーザー net921 on 2012年5月05日(土) 18:45 [ 編集 3 回目 ]

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#54

投稿記事 by h2so5 » 13年前

なぜ+1が必要かどうか分からないなら、消して実行してみてください。

net921
記事: 70
登録日時: 13年前

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

#55

投稿記事 by net921 » 13年前

buf = sep_ptr;//ポインタを次の文字に移動
でいいですか?

net921
記事: 70
登録日時: 13年前

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

#56

投稿記事 by net921 » 13年前

buf = sep_ptr;//次の文字のアドレスを代入
でいいですか?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

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

#57

投稿記事 by ISLe » 13年前

net921 さんが書きました:宿題ではないのですが明日先生に説明するのです。
ちょっと気になったんですが。
質問にあったソースコードは先生に指定されたものってことではないのですかね。

net921
記事: 70
登録日時: 13年前

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

#58

投稿記事 by net921 » 13年前

いや、指定されてはいないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#59

投稿記事 by softya(ソフト屋) » 13年前

投稿から時間も大分立っているみたいですが、+1をした場合としない場合の違いは試されたのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#60

投稿記事 by net921 » 13年前

もちろん試しました。
*sep_ptrには10行目の処理で¥0ですね。
+1がないと次のループのときにループを抜けてしまいます。
あと、修正する部分は何処でしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#61

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:もちろん試しました。
*sep_ptrには10行目の処理で¥0ですね。
+1がないと次のループのときにループを抜けてしまいます。
あと、修正する部分は何処でしょうか?
今の現状を見せてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#62

投稿記事 by net921 » 13年前

c言語おすすめ本

(アフェリエイトが貼られていたので削除しました。 管理人)
最後に編集したユーザー net921 on 2012年5月05日(土) 18:44 [ 編集 2 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#63

投稿記事 by softya(ソフト屋) » 13年前

ちゃんと突っ込まれても解説できるならこれでOKだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#64

投稿記事 by net921 » 13年前

c言語おすすめ本

(アフェリエイトが貼られていたので削除しました。 管理人)
最後に編集したユーザー net921 on 2012年5月05日(土) 17:42 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#65

投稿記事 by softya(ソフト屋) » 13年前

申し訳ないですがアフィリエイト付き広告でしたので一時的にアフィリエイトを外させて頂きました。
OKかどうかは管理人間で協議させて頂きます。

個人的見解としては話の脈略も何いので広告とみなさるかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#66

投稿記事 by net921 » 13年前

皆さんはプログラムを始めて何年くらいですか??

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#67

投稿記事 by softya(ソフト屋) » 13年前

net921 さんが書きました:皆さんはプログラムを始めて何年くらいですか??
このトピックと関係ないので【雑談】トピックを新たに立ち上げて下さい。
それとユーザー登録者はプロフィールに大体書いてあると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#68

投稿記事 by net921 » 13年前

アフィリエイトはだめなのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#69

投稿記事 by softya(ソフト屋) » 13年前

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

[補足]
掲示板が荒れる & 他の広告を呼び込む などの害も考えられます。
ついでに言うなら、ご自分のサイトのアクセス数で勝負すべきものを他人の掲示板のアクセス数が多いところで稼ぐのは悲しい事ではないでしょうか?。 [少し修正]
あるいは、こう考えてみてください。みんなが好き勝手にアフィリエイトリンクしているサイトを信用することが出来るでしょうか? 単に広告したいだけじゃ?と疑いたくなりませんか?[追記]
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#70

投稿記事 by net921 » 13年前

解決しました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#71

投稿記事 by softya(ソフト屋) » 13年前

報告いたします。
管理人(Dixq)さんとの協議の結果、アフィリエト・リンクは掲示板的にNGと言うことになりました。
フォーラムルールは後ほど変更してもらうことになりますが、ご了承下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#72

投稿記事 by softya(ソフト屋) » 13年前

あちこち規約に違反して書き換えている様ですのでトピックを閉鎖しました。
それと消された記事についても後日修復する予定です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

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

#73

投稿記事 by Dixq (管理人) » 13年前

既に投稿された文章を正当な理由なく削除する行為は規約違反になります。また、不正に削除された内容は後日復元する決まりになっています。

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る