C++ C++;代码断断续续,为了我的爱,我可以';我修不好

C++ C++;代码断断续续,为了我的爱,我可以';我修不好,c++,compiler-errors,line-breaks,C++,Compiler Errors,Line Breaks,基本上,我的代码应该从用户那里获取关于马拉松赛跑者的信息,然后显示3个最佳时间,并且能够搜索和显示任何跑步者。现在,代码仍然是非常简单的,但是它至少应该接受输入,以升序排列信息(赢家功能),并且当我决定编译代码进行测试时,我正处于显示函数的中间,然后它全部下山。 基本上,当我必须输入第一个跑步者的名字时,代码分成以下几行: static void __CLRCALL_OR_CDECL assign(_Elem& _Left, const _Elem& _Right) _NOEXC

基本上,我的代码应该从用户那里获取关于马拉松赛跑者的信息,然后显示3个最佳时间,并且能够搜索和显示任何跑步者。现在,代码仍然是非常简单的,但是它至少应该接受输入,以升序排列信息(赢家功能),并且当我决定编译代码进行测试时,我正处于显示函数的中间,然后它全部下山。 基本上,当我必须输入第一个跑步者的名字时,代码分成以下几行:

static void __CLRCALL_OR_CDECL assign(_Elem& _Left, const _Elem& _Right) _NOEXCEPT
{   // assign an element
    _Left = _Right;
}
首先,我不知道这意味着什么,也不知道为什么left=right,其次,一个朋友在他的机器上运行了我的代码,告诉我他没有遇到错误

这是我的密码:

#include <iomanip>
#include <iostream>
#include <math.h>
#include <string>

using namespace std;

#pragma once
#include <string>
using namespace std;
class race
{
private:

public:
    int timeH, timeM, timeS, timeT;
    int number;
    string name;

    void input();
};

int size;
race *runner = new race[size];
void input();
void winners();
void display();
int main(){


    input();
    winners();
    display();

    system("pause");
}
void input(){

    cout << "Indique la cantidad de corredores: ";
    cin >> size;

    for (int i = 0; i < size; i++){
        cout << "Nombre del corredor ";
        cin >> runner[i].name;
        cout << "Numero del corredor # "<<i;
        cin >> runner[i].number;
        cout << "Tiempo del corredor # " << i << endl << "Indique cuantas horas tardo :";
        cin >> runner[i].timeH;
        runner[i].timeH = runner[i].timeH * 3600;
        cout << "Cuantos minutos: ";
        cin >> runner[i].timeM;
        runner[i].timeM = runner[i].timeM * 60;
        cout << "Cuantos segundos: ";
        cin >> runner[i].timeS;

        runner[i].timeT = runner[i].timeH + runner[i].timeM + runner[i].timeS;
    }

}
void winners(){

    race temp;
    int flag = 1;
    for (int j = 1; (j <= size) && flag; j++){

        flag = 0;
        for (int i = 0; i < size-1; i++){

            if (runner[i + 1].timeT < runner[i].timeT)
            {
                temp = runner[i];
                runner[i] = runner[i + 1];
                runner[i + 1] = temp;


                flag = 1;
            }
        }
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
#布拉格语一次
#包括
使用名称空间std;
阶级竞赛
{
私人:
公众:
int timeH,timeM,timeS,timeT;
整数;
字符串名;
无效输入();
};
整数大小;
比赛*跑步者=新比赛[尺码];
无效输入();
无效赢家();
void display();
int main(){
输入();
优胜者();
显示();
系统(“暂停”);
}
无效输入(){
大小;
对于(int i=0;irunner[i]。名称;
问题是:

int size;
race *runner = new race[size];
未初始化的全局变量是零初始化的,因此
size
将被初始化为零,因此您正在分配一个零大小的数组,这意味着对该数组的任何访问都将是越界的,并导致错误

有两种解决方法:

  • 等待分配,直到您知道大小。(不是我推荐的解决方案。)

  • 使用动态大小的“数组”类型(我推荐的解决方案)

  • 问题是:

    int size;
    race *runner = new race[size];
    
    未初始化的全局变量是零初始化的,因此
    size
    将被初始化为零,因此您正在分配一个零大小的数组,这意味着对该数组的任何访问都将是越界的,并导致错误

    有两种解决方法:

  • 等待分配,直到您知道大小。(不是我推荐的解决方案。)

  • 使用动态大小的“数组”类型(我推荐的解决方案)

  • 这是一个问题。您正在分配内存,但尚未设置
    size
    (该分配在调用
    main()
    之前运行)。这意味着您正在进行
    newrace[0]
    (因为
    size
    初始化为零,因为它是全局
    int
    ).Ergo,程序的其余部分正在调用未定义的行为,因为
    runner
    是一个空数组,您正试图(非法)访问它

    您也在泄漏内存,因为您从未
    删除[]
    使用
    new[]
    分配的内存。我建议使用
    std::vector

    这是一个问题。您正在分配内存,但尚未设置
    size
    (该分配在调用
    main()
    之前运行)。这意味着您正在进行
    newrace[0]
    (因为
    size
    初始化为零,因为它是全局
    int
    ).Ergo,程序的其余部分正在调用未定义的行为,因为
    runner
    是一个空数组,您正试图(非法)访问它


    您也在泄漏内存,因为您从未
    删除[]
    使用
    new[]
    分配的内存。我建议使用
    std::vector

    ,并在代码中的何处“中断”?问题很可能不在库代码中,而是在您的代码中,因此请按照调用堆栈查找您的代码,并告诉我们该代码在何处(请编辑您的问题以执行此操作)。
    cin>>size;
    您不认为获取大小有点太晚了吗?您已经为您的
    race
    数组分配了0个元素。在您的代码中,“中断”在哪里?问题很可能不在库代码中,而是在您的代码中,因此请按照调用堆栈查找您的代码,并告诉我们问题所在(请编辑您的问题以执行此操作).
    cin>>大小;
    你不觉得你来不及获得大小吗?你已经为你的
    race
    数组分配了0个元素。谢谢你的快速回复,但是数组必须由用户控制,我被告知这是唯一的方法。还有其他方法吗?@John是的,使用
    std::vector
    ,然后你可以n根据需要添加条目。感谢您的快速回复,但数组必须由用户控制,我被告知这是唯一的方法。还有其他方法吗?@John Yes,使用
    std::vector
    ,然后您可以根据需要添加条目。