Forum: PC-Programmierung C++ program return an array


von Moritz O. (moritz_o)


Lesenswert?

Hey guys
I am new with c++ and I have to write a code, but somehow it is not 
working and I do not know what I can change. I would like to give back 
the array Grad, but it says segmentation fault (core dumped).
Could somebody help me what I have to change?
Or is it possible to have a global variable and write from the function 
directly to the global variable?
Thanks for your help.

Code:
double* Gradient(const double x[], int n1) {
    double Grad [n1*4] = {0};
    // We calculate the overlap. If the overlap is zero, the gradient
    // is also zero. This should be probably improved in the future.
    //int n = sizeof(x)/32;
    for (int i = 0; i < n1*4; i++)
    {
        for (int j = 0; j < n1*4; i++)
        {
            if (i != j)
            {
                //cout << x[i]<< endl;
                double xmin = max(x[i*4], x[j*4]);
                double xmax = min(x[i*4+1], x[j*4+1]);
                //if (xmin > xmax) return Grad;
                double ymin = max(x[i*4+2], x[j*4+2]);
                double ymax = min(x[i*4+3], x[j*4+3]);
                //if (ymin > ymax) return Grad;

                double x_overlap = xmax-xmin;
                double y_overlap = ymax-ymin;

                // Gradient for xmin
                if (x[i*4] >= x[j*4] && x[i*4] != x[j*4+1] && x[i*4+1] 
!= x[j*4] && x[i*4+2] != x[j*4+3] && x[i*4+3] != x[j*4+2]) Grad[i*4] = 
Grad[i*4]-y_overlap;

                // Gradient for xmax
                if (x[i*4+1] < x[j*4+1]) Grad[i*4+1] = Grad[i*4+1] + 
y_overlap;

                // Gradient for ymin
                if (x[i*4+2] >= x[j*4+2] && x[i*4] != x[j*4+1] && 
x[i*4+1] != x[j*4] && x[i*4+2] != x[j*4+3] && x[i*4+3] != x[j*4+2]) 
Grad[i*4+2] = Grad[i*4+2]-x_overlap;

                // Gradient for ymax
                if (x[i*4+3] <= x[j*4+3]) Grad[i*4+3] = Grad[i*4+3] + 
x_overlap;

                // Gradient for xmax if rectangles are touching by the 
x-coordinate
                if (x[i*4+1] == x[j*4] && x[i*4+3] > x[j*4+2] && 
x[i*4+2] < x[j*4+3])
                {
                    Grad[i*4+1] = Grad[i*4+1] + y_overlap;
                }

                // Gradient for ymax if rectangles are touching by the 
y-coordinate
                if (x[i*4+3] == x[j*4+2] && x[i*4+1] > x[j*4] && x[i*4] 
< x[j*4+1])
                {
                    Grad[i*4+3] = Grad[i*4+3] + x_overlap;
                }
            }
        }
    }
    return Grad;
}


int main() {
    // Coordinates of the rectangles
    double x[] = {0,6,0,9,3,9,4,11};
    int n1 = sizeof(x)/32;

    double gradient;
    gradient = Gradient(x,n1);

    cout << "Gradient R1 xmin = " << Gradient[0] << endl;
}

von MikroMirko (Gast)


Lesenswert?

Hi,

I haven't read through all of your code yet but there are two 
conceptional problems within the first two lines already. ;)

Code:
double* Gradient(const double x[], int n1) {
    double Grad [n1*4] = {0};


1) You cannot define an array using a variable for its size. It has to 
be constant.

These two ways are allowed:
double grad[5]; // or use a named constant, e.g. MY_ARRAY_SIZE
double grad[] = {1,2,3,4,5};

while this one is not:
int size=5;
double grad[size];


2) You're defining the array (double Grad[]) inside the gradient() 
function and let it return a pointer to that array. Unfortunately, 
Grad[] doesn't exists anymore, once the function gradient() has exited. 
This is probably, what causes the segfault.


If you really HAVE TO use a variable array size (Which doesn't make much 
sense on a µC btw.) then you should have a look at 'new' and 'delete' 
which corresponds to malloc/free in C.

Also, you have to define your grad-Array outside the gradient() 
function. And instead having gradient() return a pointer, you would just 
pass a reference to the grad-Array as parameter when calling gradient.
This procedure is called: CallByReference.
gradient() would then initialize the grad-Array and write to it.

hth

von Rolf M. (rmagnus)


Lesenswert?

Moritz O. schrieb:
> Hey guys
> I am new with c++ and I have to write a code, but somehow it is not
> working and I do not know what I can change. I would like to give back
> the array Grad, but it says segmentation fault (core dumped).

You should crank up the warning settings of your compiler. There are 
multiple issues that the compiler should have warned about. There should 
also be multiple errors, so I don't know how you got your compiler to 
accept that code.

> Could somebody help me what I have to change?

The problem is that you return a pointer to a local array. The variable 
Grad exists only as long as the function Gradient is running. But you 
return a pointer to it, so in main(), you are accessing a pointer to a 
non-existant object.

> Or is it possible to have a global variable and write from the function
> directly to the global variable?

It is possible, but not a good idea.

von Dirk B. (dirkb2)


Lesenswert?

Moritz O. schrieb:
> Or is it possible to have a global variable and write from the function
> directly to the global variable?

There is a way in the middle.

Define the array in the caller function (in your example: in main) and 
give the address of this array to your function.

(strcpy, fgets and other standard functions do this also)

von Moritz O. (moritz_o)


Lesenswert?

Thank you very much guys :-).
I will try to apply this methods :-).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.