プログラム2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者

プログラム2

#1

投稿記事 by 初心者 » 16年前

お世話になっております。
void CVTestView::OnDraw(CDC* pDC)
{
	CVTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: この場所にネイティブ データ用の描画コードを追加します。
    CRect r;
    GetClientRect(r);

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetWindowExt(1000, 600);                // 窓の論理サイズの指定
    pDC->SetViewportExt(r.right, -r.bottom);     //ビューポートの指定
    pDC->SetViewportOrg(r.right/2, r.bottom/2);  //原点の指定

    CPen p(PS_SOLID, 1, RGB(0, 255, 0));
    CPen* oldp=pDC->SelectObject(&p);

    pDC->MoveTo(-500, 0); pDC->LineTo(500, 0);
    pDC->MoveTo(0,300);  pDC->LineTo(0, -300);

   
FILE *fp;
   char *str,buf[1000];
  char subbuf[100],*s1;
    char buf2[100],*s2;
  char buf3[100],*s3;
    char buf4[100],*s4;
static double bx=0;
static double by=0;
     if ((fp = fopen("test.txt", "r")) == NULL) {
		printf("ファイルが開けません\n");
		 return EXIT_SUCCESS;
               }
        while (fgets(buf, 1000, fp) != NULL) {
	    str=buf;
       while((*str!='\0'){
	      if(*str!='\0' && *str=='G'){
                  *str++;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                   s2=buf2;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                    while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
                   *s2++=*str++;
                    *s2='\0';
               }
        if(*str!='\0' && *str=='X'){
                  *str++;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                   s3=buf3;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                    while(*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))                   *s3++=*str++;
                    *s3='\0';
               }
              if(*str!='\0' && *str=='Y'){
                  *str++;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
                   s4=buf4;
                   if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
               while(*str!='\0' &&(isdigit(*str) |*str=='||*str=='.'))                              *s4++=*str++;
                    *s4='\0';
}
  else
                     str++;
                }
             
                   if((int)atof(buf2)==92){
                pDC->MoveTo((int)atof(buf3),(int)atof(buf4));
                bx=(int)atof(buf3);
                 by=(int)atof(buf4);

                             }   
                else if((int)atof(buf2)==01){
                  pDC->MoveTo((int)bx,(int)by);
                 pDC->LineTo((int)atof(buf3),(int)atof(buf4));
                 bx=(int)atof(buf3);
                 by=(int)atof(buf4);
                 
              }
                                   }
      fclose(fp);
      return 0;
  }

色々使ってみたんですが、nonさんの原点移動を使用させていただくことにしました。
それでこういうプログラムに結局なったんですけども1つだけ欠点があり、このプログラムは
①原点移動、ビューポートの指定など行う
②ファイルを読み込みG,X,Y,I,Jに付属する数字を格納
③その数字をもとに図形を作図する
というプログラムになってるわけですが、

格納の作業はokなんですが図形作図に問題があってどんな場合にも作図の作業を行う。つまり
G01X100Y100
G03X200Y200I50J50
M00


03のプログラムはまだ書いてないんですがこれは円弧の作図になります。
問題はこのプログラムだと
G01で直線を書く→G03で円弧を書く→M00でも前の値が残っていてG03と同じ円弧作画作業をしてしまいます。

要は図形描画の作業を今はどんなときにも行っていますが、G,X,Yの文字を読み込まれたときに限定したいわけです。
それで図形を書くプログラムの所に、つまり
if(*str!='\0' &&(*str=='G' || *str=='X' || *str=='Y')){
             if((int)atof(buf2)==92){
                 pDC->MoveTo((int)atof(buf3),(int)atof(buf4));
                 bx=(int)atof(buf3);
                 by=(int)atof(buf4);

                             }   
             else if((int)atof(buf2)==01){
                  pDC->MoveTo((int)bx,(int)by);
                  pDC->LineTo((int)atof(buf3),(int)atof(buf4));
                  bx=(int)atof(buf3);
                  by=(int)atof(buf4);
                  
              }

}
にこうして入れてみたんですが図形がさっぱり作画されなくなりました。
原因と対策を教えてください。

バグ

Re:プログラム2

#2

投稿記事 by バグ » 16年前

文字を読み込んだ時だけ描画したいならば、描画開始ボタンみたいなのを作って、それが押されたら描画するように変更してはどうでしょうか?

non

Re:プログラム2

#3

投稿記事 by non » 16年前

もう一度、設計からやり直してみませんか?結局はその方がはやいですよ。
前から、言っているように仕様をはっきりさせること。
使用するコマンドには何があるのかなどを、最初に決めておくことです。
あとで、五月雨式に出てくるのは、結局はわかりにくいプログラムになります。

まずは、すべてのコードを決める。(プログラムをswitch文で行えるように。)
プログラムを下のように分ける。
ファイルを開いてデータを読み込む(OnDrawでは行わない)
読み込んだデータを配列(できれば動的に)に入れる。(リスト構造がいいと思います)
データを元に、絵を描く(OnDraw)
こうすれば、絵を追加したり、編集したりもできるようになります。

初心者

Re:プログラム2

#4

投稿記事 by 初心者 » 16年前

今SDIベースでやっていましてそれをするならメニューバーに図形とか作ってそれ押したら作図
という風になりますが、かなり改善しなくてはいけないですね

non

Re:プログラム2

#5

投稿記事 by non » 16年前

>G01で直線を書く→G03で円弧を書く→M00でも前の値が残っていてG03と同じ円弧作画作業をしてしまいます。
M00って何ですか?

初心者

Re:プログラム2

#6

投稿記事 by 初心者 » 16年前

M00はなんの意味もない文です。
だから私の希望ではそこでは何の作業も行われないはずなんですが

non

Re:プログラム2

#7

投稿記事 by non » 16年前

>今SDIベースでやっていましてそれをするならメニューバーに図形とか作ってそれ押したら作図
>という風になりますが、それだとpDCが使えなくなったり、なんか色々大変な作業になりそうですが。

でも、OnDrawでファイルを読むわけにはいかないでしょう。再描画するたびにファイルを読むことに
なるわけだから。大変な作業になるかどうかは、私もやったことがないのでわかりませんが。
よく、雑誌とかに、マウスをクリックして(左クリックでMoveToで、左クリックでLineToのような)
絵を描くプログラムが載ってますので参考に作ってみたらいかがでしょうか。
そして、そのデータをリスト構造でNCコードの形で記憶しておき、FileLoadとFileSaveを作成する。
みたいに膨らませていくと楽しいと思いますよ。

初心者

Re:プログラム2

#8

投稿記事 by 初心者 » 16年前

きついなぁ、リスト構造とかFileLoadとかFileSaveとか知らない単語で・・
膨大な時間がかかりそうです。私の記載したプログラムをいじくっても解決できないものでしょうか?
とりあえず出された課題を取り組むにあたってそれにおける最短の過程で学習していきたいんですよね。
あれが便利だからあれを基礎から勉強してから取り組むというやり方は余りにも時間がかかりすぎててにおっつかいかんじがします。私にとってはそれが最善なんですけどね。覚えないとできないなら必死に覚えますが。

初心者

Re:プログラム2

#9

投稿記事 by 初心者 » 16年前

自己解決しました。
if(*str!='\0' &&(*str=='G' || *str=='X' || *str=='Y')){

if(buf[0]=='G' || buf[0]=='X' ||buf[0]=='Y'){

御津凪

Re:プログラム2

#10

投稿記事 by 御津凪 » 16年前

> きついなぁ、リスト構造とかFileLoadとかFileSaveとか知らない単語で・・
> 膨大な時間がかかりそうです。私の記載したプログラムをいじくっても解決できないものでしょうか?

覚えたほうが将来の自分の身の為かも知れません。
調べて使ってみるのもプログラミングの勉強方法です。

> とりあえず出された課題を取り組むにあたってそれにおける最短の過程で学習していきたいんですよね。

「課題を取り組むにあたってそれにおける最短の過程」は、自分自身がプログラム(コード)を
理解することです。
現在の自分の知識だけで新しい課題に取り組もうとすると、どこかで行き詰ることでしょう。

今回の(プログラムとしての)問題は、 OnDraw 内で(main 関数から呼ばれているかのように)
一つのプログラムを構築しているところにあります。

ファイルを読み込むタイミングは、メニューから「ファイルを開く」を選択した時に行い、
ファイルから情報を解析しておいて、OnDraw 内で描画するように処理を分ければ、
後に拡張が必要になった時に楽になりますよ。
今まで non さんの仰っている通り、一度設計から作り直したほうがいいと思います。

自分自身が甘えても、プログラムは一切甘えてくれませんから。

# 自己解決したようですが、何が原因で問題だったのか、具体的に分かりますでしょうか?

バグ

Re:プログラム2

#11

投稿記事 by バグ » 16年前

>>きついなぁ、リスト構造とかFileLoadとかFileSaveとか知らない単語で・・

MFCにはCListというクラスも用意されていますし、C++な訳ですからstd::listも使用できますよ。この辺りのことはググればたくさんヒットすると思います。
nonさんのおっしゃりたいのは、リストからファイルへ、データを読み書きする関数を実装しては如何でしょうか?という意味だと思います。


>>膨大な時間がかかりそうです。私の記載したプログラムをいじくっても解決できないものでしょうか?

今のプログラムをいじくって、とりあえず動くものを作る事はできますが、nonさんの言われている改善法は非常に一般的な意見です。
原則として、OnDrawの中では描画に関する処理だけを書くようにしないと駄目です。先程も書きましたが、今のままでも動かない訳ではありません。しかし、再描画の度に毎回ファイルからデータを読み込んでいてはHDDへの負担が大き過ぎます。


>>とりあえず出された課題を取り組むにあたってそれにおける最短の過程で学習していきたいんですよね。あれが便利だからあれを基礎から勉強してから取り組むというやり方は余りにも時間がかかりすぎててにおっつかいかんじがします。私にとってはそれが最善なんですけどね。覚えないとできないなら必死に覚えますが。

MFCを使用する以上はMFCのルールに則ったコーディングを行わなければいけませんし、MFCの仕様を覚えなければ使いこなすことは出来ません。MFCはC++で書かれたクラスライブラリです。つまり、C++のルールを知らなければ使いこなすことはできません。

ところで、前々から気になっていたんですが、自分の為に勉強されているんですよね?
課題を出されたから仕方なく勉強されているんですか?

どうも、書き込みからは、嫌々というか、仕方なくという雰囲気が感じられるんですよね…。
プログラムって、楽しくないですか?私は論理的に考えるのって、凄く楽しく感じるのですが…。

横槍入れて失礼しました…m(__)m

初心者

Re:プログラム2

#12

投稿記事 by 初心者 » 16年前

嫌々ではないですよ。ただいつまでも課題してるわけにもいかないんですよ。そこはわかりますよね。だから私としては早い所課題を片づけ、そこから色々分析して知識を得る。このやり方が望ましいわけです。
もうかなり時間かけてて早く安心したいんですよ。私の知識でもとりあえず課題は大方できました。もちろん皆様のお力添えのおかげもありますが。何が言いたいのかわかるんですけど、私にとっては
①課題を片づける
②終わったらそこで終わりじゃなく色々試す、仕組みを完璧に理解して自分の力にする

皆様が行ってるのは要は逆でしょう?
逆になったからといってさしたる問題はないと考えますが。課題には期限もありますので
私にとっては上記のやり方が最適です。

バグ

Re:プログラム2

#13

投稿記事 by バグ » 16年前

今のあなたの言い分は『とにかく答えを教えてくれ、中身を理解するのはそれからだ』という事ですよね?
そういう事であれば、私は離脱させていただきます。ここは皆さん優しいので、誰かは教えてくれるかもしれませんけどね。そうはいっても、私自身がそれほど頻繁に答えていた訳でもありませんが…(苦笑)

皆さんが似たようなことを書き込みしているのは、遠回りのようでいて、結局はそれが近道だと知っているからなんです。あなたの為に良かれと思ってアドバイスをしている訳ですが、それを全否定して聞く耳を持たないというのであれば『どうぞ、ご勝手に』としか言いようがなくなりますね。

初心者

Re:プログラム2

#14

投稿記事 by 初心者 » 16年前

ずいぶんな捉え方をしますねぇ。確かに課題をかたづけてしまうのは最優先ですが、
何も課題の答えばかり聞いてるわけじゃないでしょうに。
組み立ての発想
エラーの原因と対策
プログラムの詳細

これをメインに聞いてますよ?
課題の答えを教えてくれ教えてくれといってるわけじゃあない。
あくまで自分でも相当調べ、自分なりに勉強してるわけですよ。(段々自分から調べるようになったのは事実ですが)
今の自分は貴方はもちろんnonさんや御津さんなどよく返信していただける方のお力添えがあってこそいるんですよ。
期限のこともありますが先に解いた方がプログラムの全容を理解しやすい(私の性質かもしれませんが)
授業などでも講義より演習の方が覚えがいい人もいます。
サイトにも実際にプログラムを打ち込んで覚えてみるのもよいとかかかれてますよ?
それだけのこと。それを聞く耳持たないと解釈されるのは納得できませんね。
確かに私のプログラムはムダが多く不恰好でしょう。ですがそれを先に仕上げてしまいたい、
期限よりもむしろ多大な時間をさいて作ったプログラムの完成が見たいというのはおかしいのかな?
貴方の言ってることは私が何も考えずこの板で答えを聞いて何も成長していないと言ってるのと同義。
要は学び方の違いでしょう。

通りすがり

Re:プログラム2

#15

投稿記事 by 通りすがり » 16年前

とりあえずどんな屁理屈並べてもあなたのような
「俺は俺のやり方でいくんだ。文句は言うな、さっさと手伝え」
そんな態度じゃ誰も助けませんよ。助けたくなるわけがない。
まぁここの常連さんは皆優しいので誰か助けてしまうかもしれませんが、
それに頼る姿は情けないですね。

初心者

Re:プログラム2

#16

投稿記事 by 初心者 » 16年前

色んなスレ見てますが貴方は討論になる度書き込まれますよね。
別に自分のやり方を貫いてるわけじゃない。他を選ぶと混乱して失敗してしまう可能性が高いから先に仕上げてから
改良していこうという考えなだけです。

Dixq (管理人)

Re:プログラム2

#17

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

現在問題になっているのは恐らく「問題を解決するための手順として適切ではない」ということでしょう。

自分が自力で打開出来ない問題にぶち当たった時、「正解を見てから間違いを探す」というスタイルが通用するのは
ごく序盤だけで、答えを知っている人が大多数居る場合だけです。

自分が仕事で問題にぶつかった時、研究職になったとしたら、その研究分野で壁にあたったとき、
「正解を教えてもらって間違いを探す」スタイルに慣れていると、自力で解決出来くなってしまう可能性があると思います。
「問題を自分で解決する」これも一つの大きなスキルだと思いますし、
何事も基礎が大事ですから、基礎が出来ていないと正解を見てもその時判った気になっても「習得」は難しい場合があります。

経験者、先輩が取っているスタンスは経験に基づいたことで、未経験者が想像でよいと思う方法より適切な事が多いと思います。
「時間が無い」と仰っていますが、プログラムの勉強には時間がかかるものです。
一方で、基礎がしっかりしてくれば応用もある程度容易に行えるようになってくると思います。
急がば回れという言葉にもあるとおり、目先の問題の解決ばかりしては全体の解決にならない場合があります。

経験者、先輩が仰っている事は、これらを身を持って知って仰っていることだと思いますし、
持論を通す前に、まず経験者のアドバイスを聞き、やってみるという姿勢が成長する姿勢だと私は思っています。

後、「回答者が手伝ってあげたくなる」質問の仕方をするというのも問題解決スキルの一つです。
何か腑に落ちないことや、自分の意見と違う事があっても、大人しく聞いた方が、より後の為になるのなら、
それは聞いておいたほうが結局自分の特になりますよ。

御津凪

Re:プログラム2

#18

投稿記事 by 御津凪 » 16年前

管理人さんとちょっと内容が被りますが、

> 期限のこともありますが先に解いた方がプログラムの全容を理解しやすい(私の性質かもしれませんが)

とのことですが、
「正常に動くコードを読むことでプログラムミングを覚える主義」
と見受けられます。
しかし、もしここの方々がこのスレに対し(正確な)模範解答を提示したとした場合、
初心者さんの提示しているプログラムのほとんどは使われないでしょう。
つまり、回答プログラムは丸上げに近い状態(規約に抵触)になるので、それを避けているわけです。
それに、単純に問題を解決するだけならすぐに書けるはずですが、
それではまた別の問題が起こり、また質問すると言った悪循環を避けています。

上の方でも書きましたが、自己解決して、何が原因で何が問題だったのか、
(何で*str!='\0'を外したらOKだったのか)
プログラムを読んで具体的に分かりますでしょうか?

# ちなみに通りすがりさんはスレの仲裁役と私は勝手に思っています。

初心者

Re:プログラム2

#19

投稿記事 by 初心者 » 16年前

>>自分が自力で打開出来ない問題にぶち当たった時、「正解を見てから間違いを探す」というスタイルが通用するのは
ごく序盤だけで、答えを知っている人が大多数居る場合だけです。

勘違いされてるようですがその正解を導き出すのにもう1ヶ月以上かけてます。苦労もしています。質問したりはしていますが一応自分で考えてやってますよ。

基礎力が必要なのは確かです。基礎力を身につけてから取り組まないとこれから対応できなくなるということですよね?確かにそうでしょう。ただ人には事情がある。バグさんの意見は今後の意見として多大に参考にさせていただきます。これからはそうするのかもしれません。ただ今回それが受け入れられないからといってそこまで言われることはないでしょうというだけのことですよ。

>>「正常に動くコードを読むことでプログラムミングを覚える主義」
と見受けられます。

確かにそうかもしれません。そういう主義なのかも。勉学のときも解答を見て長時間分析するタイプでした。

>>上の方でも書きましたが、自己解決して、何が原因で何が問題だったのか、
(何で*str!='\0'を外したらOKだったのか)
プログラムを読んで具体的に分かりますでしょうか?

nonさんの意見を含め、きちんと検討します。ただ*str!='\0'をはずしたからというよりbuf[0]・・
と書いたからじゃないかとは思いますけど。


>> ちなみに通りすがりさんはスレの仲裁役と私は勝手に思っています。
仲裁とは両者の仲をとりもつという意味です。一方の肩をもち一方を批判するのは仲裁とは言いません。

Mist

Re:プログラム2

#20

投稿記事 by Mist » 16年前

こういう匿名の掲示板で規約違反とかしているならともかく、勉強の仕方にまであれこれ指図するのは正直どうかと思います。
アドバイスをすることはいいと思いますが、本人が今のやり方でいいと言ってるんですからよってたかって何度も何度も指摘するのはアドバイスの範疇を超えていると思います。
私たちは単なる回答者であって、初心者さんの先生でもなければ社員教育担当でもないですから。

というのが私の意見です。異論は認めます。

#アドバイスの内容自体は私も賛成です。
今のやり方ではスパゲッティになるのは目に見えていますし(^^;

御津凪

Re:プログラム2

#21

投稿記事 by 御津凪 » 16年前

> 仲裁とは両者の仲をとりもつという意味です。一方の肩をもち一方を批判するのは仲裁とは言いません。
うん、間違えた。
「討論に(どちらかに)喝を入れる方」でした。

> >>「正常に動くコードを読むことでプログラミングを覚える主義」
> と見受けられます。
>
> 確かにそうかもしれません。そういう主義なのかも。

ならば、他の方の(サンプル)プログラムコードをよく読んで、どういう構造が望ましいのか、
どういう書き方が望ましいのかを学んだほうが問題解決が速くなりそうですね。
何で悪いのかが分かりますから。

初心者

Re:プログラム2

#22

投稿記事 by 初心者 » 16年前

余り他人を批判するのは好ましいことではありませんが人にはそれぞれ考え方違います。
明らかに私が悪い場合ならともかくMistさんのように提案には賛成だが指図はNGという意見もあります。
Mistさんはこのやりとりを聞いてそう感じたということですよね。
ですので一方的に喝を入れるってのはおかしいでしょう。ただの罵倒に他なりません。私からすればの話ですが。

GPGA

Re:プログラム2

#23

投稿記事 by GPGA » 16年前

基本的な意見は、もう出てしまっているので、仕事現場からの意見を一つ。

管理人さんが言っている
>自分が自力で打開出来ない問題にぶち当たった時、「正解を見てから間違いを探す」というスタイル
を持っている人は現場ではいらない、というか邪魔なんです。
これらの人は、なにかあるたびに質問してきて、こちらの仕事時間を削っていきます。

学校でこういうスタイルでやっている人が、現場にきていきなり直るわけがありませんので
学生のうちに直しておきましょう。

初心者

Re:プログラム2

#24

投稿記事 by 初心者 » 16年前

皆様お騒がせしまして申し訳ございません。
私の意見はおかしくはないが考えが甘い、直した方がいい、直さないと今後成功しない、ということはわかりました。
実は私は学生ではなくて研修生ですのでGPGAさんの言葉はすっごく痛い、というより質問しまくってしまってますね・・

私が言いたいのは1つだけです。バグさんの意見を否定してるわけでもありません。ただ今回は時間がないのと早い所完成したプログラムが見たいのもあって解答を急ぎ、別解、もしくは良解について考えませんでした。
否定したわけではないというのだけご理解ください。
アドバイスしてくれた方にとっては少し気分を害したと思いますが、あらかた課題ができたのでじっくり取り組もうと思います。但しこれからは皆様の提案の件を尊重します。良いプログラマになるためにもバグさんはもちろん他の
解答してくださった方にもお力添えをしていただければと思います。どうもご迷惑をおかけしました。

初心者

Re:プログラム2

#25

投稿記事 by 初心者 » 16年前

さっそくご質問なのですが
while (fgets(buf, 1000, fp) != NULL) {
str=buf;
       while((*str!='\0'){
if(*str!='\0' && *str=='G'){
*str++;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
s2=buf2;
if((*str!='\0' &&(isdigit(*str) || *str=='-' || *str=='.'))
while(*str!='\0'&&(isdigit(*str) || *str=='-' || *str=='.'))
*s2++=*str++;
*s2='\0';
}

この部分少しおかしいと疑問に思ったのですが、
str=bufというのは先頭要素のアドレスをstrにセットしているというのはわかってるのですが
s2=buf2というのは少しおかしくないですか?
bufにはfpから読み込んだ文字列が入ってるのはわかりますが
buf2には何も入ってないですよね。実行してから色々試してみたのですがこれが何故うまくいくのがかがわかりません、buf2とかbuf3とかいらないような気もするのですがこれらを使わず書き直すことはできますか?

Dixq (管理人)

Re:プログラム2

#26

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

初心者さん、お伝えしたい事があるので、
dixqhp@gmail.com
まで連絡いただけないでしょうか?

初心者

Re:プログラム2

#27

投稿記事 by 初心者 » 16年前

連絡しました。

non

Re:プログラム2

#28

投稿記事 by non » 16年前

>s2=buf2というのは少しおかしくないですか?

s2=&buf2[0] と同じ意味です。つまり、配列の先頭アドレスをs2に代入しています。

>bufにはfpから読み込んだ文字列が入ってるのはわかりますが
>buf2には何も入ってないですよね。

何も入っていないってことはありません。auto型変数で宣言したのですから、何が
入っているのかわからないだけです。まして、その中身をs2にいれているわけではなく、
その場所(アドレス)を入れてるんですね。
逆に言えば、s2はbuf2の配列の先頭の場所を指す(ポイント)ようになるわけです。

初心者

Re:プログラム2

#29

投稿記事 by 初心者 » 16年前

返信ありがとうございます。
しかしですね、このプログラムだと
*s2++=*str++; ここで一文字ずつ入れてるわけですよね。
s2=buf2の段階でbuf2には何かしら入っていてその値がわからないだけとのことですが
デバッグで確かめたところbuf2に
それより後に代入していくGの値が既に入ってるんですよ
図形作成のときに入ってるならまだしもこの段階で入ってるのは何かしらおかしくないですか?
イマイチ納得できないので何度も失礼。

Mist

Re:プログラム2

#30

投稿記事 by Mist » 16年前

nonさんの回答見ても見当違いのこと言ってるなら、きついこと言うけどC言語基礎から勉強やり直したら?
正解のプログラムを見ても理解できないだったら、あなたのやり方じゃ絶対に無理じゃん。

non

Re:プログラム2

#31

投稿記事 by non » 16年前

これから飲みに行くので、また明日。
それより、このスレッド、長くなりすぎて、途中、別の話になったし、最初から読むと途中で
いやになると思うので、別スレッドを立てた方がよろしいかと思います。

non

Re:プログラム2

#32

投稿記事 by non » 16年前

auto型の変数はスタック領域にメモリが確保されます。
アドレスをしりたいなら
printf("%p",buf2);
を入れてやってみてください。
プログラムを何も変更せずに、再度実行しても、同じアドレスが表示されませんか。
auto型変数は、中身を初期化しませんから、同じ場所にメモリが確保されるなら、
前に使ったときの値が出ているのではないでしょうか?

初心者

Re:プログラム2

#33

投稿記事 by 初心者 » 16年前

>nonさんの回答見ても見当違いのこと言ってるなら

いえ正しいこと言ってると思いますけど納得いかない部分が少しあるだけのことです。


>きついこと言うけどC言語基礎から勉強やり直したら

今がその基礎勉強している所です。

>>正解のプログラムを見ても理解できないだったら、あなたのやり方じゃ絶対に無理じゃん。

勘違いがひどい。部分部分やり方は聞きましたが自分である程度組み立てたといってるでしょう。

そもそも関数などの組み立て方がわからなかったらサンプルを見てそれを分析して覚えるというだけですよ。

その際になんでこうなるんですか?と聞いてるだけでしょう。

正しいプログラムを見て覚えるというのは同意ですが正解のプログラムを見て覚えるというのはまた少し

違うんじゃないですかね。それに正しいプログラムを一目見て完璧にわかる人とか少ないとおもいますが・・

通りすがり

Re:プログラム2

#34

投稿記事 by 通りすがり » 16年前

とりあえず何度も屁理屈言ったり言い返したりせずに我慢するってこと出来ないんですか?
そんなんじゃ回答してくれる人減りますよ。
言いたい事散々言っておいて、次に質問する時は名前を変えればいいと思っているんでしょうか。

回答者はわざわざ何の義理もないあなたの為に時間を割いてくれてるんですよ。
少しは口答えせずに聞いてみましょう。

Mist

Re:プログラム2

#35

投稿記事 by Mist » 16年前

これで最後にします。

今回のプログラムを「ある程度」と呼べるほどあなたが作ったのであれば、今回のような頓珍漢な質問にはならないでしょ、って思うんですけどね。
コピペを多少改変して動いたからって、自分の実力だと勘違いしていませんか?
ポインタとか変数の実体とかについて勉強するべきです。

そして、それらを勉強するのに適したソースを見るべきです。
今回のプログラムはあなたの言われたとおり元のソースをなるべく直さず動くことを第一としているためつぎはぎだらけで無駄が多く勉強するためのソースとしては不向きです。
何を焦っているのか知りませんがこのソースから勉強するよりも、勉強するに適したソースで理解を深めたうえでこのソースを見たほうが時間はかからないと思いますよ。

初心者

Re:プログラム2

#36

投稿記事 by 初心者 » 16年前

>>とりあえず何度も屁理屈言ったり言い返したりせずに我慢するってこと出来ないんですか?
そんなんじゃ回答してくれる人減りますよ。
言いたい事散々言っておいて、次に質問する時は名前を変えればいいと思っているんでしょうか。

回答者はわざわざ何の義理もないあなたの為に時間を割いてくれてるんですよ。
少しは口答えせずに聞いてみましょう。


気持ちはわかりますが口答えとかいうのは少し違うでしょう。
誤解されている と言いたいだけですよ?誰の批判もしていません。
意見が気に食わないとかいうんじゃなく事実と違うだけのこと。口答えではなく釈明です。
事実を指摘されたなら素直に認めています。普通にあーそうなのかと思っていただければ結構です。
大体名前変えたってIPアドレスで管理人様にはわかりますよ。


>Mistさんへ

勘違い はしていないのですが仰る通りです。よくわからないが動いたからokというのが
何回かありましたね。それなりに私に対し真摯に書いてくださったのでしょう。少し私のやり方では
プログラムは不向きなのはわかりました。時間かけて少し改善できたらと思います。
本当にありがとう。 では私も最後にします。

閉鎖

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