関数の配列

[戻る]
ショウ 2002/11/25(月) 16:10:44
#include<stdio.h>
void sp(int a,int b)
{
int i,r,c;
    for(i=0;i<100;i++){
      for(r=0;r<100;r++){
    if(a[r]==i&&b[r]==r){
    c=1;
    break;
    }
    else {c=0;}
      }
      if(c==1)break;
   }

    return(c);
}
void main()
{
 int x[100],y[100],a;
 char b;
 x[0]=40; y[0]=200;
 a=don(x,y);

 if(a==0){
 pDC->TextOut(x,y,"bon");
 }
}

見たいな事をやりたいのですがエラーが出て困っています。
間違ってるところ教えてください。

こん! 2002/11/25(月) 16:19:34
> void sp(int a,int b)
> {
> int i,r,c;
>     for(i=0;i<100;i++){
>       for(r=0;r<100;r++){
>     if(a[r]==i&&b[r]==r){

aもbも配列ではない。

>  a=don(x,y);

??

sp()ってどこで使ってる?

sp()はvoidの様ですが

>     return(c);

は何?

> 見たいな事をやりたいのですがエラーが出て困っています。

結局何がやりたいの?エラーとはコンパイル?実行?・・・ってそれは愚問だな。

こん!<=^・^=>

ショウ 2002/11/25(月) 16:24:39
#include<stdio.h>
int don(int a[],int b[])
{
int i,r,c;
    for(i=0;i<100;i++){
      for(r=0;r<100;r++){
    if(a[r]==i&&b[r]==r){
    c=1;
    break;
    }
    else {c=0;}
      }
      if(c==1)break;
   }

    return(c);
}
void main()
{
 int x[100],y[100],a;
 char b;
 x[0]=40; y[0]=200;
 a=don(x,y);

 if(a==0){
 pDC->TextOut(x,y,"bon");
 }
}
すいません まちがってかいてました
これでおねがいします

2002/11/25(月) 16:28:36
>間違ってるところ教えてください
(誤)見たいな事 -->(正)みたいな事
pDC がいきなり出てくる(宣言せずに変数を使っている)
CDC::TectOut() の第一引数と第二引数とはどんな型何でしょうか?
  少なくとも int の排列の x や y やは引数としてふさわしくないでしょう
コンソールアプリケーションとウインドーアプリケーションとがごっちゃになっている

少し妙な点:
  定義している函数 sp() は誰も使っていないのに、未定義の函数 don()
  を void main() で使っている

  void main() は余り好ましくありません

ショウ 2002/11/25(月) 16:40:04
すいません
AppWizard(exe)をつくって
// CTestView クラスの描画

void CTestView::OnDraw(CDC* pDC)
{
    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: この場所にネイティブ データ用の描画コードを追加します。
    int x[100],y[100],a;
 char b;
 x[0]=40; y[0]=200;
 a=don(x,y);

 if(a==0){
 pDC->TextOut(x,y,"bon");
 }
}
とうち、
メンバ関数をint型で
donという名前で作って

int CTestView::don(int a,int b)
{
int i,r,c;
    for(i=0;i<100;i++){
      for(r=0;r<100;r++){
    if(a[r]==i&&b[r]==r){
    c=1;
    break;
    }
    else {c=0;}
      }
      if(c==1)break;
   }

    return(c);
}
をしたところエラーが出てしまうんですが。

EIJI 2002/11/25(月) 16:52:47
エラーが出る じゃなくて
「どこで」「どんなメッセージの」エラーなのかが分かると
返事がきやすくなります。

2002/11/25(月) 17:01:17
わからないから質問するのでしょうが、いいかげんな内容を提出するのはよしましょうね

void main() と void CTestView::OnDraw(CDC *pDC) とを二度も書き間違えるとは
考えられないのでそう言うのですが、その上「こん!」さんから指摘された点が今回は
元に戻っています(函数 don の引数の型)。
CDC::TextOut() の引数の型についてはお判りになりましたか?

第一、どのようなエラーなのか書いていない点が気になります

2002/11/25(月) 17:02:10
エラーは次のように出てます

C:\My Documents\C++\test\testView.cpp(65) : error C2664: 'don' : 1 番目の引数
を 'int [100]' から 'int' に変換できません。 (新しい機能 ; ヘルプを参照)
        この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。

C:\My Documents\C++\test\testView.cpp(68) : error C2664: 'int __thiscall 
CDC::TextOutA(int,int,const class CString &)' : 1 番目の引数を 'int [100]' か
ら 'int' に変換できません。 (新しい機能 ; ヘルプを参照)
        この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。

C:\My Documents\C++\test\testView.cpp(123) : error C2109: 配列または、ポインタでない
変数に添字が使われました。

C:\My Documents\C++\test\testView.cpp(123) : error C2109: 配列または、ポインタでない
変数に添字が使われました。

こん! 2002/11/25(月) 18:00:53
憐さん?ショウさん?

 エラーメッセージを出すのはいいですがその前の島さんのレスを見てその内容に対して確認し
てからビルドをした方がよくないですか?

落ち着いて整理してからにしたほうがよろしいかと。

こん!<=^・^=>

ショウ 2002/11/25(月) 18:30:24
配列つかわなければちゃんと表示はできるのですが
配列にすると上のようなエラーが出ます

こん! 2002/11/25(月) 19:16:24
 すみません。理解力が足りない私には配列の[0]しか初期化していない配列を渡して(渡し
てない)forループで何を処理しようとしているのかよくわからないのですけど。その配列を使
わなければ表示出来たというのはどうやったのですか?

だいたいにして配列にしたっていいますがまさかxとyを配列宣言にして

>  pDC->TextOut(x,y,"bon");

はこのまま呼んだわけではないでしょうね?

こん!<=^・^=>

2002/11/25(月) 21:54:13
>  pDC->TextOut(x,y,"bon");
そのとおりなんですが。
if文をつかって表示するかしないかを
しようとしただけのプログラムなんですけど

ショウ 2002/11/25(月) 22:03:29
配列使ってみたいとおもいまして
でも配列にするとエラーがでるんです

2002/11/25(月) 22:26:57
int x[100];

と宣言した場合に、x =10; という代入が可能かどうか判りますか?
整数と整数の排列とが違うことは判りますか?

今までにこん!さんや私が示していたことをまとめておきます
排列が使いたかったら

int CTestView::don(int a[], int b[])
{
/*  この部分は省略  */
}

void CTestView::OnDraw(CDC *pDC) では

   pDC ->TextOut(x[0], x[y], "don");

のようにしましょう

なお、
CTestView.h では

class CTestView : public CView
{
/*  下の定義以外は省きます  */
    int don(int a[], int b[]);
}
と訂正しましょう

YuO [E-Mail] 2002/11/25(月) 22:30:55
まずは使う名前をひとつに決めて下さい。
質問はそれからです。
#こん!さんが2002/11/25(月) 18:00:53の最初に書かれていますが……。
#それとも,憐さんとショウさんは別人……?

でもって,
> int CTestView::don(int a,int b)
これがどのような宣言(実際には定義ですが)かはわかっていますか?
これは配列を関数が受け取るような宣言ではないですよ。

こん! 2002/11/25(月) 23:05:24
答えは皆さんが出してくださっているのであれなんですけどだめ押しで

> if文をつかって表示するかしないかを

とは?
何の事か分からないんですけどリストを上げてみてもらえますか?

こん!<=^・^=>

こん! 2002/11/25(月) 23:17:10
http://www9.plala.or.jp/sgwr-t/c/sec10-2.html

ついでにこんなとこを読まれてみては?
どの程度理解出来ますか?

C++の前に
http://www9.plala.or.jp/sgwr-t/
でも読んでC言語を勉強された方がよろしいかも。

こん!<=^・^=>

こん! 2002/11/26(火) 00:18:43
>> if文をつかって表示するかしないかを

> 何の事か分からないんですけどリストを上げてみてもらえますか?

失礼。

> if(a==0){
>  pDC->TextOut(x,y,"bon");
>  }

これの事ね。

こん!<=^・^=>

ショウ 2002/11/26(火) 00:42:19
int型のメンバ関数donを作って次のようなプログラムを作りました

int CTestView::don(int a,int b)
{
    int i,r,c;
    for(i=0;i<100;i++){
      for(r=0;r<100;r++){
    if(a==i&&b==r){
    c=1;
    break;
    }
    else {c=0;}
      }
      if(c==1)break;
   }

    return(c);


}

そして
// CTestView クラスの描画に
下のようなプログラムをつくりました

void CTestView::OnDraw(CDC* pDC)
{
    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: この場所にネイティブ データ用の描画コードを追加します。
    
    int x,y,a;
 char b;
 x=40; y=200;
 a=don(x,y);

 if(a==0){
 pDC->TextOut(x,y,"bon");
 }

こん! 2002/11/26(火) 00:50:06
> x=40; y=200;
>  a=don(x,y);

まぁあのforループでは一生rは200にはなりそうも無いからaも一生0ですわね。

あと、お願いだからインデントあわせて。見づらいから。

こん!<=^・^=>

ショウ 2002/11/26(火) 01:02:57
xとyを配列にしたいんですが
どうすればよいでしょう?

2002/11/26(火) 01:09:29
2002/11/25(月) 22:26:57 の一部に書き間違いがありました

>   pDC ->TextOut(x[0], x[y], "don");
は
   pDC ->TextOut(x[0], y[0], "don");

とでも訂正してください。x, y の添え字はあなたの考える適切な値に
してください。私には、どの添え字が適切なのか判断できませんので、
0 にしておきました

こん! 2002/11/26(火) 01:10:33
> 島 2002/11/25(月) 22:26:57

を読んでいないんですか?
そのままの解答だと思いますけど。他に何かありますか?

こん!<=^・^=>

RAPT 2002/11/26(火) 01:19:39
こんばんは、RAPTです。

(配列にするあたりは自分でやってください)

# 通常、returnに、()は不要です。
# return(c); ではなく、return c; とします。

CTestView::don()なんて、わざわざ変数cを使う意味はあるのかな。

int CTestView::don(int a,int b)
{
    int i,r;
    for(i=0;i<100;i++){
        for(r=0;r<100;r++){
            if(a==i && b==r)
                return 1;
        }
    }
    return 0;
}
これだけでいいような。しかも、a, bが、100以上の時、必ず0を返すし。。

もっと言えば、ここで1万回のループをする必要性は?
これって、実は
int CTestView::don(int a, int b)
{
    return (a>=0 && a<100 && b>=0 && b<100) ? 1 : 0;
}
で終わるとか?

Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0

ショウ 2002/11/26(火) 01:35:00
[[解決]]
皆様
いけるようになりました
ありがとうございました

ショウ 2002/11/26(火) 01:39:19
やりたかったことは100*100のマスに
点(座標)があるかないかを判別する
ようなプログラムをつくりたかったんです
だから配列を作って座標を登録してそのなか
にあるかないかをしたかったそれだけなんです。

すいませんでした素人なもんで理解力がなくてm(__)m

こん! 2002/11/26(火) 01:54:10
> やりたかったことは100*100のマスに
> 点(座標)があるかないかを判別する

だったら
int p[100][100];

の二次元配列を

p[y][x]でふった方が分かりやすかったかも知れませんね。

あしからず・・・

こん!<=^・^=>

RAPT 2002/11/26(火) 02:01:47
> やりたかったことは100*100のマスに点(座標)があるかないかを判別する

それだったら、最初からそういってくれれば。

void CTestView::OnDraw(CDC* pDC)
{
    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: この場所にネイティブ データ用の描画コードを追加します。

    int x,y,a;
    char b;
    x=40; y=200;
//    a=don(x,y); // removed

    // inserted
    CPoint pt (x, y);
    CRect rc (0, 0, 99, 99); // (0,0)を左上とする、100x100のマス目
    // ende

    if(!rc.PtInRect(&pt)/*a==0*/){ // changed
        pDC->TextOut(x,y,"bon");
    }
}
こんなこともできます。後はヘルプを参照。参考までに。

Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0

こん! 2002/11/26(火) 02:35:29
>     if(!rc.PtInRect(&pt)/*a==0*/){ // changed

     if(rc.PtInRect(pt)/*a==0*/){ // changed

それをやるならこれのような・・・

こん!<=^・^=>

こん! 2002/11/26(火) 03:10:21
突っ込みついでにこんなのはいかが。

Viewクラスのメンバ変数に
CPoint m_cPoint;

コンストラクタで

CEView::CEView():m_cPoint(0,0)
{
}

描画で
void CEView::OnDraw(CDC* pDC)
{
    CRect rc (0, 0, 300, 300); // (0,0)を左上とする、100x100のマス目

    if(rc.PtInRect(m_cPoint)/*a==0*/){ // changed
        pDC->TextOut(m_cPoint.x,m_cPoint.y,"bon");
    }
}

ほんでマウスイベントで
void CEView::OnMouseMove(UINT nFlags, CPoint point) 
{
    m_cPoint = point;
    Invalidate(TRUE);
}

一例・・・

こん!<=^・^=>

古いスレッドには追加発言できません。