Ошибка сегментирования - C (СИ) (72095)
Формулировка задачи:
Прошу помочь найти ошибку сегментирования в коде.
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #define NMAX 10
- struct polinom
- {
- double *elem;
- unsigned int n;
- int top;
- };
- void init(struct polinom *stk)
- {
- stk->top = 0;
- }
- void push(struct polinom *stk, float f)
- {
- if(stk->top < NMAX) {
- stk->elem[stk->top] = f;
- stk->top++;
- } else
- printf("stec polon,kol-vo elementov: %d !\n", stk->top);
- }
- float pop(struct polinom *stk)
- {
- float elem;
- if((stk->top) > 0) {
- stk->top--;
- elem = stk->elem[stk->top];
- return(elem);
- } else {
- printf("stec pust!\n");
- return(0);
- }
- }
- float stkTop(struct polinom *stk)
- {
- if((stk->top) > 0) {
- return( stk->elem[stk->top-1]);
- } else {
- printf("stec pust!\n");
- return(0);
- }
- }
- int gettop(struct polinom *stk)
- {
- return(stk->top);
- }
- int isempty(struct polinom *stk)
- {
- if((stk->top) == 0) return(1);
- else return(0);
- }
- void stkPrint(struct polinom *stk)
- {
- int i=stk->top;;
- if(isempty(stk)==1) return;
- do {
- i--;
- printf("%f\n", stk->elem[i]);
- }while(i>0);
- }
- void PrintfPolinom(polinom * p)
- {
- for (int i=p->n; --i>=1;)
- printf("%.2lf*x^%i + ",p->elem[i],i);
- printf("%.2lf",p->elem[0]);
- }
- polinom * CreatePolinom()
- {
- float elem;
- polinom *p= (polinom *) malloc(sizeof(polinom));// ввод количества коэффициентво без проверки на дурака
- init(p);
- printf("vvidite kollichestvo coifecentov: ");
- scanf("%i",&(p->n));
- p->elem = (double *) calloc(p->n, sizeof(double));// выделяем память под коэффициенты
- for (int i=0; i<p->n; i++)
- {
- printf("vvedite coifecentu x^%i: ",i);
- scanf("%lf",&elem);
- push(p,elem);
- }
- return p;
- }
- int main(void)
- {
- struct polinom *stk;
- int i,n;
- float k;
- char m;
- polinom *a;
- do
- {
- printf ("\n 1-vvod-vuvod polinoma;2 - stec; 3-sohranenie v fail; 0 - exit");
- printf ("\n");
- m=getch();
- printf ("\n");
- switch (m)
- { case '1':
- {
- if ((a=CreatePolinom()) == NULL)
- exit(EXIT_FAILURE);
- PrintfPolinom(a);
- getch();
- break;
- }
- case '2':
- {
- //stk = (struct polinom*)malloc(sizeof(struct polinom));
- //init(stk);
- printf("v stece %d elementov\n", gettop(a));
- printf("\n");
- stkPrint(a);
- printf("verhniu element %f\n",stkTop(a));
- do
- {
- printf("izvlekaem element %f, ", pop(a));
- printf("v stece ostaloc %d elementov\n", gettop(a));
- }
- while(isempty(a)==0);
- getchar();
- getchar();
- return 0;
- }
- }
- }
- while(m!='0');
- system ("pause");
- return 0;
- }
Решение задачи: «Ошибка сегментирования»
textual
Листинг программы
- struct polinom
- {
- float *elem;
- unsigned int n;
- int top;
- };
- //...
- polinom * CreatePolinom()
- {
- float elem;
- polinom *p= (polinom *) malloc(sizeof(polinom));// ввод количества коэффициентво без проверки на дурака
- init(p);
- printf("vvidite kollichestvo coifecentov: ");
- scanf("%i",&(p->n));
- p->elem = (float *) calloc(p->n, sizeof(float));// выделяем память под коэффициенты
- for (int i=0; i<p->n; i++)
- {
- printf("vvedite coifecentu x^%i: ",i);
- scanf("%f",&elem);
- push(p,elem);
- }
- return p;
- }
Объяснение кода листинга программы
- Структура
polinom
содержит указательelem
на массив коэффициентов полинома и два целочисленных поляn
иtop
. - Функция
CreatePolinom
создает экземпляр структурыpolinom
с помощьюmalloc
, выделяет память под массив коэффициентов с помощьюcalloc
и запрашивает у пользователя количество коэффициентов и сами коэффициенты. - В цикле
for
с помощьюscanf
пользователь вводит коэффициенты полинома, которые сохраняются в массивеelem
с помощью функцииpush
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д