Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6

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

28.05.2011, 15:56. Показов 1497. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2011, 15:56
Ответы с готовыми решениями:

Ошибка 'access violation' при попытке свернуть форму
я нашел на этом форуме код который открывает форму авторизации перед тем как запустить всю программу полностью вот код: unit...

Ошибка Access Violation при попытке создать объект класса. В чем может быть проблема?
Код класса unit Unit2; interface uses SysUtils; type ABCMatrix = class private

При попытке присвоить полям новой структуры значений типа AnsiString появляется ошибка Access Violation
При попытке присвоить полям новой структуры значений типа AnsiString появляется ошибка. Как я понимаю это связано с памятью, но не пойму в...

8
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
29.05.2011, 23:02  [ТС]
метод сортировки подсмотрел у пиндосов...
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
30.05.2011, 00:17
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
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
30.05.2011, 00:31  [ТС]
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если я правильно понял выше процитированное, то функция ждёт указатель на массив записей и число, равное количеству записей.
При этом в функцию передаётся указатель на единственную запись и число, равное размеру записи в байтах. Я бы тоже выпал с ошибкой
то есть надо сначала достать структуру из файла в массив, посчитать кол-во эл-ов, передать ф-ции сортировки и запихнуть отсортированный массив обратно в файл?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
30.05.2011, 00:35
Ну вроде так. Массив из структур, заполняем записи, сортируем, выгружаем.
1
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
31.05.2011, 02:28  [ТС]
если не сложно, подскажите как массив из структур создавать. а то дальше
C++
1
2
3
rewind(t);
while(fread(&data,recsize,1,t)==1)
        {
дело не пошло
0
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
03.06.2011, 11:52  [ТС]
пошло вот так....
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
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
10.06.2011, 23:26
если количество известно заранее
telephone data[10];
если количество узнаем позже то например можно сначала посчитать количество строк в файле (если 1 строка на 1 структуру)
затем telephone *data = (telephone*)calloc(sizeof(telephone),cou nt);
затем 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
0 / 0 / 0
Регистрация: 28.05.2011
Сообщений: 6
11.06.2011, 08:27  [ТС]
попробовал зайти с другого конца, с использованием 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.06.2011, 08:27
Помогаю со студенческими работами здесь

Ошибка Access violation при открытии файла
При открытии файла, выдает ошибку &quot;Access violation....&quot; (скриншот прикрепил). Подскажите пожалуйста, как можно решить данную проблему. ...

Access Violation при попытке добавить запись в DBMemo
Всем доброго времени суток. Подключён к БД через компоненты, ADOConnection+AdoDataSet+DataSource+DbGrid и ещё DBMemo для отображения поле...

При переносе на другой комп. возникает Access Violation при попытке открытия ClientDataSet
XE-8. При переносе на другой комп. возникает Access Violation при попытке открытия ClientDataSet, связанного с ADOQuery. База данных...

Access Violation при попытке получить значение Url из TChromium
По совету модератора я попытался присвоить Edit1.text сначение Url из TChromium Edit1.Text := Form1.Chromium1.Browser.MainFrame.url; И...

Access Violation при попытке выполнить php - скрипт на сервере
Код примерно следующий: var HTTP: TIdHTTP; Key: String; begin Key := InputBox('Password required', 'Type here your...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru