Gå til innhold

Problem med adresseoverføring


Anbefalte innlegg

Kan man bruke 'bool' om tabeller?

 

Her er et eksempel:

int Maks = 15;

bool Ledig[Maks];

 

Jeg har også laget en klasse ved navn "navn":

navn Navn[Maks];

 

Og så prøver jeg å overføre det til en funksjon (kaller den "Funksjon" i dette tilfellet):

Funksjon(Ledig, Navn, Maks);

 

Funksjonen ser slik ut:

(Kompileringsfeil beskrevet etter "//")

Funksjon(bool &Ledig, navn &Navn, int Maks)

{

 ...

 bool OK = False;

 int Teller = 0;

 while (!OK) {

   if (Ledig[Teller] == False) OK = True;  // subscript requires array or pointer type

   else Teller++;

 }

 if (OK) {

   Ledig[Teller] = True;  // '=': left operand must be l-value

 }

 ...

}

 

Og i hovedprogrammet får jeg denne meldingen:

Funksjon(Ledig, Navn, Maks) // cannot convert parameter 1 from 'bool[15]' to 'bool &'

 

Hva er feil?

Og kan jeg gjøre dette på en annen måte?

Lenke til kommentar
Videoannonse
Annonse

Du sender (som nevnt over) en array av bool inn i funksjonen, men funksjonen er definert til å ta en referanse til en bool. Dette blir jo kluss, og kompilatoren vil klage..

 

Hvis du virkelig ønsker å gjøre det som det ser ut som, må du bytte ut referansen til bool med en peker; slik:

 


void Funksjon(bool* ledig_, int maks_, Navn& navn_ )

{

  //...

}

 

 

eller slik:

 


void Funksjon(bool ledig_[], int maks_, Navn& navn_ )

{

  //...

}

 

.. som stort sett blir det samme.

 

 

Men dette er en svært gammeldags måte å gjøre det på (i C dager). Det er greit hvis du skal bruke det til å lære grunnleggende ting, men det er ikke slik vi programmerer c++ i dag...

 

Et mer elegant eksempel kunne sett slik ut (forbehold om hva du prøver å gjøre..):

 


void ElegantFunksjon(std::vector<bool>& ledig_, Navn& navn_)

{

std::vector<bool>::size_type maks = ledig_.size();



//...

}

 

Her bruker vi vector fra C++ sitt standard bibliotek. Mye sikrere og minimalt med overhead. Det er også vanlig å bruke en typedef for vectoren din slik at du ikke trenger å skrive så mye, slik:

 


typedef std::vector<bool> BoolVectorType;



void MestElegantFunksjon(BoolVectorType& ledig_, Navn& navn_)

{

  BoolVectorType::size_type maks = ledig_.size();

  //...

}

 

 

Håper dette ga svar på det du lurte på.

Lenke til kommentar

Jeg lærer grunnleggende programmering, ja.

 

Jeg vil ha en tabell der alle elementene skal være klasser, og en tabell der alle elementene skal være typen bool. Og så vil jeg sende disse til en funksjon, IKKE kopiere dem.

 

Er det da lovlig å definere dem slik:

int Maks;

bool Ledig[15];

navn Navn[15];

 

Jeg vil prøve denne funksjonen:

void LageNyOppfoering(bool Ledig_[], navn& Navn, int Maks_)

{

  //...

  bool OK = False;

  int Teller = 0;

  if (Ledig[Teller] == False) OK = True;

  Teller++;

  //...

}

Nå får jeg denne meldingen: "'Ledig' : undeclared identifier" i tillegg til de andre meldingene.

 

Men hvordan skal jeg kalle opp funksjonen?

 

Og hvordan kan jeg få det ene elementet i tabellen (bool Ledig) til å få verdien "True" (1) ?

Lenke til kommentar
Er det da lovlig å definere dem slik:

int Maks;

bool Ledig[15];

navn Navn[15];

Helt riktig.

 

 

Jeg vil prøve denne funksjonen:

void LageNyOppfoering(bool Ledig_[], navn& Navn, int Maks_)

{

  //...

  bool OK = False;

  int Teller = 0;

  if (Ledig[Teller] == False) OK = True;

  Teller++;

  //...

}

Nå får jeg denne meldingen: "'Ledig' : undeclared identifier" i tillegg til de andre meldingene.

Her er det en enkel trykkleif.. Du har satt navnet på arrayen til Ledig_ i defenisjonen av funksjonen, mens inne i funksjonen bruker du Ledig (uten underscore til slutt).

 

Det er et annet problem også. Hvis du ønsker å sende inn en array med Navn, må du skrive: Navn navn_[]. Et komplett fungerende eksempel kan se slik ut:

 


#include <iostream>

#include <string>



class Navn

{

public:

Navn()

{

}



Navn(const std::string& navn_)

{

 m_navn = navn_;

}



void setNavn(const std::string& navn_)

{

 m_navn = navn_;

}



const std::string& getNavn() const

{

 return m_navn;

}



private:

std::string	m_navn;

};







void Funksjon(bool ledig_[], Navn navn_[], int maks_)

{

for(int i=0; i<maks_; i++)

{

 ledig_[i] = false;

 navn_[i].setNavn("satt i funksjon");

}

       

}





int main()

{



const int	array_size = 15;

bool  boolArray[array_size];

Navn  navnArray[array_size];

Navn  navn;





//sette verdier i arrayene

for(int i=0; i<array_size; i++)

{

 boolArray[i] = false;

 navnArray[i].setNavn("verdi satt i main");

}



//skrive ut navn arrayen

std::cout << "FØR FUNKSJONSKALLET: " << std::endl;

for(int i=0; i<array_size; i++)

{

 std::cout << i << " : " << navnArray[i].getNavn() << std::endl;

}



   

//kaller oppe funksjonen

Funksjon(boolArray, navnArray, array_size);





//utskrift av array igjen..

std::cout << "ETTER FUNKSJONSKALLET: " << std::endl;

for(int i=0; i<array_size; i++)

{

 std::cout << i << " : " << navnArray[i].getNavn() << std::endl;

}

}

 

** klassenavnet her er med stor forbokstav, mens det i ditt eksempel var med liten.

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...