0

構造体に整数の配列を保持したい

struct HPDF_TableAttributes
{
    HPDF_REAL rows;
    HPDF_REAL cols;
    HPDF_REAL rowH;
    HPDF_REAL colW;
    HPDF_REAL tabX;
    HPDF_REAL tabY;
    HPDF_REAL tabH;
    HPDF_REAL tabW;
    HPDF_Font font;
    HPDF_REAL fontSize;
    int colRatios[];     /// HERE
};

どうやってやっても問題ないようですが、コンパイラはここで初期化することを望んでいますか? 私はそれをしなければなりませんか?私は使用のために次の行に沿って何かをしようとしています。

    HPDFTableAttributes oTACent;
    oTACent.rows = 3;   oTACent.cols = 3;
    oTACent.rowH = 20;  oTACent.colW = pageWidth-70/oTACent.cols;
    oTACent.tabH = oTACent.rows * oTACent.rowH;
    oTACent.tabW = oTACent.cols * oTACent.colW;
    oTACent.tabX = 35;  oTACent.tabY = pageHeight - oTACent.tabH - 45;
    oTACent.font = fontTimesBold; oTACent.fontSize = 20;
    oTACent.colRatios = [1, 1, 2];  /// HERE

次に、これらの属性を関数に送信してテーブルを作成し、この整数配列の値の比率を使用して、同じ行に沿って列を空けます。

void CReport::putTableOnPdf(HPDF_Page page, HPDFTableAttributes tabAtt, array_2d<CString> tabDat)
 {
     // Table Outline
     HPDF_Page_SetLineWidth (page, 1);
     HPDF_Page_Rectangle (page, tabAtt.tabX, tabAtt.tabY, tabAtt.tabW, tabAtt.tabH);
     // Table row lines
     HPDF_REAL rowsPut = 0;
     while(rowsPut < tabAtt.rows)
     {
         rowsPut++;
         HPDF_Page_MoveTo (page, tabAtt.tabX, tabAtt.tabY + rowsPut*tabAtt.rowH);
         HPDF_Page_LineTo (page, tabAtt.tabX + tabAtt.tabW, tabAtt.tabY + rowsPut*tabAtt.rowH);
     }
     // Table col lines
     /*int colRatioSum = 0;
     for(int i = 0; i < tabAtt.colRatios.length; i++)
         colRatioSum += tabAtt.colRatios[i];
     tabAtt.colW = tabAtt.colW / colRatioSum;*/ /// HERE
     HPDF_REAL colsPut = 0;
     while(colsPut < tabAtt.cols)
     {
         colsPut++;
         HPDF_Page_MoveTo (page, tabAtt.tabX + colsPut*tabAtt.colW, tabAtt.tabY);
         HPDF_Page_LineTo (page, tabAtt.tabX + colsPut*tabAtt.colW, tabAtt.tabY + tabAtt.tabH);
     }
     HPDF_Page_Stroke (page);
      }
4

2 に答える 2

2

C ++では、配列のサイズはその型の一部です。*配列宣言が初期化子からそのサイズを推測できるようにする特別な規則があるため、必ずしも型を明示的に記述する必要はありません。

特定の状況で不完全な型を記述して使用することもできますが、完全な型を必要とするものは何もできません。

したがって、ここでの問題は、不完全な型を記述し、それを使用して完全な型を必要とする何かを実行していることです(つまり、その型のオブジェクトを宣言します)。初期化子を追加することは、配列のサイズを宣言して型を完成させる1つの方法であり、エラーを回避します。

「最後のフィールドはintのコレクションです」と本当に言いたい場合は、それを表すことができる型を使用する必要があります(ここでも、配列には固定数の要素があります)。C ++では、最も明白な解決策はstd::vector<int>です。を使用std::vectorすると、疑似コードをほぼ正確に記述できます。

oTACent.colRatios = {1, 1, 2};

表示される可能性があるが書き込むべきではない別のオプションは、ポインターを使用することです。C ++は、配列と同様に配列の要素へのポインターを使用できるように定義されています。ポインタ型には配列サイズが含まれていないため、同じポインタ型を任意のサイズの配列で使用できます。

*一部のコンパイラは、拡張として可変長配列メンバーをサポートします。配列のサイズは、構造体の初期化時に決定されますが、これは標準のC ++ではなく、初期化時にサイズを知る必要があります(後でではなく)配列に割り当てる擬似コードのように、割り当て)。「柔軟な配列」と呼ばれる別の拡張機能があり、最後のメンバーをサイズなしで宣言してから、構造体全体に十分なメモリを手動で割り当て、さらに配列のサイズを大きくすることができます。

于 2013-02-07T17:11:55.057 に答える
0

配列のサイズはその型の一部であるため、宣言時に知る必要があります。したがって、次のように変更する必要があります。

int colRatios[3];

また、配列への割り当ては、試みている方法では機能しません。

oTACent.colRatios = [1, 1, 2];

C++にはそのような構文はありません。このような値を簡単に割り当てたい場合は、C++11とstd::vector:を使用できます。

std::vector<int> colRatios;
// ...
oTACent.colRatios = {1, 1, 2};
于 2013-02-07T17:15:21.350 に答える