为啥在尝试定义函数体时会出现此编译器错误?

     2023-04-13     261

关键词:

【中文标题】为啥在尝试定义函数体时会出现此编译器错误?【英文标题】:Why do I get this compiler error trying to define a function body?为什么在尝试定义函数体时会出现此编译器错误? 【发布时间】:2015-06-07 10:31:54 【问题描述】:
//Prints a box of X's with user unput of width and height. Uses a User-defined function

#include <iostream>
#include <cmath>

using namespace std;
void box(int height, int width, int h = 1, int w = 1);



int main() 
    int width, height;

    cout << "Please enter width (0-25): \n";
    cin >> width;

    while (!(cin >> width) || width < 0 || width > 25) 
        cout << "Invalid entry. Please re-enter width: \n";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    cout << "Please enter height (0-25): \n";
    cin >> height;

    while (!(cin >> height) || height < 0 || height > 25) 
        cout << "Invalid entry. Please re-enter height: \n";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    cin.ignore(numeric_limits<streamsize>::max(), '\n');



void box(int height, int width, int h, int w)


    for (int h = 1; h <= height; h++)
    
        for (int w = 1; w <= width; w++)
        cout << "X";
        cout << endl;
    

我已经进行了建议的编辑,程序编译没有错误,但它不打印该框。我知道我需要在main中定义函数,但是当我写的时候:

框(宽、高);

它显示一个错误。另外,当我在命令提示符窗口中时,输出如下:

请输入宽度 (0-25): 12

12 请输入身高(0-25): 12

z 输入无效。请重新输入身高: 12 按任意键继续...

【问题讨论】:

不应该有分号:...int w)... 而不是...int w);..。此外,我想知道,为什么你有 2 个额外的函数声明(一个在最顶部,另一个在定义上方)。只需将函数(仅一次)放在 main 上方即可。 在函数体开始之前有一个多余的分号。 您的输入循环有问题。 cin.clear()cin.ignore 用于流失败时(例如,他们输入字母)。但是,您永远不会测试流是否失败,因此在这种情况下,您会通过读取未初始化的变量来导致 UB。循环应该是while ( !(cin &gt;&gt; width) || width &lt; 0 || width &gt; 25 ),或者预先将width初始化为一个超出范围的值。 for (int h = 1; h &lt;= int height; h++); 应该是 for (int h = 1; h &lt;= height; h++)w 循环的相同更改 已编辑,但仍有问题 【参考方案1】:

这一行

void box(int height, int width, int h, int w);

“declare”是一个名为 box 的函数,它接受四个参数,然后行尾的分号结束当前语句。

因此,当您尝试定义框时,您需要省略尾随分号

void box(int height, int width, int h, int w)

   ...

【讨论】:

【参考方案2】:

问题出在这里:

void box(int height, int width, int h, int w) // there shouldn't be a semicolon

    int height, int width, int h, int w;

    for (h = 1; h <= height; h++);
    
        for (w = 1; w <= width; w++);
        cout << "X";
        cout << endl;
    

【讨论】:

已编辑,但仍面临问题 您面临什么问题? 当我尝试在 main 中调用函数时,它说定义的参数数量有问题【参考方案3】:

抓住!:)

#include <iostream>
#include <iomanip>

void box( size_t height, size_t width, char c = 'X' )

    while ( height-- )
    
        std::cout << std::setfill( c ) << std::setw( width ) << c << std::endl;
    
   

int main() 

    while ( true )
    
        const size_t N = 25;

        std::cout << "Please enter height and width "
                     "less than or equal to " << N << " (0-exit): ";

        size_t width = 0, height = 0;
        std::cin >> height >> width;

        if ( height == 0 || width == 0 ) break;

        if ( N < height ) height = N;
        if ( N < width ) width = N;

        std::cout << std::endl;

        box( height, width );

        std::cout << std::endl;
    
 

如果要输入例如

10 16

那么程序输出将是

Please enter height and width less than or equal to 25 (0-exit): 10 16

XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX

Please enter height and width less than or equal to 25 (0-exit): 

至于你的代码,那么函数定义中至少有一个错字

void box(int height, int width, int h, int w);
                                             ^^

而且在函数体中重新声明参数是没有意义的

