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

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

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

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

28.05.2011, 15:56. Просмотров 747. Ответов 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;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2011, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка "Access violation..." при попытке отсортировать структуру из файла быстрым методом (C++):

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

Ошибка "Access violation writing location" при работе с массивом. - C++
Задание номер 2 #include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;math.h&gt; #include &lt;cmath&gt; #include &lt;iostream&gt; #include...

Создание структуры "префиксное дерево". Ошибка "Access violation writing location". - C++
Есть структура данных - бор или префиксное дерево. class trie { char value; // символ узла trie** pointers; // ссылки на...

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

Ошибка "Unhandled exception, Access violation writing location" - C++
Пишу вот так: root-&gt;child1-&gt;parent=root; root-&gt;child2-&gt;parent=root;выходит ошибка Unhandled exception at 0x00073dec in Regul.exe:...

Ошибка компилятора: "Access violation writing location" - C++
Здравствуйте! Проблема в том что я пишу простой скрипт и у меня всегда вылезает окошко с надписью : Unhandled exception at 0X002611F1 in...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
29.05.2011, 23:02  [ТС] #2
метод сортировки подсмотрел у пиндосов...
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
30.05.2011, 00:17 #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);
Если я правильно понял выше процитированное, то функция ждёт указатель на массив записей и число, равное количеству записей.
При этом в функцию передаётся указатель на единственную запись и число, равное размеру записи в байтах. Я бы тоже выпал с ошибкой
1
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
30.05.2011, 00:31  [ТС] #4
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если я правильно понял выше процитированное, то функция ждёт указатель на массив записей и число, равное количеству записей.
При этом в функцию передаётся указатель на единственную запись и число, равное размеру записи в байтах. Я бы тоже выпал с ошибкой
то есть надо сначала достать структуру из файла в массив, посчитать кол-во эл-ов, передать ф-ции сортировки и запихнуть отсортированный массив обратно в файл?
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
30.05.2011, 00:35 #5
Ну вроде так. Массив из структур, заполняем записи, сортируем, выгружаем.
1
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
31.05.2011, 02:28  [ТС] #6
если не сложно, подскажите как массив из структур создавать. а то дальше
C++
1
2
3
rewind(t);
while(fread(&data,recsize,1,t)==1)
        {
дело не пошло
0
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
03.06.2011, 11:52  [ТС] #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 не проходит...
0
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:26 #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);
0
Alaraf
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
11.06.2011, 08:27  [ТС] #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
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 08:27
Привет! Вот еще темы с ответами:

Ошибка исполнения "Access violation writing location 0x.........." - C++
Здравствуйте! Написал код в MS Visual Studio 2012 64-битной такой код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Ошибка вида "Unhandled exception thrown: read access violation" - C++
Использую парсер tinyXML2. Программа собирается в режиме Debug. При запуске ее из студии - все работает. Но если запустить ее .exe файл из...

Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией") - C++
Описать структуру с именем &quot;ORDER&quot;, содержащий следующие поля: &quot;Счет плательщика&quot;; &quot;Счет получателя&quot;; &quot;Сумма, переводится банковской...

Ошибка "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;} ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.06.2011, 08:27
Ответ Создать тему
Опции темы

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