错误:无法将参数'1'的'int (*)[3]'转换为'int (*)[100]',改为'void repl(int (*)[100], int, int)'。

问题描述 投票:2回答:4

你好,我试图写这个程序,它取代每个负数与-1和正数与1,但一个错误。

[错误]不能转换'int ()[3]'改为'int ()[100]'的参数'1'改为'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;
}
c++ 2d
4个回答
4
投票

你声明了函数 void replace(int Arr[][100],int rsize, int csize) - 它希望是2D数组,"内 "维是100.然后你传递给它的是 int a[4][3] 其中 "内 "维度为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]

更好的解决方案:你把这个问题标记为C++--使用C++库:) - std::vector<std::vector<int> >std::array (C++11)


2
投票

你声明一个函数,它将 int[][100],然后你通过它一个 int[4][3]. C++不是这样工作的。事实上,你根本不能按值传递数组,它们会隐式地衰减为指针。

如果你想让你的函数取任意大小的数组,你可以让它取指针代替指针。

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

那么你应该扔掉你的代码,使用 std::vector 来代替。

void replace(std::vector<std::vector<int>> &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");
}

0
投票

问题是你声明你的参数 (Arr[][100]) 有100个元素. 但在你的代码中,它不是100个元素,而是三个。 我假设你真正想要的是能够传递不同大小的数组,并在其他参数中指定数组的尺寸。 如果是这样的话,你可以直接将数组声明为一个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;
    }
}

不要按照我的例子使用不安全的字符串函数。

这样做的原因是,一个二维的int数组只是一堆一维数组堆叠在一起。 所以一个int[4][3]在内存中只是12个int。 这和int[12]在功能上是一样的。 如果你把函数的输入声明为int *,那么它就是一个指向内存块的指针,这个内存块包含int,不管有多少。 所以你可以避免你所得到的类型转换错误。

如果你不确保你的参数是正确的,这样做有很多风险。 例如,如果你用相同的输入数组调用相同的replace函数,但声称它有5行,那么你将开始读取未初始化的内存。(可能是未初始化......更准确地说,你至少会读取不是你认为的内存。) 当然,你可以不用指针做同样的事情,这就是C++的乐趣所在。

© www.soinside.com 2019 - 2024. All rights reserved.