質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1832questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

配列にデータをいれてそのデータを用いて円を描画したいです。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 628

TRON1216

score 12

あるデータを用いて円を描画したく、Ellipse関数に読み込んだデータの値を配列(x[0])として入れたところ、ビルドはできるのですが円が描画されません。x[0]=1.47であるので、1.47を直接Ellipse関数に入れて実行させたところ、円が描画されました。配列を用いて描画したいです。分かる方いましたらよろしくお願いいたします。以下が円(楕円)を描画するコードの一部です。ブレークポイントで確かめたところ、配列に入っている値は0でした。同じプロジェクト中の別のソースファイルでx[i]の色々な値読み込みは成功しています。ですが、そのx[i]を以下のソースファイルにも使いたいです。
コード
'''

include  "kobayashi.h"

include "time.h"

//月を描画するウィンドウのウィンドウプロシージャ
LRESULT CALLBACK WndProc2( HWND hWnd2, UINT msg, WPARAM wp, LPARAM lp )
{
PAINTSTRUCT ps;
HDC hdc;
HPEN hPen,h01dPen;
HBRUSH hBrush, h01dBrush;
RECT rect;

switch (msg) {
case WM_PAINT:

hdc = BeginPaint(hWnd2, &ps);

Ellipse(hdc,0 , 0, x[0]/2*226.5+0.5, x[0]/2*226.5+0.5 );

hPen = CreatePen(PS_DOT, 0, RGB(255, 0, 0));
h01dPen = (HPEN)SelectObject(hdc, hPen);
hBrush = (HBRUSH)GetStockObject(NULL_BRUSH);
h01dBrush = (HBRUSH)SelectObject(hdc, hBrush);

DeleteObject(hPen);
SelectObject(hdc, h01dPen);
SelectObject(hdc, h01dBrush);
EndPaint(hWnd2, &ps);

break;

case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return (DefWindowProc(hWnd2, msg, wp, lp));

}
return 0;

}'''

