Ошибка invalid pointer operation как исправить

Ошибка: Invalid pointer operation Delphi Решение и ответ на вопрос 1939155

0 / 0 / 0

Регистрация: 05.11.2016

Сообщений: 31

1

15.03.2017, 18:15. Показов 22844. Ответов 14


Создаю проект. Самый обычный.
2 формы, текст, пару кнопок.
И ни с того, ни с сего ошибка «invalid pointer operation».
Пробовала пересоздавать проект, несколько раз. И всё равно в разные моменты работы возникает эта ошибка.
Знаю, что много таких тем, но я не нашла решения для своего проекта.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



5445 / 4269 / 1375

Регистрация: 14.04.2014

Сообщений: 19,207

Записей в блоге: 19

15.03.2017, 22:34

2

ошибка в проекте
проект у вас
пока ничего не изменится, так и будет



0



0 / 0 / 0

Регистрация: 05.11.2016

Сообщений: 31

15.03.2017, 23:06

 [ТС]

3

Не совсем поняла «пока ничего не изменится».
Программа в архиве.



0



пофигист широкого профиля

4602 / 3062 / 850

Регистрация: 15.07.2013

Сообщений: 17,668

16.03.2017, 01:53

4

Цитата
Сообщение от Yumi_Mills
Посмотреть сообщение

Программа в архиве.

А она не компилируется. Не хватает модуля ChangePassword



0



0 / 0 / 0

Регистрация: 05.11.2016

Сообщений: 31

16.03.2017, 01:56

 [ТС]

5

Да, извиняюсь, не тот вариант работы отправила.
Вот этот запускается.



0



пофигист широкого профиля

4602 / 3062 / 850

Регистрация: 15.07.2013

Сообщений: 17,668

16.03.2017, 02:44

6

Цитата
Сообщение от Yumi_Mills
Посмотреть сообщение

Вот этот запускается.

Увы. Он тоже не запускается. Ибо не находит файлы Data.DB, Data.Win.ADODB.

Не по теме:

Какой мусор и с какой помойки вы нам предлагаете?



0



5445 / 4269 / 1375

Регистрация: 14.04.2014

Сообщений: 19,207

Записей в блоге: 19

16.03.2017, 09:15

7

все запускается. просто по составным именам модулей видно, что версия XE+
теперь неплохо бы узнать, что нужно сделать, чтобы получить ошибку
я этот квест прошел только до формы смены пароля



0



0 / 0 / 0

Регистрация: 05.11.2016

Сообщений: 31

16.03.2017, 19:37

 [ТС]

8

Ошибка появляется в разные моменты работы (именно с незапущенным приложением). Иногда это добавление элемента, иногда изменение св-в элемента, а иногда и просто так (допустим оставить открытым программу на некоторое время).
Если определённое кол-во раз нажимать ОК в ошибке «Invalid pointer operation», то появляется другая (3 скрин и ей подобные) и т.д.
Если закрыть ошибку крестиком, она пропадает, но появляется опять, когда курсор мыши попадает в область формы.
Один раз появилась вообще «косая» ошибка — 2 скрин.
Пробовала и новые проекты делать, ситуация аналогичная.
Так же переустанавливала саму программу: сначала была RAD Studio 10, потом две версии RAD Studio XE7. Всё равно ошибка.
Возможно ли, что влияет то, что программа установлена не на диске С или какой-то конфликт с Delphi 7 (она тоже есть на ПК и тоже не на диске С)?
ОС: Windows 10 Pro.



0



0 / 0 / 0

Регистрация: 05.11.2016

Сообщений: 31

16.03.2017, 19:44

 [ТС]

9

Цитата
Сообщение от northener
Посмотреть сообщение

Какой мусор и с какой помойки вы нам предлагаете?

Это как бы начало моего диплома.

Цитата
Сообщение от northener
Посмотреть сообщение

Ибо не находит файлы Data.DB, Data.Win.ADODB.

Запускается не в Delphi, а в RAD Studio.



0



5445 / 4269 / 1375

Регистрация: 14.04.2014

Сообщений: 19,207

Записей в блоге: 19

16.03.2017, 21:24

10

так у вас программа к ошибке никакого отношения не имеет
ошибка при работе в IDE?

возможно какие-то компоненты у вас стоят кривые

при переустановке нужно полностью удалять следы предыдущих версий
простой uninstall оставляет за собой тучу барахла
ну и рекомендую не использовать папку по умолчанию с путем длиной в километр, что-нить скромное c:d10



0



0 / 0 / 0

Регистрация: 05.11.2016

Сообщений: 31

16.03.2017, 22:13

 [ТС]

11

Цитата
Сообщение от krapotkin
Посмотреть сообщение

простой uninstall оставляет за собой тучу барахла

Я удаляла через панель управления. Это тоже не подходит?

Советуете опять переустановить студию?



0



500 / 346 / 200

Регистрация: 20.10.2016

Сообщений: 1,101

16.03.2017, 22:46

12

Цитата
Сообщение от Yumi_Mills
Посмотреть сообщение

Возможно ли, что влияет то, что программа установлена не на диске С или какой-то конфликт с Delphi 7 (она тоже есть на ПК и тоже не на диске С)?

У меня на D стоит 10.1 Berlin на С D7, это на работоспособность IDE никак не влияет.

Цитата
Сообщение от Yumi_Mills
Посмотреть сообщение

Советуете опять переустановить студию?

Пробуйте, только по новым путям/каталогам.



0



0 / 0 / 0

Регистрация: 05.11.2016

Сообщений: 31

16.03.2017, 23:05

 [ТС]

13

Цитата
Сообщение от TFullControl
Посмотреть сообщение

Пробуйте, только по новым путям/каталогам.

А удалять эту как? Через панель управления норм или какое-то стороннее ПО скачать?



0



5445 / 4269 / 1375

Регистрация: 14.04.2014

Сообщений: 19,207

Записей в блоге: 19

17.03.2017, 00:40

14

здесь на форуме советовали RevoUninstaller
сам не пробовал



0



Модератор

1436 / 1012 / 228

Регистрация: 31.05.2013

Сообщений: 6,645

Записей в блоге: 6

17.03.2017, 00:51

15

Цитата
Сообщение от krapotkin
Посмотреть сообщение

здесь на форуме советовали RevoUninstaller

Я им и удалял. Потом заходил в папки ProgramFiles, AppData, ProgramData, и дочищал следы, если оставались.

Добавлено через 2 минуты

Цитата
Сообщение от Yumi_Mills
Посмотреть сообщение

или какой-то конфликт с Delphi 7

По умолчанию D7 устанавливается в папку Borland в ProgramFiles, а новые версии XExx — в папку Embarcadero в ProgramFiles. Они между собой никак не связаны.



0




VitGun © ( 2004-11-19 19:30 ) [0]

Проблема вот в чем. При закрытии программы вываливается сообщение «Invalid pointer operation».
В программе есть динамический массив. Если не задавать ему длину и не создавать его элементы, то прога
закрывается нармально, но если создать, то «Invalid pointer operation». В собыии OnClose главной формы написал

где:
cap:array of real;

Прочитал в одной статье, что так массивы уничтожаються (aka Dispose для указателей в Pascal), но нифига не
помогает. что я не сделал? Где руки выпрямлять?


wicked © ( 2004-11-19 19:47 ) [1]

а зачем ему nil присваивать. он и сам уничтожится.


GLFox ( 2004-11-19 20:07 ) [2]

SetLength(YourDynamicArray,0);


VitGun © ( 2004-11-19 20:07 ) [3]

2 wicked
Нифига. хоть присваивай nil, хоть не присваивай. все равно «Invalid pointer operation»


VitGun © ( 2004-11-19 20:10 ) [4]

2 GLFox и это тож пробовал. те же яйца только в профиль.


GLFox ( 2004-11-19 20:12 ) [5]

А еще какие поинтеры используешь?


VitGun © ( 2004-11-19 20:19 ) [6]

Никаких. в том то и дело. Это единственный DynamicArray во всей проге.


Anatoly Podgoretsky © ( 2004-11-19 20:20 ) [7]

У тебя ошибка в программе.


VitGun © ( 2004-11-19 20:22 ) [8]

2 Anatoly Podgoretsky. Угу. Я догадался. вопрос в другом. где?
Если динаические массивы не использовать, то все ОК, если использовать — то трабл.


DrPass © ( 2004-11-19 20:27 ) [9]


> Если динаические массивы не использовать,

Второй наводящий вопрос: а как ты их используешь?

.
Setlength(cap,len);
.
где len — некоторая переменная типа integer
.
for i:=0 to len do
begin
cap[i]:=something;
end;
.


begin. end © ( 2004-11-19 20:40 ) [11]


> [10] VitGun © (19.11.04 20:39)

Ну вот видишь, как всё просто оказалось, всего-то надо заменить len на len — 1 (в заголовке цикла).


Anatoly Podgoretsky © ( 2004-11-19 20:41 ) [12]

VitGun © (19.11.04 20:22) [8]
Да, да именно так, ошибка при работе с динамическими массивами, вот теперь когда способился привести хоть чуть кода, то это уже стало не предположением, а истиной. Ты выходишь за пределы массива, а контроль за этим явно отключил.
Для начала срочно в настройки компилятор, проштудировать их и до тех пор ни строчки кода или же пиши без ошибок.


Anatoly Podgoretsky © ( 2004-11-19 20:43 ) [13]

begin. end © (19.11.04 20:40) [11]
Ну сдесь исправит, так в другом месте вылезет, надо не заплатки, а как минимум включить контроль за границами.


Anatoly Podgoretsky © ( 2004-11-19 20:45 ) [14]

Сделай для начала так
SetLength(,2) затем на бумажке пишешь, вручную прокручивая цикл
I = ?
..
I = ?

и считаешь количество строк, затем сравниваешь с количеством строк массиса


begin. end © ( 2004-11-19 20:45 ) [15]


> [13] Anatoly Podgoretsky © (19.11.04 20:43)

Ну это само собой, а также, ИМХО, лучше пользоваться в таких случаях не конкретной переменной, а High(cap).


VitGun © ( 2004-11-19 20:47 ) [16]

2 Anatoly Podgoretsky

Уж извините..нет. За пределы массива я не выпадаю. Сие мне известно и контроль включен. Ошибка появляется при ЗАКРЫТИИпрограммы, а не во время выполнения.


begin. end © ( 2004-11-19 20:48 ) [17]


> [16] VitGun © (19.11.04 20:47)

Какой недоверчивый, какая разница — во время выполнения или при закрытии, программа просто злопамятная, вот и ругается только в конце.


VitGun © ( 2004-11-19 20:51 ) [18]

Хм.
Полтергейтс однако. len — 1 не помогло, а вот len-2 помогло.


GLFox ( 2004-11-19 20:51 ) [19]

for i:=0 to len do
begin
cap[i]:=something;
end;

Данный код не может быть верным! Индексы в динамических массивах начинаются с НУЛЯ и заканчиваются на Length(YourArray)-1.


VitGun © ( 2004-11-19 20:53 ) [20]

Блин. работает.
2 begin. end & Anatoly Podgoretsky — respect. Спасибо за помощь!


Anatoly Podgoretsky © ( 2004-11-19 20:56 ) [21]

VitGun © (19.11.04 20:47) [16]
Ой не надо отпираться от горячего, ты бы уж не проводил свой код, а теперь краснеть надо за продолжающее развешивание лапшию
Кроме того ты выполнил домашнее задание в 14, сколько у тебя получилось?


Anatoly Podgoretsky © ( 2004-11-19 20:58 ) [22]

begin. end © (19.11.04 20:45) [15]
Ну это способ писать без ошибок, особенно если к ней добавить еще и Low


Palladin © ( 2004-11-19 20:59 ) [23]


> [16] VitGun © (19.11.04 20:47)

ты может быть сначала вникнешь прежде чем сопротивляться. не веди себя как ламер.


VitGun © ( 2004-11-19 21:07 ) [24]

2 Anatoly Podgoretsky:
[14] пост не видел — сорри.
2 Palladin.
Да понял я в чем моя ошибка. Я то был уверен, что обращаюсь к верному кол-ву элементов массива, т.е ошибка была именно в цикле.

Ошибка: Invalid pointer operation

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ошибка: Invalid pointer operation
procedure TForm1.Button2Click(Sender: TObject); var i, n : Integer; Point : array of.

Ошибка: Invalid pointer operation
Не подскажете как исправить ошибку при вычислении второй функции т.е У вылезает окно «Invalid.

Ошибка : Invalid pointer operation
При работе программы возникает данная ошибка ! Возможно она появляется при создании массива вот.

Ошибка: invalid pointer operation
Привет не могу вытащить настройки CheckBox1 из ini файла если CheckBox1.Checked:=true то выдает .

Исправить ошибку WINWORD.EXE в приложениях Office

WINWORD.EXE — это процесс Microsoft Word, указанный в диспетчере задач. Другие приложения Office, как exel, могут быть зависимы от процесса WINWORD.EXE. Некоторые пользователи сталкиваются с ошибкой в Windows 10, что этот процесс поврежден или отсутствует. Ошибки в контексте могут звучать по разному, но все они связаны с процессом WINWORD.EXE. Также стоит отметить, что при запуске приложения Excel или PowerPoint, вы также можете получить ошибку связанную с процессом WINWORD.EXE. Виновником ошибок может быть масса причина: повреждения пакета Office, профиль пользователя, сторонний антивирус, устаревший компонент, поврежденный файл или вредоносное ПО. Давайте разберем, что делать и как исправить ошибку приложения WINWORD.EXE в Windows 10.

Завершить процесс winword.exe

Нажмите Ctrl+Shift+Esc, чтобы открыть диспетчер задач. Далее найдите процесс WINWORD.EXE и щелкните по нему правой кнопкой мыши, после чего выберите завершить. Затем перезапустите приложение Office.

снять задачу WinWord

Запуск Word без макросов и дополнительных функций

Загрузите Word без макросов и посмотрите исправляет ли это ошибку. Нажмите сочетание клавиш Win + R и введите winword /m .

Запуск Word без макросов win+r

Чтобы Word не загружал свои надстройки, введите winword /a

Запуск Word без надстроек win+r

Сбросить запись реестра Word по умолчанию

Сначала вам нужно завершить процесс WINWORD.EXE в диспетчере задач. Далее нажмите обратно Win+R и введите winword /r .

сбросить значения реестра Word win+r

Сканирование на вирусы

Вирусы могут быть проблемой и выдавать ошибку. Воспользуйтесь антивирусным сканером , чтобы проверить систему на вирусы. Процесс WINWORD.EXE должен находиться на своем законном пути. Если он этот процесс находится по другому пути, то это вирус.

  • C:Program Files (x86)Microsoft OfficerootOffice16

Вы можете нажать на этот процесс в диспетчере задать правой кнопкой мыши и выбрать «Расположение файла».

расположение файла WinWord.exe

Ремонт офиса

Поврежденный пакет Office может выдавать различные ошибки. Откройте «Панель управления» > «Удаление программ», найдите Microsot Office и выделите его одним нажатием мыши, после чего нажмите сверху на кнопку «Изменить«. Будет запущен процесс восстановления программы, где выберите «Восстановление по сети» и далее следуйте инструкциям на экране.

I can’t seem to figure this one out. My program compiles and runs successfully, but during debugging only it pops up a message box saying «Invalid Pointer Operation» when shutting the program down. I have painstakingly checked all the FormCloseQuery and FormDestory events for any syntax or logical error. I found none and they execute as expected without any error.

enter image description here

When I do tell the compiler to break at Invalid Pointer Operation error, it doesn’t do anything but hangs up the program. At which point, I had to terminate or kill the process.

How do you figure this one out?

Thanks in advance,

Wolf's user avatar

Wolf

9,4947 gold badges62 silver badges105 bronze badges

asked Apr 11, 2012 at 20:04

ThN's user avatar

10

An Invalid Pointer exception is thrown by the memory manager when it tries to free invalid memory. There are three ways this can happen.

The most common is because you’re trying to free an object that you’ve already freed. If you turn on FastMM’s FullDebugMode, it will detect this and point you directly to the problem. (But make sure to build a map file so it will have the information it needs to create useful stack traces from.)

The second way is if you’re trying to free memory that was allocated somewhere other than the memory manager. I’ve seen this a few times when passing a string from a Delphi EXE to a Delphi DLL that wasn’t using the shared memory manager feature.

And the third way involves messing around with pointers directly and probably doesn’t apply to you. If you try to FreeMem or Dispose a bad pointer that doesn’t refer to an actual block of memory allocated by FastMM, you’ll get this error.

It’s most likely the first one. Use FullDebugMode and you’ll find the source of the problem easily.

answered Apr 11, 2012 at 20:30

Mason Wheeler's user avatar

Mason WheelerMason Wheeler

81.5k49 gold badges272 silver badges474 bronze badges

2

Invalid pointer operations occur when you tell the Delphi memory manager to release memory that doesn’t belong to it. There are three ways that might happen:

  • Freeing a pointer or object that has already been freed.
  • Using FreeMem to free something that was allocated by some other memory manager (such as GlobalAlloc or CoTaskMemAlloc).
  • Freeing an uninitialized pointer. (This is distinct from freeing a null pointer, which is completely safe.)

Somewhere in your program, you are doing one of those things. The debugger has detected the exception thrown by the memory manager, so do some debugging. From the stack trace, you should be able to see which variable you’re trying to free. Check the rest of your program for other ways that variable is used.

Tools like MadExcept and Eureka Log can help you find double-free errors. They can keep track of where the pointer in question got allocated and where it was freed the first time, and that is sometimes enough information to figure out your mistake and stop freeing things multiple times.

answered Jan 18, 2013 at 15:33

Rob Kennedy's user avatar

Rob KennedyRob Kennedy

161k21 gold badges276 silver badges463 bronze badges

7

A 4th reason an invalid pointer operation can occur. I had two pointers that where array[0..1000] of real and a third pointer that was an array[1..200] of real. All 3 pointers where initialized with
for i := 0 to 1000 do
begin
ptr1^[i]:=0;ptr2^[i]:=0;ptr3^[i]:=0;
end;
While this poor programing did not bother Pascal in Delphi a call to Dispose any of the 3 pointers resulted in an Invalid Pointer Operation. The fix was simply to initialize the 3rd pointer correctly.

answered Sep 23, 2016 at 21:07

Dick Brown's user avatar

I have been caught out by this type of «indicated error» during Delphi debugging.

Check if you have any watched variables with «Allow Function Calls» enabled or watches that try to show other variables in the same unit (or global) that might be uninitialised. When stopping on a breakpoint this can cause Delphi’s debugger to attempt to display the value via a function call that accesses an uninitialised Pointer or variable. The actual variable that causes the AV my not even be on your watch list.

answered Jan 18, 2013 at 14:28

Despatcher's user avatar

DespatcherDespatcher

1,73512 silver badges18 bronze badges

1

> ВНИМАНИЕ!

> Invalid Pointer Operation…

сообщение 22.02.2009 0:29

Сообщение
#1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +



…и почему-то никто почти не знает толком, от чего она берётся. На куске кода:

Procedure ssendfile;
var fm,fm2:TFilestream;
begin
try
fm:=TFileStream.Create(form7.Edit1.Text, fmOpenRead);
fm.Position:=0;
fm2:=TfileStream.create('temp',fmcreate);
fm2.position:=0;
cipher.initstr(key,tdcp_sha1);
cipher.EncryptStream(fm,fm2,fm.size);
cipher.burn;
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
fm2.position:=0;
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fm2.Size)+ #0);
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fm2.size);
form1.ClientSocket1.Socket.SendStream(fm2);
form7.edit1.text:='';
form7.hide;
fm.free;
fm2.Free;
except
showmessage('Ошибка!');
end;
end;

вылетает Invalid Pointer Operation и вдобавок ещё одна ошибка с длинным содержанием, начинается «Unhabled execution in…». Было ещё несколько моментов с вылетом ошибки, но их я сумел исправить сам, здесь не получается..

———————

«Знаешь, стыдно — когда не видно, что услышал всё, что слушал..»

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

volvo

сообщение 22.02.2009 0:44

Сообщение
#2

Гость



Локализуй место ошибки… Лучше всего для этого пользоваться FastMM. Как — см. здесь. Можешь поставить в каждой строке BreakPoint-ы, и посмотреть, в какой именно строке происходит вылет.

А вообще, Invalid Pointer Operation — это ошибка работы с памятью.

 К началу страницы 

+ Ответить 

Unconnected

сообщение 22.02.2009 1:31

Сообщение
#3


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +



Поставил брекпоинты, оттрассировал(кажется, так это называется), ошибка на строке

form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));

и выдаётся

Цитата

» is not valid integer value

. Я подумал на преобразование inttostr и сделал так:

showmessage(inttostr(form1.listbox2.itemindex));
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));

Сообщение 1..

Программа порадовала lol.gif

Эскизы прикрепленных изображений
Прикрепленное изображение

———————

«Знаешь, стыдно — когда не видно, что услышал всё, что слушал..»

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

volvo

сообщение 22.02.2009 2:37

Сообщение
#4

Гость



А чему должно было быть равно значение ItemIndex? Ты что-то выбирал в ListBox-е?

 К началу страницы 

+ Ответить 

Unconnected

сообщение 22.02.2009 2:47

Сообщение
#5


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +



Да, там сначала кликаешь на ник пользователя, а потом отправка. Причём аналогичная процедура без шифрования работает. К тому же с брекпойнтами на этой строке появляется окно с ассемблерным кодом и той же ошибкой.

Добавлено через 3 мин.

Вот обе рядом, первая работает на отлично.

Procedure sendfile;
Var
fs: TFileStream;
Begin
fs:=TFileStream.Create(form7.Edit1.Text, fmOpenRead);
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
Try
fs.Position:=0;
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fs.Size)+ #0);
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fs.size);
form1.ClientSocket1.Socket.SendStream(fs);
form7.edit1.text:='';
form7.hide;
Finally
end;
End;

Procedure ssendfile;
var fm:TFilestream;
fm2:TMemoryStream;
begin
fm:=TFileStream.Create(form7.Edit1.Text, fmOpenRead);
fm.Position:=0;
fm2:=TMemoryStream.create;
fm2.position:=0;
cipher.initstr(key,tdcp_sha1);
cipher.EncryptStream(fm,fm2,fm.size);
cipher.burn;
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex));
Try
fm2.Position:=0;
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fm2.Size)+ #0);
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fm2.size);
form1.ClientSocket1.Socket.SendStream(fm2);
form7.edit1.text:='';
form7.hide;
Finally
fm.free;
fm2.Free;
end;
end;

———————

«Знаешь, стыдно — когда не видно, что услышал всё, что слушал..»

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

volvo

сообщение 22.02.2009 3:15

Сообщение
#6

Гость



Попробуй сделать Cipher локальной переменной, а не глобальной… Что-то мне кажется, что надо его освобождать (Free), прежде чем обращаться к результатам шифрования. И, заодно, проверь, где именно портится значение form1.listbox2.itemindex, то есть выводи его перед каждой строкой работы с cipher.

 К началу страницы 

+ Ответить 

Unconnected

сообщение 22.02.2009 17:08

Сообщение
#7


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +



Сделал локальными, но смысла в этом в принципе нет, т.к. принимает поток другая копия программы, и к тому же вызывается cipher.burn.

Несколько часов тестил программу, результаты..

procedure TForm7.Button2Click(Sender: TObject); //здесь происходит выбор, какую процедуру вызывать. Shifr2=true
begin
if shifr2=false then SendFile
else ssendfile;
end; //!!!

Procedure ssendfile;
var fm:TFilestream;
fm2:TMemoryStream;
begin
fm:=TFileStream.Create(form7.Edit1.Text, fmOpenRead); //ок
fm.Position:=0; //ок
fm2:=TMemoryStream.create; //ок
fm2.position:=0; //ок
cipher.initstr(key,tdcp_sha1); //ок
cipher.EncryptStream(fm,fm2,fm.size); //ок
cipher.burn; //ок
form1.ClientSocket1.socket.SendText('#X'+form7.edit1.text+'#0'+inttostr(form1.listbox2.itemindex)); //ок
Try
fm2.Position:=0; //ок
form1.ClientSocket1.socket.SendText('Size:'+IntToStr(fm2.Size)+ #0); //ок
form7.StatusBar1.SimpleText:='Выполняется отправка '+inttostr(fm2.size); //ок
form1.ClientSocket1.Socket.SendStream(fm2); //ок
form7.edit1.text:=''; //ок
form7.Hide; //?
Finally
fm.free; //ок
fm2.Free; //ок
end;
end;

Ок — ошибок при прохождении не возникает. На строке, помеченной «?», переход в модуль CoolTrayIcon.pas(при чём он здесь — не понимаю, на эту форму он вообще не должен воздействовать), и далее на строке, помеченной «!!!» (в самом верху) ошибка.

Сообщение отредактировано: Unconnected — 22.02.2009 17:09

———————

«Знаешь, стыдно — когда не видно, что услышал всё, что слушал..»

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

volvo

сообщение 22.02.2009 17:22

Сообщение
#8

Гость



Цитата

Сделал локальными

Правда? А где описание переменной внутри процедуры SSendFile? Где локальность-то? Я ж говорил: Создавать и уничтожать cipher ВНУТРИ процедуры, а не где-то там, извне, и только после уничтожения обращаться к шифрованному потоку (то, что у тебя сейчас происходит — это не называется «работает», это называется глючит неизвестно где)… У тебя вон и так непонятно что с формами творится, наплодил глобальных переменных, получи результат…

 К началу страницы 

+ Ответить 

Unconnected

сообщение 22.02.2009 17:26

Сообщение
#9


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +



Если сделать локальной для Ssendfile — Self Undeclared Identifier в конструкторе.

———————

«Знаешь, стыдно — когда не видно, что услышал всё, что слушал..»

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

volvo

сообщение 22.02.2009 17:32

Сообщение
#10

Гость



Ну, так значит что-то ты делаешь не так… Открой примеры, идущие с библиотекой, и убедись, что ВЕЗДЕ cipher описывается локально, и все работает.

 К началу страницы 

+ Ответить 

Unconnected

сообщение 23.02.2009 1:57

Сообщение
#11


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +



Ура!!!!!!!!!!!!!!!! Сделал процедуру SSendfile принадлежащей к форме, Self активировался, потом сетевая зараза вызвала buffer overflow…потом ещё немного танцев с бубном.. Спасибо огромное, volvo!!!!!!!!!!!! good.gif good.gif good.gif

Кстати, если везде используются локальные переменные — это не всегда хорошо. Я их сделал локальными везде, где только возможно, и приём файла работать с локально описанным потоком почему-то не захотел, только с глобальным, хотя этот поток больше нигде не использовался.

Сообщение отредактировано: Unconnected — 23.02.2009 1:58

———————

«Знаешь, стыдно — когда не видно, что услышал всё, что слушал..»

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)

Пользователей: 0

 
VitGun ©
 
(2004-11-19 19:30)
[0]

Проблема вот в чем. При закрытии программы вываливается сообщение «Invalid pointer operation».
В программе есть динамический массив. Если не задавать ему длину и не создавать его элементы, то прога
закрывается нармально, но если создать, то «Invalid pointer operation». В собыии OnClose главной формы написал

cap:=nil

где:
cap:array of real;

Прочитал в одной статье, что так массивы уничтожаються (aka Dispose для указателей в Pascal), но нифига не
помогает…что я не сделал? Где руки выпрямлять?


 
wicked ©
 
(2004-11-19 19:47)
[1]

а зачем ему nil присваивать?…. он и сам уничтожится….


 
GLFox
 
(2004-11-19 20:07)
[2]

SetLength(YourDynamicArray,0);


 
VitGun ©
 
(2004-11-19 20:07)
[3]

2 wicked
Нифига…хоть присваивай nil, хоть не присваивай…все равно «Invalid pointer operation»


 
VitGun ©
 
(2004-11-19 20:10)
[4]

2 GLFox и это тож пробовал…те же яйца только в профиль…


 
GLFox
 
(2004-11-19 20:12)
[5]

А еще какие поинтеры используешь?


 
VitGun ©
 
(2004-11-19 20:19)
[6]

Никаких…в том то и дело. Это единственный DynamicArray во всей проге…


 
Anatoly Podgoretsky ©
 
(2004-11-19 20:20)
[7]

У тебя ошибка в программе.


 
VitGun ©
 
(2004-11-19 20:22)
[8]

2 Anatoly Podgoretsky. Угу. Я догадался…вопрос в другом…где?
Если динаические массивы не использовать, то все ОК, если использовать — то трабл.


 
DrPass ©
 
(2004-11-19 20:27)
[9]


> Если динаические массивы не использовать,

Второй наводящий вопрос: а как ты их используешь?


 
VitGun ©
 
(2004-11-19 20:39)
[10]

2 DrPass.


Setlength(cap,len);

где len — некоторая переменная типа integer

for i:=0 to len do
begin
  cap[i]:=something;
end;


 
begin…end ©
 
(2004-11-19 20:40)
[11]


> [10] VitGun ©   (19.11.04 20:39)

Ну вот видишь, как всё просто оказалось, всего-то надо заменить len на len — 1 (в заголовке цикла).


 
Anatoly Podgoretsky ©
 
(2004-11-19 20:41)
[12]

VitGun ©   (19.11.04 20:22) [8]
Да, да именно так, ошибка при работе с динамическими массивами, вот теперь когда способился привести хоть чуть кода, то это уже стало не предположением, а истиной. Ты выходишь за пределы массива, а контроль за этим явно отключил.
Для начала срочно в настройки компилятор, проштудировать их и до тех пор ни строчки кода или же пиши без ошибок.


 
Anatoly Podgoretsky ©
 
(2004-11-19 20:43)
[13]

begin…end ©   (19.11.04 20:40) [11]
Ну сдесь исправит, так в другом месте вылезет, надо не заплатки, а как минимум включить контроль за границами.


 
Anatoly Podgoretsky ©
 
(2004-11-19 20:45)
[14]

Сделай для начала так
SetLength(,2) затем на бумажке пишешь, вручную прокручивая цикл
I = ?
..
I = ?

и считаешь количество строк, затем сравниваешь с количеством строк массиса


 
begin…end ©
 
(2004-11-19 20:45)
[15]


> [13] Anatoly Podgoretsky ©   (19.11.04 20:43)

Ну это само собой, а также, ИМХО, лучше пользоваться в таких случаях не конкретной переменной, а High(cap).


 
VitGun ©
 
(2004-11-19 20:47)
[16]

2 Anatoly Podgoretsky

Уж извините..нет. За пределы массива я не выпадаю. Сие мне известно и контроль включен. Ошибка появляется при ЗАКРЫТИИпрограммы, а не во время выполнения.


 
begin…end ©
 
(2004-11-19 20:48)
[17]


> [16] VitGun ©   (19.11.04 20:47)

Какой недоверчивый, какая разница — во время выполнения или при закрытии, программа просто злопамятная, вот и ругается только в конце.


 
VitGun ©
 
(2004-11-19 20:51)
[18]

Хм…
Полтергейтс однако… len — 1 не помогло, а вот len-2 помогло.


 
GLFox
 
(2004-11-19 20:51)
[19]


for i:=0 to len do
begin
 cap[i]:=something;
end;

Данный код не может быть верным! Индексы в динамических массивах начинаются с НУЛЯ и заканчиваются на Length(YourArray)-1.


 
VitGun ©
 
(2004-11-19 20:53)
[20]

Блин…работает…
2 begin…end & Anatoly Podgoretsky — respect. Спасибо за помощь!


 
Anatoly Podgoretsky ©
 
(2004-11-19 20:56)
[21]

VitGun ©   (19.11.04 20:47) [16]
Ой не надо отпираться от горячего, ты бы уж не проводил свой код, а теперь краснеть надо за продолжающее развешивание лапшию
Кроме того ты выполнил домашнее задание в 14, сколько у тебя получилось?


 
Anatoly Podgoretsky ©
 
(2004-11-19 20:58)
[22]

begin…end ©   (19.11.04 20:45) [15]
Ну это способ писать без ошибок, особенно если к ней добавить еще и Low


 
Palladin ©
 
(2004-11-19 20:59)
[23]


> [16] VitGun ©   (19.11.04 20:47)

ты может быть сначала вникнешь прежде чем сопротивляться… не веди себя как ламер…


 
VitGun ©
 
(2004-11-19 21:07)
[24]

2 Anatoly Podgoretsky:
[14] пост не видел — сорри.
2 Palladin.
Да понял я в чем моя ошибка. Я то был уверен, что обращаюсь к верному кол-ву элементов массива, т.е ошибка была именно в цикле.

len — есть кол-во записей в ValueListEditor. Я брал
len=ValueListEditor.RowCount-1.


Понравилась статья? Поделить с друзьями:

Читайте также:

  • Ошибка invalid partition table
  • Ошибка invalid floating point operation как исправить
  • Ошибка invalid csrf token
  • Ошибка invalid community post vk
  • Ошибка invalid captcha

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии