Page 1 of 1

undefined ref to AddData8

Posted: Sun Apr 06, 2008 7:18 pm
by scotts
Using MinGw, I keep getting the following link error
C:\Program Files\MinGWStudio\AICont\Tst1.c:134: undefined reference to `DPlot_AddData8@24'
collect2: ld returned 1 exit status


If I comment out that line, the original DPLOT call works
I include DPlot.h, x is double x[500]. I mess around with the curve argument (use 0,1, or 2) without resolution


Any advice?

Code: Select all

for(i=0; (x[i]=i)<=499; i++);
	printf("%f\n",x[499]);

			int NP=500;
			memset(&DPlot,0,sizeof(DPlot));
			DPlot.Version		= DPLOT_DDE_VERSION;
			DPlot.DataFormat	= DATA_XYXY;
			DPlot.MaxCurves		= 1;	// Must be >= number of curves we plot
			DPlot.MaxPoints		= 20000;	// Anything >= NP will do
			DPlot.NumCurves		= 1;
			DPlot.Scale			= SCALE_LINEARX_LINEARY;
			DPlot.LegendX		= 0.05f;
			DPlot.LegendY		= 0.05f;
			DPlot.NP[0]			= NP;
			//DPlot.NP[1]			= NP;
			DPlot.LineType[0]	= LINESTYLE_SOLID;
			
			DocNum = DPLOT_PLOT(&DPlot,x,x,"[ManualScale(0,-.50,1000,1000)][TickInterval(1,50,50)]"
			"[Caption(\"DPLOTLIB XY Test\")]"
			"[ClearEditFlag()]");
			for(i=0;i<500;i++)
				x[i]=i+500;
			
			//printf("%d\n", DATA_XYYY);
			
			DPlot_AddData8(DocNum,DATA_XYXY,500,0,x,x);  //THIS IS THE LINE  

Posted: Mon Apr 07, 2008 9:18 am
by DPlotAdmin
Using gcc (which I'm admittedly a complete novice with) I could never get an import library to work correctly. Your error message indicates that either you aren't using an import library at all, or you're having the same problems I did when trying to create one that would work.

If you look near the bottom of dplot.h you should see:

Code: Select all

#ifdef __GNUC__

/* With GCC we'll resolve DPLOTLIB references at runtime rather than linking to an import library...
   mainly because I can't figure out how to create an import library for GCC that works properly!    */
followed by declarations for the various DPLOTLIB functions and the dPlot_Init function, which loads the DLL and gets the addresses of those functions.

Also take a look at the WinMain procedure in any of the C demo programs. dPlot_Init is called there. No import library is used and there won't be any "unresolved external" errors.

Please let me know whether this helps or not.

Posted: Mon Apr 07, 2008 11:32 am
by scotts
I have the following in my code:

Code: Select all

#ifdef __GNUC__
	HINSTANCE dll;
    if((dll = dPlot_Init()) == NULL)
	{
		printf("LoadLibrary for DPLOTLIB.DLL failed.\n");
		exit(0);
	}
#endif
FreeLibrary(dll);
I'm getting the same error whether I link to dplotlib.dll or not.

Do I need to change this??

Posted: Mon Apr 07, 2008 12:56 pm
by DPlotAdmin
I think I overlooked something: instead of calling DPlot_AddData8 you'll want to call dPlot_AddData8 (note d vs. D). The former is the actual name of the function; the latter is a trick that makes use of LoadLibrary/GetProcAddress rather than linking to an import library.

Posted: Mon Apr 07, 2008 7:51 pm
by sseidman
That seems to have done it. Thanks. Any more of these little changes for the LoadLibrary that I might find?

Posted: Tue Apr 08, 2008 8:12 am
by DPlotAdmin
No, that's it. If you use a lower case d for all of the DPLOTLIB functions then everything should work correctly with gcc w/o linker errors.

Posted: Tue Apr 08, 2008 8:09 pm
by sseidman
Everything sort of works now. Thanks. The only problem I'm having is that calls to dPlot_AddData8 really seem to be slowing down my app, and causing data acquisition buffer overruns, even adding 50 points at a time. I know this might be a tough debug, but I thought I'd just give it a shout out in case this is something you've seen before.

Thanks again

Posted: Tue Apr 08, 2008 10:08 pm
by DPlotAdmin
Whether 50 points is a lot or not of course depends on how often you're updating.

In general, though, everything will work much better if you use the ManualScale command with any real-time plotting. If you don't do that, then DPlot must examine your data to find the mins/maxes and redraw the entire plot after every call to DPlot_AddData. If you do use ManualScale, then the plot isn't redrawn; instead only line segments between the new points are added to the existing plot. If a new X exceeds the X extents then the plot window pans to the right. For this to work, though, you of course need to have a rough idea of what your Y extents will be.

You will probably also want to turn off antialiasing, which is a real performance hog. To turn it off use [GeneralOptions(32,0)].

Posted: Wed Apr 09, 2008 7:47 am
by sseidman
This seems much closer!

I get a big dwell right at the beginning of my Data Acquisition, and then everything seems to be catching up nicely. I'm wondering if the original call to DPLOT takes a bunch of time after the graph is already up, and dPlot_AddData8 is actually quite speedy. I'll try putting in a sizable dwell after the first DPLOT call before starting Data Acquisition. Seems much more promising than things looked yesterday.

Thanks again. Looks to be a wonderful application for my needs.

Posted: Wed Apr 09, 2008 8:22 am
by sseidman
The dwell seems to have done it. It needs to be somewhere between 30 and 50 seconds, and after that Add_Data seems quite able to keep up with at least 10 updates of 50 points per second.

Posted: Wed Apr 09, 2008 8:44 am
by DPlotAdmin
The dwell seems to have done it. It needs to be somewhere between 30 and 50 seconds,...
I can't imagine why you'd need to put your app to sleep for 30 seconds with an XY plot. DPlot does go through a lot of initialization at startup, but certainly not 30 seconds' worth. Are you sure that there isn't some sort of timing issue causing your app to make many identical calls to DPlot_AddData with that first step?

Posted: Wed Apr 09, 2008 10:36 am
by sseidman
I have a few different library calls from different libraries, and I have a feeling the loads are interfering with each other, and I have to wait while all this is being sorted out. I'm using National Instruments Daqmx drivers, and they seem to work nicely enough when they have the whole thread to themselves, but they don't seem to be playing nicely with others.

I know I should probably work on preloading all of these libraries, and not sleep in my main thread, but I'm not a great c programmer. I don't even know if the whole library gets loaded at linking, or whether everything gets resolved at the first call to the library (seems like the latter, though).

Anyhow, I moved my app to a function generator, and it's working pretty well. Thanks for all the help. I do notice a hiccup when I Add_Data8 that lies outside of the manually set y-axis range. It's easy enough for me to clip the plotted data to the manual range, but I'm passing the info along for development purposes.

As a next step, I think I'll grab control of the x-axis values and try to make the data scroll a bit more smoothly, instead of falling off the axis and jumping a half screen at a time. Looks like this will be a breeze.

Posted: Wed Apr 09, 2008 10:52 am
by DPlotAdmin
As a next step, I think I'll grab control of the x-axis values and try to make the data scroll a bit more smoothly, instead of falling off the axis and jumping a half screen at a time. Looks like this will be a breeze.
Before spending too much time on that see the SetPanFraction command - that might do what you want.