www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Real Simple Question?

reply WhatMeWorry <kheaser gmail.com> writes:
This is probably so simple that there's no example anywhere.

Basically, I've got a huge array definition (see below) which I 
reuse over and over again in different projects.

GLfloat[] vertices =
[
     // Positions          // Texture Coords
     -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
      0.5f, -0.5f, -0.5f,  1.0f, 0.0f,
                  .....
              (lots and lots of values)
                  .....

I'd like to place this one array into a separate file and just 
include it with a one line statement in many projects.  I'm 
thinking mixins and/or imports but then if I knew how to do this, 
I wouldn't be asking.

Thanks in advance.
Oct 22 2016
parent reply Jonathan M Davis via Digitalmars-d-learn writes:
On Saturday, October 22, 2016 20:35:27 WhatMeWorry via Digitalmars-d-learn 
wrote:
 This is probably so simple that there's no example anywhere.

 Basically, I've got a huge array definition (see below) which I
 reuse over and over again in different projects.

 GLfloat[] vertices =
 [
      // Positions          // Texture Coords
      -0.5f, -0.5f, -0.5f,  0.0f, 0.0f,
       0.5f, -0.5f, -0.5f,  1.0f, 0.0f,
                   .....
               (lots and lots of values)
                   .....

 I'd like to place this one array into a separate file and just
 include it with a one line statement in many projects.  I'm
 thinking mixins and/or imports but then if I knew how to do this,
 I wouldn't be asking.

 Thanks in advance.
Just put it in a separate module and then import it. e.g. file: mypackage/constants.d ================== module mypackage.constants; GLfloat[] vertices = [ // Positions // Texture Coords -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, ..... (lots and lots of values) ..... ]; ================== file: main.d ================== import mypackage.constants; void main() { auto v = vertices; } ================== Probably the key thing to remember is that when you compile your program, all of the modules that are part of your program rather than a separate library need to be compiled into it. Simply importing them isn't enough - though using either rdmd or dub make that easier. This is the official documentation's page on modules: http://dlang.org/spec/module.html This is the chapter from Al's book that covers modules: http://ddili.org/ders/d.en/modules.html And you'd almost certainly benefit from simply reading Ali's book as a whole: http://ddili.org/ders/d.en/index.html - Jonathan M Davis
Oct 22 2016
parent reply WhatMeWorry <kheaser gmail.com> writes:
On Saturday, 22 October 2016 at 20:51:14 UTC, Jonathan M Davis 
wrote:
 On Saturday, October 22, 2016 20:35:27 WhatMeWorry via 
 Digitalmars-d-learn wrote:
 [...]
Just put it in a separate module and then import it. e.g. file: mypackage/constants.d ================== module mypackage.constants; GLfloat[] vertices = [ // Positions // Texture Coords -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, ..... (lots and lots of values) ..... ]; ================== file: main.d ================== import mypackage.constants; void main() { auto v = vertices; } ================== Probably the key thing to remember is that when you compile your program, all of the modules that are part of your program rather than a separate library need to be compiled into it. Simply importing them isn't enough - though using either rdmd or dub make that easier. This is the official documentation's page on modules: http://dlang.org/spec/module.html This is the chapter from Al's book that covers modules: http://ddili.org/ders/d.en/modules.html And you'd almost certainly benefit from simply reading Ali's book as a whole: http://ddili.org/ders/d.en/index.html - Jonathan M Davis
Ok, but now I'm getting these error in my new mypackage/constants.d ..\common\vertex_data.d(5,15): Error: undefined identifier 'GLfloat' ..\common\vertex_data.d(53,12): Error: undefined identifier 'vec3' Is there a way to just suck in the text from say a .txt file that would not be compiled before inclusion in main.d?
Oct 22 2016
next sibling parent Jonathan M Davis via Digitalmars-d-learn writes:
On Saturday, October 22, 2016 21:34:36 WhatMeWorry via Digitalmars-d-learn 
wrote:
 Ok, but now I'm getting these error in my new
 mypackage/constants.d

 ..\common\vertex_data.d(5,15): Error: undefined identifier
 'GLfloat'
 ..\common\vertex_data.d(53,12): Error: undefined identifier 'vec3'
mypackage/constants.d needs to import the modules for any of the types it's using, otherwise it doesn't know about them. Modules are not textually included like header files are in C++ (compilation times would be _way_ worse if they were), so a module only has access to what it imports, and it's not affected by anything that imports it.
 Is there a way to just suck in the text from say a .txt file that
 would not be compiled before inclusion in main.d?
String imports is a feature, but then you end up with multiple copies of the array in your program instead of one, and string imports are almost always the wrong solution. - Jonathan M Davis
Oct 22 2016
prev sibling next sibling parent tcak <1ltkrs+3wyh1ow7kzn1k sharklasers.com> writes:
On Saturday, 22 October 2016 at 21:34:36 UTC, WhatMeWorry wrote:
 On Saturday, 22 October 2016 at 20:51:14 UTC, Jonathan M Davis 
 wrote:
 [...]
Ok, but now I'm getting these error in my new mypackage/constants.d ..\common\vertex_data.d(5,15): Error: undefined identifier 'GLfloat' ..\common\vertex_data.d(53,12): Error: undefined identifier 'vec3' Is there a way to just suck in the text from say a .txt file that would not be compiled before inclusion in main.d?
You could format your array in JSON format, and read it in your program. That could be another solution.
Oct 25 2016
prev sibling parent Steven Schveighoffer <schveiguy yahoo.com> writes:
On 10/22/16 5:34 PM, WhatMeWorry wrote:
 On Saturday, 22 October 2016 at 20:51:14 UTC, Jonathan M Davis wrote:
 On Saturday, October 22, 2016 20:35:27 WhatMeWorry via
 Digitalmars-d-learn wrote:
 [...]
Just put it in a separate module and then import it. e.g. file: mypackage/constants.d ================== module mypackage.constants; GLfloat[] vertices = [ // Positions // Texture Coords -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, ..... (lots and lots of values) ..... ];
I would make this: immutable GLfloat[] vertices If you can do it. This will make it so it's a) accessible from pure functions, and b) will not create a separate thread-local copy for each thread (if you use threading).
 Ok, but now I'm getting these error in my new mypackage/constants.d

 ...\common\vertex_data.d(5,15): Error: undefined identifier 'GLfloat'
 ...\common\vertex_data.d(53,12): Error: undefined identifier 'vec3'
It's difficult to know why without more code hints, but it appears that vertex_data.d needs to import the module that defines these types. Note that if you want to have an imported module provide these definitions from another module, then you need to public import the module. So for instance (guessing at your code, since I don't know what you have for import statements): mypackage/my_types.d: alias GLfloat = float; alias vec3 = GLfloat[3]; mypackage/constants.d: public import mypackage.my_types; // this allows importers of constants.d to see the types used GLfloat[] vertices = ... vertex_data.d: import mypackage.constants; // pulls in definitions from my_types.d -Steve
Oct 25 2016