Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
On 12/10/2013 at 01:04, xxxxxxxx wrote:
User Information: Cinema 4D Version: r14 Platform: Language(s) : C++ ;
--------- Hi, I have been searching and trying for a while, now, but I can't get it to work to pass a variable from main (PluginStart) to my plugin, where I would like to read the value of that variable.
can someone explain how things like this work?
cheers, Ello
On 12/10/2013 at 03:09, xxxxxxxx wrote:
Hi, you could go with a global variable for PODs (int, float, char, ...) and use it wherever you want in your entire plugin.
Int my_global_variable = 0; // allowed String my_global_string; // (* ) not allowed because internal pointer table to the constructor is not build yet String* my_global_string = nullptr; // correct! Bool PluginStart() { my_global_string = NewObj(String); if (!my_global_string) return false; // your code return true; } void PluginEnd() { DeleteMem(my_global_string); }
(* ) If you want to use a c4d class you can use a global pointer like String* and allocate it in PluginStart and Free it in PluginEnd.
Or you store some values in the global data container.
Cheers, Seb
On 12/10/2013 at 04:58, xxxxxxxx wrote:
i guess i dont't understand. in my main.cpp i have declared a boolean: Bool test = false;
now i want to check this boolean inside another file (myPlugin.cpp) BaseObject *myPlugin::GetVirtualObjects(BaseObject *op, HierarchyHelp *hh) { if (test) //do something ... }
of course test is undeclared here. so my question is how can i grab the variable test inside GetVirtualObjects
On 12/10/2013 at 07:48, xxxxxxxx wrote:
You can use the extern keyword. See How do I share a variable between source files in C?
Best, -Niklas
On 12/10/2013 at 08:56, xxxxxxxx wrote:
thank you. i tried this but still i must do something wrong.
in the main.cpp i have #include "myPlugin.h"
and in myPlugin.h i have
#ifndef _myPlugin_H_ #define _myPlugin_H_ extern int myTest; enum { ...
#ifndef _myPlugin_H_ #define _myPlugin_H_
extern int myTest;
enum { ...
when i try to compile i get the following error:
1> Main.cpp 1> myPlugin.cpp 1> Creating library C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\obj\myPlugin\x64_Debug\myPlugin.cdl64.lib and object C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\obj\myPlugin\x64_Debug\myPlugin.cdl64.exp 1>Main.obj : error LNK2001: unresolved external symbol "int myTest" ([email protected]@3HA) 1>myPlugin.obj : error LNK2001: unresolved external symbol "int myTest" ([email protected]@3HA) 1>C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\myPlugin.cdl64 : fatal error LNK1120: 1 unresolved externals
i found this thread http://stackoverflow.com/questions/7004031/c-unresolved-externals but i dont understand what i need to do now...
On 12/10/2013 at 09:08, xxxxxxxx wrote:
Howdy,
Well, in everything I've read about c++ programming, there seems to be a consensus that global variables are frowned upon.
What I'd suggest is to create a static variable in your main.cpp file, and create accessor functions like this:
#include "MyPlugin.h" static bool test; bool PluginStart(void) { SetTest(false); // rest of startup functions.... } void SetTest(bool t) { test = t; } bool GetTest(void) { return test; }
Then in your main header file (MyPlugin.h or whatever your plugin is named) you prototype the accessor functions:
void SetTest(bool t); bool GetTest(void);
Then you simply include the main header file in each .cpp file where you need access to the "test" variable:
#include "MyPlugin.h" //...... if(GetTest()) { // do something }
Adios, Cactus Dan
On 12/10/2013 at 09:29, xxxxxxxx wrote:
thank you very much for the input.. still get the following error message:
1> myPlugin.cpp 1>myPlugin.obj : error LNK2001: unresolved external symbol "int __cdecl getTest(void)" ([email protected]@YAHXZ) 1>C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\myPlugin.cdl64 : fatal error LNK1120: 1 unresolved externals
the thread i mentioned earlier said it is some problem with the linker. and since all those tests result in the same error i guess it must be some general setting i am missing??
EDIT: my fault. i mixed a uppercase letter now working. many thanks !
On 12/10/2013 at 09:36, xxxxxxxx wrote:
Did you forget to include the header?
On 12/10/2013 at 09:37, xxxxxxxx wrote:
..no, it was a typo... now working
On 12/10/2013 at 09:45, xxxxxxxx wrote:
Ah! Glad it's working for you.
On 12/10/2013 at 09:46, xxxxxxxx wrote:
i am happy, too, since this helped me solve the thing with my demo version of the plugin, too
On 14/10/2013 at 12:06, xxxxxxxx wrote:
It's quite easy as Niklas suggested.
In your main.cpp:
bool your_global_variable = false; PluginStart() { your_global_variable = true; }
In any other file (e.g. myPlugin.h) :
extern bool your_global_variable; int any_function(int a, int b) //or anywhere else in this file { //do something with your_global_variable return your_global_variable ? (a + b) : (a - b); }
You don't need to include any file anywhere. You just need the declarations to make the scope see it.
Originally posted by xxxxxxxx thank you. i tried this but still i must do something wrong. in the main.cpp i have #include "myPlugin.h" and in myPlugin.h i have #ifndef _myPlugin_H_ #define _myPlugin_H_ extern int myTest; enum { ... when i try to compile i get the following error: [quote] 1> Main.cpp 1> myPlugin.cpp 1> Creating library C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\obj\myPlugin\x64_Debug\myPlugin.cdl64.lib and object C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\obj\myPlugin\x64_Debug\myPlugin.cdl64.exp 1>Main.obj : error LNK2001: unresolved external symbol "int myTest" ([email protected]@3HA) 1>myPlugin.obj : error LNK2001: unresolved external symbol "int myTest" ([email protected]@3HA) 1>C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\myPlugin.cdl64 : fatal error LNK1120: 1 unresolved externals
Originally posted by xxxxxxxx
when i try to compile i get the following error: [quote] 1> Main.cpp 1> myPlugin.cpp 1> Creating library C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\obj\myPlugin\x64_Debug\myPlugin.cdl64.lib and object C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\obj\myPlugin\x64_Debug\myPlugin.cdl64.exp 1>Main.obj : error LNK2001: unresolved external symbol "int myTest" ([email protected]@3HA) 1>myPlugin.obj : error LNK2001: unresolved external symbol "int myTest" ([email protected]@3HA) 1>C:\Program Files\MAXON\CINEMA 4D R14\plugins\myPlugin\myPlugin.cdl64 : fatal error LNK1120: 1 unresolved externals
i found this thread http://stackoverflow.com/questions/7004031/c-unresolved-externals but i dont understand what i need to do now... [/QUOTE]