Frage

Ich stecke in Schwierigkeiten, leider lerne ich immer noch die Details dieser Sprache.

Ich habe den folgenden Code

#define SIZE 5
typedef struct 
{
    int start;
    int end;
    int nElements;
    int vetor[SIZE];
} TSTACK;

Und ich versuche, Werte in seinem Array mit der folgenden Funktion einzufügen:

void Push(TSTACK *s, int elementInsert)
{
    if(IsFull(s))
    {
        printf("%s\n", "# ERROR: full.");
    }
    else
    {
        s->end++;
        if(s->end == SIZE)
        {
            s->end = 0;
        }

        s->vetor[s->end] = elementInsert;
        s->nElements++;
    }
}

Und ich verwende die folgende Funktion, um Elemente anzuzeigen:

void Display(TSTACK *s)
{
    int i;
    if (isEmpty(s))
    {
        printf("%s\n", "# ERROR: empty");
    }
    else
    {
        for (i = 0; i < s->nElements; i++) 
        {
            printf ("value: %d\n", s->vetor[i]);
        }
    }
}

Meine Frage ist, dass ich nicht dasselbe Ergebnis bekomme, wenn ich eine andere Anzahl von Elementen hinzufüge. Wenn ich 5 Elemente einfüge, zeigt die Anzeigefunktion alle Elemente korrekt an Zeiger:

Die folgenden Hauptergebnisse in 4201166, 3, 5, 7

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);

    Display(&test);
}

Die folgenden Hauptergebnisse in 5, 3, 5, 7, 3 resultieren

int main(void)
{
    TSTACK test;

    test.start = 1;
    test.end = 0;
    test.nElements = 0;

    Push(&test, 3);
    Push(&test, 5);
    Push(&test, 7);
    Push(&test, 3);
    Push(&test, 5);

    Display(&test);
}

Kann mir jemand zeigen, wo ich falsch liege?

War es hilfreich?

Lösung

Wenn Sie ein Element "einfügen", tun Sie es bei

s->vetor[s->end]

Aber bevor du das tust, du Zunahme s->end, also wird das erste Element bei sein s->vetor[1]. Seit dem ersten Element (s->vetor[0]) wird nicht initialisiert, Sie haben dort einen zufälligen Wert. Das ist der Grund, warum Sie zuerst einen seltsamen Wert im Vier-Wert-Einsatz haben.

Wenn Sie einen fünften Wert einfügen, haben Sie die Prüfung nach s->end == SIZE wo du setzst s->end Zu Null, so wird der letzte Wert in diesem Fall in erster Linie im Array enden.

Die Lösung, die beide oben genannten Probleme lösen wird, besteht darin, zu erhöhen s->end nach Sie haben den Wert dem Array zugewiesen.

Andere Tipps

Wenn Sie den Stapel drucken:

for (i = 0; i < s->nElements; i++) 
{
    printf ("value: %d\n", s->vetor[i]);
}

Sie beginnen bei Index 0, Ihre Stapel -Implementierung beginnt jedoch bei Index 1. Wenn Sie also weniger als 5 Elemente haben, wird das erste Element nicht initialisiert. Vielleicht können Sie dies beheben, indem Sie den Startwert auf 0 ändern.

Erstes Problem: Lokale Variablen werden nicht initialisiert, sie enthalten Müll, es sei denn, Sie initialisieren sie.

Zweites Problem: Sie beginnen bei Array Index 1 anstelle von 0 zuzuweisen. Nur wenn Sie fünf Elemente einfügen, funktioniert es, da Sie prüfen, ob end == SIZE und wenn ja gesetzt end = 0, Setzen Sie das erste Element das erste Element fest vetor[0].

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top