Avatar billede mollmannj Nybegynder
23. oktober 2002 - 14:43 Der er 7 kommentarer

Message Passing

Hvordan kan man overføre to variabler i en struct via message passing?? Altså, vi har en struct der indeholder en char og en int. Vi kan umiddelbart kun få sendt Char'en...
Avatar billede arne_v Ekspert
23. oktober 2002 - 14:47 #1
Hvilken form for message passing ?
Avatar billede soepro Nybegynder
23. oktober 2002 - 15:01 #2
Problemet er at den message du sender runt, er en char[] - dvs. den stopper ved den første karakter nul. Hvis du ser følgende struct som en char:

struct muStruct
{
  char navn[7] = "SOEPRO";
  int  tal = 13;
}
 
indeholder den i bytes:

  'S', 'O', 'E', 'P', 'R', 'O', '\x0' /* Slut på teksten. */, '\r' /* LSB af inten med de 13 i */, '\x0' /* MSB af inten med de 13 i. */

forudsat vi kører 16-bit (short) integers. En Message vil derfor stoppe ved første '\x0', dvs. med teksten 'SOEPRO'. Jeg vil foreslå at du "parser" den til en læsbar version, inden du sender den:

const int intLen = 5; /* Max 5 cifre to 16-bit short integer */
char parsedStruct[50];
sprintf(parsedStruct, "%*.*s:%0*.*d", sizeof(myStruct.navn)-1, sizeof(myStruct.navn)-1, myStruct.navn,
                                    intLen, intLen, myStruct.tal);

parsedStruct vil så indeholde "SOEPRO:00013", som kan sendes uden problemer. Udpakningen kan du lave tilsvarende:

sscanf(parsedStruct, "%*.*s:%0*.*d", sizeof(myStruct.navn)-1, sizeof(myStruct.navn)-1, myStruct.navn,
                                    intLen, intLen, myStruct.tal);

(Ikke helt sikker på scanf syntaksen - men princippet skulle være ok.)
Avatar billede arne_v Ekspert
23. oktober 2002 - 15:16 #3
Hvis message API forventer en nul-termineret strenge som
argument, så er det en yderst præcis forklaring.

PS: I sscanf skal du have &myStruct.tal, men det er en detalje.
Avatar billede mollmannj Nybegynder
23. oktober 2002 - 15:19 #4
sorry boys.
men det bliver vist lige i overkanten. har bare valgt at lave en struct mere til som kommer til at indeholde stk.
Avatar billede soepro Nybegynder
23. oktober 2002 - 15:35 #5
mollmanni >> Men den holder ikke - du kan ikke sende stk. (i int eller float) som en char streng, selvom du caster den, fordi der stoppes ved første nul-byte. En int som f.eks. 256, har LSB = 0, dvs. den bliver sendt som en tom streng.
Avatar billede mollmannj Nybegynder
23. oktober 2002 - 15:47 #6
Nej vi laver 2 messages, så vi håndtere bare flere messages, og ikke en message med flere variable. :-) Sorry
Avatar billede soepro Nybegynder
05. november 2002 - 10:59 #7
mollmanni >> Du læser vist ikke mit svar ! (http://exp.dk/spm/274660) Som du skriver dit spørgsmål tolker jeg det sådan at den String du får overført kun indeholder den første char !

Hvis du rent faktisk KAN overføre structurer, så skal du lave en opbygning af dine structs, som gør at du kan skelne dem:
const int aMSGid = 1;
const int bMSGid = 2;
const int cMSGid = 3;
// osv.

class CBase
{
  public:
  int id;
  CBase(int id);
};

class CaMSG : CBase
{
  public:
  char data[100];
  CaMSG(char *s) : CBase(aMSGid) { memset(data, '\x0', sizeof(data));
                                  memcpy(data, s, sizeof(data));
                                };
  CaMSG(void) : CBase(aMSGid) { CaMSG(""); };
};
class CbMSG : CBase
{
  public:
  int data;
  CbMSG(int i) : CBase(bMSGid) { data = i; };
  CbMSG(void) : CBase(bMSGid) { CbMSG(0); };
};

I din receive henter du så bare til et alm. char array, som er stort nok - og flytter til den korrekte struct vha. memcpy():

CaMSG aMSG;
cbMSG bMSG;
struct
{
  int ID;
  char data[1025];
} buffer;
:
recv(buffer, ...);
switch (buffer.ID)
case
{ aMSGid : memcpy(aMSG, buffer, sizeof(aMSG)); break;
  bMSGid : memcpy(bMSG, buffer, sizeof(bMSG)); break;
  default: // Ukendt meddelelse.
          break;
};

:
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