AngelHunter Posted April 10, 2006 Report Share Posted April 10, 2006 I need to call a single CIN multiple times in a loop and the second time it doesn't finish but the program crashes. i think it is because of memory allocation problems. the first call is OK, only the second is troublesome. could somebody plz explain how i can allocate enough memory or somehow else solve this problem? thank you very much Quote Link to comment
crelf Posted April 10, 2006 Report Share Posted April 10, 2006 could somebody plz explain... Post your code and we might be able to offer suggestions. Quote Link to comment
AngelHunter Posted April 10, 2006 Author Report Share Posted April 10, 2006 first of all, I have some global data, in it 2 structures typedef struct { LVBoolean status; int32 code; LStrHandle source; } LVError; typedef struct { int32 dimSizes[2]; float64 arg1[1]; } LVpotty; typedef LVpotty **LVpottyHdl; the first is the error handler, the second is a simple labview array double toltes[120][3]; //this is an array in which i collect the data and then tranform it to a labview type array and pass it through the CIN in the CINInit I have place calls that start up the device i will be using, these are calls to functions in the device's SDK the ints and floats in the CINRun routine are values whose value is decided in the CINInit() LVpottyHdl potty - this is the struct above, the array VError *zebriserror - is error handling CIN MgErr CINRun(int32 *lchannelcount, float64 *latomduration, float64 *lfrequency, int32 *lmotionquantsperatom, LVpottyHdl potty, float64 *kijelzo, LVError *zebriserror) { zebriserror->status = LVTRUE; // means there is no error *lchannelcount = motionChannelCount; // decided in CINInit *latomduration = atomDuration; *lmotionquantsperatom = motionQuantsPerAtom; *lfrequency = motionQuantsPerAtom/atomDuration; // start the device //this is maybe where the problem is. if i don't use the activate flag //than the program stops here and it sais that the current configuration //won't allow this to execute (error handling tells me) //so when i put this in, the second time this CIN executes, it just crashes if (active==false) { active = true; if (!ZebDevice_Start(device)) goto __end; } if (!motionFeed(1)) //call the routine that gathers the data goto __end; k = 6/motionChannelCount; //determines how many data a sensor has (it can be adjusted...) *kijelzo = k; // fill up the out array, and in order for (i=0; i<6; i++) switch (i % motionChannelCount){ case 0: for(j=0; j<3; j++) (**potty).arg1[i/motionChannelCount*3 + j] = toltes[j]; break; case 1: for(j=0; j<3; j++) (**potty).arg1[k*3 + i/motionChannelCount*3 + j] = toltes[j]; break; case 2: for(j=0; j<3; j++) (**potty).arg1[k*6 + i/motionChannelCount*3 + j] = toltes[j]; break; case 3: for(j=0; j<3; j++) (**potty).arg1[k*12 + i/motionChannelCount*3 + j] = toltes[j]; break; case 4: for(j=0; j<3; j++) (**potty).arg1[k*24 + i/motionChannelCount*3 + j] = toltes[j]; break; case 5: for(j=0; j<3; j++) (**potty).arg1[k*48 + i/motionChannelCount*3 + j] = toltes[j]; break; } // stop the device if (!ZebDevice_Stop(device)) goto __end; zebriserror->status = LVFALSE; // there was no error __end: if (device) ZebDevice_Release(device); if (zebriserror->status) //error handling { const char *cerrorstr = Zeb_GetLastError(); int32 length = strlen(cerrorstr); if (cinerror = NumericArrayResize(uB, 1L, (UHandle*)&zebriserror->source, length)) goto out; LStrLen(*zebriserror->source) = length; MoveBlock((const void*)cerrorstr, LStrBuf(*zebriserror->source), length); } return noErr; out: return cinerror; } BOOL motionFeed(int atomCount) //the main data gathering routine { if (!motionInput) return TRUE; const ZebVector3* pos[MAX_MOTION_CHANNELS]; for(int ch = 0; ch < motionChannelCount; ch++) { if (!ZebMotionChannel_GetPos(motionChannels[ch], &pos[ch])) return FALSE; } for(int ctr = atomCount*motionQuantsPerAtom; ctr--; ) { for(int ch = 0; ch < motionChannelCount; ch++) { const ZebVector3* v = pos[ch]++; //this is where i fill up the array (a global array) toltes[szamlalo][0] = v->x; toltes[szamlalo][1] = v->y; toltes[szamlalo][2] = v->z; szamlalo++; } } return TRUE; } i tried using a dynamic array but then labview crashed even on the first run... Quote Link to comment
orko Posted April 10, 2006 Report Share Posted April 10, 2006 // start the device//this is maybe where the problem is. if i don't use the activate flag //than the program stops here and it sais that the current configuration //won't allow this to execute (error handling tells me) //so when i put this in, the second time this CIN executes, it just crashes if (active==false) { active = true; if (!ZebDevice_Start(device)) goto __end; } if (!motionFeed(1)) //call the routine that gathers the data goto __end; k = 6/motionChannelCount; //determines how many data a sensor has (it can be adjusted...) *kijelzo = k; // fill up the out array, and in order for (i=0; i<6; i++) switch (i % motionChannelCount){ .... In the above code, I have two questions. 1) I'm unclear on where the variable "active" is defined 2) The "for (i=0; i<6; i++)" line above your switch statement seems to be a left over snippet of code, as if someone copied/pasted a line out of place on accident (not that I have ever done this...only a few hundred times). Hope this helps... I'm a little rusty with C, but those two things jumped out at me. Joe (orko) Quote Link to comment
AngelHunter Posted April 11, 2006 Author Report Share Posted April 11, 2006 active is defined as a global variable, to keep its value when the CIN runs again and the second question is right, i will fix it now.... no, i think it's all right. also, i deleted it and the problem persists.... Quote Link to comment
Gudrun Posted June 6, 2006 Report Share Posted June 6, 2006 active is defined as a global variable, to keep its value when the CIN runs againand the second question is right, i will fix it now.... no, i think it's all right. also, i deleted it and the problem persists.... Did you solve the problem by now or found the perfect reference? The same happens with me, but with a dll call. I'm quite sure there's no memory leak or so. Would be really interested... Thanks, Gudrun Quote Link to comment
Mike Ashe Posted June 8, 2006 Report Share Posted June 8, 2006 You mentioned that it crashes the second time through the loop. I assume that it happens the same way if you run two copies, one after the other in a flat sequence. Also, what compiler are you using? Quote Link to comment
Rolf Kalbermatter Posted June 12, 2006 Report Share Posted June 12, 2006 Did you solve the problem by now or found the perfect reference? The same happens with me, but with a dll call. I'm quite sure there's no memory leak or so. Would be really interested... If you get this kind of error when calling DLLs then you are doing something wrong in the Call Library Node configuration. Show us the prototype(s) of your function(s) and the according VIs then we might be able to help you point out possible problems. Rolf Kalbermatter Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.