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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

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

C++

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

Q&A

解決済

3回答

2972閲覧

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

TRON1216

総合スコア18

Visual Studio

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

C++

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

0グッド

2クリップ

投稿2017/01/16 08:09

編集2017/01/16 09:30

あるデータを用いて円を描画したく、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を返す

}、、、

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/01/16 08:18

Ellipse呼出時、実際にx[0]に読み込まれた値が入っているかはどのようにして確認しましたか(ブレークポイントを置いたなど)?
TRON1216

2017/01/16 08:36

連絡ありがとうございます。確認はしていません。どう確認すればいいのかもわからないです。できれば教えていただけないでしょうか?
PineMatsu

2017/01/16 08:49

Ellipseのところにブレークポイントをセットして実行したら、ブレークするはずなのでx[0]のところにカーソルを当てて右クリックでクイックウォッチを選べば値の確認ができます。
strike1217

2017/01/16 08:55

x[0]の配列はどのように宣言していますか?
TRON1216

2017/01/16 09:05

ブレークポイントで確認したところ、配列に入っている値は0でした。
can110

2017/01/16 09:15

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

2017/01/16 09:20

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

2017/01/16 09:47

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

回答3

0

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

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

投稿2017/01/16 09:45

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2017/01/16 08:59

strike1217

総合スコア651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TRON1216

2017/01/16 09:08

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

2017/01/16 09:14 編集

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

2017/01/16 09:16

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

0

ベストアンサー

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

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

投稿2017/01/16 08:46

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TRON1216

2017/01/16 09:04

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

2017/01/16 09:12

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

2017/01/16 09:36

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

2017/01/16 09:41

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

2017/01/16 09:53

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問