C++ 传递二维字符数组

c++ pass 2-dimensional char array

本文关键字:二维 字符 数组 C++      更新时间:2023-10-16

我正在研究CSES问题集,以便在C++上练习。我正在使用RTools的g++编译器(g++(由Jeroen为R项目构建(8.3.0(和Visual Studio Code在Windows 10 Pro 64位上工作。 我正在使用以下内容编译我已完成的所有程序:

g++ -std=c++17 -Wall .filename.cpp -o .filename.exe  

我已经使用 DFS 解决了这个问题,但是当我看到另一个用户的解决方案时,我意识到我的解决方案结合了 (1( DFS 和 (2( 找到有效的边缘,所以我试图实现一个将 (1( 和 (2( 分开的解决方案。 我相信我的问题集中在忘记如何将 2-d char 数组传递给函数上。 在下面的代码中,我使用了发生这些错误的"^"符号包含了我从VSCode IntelliSense收到的错误(总共3个错误(。 我已经通过将错误行分成两 (2( 行来格式化每个错误的智能感知。 此外,我重新格式化了我的代码以适应 80 列的宽度(为了清楚起见,请在此处发布(:

// 
// CSES Problem Set 
// Projects 
// 
// From: 
//       https://cses.fi/problemset/task/1192 
// 
// Example: 
// Input: 
//          5 8 
//          ######## 
//          #..#...# 
//          ####.#.# 
//          #..#...# 
//          ######## 
// 
// Output: 
//          3 
// 
#include <iostream>

using namespace std; 

bool valid_edge( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map ) { 
return ( y >= 0 && y < MAX_ROWS && 
x >= 0 && x < MAX_COLS && bld_map[ y ][ x ] == '.' ); 
^
expression must have 
pointer-to-object type 
} // bool valid 

void dfs( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map ) { 
bld_map[ y ][ x ] = '#'; 
^
expression must have 
pointer-to-object type 
if( valid_edge( y - 1, x, MAX_ROWS, MAX_COLS, bld_map ) ) { 
dfs( y - 1, x, MAX_ROWS, MAX_COLS, bld_map ); 
} // if 
if( valid_edge( y + 1, x, MAX_ROWS, MAX_COLS, bld_map ) ) { 
dfs( y + 1, x, MAX_ROWS, MAX_COLS, bld_map ); 
} // if 
if( valid_edge( y, x - 1, MAX_ROWS, MAX_COLS, bld_map ) ) { 
dfs( y, x - 1, MAX_ROWS, MAX_COLS, bld_map ); 
} // if 
if( valid_edge( y, x + 1, MAX_ROWS, MAX_COLS, bld_map ) ) { 
dfs( y, x + 1, MAX_ROWS, MAX_COLS, bld_map ); 
} // if 

} // void dfs 

int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int bld_rows; // rows 
int bld_cols; // columns 

cin >> bld_rows >> bld_cols; 

char bld_map[ 1000 ][ 1000 ]; 

for( int i = 0; i < bld_rows; i++ ) { 
for( int j = 0; j < bld_cols; j++ ) { 
cin >> bld_map[ i ][ j ]; 
} // for 
} // for 

int room_count = 0; 

for( int y = 0; y < bld_rows; y++ ) { 
for( int x = 0; x < bld_cols; x++ ) { 
if( valid_edge( y, x ) ) { 
dfs( y, x, bld_rows, bld_cols, bld_map ); 
^ 
arg of type "char (*)[1000]" 
is incompatible w/ parameter 
of type "char"
room_count++; 
} // if 
} // for 
} // for 

cout << room_count; 

return 0; 

} // int main 

我看过其他 StackOverflow 问答,但没有一个答案澄清将 2-d char 数组正确传递给函数的过程。 有谁知道如何纠正我的代码? 如果有人想看到我使用C++ STL的(不同的(工作版本,我在CodePile上有一个副本:

https://www.codepile.net/pile/1EPZQMze

尽管在if( valid_edge( y, x ) )中存在错误,但罪魁祸首是用于将 2D 数组传递给函数的语法。在void dfs( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map )bool valid_edge( int y, int x, int MAX_ROWS, int MAX_COLS, char bld_map )中,您正在将一个名为bld_mapchar传递给函数,然后执行bld_map[ y ][ x ]。你不能对字符这样做。

您可以将参数更改为char bld_map[][1000](或任何数组的大小(,或者只使用内置的 std::array,这比在 C++ 中使用 C 样式数组更可取。