PDA

View Full Version : Ricker Wavelet application crashes on execution, exit code 255



Flavio Mesquita
4th June 2018, 16:46
Hi everyone,
I´m a beginner on programming and Qt, but as liked the framework I´m trying to improve my skills and write my C++ codes on it. I got a task of writting a Ricker wavelet code and then plot it.
I divided it in two tasks, first make the ricker code works, and when it is running, then implement a way to plot it, I will use qcustomplot for it.
I got a code from C and I´m trying to adapt it to Qt. Although it doesn´t give any errors during compilation, when executing it crashes, with the following message:

Invalid parameter passed to C runtime function.
C:/Users/Flavio/Documents/qtTest/build-ricker2-Desktop_Qt_5_11_0_MinGW_32bit-Debug/debug/ricker2.exe exited with code 255

The code I´m supposed to translate is:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float *rickerwavelet(float fpeak, float dt, int *nwricker);
int main(int argc, char **argv)
{
int i;
float dt;
float fpeak;

float *wricker=NULL;
int nwricker;

fpeak = atof(argv[1]);
dt = atof(argv[2]);

wricker = rickerwavelet(fpeak, dt, &nwricker);

/* show value of ricker wavelets */
for (i=0; i<nwricker; i++)
printf("%i. %3.5f \n", i, wricker[i]);

free(wricker);
return(1);
}

/* ricker wavelet function, return an array ricker wavelets */
float *rickerwavelet(float fpeak, float dt, int *nwricker)
{
int i, k;
int nw;
int nc;
float pi;
float nw1, alpha, beta;
float *wricker=NULL;

pi = 3.141592653589793;
nw1 = 2.2/fpeak/dt;
nw = 2*floor(nw1/2)+1;
nc = floor(nw/2);

wricker = (float*) calloc (nw, sizeof(float));
for (i=0; i<nw; i++)
{
k = i+1;
alpha = (nc-k+1)*fpeak*dt*pi;
beta = pow(alpha, 2.0);
wricker[i] = (1 - (beta*2)) * exp(-beta);
}

(*nwricker) = nw;
return(wricker);
}


The code i wrote on Qt is:

#include <QCoreApplication>
#include <qmath.h>
#include <stdio.h>
#include <stdlib.h>
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int i,k,nw,nc;
double *wricker=NULL;
int nwricker = 60;
int wavelet_freq = 30;
int polarity=1;
int sampling_rate=0.004;
float nw1, alpha, beta;
const double pi = 3.141592653589793238460;

nw1 = 2.2/wavelet_freq/sampling_rate;
nw = 2*floor(nw1/2)+1;
nc = floor(nw/2);


wricker = (double*)calloc (nw, sizeof(double));
for (i=0; i<nw; i++)
{
k = i+1;
alpha = (nc-k+1)*wavelet_freq*sampling_rate*pi;
beta = pow(alpha, 2.0);
wricker[i] = polarity*((1 - (beta*2)) * exp(-beta));
};
/* show value of ricker wavelets */
for (i=0; i<nwricker; i++)
{
qDebug()<<i<<wricker[i];
};

free(wricker);

return a.exec();
}




Analytic expression

The amplitude A of the Ricker wavelet with peak frequency f at time t is computed like so:

A = (1-2 *pi^2* f^2* t^2) e^{-pi^2* f^2* t^2}

A py code for it would be:


import numpy as np
import matplotlib.pyplot as plt

def ricker(f, length=0.128, dt=0.001):
t = np.arange(-length/2, (length-dt)/2, dt)
y = (1.0 - 2.0*(np.pi**2)*(f**2)*(t**2)) * np.exp(-(np.pi**2)*(f**2)*(t**2))
return t, y

f = 25 # A low wavelength of 25 Hz
t, w = ricker(f)

What seems quite simple.

Does anyone have any idea what is wrong in my code???

Thanks in advance.

Flavio Mesquita
4th June 2018, 22:51
I used the Debug, although I´m not sure if i used it right, I followed the instructions on the help manual.
According to it, the problem is when passing the vectors to qDebug, it give a message:

THE INFERIOR STOPPED BECAUSE IT RECEIVED A SIGNAL FROM THE OPERATING SYSTEM .
SIGNAL NAME: SIGSEGV
SIGNAL MEANING: SEGMENTATION FAULT

I´ll search for more information on this meaning. I used qDebug only with the intention of showing the data on a terminal, actually I want to plot the arrays: wricker and i.

d_stranz
9th June 2018, 01:13
SIGSEGV means you have: 1) used an uninitialized pointer, 2) used a pointer that has an invalid address (like nullptr), 3) used a pointer that points to invalid memory (like using it after the instance has been deleted), 4) tried to access an invalid location in an array, or 5) did something else that caused a memory error.