【问题标题】:Holding an Integer array in a struct. Cannot defne struct properly在结构中保存一个整数数组。无法正确定义结构
【发布时间】:2013-02-07 17:06:28
【问题描述】:

我想在我的结构中保存一个整数数组

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);
      }

【问题讨论】:

  • [1, 1, 2] 不是 C++ 语法

标签: c++ arrays libharu


【解决方案1】:

在 C++ 中,数组的大小是其类型的一部分。* 有一条特殊规则允许数组声明从初始值设定项推导出其大小,因此您不必总是显式地编写类型。

您也可以在某些情况下编写和使用 不完整 类型,但您不能对它们进行任何需要完整类型的操作。

所以这里的问题是你正在编写一个不完整的类型并使用它做一些需要完整类型的事情(即声明该类型的对象)。添加初始化器是声明数组大小从而完成类型的一种方法,从而避免了错误。

如果您真正想说的是“最后一个字段是整数的集合”,那么您需要使用可以表示它的类型(同样,数组具有固定数量的元素)。在 C++ 中,最明显的解决方案是 std::vector&lt;int&gt;。使用std::vector,您几乎可以准确地编写伪代码:

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

另一个你可能会看到但不应该写的选项是使用指针。 C++ 的定义使得您可以像使用数组一样使用指向数组元素的指针。由于指针类型不包括数组大小,因此相同的指针类型可以用于任何大小的数组。

* 一些编译器支持可变长度数组成员作为扩展,其中数组的大小在初始化结构时确定,但这不是标准 C++,它仍然需要在初始化时知道​​大小(而不是来自以后的分配,例如在您分配给数组的伪代码中)。还有另一个扩展名为“灵活数组”,其中最后一个成员可以在没有大小的情况下声明,然后您手动为整个结构分配足够的内存,再加上您希望数组的大小。

【讨论】:

    【解决方案2】:

    数组的大小必须在声明时知道,因为它是它的类型的一部分。所以你应该把它改成这样:

    int colRatios[3];
    

    此外,分配给数组的方式与您尝试的方式不同:

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

    C++ 中没有这样的语法。如果您想轻松分配这样的值,可以使用 C++11 和 std::vector:

    std::vector<int> colRatios;
    // ...
    oTACent.colRatios = {1, 1, 2};
    

    【讨论】:

      猜你喜欢
      • 2021-03-04
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多