![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
C++BuilderXE2starterです。
ビットマップ(bmp)やTImage を配列で定義し、関数の引数として渡したいのですが
よくわからないまま、次のようにすると、色んな不正な使い方らしきエラーとなります。
正しい使い方を教えてください。
なお配列でないbmpを渡すことはできます。ImageはIDEで定義するのではなく、プログラムから生成させる積もりです。
最終的にやりたいスタイル。
void __fastcall TForm1::onclick(TObject *Sender)
{
intn;
Graphics::TBitmap *bmp[10];
TImage::Image *Imagenum[10];
for(n=0;n<10;n++){
bmp[n]=new Graphics::TBitmap();
Imagenum[n]=new TImage::TImage;
// bmp,Imagenum のサイズ位置の設定
Imagenum[n]->Top= 値;
Imagenum[n]->Left= 値;
}
sub(bmp,Imagenum);
Free(bmp); // for でまわす要あり?
Free(Image);
}
//---------------------------------------------------------------------------
voidTForm1::sub2(Graphics::TBitmap *bmp[], TImage *Imagenum[])
{
Image[0]->Canvas->Draw(0,0,bmp[0]);
Image[1]->Canvas->Draw(0,0,bmp[1]);
}
unit.h
class TForm1 : public TForm
{
__published:// IDE で管理されるコンポーネント
TButton *Button1;
void __fastcall onclick(TObject *Sender);
private:// ユーザー宣言
voidTForm1::sub(Graphics::TBitmap **bmp, TImage **Image);
public:// ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
No.3ベストアンサー
- 回答日時:
おそらく、やりたいことは次のようなコートだと思います。
void sub2(TBitmap* bmp[10], TImage* image[10])
{
for (int i = 0; i < 10; ++i)
image[i]->Canvas->Draw(0, 0, bmp[i]);
}
void __fastcall TForm1::FormClick(TObject *Sender)
{
TBitmap* bmp[10];
TImage* image[10];
for (int i = 0; i < 10; ++i)
{
bmp[i] = new TBitmap();
bmp[i]->LoadFromFile(IntToStr(i) + ".bmp");
image[i] = new TImage(this);
image[i]->Parent = this;
image[i]->Left = i * 32;
image[i]->Top = 0;
image[i]->Height = 32;
image[i]->Width = 32;
}
sub2(bmp, image);
for (int i = 0; i < 10; ++i)
delete bmp[i];
}
せっかくC++を使うなら配列よりもstd::arrayやstd::vectorなどを使った方がいいと思います。
画像ファイルを表示するだけなら次のようにかけます。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (int i = 0; i< 10; ++i)
{
TImage* image = new TImage(this);
image->Parent = this;
image->Left = i * 32;
image->Top = 0;
image->Height = 32;
image->Width = 32;
image->Picture->LoadFromFile(IntToStr(i) + ".bmp");
}
}
T.yamamoto様(お世話になっている方のイニシアルに覚えがありますが・・)ご返事ありがとうございます。
書き方はわかりました。意味も大体わかりました。
記法のバラエティとして以下を確認しました。
・image[i] = new TImage(this);→image[i] = new TImage(Form1);
前者の方が一般的なのですね。
・void sub2(TBitmap* bmp[10], TImage* image[10]) →
void sub2(TBitmap** bmp, TImage** image)
同じならば、前者の方が実体をよくあらわしているのでベターですね。
理屈は体で(指で?)覚えていないので、すぐ忘れてしまいます。できるだけ忘れない方法でメモしておきます。
他 std::array はスマートポインタですね。触手のでる良い点もありますがどうも新しいことにはなかなかなじめません。
Fotranの添え字チェックにもあたりますね。
image[n]の使い方のご提示で、規則的配置とも限らないのですが、参考になります。
No.2
- 回答日時:
C++Builder は全然知らんのだけど, TImage::Image とか TImage::TImage って存在するの?
4つ目 (29行目) のエラーはこれらとは全然関係なくって, 単に「配列の渡し方を理解しているかどうか」だけの問題.
No.1
- 回答日時:
・unit.h で TForm1::sub2 が宣言されていないのはなぜ?
・TForm1::sub2 の中にある Image ってなに?
Free は for で回さないとだめだね.
ご返事ありがとうございます。
投稿時にミスがあったようです。現在のコードとそのエラーを開示します。
未定義のシンボルImageがよくわからないです。
[BCC32 エラー] Unit1.cpp(21): E2451 未定義のシンボル Image *1
[BCC32 エラー] Unit1.cpp(21): E2451 未定義のシンボル Imagenum*2
[BCC32 エラー] Unit1.cpp(26): E2303 型名が必要*3
他に下記エラー等もあるが、上記と関連していると思います
[BCC32 エラー] Unit1.cpp(29): E2034 'TBitmap *' 型は 'TBitmap * *' 型に変換できない
unit.h 抜粋
private:// ユーザー宣言
voidTForm1::sub2(Graphics::TBitmap **bmp, TImage **Image);
unit1.cpp
void __fastcall TForm1::onclick(TObject *Sender)
{
intn;
Graphics::TBitmap *bmp[10];
TImage::Image *Imagenum[10]; // *1,*2
for(n=0;n<10;n++){
bmp[n]=new Graphics::TBitmap();
Imagenum[n]=new TImage::TImage; //*3 (*1,*2正しくないから?)
}
sub2(*bmp,*Imagenum);
for(n=0;n<10;n++){
Free(bmp[n]);
Free(Imagenum[n]);
}
}
//---------------------------------------------------------------------------
voidTForm1::sub2(Graphics::TBitmap *bmp[], TImage *Imagenum[])
{
Imagenum[0]->Canvas->Draw(0,0,bmp[0]);
Imagenum[1]->Canvas->Draw(0,0,bmp[1]);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- 英語 Thus, PTH may be used to promote bone regeneration 1 2022/07/26 08:15
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
C言語についてです 5人のテスト...
-
c言語
-
構造体のextern方法
-
C言語の配列のコピーについて質...
-
vector配列の重複を無くすには?
-
コンボボックスでデフォルト値...
-
.NET C++で、構造体の配列をnew...
-
C言語の2次元配列 容量が大き...
-
Cのエラー
-
C++DLLからC#へのコールバック...
-
char gyou[1024];でcharの表現...
-
std::for_eachに、ループカウン...
-
C言語から質問です。
-
配列のアドレス部
-
C言語 ファイルの指定された行...
-
define で 配列
-
c言語 任意の整数の和
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語の2次元配列 容量が大き...
-
c言語 構造体
-
C言語についてです 5人のテスト...
-
C言語 ファイルの指定された行...
-
int i, int i[1];
-
fclose()でセグメンテーション違反
-
char型配列をint型に代入するには
-
C言語から質問です。
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
[C++]const int と配列
おすすめ情報