void box(int height, int width, int h, int w);

    int height, int width, int h, int w;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

同样在循环中你必须删除类型说明符和分号

for (int h = 1; h <= int height; h++);
     ^^^^            ^^^^            ^^

而且功能太复杂了。:)

编辑:至于您更新的代码,然后删除以下语句

cout << "Please enter width (0-25): \n";
cin >> width; // <== remove

cout << "Please enter height (0-25): \n";
cin >> height; // <== remove

并在函数中重写循环,如

for ( ; h <= height; h++)

    for ( int w1 = w ; w1 <= width; w1++)
    cout << "X";
    cout << endl;

另外你忘了在 main 中调用函数本身。:)

【讨论】:

天哪,你写的代码真快。请告诉我你已经编写 C++ 代码很长时间了,我只是这么慢,因为我是新手 :) @user4983123 我没有写过 C++ 程序,因为我失业了。:) 在上一份工作中,我为 IBM 大型机编写了 C 和 PL/X 程序。 已编辑,但仍面临问题。我知道我的版本更令人困惑,但我不想完全更改代码。你能再看一眼吗? @user4983123 还要注意函数的内循环是怎么写的。 如何调用main中的函数?我写了 while (!(cin >> height) || height 25) cout ::max(), '\n'); cin.ignore(numeric_limits::max(), '\n');盒子(高度,宽度);

为啥在此代码中调用虚拟方法时会出现分段错误?

】为啥在此代码中调用虚拟方法时会出现分段错误?【英文标题】:WhydoIgetasegmentationfaultwhencallingavirtualmethodinthiscode?为什么在此代码中调用虚拟方法时会出现分段错误?【发布时间】:2009-04-0216:52:54【问题描述】:我还在学习C++... 查看详情

为啥使用 SingleAsync 时会出现此错误?

】为啥使用SingleAsync时会出现此错误?【英文标题】:WhydoesthiserroroccurwhenusingSingleAsync?为什么使用SingleAsync时会出现此错误?【发布时间】:2019-11-0312:19:36【问题描述】:查找项目是否重复。预期:仅在找到多个项目时才抛出异... 查看详情

为啥存储此向量时会出现分段错误?

】为啥存储此向量时会出现分段错误?【英文标题】:whyisthereaSegmentationFaultwiththestoringofthisvector?为什么存储此向量时会出现分段错误?【发布时间】:2013-11-0602:30:34【问题描述】:我在看似不错的代码中有分段错误。我知道故... 查看详情

为啥 MySQL 在创建触发器时会出现此错误?

】为啥MySQL在创建触发器时会出现此错误?【英文标题】:WhyMySQLisgivingthiserrorwhilecreatingtrigger?为什么MySQL在创建触发器时会出现此错误?【发布时间】:2012-11-1922:08:05【问题描述】:我已创建此触发器用于自动生成SDA0001、SDA0002... 查看详情

为啥从命令行编译而不是从 IDE 编译时会出现歧义错误?

】为啥从命令行编译而不是从IDE编译时会出现歧义错误?【英文标题】:WhydoIgetanamibguityerrorwhenIcompilefromthecommandline,butnotfromtheIDE?为什么从命令行编译而不是从IDE编译时会出现歧义错误?【发布时间】:2009-02-2421:55:13【问题描述... 查看详情

为啥在使用 Python/C API 时会出现此段错误?

】为啥在使用Python/CAPI时会出现此段错误?【英文标题】:WhyamIgettingthissegfaultwhenusingthePython/CAPI?为什么在使用Python/CAPI时会出现此段错误?【发布时间】:2016-01-2516:57:05【问题描述】:使用Python/CAPI在我的C++代码中对PyObject*进行... 查看详情

为啥在我创建新项目时会在 android studio 中出现此错误?

】为啥在我创建新项目时会在androidstudio中出现此错误?【英文标题】:whythiserrorsinandroidstudiooccurredwhenicreatenewproject?为什么在我创建新项目时会在androidstudio中出现此错误?【发布时间】:2016-12-1006:31:10【问题描述】:IDE致命错误... 查看详情

为啥我在尝试注册时收到此错误消息? [复制]

