Taulukko funktioon osoittimella.

Saku-foorumi » Classic Amiga » Ohjelmointi » Viestit 2007 » Taulukko funktioon osoittimella. « Edellinen Seuraava »

Kirjoittaja Viesti
 

Tohtori AivoTurmio
Perjantaina, 6. huhtikuuta, 2007 - klo 12.09:   
Eli tällainen ongelma missä mitä ilmeisimmin tietämykseni loppui kesken.

On main()issa luotu
int karttataulukko[x][y] jossa x ja y voivat olla molemmat vaikka 100.

no sitten on funktioita joiden olisi tarkoitus joko reagoida arvojen perusteella tai muuttaa noita karttataulukon arvoja.

tarkoituksena olisi yksinkertaisesti lähettää joko osoitin tai viite kyseiseen taulukkoon jolloin funktiossa ei tarvittaisi kopiota taulukosta eikä jokaista alkiota tarvitsisi erikseen lähettää vaan voisi näppärästi esim. tyyliin:

int karttafunktio (&kartta)
*kartta[x][y]=4
return

tai jotain sinnepäin.

Ratkaisut joita yritin eivät yksikään toimineet, joren kertokaahan kuinka tuo oikein pitäisi tehdä.

Eli lähteekö funktio millaisella käskyllä käyntiin ja millaisella se pitää esitellä ja miten käytetään?

esim.

int karttafunktio(&kartta)

main()

int karttataulukko[100][100];

karttafunktio(*karttataulukko);

end;

int karttafunktio (&kartta)
{
for (y=0; y++; y<100)
*kartta[10][y]==7+y
}
return 1

 

Piru
Perjantaina, 6. huhtikuuta, 2007 - klo 21.45:   
Vaikkapa näin:


int karttafunktio(int kartta[100][100]);

int main(void)
{
int karttataulukko[100][100] = {{0}};

karttafunktio(karttataulukko);

return 0;
}

int karttafunktio(int kartta[100][100])
{
int y;

for (y=0; y<100; y++)
{
kartta[10][y] = 7 + y;
}

return 1;
}


 

Piru
Perjantaina, 6. huhtikuuta, 2007 - klo 21.46:   
Huomaathan että tuo 100*100 taulukko vaatii 40000 tavua pinoa. Eli tuota on huono idea ajaa defaultti 4k:lla.

 

Tohtori AivoTurmio
Perjantaina, 6. huhtikuuta, 2007 - klo 23.01:   
no nyt ymmärrän sen perustavaa laatua olleen ajatusvirheeni. Eli ongelma oli se että en ymmärtänyt että tuossa funktion esittelyssä täytyy alustaa tuo taulukon alkioiden määrä.

Niin mitä tarkoitat tuolla 40 000 tavua pinoa ja huono idea.

Siis ymmärrän sen että vie 40 000 tavua, mutta mitä siis tarkoittaa ongelma kantilta käytännössä, kun loppuu taas tietämys kesken?

Ja mitä tarkoitit tuolla defaultti 4k:lla tuskin kuitenkaan A4000 konetta, vaan ilmeisesti jotain säätöä vai?

 

Piru
Perjantaina, 6. huhtikuuta, 2007 - klo 23.24:   
Jos ajat tuon amigassa ilman tarpeeksi isoa pinoa, niin se sotkee muistia ja kone kaatuu.

Stack 50000 auttaa.

 

Tohtori AivoTurmio
Perjantaina, 6. huhtikuuta, 2007 - klo 23.39:   
ahaa. No nyt selkisi hieman.

Mistä tuo Stack säädetään?

Ja jos viitsit niin pistätkö vielä sellaisen lyhyehkön muutaman rivin selostuksen Amiga muistin käyttöön liittyen tuota pinoa jne. liittyen.

En itseasiassa ollut perillä että tuota tarvitsee edes sen kummemmin säädellä kuvittelin jotenkin sen olevan sellainen asia että sen verran kuin on muistia niin on myös pinoa.

Mutta ilmeisesti muistia sitten ohjelmoidessa jaetaankin jotenkin erilaisiin tehtäviin, eli mimmoisiin?

niin ja kiitokset oikein paljon jo tähänkin astisista vastauksista, ne ovat auttaneet jo kovasti eteenpäin.

 

allu
Lauantaina, 7. huhtikuuta, 2007 - klo 0.26:   
Hmm, meneekö parametrinä annettu taulukko pinoon?

Olen aina vierastanut ajatusta passata taulukko funktiolle mutta viime aikoina olen sitä alkanut harrastamaan pikkutapauksissa kun hoksasin että kaikki kääntäjät lykkää vain taulukon osoitteen pinoon. Tyyppi kertoo kuin monta ulottuvuutta taulukossa on.

Sitäpaitsi, jos taulukko "kopioidaan" pinoon, funktiossa taulukkoon tehdyt muutokset ei tietenkään muuta funktiolle alkujaan välitetyn taulukon sisältöä. (Mikä kylläkin noudattaisi käyttäytymistä useimpien muiden tyyppien kanssa).

Jos haluaa olla täysin varma ja välittää funktiolle taulukon osoitteen, käy se näin:

void func(int (*taulukko)[20][10])
{
(*taulukko)[0][0] = 20;
}

int main(void)
{
int taulukko[20][10];

func(&taulukko);

return 0
}

 

allu
Lauantaina, 7. huhtikuuta, 2007 - klo 0.31:   
Oho, unohtu mainita että typedef:iä kannattaa käyttää taulukkotyypin esittelemiseen.

Eli tossa mun esimerkissä voi käyttää kahta typedef:iä:

typedef int array_t[20][10]; // taulukkotyyppi

typedef array_t *array_ref_t; // osoitin array_t tyyppiseen objektiin

 

Piru
Lauantaina, 7. huhtikuuta, 2007 - klo 4.25:   
@allu

"Hmm, meneekö parametrinä annettu taulukko pinoon?"

Ei mene. Kieltämättä se on hieman hämäävää, koska esimerkiksi structi taas menee.

 

Piru
Lauantaina, 7. huhtikuuta, 2007 - klo 4.33:   
@dr AivoTurmio

"Mistä tuo Stack säädetään?"

Komentoriviltä stack komennolla, tai ohjelman ikonista säätämällä.

Pinosta:
14.1.8 Stack vs Heap Allocation

AmigaOS:ssa pino ei kasva automaattisesti, toisin kuin "oikeissa" käyttöjärjestelmissä (unix, bsd, linux, macosx, windows ym). Eli jos pinosta loppuu tila niin ohjelma sotkee muistia ja parhaimmillaan kaataa koneen.

 

JPQ
Lauantaina, 7. huhtikuuta, 2007 - klo 5.21:   
Piru: windows ei ole oikea käyttis.
PS. MorphOSissa lienee sama pino ongelma? harmi kun sille ei kait ole
tehtävissä yhtään mitään.

 

Piru
Lauantaina, 7. huhtikuuta, 2007 - klo 6.00:   
Tässä windows on oikea käyttöjärjestelmä, koska se kasvattaa pinoa dynaamisesti.

AmigaOS/MorphOS ei tosiaan tuohon kykene, eikä sitä oikein voi mitenkään korjata. libnix:lle voi tosin kertoa paljonko pinoa pitäisi varata:
long __stack = 65536;
Tällöin jos pino on pienempi kuin annettu arvo, startuppi automaagisesti varaa uuden pinon ja ottaa sen käyttöön.

ixemul:lla homma hoituu ixstack-komennon avulla (jolla siis asetetaan binaarin vaatiman pinon koko).

 

JPQ
Lauantaina, 7. huhtikuuta, 2007 - klo 16.18:   
Piru: On joo ja onhan siinä muitakin oikeasti jos sanotaan hyviäkin puolia mutta ei se anna kokoa et jähmeyttä silti anteeksi.
PS: aattelinkin että ei voi koska varmasti sille olisi tehty jotain.
Ai niin ixstack käyttö? onko se normaali funktio... no toki dokutkin kaivan tässä sille tässä kunhan ehdin.

Lisää viestisi tähän
Viestisi:
Käyttäjätunnus: Postitus informaatiota:
Tämä on yksityinen keskustelupalsta. Vain rekisteröidyt käyttäjät ja moderaattorit voivat postittaa tänne.
Salasana:
valinnat: Aktivoi URL:t automaattisesti tässä viestissä
Toimenpide: