2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Ошибка при выделении памяти...
Сообщение27.12.2008, 19:59 
Аватара пользователя


10/03/08
82
Привет, такая проблема. У меня есть 2 функции:
Код:
adding(application *app)
{
read(app);
...
}

del(application *app)
{
read(app);
...
}

Так вот. Когда запускаю функцию adding(application *app) в ней функция read() проходит без ошибок. А когда запускаешь функцию del(application *app) в функции read() на строке
Код:
...
base=(struct telecast *)realloc(base,number_str*sizeof(struct telecast));
...

возникает ошибка: Project raised exception class EAccessViotation with message 'Access Violation'. В чем может быть проблема???

 Профиль  
                  
 
 
Сообщение27.12.2008, 20:19 


27/11/05
183
Северодонецк
Недостаточно информации - как говаривали в известной кинокомедии - "огласите, пожалуйста, весь список". Просьба опубликовать весь код по возможности...

 Профиль  
                  
 
 
Сообщение27.12.2008, 20:22 
Аватара пользователя


10/03/08
82
Код:
void adding(application* app)
{
read(app);
struct telecast *base;
base=app->base_app;
FILE *fp;
fp=app->fp_app;
int number_str=app->number_str_app;
char hour_start[3],hour_finish[3],minute_start[3],minute_finish[3];
int k;
int i;

/*Выделение памяти ещё для одного объекта базы*/
number_str++;
base=(struct telecast *)realloc(base,number_str*sizeof(struct telecast));


/*Ввод ещё одного объекта базы данных*/
base[number_str-1].id=number_str;
printf("Vvedi day:");
scanf("%s",&base[number_str-1].day);
printf("Vvedi channel:");
scanf("%s",&base[number_str-1].channel);

/*Ввод начального времени*/
memset(hour_start,'\0',3);
memset(minute_start,'\0',3);
i=1;
while (i==1)
{
   i=0;
   printf("Vvedi time_telecast_start v foramte hh:mm :");
   scanf("%s",&base[number_str-1].time_telecast_start);
   if (strlen(base[number_str-1].time_telecast_start)==5)
   {
      if (base[number_str-1].time_telecast_start[2]==':')
      {
         if (isdigit(base[number_str-1].time_telecast_start[0])!=0 && isdigit(base[number_str-1].time_telecast_start[1])!=0 && isdigit(base[number_str-1].time_telecast_start[3])!=0 && isdigit(base[number_str-1].time_telecast_start[4])!=0 )
         {
            for (k=0;k<=1;k++)
            {
               hour_start[k]=base[number_str-1].time_telecast_start[k];
               minute_start[k]=base[number_str-1].time_telecast_start[k+3];
            }
            if (atoi(hour_start)>23 || atoi(hour_start)<0 || atoi(minute_start)>59 || atoi(minute_start)<0)
            {
               printf("Ne pravil'no vvedeno start_time!\n");
               i=1;
            }
         }
         else
         {
            printf("Ne pravil'no vvedeno start_time!\n");
            i=1;
         }
      }
      else
      {
         printf("Ne pravil'no vvedeno start_time!\n");
         i=1;
      }
      }
      else
      {
            printf("Ne pravil'no vvedeno start_time!\n");
         i=1;
      }
}

/*Ввод конечного времени*/
memset(hour_finish,'\0',3);
memset(minute_finish,'\0',3);
i=1;
while (i==1)
{
   i=0;
   printf("Vvedi time_telecast_finish v foramte hh:mm :");
   scanf("%s",&base[number_str-1].time_telecast_finish);
   if (strlen(base[number_str-1].time_telecast_finish)==5)
   {
      if (base[number_str-1].time_telecast_finish[2]==':')
      {
         if (isdigit(base[number_str-1].time_telecast_finish[0])!=0 && isdigit(base[number_str-1].time_telecast_finish[1])!=0 && isdigit(base[number_str-1].time_telecast_finish[3])!=0 && isdigit(base[number_str-1].time_telecast_finish[4])!=0 )
         {
            for (k=0;k<=1;k++)
            {
               hour_finish[k]=base[number_str-1].time_telecast_finish[k];
               minute_finish[k]=base[number_str-1].time_telecast_finish[k+3];
            }
            if (atoi(hour_finish)<=23 && atoi(hour_finish)>=0 && atoi(minute_finish)<=59 && atoi(minute_finish)>=0 && atoi(hour_finish)>=atoi(hour_start))
            {
               if (atoi(hour_finish)==atoi(hour_start) && atoi(minute_finish)==atoi(minute_start))
               {
                  i=1;
               }
            }
            else
            {
            i=1;
            }
         }
         else
         {
            i=1;
         }
      }
      else
      {
         i=1;
      }
      }
      else
      {
         i=1;
      }
}

printf("Vvedi genre:");
scanf("%s",&base[number_str-1].genre);
printf("Vvedi name_telecast:");
scanf("%s",&base[number_str-1].name_telecast);

/*Перемещение к концу потока*/
fseek(fp,0L,SEEK_END);
/*Добавление в файл строки*/
fprintf(fp,"%d;%s;%s;%s;%s;%s;%s;\n",base[number_str-1].id,base[number_str-1].day,base[number_str-1].channel,base[number_str-1].time_telecast_start,base[number_str-1].time_telecast_finish,base[number_str-1].genre,base[number_str-1].name_telecast);
free(base);
fclose(fp);
return;
}

Код:
void del(application *app)
{
read(app);
struct telecast *base;
base=app->base_app;
FILE *fp;
fp=app->fp_app;
int number_str=app->number_str_app;
char line[256];
int i;
int j=0;
FILE *fp1;
int rem;
struct telecast *rem1,temp;

/*Вывод строк из файла на экран*/
fseek(fp,0L,SEEK_SET);
while ((fgets(line,256,fp)!=NULL))
{
   printf("%s\n",line);
}

printf("Vvedi nomer stroki dlya ee udaleniya ili 0 dlya otmenbI:");
scanf("%d",&rem);
if (rem==0)
{
   free(base);
   fclose(fp);
   return;
}
for(i=0;i<number_str;i++)
{
   if (base[i].id==rem)
   {

      /*Перезапись id, чтобы было всё по порядку*/
      for(j=rem;j<number_str;j++)
      {
         base[j].id=j;
      }

      /*Перезапись массива, чтобы было всё по порядку*/
      for(j=rem;j<number_str;j++)
      {
         base[j-1]=base[j];
      }
      number_str--;
      printf("Zapis' uspeshno udalena!\n");

      for(j=0;j<number_str;j++)
      {
         fprintf(fp,"%d;%s;%s;%s;%s;%s;\n",base[j].id,base[j].day,base[j].channel,base[j].time_telecast_start,base[j].time_telecast_finish,base[j].genre,base[j].name_telecast);
         printf("%d;%s;%s;%s;%s;%s;\n",base[j].id,base[j].day,base[j].channel,base[j].time_telecast_start,base[j].time_telecast_finish,base[j].genre,base[j].name_telecast);
      }
      free(base);
      fclose(fp);
      return;
   }

}
printf("Net takoy stroki!\n");
free(base);
fclose(fp);
return;
}

