SORU
21 AĞUSTOS 2010, CUMARTESİ


C dinamik olarak büyüyen dizi

Bir programım var. okur bir "ham" liste oyun içi varlıklar ve niyetliyim için bir dizi tutan bir dizin numarası (int) belirsiz sayıda varlıklar, işleme çeşitli şeyler. Çok fazla bellek kullanarak önlemek ya da bu tür dizinler tutmak için CPU etmek istiyorum...

Bir hızlı ve kirli bir çözüm kullanıyorum şimdiye kadar bildirmek için, ana işleme fonksiyonu (yerel odak) dizisi ile bir boyutu maksimum oyun Kurumlarına, başka bir tamsayı için takip edin kaç tane eklendi listeye. Bu mümkün farklı fonksiyonlar için 6-7 listeler çözümü için kullanacağım beri her liste bu kadar değil 3000 diziler tutar, ama bir atık gibi hissediyor olarak tatmin edici değil.

Herhangi bir C bulamadım (C veya C#) özel çözümler bunu başarmak için. İşaretçiler kullanabilirsiniz, ama biraz onları mümkün olan tek çıkış yolu değilse () kullanarak korkuyorum.

Diziler bu bazı şeyleri değiştirir diye yerel bir fonksiyon kapsamı (fonksiyon geçirilecek, sonra bunlar atılır) bırakmayın.

Eğer işaretçiler tek çözüm ise, onları nasıl sızıntıları önlemek için takip edebilirim?

CEVAP
21 AĞUSTOS 2010, CUMARTESİ


İşaretçiler kullanabilirsiniz, ama biraz onları kullanmaya korkuyorum.

Eğer dinamik bir dizi gerekiyorsa, işaretçiler kaçamazsın. Ama niye korkuyorsun? Isırmaz (dikkatli olduğun sürece). -Dahili C dinamik bir dizi yok, sadece Kendin yazabilirsin. C , yerleşik std::vector sınıfını kullanabilirsiniz. C# ve üst düzey diğer her dil de dinamik bir dizi yönetir benzeri bir sınıf var.

Eğer planı için kendi kitabını yaz, burada bir şey başlamak için en dinamik dizi uygulamaları çalışması ile başlayan bir dizi bazı (küçük) varsayılan boyutu, ne zaman tükendi boşluk eklerken, yeni eleman, iki katı büyüklüğe sahip dizisi. Örnek olarak aşağıda gördüğünüz gibi, çok zor değil: (kısalık için güvenlik kontrolleri ihmal ettim)

typedef struct {
  int *array;
  size_t used;
  size_t size;
} Array;

void initArray(Array *a, size_t initialSize) {
  a->array = (int *)malloc(initialSize * sizeof(int));
  a->used = 0;
  a->size = initialSize;
}

void insertArray(Array *a, int element) {
  if (a->used == a->size) {
    a->size *= 2;
    a->array = (int *)realloc(a->array, a->size * sizeof(int));
  }
  a->array[a->used  ] = element;
}

void freeArray(Array *a) {
  free(a->array);
  a->array = NULL;
  a->used = a->size = 0;
}

Sadece basit kullanma

Array a;
int i;

initArray(&a, 5);  // initially 5 elements
for (i = 0; i < 100; i  )
  insertArray(&a, i);  // automatically resizes as necessary
printf("%d\n", a.array[9]);  // print 10th element
printf("%d\n", a.used);  // print number of elements
freeArray(&a);

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011
  • videoisunrelated

    videoisunrel

    5 Mart 2009
  • WhtButterflyLiz

    WhtButterfly

    14 NİSAN 2008