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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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