配列を表示させるには?

解決


さなえ  2004-10-26 01:33:57  No: 54875

VC++6.0 
ダイアログベースで作業しているのですが
data[i][j]に格納した値をすべてeditboxに表示させるには
どうしたらいいのでしょうか?


たく  2004-10-26 03:38:48  No: 54876

data[0][0]の表示はできてますか?


通りすがり  2004-10-26 03:40:21  No: 54877

エディットボックスの文字列を代入するならSetDlgItemTextやらSetWindowTextで変更可能だから、
i, j の添え字が配列の領域確保数だと仮定した上で、

HWND hdlg;        // ダイアログのウィンドウハンドル。事前に代入しておく
int  ctrlID;      // editbox のコントロールの識別子。事前に代入しておく
int tmp_i, tmp_j; // インデックス用
char tmp[256];    // 一時バッファー用。サイズは適当
char buf[1024];   // 出力用。サイズは適当
buf[0] = '\0';
for( tmp_i = 0; tmp_i < i; tmp_i++ ) {
  for( tmp_j = 0; tmp_j < j; tmp_j++ ) {
    sprintf(tmp, "%d", data[tmp_i][tmp_j]); /* 文字列にする, %d はdataの型にあわせること */
    strcat(buf, tmp);  /* 文字列を追加 */
    strcat(buf, ", "); /* 一応区切り文字も表示してみる */
  }
}

SetDlgItemText( hdlg /* ウィンドウハンドル */,  ctrlID /* editbox のID */, (LPCTSTR)buf );

とかすればいいのでは?


さなえ  2004-10-27 01:40:48  No: 54878

double test = data[1][3];
m_sEdit.Format("%lf",test);
のように表示させているのですが、これを応用はできないのでしょうか?

SetDlgItemText( hdlg /* ウィンドウハンドル */,  ctrlID /* editbox のID */, (LPCTSTR)buf );

部分を
m_sEdit.Format("%d",buf);
にしてみましたがだめでした。


yukiyuki  2004-10-27 04:04:53  No: 54879

MFCを使用しているのなら
こんな感じでどうかしら。

double test;
double data[2][2] = {{1.11111,2.22222},{3.33333,4.44444}};
CString string,show;
for(int i = 0;i<2;++i){
    for(int j=0;j<2;++j){
          test = data[i][j];
          string.Format("%lf ",test);
          show += string;
    }
}  
SetDlgItemText(IDC_EDIT1/*コントロールID*/,show);


たく  2004-10-27 19:17:58  No: 54880

> m_sEdit.Format("%d",buf);
m_sEdit.Format("%s",buf);
これでもだめ?


さなえ  2004-10-28 02:10:07  No: 54881

double test;
    CString show;
    CString ss;
    for(int i=0; i<=200; ++i)
    {
      for(int j=0; j<=3; ++j)
      {
        test=data[i][j];
        ss.Format("%lf",test);
        show+=ss;
      }
    }
    SetDlgItemText(IDC_EDIT1,show);
                  
とやってみたのですが、何も起こりません。(ボタンを押してファイルを選んでもエディットボックスの中になにも表示されません)
ちなみに、dataの中にはファイルから読み込んだものがはいっていて、ひとつひとつの値は表示できます。どこが間違っているのでしょうか?


さなえ  2004-10-28 02:23:52  No: 54882

通りすがりさんのプログラムの最後の行を
m_sEdit.Format("%s",buf);
にしてみたら
for( tmp_i = 0; tmp_i < i; tmp_i++ ) {
の行に対して
 warning C4700: 値が割り当てられていないローカルな変数 'i' に対して参照が行われました。
とのエラーがでました。
次に
temp_iにしている意味が私にはよく理解できなかったので
char tmp[256];    // 一時バッファー用。サイズは適当
char buf[1024];   // 出力用。サイズは適当
buf[0] = '\0';
for(int i = 0; i<=200 ; i++ ) {
  for( int j= 0; j<=3 ; j++ ) {
    sprintf(tmp, "%d", data[i][j]); /* 文字列にする, %d はdataの型にあわせること */
    strcat(buf, tmp);  /* 文字列を追加 */
    strcat(buf, ", "); /* 一応区切り文字も表示してみる */
  }
}
      m_sEdit.Format("%s",buf);

としてみましたが、ボタンを押してファイル選択をすると、実行画面が、キャンセルボタンを押したようにきえてしまいます。


yukiyuki  2004-10-28 02:54:48  No: 54883

デバッグ時、for文の中の変数はどのようになっていましたか?

"ボタンを押した時の処理"の、
ソースを提示して貰えると何か分かるかもしれません。


さなえ  2004-10-28 03:23:04  No: 54884

void CDetafile6Dlg::OnButton1() 
{
    ifstream fin;
  CFileDialog f(TRUE);
  if(f.DoModal()==IDOK){
//ファイルを開く
    fin.open(f.GetFileName());
    if(fin.fail()){
      AfxMessageBox("ファイルをオープン出来ません");
      fin.close();
    }
//ファイルを読んでエディットコントロールへ出力

    string str;
    double data[22000][4];

    while (!fin.eof())
    {
      for(int k=0; k<9; k++)
      {
        getline(fin,str);
      }
      for(int j=0 ; j<=20000 ; j++)
      {
        for(int i=0 ; i<=3 ; i++)
        {
          fin>>data[j][i];
        }
      }

    }

がソースです。このあとに先に述べたようなものをつけたしました。
fin.close();
UpdateData(FALSE);
もかいてあります


さなえ  2004-10-28 04:32:12  No: 54885

CString ss;
  for(int i=0; i<12000; i++)
{
  double test1=data[i][0];
  double test2=data[i][1];
  double test3=data[i][2];
  double test4=data[i][
  ss.Format("%1.2lf %1.2lf %1.2lf 1.2lf\r\n",test1,test2,test3,test
  m_sEdit+=ss;
}
で出来ました。
ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加