gpt4 book ai didi

c++ - C++中的指针内存分配

转载 作者:行者123 更新时间:2023-11-28 08:08:53 26 4
gpt4 key购买 nike

#include <iostream>
#include <cmath>
#include <limits.h>
#include <stdlib.h>

using namespace std ;

long long NumberHouses = 0 ;
long long ClosestHouse[2] = {0,0} ;
long long TravelTimes = 0 ;

void GetHouses(long long NumH, long long House_X[], long long House_Y[])
{
for (long long a = 0 ; a < NumH ; a++)
{
cin >> House_X[a] ;
cin >> House_Y[a] ;
}
}

void SortArray(long long NumH, long long SortedArray[], long long HouseArray[])
{
long long InsertPoint = 0 ;

for (int a = 0 ; a < NumH ; a++)
{
SortedArray[a] = LONG_MAX ;
}

for (int a = 0 ; a < NumH ; a++)
{
for (int b = 0 ; b < NumH ; b++)
{
if (HouseArray[a] < SortedArray[b])
{
InsertPoint = b ;

for (int c = NumH ; c > b ; c--)
{
SortedArray[c] = SortedArray[c-1] ;
}

SortedArray[InsertPoint] = HouseArray[a] ;
b = NumH ;
}
}
}
}

void FindMedians(long long NumH, int NumMeds, long long SortedArray[], long long MediansArray[])
{
int MedianNum = 0 ;

long long *Sorted_X = new long long [NumH] ;
long long *Sorted_Y = new long long [NumH] ;

MedianNum = NumH / 2 ;

if (NumMeds == 1)
{
MediansArray[0] = SortedArray[MedianNum] ;
}
else
{
MediansArray[0] = SortedArray[MedianNum] ;
MediansArray[1] = SortedArray[MedianNum + 1] ;
}
}

void FindMidHouse(long long NumH, int NumMeds, long long Cords_X[], long long Cords_Y[], long long Meds_X[], long long Meds_Y[])
{
long long *CloseHouses = new long long [NumH] ;

long long NumPoints = 0 ;
long long LowestMoves = LONG_MAX ;

for (int a = 0 ; a < NumH ; a++)
{
if (abs(Cords_X[a] - Meds_X[0]) > abs(Cords_X[a] - Cords_Y[0]))
{
if (abs(Cords_X[a] - Meds_X[0] <= LowestMoves))
{
LowestMoves = abs(Cords_X[a] - Meds_X[0]) ;
CloseHouses[a] = a ;
NumPoints++ ;
}
}
else
{
if (abs(Cords_Y[a] - Meds_Y[0] <= LowestMoves))
{
LowestMoves = abs(Cords_Y[a] - Meds_Y[0]) ;
CloseHouses[a] = a ;
NumPoints++ ;
}
}
}

long long *CloseHousesSums = new long long [NumH] ;

for (int a = 0 ; a < NumPoints ; a++)
{
for (int b = 0 ; b < NumH ; b++)
{
if ((abs(Cords_X[CloseHouses[a]]) - Cords_X[b]) > (abs(Cords_Y[CloseHouses[a]]) - Cords_Y[b]))
{
CloseHousesSums[a] = CloseHousesSums[a] + abs(Cords_X[CloseHouses[a]] - Cords_X[b]) ;
}
else
{
CloseHousesSums[a] = CloseHousesSums[a] + abs(Cords_Y[CloseHouses[a]] - Cords_Y[b]) ;
}
}
}

for (int a = 0 ; a < (NumPoints - 1) ; a++)
{
if (CloseHousesSums[a] < CloseHousesSums[a+1])
{
ClosestHouse[0] = Cords_X[CloseHouses[a]] ;
ClosestHouse[1] = Cords_Y[CloseHouses[a]] ;
}
}
}

