左辺値

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

左辺値

#1

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

double bx=100,by=100;
void ShiftCoords(double *x, double *y)
{
  *x=*x+100;
  *y=-*y+100;
}


{
FILE *fp;
   char *str,buf[1000];
  char subbuf[100],*s1;
    char buf2[100],*s2;
  char buf3[100],*s3;
    char buf4[100],*s4;
ShiftCoords(&atof(buf3),&atof(buf4))

     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++;
                }


               CDC *v;
               v=GetDC();
               if((int)atof(buf2)==92){
                MoveTo((int)atof(buf3),(int)atof(buf4));
                bx=(int)atof(buf3);
                 by=(int)atof(buf4);

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

昨日教えていただいたプログラムに符号-を扱えるよう点を移動する関数を組み込んだモノなのですが

&の左辺値がありませんと出ます
>>ShiftCoords(&atof(buf3),&atof(buf4))

ここがおかしいみたいなんですが・・
double A=(int)atof(buf3);
double B=(int)atof(buf4);
ShiftCoords(&A,&B)
とするとエラーは出なくなったのですが図形がおかしくなりました。

原因と対策を教えてください。

non

Re:左辺値

#2

投稿記事 by non » 16年前

何をやりたいのかよくわからないのですが・・・
>ShiftCoords(&atof(buf3),&atof(buf4))
buf3やbuf4に何も入ってないのにいきなりですし・・・関数名に&ね。

>とするとエラーは出なくなったのですが図形がおかしくなりました。
whileの前で処理したことがwhileの中に影響しているというのでしょうか?A,Bは代入後
使っていないようですが。 おかしくならず、前のままだと思います。


原点移動のために、100増やしたいなら、わざわざ関数を作らなくて、
MovetoやLinetoのとき
MoveTo((int)bx+100,(int)by+100);
すれば、いいのでは?

御津凪

Re:左辺値

#3

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

対処は、
double A=atof(buf3); 
double B=atof(buf4); 
ShiftCoords(&A,&B)
だと思いますよ。

初心者

Re:左辺値

#4

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

うーんたしかにそっちのほうがいいかもですね。もう少し考えてみます。

初心者

Re:左辺値

#5

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

関数作るのは移動させたときにy座標反転させないといけないらしく、そのときに便利だからなんですけど。
double A=atof(buf3);
double B=atof(buf4);
ShiftCoords(&A,&B)をどこに入れるかがわからないんだと思います。
どこにいれるかで全然値変わりますよね

non

Re:左辺値

#6

投稿記事 by non » 16年前

じゃ、これを呼び出している場所の間違いでしょう。
double A=atof(buf3);
double B=atof(buf4);
ShiftCoords(&A,&B)

グラフィックを描いているブロックのところで行うこと。この後、
MoveTo((int)A,(int)B); って呼び出す。


それより、シングルドキュメントだと原点移動やy軸反転とかする関数があるみたいですけど。
前回のスレッドに私が載せたプログラムは原点移動して、y軸反転もしてたんですけど。

初心者

Re:左辺値

#7

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

それは原点移動でしょう。私のは原点移動ではないですし。
使ってるVC++少し違うみたいでなんとも言えないんですがSDIベースとダイアログベースは
また少し違うんで、私の使ってるダイアログベースではOnDraw関数が無いのかな。代わりのものはあるようですが
OnDraw関数を参考にしてやってもうまくいきませんので。

それと原点移動なんですが
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);

  LineTo(100,100);
    LineTo(300,100);
