bir yapıyı bir işleve geçirmek çalışmıyor [yineleme]

Aug 16 2020

Aşağıdaki kodda, int'i bir yapı içinde ikiye bölmek için main dışında bir fonksiyon oluşturdum.

Bundan sonra yeni değeri yazdırmak istiyorum. Ancak, çıktı değeri hala eski değerdir.

Yapı ve işaretçiler hakkındaki temel bilgimin yeterince iyi olmadığına inanıyorum.

Biri bana bu konuda yardım edebilir mi? Çok teşekkürler!!!

typedef struct{
    int age;
    int wage;
}person;


void divide(person A)
{
    person half;
    half.age = A.age / 2;
    half.wage = A.wage / 2;
    
    A = half;
}

int main(void)
{
    person A;
    A.age = 30;
    A.wage = 35000;
    
    divide(A);
    
    printf("%i\n", A.age);

}

Yanıtlar

1 Miket25 Aug 16 2020 at 07:56

İşlev divide, yapılar değer bakımından geçtiği için bu yapının bir kopyasını değiştiriyor. İşlevin orijinali değiştirebilmesi için işaretçiyi yapıya iletmeniz gerekecektir.

void divide(person* A)
{
    person half;

    half.age  = A->age  / 2;
    half.wage = A->wage / 2;
    
    *A = half;
}

divideOrijinal yapının adresi ile çağrıldı

divide(&A);
2 Peter Aug 16 2020 at 08:05

Sınavı geçtikten sonra Aiçin divide, bir kopyası Aoluşturulur. Bu kopyayı içeride değiştirmenin, içinde tanımladığınız divideyerel değişken üzerinde hiçbir etkisi yoktur . Bu durumu düzeltmek için yapabileceğiniz bir almak işaretçi için . Bir işaretçi, bellekteki bir adresi etkili bir şekilde temsil eder, böylece onu örneğin, normalde erişilemeyen diğer işlevlerde tanımlanan yerel değişkenlere erişmek için kullanabilirsiniz (bunun nedenini anlamak istiyorsanız, araştırma yığını çerçeveleri ).Amaindivideperson

Yani pratikte değiştirmek divide: için 'ın imzasını void divide(person *A)ve değil assing bu fonksiyonun son satırında Ane olursa olsun bunlarla AKQUEUE operatörünü kullanarak işaret ediyor: *A = half. Senin içinde mainişleve sonra geçmesi adresini ait Ayerine Akendisine divideoperatörünün adresini kullanarak: divide(&A).

DÜZENLEME: daha da iyisi, halfdoğrudan gerçekleştirerek geçici olanı oluşturmaktan kaçınabilirsiniz : A->age /= 2ve sözdizimsel şeker A->wage /= 2nerede ?A.x(*A).x