ここでは対処方法を学びます:私はC言語のプログラムをC++に変換しようとしています。 This programはテキストファイルを受け取り、ユーザーが入力した規則に従って変更を適用します。具体的には、 "s1/s2/env"のようなフォーマットの規則を使用して、一連の単語にサウンド変更を適用します。 s1は変更する文字を表し、s2は変更する文字を表し、envは変更を適用するコンテキストです。C関数を理解する助けが必要です
私はこれについて詳しくは説明しませんが、申し訳ありませんが、質問は長すぎるかもしれません。著者のサイトでは既に説明しています。
私が困っている機能はTryRuleです。与えられた文字列に与えられた規則が当てはまるかどうかを知るはずですが、どうしているのかを正確に理解できません。パラメータの貧弱な説明は私を混乱させます。たとえば、文字列 "s1"と "s2"を返す必要があるかどうか、または "i"が何を表すのか分かりません。
これはコードです:あなたはあなたにも読みやすくなるようにコードをリファクタリングする必要がありますC++にCから変換されていることを考えると
/*
** TryRule
**
** See if a rule s1->s2/env applies at position i in the given word.
**
** If it does, we pass back the index where s1 was found in the
** word, as well as s1 and s2, and return TRUE.
**
** Otherwise, we return FALSE, and pass garbage in the output variables.
*/
int TryRule(char *word, int i, char *Rule, int *n, char **s1, char **s2, char *varRep)
{
int j, m, cont = 0;
int catLoc;
char *env;
int optional = FALSE;
*varRep = '\0';
if (!Divide(Rule, s1, s2, &env) || !strchr(env, '_'))
return(FALSE);
for (j = 0, cont = TRUE; cont && j < strlen(env); j++)
{
switch(env[j])
{
case '(':
optional = TRUE;
break;
case ')':
optional = FALSE;
break;
case '#':
cont = j ? (i == strlen(word)) : (i == 0);
break;
case '_':
cont = !strncmp(&word[i], *s1, strlen(*s1));
if (cont)
{
*n = i;
i += strlen(*s1);
}
else
{
cont = TryCat(*s1, &word[i], &m, &catLoc);
if (cont && m)
{
int c;
*n = i;
i += m;
for (c = 0; c < nCat; c++)
if ((*s2)[0] == Cat[c][0] && catLoc < strlen(Cat[c]))
*varRep = Cat[c][catLoc];
}
else if (cont)
cont = FALSE;
}
break;
default:
cont = TryCat(&env[j], &word[i], &m, &catLoc);
if (cont && !m)
{
/* no category applied */
cont = i < strlen(word) && word[i] == env[j];
m = 1;
}
if (cont)
i += m;
if (!cont && optional)
cont = TRUE;
}
}
if (cont && printRules)
printf(" %s->%s /%s applies to %s at %i\n",
*s1, *s2, env, word, *n);
return(cont);
}
このサイトでは、コードの色分けがよくなっています。ペーストビンを使用しても人気がありません。あなたの質問の書式を整えて公式化することも、答えを得る良い方法です。 – gnud
コメントにコピー:リンクではなく、関連する最小コードサンプルを投稿に含めてください。 ありがとう! –
あなたの質問の情報によれば、パラメータが何のためのものなのか知っているので、実際に何を表すかを表すように名前を変更するべきでしょう。 s1とs2は変数のひどい名前です。 –