Форум программистов, компьютерный форум CyberForum.ru

Segmentation fault - C++

Восстановить пароль Регистрация
 
Kaster
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 9
02.06.2014, 08:13     Segmentation fault #1
Доброго времени суток. Столкнулся в программе с ошибкой Segmentation fault. Вообще, задача отсортировать данные по одному из параметров, но из-за ошибки я до до написания сортировки не доберусь. Сигнал SIGSEGV отладчик возвращает с указанием на 99 строку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <cstdlib>
#include <string>
 
using namespace std;
 
int main()
{
    FILE *d;
    struct L
    {
        char n[30];
        float w;
        float c;
        float p;
        float f;
        float ch;
    } *spis;
    int ln,l,m,M,*A;
    unsigned n;
    char **B;
    float **C;
    printf("\n\tДанная программа записывает сведения о продуктах\n\tи организовывает выбор продуктов с содержанием\n\tжиров менее заданного значения.\n");     //Описание
    printf("\nВведите число продуктов: ");     //Задание размера массива
    scanf("%i",&ln);
    spis=new L[ln];
    printf("\nВводите сведения о продуктах:\n");     //Приглашение
    A=new int[ln*6];
    for(l=0,m=0 ; l<ln || m<l*6 ; l++)
    {
        printf("\nНазвание %i-го: ",l+1);
        scanf("%s",spis[l].n);
        A[m++]=sizeof(spis[l].n);
        printf("Вес одного стакана: ");
        scanf("%f",&spis[l].w);
        A[m++]=sizeof(spis[l].w);
        printf("Калорийность: ");
        scanf("%f",&spis[l].c);
        A[m++]=sizeof(spis[l].c);
        printf("Белки: ");
        scanf("%f",&spis[l].p);
        A[m++]=sizeof(spis[l].p);
        printf("Жиры: ");
        scanf("%f",&spis[l].f);
        A[m++]=sizeof(spis[l].f);
        printf("Углеводы: ");
        scanf("%f",&spis[l].ch);
        A[m++]=sizeof(spis[l].ch);
    }
    M=m;
    d=fopen("diet","w");
    for(l=0 ; l<ln ; l++)
    {
        fputs(spis[l].n, d);
        fscanf(d, "%f" ,&spis[l].w);
        fscanf(d, "%f" ,&spis[l].c);
        fscanf(d, "%f" ,&spis[l].p);
        fscanf(d, "%f" ,&spis[l].f);
        fscanf(d, "%f" ,&spis[l].ch);
    }
    fclose(d);
    delete [] spis;
    d=fopen("diet","r");
    B=new char*[M];
    C=new float*[M];
    for(m=0 ; m<M ; )
    {
        B[m]=new char(sizeof(A[m]));
        fgets(B[m] , A[m] , d);
        fseek(d , A[m] , (m=0)? 0 : 1);
        m++;
        C[m]=new float(sizeof(A[m]));
        fread(C[m] , A[m] , 1 , d);
        fseek(d , A[m] , 1);
        m++;
        C[m]=new float(sizeof(A[m]));
        fread(C[m] , A[m] , 1 , d);
        fseek(d , A[m] , 1);
        m++;
        C[m]=new float(sizeof(A[m]));
        fread(C[m] , A[m] , 1 , d);
        fseek(d , A[m] , 1);
        m++;
        C[m]=new float(sizeof(A[m]));
        fread(C[m] , A[m] , 1 , d);
        fseek(d , A[m] , 1);
        m++;
        C[m]=new float(sizeof(A[m]));
        fread(C[m] , A[m] , 1 , d);
        fseek(d , A[m] , 1);
        m++;
    }
    for(m=0 ; m<M ; m++)
    {
        for(n=0 ; n<sizeof(C[m]) ; n++)
        {
            printf("%f",C[m][n]);
        }
        puts(B[m]);
    }
}
Что нужно изменить, чтобы исправить ошибку. Заранее благодарен.

Компилятор:
Qt Creator 3.1.0 (opensource)
Основан на Qt 5.2.1 (MSVC 2010, 32 бита)

ОС:
Windows 7, 64x
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2014, 08:13     Segmentation fault
Посмотрите здесь:

