C++ C++;函数、数组和指针

C++ C++;函数、数组和指针,c++,arrays,function,pointers,C++,Arrays,Function,Pointers,关于这一点已经有很多了,但没有一个解决了我的问题,或者我只是不明白答案。我只是尝试从函数返回一个数组 而且,我必须把我所有的函数放在主函数之上,这对我来说也很奇怪 下面是我尝试使用指针时发生的情况: int * RookMoves(int startingPosition, bool isWhite, int theBoard[64]){ int startingPositionXY[2] = { startingPosition % 8, (startingPosition

关于这一点已经有很多了,但没有一个解决了我的问题,或者我只是不明白答案。我只是尝试从函数返回一个数组

而且,我必须把我所有的函数放在主函数之上,这对我来说也很奇怪

下面是我尝试使用指针时发生的情况:

    int * RookMoves(int startingPosition, bool isWhite, int theBoard[64]){
     int startingPositionXY[2] = { startingPosition % 8, (startingPosition - (startingPosition % 8)) / 8 };
     int possibleRookPositions[14];
     int possiblePosXY[2];
     int counter = 0;
     for (int h = 0; h < 2; h++)
     {
         int counter2 = 1;
         for (int j = 0; j < 2; j++)
         {
             counter2 *= -1;
             for (int i = 1; i < 8; i++)
             {
                 int other = startingPositionXY[h] + (i * counter2);
                 int hInverted = (h + abs(h - 1)) * abs(h - 1); // 0 + 1 * 1 = 1 but 1 + 0 * 0 = 0
                 if (other < 8 && other > -1)
                 {
                     possiblePosXY[h] = other;
                     possiblePosXY[hInverted] = startingPositionXY[hInverted];
                     int movesOneDim = possiblePosXY[0] + (possiblePosXY[1] * 8);
                     if (CalculateSameColor(isWhite, theBoard[movesOneDim])) {
                         possibleRookPositions[counter] = movesOneDim;
                         counter++;
                         if (CalculateEnemy(isWhite, theBoard[movesOneDim])) 
                         {
                             break;
                         }
                     }
                     else
                     {
                         break;
                     }
                 }
                 else
                 {
                     break;
                 }
             }
         }
     }

     for (int i = counter; i < 14; i++) //simply changing any unused elements to -1 for later recognition
     {
         possibleRookPositions[i] = -1;
     }
     cout << sizeof(possibleRookPositions) / sizeof(possibleRookPositions[0]) << ' '; // returns 14 just as it should
     return possibleRookPositions;
 }

int main()
{
    int testBoard[64];
    for (int i = 0; i < 64; i++) {
        testBoard[i] = 0;
    }


    int* arr = RookMoves(21, true, testBoard);

    cout << sizeof(arr) / sizeof(arr[0]); //ouputs: 1, should be 14
}

int*RookMoves(int启动位置,bool为白色,inttheboard[64]){
int startingPositionXY[2]={startingPosition%8,(startingPosition-(startingPosition%8))/8};
int-possibleRookPositions[14];
int-possiblePosXY[2];
int计数器=0;
对于(int h=0;h<2;h++)
{
int计数器2=1;
对于(int j=0;j<2;j++)
{
计数器2*=-1;
对于(int i=1;i<8;i++)
{
int other=启动位置XY[h]+(i*2);
int hInverted=(h+abs(h-1))*abs(h-1);//0+1*1=1,但1+0*0=0
如果(其他<8和其他>-1)
{
可能的eposxy[h]=其他;
可能位置xy[hInverted]=起始位置xy[hInverted];
int movesOneDim=possiblePosXY[0]+(possiblePosXY[1]*8);
如果(计算平均颜色(为白色,则电路板[movesOneDim])){
possibleRookPositions[计数器]=movesOneDim;
计数器++;
如果(CalculateEnemy(为白色,则电路板[movesOneDim]))
{
打破
}
}
其他的
{
打破
}
}
其他的
{
打破
}
}
}
}
for(int i=counter;i<14;i++)//只需将任何未使用的元素更改为-1,以便以后识别
{
可能的RookPositions[i]=-1;
}

CUT< P>我试图从指针中获取siZeof,因为我还不真正理解这些工作是怎么做的,但我所需要做的只是使用指针,而只是初始化我返回的数组,如“static”。这要感谢MikeCAT

< P> C++中的一个数组,在“简单”中。代码,要么是STD::vector或STD::Advices。这些可以毫无问题地返回。我想说的是,你的问题是你主要写C,并调用C++。C是很难为初学者准备的。所以,请使用C++,你可以使用。
<> > C样式数组是任何专业C++程序员当然都完全理解的,但是每当我被迫编写这样的代码(由于客户需求的多少)因此,不要太担心,即使是那些能够编写编译器的人,可以使用这个数组代码并产生程序集输出,但在某种程度上仍然有问题。它笨重,而且在今天的C++中几乎没有地方。到底是什么网站说指针应该工作?你应该改用
std::vector
。划分sizeofs只对数组有效,而不是指针。1是正确的,因为你只有一个指针。另外,返回指向非静态局部变量的指针也不好,因为它们在从函数返回时将变得无效(从其作用域中退出)。@MarkRansom除法的结果不必是指针的数目。例如,如果
sizeof(int*)
为8,
sizeof(int)
为4(在64位环境中是合理的配置),您将得到2。将数组声明为
静态
可能使它现在可以工作,但这是一个非常脆弱的解决方案,可能会给您带来问题。@Mark Ransom还有什么选择?谢谢。返回
std::vector
。谢谢,这让我感觉更好,哈哈,说我在哪里做了什么速度非常重要,使用这个向量库不是更慢吗?我不明白,我是在写C还是怎么写C我应该比C++更快吗?@ TristaLaLeNAND:<代码> vector < /C>比使用一个正确大小的数组可能要慢。但是,f你已经知道正确的大小N,<代码> STD::数组< /C> >如果不是比阿纳尔数组快的话,那么快(“更快”)。部分原因是深层次的技术原因;编译器可以更容易地证明两个
std::array
s不重叠)