Gå til innhold

[Løst] Arrayer i funksjoner


Anbefalte innlegg

Har en liten kodesnutt for å vise hva jeg prøver å gjøre.

 


void funksjon(int **p) {
   *p = new int[10];
}

int main() {
   int *verdier;
   funksjon(&verdier);

}

 

Men det ser ikke ut til at jeg får satt størrelsen på verdier-variabelen, på denne måten. Er dette en ugyldig metode?

Endret av Knut_F
Lenke til kommentar
Videoannonse
Annonse

i C ville jeg brukt

* p = malloc(10*sizeof(int));

 

Mine C++ kunnskaper er akkurat litt for svake til å si om du kan bruke "new" på den måten du gjør.

 

Takk takk. Testa malloc, men fikk samme feilen.

Koden kompileres og kjøres, før det låser seg, akkuratt som om den peker til feil addresse ellernoe. Jeg mangler nok noen grunnleggende kunnskaper om "pointers" osv...

Lenke til kommentar

Har en liten kodesnutt for å vise hva jeg prøver å gjøre.

 


void funksjon(int **p) {
   *p = new int[10];
}

int main() {
   int *verdier;
   funksjon(&verdier);

}

 

 

Litt usikker siden det er en stund siden jeg ballet med c++, men tror peker feil med den "&" foran verdier, den skal ikke være til stede der.

 

Edit: Funket dårlig med fargekoder i code-boksen.

_____

int main() {

int *verdier;

funksjon(&verdier);

}

_____

Endret av laurell
Lenke til kommentar

Har en liten kodesnutt for å vise hva jeg prøver å gjøre.

 

void funksjon(int **p) {
   *p = new int[10];
}

int main() {
   int *verdier;
   funksjon(&verdier);

}

 

Men det ser ikke ut til at jeg får satt størrelsen på verdier-variabelen, på denne måten. Er dette en ugyldig metode?

 

"Satt størrelsen"?

 

Det du essensielt etterlyser er pass-by-reference, og da er det ingen grunn til å bruke pointer-to-pointer.

 

void alloc1(int *& foo)
{
   foo = new int[10];
   foo[0] = 42;
}

// usage
int *block1;
alloc1(block1);

 

Men la oss anta du insisterer på å bruke pekere. Essensen da er at for at en funksjon skal modifisere en type T, sender du en peker til T til funksjonen (by-value). I dette tilfellet er T selv en pointer-to-int:

 

void alloc2(int ** foo)
{
   *foo = new int[10];
   (*foo)[0] = 42;
}

// usage
int *block2;
alloc2(&block2);

 

Sist men ikke minst er den type minnemanipulasjon noe som kan og bør unngås i C++ av hensyn til vedlikeholdbarhet og potensielle minnefeil. funksjon() i ditt eksempel burde heller returnere det objektet som den allokerer, og da helst pakket inn i en smart pointer av noe slag (boost::shared_ptr, eksempelvis).

 

Jeg mangler nok noen grunnleggende kunnskaper om "pointers" osv...

 

Peter van der Linden sin bok "Expert C programming" anbefales. Den snakker riktignok om C sin modell, men gir en veldig god forklaring på pekere og deres bruk for å simulere arrays.

Lenke til kommentar

Har en liten kodesnutt for å vise hva jeg prøver å gjøre.

 

void funksjon(int **p) {
   *p = new int[10];
}

int main() {
   int *verdier;
   funksjon(&verdier);

}

 

Men det ser ikke ut til at jeg får satt størrelsen på verdier-variabelen, på denne måten. Er dette en ugyldig metode?

 

"Satt størrelsen"?

 

Det du essensielt etterlyser er pass-by-reference, og da er det ingen grunn til å bruke pointer-to-pointer.

 

void alloc1(int *& foo)
{
   foo = new int[10];
   foo[0] = 42;
}

// usage
int *block1;
alloc1(block1);

 

Men la oss anta du insisterer på å bruke pekere. Essensen da er at for at en funksjon skal modifisere en type T, sender du en peker til T til funksjonen (by-value). I dette tilfellet er T selv en pointer-to-int:

 

void alloc2(int ** foo)
{
   *foo = new int[10];
   (*foo)[0] = 42;
}

// usage
int *block2;
alloc2(&block2);

 

Sist men ikke minst er den type minnemanipulasjon noe som kan og bør unngås i C++ av hensyn til vedlikeholdbarhet og potensielle minnefeil. funksjon() i ditt eksempel burde heller returnere det objektet som den allokerer, og da helst pakket inn i en smart pointer av noe slag (boost::shared_ptr, eksempelvis).

 

Jeg mangler nok noen grunnleggende kunnskaper om "pointers" osv...

 

Peter van der Linden sin bok "Expert C programming" anbefales. Den snakker riktignok om C sin modell, men gir en veldig god forklaring på pekere og deres bruk for å simulere arrays.

 

Tusen takk for veldig godt svar!!! Skal sjekke ut den boka du anbefaler!

Lenke til kommentar

Har en liten kodesnutt for å vise hva jeg prøver å gjøre.

 

[...]

 

Men det ser ikke ut til at jeg får satt størrelsen på verdier-variabelen, på denne måten. Er dette en ugyldig metode?

 

Som zotbar sier: I C++ bruker vi heller referanser-til-pekere enn pekere-til-pekere. Men med mindre du gjør dette bare for å knote masse med pekere ville jeg heller bare brukt std::vector<>:

 

#include <vector>

void function(std::vector const& values) {
   values.reserve(10);
}

int main() {
   std::vector<int> values;
   function(values);

}

 

(I likhet med din kode vil denne koden bare lage plass til 10 tall, fremfor å faktisk gi dem en fornuftig verdi.)

Lenke til kommentar
  • 3 uker senere...

Er ikke helt sikker på hva du mener, men legger nå ut koden min og satser på at den hjelper :)

void funk(int& arr);
int main () 
{
int tester[2];
funk(tester[2]);
cout << tester[2];  
       //utskrift blir 3
return 0;
}
void funk (int& arr) 
{
int a[3] = {1,2,3};
arr = a[2];
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...