Hier ist der Deal: Ich versuche, als Lernerfahrung, ein C-Programm in C++ zu konvertieren. This program nimmt eine Textdatei und wendet Änderungen entsprechend den vom Benutzer eingegebenen Regeln an. Insbesondere wendet es Lautänderungen auf eine Reihe von Wörtern an, wobei Regeln verwendet werden, die wie "s1/s2/env" formatiert sind. s1 stellt die Zeichen dar, die geändert werden sollen, s2 gibt an, in was geändert werden soll, und env ist der Kontext, in dem die Änderung angewendet werden soll.Brauchen Sie Hilfe, eine C-Funktion zu verstehen
Es tut mir leid, dass ich dies nicht ausführlicher beschreibe, aber die Frage wäre zu lang, und die Website des Autors erklärt es bereits.
Die Funktion, die ich habe Probleme ist TryRule. Ich verstehe, dass es sehen soll, ob eine gegebene Regel auf eine gegebene Zeichenfolge zutrifft, aber ich habe Probleme, genau zu verstehen, wie es funktioniert. Die schlechte Erklärung der Parameter verwirrt mich: Zum Beispiel verstehe ich nicht, warum die Strings "s1" und "s2" zurückgegeben werden müssen oder was "i" bedeutet.
Dies ist der Code:
/*
** 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);
}
Diese Seite hat eine gute Code-Färbung - die Verwendung von Pastebin wird Sie nicht sehr beliebt machen. Formatieren und formulieren Sie Ihre Frage besser ist auch eine gute Möglichkeit, Antworten zu erhalten. – gnud
Kopiert, um zu kommentieren: Bitte geben Sie das relevante Codebeispiel in den Beitrag ein und nicht als Link. Danke! –
Nach den Informationen in Ihrer Frage wissen Sie, wofür die Parameter sind. Vielleicht sollten Sie sie umbenennen, damit sie darstellen, wofür sie eigentlich sind. s1 und s2 sind schreckliche Namen für Variablen. –