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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
#1

Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом - C++

28.05.2011, 15:56. Просмотров 725. Ответов 8
Метки нет (Все метки)

Собстно ошибко "Project '...' raised exception class EAccessViolation with message 'Access violation at address 00401464 Write of address 004040bc'. Process stopped. Use..."
Компилируется нормально, всё работает. Ошибка вылетает при выборе сортировки, подсвечивается строчка 19 "data [ j ] = temp;" Билдер вешается..

структура
C++
1
2
3
4
5
6
7
8
struct telephone
{
        char name[30];
        char adr[40];
        long int number;
};
 
struct telephone data;
сортировка

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
//-------------------------------------SORT-------------------------------------
 
void qs_struct ( struct telephone data [] , int left, int right )
{
 
   register int i, j;
   char *x;
   struct  telephone temp;
 
   i = left; j = right;
   x = data [( left+right ) / 2 ] .name;
 
   do {
     while (( strcmp ( data [ i ] .name,x ) < 0 ) && ( i < right )) i++;
     while (( strcmp ( data [ j ] .name,x ) > 0 ) && ( j > left )) j--;
     if ( i <= j ) {
       temp = data [ i ] ;
       data [ i ] = data [ j ];
       data [ j ] = temp;
       i++; j--;
     }
   } while ( i <= j ) ;
 
   if ( left < j ) qs_struct ( data, left, j ) ;
   if ( i < right ) qs_struct ( data, i, right ) ;
}
 
void quick_struct ( struct telephone data [] , int count )
{
   qs_struct ( data, 0 ,count- 1 ) ;
}
main
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
main()
{
 FILE *t,*f;
 char another,choice;
 char cname[30];
 long int n;
 long int recsize;
 int z;
 int i,j,a,m,fl,l;
 t=fopen("TELEPHONE.DAT","rb+");
 if(t==NULL)
 {
       t=fopen("TELEPHONE.DAT","wb+");
       if(t==NULL)
       {
         printf("Error, File can't open\n");
         getch();
         }
         }
 recsize=sizeof(data);
 while(1)
 {
   fflush(stdin);
   int p = Menu();
   switch(p)
...
 
case 7:
           rewind(t);
           quick_struct(&data,recsize);
           fflush(stdin);
           break;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2011, 15:56     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом
Посмотрите здесь:

C++ Отсортировать методом выбора элементы тех строк матрицы, которые содержат символ "/"
отсортировать каждый столбец матрицы по возрастанию элементов методом "пузырька" C++
C++ Отсортировать массив по убыванию методом "пузырька"
Непонятная ошибка "Access violation writing location 0xcdcdcdd5" C++
Как можно найти итерацию, на которой происходит "access violation reading location"? C++
C++ Ошибка "Unhandled exception, Access violation writing location"
C++ Ошибка "Ascess violation" при выводе массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
29.05.2011, 23:02  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #2
метод сортировки подсмотрел у пиндосов...
grizlik78
Эксперт С++
 Аватар для grizlik78
1890 / 1422 / 104
Регистрация: 29.05.2011
Сообщений: 2,977
30.05.2011, 00:17     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #3
C++
1
2
3
4
5
6
7
8
9
struct telephone data;
...
void quick_struct ( struct telephone data [] , int count );
...
long int recsize;
...
recsize=sizeof(data);
...
quick_struct(&data,recsize);
Если я правильно понял выше процитированное, то функция ждёт указатель на массив записей и число, равное количеству записей.
При этом в функцию передаётся указатель на единственную запись и число, равное размеру записи в байтах. Я бы тоже выпал с ошибкой
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
30.05.2011, 00:31  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #4
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если я правильно понял выше процитированное, то функция ждёт указатель на массив записей и число, равное количеству записей.
При этом в функцию передаётся указатель на единственную запись и число, равное размеру записи в байтах. Я бы тоже выпал с ошибкой
то есть надо сначала достать структуру из файла в массив, посчитать кол-во эл-ов, передать ф-ции сортировки и запихнуть отсортированный массив обратно в файл?
grizlik78
Эксперт С++
 Аватар для grizlik78
1890 / 1422 / 104
Регистрация: 29.05.2011
Сообщений: 2,977
30.05.2011, 00:35     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #5
Ну вроде так. Массив из структур, заполняем записи, сортируем, выгружаем.
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
31.05.2011, 02:28  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #6
если не сложно, подскажите как массив из структур создавать. а то дальше
C++
1
2
3
rewind(t);
while(fread(&data,recsize,1,t)==1)
        {
дело не пошло
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
03.06.2011, 11:52  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #7
пошло вот так....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int n=1   ;
        rewind(t);
        while(fread(&data,recsize,1,t)==1)
        {
              n++;
        }
 
         telephone * dataArray = new telephone[n];
 
         //fflush(stdin);
 
         rewind(t);
         i=1 ;
         while(fread(&data,recsize,1,t)==1)
        {
        strncpy(dataArray[i].name, data.name, 30);
        strncpy(dataArray[i].adr, data.adr, 40);
        dataArray[i].number = data.number;
        i++;
        }
а теперь как бы отсортированный массив назад засунуть?

Добавлено через 13 часов 26 минут
пробовал strcpy+fwrite, strncpy, fputs не проходит...
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:26     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #8
если количество известно заранее
telephone data[10];
если количество узнаем позже то например можно сначала посчитать количество строк в файле (если 1 строка на 1 структуру)
затем telephone *data = (telephone*)calloc(sizeof(telephone),count);
затем rewind(t);


заполнять можно так:
C
1
2
for (int i=0; i<count; i++)
fscanf(file,"%s%s%ld",data[i].name,data[i].adr,&data[i].number); // медленно но верно
также можно попробывать читать и сразу заполнять,
тогда придется мутить с realloc-ами, каждый раз перераспределять память на (++count)+sizeof(telephone);



упс... прочитал щас и понял что это вы уже сделали.
только вот брр
Цитата Сообщение от Alaraf Посмотреть сообщение
while(fread(&data,recsize,1,t)==1) {
strncpy(dataArray[i].name, data.name, 30);
strncpy(dataArray[i].adr, data.adr, 40);
dataArray[i].number = data.number; i++;
}
можно было сразу в dataArray пихать

Цитата Сообщение от Alaraf Посмотреть сообщение
а теперь как бы отсортированный массив назад засунуть?
очень просто.

freopen... режим очистки + записи

сортируем. (это сделано?)
затем в цикле
fprintf(t,"%s %s %ld\n",data[i].name,data[i].adr,data[i].number);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 08:27     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом
Еще ссылки по теме:

Ошибка "Access violation writing location" при работе с массивом. C++
C++ Ошибка компилятора: "Access violation writing location"
Отсортировать диагонали матрицы параллельные побочной методом "пузырька" по возрастанию C++
C++ Ошибка "при попытке сопоставить список аргументов"
Исключение "unwanted exception at 0x775c15ee Access violation" при считывание из файла C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
11.06.2011, 08:27  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #9
попробовал зайти с другого конца, с использованием temp файла...

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
{ case 7:
        int m=1;
        rewind(t);
        while(fread(&data,recsize,1,t)==1)
        {
              m++;
        }
         fflush(stdin);
         telephone * dataArray = new telephone[m];
         rewind(t);
        int i=1 ;
         while(fread(&data,recsize,1,t)==1)
        {
        strncpy(dataArray[i].name, data.name,30-1);
        strncpy(dataArray[i].adr, data.adr,40-1);
        strncpy(dataArray[i].number, data.number,10-1);
        i++;
        }
 
        for(i=1; i<m; i++)
        {
        printf("\n %-12d %-17s %-22s %14s       \n",i,dataArray[i].name, dataArray[i].adr, dataArray[i].number);
        }
        getche();
 
        qs_struct (dataArray,1,m);
        printf("\n *******Sorting*******\n");
        for(i=1; i<m; i++)
        {
        printf("\n  %-12d %-17s %-22s %14s       \n",i,dataArray[i].name, dataArray[i].adr, dataArray[i].number);
        }
        getche();
 
        i=1;
        f=fopen("TEMP.DAT","wb");
 
        rewind(t);
        while(fread(&data,recsize,1,t)==1)
        {
          fwrite(&dataArray[i],recsize,1,f);
          i++;
        }
        fclose(t);
        fclose(f);
        remove("TELEPHONE.DAT");
        rename("TEMP.DAT","TELEPHONE.DAT");
        t=fopen("TELEPHONE","rb+");
        fflush(stdin);
        break;
  }
Добавлено через 11 минут
Цитата Сообщение от Alaraf Посмотреть сообщение
t=fopen("TELEPHONE","rb+");
в смысле TELEPHONE.DAT
Yandex
Объявления
11.06.2011, 08:27     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом
Ответ Создать тему
Опции темы

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