2015-04-30 6 views
3

Je veux assigner une procédure de fenêtre à une structure de classe de fenêtre:Affectation d'un pointeur de fonction avec un prototype déclaré avant en Nim

var wndClass : WNDCLASS; 

wndClass.lpszClassName = CLASSNAME; 
wndClass.lpfnWndProc = WndProc; 
wndClass.hInstance  = hInstance; 

Je ne peux pas céder encore WndProc parce qu'il n'a pas été déclaré. Lorsque j'utilise une déclaration avant (décrite here):

proc WndProc(hWnd: HWND; msg: WINUINT; wParam: WPARAM; lParam: LPARAM) : LRESULT 

Je reçois cette erreur:

est ma déclaration avant de mal, ou dois-je écrire d'abord la fonction dans ce cas?

Edit:

Pour référence, le code suivant fonctionne dans le contexte global:

proc Foo : int32; 

var bar = Foo(); 
var baz = Foo; 

echo bar; 
echo baz(); 

proc Foo : int32 = 
    return 4; 

Les définitions des WNDCLASS et WNDPROC se trouve ici: http://nim-lang.org/windows.html

+0

Spéculation pure: Essayez-vous d'utiliser 'WndProc' dans la portée globale de niveau supérieur ou dans une autre fonction? Ma conjecture serait que la déclaration forward ne fonctionne qu'entre les fonctions, c'est-à-dire que la fonction 'A' peut accéder à' B' et vice versa si vous transférez l'une d'entre elles. Cela aurait du sens pour moi si l'attribution d'une fonction à une portée de niveau supérieur nécessite une définition complète. – bluenote10

+0

@ bluenote10: Voir mon edit – ilitirit

+0

Je voudrais vraiment vous aider, mais je ne pouvais tout simplement pas reproduire votre problème. Il serait utile d'avoir un exemple complet, y compris les définitions de 'WNDCLASS' et' WNDPROC'. Ou encore mieux: pouvez-vous trouver un exemple minimal, multi-plateforme, qui montre votre problème? – bluenote10

Répondre

4

Le problème était que même Bien que la définition de type WNDPROC inclue les pragmas, vous devez les répéter dans les déclarations forward.

Ce code compile:

import windows 

proc WndProc(hWnd: HWND; msg: WINUINT; wParam: WPARAM; lParam: LPARAM) : LRESULT {.stdcall.} 

var wndClass : WNDCLASS; 
wndClass.lpfnWndProc = WndProc; 

proc WndProc(hWnd: HWND; msg: WINUINT; wParam: WPARAM; lParam: LPARAM) : LRESULT = 0 

Soit dit en passant, si vous essayez de recréer le problème en incluant les types dans le fichier, il échoue à cause d'insensibilité à la casse.