もう一つ、x[]を読み込んだプログラムを以下に表示します。
、、、
BOOL read_data( HWND hDlg, FILE *hm, int channel )
{
char cbuf[500];            // 1行分のデータを読み込む文字列
char *p, *context;        // strtok_sを使うために必要
int i = 0;

static bool flag = TRUE;// 最初のデータの読み込み時はTRUE、後はFAULTにする
int i = 0;

while ( fgets( cbuf, 501, hm ) != NULL ){        // データを最後まで読み込む

p = strtok_s( cbuf, ",", &context ); 
sscanf_s( p, "%f", &ET[i] );

p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &XEQL[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &YEQL[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &ZEQL[i]);

p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VXEQL[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VYEQL[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VZEQL[i]);

p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &XSUN[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &YSUN[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &ZSUN[i]);

p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VXSUN[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VYSUN[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VZSUN[i]);

p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &XMOON[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &YMOON[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &ZMOON[i]);

p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VXMOON[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VYMOON[i]);
p = strtok_s( NULL, ",", &context );
sscanf_s( p, "%f", &VZMOON[i]);

EQL_MOON[i] = sqrtf((XMOON[i]-XEQL[i])*(XMOON[i]-XEQL[i])
+ (YMOON[i]-YEQL[i])*(YMOON[i]-YEQL[i])
+ (ZMOON[i]-ZEQL[i])*(ZMOON[i]-ZEQL[i]));
x[i] = (0.00005*1737)/(EQL_MOON[i]-50);
i++;

}
SetDlgItemInt( hDlg, IDC_EDIT_header1, total_n, FALSE );

if ( flag == TRUE ){
SetDlgItemInt( hDlg, IDC_EDIT_STOP, total_n-1, FALSE );    // 全体表示する場合の最後のサンプル番号が決まる
SetDlgItemInt( hDlg, IDC_EDIT_START,   0, FALSE );    // 最初のサンプル番号は0にしておく
flag = FALSE;
}

return TRUE;    // 戻り値TRUEを返す
}、、、    

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2017/01/16 18:15

    コードを記載する場合は、前後を```で囲ってください。

    キャンセル

  • PineMatsu

    2017/01/16 18:20

    x[0]が0なのであればx[0]に値を読み込む部分のソースを提示してはどうですか?そうしないとこれ以上の議論はできないでしょう。なお、コードは</>ボタンを押して示される```と```の間に記述してください。そうすると見やすく整形してくれます。

    キャンセル

  • PineMatsu

    2017/01/16 18:47

    ```をキーボードで直接打つ場合は半角文字で入力してください。

    キャンセル

回答 3

checkベストアンサー

0

まずは実際にx[0]に読み込まれた値が入っているのかを確認しましょう。

以下ではC#の例ですが、C++でも手順は同じです。
最初にマスターしたいVisual Studioのデバッグ機能 - 基本編

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/16 18:04

    返信ありがとうございます。
    ブレークポイントで見たところ、x[0]の値は0になっていました。ですが同じプロジェクト中の別のソースファイルで配列xを読み込んでいるのですがどうして0になってしまうのでしょうか、、、

    キャンセル

  • 2017/01/16 18:12

    ・正しく読み込まれていない。
    ・読込と描画の変数xは別物である。
    など、色々な原因が考えられますが、提示されたソースだけでは特定はできません。
    読込処理のソースも提示してはいかがでしょうか?

    キャンセル

  • 2017/01/16 18:36

    ・配列変数xはソース上のどの位置で宣言されていますか?
    ・read_dataを呼出している部分がありません。描画前に呼び出されているでしょうか?
    ・read_data内でxには意図した値が入ってきていますか?(ブレークポイントで確認できます)

    キャンセル

  • 2017/01/16 18:41

    ヘッダーで定義しています。二つのソースファイルでインクルードしています。そしてread_data内では意図した値が入ってました。

    キャンセル

  • 2017/01/16 18:53

    xの宣言(.h)と定義(.cpp)のソースを提示ください。
    また、read_dataはどこで呼出していますか?描画前に呼び出されているでしょうか?

    キャンセル

0

配列がどのように宣言されているのか、わかりませんが、
Ellipse()の定義は以下のようになっています。

BOOL Ellipse(
HDC hdc,        // デバイスコンテキストのハンドル
int nLeftRect,  // 長方形の左上隅の x 座標
int nTopRect,   // 長方形の左上隅の y 座標
int nRightRect, // 長方形の右下隅の x 座標
int nBottomRect // 長方形の右下隅の y 座標
);

実数値は入れられないとおもいます。
配列の宣言がおかしいのかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/16 18:08

    配列はfloat x[10000]で色んなxをnRightRectとnBottomRectに入れて描画したいのですが、、

    キャンセル

  • 2017/01/16 18:12 編集

    あ・・・
    Ellipse()にfloatは代入できないとおもいます。
    それから、float xをローカル内に宣言した場合、配列の要素数が多すぎます。
    スタック領域をそこまでずらすことはできない可能性があります
    x[0] = 0になっている理由はそこかもしれません。

    キャンセル

  • 2017/01/16 18:16

    もし、どうしてもfloatを使用したい場合はDirectXのD2D1_ELLIPSE Ellipseを使用すれば、可能ですが、
    おそらく、配列の宣言の仕方も修正する必要があるとおもいます。

    キャンセル

0

strtok_s()でカンマ区切り文字列を分解しているんだったら、atof()で直接浮動小数に変換したほうが良いのでは?読み出してx[i]に代入した後でブレークポイントをセットして見てデバッグすればいいと思います。

それからstrike1217さんも指摘してますが、Ellipse関数の引数は画面上の左上隅と右下隅の座標なので、整数値(int)になります。なので、浮動小数の座標から画面座標系に変換しないと思った通りに描けないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Unity、頂点の選択について

    1頂点を取得(選択)した後、その頂点の周りに接する頂点をまとめて選択するような方法を探しています。 また、いくつかの頂点を選択した後、一番端っこに属する頂点を選択から除くような処

  • 解決済

    opencvでの画像の回転

    opencvを用いて読み込んだ画像の回転を行っています。 以下のプログラムで画像の回転を行い実行できたのですが、 画像が回転し、元の画像の場所が黒く表示されるのが気に入りません

  • 解決済

    C++でのオセロゲームについて

    色々手を尽くしましたが、自力で解決できないため教えていただければと思い質問いたします。 学習のためhttps://gist.github.com/mia-0032/5325961

  • 受付中

    Win32APIでBMPファイルを読み込む方法

    #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(H

  • 受付中

    Win32API bmpファイル表示について

    ソースコード #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM

  • 解決済

    visual studio 出力の文字化け

    文字化けをなくしたいです Visual studio 2017を使っています。 猫でもわかるプログラミングの通りにしていたら、下の写真のように文字化けしてしまいました。 宜しくお願

  • 解決済

    Win32で自作のダイアログエディタで上下関係をはっきりしたい

    こんにちは。  前提・実現したいこと 今、Win32 APIでRisohEditorという名前のリソースエディタを作っています。 RisohEditor https://g

  • 解決済

    BitBltによる画像表示について

    現在C++でGUIアプリケーションを作成しているのですが、ウィンドウに画像を表示させたいです。 調べると、画像を表示するにはメッセージループのWM_PAINTの箇所に該当する記述を

同じタグがついた質問を見る

  • C++

    3450questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1832questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。