Değişken boyutlu bir diziyi nasıl bildirebilirim (Global olarak)


18

Aynı uzunlukta üç dizi yapmak istiyorum. Belgelere göre , Diziler int myArray[10];10'un bilinen bir uzunluk (başka bir tamsayı) ile ikame edilebileceği veya bir dizi ile doldurulabileceği şekilde tanımlanmalıdır {2, 3, 5, 6, 7}.

Bir değer beyan çalışırken Ancak, int arrSize = 10;o boyutuna göre daha sonra bir dizi int myArray[arrSize];, ben izleyici kitlesi elde: error: array bound is not an integer constant.

Dizi boyutlarını değişken olarak belirlemenin bir yolu var mı, yoksa sadece bunları kodlamam gerekiyor mu? (Hardcoding kötü ve her ne pahasına önlemek için bir şey öğretildi.)


Benzer bir sorunum vardı ve bunu yaptım. Ben de öğreniyorum yani geçerli bir çözüm olup olmadığını söyleyemem ama işe yaradı. Vektörleri kullanan kodun altına bakın, onları anlamaya başlamak biraz zaman aldı ve hala hiçbir şekilde uzman değilim: #include <string> #include <vector> #include <iostream> #include <algoritma> #include <string.h> ad alanı std kullanarak; int main () {dize adı; dize adresi; ip kasabası; dize ülkesi; dize cevabı; vector <vector <string>> personData; için (;;) {vector <string> myTempData; cout << "isim girin veya çıkmak için n" << endl; getline (cin, isim); if (name == "n") {bre
Misterxp

Yanıtlar:


22

Sorunuz aslında 2 bölümden oluşuyor.

1 / Dizinin dışındaki bir dizinin sabit boyutunu nasıl bildirebilirim?

Bir makro kullanabilirsiniz

#define ARRAY_SIZE 10
...
int myArray[ARRAY_SIZE];

veya sabit kullanın

const int ARRAY_SIZE = 10;
...
int myArray[ARRAY_SIZE];

diziyi başlattıysanız ve boyutunu bilmeniz gerekiyorsa şunları yapabilirsiniz:

int myArray[] = {1, 2, 3, 4, 5};
const int ARRAY_SIZE = sizeof(myArray) / sizeof(int);

ikincisi sizeof, dizinizin her öğesinin türünde, burada int.

2 / Boyutu dinamik olan bir diziye nasıl sahip olabilirim (yani çalışma zamanına kadar bilinmiyor)?

Bunun için Arduino üzerinde çalışan dinamik ayırmaya ihtiyacınız olacak, ancak genellikle "yığın" ın parçalanmasına neden olabileceği için tavsiye edilmez.

Şunları yapabilirsiniz (C yolu):

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source)
if (myArray != 0) {
    myArray = (int*) realloc(myArray, size * sizeof(int));
} else {
    myArray = (int*) malloc(size * sizeof(int));
}

Veya (C ++ yolu):

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source or through other program logic)
if (myArray != 0) {
    delete [] myArray;
}
myArray = new int [size];

Yığın parçalanmasıyla ilgili sorunlar hakkında daha fazla bilgi için bu soruya başvurabilirsiniz .


4
1) ARRAY_SIZE = sizeof myArray / sizeof myArray[0];, bu şekilde myArray'ın türünü hataları tanıtmadan değiştirebilirsiniz. Aynı nedenden dolayı myArray = realloc(myArray, size * sizeof *myArray);. BTW, dönüş değerinin dökümünü yapar malloc()veya realloc()işe yaramaz. 2) myArray != 0C versiyonunda kontrol realloc(NULL, sz)etmek, eşdeğer olduğu gibi işe yaramaz malloc(sz).
Edgar Bonet

const int ARRAY_SIZE = 10; int myArray [ARRAY_SIZE]; Gerçekten mümkün olduğunu mu düşünüyorsun? Bu, C'de değişken şekilde değiştirilmiş dizi hatası verir.
Arun Joe Cheriyan

@ArunCheriyan CI bilmiyorum, ama C ++ 'da derler ve mükemmel çalışır. Arduino C ++ tabanlı olduğundan, burada bir sorun yoktur.
jfpoilpret

0

Dizinin boyutu derleme zamanında bilinmelidir. Aksi takdirde aşağıdakileri kullanarak belleği dinamik olarak ayırmalısınız:

char *chararray = malloc(sizeof(char)*x);

burada x (bir tam sayı) uygulama kodunda ayarlanabilir (kalıcı, ancak yapılandırılabilir bir ayar olmasını istiyorsanız eeprom'dan yükleyebilirsiniz).


Ancak, sadece aynı boyuttaki bazı dizileri bildirmek istiyorsanız, sayıyı aşağıdaki gibi bir sabit olarak bildirmeniz gerekir:

const int arrsize = 10;
char array1[arrsize];
int array2[arrsize];

Ben sabit kodlama şeyler sadece kullanıcının bir noktada ayarı değiştirmek istemek makul olacağını düşünüyorsanız mantıklı olduğunu düşünüyorum. Durumun bu olup olmadığını bilmiyorum.


Boyutları kelimenin tam anlamıyla değil, sembolik olarak kodlamak iki fayda sağlayabilir: 1) İyi seçilmiş bir sembol dokümanı veya en azından seçim nedenini önerir; ve 2) programın veya modülün diğer bölümlerinin bu seçime göre uyarlanması gerektiğinde, aynı simgeyi kullanan bir ifade, otomasyonu otomatik hale getirerek bakımı daha kolay hale getirebilir .
JRobert

[Biraz konu dışı, ama] "kullanıcı" belirsizdir çünkü birkaç kişiden biri anlamına gelebilir. Aksi belirtilmedikçe genellikle son kullanıcıyı, nihai ürünün tüketicisini ifade eder. Bir sonraki programcı, kodunuzun hemen bir sonraki tüketicisi olabilir, aslında, onun cesur cesur iç ayrıntılarını unuttuktan bir yıl veya daha fazla ( siz , tipik olarak, kendi deneyimlerime göre) olabilirsiniz. Veya kodunu ürününde kullanıma hazır bir modül olarak içeren bir sistem tasarımcısı. İkinci "kullanıcı" anlamına geldiğinden şüpheleniyorum.
JRobert

0

Dizinin maksimum uzunluğunu biliyorsanız, diziyi bu uzunluğa başlatın ve programa bu dizinin ne kadarını kullanacağını söylemek için bir tam sayı kullanın. 7,10 bayt arasındaki fark ise, o kadar çok bellek ayırma harcamazsınız.


0

Burada biraz geç kaldığımı biliyorum, ama teoride diziler gibi olacak öğelerin miktarını tanımlamak için bir değişken kullanılarak düzenli diziler oluşturulamaz:

int arrSize;
int myArray[arrSize];

Dizi bildirilirken, program parantezler arasındaki değerin sabit olmasını beklediğinden bu bir hata görüntüler. Yine de, bu dizilerin değer kümeleri için dinamik bellek ayırma yoluyla sahip olacağı değerlerin miktarını tanımlayan bir değişkenle bir dizi oluşturmanın bir yolu vardır (bu yöntem yalnızca tek boyutlu dizilerle test edilmiştir, henüz çok boyutlu) ve şuna benzer:

//First you create a pointer for the memory space to be separated for the set you're creating
int* myArray;
int arrSize; //Then you define the variable that will determine the amount of elements the array is going to have, you can give it a value whenever you want as long as this int is defined before the values in myArray are set 
myArray=(int*)calloc(arrSize,sizeof(int)) //Here, you establish that the instance myArray (whose memory space has already been separated through the creation of the pointer) will be separated into arrSize amount of elements of type int with a maximum memory value (in bytes) equal to the maximum available for the int type variables

Bundan sonra, geriye kalan tek şey myArray [arrSize] olarak oluşturulan normal bir dizi için yaptığınız gibi myArray örneğinde (şimdiye kadar zaten bir Array olan) oluşturulan her öğe için bir değer atamaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.