Adventure Game Studio

AGS Support => Advanced Technical Forum => Topic started by: beomoud on Sat 31/01/2009 19:42:49

Title: A little help with an internal error?
Post by: beomoud on Sat 31/01/2009 19:42:49
I get an error in my script and i frankly can't find anything wrong with it, the message i get is:

An internal error has occurred.....
(ACI version 3.10.10.50)

Error: Unable to create local script: Runtime error: unresolved import 'NPC::set_stroll^13'

I am working on AGS 3.1

Does anyone have any idea what that might be? In the referred function i am using optional parameters....what could it be?
Also the import declaration of this function belongs to a struct.... any thoughts?

this is in the script:

function NPC::set_stroll(short ch_numb, short timer_numb, int timer_min, int timer_max, short max_mov, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4){
......
}

and this is in the header

import function set_stroll(short ch_numb, short timer_numb, int timer_min, int timer_max, short max_mov, int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0, int x3 = 0, int y3 = 0, int x4 = 0, int y4 = 0);

I use this function in a room script but when i delete it from there it compiles just fine....

room script:

person[2].set_stroll(2, 3, 400, 800, 3, 200, 180, 1175, 210, 685, 250);
Title: Re: A little help with an internal error?
Post by: Khris on Sat 31/01/2009 20:56:25
This might happen because the function has eleven parameters.
Title: Re: A little help with an internal error?
Post by: beomoud on Sat 31/01/2009 21:01:45
I tried to Split it into two functions and it worked. Why would that even happen, is there a limit to the parameters?
Title: Re: A little help with an internal error?
Post by: Gilbert on Sun 01/02/2009 17:24:46
As far as I remember there was a limit of at most 10 parameters per function, don't know whether this had been changed though.
Title: Re: A little help with an internal error?
Post by: Pumaman on Thu 09/04/2009 20:05:15
Sorry for the delay with this... I've finally had time to investigate it and there is indeed a bug here.

The AGS script engine limits functions to 14 parameters, however there is a bug which means that if you have a struct member function it will give this error message at run-time if it has more than 9 parameters.

I will get it fixed so that all functions including struct member functions can have the 14 parameters.
Title: Re: A little help with an internal error?
Post by: Joe on Mon 04/05/2009 20:28:41
Hmmm I'm having the same trouble... will this be corrected in the next AGS version?

CJ: are you thinking to make the parameters limit bigger?
Title: Re: A little help with an internal error?
Post by: Gilbert on Tue 05/05/2009 01:56:44
:P
Quote* Fixed struct member functions with more than 9 parameters giving run-time error
http://www.adventuregamestudio.co.uk/yabb/index.php?topic=37668.0 (http://www.adventuregamestudio.co.uk/yabb/index.php?topic=37668.0)
Title: Re: A little help with an internal error?
Post by: Joe on Tue 05/05/2009 12:25:10
Oh damn. I mean, sorry. Thanks for telling.

Anyway I'd also like to know if the parameters number is gonna be increased.

Thanks
Title: Re: A little help with an internal error?
Post by: Pumaman on Wed 06/05/2009 23:08:48
Do you need more than 14 parameters in a single function call?
Title: Re: A little help with an internal error?
Post by: Joe on Thu 07/05/2009 00:30:06
Well in my last script i had a function with 13 parameters... but maybe in a future I'd like to add more parameters.

In my game I have different kinds of enemies, and the function was just to make the game begin creating the number of enemies of each kind specified with the parameters:

function Begin(int enem1Quantity, enem2Quantity............);

So if I had more than 14 kind of enemis I'd have to divide it in 2 functions... and It's not very nice. Anyway It's not necessary for me by now....
Title: Re: A little help with an internal error?
Post by: lostbuthappy on Thu 07/05/2009 03:39:06
I know, I'm new, but I can't shut up on this one :)
I'm programming software for more than ten years (blah blah blah) and it rarely occured that I had to pass more than four arguments to a function. If you need much more this often indicates that your function is not specialized enough to be easy to maintain and understand (especially a few months later). Also this many arguments are easily mixed up and therefore a common source for errors which are either found before the game's being shipped or manage to hide in a dark place before the light is switched on and are then referred to as bugs.
If splitting the function into more specialized ones is not an option, can't you just use an array instead?:

enum EnemyTypes
{
  etGiantWarhog = 0,
  // ...
  etStripedBiologistTaunter = 12
};

