C++';运行时错误 ;时间:0内存:3452信号:11'; 我是C++编程新手,我正在做一个项目。

C++';运行时错误 ;时间:0内存:3452信号:11'; 我是C++编程新手,我正在做一个项目。,c++,runtime,C++,Runtime,一个核心函数应该检查一个数组,以确定它是否在N西格玛内与矩阵中包含的其他数组兼容,我在下面发布代码 #include <iostream> #include <cstdlib> #include <cmath> using namespace std; void confronto(double*, double**, double**, double*, int*, int, int, int*); double rnd(){return double(

一个核心函数应该检查一个数组,以确定它是否在N西格玛内与矩阵中包含的其他数组兼容,我在下面发布代码

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

void confronto(double*, double**, double**, double*, int*, int, int, int*);

double rnd(){return double(rand())/RAND_MAX;};

/*argomenti funzione, in ordine:
spettro misurato, database dei picchi, database delle dev. std, vettore dove 
metteremo tutti gli errori sulle parole, un vettore di 1 della stessa lunghezza 

delle parole (lo uso come booleano),
#parole, #campioni delle parole, classifica delle parole papabili

La funzione NON RITORNA VALORI, ma agisce direttamente su vettori e valori 

passati
dal programma. dovendo agire su vettori mi è sembrata la cosa più comoda.
Oltre agli input quindi le uniche var che ci interessano di più sono best ed 

err:
la prima è un vettore che restituisce gli indici corrispondenti alle parole che
hanno passato il test delle N deviazioni standard in ordine crescente di errore.
La seconda ci fornisce per ogni parola l'errore associato in unità arbitrarie, 
che può essere usato come stima della bontà della identificazione.*/
void confronto(double *spettro, double* datab[5], double* datasig[5], double err[], 
                                int accettabile[], int nwords, int size, int best[]){
    //numero max dev std
    int N= 2;
    //numero max picchi "ciccati"
    int failmax = 2;
    //contatore per i fallimenti
    int fail;


    for (int i =0; i<nwords; i++){
        fail = 0;
        for (int j=0; j<size; j++){
            err[i]+= abs(spettro[j] - datab[i][j]);
            if((abs(spettro[j]-datab[i][j])/datasig[i][j])>N){
                fail++;
                if(fail>failmax){accettabile[i]=0;};
            };
        };

    };

    //i prossimi due double sono "segnaposto" per ordinare il vettore degli 
//errori
    //e tener conto dell'indice corrispondente
    double temperr = 0;
    double tempind = 0;
    for (int i =0; i<nwords; i++){
            for (int j = 0; j<nwords; j++){
            //se ho superato i fallimenti concessi, IGNORO la 

//potenziale parola
            if (accettabile[i]==1){
                 if(err[j] < err[i]){

                       temperr = err[i];
                       err[i] = err[j];
                       err[j] = temperr;
                       best[i]=j;

                 };
            };
        };
    };
};






int main() {
    // your code goes here
    int nwords=3;
    int size = 5;
    double spettro[size];
    double datab [nwords] [size];
    double datasig [nwords] [size];
    double err[nwords] = {0};
    int accettabile[nwords];
    for (int i = 0; i<nwords; i++){accettabile[i] = 1;};
    int best[nwords] = {0};

    for (int i = 0; i<nwords; i++){
        for (int j = 0; j<size;j++){
        datab[i][j] = j + rnd();
        datasig[i][j] = (rnd() + rnd())/3.;

        };

    };  
    for (int i = 0; i<size;i++){spettro[i] = i+(2*rand() -1);};
    double *tmpdb = (double*)datab;
    double *tmpsig = (double*)datasig;
    confronto(spettro,&tmpdb,&tmpsig,err,accettabile,nwords,size,best);
    //  cout<< "migliori risultati e errori corrispondenti" << endl;
    //for (int i = 0; i<nwords; i++){
    //  if(best[i]!=0){
    //  cout << best[i] << "   " << err[i] << endl;};
    //};



return 0;

}
#包括
#包括
#包括
使用名称空间std;
无效对抗(双*,双**,双**,双*,整数*,整数,整数,整数*);
double rnd(){返回double(rand())/rand_MAX;};
/*argomenti funzione,在ordine:
斯佩特罗·米苏拉托,比奇数据库,德勒发展标准数据库,维托多夫
梅特雷莫·图蒂·格利·埃尔里·苏勒假释,联合国第1监狱
假释,
#假释,#卡皮奥尼·德勒假释,帕帕比利假释分类
非宗教的宗教信仰,宗教信仰的宗教信仰
帕萨蒂
dal程序。多文多·阿吉尔·苏维托里·米塞姆布拉塔·科萨·皮科莫达。
在最好的情况下,所有的agli输入都是唯一的
错误:
这是一个关于假释的初步审查
汉诺·帕萨托在ordine crescente di errore中的deviazioni标准测试。
第二,在任意单位内,根据ogni所犯的错误,
我们来这里是为了更好地识别身份*/
无效对抗(双*spettro,双*datab[5],双*datasig[5],双err[],
int ACCETTABLE[],int nwords,int size,int best[]{
//数字最大偏差标准
int N=2;
//数字max picchi“ciccati”
int failmax=2;
//每一个fallimenti的contatore
int失败;
对于(inti=0;ifailmax){ackettable[i]=0;};
};
};
};
//我要按维托尔·德格利的顺序用双音“segnaposto”演奏
//错误
//第二次会议
双温度=0;
双温度=0;

对于(inti=0;i当您将2d数组传递到函数中时,它不起作用

首先,将函数的定义更改为

void confronto(double*, double*, double*, double*, int*, int, int, int*);
按旧方法调用函数

double *tmpdb = (double*)datab;
double *tmpsig = (double*)datasig;
confronto(spettro, tmpdb, tmpsig, err, accettabile, nwords, size, best);
这样,2d数组将展开为1d数组并传递到函数中,因此在函数中,应按以下方式使用数组:

err[i] += abs(spettro[j] - datab[i*size+j]);
if ((abs(spettro[j] - datab[i*size+j]) / datasig[i*size+j])>N){

应用上述更改后,它在我的计算机上运行良好。

将2d数组传递到函数中时,它不起作用。我在以下位置对您的代码进行了更改

首先,将函数的定义更改为

void confronto(double*, double*, double*, double*, int*, int, int, int*);
按旧方法调用函数

double *tmpdb = (double*)datab;
double *tmpsig = (double*)datasig;
confronto(spettro, tmpdb, tmpsig, err, accettabile, nwords, size, best);
这样,2d数组将展开为1d数组并传递到函数中,因此在函数中,应按以下方式使用数组:

err[i] += abs(spettro[j] - datab[i*size+j]);
if ((abs(spettro[j] - datab[i*size+j]) / datasig[i*size+j])>N){

应用上述更改后,它在我的计算机上运行良好。

错误是什么?我在你的帖子中看不到它。你必须学会使用调试程序可能的副本:我想你已经将2d数组定义为双[x][5]。如果是这样,您使用的参数传递将导致编译器在错误的位置查找元素,从而损坏内存并触发此segfault。错误是什么?我在您的帖子中看不到它。您必须学会使用调试程序可能的副本:我想您已将2d数组定义为双[x][5]。如果是这样,您使用的参数传递将导致编译器在错误的位置查找元素,从而损坏内存并触发此错误。