#c #segmentation-fault #gdb
Вопрос:
Я работаю над созданием простой модели восприятия на языке Си, и я решил, что хочу иметь какую-то абстракцию, использующую непрозрачные указатели. Приведенный ниже код может дать больше подсказок к проблеме
персептрон.h
#ifndef __PERCEPTRON_H__
#define __PERCEPTRON_H__
typedef struct _Perceptron _perceptron;
typedef struct{
//public
float * input;
float * weigths;
int size;
//private
void * m_perceptron;
}Perceptron;
Perceptron * InitPerceptron();
void FreePerceptron(Perceptron * instance);
void FeedForward(float input[],float weights[],int size,Perceptron * perceptron);
#endif
и это мое восприятие.c
typedef struct _Perceptron{
float * input;
int size;
}_perceptron;
static void _FeedForward(float input[],float weights[],int size,_perceptron * p){
if(p->input == NULL)
p->input = (float *)calloc(size,sizeof(float));
for(int i = 0;i < size;i )
p->input[i] = input[i] * weights[i];
for(int i = 0;i < size;i )
printf("%f ",p->input[i]);
}
Perceptron * InitPerceptron(){
Perceptron * instance = (Perceptron *)malloc(sizeof(Perceptron));
instance ->m_perceptron = (_perceptron *)malloc(sizeof(_perceptron));
return instance;
}
void FeedForward(float input[],float weights[],int size,Perceptron * perceptron) {
if(perceptron->input == NULL)
perceptron->input = (float *)malloc(size*sizeof(float));
if(perceptron->weigths == NULL)
perceptron->weigths = (float *)malloc(size*sizeof(float));
for(int i = 0;i < size;i ){
perceptron->input[i] = input[i];
perceptron->weigths[i] = weights[i];
}
perceptron->size = size;
_FeedForward(perceptron->input,perceptron->weigths,perceptron->size,perceptron->m_perceptron);
}
void FreePerceptron(Perceptron * instance){
free(instance->m_perceptron);
free(instance);
}
и это мое главное.c
float input[] = {1,2,3};
float weights[] = {1,1,1};
Perceptron * perceptron = InitPerceptron();
FeedForward(input,weights,3,perceptron);
FreePerceptron(perceptron);
return 0;
(gdb) r
Starting program: E:reposNeuralNetworkbinneuralnetwork.exe
[New Thread 14564.0x49c4]
[New Thread 14564.0x3a44]
Thread 1 received signal SIGSEGV, Segmentation fault.
0x00000000004017b4 in FeedForward ()
(gdb)
Это ошибка, которую я получаю
Мое первоначальное предположение состоит в том, что, возможно, я обращаюсь к указателям восприятия и _perceptron как к нулевым указателям, поэтому я попытался удалить функцию прямой передачи, и, похоже, она работает просто отлично. Мое следующее предположение состоит в том, что входные данные, вероятно, даны неверно, но это кажется маловероятным.Что может быть причиной ошибки сегментации. Может ли это быть в самой основной функции, связано ли это с использованием malloc для указателей с плавающей точкой или использование моих непрозрачных указателей неправильно ?
Комментарии:
1. Это вопрос на C ?
2. GDB скажет вам, что не так, не нужно гадать. Я бы предложил также использовать дезинфицирующие средства, они могут обнаружить эти ошибки — память,адрес,неопределенность,утечка и поток. Может быть включен с
-fsanitize
помощью флага в GCC и Clang
Ответ №1:
Значения, сохраненные здесь, неинициализированы в момент сравнения:
if(perceptron->input == NULL)
и
if(perceptron->weigths == NULL)
и
if(p->input == NULL)
Это означает, что для этих указателей может не быть выделено памяти. Установите их явно NULL
, чтобы решить проблему.
Примечание сбоку: Это «вес», а не «вес».
Комментарии:
1. Спасибо, я забыл установить для них значение NULL, а также спасибо за примечание в разделе «веса».