Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка сегментации при обьявлении структуры (С) 
V
    Опции темы
Ukrajinec
Дата 1.3.2012, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Добрый день. Вот текст программы. При компиляции выбивает одно предупреждение о том что я дабл в инт пробую перевести в функции. Это не важно. С первой строчки, где объявляется указатель на структуру появляется ошибка сегментации. Кажется все правильно написал, ошибки впритык не вижу =(. 

З.Ы.

Задача программы: в структуру заносятся данные 5-рых студентов, вычисляется их рейтинг по результатам оценок экзаменов и зачетов и делаются записи в 2 файла. В один студенты сортированы по рейтингу, во втором - по алфавиту.  


Код

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <string.h>
#define amount 5

using namespace std;
struct Progress
{
       int Exams [4];
       int Tests [6];       
};  
     
struct Student 
{
       char Group[10];
       char Birthdate[20];
       char SecName[20];
       char FirstName[20];
       int Rate;
       struct Progress Balls ;       
};     

int Rating(float , struct Student, int z);  
                                    
int main(int argc, char *argv[])
{ 
    struct Student *stud;
    
    stud = (struct Student *) calloc(amount, sizeof(struct Student));
    float k=1;
    FILE *fp, *fp2;
    
    printf("Vvedit koeficient (0,8..1): ");
    scanf("%f", &k);
    for(short i=0; i<5; i++)
    {
            printf("\nVvedit grupu %d-go studenta: ", i+1);        
            scanf("%s", (stud+i)->Group);
            
            printf("\nVvedit rik narodzhennja %d-go studenta v formati dd.mm.yyyy: ", i+1);
            scanf("%s", &stud[i].Birthdate);
            
            printf("\nVvedit prizvyshche %d-go studenta: ", i+1);
            scanf("%s", (stud+i)->FirstName);
            
            printf("\nVvedit imja %d-go studenta: ", i+1);
            scanf("%s", (stud+i)->SecName);
            
            for (short e=0; e<4; e++)
            {
                printf("\nVvedit ocinku za %d-j ekzamen %d-go studenta: ",e+1, i+1);
                scanf("%d", (stud+i)->Balls.Exams[e]);
            }
            
            for (short t=0; t<6; t++)
            {
                printf("Vvedit ocinku za %d zalik %d-go studenta: ", t+1, i+1);
                scanf("%d", (stud+i)->Balls.Tests[t]);
            }
 
            (stud+i)->Rate= Rating(k, *(stud+i), i);    
    }
   //==========ïåðåâ³ðêà íà â³äêðèòòÿ ôàéëó========================  
    if((fp = fopen("frate.txt", "w+")) == NULL)
    {
          printf("!!!Nemoglyvo vidkryty/stvoryty fajl rejtyngu!!!");
          system ("PAUSE");
          exit(1);
    } else printf("...Fajl dlja zapysu rejtyngu vidkryto/stvoreno.\n");

    if((fp2 = fopen("falf.txt", "w+")) == NULL)
    {
          printf("!!!Nemoglyvo vidkryty/stvoryty fajl dlja zapysu studentiv sortovanykh po alphavitu!!!");
          system ("PAUSE");
          exit(1);
    } else printf("...Fajl, dlja zapysu studentiv sortovanykh po alphavitu, vidkryto/stvoreno.\n");
 //==========ʳíåöü ïåðåâ³ðêè íà â³äêðèòòÿ ôàéëó========================  
 //=========Sortuvannja po rejtyngu==============
    for (int j=0; j<amount; j++)
    {
        for(int i=0; i<amount-1; i++)  
        {
                struct Student Temp;
                if ((stud+i)->Rate<(stud+i+1)->Rate)
                {
                   Temp=*(stud+i);
                   *(stud+i)=*(stud+i+1);
                   *(stud+i+1)=Temp;
                }
        }
    }
    
    fprintf(fp, "  Grupa  |    Prizvyshche    |        Imja       |  Data Narodzhennja |Ex1|Ex2|Ex3|Ex4|Zal1|Zal2|Zal3|Zal4|Zal5|Zal6|Rejt|\n");
    
    for (int i=0; i<amount; i++)
    {
         fprintf(fp, "  %s  |%20.0s|%20.0s|     %s      |", stud[i].Group, stud[i].SecName, stud[i].FirstName, stud[i].Birthdate);
         
            for(int e=0; e<4; e++)
            {
                    fprintf(fp, "%3.0d|", stud[i].Balls.Exams[e]);
            }
            for(int t=0; t<6; t++)
            {
                    fprintf(fp, "%3.0d|", stud[i].Balls.Tests[t]);
            }
            fprintf(fp, "%3.0d|\n", stud[i].Rate);
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
int Rating(float k, struct Student stud, int z)
{
      int n = 10;
      int r = 0;
      float E, Et, Ex;
      E=Et=Ex=0;
 
           for (short t=0; t<6; t++)
          {
              Et+= k*stud.Balls.Tests[t];
          }
          for(short e=0; e<4; e++)
          {
              Ex+= k*stud.Balls.Exams[e];
          }

      E=(Ex+Et)/n;
     return r = fabs(E);      
}


Это сообщение отредактировал(а) Ukrajinec - 2.3.2012, 01:26
PM MAIL   Вверх
bsa
Дата 1.3.2012, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Ukrajinec, ты на каком языке программу пишешь?

т.е. программа даже не выводит "Vvedit koeficient (0,8..1): "?
PM   Вверх
volatile
Дата 2.3.2012, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Ukrajinec @  1.3.2012,  23:05 Найти цитируемый пост)
struct Progress
{
       int Exams [3];
       int Tests [5];       
};

Цитата(Ukrajinec @  1.3.2012,  23:05 Найти цитируемый пост)
           for (short e=0; e<4; e++)
            {
                printf("\nVvedit ocinku za %d-j ekzamen %d-go studenta: ",e+1, i+1);
                scanf("%d", (stud+i)->Balls.Exams[e]);
            }
            for (short t=0; t<6; t++)
            {
                printf("Vvedit ocinku za %d zalik %d-go studenta: ", t+1, i+1);
                scanf("%d", (stud+i)->Balls.Tests[t]);
            }


размерность массивов.
PM MAIL   Вверх
Ukrajinec
Дата 2.3.2012, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



2 bsa
Извините, я просто чтоб не вводить кучу записей вручную, просто прописал значения каждому пункту структуры. Тгда программа оатанавливалась на 28-й строке. Сейчас вылетает после запроса на ввод первой екзаменационной оценки первого студента...
 2 volatile, 
Йопти,  smile  это когда я ТАКОЕ написать успел?(
Значения увеличил. Теперь везде 4 экзаменов и 6 зачетов, но все равно вылетаю на вводе первой екзаменационной оценки первого студента... =(( Тоесть на 52-й строке

При пошаговой компиляции выводит "Ваша программа вызвала нарушение доступа(ошибка сегментации)"

Это сообщение отредактировал(а) Ukrajinec - 2.3.2012, 01:23
PM MAIL   Вверх
volatile
Дата 2.3.2012, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Ukrajinec @  2.3.2012,  01:20 Найти цитируемый пост)
вылетаю на вводе первой екзаменационной оценки первого студента... =(( Тоесть на 52-й строке

смотрим внимательно на 52 строчку
Цитата(Ukrajinec @  1.3.2012,  23:05 Найти цитируемый пост)
                printf("\nVvedit ocinku za %d-j ekzamen %d-go studenta: ",e+1, i+1);
                scanf("%d", (stud+i)->Balls.Exams[e]);

амперсанд (&) у переменной в scanf где?

PM MAIL   Вверх
Ukrajinec
Дата 2.3.2012, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.4.2009

Репутация: нет
Всего: нет



Большое спасибо volatile. Ошибка исчезла. А мне казалось что аперсанд не нужен так как он и есть адрес, а вот что он записан не  в виде  (*ххх).ууу недосмотрел.. Спасибо что помого мне, дубу =))

Добавлено через 2 минуты и 59 секунд
Задача решена. Всем спасибо за помощь. Надеюсь сюда больше с такими глупыми вопросами больше не приду =)) smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.