Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Razdolbait
25 / 25 / 22
Регистрация: 18.09.2014
Сообщений: 213
#1

Ошибка "Access violation at adress . " - Delphi

09.02.2016, 16:29. Просмотров 321. Ответов 9
Метки нет (Все метки)

Есть программка, тестовая. Генерирует в цикле случайные вещественные числа. Подключена dll, в которой это число преобразуется в сумму прописью.
При повторном нажатии на кнопку (без перезапуска программы) вылетает ошибка (скрин ниже).
Причем: 1-е нажатие - работает нормально. 2-3 -е - ошибка. И так по кругу.

http://www.cyberforum.ru/delphi-beginners/thread1910534.html
В чем проблема и как исправить?

Основной модуль
Delphi
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
unit Unit1;
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
function propis(default:double):string; external 'SummaToPropis.dll' name 'propis';
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
    rand:Double;
begin
  Memo1.Clear;
  Randomize;
  ProgressBar1.Max:=StrToInt(Edit1.Text);
  for i:=0 to StrToInt(Edit1.Text) do
  begin
    rand:=random*1000000000000;
    if rand<1000 then
      ShowMessage(FloatToStr(rand));
    ProgressBar1.Position:=i;
    Memo1.Lines.Add(IntToStr(i)+' | '+FloatToStr(rand)+' | '+propis(rand));
  end;
end;
end.
Библиотека
Delphi
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
library SummaToPropis;
 
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
 
uses
  System.SysUtils,
  System.Classes;
 
{$R *.res}
var mass:array[0..4]of integer;
    razr:array[0..5] of string;//разряды
    mill:array[0..9] of string;//миллион+, миллиард+, ...
    tysa4:array[0..9] of string;//тысяч+
    sotn:array[0..9] of string;//сотни
    des:array[0..9] of string;//десятки
    desd:array[0..9] of string;//20>i>10
    edin:array[0..1,0..9] of string;//единицы
    ruble:array[0..9] of string;//рубл+
    kopeek:array[0..9] of string;//копейки
    nacion:array[0..9] of string;//белорусски+
 
procedure inicialise();
begin
  razr[0]:='';
  razr[1]:='тысяч';
  razr[2]:='миллион';
  razr[3]:='миллиард';
  razr[4]:='триллион';
 
  mill[0]:='ов ';
  mill[1]:=' ';
  mill[2]:='a ';
  mill[3]:='а ';
  mill[4]:='а ';
  mill[5]:='ов ';
  mill[6]:='ов ';
  mill[7]:='ов ';
  mill[8]:='ов ';
  mill[9]:='ов ';
 
  tysa4[0]:=' ';
  tysa4[1]:='а ';
  tysa4[2]:='и ';
  tysa4[3]:='и ';
  tysa4[4]:='и ';
  tysa4[5]:=' ';
  tysa4[6]:=' ';
  tysa4[7]:=' ';
  tysa4[8]:=' ';
  tysa4[9]:=' ';
 
  sotn[0]:=' ';
  sotn[1]:='сто ';
  sotn[2]:='двесте ';
  sotn[3]:='триста ';
  sotn[4]:='четыреста ';
  sotn[5]:='пятьсот ';
  sotn[6]:='шестьсот ';
  sotn[7]:='семьсот ';
  sotn[8]:='восемьсот ';
  sotn[9]:='девятьсот ';
 
  des[0]:=' ';
  des[1]:='десять ';
  des[2]:='двадцать ';
  des[3]:='тридцать ';
  des[4]:='сорок ';
  des[5]:='пятьдесят ';
  des[6]:='шестьдесят ';
  des[7]:='семьдесят ';
  des[8]:='восемьдесят ';
  des[9]:='девяносто ';
 
  desd[0]:=' ';
  desd[1]:='одиннадцать ';
  desd[2]:='двенадцать ';
  desd[3]:='тринадцать ';
  desd[4]:='четырнадцать ';
  desd[5]:='пятнадцать ';
  desd[6]:='шеснадцать ';
  desd[7]:='семнадцать ';
  desd[8]:='восемнадцать ';
  desd[9]:='девятнадцать ';
 
  edin[0,0]:=' ';
  edin[0,1]:='один ';
  edin[0,2]:='два ';
  edin[0,3]:='три ';
  edin[0,4]:='четыре ';
  edin[0,5]:='пять ';
  edin[0,6]:='шесть ';
  edin[0,7]:='семь ';
  edin[0,8]:='восемь ';
  edin[0,9]:='девять ';
  edin[1,0]:=' ';
  edin[1,1]:='одна ';
  edin[1,2]:='две ';
  edin[1,3]:='три ';
  edin[1,4]:='четыре ';
  edin[1,5]:='пять ';
  edin[1,6]:='шесть ';
  edin[1,7]:='семь ';
  edin[1,8]:='восемь ';
  edin[1,9]:='девять ';
 
  ruble[0]:='ей ';
  ruble[1]:='ь ';
  ruble[2]:='я ';
  ruble[3]:='я ';
  ruble[4]:='я ';
  ruble[5]:='ей ';
  ruble[6]:='ей ';
  ruble[7]:='ей ';
  ruble[8]:='ей ';
  ruble[9]:='ей ';
 
  kopeek[0]:='ек';
  kopeek[1]:='йка';
  kopeek[2]:='йки';
  kopeek[3]:='йки';
  kopeek[4]:='йки';
  kopeek[5]:='ек';
  kopeek[6]:='ек';
  kopeek[7]:='ек';
  kopeek[8]:='ек';
  kopeek[9]:='ек';
 
  nacion[0]:='их ';
  nacion[1]:='ий ';
  nacion[2]:='их ';
  nacion[3]:='их ';
  nacion[4]:='их ';
  nacion[5]:='их ';
  nacion[6]:='их ';
  nacion[7]:='их ';
  nacion[8]:='их ';
  nacion[9]:='их ';
