webForumDet fria alternativet

motsvarighet

21 svar · 484 visningar · startad av Nexus86

Nexus86Medlem sedan okt. 20023 030 inlägg
#1

Finns det någon motsvarighet till VB's Collection, Byte och CallByName?

Marcus EMedlem sedan maj 20021 466 inlägg
#2

Re: motsvarighet

>>Finns det någon motsvarighet till VBs
>>Collection
Använd en array-klass, t.ex. STLs vector. Se dokumentationen eller sök på forumet för information om hur den används.

Använder du MFC, ATL eller BCB finns det andra klasser.

>> Byte
unsigned char;

>>CallByName?
Ingen motsvarighet.

Nexus86Medlem sedan okt. 20023 030 inlägg
#3

Re: Re: motsvarighet

Marcus E skrev:

>>CallByName?
Ingen motsvarighet.

Du får ursäkta om detta låter tjurigt men som du skrev med frågetecken verkar du inte veta vad det är. Hur kan du då veta om det finns någon motsvarighet eller inte? Det råkar nämligen vara en väääldigt bra funktion. Den är nästan ett måste ibland. Speciellt om man försöker göra ett eget programmeringsspråk. Nån som vet nån?

EDIT // http://www.webforum.nu/showthread.php?s=&postid=556131#post556131

PeWMedlem sedan juni 200010 432 inlägg
#4

Jag tolkar iaf Marcus E's "frågetecken" som att det frågetecknet följde med i copy-pasten från ditt inlägg - inte att han inte vet vad det är. ;)

Motsvarighet skulle isf vara allt från void-pekare till ren polyformism. Mao så går det att göra det som CallByName gör, men kanske inte med en redan implementerad metod/funktion. Denna "funktionalitet" är ju inget som ett programmeringsspråk tillhandahåller utan det är en konstruktion av språket - så även för VB.

Marcus EMedlem sedan maj 20021 466 inlägg
#5

PeW skrev:

Jag tolkar iaf Marcus E's "frågetecken" som att det frågetecknet följde med i copy-pasten från ditt inlägg

Så sant.

Faktum var att jag inte visste vad CallByName var, men jag gjorde en snabb sökning och fick fram att man med CallByName kan anropa funktioner efter deras namn som strängar. Just det finns det ingen motsvarighet för i C++. Däremot kan man gå till väga på andra sätt. T.ex. göra en lista där man definerar namn och funktioner, för att sedan gå igenom listan varje gång man vill kunna anropa funktionen efter namn under körning.

PeWMedlem sedan juni 200010 432 inlägg
#6

T.ex. göra en lista där man definerar namn och funktioner, för att sedan gå igenom listan varje gång man vill kunna anropa funktionen efter namn under körning

Vilket inte alls är ett ovanligt sätt att göra på, i exempelvis en kommando-tolk. I ren C används då void-pekare, i C++ har man ju fördelen att kunna binda med arv.

BeatboxMedlem sedan okt. 20013 217 inlägg
#7

En Collection är en enumarator (läs MSDN där exempel finns hur man definierar en enumerator).
En Byte är vän en char.
CallByName vet jag inte.

Nexus86Medlem sedan okt. 20023 030 inlägg
#8

Då ber jag än en gång om ursäkt för min tjurighet. :r

Marcus E skrev:

T.ex. göra en lista där man definerar namn och funktioner, för att sedan gå igenom listan varje gång man vill kunna anropa funktionen efter namn under körning.

Då behöver man ju en switch eller if. Det var det jag ville slippa. D.v.s med så lite kod som möjligt.

PeWMedlem sedan juni 200010 432 inlägg
#9

Det behövs inte mycket kod heller och definitivt ingen switch -sats. Det funkar bra att i en loop iterera en lista med funktioner.. kodsnutten blir kanske 3 rader lång ;)

Det du ser i VB är en vad du tycker smidig lösning. Men i bakgrunden är det samma sak.. och i C/C++ bygger man ofta upp egna bibliotek med liknande lösningar och implementerar dessa när så behövs. Man behöver mao inte uppfinna hjulet flera ggr.

Sang-draxMedlem sedan juli 2002581 inlägg
#10

Min idé om hur det kan göras i C++:

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

int mul(int a, int b)
{
  return a*b;
}
int add(int a, int b)
{
  return a+b;
}
//etc. etc. etc...

int main()
{
  using namespace std;

  //CallByName i C++
  map<string, int(*)(int,int)> CallByName;
  //Initera lista - ett måste
  CallByName["mul"] = mul;
  CallByName["add"] = add;

  //Nu kan vi använda call by name

  string op;
  int a,b;
  cout << "Skriv in "tal1 op tal2"  där op=(add,mul,div,sub... etc.)";
  cin >> a >> op >> b;
 
  cout  << a << " " << op << " " << b "= ";

  //Här anropar vi CallByName
  cout << CallByName[op](a,b);
  
}

Edit: Glömde som sagt inkludera lite filer.

Nexus86Medlem sedan okt. 20023 030 inlägg
#11

Tack så mycket! Nu undrar jag bara över en sak, vilka include's behövs för ovanstående?

PeWMedlem sedan juni 200010 432 inlägg
#12

#include<map> & #include <iostream>

*Samma stuk men utan includes ger inte mycket mer kod i C, heller ;) *

Nexus86Medlem sedan okt. 20023 030 inlägg
#13

Tackar tackar!

Sang-draxMedlem sedan juli 2002581 inlägg
#14

Även <string> behöver finnas med.

PeW: Vad menar du?

Nexus86Medlem sedan okt. 20023 030 inlägg
#15

Jojo.. Det förstog jag faktiskt.. :)

PeWMedlem sedan juni 200010 432 inlägg
#16

PeW: Vad menar du?

Nåt i stil med:

#define NO_OP 2

typedef struct {
	char * op_name;
	void (*operation)();
}funcOverall;

// funktion 1
void one(){
	puts("Ett");
}

// funktion 2
void two(){
	puts("Två");
}

// funktionslista
funcOverall callByName[NO_OP] = 
   {
	   {"one",one},{"two",two}
   };

//strängjmfr
int StrCmp(const char *s1,const char *s2)
{
	while(*(s2++)==*(s1++))
		if(*s2=='\0' && *s1=='\0')
			return 1;
	return 0;
}

int main(){
    unsigned char op[10];
	int i;
    
	do{
	  gets(&op);

     // 3 rader för att plocka ut rätt funktion
      for(i=0;i<NO_OP;i++)
		  if(StrCmp(callByName[i].op_name,op))
			  callByName[i].operation();			  
		  
	}while(!StrCmp(op,"q")); //kör till 'q' är inmatat
	

	return 0;
}
ViktorMedlem sedan aug. 20021 752 inlägg
#17

Man får låv att tacka för en väldigt givande tråd :bire

/Viktor

Sang-draxMedlem sedan juli 2002581 inlägg
#18

Lägg gärna in ett break; efter callByName*.operation(); så undviks sökning i onödan.*

PeWMedlem sedan juni 200010 432 inlägg
#19

Visst är det lämpligt, speciellt om man bygger på med många funktioner. Koden är bara ett (dock fungerande) exempel på liknande förfarande som det ovanför, fast i ren C.

Men eftersom C++ istort sett är bättre på allt är Sang-drax exempel ändå snyggare :e

Marcus EMedlem sedan maj 20021 466 inlägg
#20

PeW skrev:

Visst är det lämpligt

Ehum... är det lämpligt med break?

http://www.webforum.nu/showthread.php?s=&postid=409151#post409151

137 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)