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.value
char *
(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.
Daha fazla kod göster. BTW '(* st).' Yazılmalıdır 'st. –
@michael waltz: İtme yöntemi şu şekilde çağrılıyor: push (& stack1, currentToken); – bzak
Bize hem kod çağırma basamağını hem de tüm dizinin güncellendiğini bildiren kodu göster. –