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

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

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

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

28.05.2011, 15:56. Просмотров 744. Ответов 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..." при попытке отсортировать структуру из файла быстрым методом
Посмотрите здесь:

Исключение "unwanted exception at 0x775c15ee Access violation" при считывание из файла - C++
Добрый вечер! Подскажите пожалуйста. У меня в файле записана следующая строка b6589fc6abdc8ac. Я её считываю следующим образом char...

Непонятная ошибка "Access violation writing location 0xcdcdcdd5" - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; struct Node{ int data; Node *next, *prev; }; typedef Node...

Ошибка "Ascess violation" при выводе массива - C++
В проекте есть две такие строчки: for(int L6x=0;L6x&lt;=argcnt;L6x++){for(int L6y=0;L6y&lt;argsize;L6y++){cout&lt;&lt;ComArgumentList;}cout&lt;&lt;endl;} ...

Ошибка "при попытке сопоставить список аргументов" - C++
программа : #include &lt;iostream&gt; #include &lt;conio.h&gt; using std::endl; using std::cin; using std::cout;

Как можно найти итерацию, на которой происходит "access violation reading location"? - C++
Ситуация такая что имеется функция которая вызывается в цикле около 1 млн. раз, в какой-то из итераций выскакивает исключение &quot;access...

Отсортировать методом выбора элементы тех строк матрицы, которые содержат символ "/" - C++
помогите пожалуйста сделать задачку: разработать приложение выполняющее след. функции:ввести с клавы значение элементов символьного...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
29.05.2011, 23:02  [ТС]     Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом #2
метод сортировки подсмотрел у пиндосов...
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
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
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
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
583 / 521 / 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..." при попытке отсортировать структуру из файла быстрым методом
Еще ссылки по теме:

Ошибка при быстрой сортировке файла: "string subscript out of range" - C++
В файле input.txt содержатся сведения о группе студентов в формате: номер группы; запись о каждом студенте группы содержит следующие...

Решение уравнения ("при попытке сопоставить список аргументов") - C++
Добрый день ! Делаю первые шаги в изучении С++, пока пишу самые простейшие программы, вывод текста, решение простых формул. Написал...

[C/C++] "Segmentation fault" при попытке передачи параметра командной строки. - C++
Прога вылетает при попытке передачи параметра через командную строку.Такой код: #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

Почему, при попытке "взять" адрес переменной,компилятор ее не положит на регистр? - C++
почему, при попытке &quot;взять&quot; адрес переменной,компилятор ее не положит на регистр


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

Или воспользуйтесь поиском по форуму:
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..." при попытке отсортировать структуру из файла быстрым методом
Ответ Создать тему
Опции темы

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