Войти
ФлеймФорумПрограммирование

[C]Функция как член структуры.

Страницы: 1 2 Следующая »
#0
17:10, 5 ноя. 2012
#include <stdio.h>

struct 
{
    void (*Start)(void);
}*Kernel;

void Start(void)
{

}

int main(int argc, char **argv)
{
    Kernel->Start(); //Ошибка сегментирования на этапе выполнения программы
}
Не понимаю, в каком месте я ошибся. Используется чистый си.

#1
17:13, 5 ноя. 2012

MrGruffi
> Не понимаю, в каком месте я ошибся. Используется чистый си.

Не сделал Kernel->Start = &Start;

#2
17:16, 5 ноя. 2012

=A=L=X=
> Не сделал Kernel->Start = &Start;

А перед этим не сделал Kernel=malloc(sizeof(что?))
Что за манера дёргать кучу всуе?

#3
17:18, 5 ноя. 2012

TarasB
> А перед этим не сделал Kernel=malloc(sizeof(что?))

Ох щи, риальне, я даже после плюсов не заметил =)))

MrGruffi

Учебник по С в зубы - и вперед!

#4
17:21, 5 ноя. 2012

Спасибо большое :)
Рабочий вариант:

#include <stdio.h>
#include <stdlib.h>
struct kernel 
{
  int (*Start)(void);
}*Kernel;

int Start(void)
{
  printf("50","%i");
}

int main(int argc, char **argv)
{
  Kernel=malloc(sizeof(Kernel));
  Kernel->Start=&Start;
  Kernel->Start();
  return 0;
  
}

#5
17:24, 5 ноя. 2012

MrGruffi
> Kernel=malloc(sizeof(Kernel));

А теперь добавь в начало структуры новое поле, запусти код, получи сегфолт, подумай, и возьми учебник по Си в зубы.
Ну и хоть в данном случае это и пофиг, но по понятиям за собой убирать надо, где вызов free?

=A=L=X=
> Ох щи, риальне, я даже после плюсов не заметил =)))

Дык а что плюсы-то...

#6
17:29, 5 ноя. 2012

TarasB
> А теперь добавь в начало структуры новое поле, запусти код, получи сегфолт,
> подумай, и возьми учебник по Си в зубы.
> Ну и хоть в данном случае это и пофиг, но по понятиям за собой убирать надо,
> где вызов free?
Ну дык... тогда:

+ Показать

Верно?
Сам пользуюсь вот этим: http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/main.htm
#7
17:34, 5 ноя. 2012

TarasB
> Дык а что плюсы-то...

Да уже отложилось что если глобальная или первой видимости Object *obj, то сразу же = new... А слон был в посудной лавке.

#8
17:36, 5 ноя. 2012

MrGruffi
Ты не ответил на.

> А теперь добавь в начало структуры новое поле, запусти код, получи сегфолт,
> подумай, и возьми учебник по Си в зубы.

У тебя ошибка в строчке

> Kernel=malloc(sizeof(Kernel));

#9
17:37, 5 ноя. 2012

MrGruffi
> Сам пользуюсь вот этим:
> http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/main.htm

Таблица убила

Языки высокого уровня  

Ada
Modula-2
Pascal
COBOL
FORTRAN
Basic

Языки среднего уровня  

Java
C++
C
FORTH

Языки низкого уровня  

Макроассемблер
Ассемблер

#10
17:38, 5 ноя. 2012

Может лучше так:

#include <stdio.h>
#include <stdlib.h>

typedef struct Kernel {
  int a;
} Kernel;

Kernel* kernel_new() {
  return malloc(sizeof(Kernel));
}

void kernel_delete(Kernel* kernel) {
  free(kernel);
}

void kernel_start(Kernel* kernel) {
  printf("%d\n", kernel->a);
}

int main(int argc, char* argv[]) {
  Kernel* kernel = kernel_new();
  kernel->a = 10;
  kernel_start(kernel);
  kernel_delete(kernel);
  return 0;
}
#11
17:40, 5 ноя. 2012

$tatic
Ну вот, теперь он не поймёт, почему в его маллоке грубая ошибка.

#12
17:44, 5 ноя. 2012

Вииии... надо разбираться

#13
17:49, 5 ноя. 2012

TarasB
Да там во многих местах спорный код: Зачем глобальный экземпляр кернела? Для чего использовано позднее связывание функции? Соглашение об именовании странное.

#14
17:52, 5 ноя. 2012

TarasB
> Ну вот, теперь он не поймёт, почему в его маллоке грубая ошибка.
а не проще было сразу сказать что надо писать не
Kernel=malloc(sizeof(Kernel));
а
Kernel=malloc(sizeof(kernel));
вполне возможно что он просто не заметил.

Страницы: 1 2 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.