】为啥我在尝试注册时收到此错误消息?[复制]【英文标题】:WhydoIgetthisERRORmessagewhenItrytosignup?[duplicate]为什么我在尝试注册时收到此错误消息?[复制]【发布时间】:2016-07-1219:30:35【问题描述】:为什么会出现这个错误?调用未... 查看详情

为啥这个程序在调用函数时会出现分段错误?

】为啥这个程序在调用函数时会出现分段错误?【英文标题】:WhythisprogramgivesaSegmentationFaultwhilecallingafunction?为什么这个程序在调用函数时会出现分段错误?【发布时间】:2013-08-2021:13:41【问题描述】:这是我的程序的一部分,... 查看详情

为啥在我尝试构建此 mxml 文件时会发生此非描述性错误?

】为啥在我尝试构建此mxml文件时会发生此非描述性错误?【英文标题】:Whydoesthisnon-descriptiveerrorhappenwhenItrytobuildthismxmlfile?为什么在我尝试构建此mxml文件时会发生此非描述性错误?【发布时间】:2014-09-1822:14:02【问题描述】:... 查看详情

为啥在尝试访问 HTML 表中的前两列时会出现错误?

】为啥在尝试访问HTML表中的前两列时会出现错误?【英文标题】:WhydoIgetanerrorwhentryingtoaccessthefirsttwocolumnsinanHTMLtable?为什么在尝试访问HTML表中的前两列时会出现错误?【发布时间】:2022-01-2221:48:09【问题描述】:importrequestsfromb... 查看详情

为啥IE在设置innerHTML时会出现意外错误

】为啥IE在设置innerHTML时会出现意外错误【英文标题】:WhydoesIEgiveunexpectederrorswhensettinginnerHTML为什么IE在设置innerHTML时会出现意外错误【发布时间】:2010-09-1409:38:00【问题描述】:我尝试在firefox中的一个元素上设置innerHTML,它运... 查看详情

为啥在使用 OpenGL 编译顶点着色器时会出现着色器编译器错误 #143、#160 和 #216?

】为啥在使用OpenGL编译顶点着色器时会出现着色器编译器错误#143、#160和#216?【英文标题】:WhyamIgettingaShaderCompilerError#143,#160and#216whencomilingavertexShaderusingOpenGL?为什么在使用OpenGL编译顶点着色器时会出现着色器编译器错误#143、#16... 查看详情

为啥我使用 react-native juspay 开始付款时会出现此错误?

】为啥我使用react-nativejuspay开始付款时会出现此错误?【英文标题】:WhydoIgetthiserrorwhenIstartapaymentusingreact-nativejuspay?为什么我使用react-nativejuspay开始付款时会出现此错误?【发布时间】:2020-05-0817:48:33【问题描述】:我正在这段... 查看详情

为啥我在尝试获取我过去的贝宝交易时会收到此错误?

】为啥我在尝试获取我过去的贝宝交易时会收到此错误?【英文标题】:WhydoIgetthiserrorwhentryingtogetmypastpaypaltransactions?为什么我在尝试获取我过去的贝宝交易时会收到此错误?【发布时间】:2020-10-1420:14:19【问题描述】:我正在... 查看详情

为啥我在尝试运行我的 Twitter 天气机器人时会收到此错误

】为啥我在尝试运行我的Twitter天气机器人时会收到此错误【英文标题】:WhydoigetthiserrorwhentryingtorunmyTwitterweatherbot为什么我在尝试运行我的Twitter天气机器人时会收到此错误【发布时间】:2021-07-1800:31:33【问题描述】:defreply_to_twe... 查看详情

函数创建时编译错误成功,为啥?

】函数创建时编译错误成功,为啥?【英文标题】:successwithcompilationerroronFunctioncreation,why?函数创建时编译错误成功,为什么?【发布时间】:2016-12-0711:46:31【问题描述】:我尝试在OracleApex5,SQL命令中创建此函数,并导致此错... 查看详情

为啥在控制台应用程序中使用 CommonOpenFileDialog 时会出现此异常?

】为啥在控制台应用程序中使用CommonOpenFileDialog时会出现此异常?【英文标题】:WhyamIgettingthisexceptionwhenusingCommonOpenFileDialoginaConsoleApplication?为什么在控制台应用程序中使用CommonOpenFileDialog时会出现此异常?【发布时间】:2019-11-1... 查看详情