Код:
void read(application *app)
{
struct telecast *base;
char line[256];
char temp[7][256];
int i,k;
int j=0; //Количество элементов между двумя ';'(включая и ';') в массиве
char *semicolon,*semicolon_temp;
FILE *fp;
char hour_start[3],hour_finish[3],minute_start[3],minute_finish[3];
int number_str=0;

if ((fp = fopen("base.txt","a+")) == NULL)
      {
         perror("Error pri open/creat file!\n");
         exit(0);
      }

//Заполняем строки temp[i] символом '\0'
for (i=0; i<=6; i++)
{
   memset(temp[i],'\0',256);
}

//Считывание записей из файла
while ((fgets(line,256,fp)!=NULL))
{
   if (semicolon=strchr(line,';'))
   {
      semicolon_temp=line;
      for (i=0;i<=6;i++)
      {
         j=semicolon-semicolon_temp+1;
         semicolon_temp=semicolon;
         if (i==0)
         {
            semicolon=semicolon-j+1;
         }
         if (i!=0)
         {
            semicolon=semicolon-j+2;
         }
         strncpy(temp[i],semicolon,semicolon_temp-semicolon);
         if (i==0)
         {
            semicolon=semicolon+j;
         }
         if (i!=0)
         {
            semicolon=semicolon+j-1;
         }


         semicolon=strchr(semicolon,';');

         //Проверка на кривость строк
         if ((i!=6 && semicolon==NULL) || (i==6 && semicolon!=NULL))
         {
            break;
         }

         //Проверка времени
         if (i==4)
         {
            if (strlen(temp[3])==5 && strlen(temp[4])==5)
            {
               if (temp[3][2]==':' && temp[4][2]==':')
               {
                  if (isdigit(temp[3][0])!=0 && isdigit(temp[3][1])!=0 && isdigit(temp[3][3])!=0 && isdigit(temp[3][4])!=0 && isdigit(temp[4][0])!=0 && isdigit(temp[4][1])!=0 && isdigit(temp[4][3])!=0 && isdigit(temp[4][4])!=0)
                  {
                     //Заполняем строки hour,minute символом '\0'
                     memset(hour_start,'\0',3);
                     memset(hour_finish,'\0',3);
                     memset(minute_start,'\0',3);
                     memset(minute_finish,'\0',3);

                     for (k=0;k<=1;k++)
                     {
                        hour_start[k]=temp[3][k];
                        hour_finish[k]=temp[4][k];
                        minute_start[k]=temp[3][k+3];
                        minute_finish[k]=temp[4][k+3];
                     }
                     if (atoi(hour_start)>23 || atoi(hour_start)<0 || atoi(hour_finish)>23 || atoi(hour_finish)<0 || atoi(minute_start)>59 || atoi(minute_start)<0 || atoi(minute_finish)>59 || atoi(minute_finish)<0 || atoi(hour_start)>atoi(hour_finish))
                     {
                        break;
                     }
                     if (atoi(hour_start)==atoi(hour_finish) && atoi(minute_start)>=atoi(minute_finish))
                     {
                        break;
                     }
                  }
                  else
                  {
                     break;
                  }
               }
               else
               {
                  break;
               }
            }
            else
            {
               break;
            }
         }
      if (i==6)
      {
         number_str++;
         base=(struct telecast *)realloc(base,number_str*sizeof(struct telecast));
         base[number_str-1].id=number_str;
         strcpy(base[number_str-1].day,temp[1]);
         strcpy(base[number_str-1].channel,temp[2]);
         strcpy(base[number_str-1].time_telecast_start,temp[3]);
         strcpy(base[number_str-1].time_telecast_finish,temp[4]);
         strcpy(base[number_str-1].genre,temp[5]);
         strcpy(base[number_str-1].name_telecast,temp[6]);
      }


      }

   }

}
app->fp_app=fp;
app->base_app=base;
app->number_str_app=number_str;
return;
}

 Профиль  
                  
 
 
Сообщение27.12.2008, 20:38 


27/11/05
183
Северодонецк
А еще недостающий код (main) получить можно (чтобы скомпилировать и запустить у себя - в лоб такой не маленький код проанализировать, наверное, тяжело будет)? А также тестовый набор, на котором вылет происходит?
И хотя бы пару слов, что делает программа...

 Профиль  
                  
 
 
Сообщение27.12.2008, 20:58 
Аватара пользователя


10/03/08
82
Это программа что-то вроде базы данных программы передач(только эта база хранится в обычном txt файле). Функция adding()-добавляет запись в базу. Функция del()-удаляет запись. У меня программа состоит из нескольких модулей и заголовочных файлов:
Код:
//main.cpp
//Головной модуль приложения

#include "db.h"
#include "usermenu.h"
int main(int argc, char *argv[])
{
struct application app;
menu(&app);
return 0;
}


Код:
//usermenu.cpp
//Реализация модуля "Взаимодействие с пользователем"

#include "usermenu.h"
#include "db.h"
#include <stdio.h>
void menu(application *app)
{
    int i_menu;   
   do {
      printf("Vvedi: 1 - for adding, 2 - for remove, 0 - for exit\n");
      scanf("%d",&i_menu);
      switch(i_menu)
      {
         case 1: adding(app);
         break;
         case 2: del(app);
         break;
         
         case 0: break;
         default: printf("Ne verno vvedena cifra, try again!\n");
      }
      }
   while (i_menu!=0);
   return;
}

Код:
//db.h
//Интерфейс модуля "База данных"
#ifndef db_h
#define db_h

#include <stdio.h>

//Определение структуры записи в БД
struct telecast
{
   int id;
   char day[256];
   char channel[256];
   char time_telecast_start[256];
   char time_telecast_finish[256];
   char genre[256];
   char name_telecast[256];
};


struct application
{
FILE* fp_app;
struct telecast *base_app;
int number_str_app;
};





