SORU
11 Mart 2012, Pazar


Return `` C bir işlev bir yapı

Bugün C structler kullanmak için nasıl bir kaç arkadaş öğretiyordum. Eğer birisi diye cevap verdim hangi fonksiyon struct getiri misin diye sordu: "Hayır! Dinamik malloced structyerine s işaretçiler iade edersin."

Öncelikle C yapan biri geliyor , bekliyor değerler tarafından structs dönmek mümkün değil. C nesneleri için operator = aşırı yük ve fonksiyonu nesneyi döndürmek için tam mantıklı değer. C, ancak, bu seçeneği yok ve bu yüzden derleyici aslında ne yaptığını düşünmeye başladım. Aşağıdakileri göz önünde bulundurun:

struct MyObj{
    double x, y;
};

struct MyObj foo(){
    struct MyObj a;

    a.x = 10;
    a.y = 10;

    return a;
}        

int main () {

    struct MyObj a;

    a = foo();    // This DOES work
    struct b = a; // This does not work

    return 0;
}    

struct b = a; veri türü için aşırı yük operator = yapamazsınız -- çalışması gerektiğini anlıyorum. Nasıl a = foo(); güzel derler? Bir şey struct b = a; başka bir anlamı yok mu? Belki de soru şu: tam olarak = imzalamak için birlikte return deyimi Ne yapar?

[edit]: Tamam, Sadece struct b = a doğru sözdizimi bir hata ... ve bir aptal olduğumu işaret ettim! Ama bu onu daha da karmaşık hale getiriyor! struct MyObj b = a kullanarak gerçekten işe yarıyor! Burada neyi kaçırıyorum?

CEVAP
11 Mart 2012, Pazar


Herhangi bir sorun olmadan bir fonksiyon (ya da = operator) bir yapı dönebilirsiniz. Dili iyi tanımlanmış bir parçası. struct b = a ile tek sorun, tam bir yazın vermedi. struct MyObj b = a sadece iyi çalışır. Yapıları iletebilirsiniziçinde fonksiyonlar - yapı tam olarak parametre geçme, dönüş değerleri ve atama amacıyla yerleşik türü ile aynıdır.

İşte üç tüm parametre olarak bir yapı geçirir, bir işlevi bir yapı verir ve atama deyimleri yapıları kullanan basit bir gösteri programı:

#include <stdio.h>

struct a {
   int i;
};

struct a f(struct a x)
{
   struct a r = x;
   return r;
}

int main(void)
{
   struct a x = { 12 };
   struct a y = f(x);
   printf("%d\n", y.i);
   return 0;
}

Bir sonraki örnek, hemen hemen tam olarak aynıdır, ama gösteri amaçlı dahili int türünü kullanır. İki program-by-pass değer parametre geçirilmesi, ödev, vb. açısından aynı davranış var:

#include <stdio.h>

int f(int x) 
{
  int r = x;
  return r;
}

int main(void)
{
  int x = 12;
  int y = f(x);
  printf("%d\n", y);
  return 0;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FrameCityJackal

    FrameCityJac

    4 Aralık 2010
  • Randall P Studios

    Randall P St

    27 AĞUSTOS 2009
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011