Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232

ПРоблема с компиляцией

18.04.2013, 13:53. Показов 2634. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дело такое, при запуске программы в режиме отладки программа работает отлично, как задумано. но если эту же программу запустить вне делфи, просто как exe, то при выполнении некоторых функций возникает ошибка. Ума не приложу что может быть не так с программой, в режиме отладки ошибку отследить невозможно, так как ошибка возникает только при запуске вне делфи! ПРичем я уже писал подобную программу с подобным функционалом, она выполняет эту функцию вне делфи без ошибок, хотя там почти все тоже самое!

Даже знаю с конкретно какой функцией возникает ошибка, WriteBinaryLong. Это специфичная функция, смысла ее значения объяснять нет, но у нее есть 3 входных параметра, два PSafeArray и один символ типа byte. Байт я указываю напрямую, а вот безопасные массивы высчитываются по спец алгоритмам. Ошибка возникает из-за неправильности входных параметров, виноваты могут в этом быть только эта массивы. В режиме отладки эти входные параметры получаются верными, проверял. А вот если запустить просто exe, то что-то становится не так с этими массивами и вылетает ошибка!

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

Delphi
1
2
3
4
5
6
7
8
9
10
var
StringData: String;
Data, Blocks: PSafeArray;
const Mass: array [0..2] of Byte = (1, 2, 3);
 
begin
Data := Str2ByteArray(StringData);
Blocks := SafeArrayFromByteArray (@Mass, 3);
WriteBinaryLong (Blocks, 0, Data);
end;
У меня получилось решить проблему следующим способом:

Delphi
1
2
3
4
5
6
7
var
StringData: String;
const Mass: array [0..2] of Byte = (1, 2, 3);
 
begin
WriteBinaryLong (SafeArrayFromByteArray (@Mass, 3), 0, Str2ByteArray(StringData));
end;
Я просто напрямую задал входные данные. Теперь программа работает нормально и вне делфи. Вот только я понять не могу, в чем косяк может быть? ПРичем я всегда юзал эту функцию так, как писал в первом варианте и всегда работало нормально. Я еще специально сохранял разные копии моей проги и на раннем этапе моя прога работала нормально по первому варианту а потом начала твориться вот такая фигня. Кто нибудь имеет какие нибудь предположения почему так происходит?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2013, 13:53
Ответы с готовыми решениями:

Проблема с компиляцией
Приветствую У меня такая проблема при создании своей игры я смотрел много уроков, читал много форумов и везде при компиляции игры на...

Проблема с компиляцией
Проблема: не получается устранить синтаксическую ошибку. Помогите сделать так, чтобы программа компилировалась (устранить синтаксическую...

Проблема с компиляцией...
Скачал INN с ftp://ftp.isc.org/isc/inn/inn-2.4.6.tar.gz 1. Распаковал. 2. Начал конфигурировать ./configure 2.1. или просто с...

6
332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
18.04.2013, 15:20
try except поможет найти конкретное место возникновения ошибки
0
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
18.04.2013, 15:58  [ТС]
Цитата Сообщение от xNeKiToSx Посмотреть сообщение
try except поможет найти конкретное место возникновения ошибки
Я им и так активно пользуюсь, этот код как раз таки и стоит между try except. Проблема в том, что в режиме отладки никаких ошибок не возникает, программа работает идеально! А если ее запустить вне делфи, то возникает ошибка ввода, программа указывает на конкретный номер ошибки, то есть срабатывает try except. Это ошибка неправильных входных данных именно этой функции. Вопрос в том, почему в режиме отладки программа работает верно, а по простому запуску нет?? Как такое вообще возможно? Еще нужно учесть то, что функция вызывается по процедуре и ее входные переменные не глобальные, а объявляются внутри процедуры. То есть мне вообще не понятно как портятся данные в этих переменных.

П.С. Пользуюсь Делфи 7.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,908
Записей в блоге: 12
18.04.2013, 16:11
Если не показываешь реализацию SafeArrayFromByteArray и Str2ByteArray (как минимум) - то тебе надо обращаться на форум экстрасенсов и телепатов. Смотря что ты там накрутил...
0
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
18.04.2013, 16:41  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Если не показываешь реализацию SafeArrayFromByteArray и Str2ByteArray (как минимум) - то тебе надо обращаться на форум экстрасенсов и телепатов. Смотря что ты там накрутил...
Str2ByteArray работает 99.9% верно, это функция из специализированного SDK. Она выполняется через COM интерфейс, я даже не знаю как ее можно посмотреть!

А вот SafeArrayFromByteArray. но она точно не причем, так как в аналогичной функции ReadBinarylong, где она так же используется, ошибок никаких нет.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function SafeArrayFromByteArray(pba: PByteArray; baSize: Integer) : PSafeArray;
var
  bound: SAFEARRAYBOUND;
  psa: PSafeArray;
  pdata: pointer;
begin
  bound.cElements := baSize;
  bound.lLbound := 1;
  psa:=SafeArrayCreate(varByte,1,bound);
  if psa=nil then
     raise EOutOfMemory.Create('Safe array create failed');
  SafeArrayAccessData(psa,pdata);
  CopyMemory(pdata,pba,bound.cElements);
  SafeArrayUnaccessData(psa);
  SafeArrayFromByteArray:=psa;
end;
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
18.04.2013, 16:49
на сколько я понимаю SafeArrayFromByteArray безопасно переводит в массив байт, в качестве аргументов хочет адрес, с которого начинаются данные и количество этих данных (в штуках байт).... так зачем ей подсовывать указатель на начало массива (который не есть начало данных в Delphi), а не начало самих данных? может стоит как-то так
Delphi
1
SafeArrayFromByteArray (@Mass[0], 3);
или я в чем-то ошибаюсь?
0
7 / 7 / 1
Регистрация: 21.10.2012
Сообщений: 232
19.04.2013, 06:51  [ТС]
В общем я нашел причину такого странного поведения программы, я допустил в коде очень глупую ошибку. Код, который представлен ниже выполняется перед тем кодом, который я отправлял в первом посту (включил его в код ниже).

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
StringData: String;
Data, Blocks, KeyA, KeyB: PSafeArray;
const Mass: array [0..2] of Byte = (1, 2, 3);
 
begin
  try
  //другая прога оперирующая KeyA и KeyB
  finally
    SafeArrayDestroy(KeyA);
    SafeArrayDestroy(KeyA);
  end;
  try
    Data := Str2ByteArray(StringData);
    Blocks := SafeArrayFromByteArray (@Mass, 3);
    WriteBinaryLong (Blocks, 0, Data);
  finally
    SafeArrayDestroy(Data);
    SafeArrayDestroy(Blocks);
  end;
end;
Косяк в том, что я 2 раза подряд уничтожил KeyA (скопировал предыдущую строчку, но забыл поправить на КеуВ)и из-за этого возникает какой-то сбой в памяти и далее все PSafeArray начинают формироваться неверно. Самое интересное, что он возникает только при запуске вне делфи и только на винде ХР, на семёрке программа все равно продолжает работать нормально в любом случае. Но на хрюше эту ошибку отследить не удается, так как в режиме отладки программа работает отлично! В общем это яркий пример, к чему может привести подобная глупая ошибка =))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2013, 06:51
Помогаю со студенческими работами здесь

Проблема с компиляцией
Добрый вечер, при попытке компиляции программы у меня вылазит ошибка о том, что файл (в моём случаеproga.asm)не найден, хотя путь указан...

Проблема с компиляцией
Здравствуйте. Такая проблема. При компиляции возникает такая ошибка, как "Имя файла или его расширение имеет слишком большую длину"....

Проблема с компиляцией (help)
установил С++ 6.0 , но что то проблемный какой то jmu debug > go (v otvet ) this file does not exist. yes want to build it > file not...

Проблема с компиляцией
Сегодня начал изучать C++ Скачал инсталлятор MinGW отсюда: ...

проблема с компиляцией
уважаемые форумчане есть программы компилировал в Microsoft Visual Studio 2010 Ultimate и в Microsoft Visual Studio 2010 Express и не в...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru