возвращение обратного вызова дисплея opengl в D - PullRequest
1 голос
/ 25 декабря 2010

Я написал простую программу opengl hello world на D, используя преобразованные заголовки gl здесь .

Мой код:

import std.string;
import c.gl.glut;

Display_callback display()
{
    return Display_callback // line 7
    {
        return; // just display a blank window
    };
} // line 10

void main(string[] args)
{
    glutInit(args.length, args);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowSize(800,600);
    glutCreateWindow("Hello World");
    glutDisplayFunc(display);
    glutMainLoop();
}

Myпроблема с функцией display().glutDisplayFunc() ожидает функцию, которая возвращает Display_callback, который typedef'd как typedef GLvoid function() Display_callback;.Когда я пытаюсь скомпилировать, dmd говорит:

line 7: found '{' when expecting ';' following return statement
line 10: unrecognized declaration

Как мне правильно вернуть Display_callback здесь?Кроме того, как я могу изменить D строк и строковых литералов в char*?Моим звонкам на номера glutInit и glutCreateWindow не нравятся строки D, которые они получают.Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 25 декабря 2010

Вы не можете использовать вложенные функции или методы в качестве типов функций, так как они полагаются на доступность контекстной информации (стека или объекта, соответственно).Вам нужно будет использовать статическую или файловую функцию объема:

void displayEmptyWindow () {
    return;
}

Display_callback display() {
    return &displayEmptyWindow;
}

РЕДАКТИРОВАТЬ: Если вы используете D2, вы можете преобразовать строку в строку C с помощью кода, такого какследующее:

string str = "test string";

// add one for the required NUL terminator for C
char[] mutableString = new char[str.length + 1];
mutableString[] = str[];
mutableString[str.length] = '\0';

// and, finally, get a pointer to the contents of the array
char* cString = mutableString.ptr;

Если вы точно знаете, что вызываемая функция не изменит строку, вы можете немного упростить это:

someCFunction(cast(char*)toStringz(str));
0 голосов
/ 25 декабря 2010

glutDisplayFunc () ожидает, что функция, которая не принимает параметров, возвращает GLvoid (т.е. ничего). Упомянутая вами typedef создает typedef с именем Display_callback, который является типом функции, которая не принимает параметров и ничего не возвращает, например:

GLvoid myGLCallback()
{
    return; // do nothing
}
...