Avatar billede vaarup Nybegynder
30. november 2003 - 19:06 Der er 13 kommentarer og
1 løsning

Hvordan returneres et Int Array oprette på heapen?

Hej Eksperter;

Jeg arbejder i MS visual St. 1.0 C++ 6.0

Jeg kan ikke itererer igennem et int array som er oprette i en anden metode? (arrayet er oprettet på heapen) På første plads kan jeg få værdien ud, men går en jeg en plads frem går programmet ned?

Lidt uddrag af min kode lidt simplificeret:

//Metode som returner int arrayet, (Nedarvet metode)

virtual int* findPladser(Stol& s){
//eks
int o = 2, v = 7, h = 5;
int* fundnePladser = new int[3];

fundnePladser[0] = o;
fundnePladser[1] = h;
fundnePladser[2] = v;
       
return fundnePladser;
}


Modtagne metode:
Void XXX (){

int *personPL = s.getBord().findPladser(s);
       
int i = 0;
while( i < 3 && found)
{                   
if(s.getBord().getStol(personPL[i])->getPerson() == personKrav )
{
  found = false;
}
else
{
  i++;
}
delete[] personPL;       
}


Håber en kan hjælpe med en bedre og mere brugbar syntaks.
Tak
Avatar billede arne_v Ekspert
30. november 2003 - 19:16 #1
Så vidt jeg kan tælle { } så kalder du delete inden i while
løkken d.v.s. at personPL bliver deallokeret inden du er færdig
med at bruge det.
Avatar billede arne_v Ekspert
30. november 2003 - 19:17 #2
Jeg forstår så heller ikke helt logikken med found, men ...
Avatar billede vaarup Nybegynder
30. november 2003 - 19:33 #3
Hej Arne,

Tak for din hurtige reaktion.
Ja der mangler en slut } men den har jeg med i den "rigtige metode".
Found er for ikke at løbe alle tre pladser igennem - er ikke nødvendigt.
Jeg er nybebynder med C++, så der nok en hel del som kunne være skrevet bedre, men her er hele den modtagne metoden:

bool kontrollerKrav(Stol& s)
{
    bool found = true;
       
    Person& personKrav = s.getPerson().getPersonKrav();
    if (&personKrav == NULL) return true;

    int *personPL = s.getBord().findPladser(s);
       
    int i = 0;
    while( i < 3 && found)
    {
    if(s.getBord().getStol(personPL[i])->getPerson() == personKrav )
        {           
          found = false;
    }
    else
    {
      i++;
    }
    }
//Sletter int array som er blevet skabt på Heapen, i metoden findPladser(Stol& s)
  delete[] personPL;
       
return found;
}//End kontroller krav


Problemet er lige så snart i bliver talt en op personPL[i] - så er der ingen værdi på næste plads i arrayet - som jeg kan se det får jeg kun en pointer til første plads i arrayet og kan ikke komme til plads nr 2 - personPL[i=1]
Og lige så snart i antager værdien 1 - går programmet ned selv om jeg har lagt værdier ind på 3 pladser i arrayet ???
Avatar billede arne_v Ekspert
30. november 2003 - 19:41 #4
Og du er sikker på at det er personPL[1] der er problemet - altså ikke
indeholder 5 ?

Og ikke getStol(5) der returnerer NULL således at ->gerPerson() dør ?
Avatar billede vaarup Nybegynder
01. december 2003 - 01:03 #5
Hej,

Det er jeg sikker på da jeg kun indsætter 3 værdier i arrayet i den medtoden som opretter arrayet, som du kan se i findPladser metoden.
Du "angriber" ikke min kode, jeg havde forvnetet at jeg havde skrevet noget forkert og derfor fik jeg ikke arrayet med over. Ser det umiddelbart "brugbart" ud den kode som er lavet??
Avatar billede arne_v Ekspert
01. december 2003 - 09:25 #6
Det her virker fint:

#include <iostream>

using namespace std;

int *al()
{
  int *p = new int[100];
  for(int i=0;i<100;i++) p[i]=i;
  return p;
}

void test()
{
  int *p = al();
  for(int i=0;i<100;i++) if(p[i]!=i) cout << "problem" << endl;
  delete[] p;
}

int main()
{
  for(int i=0;i<100;i++) test();
  return 0;
}
Avatar billede arne_v Ekspert
01. december 2003 - 09:25 #7
Det er derfor jeg tror at problemet ikke ligger i findPladser
med i at getStol returnerer NULL.
Avatar billede segmose Nybegynder
01. december 2003 - 09:36 #8
Prøv lige det her:

bool kontrollerKrav(Stol& s) {
  bool found = true;
     
  // se test nedenfor.
  Person& personKrav = s.getPerson().getPersonKrav();

  // hmm, &personKrav giver adressen på variablen personKrav så det giver aldrig NULL?!?
  if (&personKrav == NULL) return true;

  int *personPL = s.getBord().findPladser(s);
     
  int i = 0;
    while( i < 3 && found)    {
      // har vi hvad vi tror
      printf("PL[%d]=%d\n", i, personPL[i]);
      if (s.getBord().getStol(personPL[i]) == NULL)
        printf("getStol == NULL\n");
      if(s.getBord().getStol(personPL[i])->getPerson() == personKrav ) {         
          found = false;
    } else {
      i  ;
    }
    }
//Sletter int array som er blevet skabt på Heapen, i metoden findPladser(Stol& s)
  delete[] personPL;
     
return found;
}//End kontroller krav


// Hvor mange warnings for du for :
Person& test() {
  return NULL;
}
Avatar billede vaarup Nybegynder
01. december 2003 - 18:30 #9
Tak begge to - ja I havde ret, min fejl - der var en fejl som gav en null pointer reference i person, nu virker det :-)
Jeg havde stirret mig blind på det int array fordi jeg forventede, jeg havde skrevet en forkert syntaks.
Tak for hjælpen!!
Det er første gang jeg har stillet et spørgsmål i dette forum.
Hvordan lukker jeg det korrekt?
Avatar billede arne_v Ekspert
01. december 2003 - 18:35 #10
Tja - du skulle jo nok have bedt os ligge et svar og så accepteret vores
svar i.s.f. selv at ligge et svar og acceptere det.
Avatar billede vaarup Nybegynder
01. december 2003 - 18:40 #11
Åhh Undskyld :-/ - hvordan retter jeg det?
(tænkte nok det ikke var rigtigt)
Avatar billede arne_v Ekspert
01. december 2003 - 19:09 #12
Du kan oprette et spørgsmål med titel "point til arne_v og segmose"
og et link til dette spørgsmål.

Så svarer vi og du giver os point der.
Avatar billede vaarup Nybegynder
01. december 2003 - 19:18 #13
Hej

Ok det vil jeg gøre - jeg sidder faktiske og prøver om jeg kan læse mig frem til hvordan det her foregår (savner en Q&A, om åbne og især lukke spørgsmål og point regnskab hvordan det hænger sammen) men det er måske meget logisk bygget op når man først kommer ind i det.
Avatar billede arne_v Ekspert
01. december 2003 - 19:27 #14
Prøv og læs:

http://expfaq.1go.dk/
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