The Origin Forum
File Exchange
Try Origin for Free
The Origin Forum
Home | Profile | Register | Active Topics | Members | Search | FAQ | Send File to Tech support
Username:
Password:
Save Password
Forgot your Password? | Admin Options

 All Forums
 Origin Forum for Programming
 Forum for Origin C
 More unexpected behavior
 New Topic  Reply to Topic
 Printer Friendly
Author Previous Topic Topic Next Topic Lock Topic Edit Topic Delete Topic New Topic Reply to Topic

mkoetse

Netherlands
Posts

Posted - 01/03/2004 :  06:22:11 AM  Show Profile  Edit Topic  Reply with Quote  View user's IP address  Delete Topic
Hai,

I tried to write a little code to find a certain value in a dataset:

--------------------------------
void TestforTurnon()
{
Worksheet wks = Project.ActiveLayer();
Dataset ds1(wks,0);
Dataset ds2(wks,4);
int rown = 1;
double value = 0.1;
double turnon;
int datsize = ds1.GetSize();
printf("datsize = %i\n", datsize);
do
{
printf("ds2[rown] = %3.2d\n", ds2[2]);
if (ds2[rown]>=value);
{
break;
}
rown+=1
} while (rown <= datsize);

turnon = ds1[rown];
printf("turn on = %1.1d\n", turnon);
}
------------------------------
Here is what the function returned:

datsize = 242
ds2[rown] = -1205768431 (with rown = 1, the value in worksheet column is 0.06785, actually!)
turn on = -1.9

And here what it should be:
datsize = 242
ds2[rown] = 0.14414 (with rown = 51)
turn on = 3.0

I have no clue why I get this wierd number for the ds2[rown] and since it is negative the loop should al least start shouldn't it?

Any clues here?

Marc

cpyang

USA
1406 Posts

Posted - 01/03/2004 :  10:50:38 AM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
For one thing, Origin C is C/C++ so all indexing must be 0 offset. So you need to begin with rown = 0 and to test with

while(rown < datsize);

This might be confusing, as the visual display is 1 offset.

CP


Go to Top of Page

mkoetse

Netherlands
Posts

Posted - 01/03/2004 :  1:25:46 PM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
I know the offset of the rownumbers is 0. But this is not a problem, since the data is > 0.1 at row 51. Actually I get the feeling that the number that is returned is actually a NANUM, and that is something I do not understand at all. I checked the datasets format, both nummeric and text or nummeric give the same results. To make it even more bizar: ds1 is the Xvalue column. It starts at -2 and increases with delta = 0.1. ds1[rown] returns 1717986918 (with rown = 1) were it should be -1.9!

Marc






Edited by - mkoetse on 01/03/2004 1:26:55 PM
Go to Top of Page

Mike Buess

USA
3037 Posts

Posted - 01/03/2004 :  2:07:06 PM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
I think the problem lies in the way you've formatted your output. %d expects an integer value. Try %f instead...

printf("ds2[rown] = %3.2f\n", ds2[2]);
-and-
printf("turn on = %1.1f\n", turnon);

Hope that helps.

Mike Buess
Origin WebRing Member
Go to Top of Page

mkoetse

Netherlands
Posts

Posted - 01/03/2004 :  2:13:05 PM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
At least the output is okay now, Thanks!

One prob resolved, but the loop still does not work, it only goes through once, although the condition is not met. Any idea what the problem might be?

Marc

Go to Top of Page

cpyang

USA
1406 Posts

Posted - 01/03/2004 :  2:51:13 PM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
Your loop looks like it will only go through all the values once. Maybe post the whole code again?

Also, it seems that you will be much better off in using built-in functions like Data_List and Data_Table to do what you are trying to do. It is also correct that if there are missing values in your data, you will need to test for them and skip them, like

if(!is_missing_value(ds2[rown]))
{
}


CP


Go to Top of Page

mkoetse

Netherlands
Posts

Posted - 01/04/2004 :  05:09:50 AM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
I tried the build in functions but non of them did show the expected behavior neither. The loop goes directly in the IF statement and thatshould not happen since the data is amaller than the test value. As far as know 0.069 < 0.1. The datasets are called corectly by the way.

MMK

Go to Top of Page

Mike Buess

USA
3037 Posts

Posted - 01/04/2004 :  09:44:26 AM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
Hi Marc,

I don't know what your code looks like with Data_Table, but there is a semicolon placement error in your original code that will cause a premature break from the loop...

if (ds2[rown]>=value);
{
break;
}
rown+=1

-should be-

if (ds2[rown]>=value)
{
break;
}
rown+=1;

That should fix your loop but Data_Table and Data_List are surely more efficient.

...This is an example using Data_table.
void TestforTurnon2()
{
Worksheet wks = Project.ActiveLayer();
Dataset ds1(wks,0);
Dataset ds2(wks,4);
int datsize = ds1.GetSize();
printf("datsize = %i\n", datsize);
double value = 0.1;

double turnon1 = Data_table(value, &ds1, &ds2);
printf("turn on = %1.1f\n", turnon1); // interpolated value

Dataset ds;
ds.Data(0,datsize-1); // create dataset containing C/C++ row numbers
int rown = (int) Data_table(value, &ds, &ds2);
//rown += 1; // this might be needed to agree with value obtained by your loop
double turnon2 = ds1[rown];
printf("turn on = %1.1f\n", turnon2); // nearest value
}


Mike Buess
Origin WebRing Member

Edited by - Mike Buess on 01/04/2004 10:55:59 AM

Edited by - Mike Buess on 01/04/2004 11:19:42 AM
Go to Top of Page

mkoetse

Netherlands
Posts

Posted - 01/04/2004 :  12:31:18 PM  Show Profile  Edit Reply  Reply with Quote  View user's IP address  Delete Reply
Woauw,

Indeed removing the semicolon did do the trick. Miljon thanks for that!

Your 2nd solution as such is not working, but I'll give it a thought over (and try to understant it) first before commenting in more detail.

Thanks a lot again,

MMK

Go to Top of Page
  Previous Topic Topic Next Topic Lock Topic Edit Topic Delete Topic New Topic Reply to Topic
 New Topic  Reply to Topic
 Printer Friendly
Jump To:
The Origin Forum © 2020 Originlab Corporation Go To Top Of Page
Snitz Forums 2000