DPlot Forum Index DPlot
http://www.dplot.com
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Serious Problem using Dplot

 
Post new topic   Reply to topic    DPlot Forum Index -> C, C++, C#
View previous topic :: View next topic  
Author Message
ecas



Joined: 08 Feb 2009
Posts: 4

PostPosted: Wed Feb 11, 2009 1:18 pm    Post subject: Serious Problem using Dplot Reply with quote

hello david. i'm experiencing a serious error when using Dplot to do a 3D surface. It's not easy to explain, and i've tried basically everything so i'll just show you some code to see if you could help me.

Just some important info: i'm using VS 2005 c++ express edition, and running vista32 business, programing in C.
i'm copied the dplotlib.lib and the dplotlib.dll to my project folder.
i have dplot installed on c:\programfiles\dplot\.

My project is this: receive a 1023 bits signal, sample it with 5000 samples.
after this, use Correlation in the time domain and in the freq domain correlating this 5000 signal with local replicas stored (41 diffferent replicas).

Basically i 1st create two 2D arrays with [41][5000]
Code:

double *array_time[41], *array_freq[41]; (global variables)

double *result_time[41]; //correlation result, explained later



Then on the load method, i fill them with my data:

Code:

for(a=0; a<41;a++){ //41 lines, each one with 5000 doubles
   array_time[a] = (double*) malloc(sizeof(double) * 5000);
}
for(a=0; a<41;a++){
array_freq[a] = (double*) malloc(sizeof(double) * 5000);
}

//then i call both loaders:
time_loader(array_time,signal_array);
freq_loader(array_freq,signal_array);


After loading, i'm in this moment only using Time Domain Correlation so:
The actual method:
Code:

//create the 2D array to store the results
//it will only store the Z component
for(i = 0; i != 41; i++)
{
           result_time[i] = (double*) malloc(sizeof(double) * 5000);
}

//correlation method
for(i=0; i <41 ; i++){

      for (k = 0; k < 5000; k++)
      {
         result_time[i][k] = timeCorrelation(sample_signal,array_time[i],sample_array_size, k);
      
      }
   }



i've tested everything on my code to this part. If i save the result_time[][] values to a .txt file, everything is correct, so i imagine that the problem isn't here. (it stores the correct values, even when the program crashes)

After this method i wanna use the result_time[][] to plot a 3D graph using the Dplot, so i call:

Code:

timeGraph(result_time);


The complete graph class is this:
Code:

#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include "dplot.h"

#define DOUBLEPRECISION
#ifdef DOUBLEPRECISION
#define REAL double
#define DPLOT_PLOT dPlot_Plot8
#else
#define REAL float
#define DPLOT_PLOT dPlot_Plot
#endif


void timeGraph(double *result_time[] ){
   DPLOT   DPlot;
   int      DocNum;
   int      Nx, Ny;
   REAL   extents[4];


#ifdef __GNUC__
   HINSTANCE dll;
   if((dll = dPlot_Init()) == NULL)
   {
      printf("LoadLibrary for DPLOTLIB.DLL failed.\n");
      exit(0);
   }
#endif
   dPlot_SetErrorMethod(2);


   Nx = 41;   // Columns
   Ny = 5000;   // Rows

   extents[0] = -10.f;      // xlo
   extents[1] = 0.f;      // ylo
   extents[2] = 10.f;      // xhi
   extents[3] = 5000.f;   // yhi
   
   memset(&DPlot,0,sizeof(DPlot));
   DPlot.Version      = DPLOT_DDE_VERSION;
   DPlot.DataFormat   = DATA_3D;
   DPlot.MaxCurves      = Nx-1;      // Size of the grid, in grid cells
   DPlot.MaxPoints      = Ny-1;
   DPlot.NumCurves      = 1;
   DPlot.Scale         = SCALE_LINEARX_LINEARY;
   strcpy(DPlot.Title[0],"Time Correlation");
   strcpy(DPlot.XAxis,"Doppler Shift");
   strcpy(DPlot.YAxis,"Code Phase");   

   DocNum = DPLOT_PLOT(&DPlot,extents,*result_time,"[Caption(\"GuiCorrelation\")]"
      "[Contour3D(1)][ContourMethod(0)][ContourGrid(1)][ContourAxes(1)][ContourView(315,26)]"
      "[ContourLevels(20,-1000,5000)][ContourScales(250,1,0.5)][ContourLighting(2,0.2)]"
      "[FontPoints(1,10)][ZAxisLabel(\"Magnitude\")]" );


#ifdef __GNUC__
   FreeLibrary(dll);
#endif

}



ok so now my actual problem:

i was until this point only using the Time Correlation, but when i created the array_time, i created also the array_freq although i was not using it until now.

The strange thing is this: if i create array_freq with less than 5000 doubles, the program gives me an exception when i call the Dplot function.

this is very strange because the graphic is done with another array, (result_time[][]) and i don't use array_freq for nothing (will use in the future). i just create it and then free() it when the app closes.

The error is this:
Unhandled exception at 0x77588a73 in GUI_Correlation.exe: 0xC0000005: Access violation reading location 0x02809000.


This is the stack:
>ntdll.dll!77588a73()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
user32.dll!769763d4()
dplotlib.dll!00022b81()
dplotlib.dll!00023d0e()
>GUI_Correlation.exe!timeGraph(double * * result_time=0x0012b9d8) Line 61 + 0x1e bytes


my hope is that i'm doing something wrong on the graph method and you can spot it.
So resuming: i use array_time[][] to calculate the correlation values and then store it on result_time[][].
i then pass result_time[][] to Dplot so it makes the graph.

If i create array_freq with 5000 doubles or more, it all works fine.
If i don't create array_freq, or create it with less than 5000 doubles the programs crashes on the DocNum = DPLOT_PLOT (&DPlot,extents,*result_time,..... statement.


i know this is a very long post and if you can help me out it would be great.
Thank you
Back to top
View user's profile Send private message
DPlotAdmin
Site Admin


Joined: 24 Jun 2003
Posts: 2310
Location: Vicksburg, Mississippi

PostPosted: Wed Feb 11, 2009 1:36 pm    Post subject: Reply with quote

The only thing that stands out to me is this:

Quote:
for(i = 0; i != 41; i++)
{
result_time[i] = (double*) malloc(sizeof(double) * 5000);
}


I don't think there's any guarantee that those 41 1D arrays will be contiguous - maybe they are, maybe they aren't. The DPlot_Plot call is looking for a single contiguous array, and if that isn't what you're providing then DPlot will be accessing a bogus address.
_________________
Visualize Your Data
support@dplot.com
Back to top
View user's profile Send private message Send e-mail Visit poster's website
ecas



Joined: 08 Feb 2009
Posts: 4

PostPosted: Wed Feb 11, 2009 2:16 pm    Post subject: Reply with quote

hey thanks for the reply, but i think i managed to isolate the problem.

could you explain this better to me:


Code:

//this is my code. i copied it from ctest.c if i remember correctly

REAL   extents[4];


extents[0] = -10.f;      // xlo
   extents[1] = 0.f;      // ylo
   extents[2] = 10.f;      // xhi
   extents[3] = 5000.f;   // yhi



My call to Dplot:
Code:

DocNum = DPLOT_PLOT(&DPlot,extents,*result_time,


on the DPLOTLIB user guide you have this:
int DPlot_Plot8(DPLOT *DPlot, double *array1, double *array2, LPSTR commands);


i changed REAL extents[4] to REAL extents[41] and it works sometimes and others dont.

could you explain me better what i sould pass in DPLOT_PLOT() function?


Thank you
Back to top
View user's profile Send private message
DPlotAdmin
Site Admin


Joined: 24 Jun 2003
Posts: 2310
Location: Vicksburg, Mississippi

PostPosted: Wed Feb 11, 2009 2:29 pm    Post subject: Reply with quote

Quote:
i changed REAL extents[4] to REAL extents[41] and it works sometimes and others dont.


Either should work, always (though [41] will never be necessary). My guess is if you run into problems with either [4] or [41] it is due to the way your result_time array is arranged, and nothing to do with the extents array.

Your result_time array should be one array allocated all at once. As far as I know that is the only way to ensure that element [j] always immediately follows element [j-1] in memory, for all j.

Instead of multiple calls to malloc you'd use

Code:
double *result_time;

result_time = (double *)malloc(41*5000,sizeof(double));


and when filling the array you'd use:

Code:
for(i=0; i <41 ; i++){

      for (k = 0; k < 5000; k++)
      {
         result_time[i*5000+k] = timeCorrelation(sample_signal,array_time[i],sample_array_size, k);
     
      }
   }

_________________
Visualize Your Data
support@dplot.com
Back to top
View user's profile Send private message Send e-mail Visit poster's website
ecas



Joined: 08 Feb 2009
Posts: 4

PostPosted: Wed Feb 11, 2009 8:31 pm    Post subject: Reply with quote

hey david, finally figured it out Very Happy

i has being stupid from the start:

i was trying to pass a 2D array as an argument to the Dplot function.

all i had to do was transform my 2D array into 1D array and pass it.

My bad. Cool

you may delete the thread if you want

BTW: very nice program, congratulations and thank you once again
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    DPlot Forum Index -> C, C++, C# All times are GMT - 5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group