とかってすると完璧にできてるのですが
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++;
                }

               CDC *v;
               v=GetDC();
               if((int)atof(buf2)==92){
                MoveTo((int)atof(buf3),(int)atof(buf4));
                bx=(int)atof(buf3);
                 by=(int)atof(buf4);

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

とすると原点移動できてなかったんですけど、何が問題なのでしょうか

non

Re:左辺値

#8

投稿記事 by non » 16年前

質問に答えられるほど、VC++はわかりません。なんせ、先週から勉強始めました。
今現在、クラスがどうのこうので、こんがらがってます。

素人考えでは
MoveToをpDC->MoveToにしなくてよくエラーが出ないなと思うぐらいです。
bx,byの考え方は間違っていません。ただ、現在の状況ではstaticにしている意味はないと思いますが・・
(OnDrawで呼び出されるたびに、ファイルから読んでますからね)

バグ

Re:左辺値

#9

投稿記事 by バグ » 16年前

ダイアログベースの場合はOnDrawではなく、OnPaintが描画時に呼ばれます。

しかし、名前が違うだけで内部処理は基本的に同じはずです。つまり、OnDrawで出来て、OnPaintで出来ない事は基本的にないはずです。

ダイアログベースだろうが、SDIだろうが、WINDOWであることには変わりありません。
そこは勘違いされないように。

初心者

Re:左辺値

#10

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

あ・・pDCにしてないからダメだったみたいです。
質問ばかりでもうしわけないんですが
else if((int)atof(buf2)==01){
                 double A=atof(buf3);
                 double B=atof(buf4);
                 ShiftCoords(&A,&B);
                  MoveTo((int)bx,(int)by);
                 LineTo((int)atof(buf3),(int)atof(buf4));
に入れたんですが
MoveTo((int)A,(int)B)にすると
LineTo関数の方はどうなるんでしょう?

初心者

Re:左辺値

#11

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

OnPaintとOnDrawは内部構造は似たようなものだと思いますが使い分ける知識はありませんという
意味です。転写しただけではエラーでますし、もう少し後になってから使おうと思います。

non

Re:左辺値

#12

投稿記事 by non » 16年前

本人はおわかりでしょうが、見ている人は、初心者さんがどうしたいのか理解できておりません。
もしかしたら、理解していないのは私だけかも知れませんが、
前回のスレッドのときと線の引き方は変わったのですね。
すなわち、前は原点からG01コードの場合は放射線状に線を引いていたけど、G01コードは前の
ポイントから線を一筆書きにしていく。そのとき、ファイルから読んだ座標を変換するってことで
よろしいですね。
だとすると、私の認識ではLineToは前の座標から引いてくれるので、MoveToは必要ないのではないでしょうか?
したがって、前の座標を覚えておく変数もひつようない。
ただし、関数の最初でMoveTo(100,100);が必要ですが。

CDC *v;
v=GetDC();
この2行はwhileの中で、しなくてはいけないのですか?関数の頭で1度やればいいのでは?
この場所で
A=atof(buf3);
B=atof(buf4);
ShiftCoords(&A,&B);
をやっちゃいましょう。(宣言は関数の最初で)
if((int)atof(buf2)==92){
あいかわらず92のままです。
MoveTo((int)atof(buf3),(int)atof(buf4));
bx=(int)atof(buf3);  <-不要
by=(int)atof(buf4);  <-不要
ここがMoveTo((int)A,(int)B);
ReleaseDC(v);  <-?
これも、そのたび必要なものなんですか?関数の最後で1回じゃダメ?
}
else if((int)atof(buf2)==01){
MoveTo((int)bx,(int)by); <-不要
LineTo((int)atof(buf3),(int)atof(buf4));
ここを LineTo((int)A,(int)B));
bx=(int)atof(buf3);  <-不要
by=(int)atof(buf4);  <-不要
ReleaseDC(v);   <-?
}

初心者

Re:左辺値

#13

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

>>だとすると、私の認識ではLineToは前の座標から引いてくれるので、MoveToは必要ないのではないでしょうか?
したがって、前の座標を覚えておく変数もひつようない。

必要です。といってもそう思われるのも無理ないかもしれません。今回はムダに長くなるので省略していますが直線だけじゃなく円弧も書きますのでこうしないと円弧の終点から直線をひいたり直線の終点から円弧が書けないためです。
後不必要なプログラムもムダに打ち込んでしまってますがこれはそのうち改善されると思います。

初級者

Re:左辺値

#14

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

左辺値の話は終わったんですか?

閉鎖

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