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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Невиданные ошибки realloc & fprintf, Не могу понять где ошибка 
V
    Опции темы
Ivankult
Дата 8.5.2011, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый вечер. Задали написать программу на QuickC по информатике. Задача должна делать следующее:

есть структура TRAIN:
Код

struct TRAIN
{
    char NAZN[25];
    int NUMB;
    char TIME[10];
};


программа должна добавлять новый элемент структуры в массив, искать нужный элемент по времени отправления поезда, сортировать в алфавитном порядке массив по названию станции. Т.к. это курсач, то намешано там много, и указатели и файы и т.п. Дебилизм, но-массив элементов структуры-это массив указателей на них, и никак иначе, все элементы надо хранить в файле elements.txt, а количество этих элементов- count.txt.
Программу я написал, но возник ряд ошибок, с которымы раньше я не встречался, и не представляю как с ними бороться. 
Писал в студии(MS VisualStudio 2010), ибо легче отлаживать код.

итак.

метод создания нового массива(очищаем файлы)createnew:
Код

void createnew()
{
    FILE *fcount, *felements;
    fcount=fopen("count.txt","w");
    felements=fopen("elements.txt","w");
    fprintf(fcount,"0");
    fclose(fcount);
    fclose(felements);
}


метод добавления нового элемента add:
Код

void add(struct TRAIN *train, int count)
{
    int i,j;
    char time[10];
    bool o=true;
    FILE *fcount, *felements;
    fcount=fopen("count.txt","w");
    if(count==1)
        felements=fopen("elements.txt","w+");
    else
        felements=fopen("elements.txt","a+");
    
    i=0;
    printf("Пункт назначения:");
    //getchar();
    gets((train+(count-1))->NAZN);
    printf("Номер:");
    scanf("%d",&train[count-1].NUMB);
    printf("Время:");
    do
    {
        scanf("%s",&time);
        if(((int)(time[0])-48)*10+((int)(time[1])-48)>24 || ((int)(time[3])-48)*10+((int)(time[4])-48)>59 || strlen(time)!=5)
        {
            printf("Время введено некорректно, введите еще раз в формате чч:мм:\n");
            o=false;
        }
        else
            o=true;
    }
    while(!o);
    strcpy(train[count-1].TIME,time);
    getchar();
        
    fprintf(fcount,"%ld",count);
    fputs(train[count-1].NAZN,felements);
    fprintf(felements,"%ld\n%5s\n",train[count-1].NUMB,train[count-1].TIME);
    
    fclose(fcount);
    fclose(felements);    
}


метод вывода i-того элемента print:
Код

void print(struct TRAIN *train,int i)
{
    printf("\nПункт назначения:");
    puts(train[i].NAZN);
    printf("Номер: %d\nВремя: %5s\n",train[i].NUMB,train[i].TIME);
}


метод вывода всех элементов массива printall:
Код

void printall(struct TRAIN *train,int count)
{
int i;
for(i=0;i<count;i++)
    print(train,i);
}


метод поиска search
Код

void search(struct TRAIN *train,int count)
{
    int i;
    char time[10];
    bool o=true,
        w=false;    
    printf("Время:");
    do
    {
        scanf("%s",&time);
        if(((int)(time[0])-48)*10+((int)(time[1])-48)>24 || ((int)(time[3])-48)*10+((int)(time[4])-48)>59 || strlen(time)!=5)
        {
            printf("Время введено некорректно, введите еще раз в формате чч:мм:\n");
            o=false;
        }
        else
            o=true;
    }
    while(!o);
    for (i=0;i<count;i++)
        if (strcmp(train[i].TIME,time)==0)
        {
            print(train,i);
            w=true;
        }
    if (!w)
        printf("Не найден ни один рейс в данное время.\n");
}


метод сортировки qsort:
Код

