Avatar billede sjqlund Nybegynder
08. januar 2008 - 19:13 Der er 10 kommentarer

Hvordan bruger jeg et array i flere funktioner?

Jeg er ved at lave et mindre c++ program, som er opdelt i funktioner. I princippet ser min problemstilling således ud:

void funktion()
{
int tal[5] = {1, 2, 3, 4, 5};
}

Hvordan bruger jeg så mit array i en ny funktion? Er klar over at jeg evt. kan få min funktion til at returne mit array, men kan ikke få det til at virke i praksis.
Vil gerne kunne noget lignende:

void nyfunktion()
{
int n;
for(n=0; n<5; n++)
cout << tal[n] << endl;
}

Vil være glad hvis i kunne give det fulde svar, bare så simpelt som muligt, men med kode. Da jeg er ny er jeg nemlig ikke så stærk i syntaksen.
Avatar billede nielle Nybegynder
08. januar 2008 - 19:24 #1
Flyt evt. arrayet udenfor:

int tal[5] = {1, 2, 3, 4, 5};

void funktion()
{
}

void nyfunktion()
{
int n;
for(n=0; n<5; n++)
cout << tal[n] << endl;
}
Avatar billede sjqlund Nybegynder
08. januar 2008 - 19:34 #2
Ja okay. Jeg burde selvfølgelig have sagt at dette ikke er en mulighed, da tallene i mit array bliver udregnet i den ene funktion.
Hvis det hjælper, så finder den første funktion nogle primtal i et interval.
Min næste funktion skal gerne kunne søge i dette interval.

Formulerede mig lidt for uklart og undskylder.
Avatar billede nielle Nybegynder
08. januar 2008 - 19:44 #3
Kan du evt. vise lide mere af din kode?
Avatar billede arne_v Ekspert
08. januar 2008 - 19:46 #4
Et eksempel:

#include <iostream>

using namespace std;

int *funktion()
{
    int *tal = new int[3];
    tal[0] = 7;
    tal[1] = 9;
    tal[2] = 2;
    return tal;
}

void nyfunktion(int *tal)
{
  for(int i = 0; i < 3; i++)
  cout << tal[i] << endl;
}

int main()
{
  int *tal = funktion();
  nyfunktion(tal);
  delete[] tal;
  return 0;
}
Avatar billede sjqlund Nybegynder
08. januar 2008 - 20:58 #5
takker til arne_v, det ser ud til at virke. Også tak til nielle.

Kan du forklare mig hvad "int *tal = new int[3];" gør?
Er ikke begyndt med kommandoen new
Avatar billede arne_v Ekspert
08. januar 2008 - 21:20 #6
C++ er et forholdsvis svaert sprog.

int *funktion()
{
  int tal[5] = {1, 2, 3, 4, 5};
  return tal;
}

duer ikke fordi tal her kun vil eksistere i selve funktion. Naar funktion returnerer,
saa gebruges den hukommelse hvor tal ligger til andre formaal.

Det kan loesed paa flere maader.

En maade var det nielle skitserede ved at lave tal til en global variabel.

Min maade var at bruge dynamisk allokering.

int *tal = new int[3];

skaber dynamisk et array med dimension 3.

Og vel at maerke et sted hvor det fortsat kan bruges efter at funktion er afsluttet.

Det betyder ogsaa at man selv skal frigive den hukommelse med:

delete[] tal;

Simpelt ?

:-)
Avatar billede dehdar Nybegynder
25. januar 2008 - 15:17 #7
Hej, jeg har lige et spørgsmål til dig i denne forbindelse Arne, men jeg opretter en ny tråd, så jeg ikke kommer i vejen for andre :)
Avatar billede dehdar Nybegynder
25. januar 2008 - 16:21 #8
Jeg tænkte spørgsmålet måske vil være relevant, så jeg har skrevet der her. Håber det er ok, ellers opretter jeg en ny tråd.

Man returnerer jo ikke selve Arrayet. Det man gør er vel at oprette en pointer, som peger på Arrayet og derved kan man tilgå Arrayet udenfor den funktion, hvor den er oprettet. F.eks. som jeg har gjort i dette eksempel:

#include <iostream>

using namespace std;   

void funktion(int *NyArray)
{
    cout << " = " << &(*NyArray) << endl << endl;

        cout << *(NyArray + 2) << endl;
}

int main()
{
    const int SIZE = 4;
    int Array[SIZE] = {14,13,12,11};

    cout << &Array[1];

    funktion(&Array[1]);

    return 0;
}


Nu har jeg så forsøgt at gøre det samme, hvor jeg opretter en global pointer i stedet for et globalt array (lidt af en omvej). Det virker dog ikke...

#include <iostream>

using namespace std;   

extern int *Ptr;

void funktion()
{
    const int SIZE = 4;
    int Array[SIZE] = {14,13,12,11};
    Ptr = &Array[SIZE];
}

void nfunktion()
{
    for (int i = 4; i > 0; i--)
        cout << *(Ptr - i) << endl;
   
}

int main()
{
    funktion();
    nfunktion();

    return 0;
}

Jeg får følgende 2 fejl:

1    error LNK2001: unresolved external symbol "int * Ptr" (?Ptr@@3PAHA)    test.obj

2    fatal error LNK1120: 1 unresolved externals
Avatar billede dehdar Nybegynder
25. januar 2008 - 16:37 #9
NM, jeg tåger :D Har lige rettet koden og skrevet den om for at se, om det virkelig kan passe, at værdierne bliver sat til "default" og brugt til andre formål efter man er hoppet ud af funktionen, og det kan det til min store overraskelse.

Det giver vel også god mening... for ligesom lokale variabler, så eksiserer de kun i selve funktionen. Nåh, undskyld hvis jeg spildte din/jeres tid :D


using namespace std;   

int *Ptr;

void funktion()
{
    const int SIZE = 4;
    int Array[SIZE] = {14,13,12,11};
    Ptr = &Array[SIZE];

    for (int i = 4; i > 0; i--)
        cout << *(Ptr - i) << endl;

    cout << endl << Ptr << " = ";
}

void nfunktion()
{
    cout << Ptr << endl << endl;
    for (int i = 4; i > 0; i--)
        cout << *(Ptr - i) << endl;
   
}

int main()
{
    funktion();
    nfunktion();

    return 0;
}
Avatar billede arne_v Ekspert
25. januar 2008 - 16:38 #10
Den link fejl forsvinder nok hvis du fjerner extern paa Ptr.

Men men men - Ptr peger igen paa et lokalt array der er gaaet ud af scope
med alle deraf foelgende katastrofer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester