消してますが、この後3回、同じ広告が書き込まれました。
いーかげんしつこい :-(
全部別のホストからなんで弾くことも出来ず。
アダルトサイトもいいけど、無差別に掲示板に広告を貼ったり、
ウィンドウを閉じようとしても別のウィンドウが開いたり、
やたらと専用ソフトをダウンロードさせようとしたりするってのは
困り者ですねえ。
というわけで削除しました。うちもちらほら広告が貼られるようになりましたね。
(ぱ)さん
こんばんは。こばです。
ご説明頂きありがとうございました。
そうですね。よく考えたら、ポインタ型も
ふつうの変数と同じですから、そこに値が
設定されていないものを渡しても、うまく
いきませんよね。
ありがとうございました。また、分からない点等が
ありましたら、質問することもあるかもしれませんが、
よろしくお願いいたします。
> char *line;
>
> text_data = add_line(text_data, line, &line_alloc_num, &line_num);
この場合は、このふたつの行の間に、
while ((line = read_line(fp)) != NULL)
という行があって、ここでlineに代入しています。
read_line()の呼び出しにしたって、
char *line;
while ((status = read_line(fp, &line)) == READ_LINE_SUCCESS)
と書いてもいいですが、たとえば
char *line;
char **line_p = &line;
while ((status = read_line(fp, line_p)) == READ_LINE_SUCCESS)
と書いてもいいわけです。
> charへのポインタの
> ポインタは「line」と直で変数指定してもアドレスを渡すことには
> ならないとすると、
上に書いたように、char**型の変数を&を付けずに渡したからといって、
「アドレスを渡すことにはならない」わけではありません。
問題は、何のアドレスを渡そうとしているか、です。
char *line;
char **line_p = &line;
while ((status = read_line(fp, line_p)) == READ_LINE_SUCCESS)
ここで、read_lineの第2引数として渡っているのは、何のアドレスですか?
char *line;
while ((status = read_line(fp, &line)) == READ_LINE_SUCCESS)
ここで、read_lineの第2引数として渡っているのは、何のアドレスですか?
char **line;
while ((status = read_line(fp, line)) == READ_LINE_SUCCESS)
この場合は?
ポインタ型の変数といっても、普通の変数と同じです。p.34のFig1-1を
もう一度見てください。
こんばんは。こばです。
早速お答え頂いて、ありがとうございます。
とてもわかりやすい説明で、納得しました。
ご回答をみていて、一点分からない点があります。
たとえば、p222に示されているread_file.cでは、
**add_line(char **text_data, char *line, int *line_alloc_num, int *line_num)
char **read_file(FILE *fp, int *line_num_p)
{
char *line;
text_data = add_line(text_data, line, &line_alloc_num, &line_num);
}
と、「&line」ではなく「line」で渡しています。このような例は
charの配列やFILE型等でもみられますが、この2つは変数指定で
ポインタに置き換えられると解釈していました。charへのポインタの
ポインタは「line」と直で変数指定してもアドレスを渡すことには
ならないとすると、この2つの違いは何なんでしょうか???
分かりづらい文章で申し訳ありませんが、よろしくお願いいたします。
> 初めまして。こばです。
はじめまして。
> 「C言語ポインタ 完全制覇」はとても勉強になり、
> じっくりと読ませて頂いています。
ありがとうございます。
問題の件ですが、
もともとこの章は、「引数経由でポインタを返してもらう」というのが
目的です。
たとえば「引数経由でintを返してもらう」ときには、
「intへのポインタ」を引数に渡しますが、
「引数経由でcharへのポインタを返してもらう」ときには
「charへのポインタのポインタ」を渡すことになるわけです。
p.227の下から5行目くらいあたりに、そんなことが書いてあるはずです。
で、「引数経由でintを返してもらう」ときには
int hoge;
get_hoge(&hoge);
のように呼び出すことでしょう。get_hoge()のプロトタイプ宣言が
void get_hoge(int *hoge);
となっているからといって、
int *hoge;
get_hoge(hoge);
と呼び出してはいけませんよね。
で、こばさんのコードですが、
> char **read_file(FILE *fp, int *line_num_p)
> {
> ---(省略)---
> char **line;
...
> while ((status = read_line(fp, line)) == READ_LINE_SUCCESS)
この部分がまさにそういう形式になっています。lineの指す先の領域がない
状況です。
本のサンプルコードは以下のページからダウンロード可能ですが、
http://kmaebashi.com/seiha/index.html
この中のread_line2/read_line.c にはテスト用のmain()関数が
くっついてますので、そちらも参照してください。
前橋さん
初めまして。こばです。
「C言語ポインタ 完全制覇」はとても勉強になり、
じっくりと読ませて頂いています。
実際に本に書かれているコードを記述し、
動きを見ているのですが、そこで一点ご質問があります。
p227〜p231内の関数群について、自分なりにドライバ
となるmain関数を作成し、いろいろと試してみたのですが
read_line関数のlineのアドレス渡しがどうしてもうまくいきません。
read_line関数内では*lineの値を取得可能なんですが、read_line関数を
呼んでいる関数内では*lineの値を取得することが出来ないんです。
どうもread_line関数内で、*lineの値が変わってしまったために、
line → *line → **lineの流れがうまく機能しなくなっている
ようなんですが。。。もし、原因&対処法が分かりましたら、
教えてください。
お忙しいところ、申し訳ありませんが、
よろしくお願いいたします。
(参考コード)
【read_file.c】
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "read_line.h"
#define ALLOC_SIZE (256)
char **add_line(char **text_data, char **line, int *line_alloc_num, int *line_num)
{
---(省略)---
text_data[*line_num] = *line;
---(省略)---
}
char **read_file(FILE *fp, int *line_num_p)
{
---(省略)---
char **line;
ReadLineStatus status;
while ((status = read_line(fp, line)) == READ_LINE_SUCCESS)
{
text_data = add_line(text_data, line, &line_alloc_num, &line_num);
}
---(省略)---
}
int main(void)
{
---(省略)---
text_data = read_file(stdin, &line_num);
---(省略)---
}
【read_line.c】
p228〜p230と同じ
【read_line.h】
p228と同じ
> mailにすればよかったとちょっと反省。
メールでも結構ですけど、裏掲示板というのもあります。
何人の人が読んでいるのかわかりませんが、少なくとも私は、ここと同程度の
頻度でチェックしています。
http://mcgi2.nifty.ne.jp/cgi-bin/bbs_by_date.cgi?user_id=PXU00211&msg_per_page=10&def=10
ただまあ、現状の投稿量なら、こっちの掲示板に書いていただいても
特に問題はないと思います。
mailにすればよかったとちょっと反省。
>
> γ-GTPが落ちたと思って安心して飲み食いしてたらなんだか体重の方は
> あっという間に元の木阿弥状態ですが(;_;) それはさておき。
>
> 寿司食いに行きたいのは山々なんですが、残念ながら当日はとある試験が
> ありまして、ちと行けない状況です。
> 以前掲示板でもお誘いいただきましたし、「もう人数に入ってた」状態かも
> しれませんね。無理なら無理で早く返事をしとくべきでした。
ざざ残念。また次回行きましょう。結局こちらから行く人はいなさそうで、
途中参加の人をpick upすることになりそうです。
> > P.S. So505is買っちゃったよ。
>
> ん、ということは今は音楽は?
ふっふっふ。今度のもウオークマンになるので買ったんす。実は0円まで待とうと
思ってたら今のが壊れかけたので、あわてて買ったらケロリと直りやがるし。
それにしてもこれだけのことのできる端末が¥10K〜20Kはすごいね。私は
ドコモポイントってのでほとんどタダにしましたが。H2Aロケットも
一家に一台買わせるつもりで作れば安くなるかも〜。
> 某大企業の作ったプログラムから驚くべきコードを見つけたので、
> ココでさらしてみます。
何のコードかと思ったんですが。
いや、私の腕時計、カレンダー付きなんですが、先日から1日ずれちゃって
困っています。調整するには左下のボタンを押してごちょごちょすれば
よいのですが、なにせ20年近く前に買ってもらったやつで、その左下の
ボタンが逝っちゃってるのです。
で、コードの方ですが、ある意味、定義を愚直に実装したコードですよね。
確かに冗長ではありますが、関数として切り出されているのなら、特に悪さは
しないと思います。
突っ込みどころとしては、
/* 割り算結果構造体 */
このコメントは何だ、とか、
このelseの連続技は何だ、中途でreturnすればいいじゃん、とかですかね。
でも中途returnはコーディングルールで禁止されてたりするからなあ…
> たまには、雰囲気の違うカキコしようと思って。
どうもです。
> γ-GTPも落ちたところで、すし屋いか〜ん?
γ-GTPが落ちたと思って安心して飲み食いしてたらなんだか体重の方は
あっという間に元の木阿弥状態ですが(;_;) それはさておき。
寿司食いに行きたいのは山々なんですが、残念ながら当日はとある試験が
ありまして、ちと行けない状況です。
以前掲示板でもお誘いいただきましたし、「もう人数に入ってた」状態かも
しれませんね。無理なら無理で早く返事をしとくべきでした。
> P.S. So505is買っちゃったよ。
ん、ということは今は音楽は?
お久しぶりです。
某大企業の作ったプログラムから驚くべきコードを見つけたので、
ココでさらしてみます。
(変数名とか関数名は変えました)
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
int hoge( int piyo )
{
int ret ;
div_t stDiv ; /* 割り算結果構造体 */
ret = FALSE ;
stDiv = div( piyo, 4 ) ;
if( stDiv.rem == 0 ) {
stDiv = div( piyo, 100 ) ;
if( stDiv.rem == 0 ) {
stDiv = div( piyo, 400 ) ;
if( stDiv.rem == 0 ) {
ret = TRUE ;
}
else {
ret = FALSE ;
}
}
else {
ret = TRUE ;
}
}
else {
ret = TRUE ;
}
return ret ;
}
いやぁdiv_t型を使うのを見たのもはじめてなら、
この処理をこんだけのステップ数で実装してるのを見るのもはじめてです。
#普通は1行で書きますよね?
みなさんで笑ってやってください
たまには、雰囲気の違うカキコしようと思って。
γ-GTPも落ちたところで、すし屋いか〜ん?
お返事まってます。
P.S. So505is買っちゃったよ。
> お久しぶりです。お元気ですか?
や、お久しぶりです。まあしょっちゅうMLでお見かけするような気もしますが(^^;
> 検索エンジンに関しては、むしろメリットでしたよということを
> 伝えたくての書き込みでした。
言われてみれば… ということで、さっそくGoogleによるサイト内検索を付けました。
ご利用ください > 皆様
確かにサイト内検索ができることはメリットだと思うんですが、kmaebashi.comが
「POINTER」でウェブ全体からGoogleすると、ウチのページがトップに来る。
という、私自身ちと信じられない状況まで追いつくのはいつの日か、ていうか
果たしてそんな日は来るのか、と考えると、やっぱりちょっと惜しい気もしますね。
私としてはドメイン移転よりもレンタルサーバ借りたことのほうがメリットだと
思っています。PHPとMySQLとPostgreSQLが使えるので、ようやくこの
「先頭に1文字謎の空白が入る」妙な掲示板をリプレースできるかと。
問題は、今はその作業をしている時間すらないということですが。
お久しぶりです。お元気ですか?
前橋さんのページが独自ドメインになったおかげで、
「『憂オブ』に対する批判がどこかにあったよな」
と探しにきたのが、google で "憂鬱 site:maebashi.com"
と、簡単に調べることができました。
検索エンジンに関しては、むしろメリットでしたよということを
伝えたくての書き込みでした。
--
T. Pipe Smoker Nakagawa
> とりあえずおっしゃるとおりにファイルは作成されています。
了解です。
ところで前回私はこう書きましたけど、
'file' // CHAR(ICHAR('0')+niter3) // CHAR(ICHAR('0')+niter2) // '.txt'
間違ってました。すみません。
この部分自体はこのままでいいんですけど、niter2は、「niterを10で割ったもの」
ではなくて、「niterを10で割った余り」である必要がありますね。
mod(niter, 10)ですか。
何度もありがとうございます。
とりあえずおっしゃるとおりにファイルは作成されています。
> コンパイル後に出るエラーはniterが3桁になると出るようで
そりゃそうです。
| 一桁でよければ、niterを10で割ったものをniter2として、
もともと私は「一桁でよければ」と書いています。この「一桁」というのは、
file0.txt
file1.txt
file2.txt
…
file9.txt
というように、ファイル名の中でniterにより区別される部分が一桁ということです。
ところで0〜9までは、上記のようなファイル名が生成されていますか?
原理的に言って、
| 'file' // CHAR(ICHAR('0')+niter2) // '.dat'
この方法で可能なのは一桁までです。最初からそのつもりで書きました。
なぜそうなるのかわからなければ、CHARやICHARのマニュアルを読んでください。
Fortranをやっているなら手元にあるでしょうし、ないようなら
先に私が示したURLでも見てください。
読んでもわからないなら、どこがわからないのか説明してください。
二桁以上に対応したければ、Fortranでは多少面倒なことをしなければ
ならないようですが、二桁までの限定でよければたいしたことはないでしょう。
上のコードの意味がわかれば、対応は可能なはずです。
あんまりここで書いちゃうべきではないかもしれませんが、
niterを100で割ったものをniter3として、
'file' // CHAR(ICHAR('0')+niter3) // CHAR(ICHAR('0')+niter2) // '.txt'
こうかしら。
コンパイル後に出るエラーはniterが3桁になると出るようで
forrtl:sever(43):file name specification error,unit 10,file**.txt
Incrementally linked image--PC correlation disabled.
というエラーメッセージが出ます。
> 微妙におかしいというのは
> 実行した後にniterが大きくなるとエラーになってしまっていました。
だーかーらー。
とりあえずコンパイルエラーではないことはわかりましたけど、
a)「niterが大きくなると」エラーになるということなら、具体的に
いくつまでは動いて、いくつでエラーになったのか。
b)動いたところまでは、どんなファイル名が生成されていたのか。
c)どんなエラーが出たのか。打ち直さなくていいからコピペしてください。
ということを書いてもらわないと、誰も状況がつかめないです。
本多さんのレスにも、
| a,bなら、どんなエラーになったのか、
| cなら、どんな結果を期待していて、実際にはどのような結果がでたのか
とあります。
一般に、掲示板やメーリングリストなどに質問する際に気をつけるべきことは、
以下のページなどで知ることができると思います。一度読んでみてください。
技術系メーリングリストで質問するときのパターン・ランゲージ
http://www.hyuki.com/writing/techask.html
JavaHouseのトピックスの「質問のしかたについて」
http://java-house.jp/ml/topics/topics.html#ml-howto
どうもありがとうございました。とても参考になりました。
確かに僕が甘えすぎかもしれませんね,
すいませんでした。
微妙におかしいというのは
実行した後にniterが大きくなるとエラーになってしまっていました。
> 私もfortrunから離れて久しいのですが
> 「'file' // CHAR(niter) // '.dat'」じゃ、ダメなんでしたっけ?
>
> 「ICHAR('0')+」が必要なんでしたっけ?
前回のレスはここ↓を見て書いたのですが、
http://www.ip.media.kyoto-u.ac.jp/htomita/sec7.html#7.1.6.
| CHAR(I) システムコード(整数)に対応する文字を求める
| ICHAR(a) 文字aのコード(整数)を求める
とのことですから、CHAR(I)だけでは変なところの文字が取れてくるんじゃ
ないでしょうか。
********
私の前回のレスが正しかったかどうかは、私はFortranは忘却の彼方の人間ですし、
ていうかもともとそんなに使ってないし、手元にFortranの実行環境もないしで
わかりません。ていうかあれがそのまま動くことは最初から期待していませんでした。
にもかかわらず書いたのは以下の理由によります。
・そもそもりょうまさんが何を知りたいのかがよくわからないので(推測はしたが)
その推測が当たっているかどうかを確認するため。
・(Fortran使いの人から見れば迂遠かも知れないし間違っているかもしれないが)
私が考えた「解法」(解そのものではなく)を提示するため。
・(その解法が一応正しければ)とりあえずCHARとかICHARのキーワードは出したんだから、
あとはりょうまさんの方で調べられるだろうと思ったため。
それで反応がこれだと、ちとメゲます。
ただ、りょうまさんの質問に限らず、こういう(正直なところを言えば)「意味の
わからない質問」は、この手の掲示板やMLの類にはつきものです。
そしてもちろん、質問者には悪意はないでしょうし、ことさら手間を惜しんだから
そういう質問になった、というわけでもないと思います。適切な回答が得られなくて
損をするのは質問者自身ですし。
なのになんでこうなっちゃうのかなあ、というのを、ここんとこ考えてます。
ジャンルと状況によっちゃあ、私もそういう質問をしちゃうかもしれず…
# ネタにしちゃってすみません > りょうまさん
> すいません微妙に間違っているのかうまくいきません?
> 更に詳しい方いたらお願いします。
どううまく行かなかったのかの、
説明をしないと適切な回答は得られませんよ。
うまく行かないといったときに、症状はいくつか考えられるわけです。
a. コンパイルでエラーがでた
b. コンパイルはできたが、実行したらエラーがでた
c. 実行はできたが、結果が期待しているものではなかった
d. それ以外
a,bなら、どんなエラーになったのか、
cなら、どんな結果を期待していて、実際にはどのような結果がでたのか
を記載しないとりょうまさんまたは(ぱ)さんの間違いを
指摘できませんから、適切なアドバイスも受けられないと思います。
私もfortrunから離れて久しいのですが
「'file' // CHAR(niter) // '.dat'」じゃ、ダメなんでしたっけ?
「ICHAR('0')+」が必要なんでしたっけ?
すいません微妙に間違っているのかうまくいきません?
更に詳しい方いたらお願いします。
ありがとうございます。
文字定数は文字型の間違いですね,すいません。
どういう文を書くのか知りたかったのでそれで試しにやってみますね。
他に詳しい方いたらよろしくお願いします。
何を知りたいのかよくわかりません。
> 繰り返し計算で初期値から100ステップ計算するとします。
ステップって?
> たとえばステップ数10、20、30、40・・・のときの
> データをそれぞれ別々のテキストファイルを作成して書き込むよう
> にしたいのですが,
> どういう命令文を使えばいいのでしょうか?
> ステップ数をniter としているときに10の倍数のときの
> ステップ数をファイル名にする命令文を教えていただけませんか?
ファイル名を、「file30.dat」のように、niterを元にして組み立てたいと
いうことですか? つまり、Cでいうsprintf()のようなことがやりたい、
と解釈しましたが、合っていますか?
私はfortranはほとんどやったことがなく(学生のときちょっとやったのと、
就職してからちょっと移植作業をやった程度)、今やすっかり忘れてしまった
人間です。今ちょっと調べただけなので漏れがある可能性は高いですが、
私が見た範囲では、数値を文字列に変換する関数は見つけられませんでした。
一桁でよければ、niterを10で割ったものをniter2として、
'file' // CHAR(ICHAR('0')+niter2) // '.dat'
みたいな感じでいいんでしょうか。詳しい方の降臨を希望。
# FORTRANではなくfortranってことはFortran90でいいんですかね。
## で、タイトルにある「文字定数」って?