Kérdés:
Hogyan deklarálhatok változó méretű tömböt (globálisan)
user3.1415927
2014-08-14 01:23:08 UTC
view on stackexchange narkive permalink

Három azonos hosszúságú tömböt szeretnék készíteni. A dokumentáció szerint a tömböket úgy kell meghatározni, hogy int myArray [10]; ahol 10-et egy ismert hosszúsággal (egy másik egész számmal) helyettesíthetünk, vagy egy tömböt tölthetünk fel {2, 3, 5, 6, 7} .

Amikor azonban megpróbáltam deklarálni egy értéket: int arrSize = 10; , majd egy tömböt az int myArray [arrSize]; méret alapján a következőt kapom: hiba: a tömböt kötött nem egész konstans .

Van-e mód arra, hogy változóan meghatározzuk a tömbméreteket, vagy csak át kell írnom őket? (Nekem azt tanították, hogy a keménykódolás rossz, és minden áron kerülendő.)

Nekem hasonló problémám volt, és ezt tettem. Én is tanulok, így nem tudom megmondani, hogy érvényes megoldás-e vagy sem, de sikerült. Lásd a kódok alábbi részét a vektorok használatával: elég sok időbe telt, mire elkezdtem megérteni őket, és még mindig nem vagyok szakértő: #include #include #include #include #include névtér std használatával; int main () {karakterlánc neve; karakterlánc címe; vonós város; húros ország; string válasz; vektor > personData; for (;;) {vektor myTempData; cout << "írja be a nevet vagy az n-t a kilépéshez" << endl; getline (cin, név); ha (név == "n") {bre
Négy válaszokat:
jfpoilpret
2014-08-14 01:40:33 UTC
view on stackexchange narkive permalink

A kérdésednek valójában 2 része van.

1 / Hogyan tudom deklarálni a tömb állandó méretét a tömbön kívül?

használjon makrót

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

vagy használjon konstans

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

ha inicializálta a tömböt, és tudnia kell a méretét, akkor megteheti:

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

a második a sizeof a tömb minden elemének típusánál szerepel, itt int.

2 / Hogyan lehet egy tömb, amelynek mérete dinamikus ( azaz futásidejéig nem ismert)?

Ehhez dinamikus elosztásra lesz szükség, amely működik az Arduino-n, de általában nem ajánlott, mivel ez a "halom" szétaprózódását okozhatja. p>

Megteheti (C út):

  // Declarationint * myArray = 0; int myArraySize = 0; // Allocation (le t feltételezzük, hogy a méret tartalmaz néhány futás közben felfedezett értéket, // pl. valamilyen külső forrásból nyert) if (myArray! = 0) {myArray = (int *) realloc (myArray, size * sizeof (int));} else {myArray = (int *) malloc (size * sizeof (int)) ;}  

Vagy (C ++ módon):

  // Declarationint * myArray = 0; int myArraySize = 0; // Allocation (tegyük fel, hogy a méret tartalmaz futás közben felfedezett valamilyen érték, // pl. valamilyen külső forrásból vagy más programlogikából származik) if (myArray! = 0) {delete [] myArray;} myArray = new int [size];  

Ha többet szeretne tudni a kupac töredezettségével kapcsolatos problémákról, olvassa el ezt a kérdést.

1) "ARRAY_SIZE = size of myArray / sizeof myArray [0];", így megváltoztathatja a myArray típusát hibák bevezetése nélkül. Ugyanezen okból a "myArray = realloc (myArray, méret * sizeof * myArray);". BTW, a "malloc ()" vagy a "realloc ()" visszatérési értékének öntése szintén haszontalan. 2) A "myArray! = 0" ellenőrzése a C változatban haszontalan, mivel a "realloc (NULL, sz)" egyenértékű a "malloc (sz)" kifejezéssel.
const int ARRAY_SIZE = 10; int myArray [ARRAY_SIZE]; Tényleg úgy gondolja, hogy lehetséges? Ez változatosan módosított tömb hibát eredményezne C-ben.
@ArunCheriyan C-ben nem tudom, de a C ++ - ban tökéletesen összeáll és fut. Mivel az Arduino C ++ alapú, itt nincs kérdés.
user2973
2014-08-14 01:37:53 UTC
view on stackexchange narkive permalink

