Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Muuttuja moniulotteiseen taulukkoon

Sivun loppuun

ByteMan [20.06.2007 10:40:18]

#

pitäisi siis tiedostosta luettu char-tyypin muuttuja tallettaa moniulotteiseen taulukkoon.
taulukko on muotoa

char taulukko[][20]=0;//alustetaan tyhjäksi

muuttuja on myös tyyppiä char:

char muuttuja[20]=0;//alustetaan tyhjäksi

ongelma vaan on se, että näille ei voi tehdä näin:

taulukko[1][20]=muuttuja;//virhe
taulukko[1][muuttuja];//virhe

käyttäisin c++:n string otsikkotiedostoa, jos olisi pienikin käsitys siitä, mitäs string-taulukot toimivat, jos toimivat...
onko ideoita?

Metabolix [20.06.2007 11:08:24]

#

Varmaankin taulukossa olet määritellyt tuon toisenkin dimension, eihän sitä tyhjäksi voi jättää. ^^ Tekstin kopiointi onnistuu strcpy- tai strncpy-funktiolla (string.h).

char taulu[1][20];

strcpy(taulu[0], teksti); // Ylivuotovaara, jos teksti on pidempi kuin taulu[0]

strncpy(taulu[0], teksti, 19); // Enintään 19 merkkiä, lisätään vielä itse varmuudeksi nollamerkki
taulu[0][19] = 0;

Markus [20.06.2007 11:45:11]

#

ByteMan kirjoitti:

käyttäisin c++:n string otsikkotiedostoa, jos olisi pienikin käsitys siitä, mitäs string-taulukot toimivat, jos toimivat...
onko ideoita?

Kannattaa käyttää string-vektoria:

#include <vector>
#include <string>

int main()
{

std::vector<std::string> taulukko(3, ""); // (koko,  alustusarvo)

taulukko[0] = "Sitä";
taulukko[1] = "sun";
taulukko[2] = "tätä";

return 0;
}

edit:

Huomaa, että string:ien ei tässä tarvitse olla yhtä pitkiä.
Voit tarvittaessa muuttaa string-vektorin kokoa resize-metodilla:

taulukko.resize(10, ""); // (uusi_koko, alustusarvo_uusille_alkioille)

(Mod. Edit. Kooditagit. Järkevä sisennyskin olisi suotavaa noin esimerkkikoodeissa.)

ByteMan [20.06.2007 12:25:54]

#

Metabolix kirjoitti:

Varmaankin taulukossa olet määritellyt tuon toisenkin dimension, eihän sitä tyhjäksi voi jättää. ^^

kyllä sen oikeestaan tilanteesta riippuen voi jättää tyhjäks...
en vaa tienny oikee mitä siihen laittas ku tiedostossa joka luetaan taulukkoon on päälle 90000 riviä et mietin asiaa
----------------------------------------------------
taidan siirtyä käyttämään tota string vektori juttuu vaikuttaa kätevämmältä...
kiitoksia avusta

jlaire [20.06.2007 12:39:26]

#

ByteMan kirjoitti:

kyllä sen oikeestaan tilanteesta riippuen voi jättää tyhjäks...

Pitää paikkansa, mutta tämä ei käsittääkseni ole niitä tilanteita. Vai onko kyseessä joku ero C:n ja C++:n välillä? Osaan vain C:tä enkä sitäkään kovin hyvin.

int array[] = {0, 0, 0};
int array[][N] = {{0}, {0}, {0}};

Näissä kokoa ei tarvitse merkitä, koska voidaan päätellä, että se on 3. Mutta jos laitat tuohon pelkän nollan, niin eihän kone voi tietää paljonko muistia täytyy varata.

ByteMan [20.06.2007 14:33:13]

#

juu oot oikeessa toi ei oo niit tilanteita...
eli tuleepa kuitenki törkeän kokoinen taulukko teki sitten vektoreilla tai ei(91592 alkiota^^) minkäs teet...
[edit]
olisko moniulotteinen(esim. 2D) vektori

vector<string> taulukko(3,4, "")

Metabolix [20.06.2007 15:06:11]

#

Mitä oikein selität? Ei se data pienemmäksi muutu, vaikka sen kuinka laittaisit.

ByteMan [20.06.2007 15:29:26]

#

meinasin olisiko moniulotteisen vektorin koodi syntaksi(tai mikä lie kirjoitus asu)

vector<string> taulukko(3,4, "")

kun esimerkiksi moniulotteisen taulukon syntaksi olisi

int moniulotteinentaulukko[3][5];

mutta pahoittelen jos tekstistä ymmärsi väärin... en yrittänyt sitä dataa pienentää =/

Heikki [20.06.2007 16:23:44]

#

ByteMan kirjoitti:

olisko moniulotteinen(esim. 2D) vektori

vector<string> taulukko(3,4, "")

2D-vektori toimii näin:

using std::vector;
using std::string;

// --

vector < vector<string> > riveja;  // Vektori vektoreita
vector<string> eka;
riveja.push_back(eka);
riveja[0].push_back("teksti 1");
riveja[0].push_back("teksti 2");
riveja.push_back(eka);
riveja[1].push_back("kolmas");

cout << riveja[0][1] << " - "  << riveja[1][0] << "\n";

Jolloin tulostus olisi: "teksti 2 - kolmas".

Markus [21.06.2007 11:55:30]

#

Lyhyempi tapa luoda 2D-vektori (eli vektorillinen (saman kokoisia) vektoreita)

#include <iostream>
#include <string>
#include <vector>

int main()
{
  //  5x6 2D-vektori
  std::vector< std::vector<std::string> > taulukko(5, std::vector<std::string>(6, ""));

  taulukko[2][3] = "Hello";
  taulukko[4][1] = "World";

  std::cout << taulukko[2][3] << " " << taulukko[4][1];

  return 0;
}

Metabolix [21.06.2007 12:19:45]

#

Ja käytännöllisempi, toiminnaltaan varmempi, vähemmän muistia käyttävä ja luultavasti myös nopeampi tapa esitellään koodivinkissä Dynaamiset taulukot. Ajatuksena siis on käyttää yksiulotteista vektoria kaksiulotteisena tähän tapaan:

#include <vector>

vector<int> taulu;
int kokox = 7, kokoy = 123;
taulu.resize(kokox * kokoy);
taulu[y * kokox + x] = 0;

ByteMan [21.06.2007 13:11:45]

#

metabloix: toimiiks toi myös string-tyyppiseen dataan?
mistä kaikenlisäksi ei etukäteen ole mitään käsitystä montako niitä vektoreita tarvitaan?
EDIT
en tajunnu tosta dynaamiset taulukot jutusta mitään... >.<


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta