Avatar billede jonashn Nybegynder
11. april 2006 - 13:12 Der er 19 kommentarer og
1 løsning

Addressering af arrays med strenge og arrays af refs til funcs

Jeg er nybegynder til c++, og har før udelukkende programmeret i JS og VB, så der er en del spørgmål der trænger på.

Er det muligt i c++ at addressere et array med en streng, ala
arr['mitnavn']="jonashn";

Hvordan kan man i et array lave en reference til en funktion, ala
arr['hejsa']=welcome;
Avatar billede arne_v Ekspert
11. april 2006 - 13:21 #1
nej - men kig på STL map som gør det du ønsker

du erklærer bare typen af det array til at være pointer til en bestemt slags
funktion (godt råd: vent en måned eller to med det !)
Avatar billede jonashn Nybegynder
11. april 2006 - 13:26 #2
altså *bool arr[2];?

Tak for rådet :). Ja man skal godt nok tage sig sammen og skrive _HELT_ fejlfri kode i c++, i forhold til javascripts lidt mudrede/uklare syntax...

Er det muligt at have mere end en datatype i et arr, feks. ["streng",1,1.2]?
Avatar billede fiil123 Nybegynder
11. april 2006 - 13:54 #3
Nej det er ikke muligt, men du skal have lavet dig en Template class som kan indeholde dine informationer. Dette vil typisk laves med en Container class som f.eks en Bag
Avatar billede bertelbrander Novice
11. april 2006 - 20:53 #4
Et par eksempler på std::map, hvis ikke du forstår, så fortvivl ikke, men læs:
http://www.sgi.com/tech/stl/stl_index.html
(eller vent indtil du ved mere om c++)

#include <iostream>
#include <map>
#include <string>

void foo(void)
{
  std::cout << "foo" << std::endl;
}

void bar(void)
{
  std::cout << "bar" << std::endl;
}

class Index
{
public:
  Index(const char *aStr, int aNr)
      : Str(aStr), Nr(aNr)
  {}
  std::string Str;
  int Nr;
};

class Value
{
public:
  Value(double aD, int aI) : D(aD), I(aI)
  {}

  Value() : D(0), I(0)
  {}

  double D;
  int I;
};

bool operator < (const Index& lhs, const Index& rhs)
{
  if(lhs.Str != rhs.Str)
      return lhs.Str < rhs.Str;
  return lhs.Nr < rhs.Nr;
}

std::ostream& operator << (std::ostream& os, const Value& aVal)
{
  os << aVal.D << ", " << aVal.I;
  return os;
}

int main()
{
  std::map<std::string, void (*)(void)> MyMap1;
  MyMap1["Ole"] = foo;
  MyMap1["Peter"] = bar;
  MyMap1["Ole"]();
  MyMap1["Peter"]();

  std::map<Index, Value> MyMap2;
  MyMap2[Index("Ole", 2)] = Value(3.123, 123);
  MyMap2[Index("Ole", 3)] = Value(4.123, 321);
  std::cout << MyMap2[Index("Ole", 2)] << std::endl;
  std::cout << MyMap2[Index("Ole", 3)] << std::endl;

  std::map<int, std::map<std::string, int> > MyMap3;
  MyMap3[3]["Ole"] = 123;
  MyMap3[2]["Peter"] = 121;
  std::cout << MyMap3[3]["Ole"] << std::endl;
  std::cout << MyMap3[2]["Peter"] << std::endl;
}
Avatar billede arne_v Ekspert
11. april 2006 - 23:52 #5
eksempel paa brug af function pointer:

#include <stdio.h>
#include <stdlib.h>

typedef void (*fptr)();

void f1()
{
  printf("f1\n");
}

void f2()
{
  printf("f2\n");
}

void f3()
{
  printf("f3\n");
}

void f4()
{
  printf("f4\n");
}

int main()
{
    fptr f[] = { f1, f2, f3, f4 };
    int i;
    srand(12345);
    for(i=0;i<10;i++)
    {
        f[rand() % 4]();
    }
    return 0;
}
Avatar billede jonashn Nybegynder
12. april 2006 - 10:37 #6
bertel> Efter lidt analyse forstår jeg det :~D Og tak for eksemplet
arne v> Jeg forstår det hele bortset fra typedef void (*fptr)();, jeg forstår godt at den laver en pointer, men syntaxen?
Avatar billede arne_v Ekspert
12. april 2006 - 12:35 #7
typedef void (*fptr)();

gør at fptr kan bruges som en type der er en funktions pointer
Avatar billede jonashn Nybegynder
12. april 2006 - 12:36 #8
ok
Avatar billede bertelbrander Novice
12. april 2006 - 20:10 #9
Uden den typedef i Arnes program skulle f erklæres med den ikke videre logiske syntax:
    void (*f[])() = { f1, f2, f3, f4 };
Avatar billede jonashn Nybegynder
21. april 2006 - 12:59 #10
Kan man lave en <map> med func. refs?
Avatar billede arne_v Ekspert
21. april 2006 - 13:07 #11
det burde man sagtens kunne
Avatar billede jonashn Nybegynder
21. april 2006 - 13:09 #12
hvordan? Den giver fejl når jeg prøver forskellige ting med fptr.
Avatar billede arne_v Ekspert
21. april 2006 - 13:12 #13
kan du lave et minimalt eksempel som illusterer dit problem
Avatar billede bertelbrander Novice
21. april 2006 - 13:17 #14
I mit eksempel er følgende en map med funktions pointere:

std::map<std::string, void (*)(void)> MyMap1;
Avatar billede jonashn Nybegynder
21. april 2006 - 16:18 #15
bertel>den virker fint!

Vil i ikke lægge et svar begge to (hvis bertelbrænder altså vil modtage point'ne :-)
Avatar billede arne_v Ekspert
21. april 2006 - 16:29 #16
svar
Avatar billede jonashn Nybegynder
21. april 2006 - 17:40 #17
vil du have point bertel?
Avatar billede jonashn Nybegynder
21. april 2006 - 17:41 #18
hov.. hvis du vil have point bertel, opretter jeg et nyt spm.
Avatar billede bertelbrander Novice
23. april 2006 - 17:58 #19
Jeg samler ikke på point.
Avatar billede jonashn Nybegynder
23. april 2006 - 18:29 #20
Det var det jeg mente :)
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