void qsort(struct TRAIN *train, int left, int right)
{
  int i, j;
  char *x;
  TRAIN temp;

  i = left; j = right;
  x = train[(left+right)/2].NAZN;

  do {
      while((strcmp(train[i].NAZN,x) < 0) && (i < right)) i++;
    while((strcmp(train[j].NAZN,x) > 0) && (j > left)) j--;
    if(i <= j) 
    {
        temp=train[i];
        train[i]=train[j];
        train[j]=temp;
      //strcpy(temp, items[i]);
      //strcpy(items[i], items[j]);
      //strcpy(items[j], temp);
      i++; j--;
   }
  } while(i <= j);

  if(left < j) qsort(train, left, j);
  if(i < right) qsort(train, i, right);
}


MAIN:
Код

void main()
{
    setlocale(0,"");

    struct TRAIN *train;
    char ask;
    int count=0;
    int i,j;

    FILE *fcount, *felements;
    fcount=fopen("count.txt","r");
    felements=fopen("elements.txt","r");

    fscanf(fcount,"%ld",&count);

    train=(struct TRAIN*)calloc(count,sizeof(struct TRAIN));

    for(i=0; i<count; i++)
    {        
        fgets(train[i].NAZN,20,felements);
        j=0;
        while (train[i].NAZN[j]!='\n') j++;
        train[i].NAZN[j]=' ';        
        fscanf(felements,"%d",&train[i].NUMB);
        fscanf(felements,"%f",&train[i].TIME);
    }

    fclose(fcount);
    fclose(felements);
    do
    {
        printf("\nМЕНЮ:\n");
        printf("\n1-создать\n");
        printf("\n2-доавить\n");
        printf("\n3-сортировка\n");
        printf("\n4-поиск\n");
        printf("\n5-вывод данных\n");
        printf("\n6-выход\n");
        printf("\n\nВыберите пункт:\n");
        ask=getchar();
        getchar();        
        switch(ask)
            {
            case'1':
                createnew();
                break;
            case '2':
                count++;
                if (count==1) 
                    free(train);
                else
                    train=(struct TRAIN*)realloc(train,count*sizeof(struct TRAIN));
                add(train,count);
                break;
            case '3':
                qsort(train,0,count-1);
                printall(train,count);
                break;
            case'4':
                search(train,count);
                break;
            case'5':
                printall(train,count);
                break;
            case'6':return;
            }
    }
while(1);
}


при добавления новой записи на этапе записи в файл происходит что-то неведомое. Не вылетает ошибка, а программа останавливается с сообщением о том, что произошло какое - то прерывание:

http://s1.ipicture.ru/uploads/20110508/Z54T7JSW.png

когда решил отложить эту проблему и потестить дальше наткнулся на проблему с realloc:

окно об ошибке то же, студия переносит в окно файла osfinfo.c c кодом:
Код


void __cdecl _unlock_fhandle (
        int fh
        )
{
        LeaveCriticalSection( &(_pioinfo(fh)->lock) );
}


подскажите, что с этим всем делать, пожалуйста. Заранее благодарю
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
boostcoder
Дата 8.5.2011, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



банальный выход за границы.
PM WWW   Вверх
borisbn
Дата 8.5.2011, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ставишь breakpoint на первой же строке программы, идёшь пошагово (F10), доходишь до строчки, на которой работает неправильно (вылетает, виснет, etc) и сообщаешь эту строчку. Ибо просматривать весь твой код в поисках ошибки, честно говоря, нет желания.

не забудь указать, какие действия ты делал (что вводил с клавиатуры)

Это сообщение отредактировал(а) borisbn - 8.5.2011, 02:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 8.5.2011, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ivankult @  8.5.2011,  02:03 Найти цитируемый пост)
при добавления новой записи ... происходит что-то неведомое


Цитата(Ivankult @  8.5.2011,  02:03 Найти цитируемый пост)
           case '2':
                count++;
                if (count==1) 
                    free(train);

Зачем очистили? и передаете пустой указатель в функцию добавления.
Дальше не стал смотреть...
PM MAIL   Вверх
Ivankult
Дата 8.5.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



volatile, boostcoder, вы оказались правы,из-за очистки массива был выход за границы массива. Спасибо большое, все работает.
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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