2013-08-12 4 views
3

j'ai un struct lié à résoudre le problème des portes logiques ... mais je doute sur le fonctionnement du struct lié, et comment puis-je utiliser leurs valeursstruct Linked in C

Donc, ce qui est mon code :

typedef enum { NEG, AND, OR, NAND, NOR, XOR, XNOR }Gates; 

struct AstLogic 
{ 
    bool input1; 
    bool input2; 
    bool result; 
    Gates gate; 
    struct AstLogic *nextGate; 
}; 

et les fonctions de test est la suivante:

struct AstLogic ast1, ast2, ast3; 

// 
//  1-|ast1| 
//  1-|____|+-------+ 
//      | 
//      +|ast3| 
//      +|____|+----+ OUTPUT 
//      | 
//  1-|ast2|+-------+ 
//  0-|____| 
// 

void createInputsTest() 
{ 
    ast1.gate = NOR; 
    ast1.input1 = true; 
    ast1.input2 = true; 
    ast3.result = ~(ast1.input1|ast1.input2); 

    ast2.gate = NOR; 
    ast2.input1 = true; 
    ast2.input2 = false; 
    ast2.result = ~(ast2.input1|ast2.input2); 
    ast1.nextGate = &ast2; // make the link 

    ast3.gate = NOR; 
    ast3.input1 = ast1.result; 
    ast3.input2 = ast2.result; 
    ast3.result = ~(ast3.input1|ast3.input2); 

    if(ast3.result == true) 
     printf("true"); 
    else 
     printf("false"); 
} 

Je viens whant de savoir, si un bon whay à auto-obtenir le résultat "de sortie", en utilisant cette logique AST ... Par exemple e, j'entre avec un fichier avec la logique, et mon programme fait l'analyse dans ce fichier et génère cet ast, comment est le meilleur whay pour générer ce ast?

questions sont bêtes, mais ne savent pas comment résoudre, alors je suis venu ici à Stackoverflow de prendre mes doutes, parce que je ne sais pas comment résoudre ces doutes ...

+1

Vous avez "NON" comme une fonction qui brise le motif. Mais, en ignorant cela, je suggère d'utiliser des pointeurs de fonction au lieu d'exécuter l'opération logique dans votre code de test. Ensuite, vous devez trouver tous les nœuds sans parent et travailler votre chemin jusqu'à la fin. – HonkyTonk

+0

Ceci est un exemple classique d'où la conception orientée objet pourrait être utile, avec une classe pour "Gate" et des sous-classes pour chaque type. Si vous ne pouvez pas ou ne voulez vraiment pas utiliser C++, vous pouvez l'émuler en utilisant des pointeurs de fonction comme le suggère @HonkyTonk, mais c'est essentiellement comme cela que C++ le fait sous le capot. – chrylis

+0

Vous pouvez faire vos pointeurs d'entrée aux objets AstLogic - alors, pour obtenir la valeur booléenne d'entrée, ce serait par ex. 'ast2.input1-> résultat'. – sje397

Répondre

0

Votre createInputsTest() a été faux. Voici la bonne version.

struct AstLogic ast1, ast2, ast3; 

// 
//  1-|ast1| 
//  1-|____|+-------+ 
//      | 
//      +|ast3| 
//      +|____|+----+ OUTPUT 
//      | 
//  1-|ast2|+-------+ 
//  0-|____| 
// 

void createInputsTest() 
{ 
    ast1.gate = NOR; 
    ast1.input1 = true; 
    ast1.input2 = true; 
    ast1.nextGate = &ast3 

    ast2.gate = NOR; 
    ast2.input1 = true; 
    ast2.input2 = false; 
    ast2.nextGate = &ast3; 

    ast3.gate = NOR; 
    ast1.nextGate->input1 = ~(ast1.input1|ast1.input2); 
    ast2.nextGate->input2 = ~(ast2.input1|ast2.input2); 
    ast3.result = ~(ast3.input1|ast3.input2); 

    if(ast3.result == true) 
     printf("true"); 
    else 
     printf("false"); 
} 
1

Clever. Dans cet exemple, le champ next n'est pas nécessaire. Le lien entre les portes est à travers les champs d'entrée où l'entrée d'une porte plus tard (dans le temps) se réfère à la sortie d'une porte plus tôt dans le temps. Pour générer un arbre de syntaxe abstraite (AST), vous devez d'abord définir comment stocker les portes de votre circuit sur un fichier, y compris nommer les portes et avoir un texte qui relie la sortie des portes à l'entrée d'une autre . Ensuite, lisez ce fichier, construisez un AST, puis parcourez-le en réglant les valeurs au fur et à mesure que vous franchissez les portes en temps simulé. Globalement, un grand projet mais facile à moyen.

Cependant, vous pouvez faire ce que vous avez fait, c'est-à-dire lister les portes dans l'ordre chronologique et laisser le programme traverser implicitement les portes.