我试图在c ++中实现kmeans算法,问题是当我尝试在开始时实现一个函数初始化手段...它给我这个错误我搜索如此难以查看我是否超过了数量数组大小但事情看起来没问题,并且不存在溢出。这是代码:
#ifndef KM_HPP
#define KM_HPP
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define HIGH_VALUE 50
// fonction d'initialisation
void initMeans(float **, double **, int , int , int );
#endif
#include "km.hpp"
// fonction d'initialisation
void initMeans(float **x, double **v, int n, int p, int c){
srand(time(0));
for(int i=0; i<n; i++) x[i][p] = rand()%c;
v = new double*[c];
for(int i=0; i<c; i++) v[i] = new double[p];
for(int i = 0; i < c; i++) for(int j = 0; j < p; j++){
double num = 0; int denum = 0;
for(int k = 0; k < n; k++) if(x[k][p] == i){
num += x[k][j]; denum++;
}
v[i][j] = num/denum;
}
}
#include "km.hpp"
using namespace std;
//Les variables globale :
char nomExt[40];
int n, p, c;
float **x;
double **v;
FILE *f;
int main(){
cout<<" donnée le nom de la fichier data :";
cin>>nomExt;
f=fopen(nomExt,"r");
fscanf(f,"%d",&n);
fscanf(f,"%d",&p);
fscanf(f,"%d",&c);
x = new float*[n];
for(int i=0;i<n;i++) x[i]= new float[p];
for(int i=0;i<n;i++){
for(int j=0;j<p;j++) fscanf(f,"%f",&x[i][j]);
}
initMeans(x, v, n, p, c);
for(int i=0;i<c;i++){
for(int j=0;j<p;j++) cout<<v[i][j]<<"\t";
cout<<endl;
}
for(int j=0;j<p;j++) delete [] x[j];
delete [] x;
for(int j=0;j<p;j++) delete [] v[j];
delete [] v;
fclose(f);
return 0;
}
x1.txt是包含的文件:行数(n),列数(p),classe数,2D数组v(c)的列数。 包含数据的文件和main.cpp,header.hpp和header.cpp(头文件实现)和make文件都在同一个文件夹中。
g++ -o km -O3 km.cpp main.cpp
main.cpp: In function ‘int main()’:
main.cpp:16:19: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
fscanf(f,"%d",&n);
^
main.cpp:17:19: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
fscanf(f,"%d",&p);
^
main.cpp:18:19: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
fscanf(f,"%d",&c);
^
main.cpp:24:47: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for(int j=0;j<p;j++) fscanf(f,"%f",&x[i][j]);
执行后Erreur de segmentation (core dumped) ==> [Segmentation fault (core dumped)]
答案 0 :(得分:0)
你正在过去&#34; v&#34;进入initMeans函数并在那里初始化它。但是,分配给v的值不会传播回函数。我要么修改函数以返回v,要么在调用函数之前分配v。
答案 1 :(得分:-1)
我有同样的问题。当我调用一个返回整数的函数时,我得到了分段错误。 后来我想,这是一个非常简单的错误。 在创建类的对象时,我写了这个 -
对象*对象; 而不是Object * object = new Object();
希望这个答案有所帮助。 谢谢, Shraddha