Avatar billede Peter Praktikant
04. maj 2004 - 20:20 Der er 5 kommentarer og
1 løsning

Container til at indeholde et antal bytes der skal transporteres

imellem klasser.
Jeg sidder med et problem jeg ikke selv kan løse. Jeg har to klasser hvor den ene kalder en funktion i den anden med en struktur der bl.a. indeholder et char-array. Dette array skal jeg ændre lidt i og returnerer, det giver nogle besværligheder jeg gerne vil være fri for.
Derfor tænkte jeg om det ikke er muligt i c++ at lave en container der kan indeholde et bestemt antal bytes som funktioner kan tage som argument og returnere. Tanken var at man kunne malloc'e plads (x antal bytes) og derefter bare smide data i denne container med pointere. Men jeg er ikke klar over hvordan jeg skal programmere det, så hvis i kunne hjælpe ville jeg blive glad.
Avatar billede bertelbrander Novice
04. maj 2004 - 21:48 #1
Jeg er ikke sikker på at jeg forstår spørgsmålet, men du kunne tage et kik på dette:

#include <vector>
#include <iostream>

using namespace std;

typedef vector<int> ContainerType;

class C1
{
public:
  void Foo(ContainerType &C)
  {
    C[0] = 1;
    C[1] = 2;
    C[2] = 3;
  }
};

class C2
{
public:
  void Bar()
  {
    ContainerType Container(3);
    C1 c1;
    c1.Foo(Container);
    cout << ">" << Container[0] << " " << Container[1] << " " << Container[2] << endl;
  }
};

int main()
{
  C2 c2;
  c2.Bar();
}
Avatar billede Peter Praktikant
04. maj 2004 - 22:25 #2
Jeg forsøger lige at præcisere og uddybe problemet.
Jeg har som sagt to klasser, den ene kalder en funktion i den anden med en struktur der indeholder nogle ints og et char-array. Meningen er så at funktionen skal tilføje en int til strukturen og returnerer den som et char-array. Men der er lidt problemer med at returnerer et char-array, jeg risikerer jo at slutningen af arrayet bliver overskrevet når funktionen lukker og derved frigiver pladsen som resten af arrayet er på, altså det der ikke er pointer til første element. Derfor ville jeg gerne have en form for container hvori jeg kunne smide diverse variable, denne container skulle så ligge et bestemt sted i lageret og en pointer kunne så smides med til funktionen og funktionen kunne så smide en int i containeren og returnere pointeren. Men jeg er ikke klar over hvordan det skal gøres smart.
Jeg har tænkt på bare at malloc'e 500 bytes og så have en pointer til første tomme sted i den chunk, men jeg ved ikke om det er den smarteste måde at gøre det på.

Jeg har godt kigget på vector, men så vidt jeg forstår kan man ikke ligge forskellige typer i en vector.
Avatar billede bertelbrander Novice
04. maj 2004 - 22:44 #3
Jeg er ikke sikker på jeg forstår: "Meningen er så at funktionen skal tilføje en int til strukturen og returnerer den som et char-array. Men der er lidt problemer med at returnerer et char-array, jeg risikerer jo at slutningen af arrayet bliver overskrevet når funktionen lukker og derved frigiver pladsen som resten af arrayet er på, altså det der ikke er pointer til første element."

Man kan lave en generisk class der kan indeholde hvad som helst og så lave en vector med elementer af denne type:

#include <vector>
#include <iostream>

using namespace std;

class GenType
{
public:
  GenType()
  { }
  GenType(int i)
  {
    Type = int_type;
    Value.i = i;
  }
  GenType(double d)
  {
    Type = double_type;
    Value.d = d;
  }

  enum
  {
    int_type,
    double_type,
  }Type;
  union
  {
    int i;
    double d;
  }Value;
};

ostream &operator << (ostream &os, GenType &c)
{
  switch(c.Type)
  {
    case GenType::int_type:
      os << c.Value.i;
      break;
    case GenType::double_type:
      os << c.Value.d;
      break;
  }
  return os;
}

typedef vector<GenType> ContainerType;

class C1
{
public:
  void Foo(ContainerType &C)
  {
    GenType A(123);
    C.push_back(A);
  }
  void Bar(ContainerType &C)
  {
    GenType A(123.123);
    C.push_back(A);
  }
};

class C2
{
public:
  void Bar()
  {
    ContainerType Container;
    ContainerType::size_type i;
    C1 c1;
    c1.Foo(Container);
    c1.Bar(Container);
    for(i = 0; i < Container.size(); i++)
      cout << Container[i] << " ";
    cout << endl;
  }
};

int main()
{
  C2 c2;
  c2.Bar();
}
Avatar billede Peter Praktikant
23. maj 2004 - 16:29 #4
Undskyld jeg ikke er vendt tilbage før, jeg valgte at malloce plads da det for mig at se blev det mest simple. Hvis du vil ligge et svar får du nogle point.
Avatar billede bertelbrander Novice
23. maj 2004 - 17:09 #5
Jeg forsøger at undgå point.
Avatar billede Peter Praktikant
31. maj 2004 - 22:26 #6
Okay, men tak for hjælpen. Af en eller anden mærkelig grund har jeg ikke fået email da du har givet sidste kommentar.
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