C++ 错误:无法转换';国际(*)[3]';至';国际(*)[100]';对于参数';1';至';无效回复(int(*)[100],int,int)和#x27;

C++ 错误:无法转换';国际(*)[3]';至';国际(*)[100]';对于参数';1';至';无效回复(int(*)[100],int,int)和#x27;,c++,2d,C++,2d,你好,我正在写这个程序,它用-1替换每个负数,用1替换每个正数 但有一个错误: [错误]无法将参数“1”的“int()[3]”转换为“int()[100]”转换为“void replace(int(*)[100],int,int)” 这是什么意思 #include<iostream> using namespace std; void replace(int Arr[][100],int rsize, int csize) { for(int r=0;r<rsize;r++

你好,我正在写这个程序,它用-1替换每个负数,用1替换每个正数 但有一个错误:

[错误]无法将参数“1”的“int()[3]”转换为“int()[100]”转换为“void replace(int(*)[100],int,int)”

这是什么意思

#include<iostream>
using namespace std;
void replace(int Arr[][100],int rsize, int csize)
{
  for(int r=0;r<rsize;r++)
  {
    for (int c=0;c<csize;c++)
    {
      if (Arr[r][c]>0) Arr[r][c]=1;
      else if (Arr[r][c]<0) Arr[r][c]=-1;
      else Arr[r][c]=0;
    }
  }

}

int main()
{
    int a[4][3]={
    {2,0,-5},
    {-8,-9,0},
    {0,5,-6},
    {1,2,3}};

    replace(a,4,3);

    for(int i=0;i<4;i++)
      for (int j=0;j<3;j++)
        cout<<a[i][j]<<" ";}cout<<endl;

    system ("pause");
    return 0;
}
#包括
使用名称空间std;
无效替换(int Arr[][100],int rsize,int csize)
{

对于(int r=0;r您声明的函数
void replace(int Arr[][100],int rsize,int csize)
-它需要2D数组,“内部”维度为100。 然后,将具有“内部”维度3的int a[4][3]
传递给它。编译器无法转换它。当使用
Arr[x][y]
时,这些维度用于计算内存位置偏移(相当于
*(Arr+x*100+y)
。这就是为什么编译器无法将带3的数组分配给带100的数组

如果希望
replace
使用任何维度,请将其更改为:
void replace(int*Arr,int rsize,int csize)
。然后使用
*(Arr+r*csize+c)
访问字段,而不是
Arr[r][c]


<> P> >更好的解决方案:你把这个问题标记为C++使用C++库:)->代码> STD::矢量< /C> >或代码> STD::数组< /C>(C++ 11)< /P> < p>你声明一个函数,它使用<代码> int [] [100 ] < /代码>,然后你通过它<代码> int [4 ] [3 ]。 > C++不这样工作。实际上,实际上不能通过值传递数组;它们隐式地指向指针。

如果您想让函数接受任意大小的数组,可以让它接受指向指针的指针:

void replace(int** Arr,int rsize, int csize)
然后你应该扔掉你的代码,改用
std::vector

void replace(std::vector<std::vector<int>> &Arr)
void替换(标准::向量和Arr)
如果需要对数组大小进行编译时限制,可以执行以下操作:

template <std::size_t X, std::size_t Y>
void replace (std::array<std::array<int,Y>,X>& Arr)
{
    static_assert (Y <= 100, "Inner array is too large");
}
模板
无效替换(标准::阵列和阵列)
{

静态断言(Y问题是您正在声明您的参数(Arr[][100])有100个元素。但不是100个元素,而是代码中的3个元素。我假设您真正想要的是能够传递不同大小的数组,并在其他参数中指定数组维度。如果是这种情况,您可以将数组声明为int*。因此,类似于以下的操作将起作用:

#include "stdafx.h"
#include<iostream>
using namespace std;


void replace(int *Arr, int rsize, int csize);
void print(int *Arr, int rsize, int csize);

int _tmain(int argc, _TCHAR* argv[])
{
    int a[4][3] = {
        { 2, 0, -5 },
        { -8, -9, 0 },
        { 0, 5, -6 },
        { 1, 2, 3 } };

    print((int *)a, 4, 3);


    replace((int *)a, 4, 3);
    for (int i = 0; i<4; i++)
    {
        for (int j = 0; j<3; j++)
        {
            cout << a[i][j] << " ";
        }cout << endl;
    }


    system("pause");
    return 0;
}


void replace(int *Arr, int rsize, int csize)
{
    for (int r = 0; r<rsize; r++)
    {
        for (int c = 0; c<csize; c++)
        {
            int index = (r * (rsize - 1)) + c;
            if (Arr[index] > 0)
            {
                Arr[index] = 1;
            }
            else if (Arr[index] < 0)
            {
                Arr[index] = -1;
            }
            else
            {
                Arr[index] = 0;
            }
        }
    }
}

void print(int *Arr, int rsize, int csize)
{
    char str[256];

    for (int r = 0; r<rsize; r++)
    {
        sprintf(str, "");
        for (int c = 0; c<csize; c++)
        {
            int index = (r * (rsize - 1)) + c;
            if (strlen(str) > 0)
            {
                sprintf(str, "%s, ", str);
            }
            sprintf(str, "%s%d", str, Arr[index]);
        }

        cout << str;
        cout << endl;
    }
}
#包括“stdafx.h”
#包括
使用名称空间std;
无效替换(int*Arr、int rsize、int csize);
无效打印(int*Arr、int-rsize、int-csize);
int _tmain(int argc,_TCHAR*argv[]
{
INTA[4][3]={
{ 2, 0, -5 },
{ -8, -9, 0 },
{ 0, 5, -6 },
{ 1, 2, 3 } };
打印((int*)a、4、3);
替换((int*)a、4、3);

对于(int i=0;您要传递的数组有3列,传递给它的函数定义了100列
int Arr[][100]
的类型不同于
int a[4][3]
。这意味着,参数
1
(换句话说,第一个)传递给函数'void replace(int(*)[100],int,int)'无法转换为正确的类型。我将3替换为100,它确实有效:)谢谢..但是100是冒号的最大大小,我如何设置最大大小?您是否故意这样设置格式?哎呀!