При использовании более 4 входов динамический массив разрывается, когда я использую delete [] - PullRequest
0 голосов
/ 25 ноября 2018

Я действительно понятия не имею, что происходит, эта функция прекрасно работает, когда я только ввожу 4 значения, но когда я пытаюсь расширить ее до 5, она ломается.

#include <iostream>
#include <fstream>
#include <cmath>
#include "shape.h"
#include "point.h"
#include "line.h"
#include "triangle.h"
#include "polygon.h"

void xArray(int &xArraySize, float input, int counterX, float *arrX)
{
if(counterX == xArraySize)
{
    arrX[xArraySize -1] = input;
}
else
{
    float *tempArray = new float[xArraySize+1]{0.0};
    for(int i = 0; i < xArraySize; i++)
    {
        tempArray[i] = arrX[i];
    }
    delete[] arrX;
    xArraySize++;
    arrX = new float[xArraySize];
    for(int x = 0; x < xArraySize; x++)
    {
        arrX[x] = tempArray[x];
    }
    arrX[xArraySize-1] = input;

}


}

void yArray(int &yArraySize, float input, int counterY, float *arrY)
{
if(counterY == yArraySize)
{
    arrY[yArraySize -1] = input;
}
else
{
    float *tempArray = new float[yArraySize+1]{0.0};
    for(int i = 0; i < yArraySize; i++)
    {
        tempArray[i] = arrY[i];
    }
    delete[] arrY;
    yArraySize++;
    arrY = new float[yArraySize]{0.0};
    for(int x = 0; x < yArraySize; x++)
    {
        arrY[x] = tempArray[x];
    }
    arrY[yArraySize-1] = input;

}
}

int main()
{
float input = 0;
int counter = 0;
int counterX = 0;
int counterY = 0;
float *arrX = new float[1]{0.0};
float *arrY = new float[1]{0.0};
int xArraySize = 1;
int yArraySize = 1;
std::ifstream myReadFile;
myReadFile.open("cords");
while (myReadFile >> input)
{
    input= round( input* 1000.0 ) / 1000.0;
    counter++;

    if(counter % 2 == 0)
    {
        counterY++;
        yArray(yArraySize, input, counterY, arrY);
    }
    else
    {
        counterX++;
        xArray(xArraySize, input, counterX, arrX);
    }

}
Polygon object(arrX, arrY, xArraySize);
Shape *s = &object;
std::cout << s->area();
getchar();
return 0;
}

Кажется, что-то не так с последним удалением [] arrY;,Значение * arrY становится примерно таким: -1.58839967e + 38

Это действительно сбивает с толку, потому что у меня есть другая функция, которая в основном является точной копией (используется для значений X), но я не получил ошибок там.

Может ли кто-нибудь объяснить, что происходит?

1 Ответ

0 голосов
/ 25 ноября 2018
void f1(float* f)
{
   *f=1.0f;//changes value at location that f points to.
}
void f2(float* f)
{
   f=new float;//redirects LOCAL pointer, outside pointers still points to the old address.
   *f=3.0f;//Changes value at the new location, but nobody outside points to it.
}
void f3(float** f)
{
   *f=new float;//Outside pointer now points to a new location.
   **f=4.0f;//Changes value at the new location.
}

int main()
{
    float* var=new float;
    *var=0.0f;
    f1(var);
    //*var is now 1.0f
    f2(var);
    //*var is still 1.0f, because the function redirected only local copy.
    f3(&var);//See, we have to pass pointer to our actual variable
    //*var now points to new location with 4.0f
}

Итак, ваши объявления должны быть

void yArray(int &yArraySize, float input, int counterY, float **arrY);

И добавить еще один * к каждому arrY использованию внутри функции, и в основном передать его как &arrY.

...