void GetClosestHouse(long long NumH, long long House_X[], long long House_Y[], long long ClosestHouse[])
{
int MedianAmt = 0 ;

long long *Sorted_X = new long long [NumH] ;
long long *Sorted_Y = new long long [NumH] ;

/* long long *Sorted_1 = new long long ;//[NumH] ;
long long *Sorted_a = new long long ;//[NumH] ;
long long *Sorted_b = new long long ;//[NumH] ;
long long *Sorted_c = new long long ;//[NumH] ;
long long *Sorted_d = new long long ;//[NumH] ;
long long *Sorted_e = new long long ;//[NumH] ;
long long *Sorted_f = new long long ;//[NumH] ;*/


SortArray(NumberHouses, Sorted_X, House_X) ;
SortArray(NumberHouses, Sorted_Y, House_Y) ;

for (int a = 0 ; a < NumH ; a++)
{
cout << Sorted_X[a] << "," << Sorted_Y[a] << endl ;
}

if (NumH % 2 == 0)
{
MedianAmt = 1 ;
}
else
{
MedianAmt = 2 ;
}
cout << MedianAmt << endl ;
cout << "sun" ;
long long *Medians_X = new long long [MedianAmt] ;
long long *Medians_Y = new long long [MedianAmt] ;
cout << "shine" << endl ;
FindMedians(NumberHouses, MedianAmt, Sorted_X, Medians_X) ;
FindMedians(NumberHouses, MedianAmt, Sorted_Y, Medians_Y) ;

FindMidHouse(NumberHouses, MedianAmt, House_X, House_Y, Medians_X, Medians_Y) ;

}

void GetHouseDistances(long long NumH, long long House_X[], long long House_Y[], long long ClosestHouse[], long long& TravelTimes)
{
long long Difference_X = 0 ;
long long Difference_Y = 0 ;

for (int a = 0 ; a < NumH ; a++)
{
Difference_X = abs(ClosestHouse[0] - House_X[a]) ;
Difference_Y = abs(ClosestHouse[1] - House_Y[a]) ;

//cout << Difference_X << " - Difference_X" << endl ;
//cout << Difference_Y << " - Difference_Y" << endl ;

if (Difference_X > Difference_Y)
{
TravelTimes = TravelTimes + Difference_X ;
}
else
{
TravelTimes = TravelTimes + Difference_Y ;
}
}
//cout << TravelTimes << endl ;
}

int main()
{
cin >> NumberHouses ;

long long *House_X = new long long [NumberHouses] ; // x coordinate of houses
long long *House_Y = new long long [NumberHouses] ; // y coordinate of houses

GetHouses(NumberHouses, House_X, House_Y) ;
GetClosestHouse(NumberHouses, House_X, House_Y, ClosestHouse) ;
GetHouseDistances(NumberHouses, House_X, House_Y, ClosestHouse, TravelTimes) ;

cout << TravelTimes << endl ;
}

现在 - 你会注意到我有一个巨大的注释掉了类似创建的其他数组的代码部分 - 当我有那些未注释时我的代码工作 - 但是当我评论它们时它在输出'sun'之后但在'之前崩溃闪耀'。

我曾尝试使用其他参数来创建内存长度 - 例如 MedianAmt,这包括其他变量和实际数字。我也尝试过使用 long long 变量作为参数。

我不确定为什么它不起作用 - 如果您希望我提供有关我的代码或情况的更多信息,我会尽力回答他们 - 感谢您的帮助。

编辑:我运行可执行文件,它进入“sun”状态,然后卡住 - 它可能需要一两秒钟才会停止响应并关闭。 NuMH 可以达到 long long max amount - 64 位 我不知道我在哪里释放了任何内存 - 我是一个相对新手的程序员 - 并且没有给出错误消息。我当时认为这也是一个堆损坏问题 - 但为什么添加上面我已经注释掉的所有超长长数组会导致它不会崩溃?

我可以发布我的源代码的其余部分 - 但它有 200 行长而且可能有点乱 - 这会有用吗?

编辑 2:至于堆损坏,我将我的 IDE 和程序保存在我的闪存驱动器上 - 但试图在两台不同的计算机上运行它 - 所以我认为可以安全地假设堆没有损坏。也许指向内存的无效指针是问题所在,IDE 会影响我的指针选择内存的位置吗?

编辑 3:我在我尝试运行的两台机器上运行 Windows 7。

编辑 4:更新以获取我的完整源代码..

最佳答案

我想我在 SortArray 中至少发现了一个错误:

for (int c = NumH ; c > b ; c--)
{
SortedArray[c] = SortedArray[c-1] ;
}

假设 SortedArray 的大小为 NumH,您在第一次迭代时就超出了数组边界。我没有深入研究您的算法,但您的意思可能是 int c = NumH - 1

抱歉,不能保证它是唯一的。

关于c++ - C++中的指针内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com