//Добавление записи в БД
void adding(application *app);

//Удаление записи из БД
void del(application *app);



//Чтение из файла базы
void read(application *app);


#endif


Код:
//usermenu.h
//Интерфейс модуля "Взаимодействие с пользователем"
#ifndef usermenu_h
#define usermenu_h

//Меню
void menu(struct application *app);


#endif

А в предыдущем посте это функции модуля: db.cpp. В него включаются также:
Код:
#include "db.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


Добавлено спустя 4 минуты 24 секунды:

А ошибка возникает когда по просьбе меню ввожу 2, тоесть вызываю функцию del(), там сразу в ней вызывается функция read() - в ней и возникает ошибка на той строке. А что странно если по просьбе меню ввожу 1, тоесть вызываю функцию adding(), там там также сразу в ней вызывается функция read() и всё ок без ошибок проходит...

 Профиль  
                  
 
 
Сообщение27.12.2008, 21:15 


27/11/05
183
Северодонецк
Пока я буду "причесывать" ваш код (в смысле стиля написания - без этого его просто невозможно воспринимать, хотя некоторые на этом форуме не видят в подобных случаях никаких проблем), нескромный вопрос - вы студент? Российского вуза? какого? если это "лаба", то ваш преподаватель без ропота принимает такие программы?

 Профиль  
                  
 
 
Сообщение27.12.2008, 21:18 
Аватара пользователя


10/03/08
82
Это курсовая работа :D . Я студент Нижегородского Государственного Технического Университета :D. Не знаю как наш препод будет принимать её, ему каждый год такие носят, наверное привык уже :D

 Профиль  
                  
 
 
Сообщение27.12.2008, 21:34 


27/11/05
183
Северодонецк
Vvedi nomer stroki dlya ee udaleniya ili 0 dlya otmenbI: - что надо ввести?

 Профиль  
                  
 
 
Сообщение27.12.2008, 21:35 
Аватара пользователя


10/03/08
82
Тоесть у тя функция read() в функции del() без ошибок прошла?

 Профиль  
                  
 
 
Сообщение27.12.2008, 21:41 


27/11/05
183
Северодонецк
У "мя" прошла - только при чем здесь read, когда у вас там файл на запись открыт? Какое там может быть чтение?

 Профиль  
                  
 
 
Сообщение27.12.2008, 21:44 
Аватара пользователя


10/03/08
82
Да это не имеет значения здесь, наверное. Тогда почему у меня read() в del() не проходит, а read() в adding() проходит?

 Профиль  
                  
 
 
Сообщение27.12.2008, 21:52 


27/11/05
183
Северодонецк
Для начала решите - как строить мост: вдоль реки или поперек. В функции read вы файл "base.txt" собираетесь читать или писать?

 Профиль  
                  
 
 
Сообщение27.12.2008, 22:04 
Аватара пользователя


10/03/08
82
Этот указатель fp потом передается через указатель app->fp_app в функцию adding() и del(), а в них уже происходит запись в файл, поэтому я сделал один раз чтоб открылся поток для записи, в этом случае и читать же можно из файла...

Добавлено спустя 4 минуты 36 секунд:

О, я создал новый проект, и меня всё без ошибок теперь проходит. Спасибо тебе большое за отзывчивость :wink:

 Профиль  
                  
 
 
Сообщение27.12.2008, 22:12 


27/11/05
183
Северодонецк
"меня всё без ошибок теперь проходит" - слишком опрометчивое заявление. Так все же - в функции read вы оставили по прежнему чтение? и что вы собираетесь читать в таком случае с конца файла?

 Профиль  
                  
 
 
Сообщение27.12.2008, 22:22 
Аватара пользователя


10/03/08
82
"У меня всё без ошибок теперь проходит" - это я говорю про то, где проходило с ошибками. Извините за невнимательность и неграмотность. Почему с конца файла?

Добавлено спустя 3 минуты 56 секунд:

Хотя я ошибся с тем что "У меня всё без ошибок теперь проходит". Как только я добавил одну запись и опять вызвал функцию del() у меня возникла та же ошибка. :(

Добавлено спустя 2 минуты 6 секунд:

Попробуйте в файл base.txt, который у вас находится в папке проекта, добавить строку например такую: 1;Monday;ORT;10:00;11:00;News;"News";

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: YandexBot [bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group