tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル構造体
記事No12401
投稿日: 2008/05/29(Thu) 10:33
投稿者VB
VC++で
#define MAX_SZ    256
typedef struct inf{
    char    test1[32];
    char  test2;
    char       test3[1];    
    int     test4;
    char    test5[MAX_SZ][MAX_SZ];
    char    test6[MAX_SZ][32];
    char    test7[MAX_SZ][32];
    char    test8[MAX_SZ][32];
    char    test9[MAX_SZ][32];
    char       test10[MAX_SZ][MAX_SZ];    
    char    test11[MAX_SZ][32];    
    char    test12[MAX_SZ][MAX_SZ];
    char    test13[MAX_SZ][MAX_SZ];
}  __inf;
上記のような構造体を作り
VBで
Public Const MAX_SZ = 256
Public Type pinf
    test1 As String * 32
    test2 As String * 1
    test3 As String * 1
    test4 As Integer  
    test5(255) As String * MAX_SZ    
    test6(255) As String * 32        
    test7(255) As String * 32        
    test8(255) As String * 32      
    test9(255) As String * 32      
    test10(255) As String * MAX_SZ    
    test11(255) As String * 32        
    test12(255) As String * MAX_SZ    
    test13(255) As String * MAX_SZ
End Type

上記のような構造体を作りましたところ
『固定長文字列型や静的変数のデータの大きさは64KBを越えることはできません
と怒られてしまいました。
VB側でどうにかこれを可能にしたいのですが。
その場合、どうすれば良いのでしょうか?
具体的な解答お待ちしております。<(_ _)>

[ツリー表示へ]
タイトルRe: 構造体
記事No12402
投稿日: 2008/05/29(Thu) 11:42
投稿者戸豚
>VB側でどうにかこれを可能にしたいのですが。
無理です。
以前、わたしも同じような64kバイトの壁にぶつかったときは、
配列の実体はVB側で確保してVC++側にはそのポインタを伝える様にしました。

VBさんの例では構造体を
typedef struct inf{
    char*  test1;
    char  test2;
    char*  test3;    
    int    test4;
    char** test5;
    char** test6;
    char** test7;
    char** test8;
    char** test9;
    char** test10;    
    char** test11;    
    char** test12;
    char** test13;
}  __inf;

Public Type pinf
    ptrTest1 As Long
    test2    As Long
    ptrTest3 As Long
    test4    As Long
    ptrTest5 As Long
    ptrTest6 As Long
    ptrTest7 As Long
    ptrTest8 As Long
    ptrTest9 As Long
    ptrTest10 As Long
    ptrTest11 As Long
    ptrTest12 As Long
    ptrTest13 As Long
End Type
のように変えて、ptrTest〜のメンバーにはVarPtrで得たアドレスを入れる、ような感じです。

[ツリー表示へ]
タイトルRe^2: 構造体
記事No12404
投稿日: 2008/05/29(Thu) 13:17
投稿者VB
> typedef struct inf{
>     char*  test1;
>     char  test2;
>     char*  test3;    
>     int    test4;
>     char** test5;
>     char** test6;
>     char** test7;
>     char** test8;
>     char** test9;
>     char** test10;    
>     char** test11;    
>     char** test12;
>     char** test13;
> }  __inf;
> と
> Public Type pinf
>     ptrTest1 As Long
>     test2    As Long
>     ptrTest3 As Long
>     test4    As Long
>     ptrTest5 As Long
>     ptrTest6 As Long
>     ptrTest7 As Long
>     ptrTest8 As Long
>     ptrTest9 As Long
>     ptrTest10 As Long
>     ptrTest11 As Long
>     ptrTest12 As Long
>     ptrTest13 As Long
> End Type

Longとcharでやり取り出来るのでしょうか?!
VC++で
strcpy(PINFO->test[1], "test");
こんな感じに構造体に値を入れて上げて。
VBで
PINFO(0).test1(0)の値が"test"となっていなければいけないのですが・・・。

あと、
charとchar*とchar**の違いは何なのでしょうか?
自分でも調べますがついでに教えていただけるとVC++初心者なのでありがたいです♪

[ツリー表示へ]
タイトルRe^3: 構造体
記事No12408
投稿日: 2008/05/30(Fri) 00:57
投稿者戸豚
> Longとcharでやり取り出来るのでしょうか?!

Longとchar、ではなくてLongとchar*です。
アドレスはLongで表現できるのでアドレスが明示的に扱えないVBではLongで定義してるに過ぎません。

> VC++で
> strcpy(PINFO->test[1], "test");
> こんな感じに構造体に値を入れて上げて。
> VBで
> PINFO(0).test1(0)の値が"test"となっていなければいけないのですが・・・。

PINFO->testは
struct info{
  char test[10][10];
};
のような2次元配列で良いでしょうか?
それならば
struct info{
  // ポインタの配列を使う。
  char* test[10];
};
struct info{
  // ポインタへのポインタを使う。
  char** test;
};
のいずれも
strcpy(PINFO->test[1],"test");
で2番目の配列に"test"の文字がセットされます。

> あと、
> charとchar*とchar**の違いは何なのでしょうか?
> 自分でも調べますがついでに教えていただけるとVC++初心者なのでありがたいです♪

char  は文字型。
char* は文字型の配列へのポインタ。
char**はchar*の配列の先頭アドレスを示すポインタ。
です。
C言語では「配列」と同じように扱える「ポインタ」が存在します。
すみませんがポインタについて説明し出すとキリが無いので、ここではご自分で勉強なさって下さい、としか言えません。

C/C++言語ではポインタが鬼門になるので、きっちり理解しておいた方が良いです。
個人的には技術評論社から出ている『C言語ポインタ完全制覇 (標準プログラマーズライブラリ)』前橋和弥著、が読みやすかったのでお勧めします。

[ツリー表示へ]