2016-03-24 18 views
0

önceki tüm dizinleri günceller struct s dizinine bir metot basar, ssddaya kadar tüm dizi s.data'yı (indeks topuna kadar) yerine yeni endeks değeri ile birlikte belirtilen endeks verisi [top]. Bunun neden olduğu hakkında bir fikrin var mı?C aşağıdaki gibi bir yapı var

struct Stack stack1; 
    stack1.top = -1; 

    readNext(); 
    //currentToken.value == "class" 
    push(&stack1,currentToken); 

    readNext(); 
    //currentToken.value == "test" 
    push(&stack1,currentToken); 

    readNext(); 
    //currentToken.value == "{" 
    push(&stack1,currentToken); 

    readNext(); 
    //currentToken.value == "int" 
    push(&stack1,currentToken); 

    printStack(stack1); 

çıktısı:

int 
int 
int 
int 
+1

Daha fazla kod göster. BTW '(* st).' Yazılmalıdır 'st. –

+0

@michael waltz: İtme yöntemi şu şekilde çağrılıyor: push (& stack1, currentToken); – bzak

+1

Bize hem kod çağırma basamağını hem de tüm dizinin güncellendiğini bildiren kodu göster. –

cevap

2

ben basmalı yöntemini çağırın her zaman bir yapı Stack ler, bunun yerine yeni bir değerle (endeksi en olana kadar) bütün dizi s.data günceller sadece belirtilen indeks verisinin [top].

Hayır, öyle değil. Sadece bir d->data elemanı değiştirilmiştir. Geçirilen jetonun değeri (değerini kopyalayarak) push() işlevine, o diziye tek bir öğeye kopyalanır.

Bunun neden olduğu hakkında herhangi bir fikrin var mı?

Güncellenmekte olan tüm dizi öğelerini görüyorsunuz çünkü bir çeşit takma adınız var çünkü. push() işlevi açık - neredeyse sorun kesinlikle yeni belirteçler oluşturmak için kullandığınız işlevdir. Örneğin

, böyle bir şey olabilir:

/* Hypothetical example */ 

struct Token { 
    int type; 
    char *value; 
}; 

char buffer[100]; 

void readTokens() { 
    Struct Stack stack = { -1 }; 
    struct Token tok; 

    while (scanf("%s", buffer) == 1) { 
     tok.value = buffer; /* the error is here in this case */ 
     tok.type = 42; 
     push(&stack, tok); 
    } 
} 

tüm kopyaları, nokta dahil olduğu söz konusu olduğunda tüm jetonları, içinde value üyeleri aynıchar[], içeriğini güncellenmesini Not her defasında yeni bir jeton okunur. Her biri, bunun yerine dizinin bir kopyasına bir işaretçi almalıdır. Genel olarak, bu gibi kopyaların strdup() aracılığıyla dinamik olarak tahsis edilmesi gerekecektir.

GÜNCELLEME: Yayınladığınız

ek kod kesin değil, ama bu benim tanısı ile tutarlıdır. currentToken.valuechar * (char[]'un aksine) ve readNext(), yukarıda açıkladığım gibi yeni bir işaretçi atamak yerine işaret ettiği diziyi değiştirirseniz, açıkladığınız davranışı gözlemlersiniz.

+0

Teşekkürler boş bir anım vardı.CurrentToken değerini, sürekli olarak değişen currentToken 'e işaret etmek için array [top]' ı ayarlamak yerine push yönteminde kopyalamam gerekir. – bzak

+0

@ Zak00, hayır, anlamıyorsunuz. Zaten 'currentToken 'öğesini' push()' öğesine ilettiğinizde ve bu kopyayı bir dizi öğesine atadığınızda zaten kopyalıyorsunuz. Sorun şu ki, kopyaladığınız şey bir statik arabelleğe veya benzer bir şeye işaretçi içerir. –