C++ Segmentation fault :(
Программа выводит segmentation fault! C++
C++ string segmentation fault
C++ Segmentation fault
Segmentation fault (iterator) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 11:50     Segmentation fault #2
Здесь что делается?
C++
1
2
3
4
5
6
7
8
9
10
11
    d=fopen("diet","w");
    for(l=0 ; l<ln ; l++)
    {
        fputs(spis[l].n, d);
        fscanf(d, "%f" ,&spis[l].w);
        fscanf(d, "%f" ,&spis[l].c);
        fscanf(d, "%f" ,&spis[l].p);
        fscanf(d, "%f" ,&spis[l].f);
        fscanf(d, "%f" ,&spis[l].ch);
    }
    fclose(d);
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
02.06.2014, 11:59     Segmentation fault #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
зачем вы пользуетесь Си-шными вещами? используйте объекты ifstream/ofstream/fstream , методы read и write,, записали всё в файл сначала, потом считываете по структуре и проверяете удовлетворяет ли она условиям, там проще и нагляднее, чем куча fseek() итп итд , да и запись read/write((char *)&struct, sizeof(size_struct)); выглядит посимпотичнее
Kaster
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 9
02.06.2014, 17:03  [ТС]     Segmentation fault #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Здесь что делается?
Это запись полей массива структуры в файл.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 17:10     Segmentation fault #5
fscanf() - это чтение из файла.
Kaster
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 9
15.06.2014, 17:35  [ТС]     Segmentation fault #6
Цитата Сообщение от dzrkot Посмотреть сообщение
используйте объекты ifstream/ofstream/fstream , методы read и write
- Спасибо, это оказалось очень полезно.
Цитата Сообщение от alsav22 Посмотреть сообщение
fscanf() - это чтение из файла.
- Долго краснел из-за этого.

Конечный код (если интересно):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <cmath>
 
using namespace std;
 
int main()
{
    ifstream read;
    ofstream write;
    struct L
    {
        char n[30];
        float w;
        float c;
        float p;
        float f;
        float ch;
    } *spis;
    int ln,l,k,m,com,d,ffat;
    unsigned j;
    char **B,**C,*p,fats[10];
    printf("||Программу составил студент группы РИ-130501\n||Доронин Всеволод\n");     //Заставка
    printf("\n\tДанная программа записывает сведения о продуктах\n\tи организовывает выбор продуктов с содержанием\n\tжиров менее заданного значения.\n");     //Описание
    printf("\nВведите число продуктов: ");     //Задание размера массива
    scanf("%i",&ln);
    spis=new L[ln];
    printf("\nВводите сведения о продуктах:\n");     //Приглашение
    for(l=0 ; l<ln ; l++)
    {
        printf("\nНазвание %i-го: ",l+1);
        scanf("%s",spis[l].n);
        printf("Вес одного стакана: ");
        scanf("%f",&spis[l].w);
        printf("Калорийность: ");
        scanf("%f",&spis[l].c);
        printf("Белки: ");
        scanf("%f",&spis[l].p);
        printf("Жиры: ");
        scanf("%f",&spis[l].f);
        printf("Углеводы: ");
        scanf("%f",&spis[l].ch);
    }
    write.open("diet.txt");
    for(l=0 ; l<ln ; l++)
    {
        write<<"Название: "<<spis[l].n<<"; ";
        write<<"Вес стакана: "<<spis[l].w<<"; ";
        write<<"Калорийность: "<<spis[l].c<<"; ";
        write<<"Белки: "<<spis[l].p<<"; ";
        write<<"Жиры: "<<spis[l].f<<"; ";
        write<<"Углеводы: "<<spis[l].ch<<endl;
    }
    write.close();
    delete [] spis;
    B=new char*[ln];
    C=new char*[ln];
    printf("\nЗадайте пороговое содержание жиров. Оно должно быть\nбольше хотя бы одного из описанных: ");
    scanf("%s",fats);
    cout<<endl;
    for(ffat=0 , j=0 , m=strlen(fats)-1 ; j!=strlen(fats) && m>=0 ; j++ , m--)
    {
        d=(float)fats[j]*pow(10,m);
        ffat+=d;
    }
    read.open("diet.txt");
    for(l=0 ; l<ln ; l++)
    {
        B[l]=new char[100];
        C[l]=new char[100];
        read.getline(B[l] , 100);
        strcpy(C[l] , B[l]);
        p=strtok(B[l] , "; ");
        k=0;
        while(p!=NULL)
        {
            k++;
            p=strtok(NULL , "; ");
            com=0;
            if(k==10)
            {
                for(d=0 , j=0 , m=strlen(p)-1 ; j!=strlen(p) && m>=0 ; j++ , m--)
                {
                    d=(float)p[j]*pow(10,m);
                    com+=d;
                }
                if(com<ffat)
                {
                    cout<<C[l]<<endl;
                }
            }
        }
    }
    read.close();
    printf("\nНажмите ENTER для выхода.");
}
Yandex
Объявления
15.06.2014, 17:35     Segmentation fault
Ответ Создать тему
Опции темы

Текущее время: 19:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru