C / C ++ред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐

рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдХрд╛рдо рдкрд░, рдореБрдЭреЗ C ++ рдмрд┐рд▓реНрдбрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдХреНрд╖рдг рдерд╛ рдЬрдм рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЬрд╛рджреВ рднреА рдХрд╛рд░реНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛: тАЬрдЖрдк рд╕рднреА рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣реИрдВред рд╡реЗ рдпрд╣рд╛рдБ рдЭреВрда рдмреЛрд▓рддреЗ рд╣реИрдВ: ... "ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкрддреЗ рдкрд░ рдЪрдврд╝ рдЧрдпрд╛ ... рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╢рд╛рдЦрд╛рдпреБрдХреНрдд рдХреЛрдб рд╕рдВрд░рдЪрдирд╛ рдорд┐рд▓реА, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдирд░рдХ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдореБрдЭреЗ рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд╕реНрд▓реЙрдЯреНрд╕ рдХреЗ рдХреНрдпреВрдЯреА-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ, рдХреЗрд╡рд▓ рд╕реА ++ рдмрд┐рд▓реНрдбрд░ рдФрд░ рдХрдорд╛рдВрдб рддрд░реНрдХ рдХреЗ рд▓рд┐рдПред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддрд░реНрдХ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░рд┐рддреНрд░ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ "-" - рдореИрдВрдиреЗ рд▓рд┐рдирдХреНрд╕ рдорд╛рдирдХ рд▓рд┐рдпрд╛ рдерд╛)ред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рддрд░реНрдХ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдЙрд╕рдХреЗ рдореВрд▓реНрдп рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдПрдХ рд╕рд░рдгреА рдЬрд┐рд╕рдореЗрдВ рдЪрд╛рдмрд┐рдпрд╛рдБ рдЙрдкрд▓рдмреНрдз рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдирд╛рдо рд╣реЛрдВрдЧреЗ, рдФрд░ рдорд╛рди рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ рд╣реИрдВред рдпрд╣, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рд╣реИред рдЪрд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВ?

рдЖрдЧреЗ рдмрдврд╝реЛред рдЪрд▓реЛ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред C ++ рдмрд┐рд▓реНрдбрд░ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ (map.h рдореЗрдВ рдШреЛрд╖рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

#include <map.h>

рдЖрдЧреЗ рдХреА рдорджрдж рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:

typedef map <AnsiString, int*> TFuncTable;

рдФрд░ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡реГрддреНрддрд┐:

TFuncTable funcTable;

рдпрд╣рд╛рдВ, AnsiString рдХреЛ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореБрдЭреЗ рдорд╛рдлрд╝ рдХрд░реЗрдВ std :: string), рдФрд░ рдорд╛рди int * рд╣реИрдВ (рд╡реИрд╕реЗ, рдпрд╣ 64-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред рдЕрдм, рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╣реИрд╢ рдореЗрдВ рдХреИрд╕реЗ рдбрд╛рд▓реЗрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛ рдФрд░ рдЗрд╕реЗ рдорд╛рд░рдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 2 рдШрдВрдЯреЗ рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЧрдпрд╛:

int *addr = (int*)&myFunction;
funcTable.insert(TFuncTable::value_type(AnsiString("-myParam"), addr));

рдпрд╣ TFuncTable рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ :: value_type () - рдХреНрдпреЛрдВ, рдореБрдЭреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛, рд▓реЗрдХрд┐рди, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд┐рд▓рд╛рди рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рднреА рд╕рдВрдХрд▓рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рддреЛ, рд╕рд░рдгреА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ - рдмрдврд╝рд┐рдпрд╛ред рд╡рд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛? рд╣рд╛рдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

funcTable[тАЬ-myParamтАЭ] == 0xABCDEF // -

рдзреАрд░реЗ-рдзреАрд░реЗ рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕ рдкреВрд░реА рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдорд╛рдЗрдирд╕ рддреБрд░рдВрдд рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ: рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдп рдПрдХ рд╣реА рддрд░рд╣ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:

typedef void (*TFunc)(AnsiString param);

рдФрд░ рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдореЗрдВ рдЪрд┐рдкрдХреЗ рд░рд╣реЗрдВред рдРрд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

void myFunction(AnsiString name)
{
MainForm->setTestName(name);
}

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╣реИрдВрдбрд▓рд░ рд╣реИред рдЬрдм рдкреИрд░рд╛рдореАрдЯрд░ рдЬреИрд╕рд╛ рдХреБрдЫ рдЖрддрд╛ рд╣реИ рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛:

"param1,param2,param3"

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк / etc / fstab - Linux рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЦреИрд░, рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдирд╛рдо рд╕реЗ рд╣реИрд╢ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реА рдЖрд░рдВрднрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдвреЗрд░ рдореЗрдВ рд░рдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИ:
  1. рдирдХреНрд╢рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ
  2. рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИрд╢, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ред
  3. рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗред
  4. рд╣рд╢ рднрд░рд╛ред

рдЕрдм рдЖрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдпрд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддрд░реНрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдЙрд╕рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдирд╛рдо рд╣реИ:

bool TMainForm::parseParams()
{
int argc;
TFunc srvFunc;
LPWSTR *cmdLine = CommandLineToArgvW(GetCommandLineW(), &argc);
int iter = 1;

for(int i = 1; i < argc; i += iter)
{
AnsiString param = "";
AnsiString paramName = cmdLine[i];
if(i < argc - 1)
{
if(AnsiString(cmdLine[i + 1])[1] == '-')
iter = 1;
else
{
param = cmdLine[i + 1];
iter = 2;
}
}

if(funcTable.find(paramName) == funcTable.end())
{
Out(" " + paramName);
return false;
}
srvFunc = (TFunc)funcTable[paramName];
srvFunc(param);
}
return true;
}


рдХреНрдпрд╛ рд╣реИ:
LPWSTR * cmdLine = CommandLineToArgvW (GetCommandLineW (), & argc); - рдЗрд╕рдХреЗ рд╕рд╛рде рдмреЛрд░рд▓реИрдВрдб рдорджрдж рдореЗрдВ рднреА, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдореИрд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрдмрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдорд╛рдирдХ argc рдФрд░ argv рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдЖрдЙрдЯ () рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рджрд┐рдП рдЧрдП рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрд░реНрдХ рдореЗрдВ "-" рдкреНрд░рддреАрдХ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╣рд╛рдБ:

srvFunc = (TFunc)funcTable[paramName];
srvFunc(param);

рдЗрд╕рд▓рд┐рдП рдлрдВрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд░рд▓, рд╕рд╣реА? рдФрд░ 1000 рд╡реАрдВ рдШреБрдЯрдиреЗ рддрдХ рдХреЛрдИ рдЬрдВрдЧрд▓реА рд╢рд╛рдЦрд╛рдПрдВ рдирд╣реАрдВред

рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рд░рд╛рдЬреНрдп рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдХрд╛рд░реНрдпрд╛рд▓рдп, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ рдпрд╣реА рд╣реИ, рдЬреЛ рдХрд░реНрдордЪрд╛рд░реА рдореЗрд░реЗ рдмрд╛рдж рдЖрдпрд╛ рд╣реИ рд╡рд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦ рджреЗрдЧрд╛, рдкрддреЗ рдХреЛ рд╣реИрд╢ рдореЗрдВ рдЪрд▓рд╛рдПрдЧрд╛, рдФрд░ рдЙрд╕реЗ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдРрд╕рд╛ рдЕрдВрдХрдЧрдгрд┐рдд рд╣реИред

Source: https://habr.com/ru/post/In120396/


All Articles