calling function pointer without typedef

Started by
13 comments, last by Bacterius 9 years, 11 months ago

well, once again the editor is clipping everything after the first "open square bracket, slash, 'code', closed square bracket".

guess i'll have to post the reply in sections...

Second, declare your function variables....


// action types
struct actionrec
{
char msg[100];
int energy,water_disease,bath_disease;
functiontype1 *proceedure;
int numskills,numparts,numtools,skill[10],xp[10],part[10],partqty[10],tool[10],toolqty[10];
requirementsrec r;
};    

actionrec action[maxactions];        // the actions database

Norm Barrows

Rockland Software Productions

"Building PC games since 1989"

rocklandsoftware.net

PLAY CAVEMAN NOW!

http://rocklandsoftware.net/beta.php

Advertisement
Third, forward declaration of the function variables (you may or may not need forward declarations,depending on the order in which things appear in the source file.....

 
//################################################# ACTIONS ###################################################
 
// forward declarations of action routines for init actions database
void drinkliquid();
void _make_object();
void sleep();
void rest();
void bathe();
void restandheal();
void makefire();
void eatfood();                              //   GENERIC      31 foods
void research_skill();                   //   GENERIC      45 skills
void cook_food();                           //   GENERIC      35 cooked foods / liquids
void find_object();                         //   GENERIC    everything you can find
void addwood2fire();
void play_with_fire();
void make_shelter();                        //   GENERIC      6 types of shelters
void demolish_shelter();
void entershelter();
void move();
void inspect_shelter();
void repair_shelter();
void butcher_animal();
void getbone_animal();
void gettrinkets_animal();
void sacrifice_animal();
void skin_animal();
void leaveshelter();
void bathewaterskin();
void forrage();
void fill_waterskins_rain();
void train();                               //   GENERIC      52 types of weapons
void stargaze();     
void fill_waterskins();
void swim();
void make_bedding();   
void climbtree();
void climbdownfromtree();
void makebedshelter();
void checkbedding();
void fixbedding();
void dance();
void playdrum();
void playflute();
void sing();
void telljoke();
void tellstory();
void fish();
void capture_animal();
void free_animal();
void tame_animal();
void watchclouds();
void fix_object();
void get_tendon_animal();
void make_storepit();
void inspect_storepit();
void repair_storepit();
//void examine_monolith();
void entercave();
void leavecave();
void searchbody();
void learn_from_caveman();
void teach_caveman();
void listen2story();
void teach_bandmember();
void telljokeclan();
void tellstoryclan();
void listen2joke();
void entercavern();
void leavecavern();
void buildpermshel();
void inspectpermshel();
void repairpermshel();
void demolishpermshel();
//void clearrubble();
void make_raft();
void learn_sailing();
void board_raft();
void check_raft();
void repair_raft();
void paddle();
void move_raft();
void disembark();
void pray();
void prayfire();
void poison_wpn();
void apply_camo();
void use_lodestone();
void putoutfire();
void kill_captured();
void make_object2();   // uses reqts rec
void check_trap();
void check_weather();
void check_fire();
void demolish_landmark();
void demolish_bedding();
void inspect_trap();
void repair_world_object();
void demolish_trap();
void inspect_landmark();
void repair_trap();
void daydream();
void talk2friendly();
void talk2bandmember();
void listen2bandmember();

Norm Barrows

Rockland Software Productions

"Building PC games since 1989"

rocklandsoftware.net

PLAY CAVEMAN NOW!

http://rocklandsoftware.net/beta.php

Fourth, assign the functions to the function varaibles.....

 
 
void init_actions_database()
{
ZeroMemory(action,sizeof(actionrec)*maxactions);
 
action[DONOTHING].energy=1;
 
strcpy_s(action[DRINK].msg,100,"Drinking...");
action[DRINK].proceedure=drinkliquid;
action[DRINK].water_disease=1;
 
strcpy_s(action[MAKEOBJ].msg,100,"Making object...");
action[MAKEOBJ].proceedure=_make_object;
 
action[SLEEP].energy=1;
strcpy_s(action[SLEEP].msg,100,"Sleeping...");
action[SLEEP].proceedure=sleep;
 
action[REST].energy=1;
action[REST].proceedure=rest;
strcpy_s(action[REST].msg,100,"Resting...");
 
action[BATHE].bath_disease=1;
action[BATHE].proceedure=bathe;
strcpy_s(action[BATHE].msg,100,"Bathing...");
 
action[RESTHEAL].energy=1;
action[RESTHEAL].proceedure=restandheal;
strcpy_s(action[RESTHEAL].msg,100,"Resting and healing...");
 
 
 
action[MAKEFIRE].proceedure=makefire;
strcpy_s(action[MAKEFIRE].msg,100,"Making fire...");
action[MAKEFIRE].numskills=1;
action[MAKEFIRE].skill[0]=FIREMAKING;
action[MAKEFIRE].xp[0]=50;
action[MAKEFIRE].numparts=2;
action[MAKEFIRE].part[0]=WOOD;
action[MAKEFIRE].part[1]=TINDER;
action[MAKEFIRE].partqty[0]=2;
action[MAKEFIRE].partqty[1]=1;
action[MAKEFIRE].numtools=1;
action[MAKEFIRE].tool[0]=FIRESTICKS;
action[MAKEFIRE].toolqty[0]=1;
 
action[EAT].proceedure=eatfood;
strcpy_s(action[EAT].msg,100,"Eating food...");
 
action[LEARN].proceedure=research_skill;
 
action[COOK].proceedure=cook_food;
strcpy_s(action[COOK].msg,100,"Cooking food...");
 
action[FIND].proceedure=find_object;
strcpy_s(action[FIND].msg,100,"Searching for object...");
 
action[ADDWOOD].proceedure=addwood2fire;
strcpy_s(action[ADDWOOD].msg,100,"Adding wood to fire...");
action[ADDWOOD].numparts=1;
action[ADDWOOD].part[0]=WOOD;
action[ADDWOOD].partqty[0]=2;
action[ADDWOOD].r.time=900;
action[ADDWOOD].r.chance=10000;
action[ADDWOOD].r.numparts=1;
action[ADDWOOD].r.part[0]=WOOD;
action[ADDWOOD].r.partqty[0]=2;
 
 
action[PLAYWITHFIRE].proceedure=play_with_fire;
strcpy_s(action[PLAYWITHFIRE].msg,100,"Playing with fire...");
 
action[MAKESHELTER].proceedure=make_shelter;
strcpy_s(action[MAKESHELTER].msg,100,"Making shelter...");
 
action[DEMOLISHSHELTER].proceedure=demolish_shelter;
strcpy_s(action[DEMOLISHSHELTER].msg,100,"Demolishing shelter...");
 
action[ENTERSHELTER].proceedure=entershelter;
strcpy_s(action[ENTERSHELTER].msg,100,"Entering shelter...");
 
action[MOVE].proceedure=move;
strcpy_s(action[MOVE].msg,100,"Traveling to new location...");
 
action[INSPECTSHELTER].proceedure=inspect_shelter;
strcpy_s(action[INSPECTSHELTER].msg,100,"Inspecting shelter...");
 
action[REPAIRSHELTER].proceedure=repair_shelter;
strcpy_s(action[REPAIRSHELTER].msg,100,"Repairing shelter...");
 
action[BUTCHER].proceedure=butcher_animal;
strcpy_s(action[BUTCHER].msg,100,"Butchering animal...");
 
action[DEBONE].proceedure=getbone_animal;
strcpy_s(action[DEBONE].msg,100,"Getting bone from animal...");
 
action[GETTRINKETS].proceedure=gettrinkets_animal;
strcpy_s(action[GETTRINKETS].msg,100,"Getting trinkets from animal...");
 
action[SACRIFICE].proceedure=sacrifice_animal;
strcpy_s(action[SACRIFICE].msg,100,"Sacrificing animal...");
 
action[SKIN].proceedure=skin_animal;
strcpy_s(action[SKIN].msg,100,"Skinning animal...");
 
action[LEAVESHELTER].proceedure=leaveshelter;
strcpy_s(action[LEAVESHELTER].msg,100,"Leaving shelter...");
 
action[BATHEWATERSKIN].proceedure=bathewaterskin;
strcpy_s(action[BATHEWATERSKIN].msg,100,"Bathing from waterskins...");
action[BATHEWATERSKIN].numparts=1;
action[BATHEWATERSKIN].part[0]=WATER;
action[BATHEWATERSKIN].partqty[0]=1;
action[BATHEWATERSKIN].numtools=1;
action[BATHEWATERSKIN].tool[0]=WATERSKIN;
action[BATHEWATERSKIN].toolqty[0]=1;
 
action[FORRAGE].proceedure=forrage;
strcpy_s(action[FORRAGE].msg,100,"Forraging for food...");
 
action[FILLWATERSKINRAIN].proceedure=fill_waterskins_rain;
strcpy_s(action[FILLWATERSKINRAIN].msg,100,"Filling waterskins with rainwater...");
 
action[TRAIN].proceedure=train;
 
strcpy_s(action[STARGAZE].msg,100,"Stargazing...");
action[STARGAZE].proceedure=stargaze;
 
action[FILLWATERSKIN].proceedure=fill_waterskins;
strcpy_s(action[FILLWATERSKIN].msg,100,"Filling waterskins...");
 
action[SWIM].proceedure=swim;
strcpy_s(action[SWIM].msg,100,"Swimming...");
 
action[MAKEBEDDING].proceedure=make_bedding;
strcpy_s(action[MAKEBEDDING].msg,100,"Making bedding...");
 
action[CLIMBTREE].proceedure=climbtree;
strcpy_s(action[CLIMBTREE].msg,100,"Climbing tree...");
 
action[CLIMBDOWN].proceedure=climbdownfromtree;
strcpy_s(action[CLIMBDOWN].msg,100,"Climbing down from tree...");
 
action[MAKEBEDSHELTER].proceedure=makebedshelter;
strcpy_s(action[MAKEBEDSHELTER].msg,100,"Making bedding in shelter...");
 
 
strcpy_s(action[CHECKBEDDING].msg,100,"Checking bedding condition...");
action[CHECKBEDDING].proceedure=checkbedding;
 
strcpy_s(action[FIXBEDDING].msg,100,"Repairing bedding...");
action[FIXBEDDING].proceedure=fixbedding;
 
strcpy_s(action[DANCE].msg,100,"Dancing...");
action[DANCE].proceedure=dance;
 
strcpy_s(action[PLAYDRUM].msg,100,"Playing drums...");
action[PLAYDRUM].proceedure=playdrum;
 
strcpy_s(action[PLAYFLUTE].msg,100,"Playing flute...");
action[PLAYFLUTE].proceedure=playflute;
 
strcpy_s(action[SING_ACTION].msg,100,"Singing...");
action[SING_ACTION].proceedure=sing;
 
strcpy_s(action[TELLJOKE].msg,100,"Telling joke...");
action[TELLJOKE].proceedure=telljoke;
 
strcpy_s(action[TELLSTORY].msg,100,"Telling story...");
action[TELLSTORY].proceedure=tellstory;
 
action[FISH].proceedure=fish;
 
strcpy_s(action[CAPTUREANIMAL].msg,100,"Capturing animal...");
action[CAPTUREANIMAL].proceedure=capture_animal;
 
strcpy_s(action[FREEANIMAL].msg,100,"Freeing animal...");
action[FREEANIMAL].proceedure=free_animal;
 
strcpy_s(action[TAMEANIMAL].msg,100,"Taming animal...");
action[TAMEANIMAL].proceedure=tame_animal;
 
 
strcpy_s(action[WATCHCLOUDS].msg,100,"Watching clouds...");
action[WATCHCLOUDS].proceedure=watchclouds;
 
strcpy_s(action[FIXOBJECT].msg,100,"Fixing object...");
action[FIXOBJECT].proceedure=fix_object;
 
strcpy_s(action[GETTENDON].msg,100,"Getting tendon from animal...");
action[GETTENDON].proceedure=get_tendon_animal;
action[GETTENDON].numtools=1;
action[GETTENDON].tool[0]=STONEKNIFE;
action[GETTENDON].toolqty[0]=1;
 
strcpy_s(action[MAKESTOREPIT].msg,100,"Building storage pit...");
action[MAKESTOREPIT].proceedure=make_storepit;
 
strcpy_s(action[INSPECTSTOREPIT].msg,100,"Inspecting storage pit...");
action[INSPECTSTOREPIT].proceedure=inspect_storepit;
 
strcpy_s(action[REPAIRSTOREPIT].msg,100,"Repairing storage pit...");
action[REPAIRSTOREPIT].proceedure=repair_storepit;
 
strcpy_s(action[EXAMINEMONOLITH].msg,100,"Examinimg monolith...");
//action[EXAMINEMONOLITH].proceedure=examine_monolith;
 
 
strcpy_s(action[ENTERCAVE].msg,100,"Entering cave...");
action[ENTERCAVE].proceedure=entercave;
 
 
strcpy_s(action[LEAVECAVE].msg,100,"Leaving cave...");
action[LEAVECAVE].proceedure=leavecave;
 
 
strcpy_s(action[SEARCHBODY].msg,100,"Searching body...");
action[SEARCHBODY].proceedure=searchbody;
 
 
strcpy_s(action[LEARNFROMCAVEMAN].msg,100,"Learning from caveman...");
action[LEARNFROMCAVEMAN].proceedure=learn_from_caveman;
 
strcpy_s(action[TEACHCAVEMAN].msg,100,"Teaching caveman...");
action[TEACHCAVEMAN].proceedure=teach_caveman;
 
strcpy_s(action[LISTEN2STORY].msg,100,"Listening to story...");
action[LISTEN2STORY].proceedure=listen2story;
 
strcpy_s(action[TEACHBANDMEMBER].msg,100,"Teaching bandmember...");
action[TEACHBANDMEMBER].proceedure=teach_bandmember;
 
strcpy_s(action[TELLJOKECLAN].msg,100,"Telling joke to bandmember...");
action[TELLJOKECLAN].proceedure=telljokeclan;
 
strcpy_s(action[TELLSTORYCLAN].msg,100,"Telling story to bandmember...");
action[TELLSTORYCLAN].proceedure=tellstoryclan;
 
strcpy_s(action[LISTEN2JOKE].msg,100,"Listening to joke...");
action[LISTEN2JOKE].proceedure=listen2joke;
 
 
 
strcpy_s(action[ENTERCAVERN].msg,100,"Entering cavern...");
action[ENTERCAVERN].proceedure=entercavern;
 
strcpy_s(action[LEAVECAVERN].msg,100,"Leaving cavern...");
action[LEAVECAVERN].proceedure=leavecavern;
 
 
strcpy_s(action[BUILDPERMSHEL].msg,100,"Building permenant shelter...");
action[BUILDPERMSHEL].proceedure=buildpermshel;
 
strcpy_s(action[INSPECTPERMSHEL].msg,100,"Inspecting permenant shelter...");
action[INSPECTPERMSHEL].proceedure=inspectpermshel;
 
 
strcpy_s(action[REPAIRPERMSHEL].msg,100,"Repairing permenant shelter...");
action[REPAIRPERMSHEL].proceedure=repairpermshel;
 
 
 
strcpy_s(action[DEMOLISHPERMSHEL].msg,100,"Demolishing permenant shelter...");
action[DEMOLISHPERMSHEL].proceedure=demolishpermshel;
 
 
strcpy_s(action[CLEARRUBBLE].msg,100,"Clearing rubble...");
action[CLEARRUBBLE].proceedure=NULL;
 
strcpy_s(action[MAKERAFT].msg,100,"Making raft...");
action[MAKERAFT].proceedure=make_raft;
 
 
strcpy_s(action[LEARNSAILING].msg,100,"Learning sailing...");
action[LEARNSAILING].proceedure=learn_sailing;
 
strcpy_s(action[BOARDRAFT].msg,100,"Boarding raft...");
action[BOARDRAFT].proceedure=board_raft;
 
strcpy_s(action[INSPECTRAFT].msg,100,"Checking raft...");
action[INSPECTRAFT].proceedure=check_raft;
 
strcpy_s(action[REPAIRRAFT].msg,100,"Repairing raft...");
action[REPAIRRAFT].proceedure=repair_raft;
 
strcpy_s(action[PADDLE].msg,100,"Paddling...");
action[PADDLE].proceedure=paddle;
 
strcpy_s(action[MOVERAFT].msg,100,"Moving on raft...");
action[MOVERAFT].proceedure=move_raft;
 
 
strcpy_s(action[DISEMBARK].msg,100,"Disembarking...");
action[DISEMBARK].proceedure=disembark;
 
strcpy_s(action[PRAY].msg,100,"Making sacrifice...");
action[PRAY].proceedure=pray;
 
 
action[PRAYFIRE].proceedure=prayfire;
strcpy_s(action[PRAYFIRE].msg,100,"Making sacrificial fire...");
action[PRAYFIRE].numskills=1;
action[PRAYFIRE].skill[0]=FIREMAKING;
action[PRAYFIRE].xp[0]=50;
action[PRAYFIRE].numparts=2;
action[PRAYFIRE].part[0]=WOOD;
action[PRAYFIRE].part[1]=TINDER;
action[PRAYFIRE].partqty[0]=2;
action[PRAYFIRE].partqty[1]=1;
action[PRAYFIRE].numtools=1;
action[PRAYFIRE].tool[0]=FIRESTICKS;
action[PRAYFIRE].toolqty[0]=1;
 
action[POISONWPN].proceedure=poison_wpn;
strcpy_s(action[POISONWPN].msg,100,"Poisoning weapon...");
 
action[APPLYCAMO].proceedure=apply_camo;
strcpy_s(action[APPLYCAMO].msg,100,"Applying camoflage...");
action[APPLYCAMO].r.numskills=1;
action[APPLYCAMO].r.skill[0]=CAMOFLAGE;
action[APPLYCAMO].r.xp[0]=50;
action[APPLYCAMO].r.numparts=1;
action[APPLYCAMO].r.part[0]=CORDAGE;
action[APPLYCAMO].r.partqty[0]=1;
action[APPLYCAMO].r.numtools=1;
action[APPLYCAMO].r.tool[0]=STONEKNIFE;
action[APPLYCAMO].r.toolqty[0]=1;
 
 
 
 
 
 
action[USELODESTONE].proceedure=use_lodestone;
strcpy_s(action[USELODESTONE].msg,100,"Using lodestone...");
action[USELODESTONE].r.numskills=1;
action[USELODESTONE].r.skill[0]=NAVIGATION;
action[USELODESTONE].r.xp[0]=500;
action[USELODESTONE].r.numparts=1;
action[USELODESTONE].r.part[0]=WATER;
action[USELODESTONE].r.partqty[0]=10;
action[USELODESTONE].r.numtools=3;
action[USELODESTONE].r.tool[0]=LODESTONE;
action[USELODESTONE].r.tool[1]=CLAYPOT;
action[USELODESTONE].r.tool[2]=WOOD;
action[USELODESTONE].r.toolqty[0]=1;
action[USELODESTONE].r.toolqty[1]=1;
action[USELODESTONE].r.toolqty[2]=1;
action[USELODESTONE].r.time=4500;
action[USELODESTONE].r.chance=7500;
action[USELODESTONE].r.numbonusskills=1;
action[USELODESTONE].r.bonusskill[0]=NAVIGATION;
action[USELODESTONE].r.numboostedskills=1;
action[USELODESTONE].r.boostedskill[0]=NAVIGATION;
 
 
 
 
 
action[PUTOUTFIRE].proceedure=putoutfire;
strcpy_s(action[PUTOUTFIRE].msg,100,"Putting out fire...");
 
action[KILLCAPTURED].proceedure=kill_captured;
strcpy_s(action[KILLCAPTURED].msg,100,"Killing animal...");
 
 
 
 
strcpy_s(action[MAKEOBJ2].msg,100,"Making object...");
action[MAKEOBJ2].proceedure=make_object2;
 
 
strcpy_s(action[CHECKTRAP].msg,100,"Checking trap...");
action[CHECKTRAP].proceedure=check_trap;
action[CHECKTRAP].r.chance=10000;
action[CHECKTRAP].r.time=50;
 
 
strcpy_s(action[CHECKWEATHER].msg,100,"Checking weather...");
action[CHECKWEATHER].proceedure=check_weather;
action[CHECKWEATHER].r.chance=10000;
action[CHECKWEATHER].r.time=50;
 
 
strcpy_s(action[CHECKFIRE].msg,100,"Checking fire...");
action[CHECKFIRE].proceedure=check_fire;
action[CHECKFIRE].r.chance=10000;
action[CHECKFIRE].r.time=50;
 
strcpy_s(action[DEMOLISH_LANDMARK].msg,100,"Demolishing landmark...");
action[DEMOLISH_LANDMARK].proceedure=demolish_landmark;
action[DEMOLISH_LANDMARK].r.chance=10000;
action[DEMOLISH_LANDMARK].r.time=13500;
 
strcpy_s(action[DEMOLISH_BEDDING].msg,100,"Demolishing bedding...");
action[DEMOLISH_BEDDING].proceedure=demolish_bedding;
action[DEMOLISH_BEDDING].r.chance=10000;
action[DEMOLISH_BEDDING].r.time=4500;
 
strcpy_s(action[INSPECT_TRAP].msg,100,"Inspecting trap...");
action[INSPECT_TRAP].proceedure=inspect_trap;
action[INSPECT_TRAP].r.chance=10000;
action[INSPECT_TRAP].r.time=4500;
 
strcpy_s(action[REPAIR_WORLDOBJ].msg,100,"Repairing object...");
action[REPAIR_WORLDOBJ].proceedure=repair_world_object;
action[REPAIR_WORLDOBJ].r.chance=10000;
action[REPAIR_WORLDOBJ].r.time=4500;
 
strcpy_s(action[DEMOLISH_TRAP].msg,100,"Demolishing trap...");
action[DEMOLISH_TRAP].proceedure=demolish_trap;
action[DEMOLISH_TRAP].r.chance=10000;
action[DEMOLISH_TRAP].r.time=4500;
 
strcpy_s(action[INSPECT_LANDMARK].msg,100,"Inspecting landmark...");
action[INSPECT_LANDMARK].proceedure=inspect_landmark;
action[INSPECT_LANDMARK].r.chance=10000;
action[INSPECT_LANDMARK].r.time=4500;
 
strcpy_s(action[REPAIR_TRAP].msg,100,"Repairing trap...");
action[REPAIR_TRAP].proceedure=repair_trap;
action[REPAIR_TRAP].r.chance=10000;
action[REPAIR_TRAP].r.time=4500;
 
strcpy_s(action[DAYDREAM].msg,100,"Daydreaming...");
action[DAYDREAM].proceedure=daydream;
 
strcpy_s(action[TALK2FRIENDLY].msg,100,"Talking to friendly caveman...");
action[TALK2FRIENDLY].proceedure=talk2friendly;
 
strcpy_s(action[TALK2BANDMEMBER].msg,100,"Talking to band member...");
action[TALK2BANDMEMBER].proceedure=talk2bandmember;
 
strcpy_s(action[LISTEN2BANDMEMBER].msg,100,"Listening to band member...");
action[LISTEN2BANDMEMBER].proceedure=listen2bandmember;
 
 
 
 
 
 
 
 
}
 
 

Norm Barrows

Rockland Software Productions

"Building PC games since 1989"

rocklandsoftware.net

PLAY CAVEMAN NOW!

http://rocklandsoftware.net/beta.php

Finally, call the function variable. This is the slick part. Instead of a huge switch on action_type, you just do:

void doactionmodeB(int cm1)
{
int a;
a=7+cm[cm1].mood/13;
if (frame<=a) action[cm[cm1].current_action].proceedure();
}
Note that working with DLLs, you may need to pay particular attention to calling conventions ( IE cdecel vs fastcall etc.).

Norm Barrows

Rockland Software Productions

"Building PC games since 1989"

rocklandsoftware.net

PLAY CAVEMAN NOW!

http://rocklandsoftware.net/beta.php

Any reason you initialize a fixed size array with ZeroMemory? Usually you just do "array = {0};", it's cleaner, portable, and doesn't invoke a function that is possibly not even built-in on some compilers (I take it maxactions is known at compile-time). If the indices into the array are also known at compile time, the compiler may even decide zeroing the array is unnecessary and skip it altogether after doing some static analysis (though I doubt that, admittedly, but just saying that would probably never be possible with a call to ZeroMemory bang in the middle of the function).

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

This topic is closed to new replies.

Advertisement