Dynamically create memory based on 2 different struture templates
-
We have a MFC application with a structure that constitutes int, float and char array members. We have declared a global pointer to this struture. This application creates a shared memory using createfilemapping function and assigns the shared memory to this global variable using mapviewfile function. The same structure is used in a console application1 which is used for doing certain calculations. This console application shares the memory created by the MFC application using openfilemapping and mapviewfile functions. I want to create another console application2 in which the dimension of the array members of the struture to be modified. If I run the MFC application based on the selection 1 dynamically, it should create the shared memory for console application1. Similarly for selection 2 dynamically, the MFC application has to create shared memory for console application2. Please suggest me how to do it dynamically when I run the MFC application Note: When the MFC application is run, it invokes the console application after creating the shared memory. It invokes one console application during its each run based on the user selection.
-
We have a MFC application with a structure that constitutes int, float and char array members. We have declared a global pointer to this struture. This application creates a shared memory using createfilemapping function and assigns the shared memory to this global variable using mapviewfile function. The same structure is used in a console application1 which is used for doing certain calculations. This console application shares the memory created by the MFC application using openfilemapping and mapviewfile functions. I want to create another console application2 in which the dimension of the array members of the struture to be modified. If I run the MFC application based on the selection 1 dynamically, it should create the shared memory for console application1. Similarly for selection 2 dynamically, the MFC application has to create shared memory for console application2. Please suggest me how to do it dynamically when I run the MFC application Note: When the MFC application is run, it invokes the console application after creating the shared memory. It invokes one console application during its each run based on the user selection.
-
You could declare the second structure in the same global space using a
union
. That way your global structure does not change for the existing application.To make my question more specific Is it possible to dynamically create a single global pointer to 2 different structures based on the selection, one at a time. For Example: If pt is the pointer and struct1 and struct2 are the 2 different structures. if x = 0 then pt refers struct1 else pt refers struct2 Here Pt will be used throughout my application lot many times and places and I dont want to use 2 different pointers. If it is possible, Please provide me the steps of how to do it. Or please suggest some ways to meet my requirement
-
To make my question more specific Is it possible to dynamically create a single global pointer to 2 different structures based on the selection, one at a time. For Example: If pt is the pointer and struct1 and struct2 are the 2 different structures. if x = 0 then pt refers struct1 else pt refers struct2 Here Pt will be used throughout my application lot many times and places and I dont want to use 2 different pointers. If it is possible, Please provide me the steps of how to do it. Or please suggest some ways to meet my requirement
Yes it is possible but now you need another global variable to tell which structure it points to. Better to have some flag in the structure, preferably the first item, which tells the rest of the code which one it is. But really using global ob jects/pointers in this way is not good design.
-
Yes it is possible but now you need another global variable to tell which structure it points to. Better to have some flag in the structure, preferably the first item, which tells the rest of the code which one it is. But really using global ob jects/pointers in this way is not good design.
If I am going to have a single pointer which will dynamically point to any of the 2 structures based on the user selection, then what should be pointer type defined...struct1 or struct2 or void I have to define the pointer type while I code and point it to any of the strutures dynamically based on the user selection which is mostly one time. After the selection is done, the pointer will point to the selected structure throughout the application run.
-
If I am going to have a single pointer which will dynamically point to any of the 2 structures based on the user selection, then what should be pointer type defined...struct1 or struct2 or void I have to define the pointer type while I code and point it to any of the strutures dynamically based on the user selection which is mostly one time. After the selection is done, the pointer will point to the selected structure throughout the application run.
-
You could declare the second structure in the same global space using a
union
. That way your global structure does not change for the existing application.Can you please give me a small example of declaring the second struture in the same global space using union. Let me provide an example of the 2 structures that I use in my application struct test1 { int x[3000]; float y[2000]; char z[3000]; int a1[3000]; float a2[2000]; char b1[3000]; float c12[5000]; This member is not in test2 . . . }; struct test2 { int x[4000]; //Same member as in test1 with size increased float y[1000]; //Same member as in test1 with size decreased char z[5000]; //Same member as in test1 with size increased int a1[2500]; //Same member as in test1 with size decreased float a2[1000];//Same member as in test1 with size decreased char b1[3000];//Same member as in test1 float abc[5000]; //Newly added in this structure only . . . };
-
Can you please give me a small example of declaring the second struture in the same global space using union. Let me provide an example of the 2 structures that I use in my application struct test1 { int x[3000]; float y[2000]; char z[3000]; int a1[3000]; float a2[2000]; char b1[3000]; float c12[5000]; This member is not in test2 . . . }; struct test2 { int x[4000]; //Same member as in test1 with size increased float y[1000]; //Same member as in test1 with size decreased char z[5000]; //Same member as in test1 with size increased int a1[2500]; //Same member as in test1 with size decreased float a2[1000];//Same member as in test1 with size decreased char b1[3000];//Same member as in test1 float abc[5000]; //Newly added in this structure only . . . };
-
Can you please give me a small example of declaring the second struture in the same global space using union. Let me provide an example of the 2 structures that I use in my application struct test1 { int x[3000]; float y[2000]; char z[3000]; int a1[3000]; float a2[2000]; char b1[3000]; float c12[5000]; This member is not in test2 . . . }; struct test2 { int x[4000]; //Same member as in test1 with size increased float y[1000]; //Same member as in test1 with size decreased char z[5000]; //Same member as in test1 with size increased int a1[2500]; //Same member as in test1 with size decreased float a2[1000];//Same member as in test1 with size decreased char b1[3000];//Same member as in test1 float abc[5000]; //Newly added in this structure only . . . };
Seriously it's trivial .. 6 lines of code as combined struct under your other 2 definitions
struct combined_test {
union {
struct test1 test1;
struct test2 test2;
}; /* you can place a name before the ; if you want a named union */
};Read the link he gave you or look up unionized structures So that is an anonymous union.. AKA struct test1 and test2 occupy the same space no extra name needed. So if you create a combined struct
struct combined_test lets_use_it; /* allocate a combined struct called lets_use_it */
/* to access it as struct1 */
lets_use_it.test1.z[100] = 10;
/* to access it as struct2 */
lets_use_it.test2.z[100] = 10;
lets_use_it.test1.c12[23] = 10; /* valid but if you try test2.c12 wont work, no such field in struct test2 */Where it fills in will respect the position in memory layout of test1.z[100] vs test2.z[100] Now for your pointer it behaves like a pointer to both structs .. again it's UNIONIZED
struct combined_test* p = (struct combined_test*) malloc(sizeof(struct combined_test));
p->test2.z[100] = 32;
p->test1.z[100] = 55;No rocket science to it and make a sample and debug it if you need to check things.
In vino veritas
-
Seriously it's trivial .. 6 lines of code as combined struct under your other 2 definitions
struct combined_test {
union {
struct test1 test1;
struct test2 test2;
}; /* you can place a name before the ; if you want a named union */
};Read the link he gave you or look up unionized structures So that is an anonymous union.. AKA struct test1 and test2 occupy the same space no extra name needed. So if you create a combined struct
struct combined_test lets_use_it; /* allocate a combined struct called lets_use_it */
/* to access it as struct1 */
lets_use_it.test1.z[100] = 10;
/* to access it as struct2 */
lets_use_it.test2.z[100] = 10;
lets_use_it.test1.c12[23] = 10; /* valid but if you try test2.c12 wont work, no such field in struct test2 */Where it fills in will respect the position in memory layout of test1.z[100] vs test2.z[100] Now for your pointer it behaves like a pointer to both structs .. again it's UNIONIZED
struct combined_test* p = (struct combined_test*) malloc(sizeof(struct combined_test));
p->test2.z[100] = 32;
p->test1.z[100] = 55;No rocket science to it and make a sample and debug it if you need to check things.
In vino veritas
Thanks a lot. You have answered and explained what I had asked for. But I have a few hurdles to implement it. I already have created the MFC application with a single structure defined in it. The global variable pointer for this structure struct1 is created and used through out the application. As I had already said this MFC application invokes a console application at a time based on the user selection. There are many nearly some 1000 console applications which already are working. The MFC application creates a shared memory using CreateFileMapping and assigns the structure struct1 pointer to MapViewOfFile. The console application shares the same memory using the same struct1. So the same pointer name is used in both the MFC and all the console applications at many places. Now my requirement is I have to increase the size and add some of the members in the struct1 to create struct2 for some of the console applications. So Now there will be some console applications that have struct1 and others have struct2. But the MFC application is a common application which invokes any particular console applications based on the selection. But there will be one mfc application and console application running at a time and sharing the memory. So If the MFC application invokes console application of type1 it should create a memory for struct1 and it creates memory for struct2 for console application of type2. The MFC application knows the type of console application at runtime and the pointer to be changed to point to either struct1 or struct2. And the pointer is already used in many many places in various console applications. Is there a way in the mfc application to redefine the global pointer at runtime to make it point to struct1 or struct2 based on the console application type. Eg: test->a[1000] = 23; //This usage code cannot be changed since used in many places Note: Only common member variables are used in the MFC application. Hence the above line in the example will work for struct1 as well as for struct2 as both contains the member variable 'a' of the same type
-
Thanks a lot. You have answered and explained what I had asked for. But I have a few hurdles to implement it. I already have created the MFC application with a single structure defined in it. The global variable pointer for this structure struct1 is created and used through out the application. As I had already said this MFC application invokes a console application at a time based on the user selection. There are many nearly some 1000 console applications which already are working. The MFC application creates a shared memory using CreateFileMapping and assigns the structure struct1 pointer to MapViewOfFile. The console application shares the same memory using the same struct1. So the same pointer name is used in both the MFC and all the console applications at many places. Now my requirement is I have to increase the size and add some of the members in the struct1 to create struct2 for some of the console applications. So Now there will be some console applications that have struct1 and others have struct2. But the MFC application is a common application which invokes any particular console applications based on the selection. But there will be one mfc application and console application running at a time and sharing the memory. So If the MFC application invokes console application of type1 it should create a memory for struct1 and it creates memory for struct2 for console application of type2. The MFC application knows the type of console application at runtime and the pointer to be changed to point to either struct1 or struct2. And the pointer is already used in many many places in various console applications. Is there a way in the mfc application to redefine the global pointer at runtime to make it point to struct1 or struct2 based on the console application type. Eg: test->a[1000] = 23; //This usage code cannot be changed since used in many places Note: Only common member variables are used in the MFC application. Hence the above line in the example will work for struct1 as well as for struct2 as both contains the member variable 'a' of the same type
First let me say you are making a mountain out of a molehill ... "test->" is a dead easy string to pick off with a text auto-replace on. Would take me about 30sec to do on code throughout the project. You could also do what a good programmer would do and get rid of the stupid global pointer and pass it into the functions on the local interface. You can keep it as test on the local interface but pass in lets_use_it.test1. You make your code better, safer and it is simply extending a few local interfaces. That is what I would actually do .. globals are evil :-) The question to ask yourself is why are you using the global pointer rather than having a pointer parameter on the functions that use the global? That all said you could keep the pointer "as is" if you want by typecasting but it is frowned on :-(
struct test1* test = lets_use_it.test1; /* Is perfectly valid */
In vino veritas