int enemyQuantities[13];
  enemyQuantities[etGiantWarhog] = 24;
  // ...
  enemyQuantities[etStripedBiologistTaunter] = 3;

doStuff(enemyQuantities);

(If you can't pass arrays in ags please ignore this post entirely :~)
Title: Re: A little help with an internal error?
Post by: Khris on Thu 07/05/2009 06:40:57
You can't, unfortunately.

But you can do this:

  param.first_param = 15;
  param.second_param = "Woot!";
  param.third_param = "3.0";
  param.fourth_param = "Poobungies.";
  ...
  param.seventeenth_param = "Of course!";
  doStuff();


Where param is an instance of a struct holding the parameters. The thing is: you don't need to pass "param" to the function because you'll only ever use "param".

If you really need to pass a certain instance to a function, declare an array of instances, then pass the index number to the function.

To pass more than ten ints which are in the range of 0-999, I'd use a string and simply stitch them together (using leading zeros).

So it's entirely possible to work around the limitation.
Title: Re: A little help with an internal error?
Post by: Wonkyth on Thu 07/05/2009 07:47:10
Hmm, seems a bit over-fiddly to me...
It would certainly make thing easier for me if you could pass arrays.
Title: Re: A little help with an internal error?
Post by: Joe on Thu 07/05/2009 12:35:09
Quote from: lostbuthappy on Thu 07/05/2009 03:39:06
If you need much more this often indicates that your function is not specialized enough to be easy to maintain and understand (especially a few months later). Also this many arguments are easily mixed up and therefore a common source for errors which are either found before the game's being shipped or manage to hide in a dark place before the light is switched on and are then referred to as bugs.

Well I really don't need it too much but I can sure you my code was really understandable. Cause I had defined an array ef enemies called 'Enemy enemies[MAX_ENEMIES]' and I had one function to 'create' each one and I say 'create' because  it's not really to create it, it's just to define their initial values like: graphic, x,y, sound....
And the function that needed the 13 parameters was to create all of them in a loop:


#define KIND1 1
#define KIND2 2
#define KIND3 3

static void Enmies::Begin(int e1Quant, e2Quant, int e3Quant){
  //Call this function only at any room_load script
  int k=0;
  EnemQuant= e1Quant + e2Quant + e3Quant;
 
  while(k<EnemQuant){
    if(k<e1Quant+e2Quant+e3Quant)enemies[k].Create(KIND3);
    if(k<e1Quant+e2Quant)enemies[k].Create(KIND2);
    if(k<e1Quant)enemies[k].Create(KIND1);
    k++;
  }

}
Title: Re: A little help with an internal error?
Post by: lostbuthappy on Thu 07/05/2009 13:00:21
Quote from: KhrisMUC on Thu 07/05/2009 06:40:57
You can't, unfortunately.
Meh.
Well, thanks for pointing that out, Khris! Using a struct will certainly do the job, although you can't just iterate over it (which I'd totally miss since I'm quite lazy :)). Ain't it possible to pass a pointer to an array (I couldn't find anything about that in the manual)?

@Joe Carl: What I wrote was just a general advice. Of course I didn't accuse anybody's particular code to be unreadable, I don't even know it. And as you can see I'm quite new to the forums and ags in general and don't know all it's capabilities and limitations, yet. So if you're happy with your code, so am I :)
Title: Re: A little help with an internal error?
Post by: Joe on Thu 07/05/2009 19:01:20
Thanks. And Khris thankyou too, I'll do that if I need more than 14 params. :)
Title: Re: A little help with an internal error?
Post by: Pumaman on Thu 07/05/2009 20:07:22
I can appreciate that until AGS supports passing custom structs as function parameters, you might need to pass a lot of parameters as a workaround. I'll look into it but it's not going to be a high priority.
Title: Re: A little help with an internal error?
Post by: lostbuthappy on Fri 08/05/2009 00:30:14
Dear Santa Claus (or christmasman, as he's known in Germany :)),
I've been a good boy this year (and if you think otherwise I'll see you in court), so please grant me these wishes:
1: Let me pass arrays an structs to a function in ags
2: Give me a whirpool with bubbles!
3: When I alt-tab out of an ags application please stop haunting me with techno-beats.

You'll find cookies and milk near the alligator pit. Thanks in advance,
lostbuthappy