end;
 
function ed1(i:integer):string;
var s:string;
begin
  s:='';
  if i>99 then
    s:=s+sotn[i div 100];
  i:=i mod 100;
  if (i<20) and (i>10) then
    s:=s+desd[i mod 10];
  if ((i>19) and (i<100)) or (i=10) then begin
    s:=s+des[i div 10];
    i:=i mod 10;
  end;
  if i<10 then
    s:=s+edin[0,i];
  result:=s;
end;
 
function ed2(i:integer):string;
var s:string;
begin
  s:='';
  if i>99 then
    s:=s+sotn[i div 100];
  i:=i mod 100;
  if (i<20) and (i>10) then
    s:=s+desd[i mod 10];
  if ((i>19) and (i<100)) or (i=10) then begin
    s:=s+des[i div 10];
    i:=i mod 10;
  end;
  if i<10 then
    s:=s+edin[1,i];
  result:=s;
end;
 
function OkRazr1(i:integer):string;
var s:string;
begin
  s:='';
  i:=i mod 100;
  if (i<20) and (i>9) then
    s:=s+'ов '
  else begin
    s:=mill[i mod 10];
  end;
  result:=s;
end;
 
function OkRazr2(i:integer):string;
var s:string;
begin
  s:='';
  i:=i mod 100;
  if (i<20) and (i>10) then
  s:=s+' '
  else begin
    s:=tysa4[i mod 10];
  end;
  result:=s;
end;
 
function StrFloat(s:string):boolean;
var i:double;
begin
  if TryStrTofloat(s,i) then Result:=true
  else Result:=false;
end;
 
function propis(default:double):string;
var rez, rezR, rezK,temp_s,temp_r:String;
    ishR,ishK,kol,i,rub,kop:int64;
begin
  kol:=0;
  rez:='';
  FormatFloat('0,00',default);
  rub:=Trunc(Abs(default));
  kop:=Round(Frac(Abs(default))*100);
  inicialise();
  if rub<1000000000000  then
  begin
    rezR:='';
    kol:=0;
    while rub>0 do
    begin
      mass[kol]:=rub mod 1000;
      rub:=rub div 1000;
      kol:=kol+1;
    end;
    for i := kol-1 downto 0 do
    begin
      if mass[i]>0 then
      begin
        if i>1 then
          rezR:=rezR+ed1(mass[i])+razr[i]+OkRazr1(mass[i])
        else
          if i=1 then
            rezR:=rezR+ed2(mass[i])+razr[i]+OkRazr2(mass[i])
          else
            rezR:=rezR+ed1(mass[i])+'белорусск'+nacion[mass[0] mod 10]+'рубл'+
              ruble[mass[0] mod 10];
      end;
    end;
    rezK:=' ';
    if kop>0 then
    begin
      if (kop>10) AND (kop<20) then
        rezK:=rezK+desd[i mod 10]+' копеек';
      if ((kop>19) and (kop<100)) or (kop=10) then
      begin
        rezK:=rezK+des[kop div 10];
        kop:=kop mod 10;
      end;
      if kop<10 then
        rezK:=rezK+edin[1,kop]+'копе'+kopeek[kop];
    end;
    rez:=rezR+rezK;
    temp_s:=AnsiUpperCase(copy(rez,0,1));
    temp_r:=Copy(rez,1,Length(rez)-1);
    insert(temp_s,rez,1);
    delete(rez,2,1);
    result:=rez;
  end;
end;
 
exports
  propis;
 
begin
end.
0
Миниатюры
Ошибка "Access violation at adress . "  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2016, 16:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка "Access violation at adress . " (Delphi):

Access violation at adress ошибка при "Открытие" файла
Решил вставить весь код, а не отдельный кусок. Проблема с открытием файла,...

Ошибка при компиляции "Access vilation at address 0066142A on module 'styler.exe'. Read of adress 000000D4"
При запуске программы выскакивает такая ошибка: http://i.imgur.com/VCczaHC.png...

Делфи Ошибка: Access violation at adress 0045FE22 in module
Здравствуйте уважаемые форумчане. Пишу одну программу. В программе существует...

Ошибка при закрытии программы (Access violation at adress)
Сама программа работает нормально, но при закрытии всегда выдает ошибку

Ошибка "Access violation" при расчете определителя матрицы
Пишу работу для курсовой. Надо короче написать программу для вычисления...

9
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
09.02.2016, 16:45 #2
Лучший ответ Сообщение было отмечено Razdolbait как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
Эта куча текста вовсе не для красоты в заголовке каждой библиотеки появляется.
1
Razdolbait
25 / 25 / 22
Регистрация: 18.09.2014
Сообщений: 213
09.02.2016, 16:50  [ТС] #3
А если по русски и подробно?
0
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,588
09.02.2016, 16:52 #4
Цитата Сообщение от FIL Посмотреть сообщение
ShareMem must be the first unit in your library's USES
ну что тут не понятного?
0
Razdolbait
25 / 25 / 22
Регистрация: 18.09.2014
Сообщений: 213
09.02.2016, 16:57  [ТС] #5
Цитата Сообщение от qwertehok Посмотреть сообщение
Сообщение от FIL
ShareMem must be the first unit in your library's USES
ну что тут не понятного?
В данном случае непонятно зачем много лет в школе меня пытались научить французскому)
Так что предлагаю вернуться к моему предыдущему комменту:
Цитата Сообщение от Razdolbait Посмотреть сообщение
А если по русски и подробно?
0
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,588
09.02.2016, 17:03 #6
ShareMem doit être la première unité dans votre bibliothèque USES
а так
0
Razdolbait
25 / 25 / 22
Регистрация: 18.09.2014
Сообщений: 213
10.02.2016, 08:12  [ТС] #7
Помогло. Хотя можно было объяснить намного доступнее)
Теперь ошибка выскакивает при закрытии программы
0
Миниатюры
Ошибка "Access violation at adress . "  
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
10.02.2016, 08:42 #8
Цитата Сообщение от Razdolbait Посмотреть сообщение
Помогло. Теперь ошибка выскакивает
Что сделал-то в итоге?
0
Razdolbait
25 / 25 / 22
Регистрация: 18.09.2014
Сообщений: 213
10.02.2016, 08:50  [ТС] #9
Цитата Сообщение от FIL Посмотреть сообщение
ShareMem must be the first unit in your library's USES
В точности как посоветовали
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
10.02.2016, 10:05 #10
В точности как посоветовали
Ну а дальше опять ступор ?
Опять персонально на хранцусский переводить ?)

ShareMem must be the first unit in your library's USES clause AND your project's
1
10.02.2016, 10:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2016, 10:05
Привет! Вот еще темы с решениями:

Ошибка: Access violation in address 005a837b in module "Project1.exe"
Здравствуйте. При открытии второй формы появляется сообщение &quot;Access violation...

Ошибка при сортировке бинарными вставками "faulted with message 'access violation' "
ошибка или в сортировках, или не так вызываю процедуру, я уже запуталась ...

Ошибка "Access violation on address..."
Скрин ошибки прилагается. Вот код программы: procedure...

Ошибка "Access violation at address."
unit Unit1; interface uses Winapi.Windows, Winapi.Messages,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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