Почему моя DLL Game Maker выдает нарушение прав доступа?

Я нашел руководство по созданию вашей первой C++ DLL, которую я хотел попробовать создание функции, которая вычисляет номер октавы определенной частоты. Сначала я попробовал примерную функцию, умножающую два значения, и это сработало. Затем я поместил свою вычислительную функцию, которую я сначала протестировал в стандартном проекте C++, в код DLL. Теперь, когда я хочу вызвать функцию в Game Maker, мне выдается это всплывающее окно, и когда я нажимаю кнопку OK, программа зависает. Кто-нибудь знает, что может вызвать это нарушение доступа?

Информация о компиляторе: я использую среду IDE NetBeans 7.3 в сочетании с Cygwin 4 (gcc). Скомпилировано и протестировано на Windows 7.

DLL-код:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <cstdio>
#include <windows.h>

#define GMEXPORT extern "C" __declspec (dllexport)

double A440 = 440;

GMEXPORT double __cdecl SampleFunction(double a, double b) {
    return a * b;
}

GMEXPORT int __cdecl freqGetOctave(double f) {
  double a = 12*log2(f/(A440/16))+.505;
  int c = (int)(a+9)/12;
  return c;
}

Код создателя игры:

//script: dll_init
globalvar _exmpl,_freq;
var dll_name;
dll_name = "c:\Users\<me>\Documents\NetBeansProjects\GMDLLtest\dist\Debug\Cygwin_4.x-Windows\libGMDLLtest.dll";
_exmpl = external_define(dll_name, "SampleFunction", dll_cdecl, ty_real, 2, ty_real, ty_real);
_freq  = external_define(dll_name, "freqGetOctave", dll_cdecl, ty_real, 1, ty_real);

//script: example
return external_call(_exmpl,argument0,argument1);

//script: freq_octave
return external_call(_freq,argument0);

//Watch Excpressions in Debug Screen:
example(3,3)        9
freq_octave(440)    [error popped up:]

//    [Access violation at address 00405B33 in module 'DLLtest.exe'.
//     Read of access 00000004.]

person thecatlover1996    schedule 23.01.2014    source источник
comment
типичный признак разыменования указателя NULL.   -  person    schedule 23.01.2014
comment
Одна из возможных ошибок заключается в том, что ваша функция С++ имеет тип возвращаемого значения int, но вы объявляете его как ty_real в вызове external_define. (Глядя на документацию, похоже, что вы можете использовать только reals или strings)   -  person benjymous    schedule 23.01.2014
comment
Пришло время запустить отладчик и написать тестовый пример. Для протокола: coliru.stacked-crooked.com/a/22f1a4962bd01c34   -  person Lightness Races in Orbit    schedule 23.01.2014


Ответы (1)


Относительно этих экспортируемых функций:

Функции подключаемых модулей должны иметь определенный формат. Они могут иметь от 0 до 16 аргументов, каждый из которых может быть либо действительным числом (двойным в C), либо строкой с нулем в конце. (Для более чем 4 аргументов в настоящее время поддерживаются только действительные аргументы.) Они должны возвращать либо вещественную строку, либо строку с завершающим нулем.

Ваш возвращает целое число, а не двойное. Game Maker попытается интерпретировать это целое число как двойное, что не очень хорошо.

person Lightness Races in Orbit    schedule 23.01.2014