A tömb méretét a fordítás idején ismerni kell. Ellenkező esetben dinamikusan kell kiosztania a memóriát a következő használatával:

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

ahol x (egész szám) használható legyen beállítva az alkalmazáskódban (betöltheti az eeprom-ból, ha állandó, de konfigurálható beállítást szeretne).


Ha azonban csak néhány azonos méretű tömböt szeretne deklarálni, egyszerűen deklarálnunk kell a számot egy ilyen állandóvá:

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

Úgy gondolom, hogy a keménykódolás nélküli dolgoknak csak akkor van értelme, ha ésszerűen elvárnád, hogy a felhasználó valamikor megváltoztassa a beállítást. Nem tudom, hogy így van-e.

A méret szimbolikus kódolása szó szerinti helyett két előnnyel járhat: 1) A jól megválasztott szimbólum dokumentálja, vagy legalábbis sugallja a választás okát; és 2) amikor a program vagy modul más részeit ehhez a választáshoz kell igazítani, az ugyanazon szimbólumot használó kifejezés megkönnyítheti ezt az automatikát, a * karbantartást * sokkal könnyebbé téve.
[A témától kissé eltekintve, de] a "felhasználó" kétértelmű, mivel sok ember közül egyet jelenthet. Ez általában magában foglalja a végfelhasználót, a végtermék fogyasztóját, ha másként nem jelezzük. Lehet, hogy a következő programozó, a kódod következő fogyasztója, aki valójában * te * lehetsz (tipikus, saját tapasztalataim szerint) egy vagy több évvel azután, hogy elfelejtettem a csöppnyi belső részleteket ). Vagy egy rendszertervező, aki a kódját kész modulként tartalmazza a termékében. Gyanítom, hogy a második "felhasználóra" gondolt.
MichaelT
2018-05-30 03:16:36 UTC
view on stackexchange narkive permalink

Ha ismeri a tömb maximális hosszát, csak inicializálja a tömböt erre a hosszúságra, és egész szám segítségével mondja meg a programnak, hogy a tömb mekkora részét használja. Ha ez a 7,10 bájt közötti különbség, akkor nem pazarolja a memória kiosztását.

NibboNSX
2019-01-16 12:29:51 UTC
view on stackexchange narkive permalink

Tudom, hogy itt egy kicsit elkéstem, de elméletileg nem lehet szabályos tömböket létrehozni egy változó segítségével, hogy meghatározzuk a tömbben lévő elemek mennyiségét, mint:

  int arrSize; int myArray [arrSize];  

Ez hibát jelenít meg, mivel a tömb deklarálásakor a program arra számít, hogy a zárójelek közötti érték állandó lesz. Van azonban egy módja annak, hogy létrehozhat egy tömböt egy változóval, amely meghatározza az értékek mennyiségét, amelyeknek a tömböknek rendelkeznie kell az értékkészletek dinamikus memória-allokációjával (ezt a módszert csak monodimenziós tömbökkel tesztelték, még nem próbálták többdimenziós), és valami ilyesmi történik:

  // Először hozzon létre egy mutatót a létrehozandó halmaz számára elválasztandó memóriaterülethezintint * myArray; int arrSize; // Ezután definiálja azt a változót, amely meghatározza a tömbben lévő elemek mennyiségét, adhat neki értéket, amikor csak akarja, mindaddig, amíg ez az int meg van adva, mielőtt a myArray értékei be vannak állítva myArray = (int *) calloc (arrSize, sizeof (int)) // Itt állíthatja be, hogy a myArray példányt (amelynek memóriaterületét a mutató létrehozása már elkülönítette) az int típusú elemek maximális memóriaértékű arrSize elemére választják szét (bájtban) megegyezik az int típusú változók számára elérhető maximális értékkel  

Ezek után már csak annyit kell tennie, hogy hozzárendel egy értéket a myArray példányban létrehozott minden elemhez (ami már egy Array by now), mint egy myArray [arrSize] néven létrehozott normál tömb esetén.



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...