Avatar billede drone Nybegynder
10. maj 2001 - 13:03 Der er 12 kommentarer og
2 løsninger

struct til char array og omvendt

char buffer[ 374 ];

struct fsp {
    char navn1    [90];
    char Adresse1      [50];
    char Landekode1    [3];             
    char PostNr1    [5];               
    char FoedtDato    [8];
    char Res1    [2];             
    char Adresse2      [50];
    char Landekode2      [3];
    char PostNr2        [5];
    char Adresse3      [50];
    char Landekode3      [3];
    char PostNr3        [5];
    char Navn2    [90];
    char FoedtDato2 [8];
    char Res2      [2];             
} FSP ;
Avatar billede drone Nybegynder
10. maj 2001 - 13:04 #1
Ja så fik jeg trykket enter lidt hurtigt.
Spørgsmålet er, hvordan får jeg flyttet indholdet af FSP til buffer og omvendt?
Avatar billede jpk Nybegynder
10. maj 2001 - 13:08 #2
kan du ikke bare bruge memcpy(...)?
Avatar billede drone Nybegynder
10. maj 2001 - 13:18 #3
Jo måske !
Et hurtigt eksempel ville værre rart!
Avatar billede borrisholt Novice
10. maj 2001 - 13:22 #4
prøv det her :

#include <windows.h>

char buffer[374];

struct fsp {
    char navn1    [90];
    char Adresse1      [50];
    char Landekode1    [3];             
    char PostNr1    [5];               
    char FoedtDato    [8];
    char Res1    [2];             
    char Adresse2      [50];
    char Landekode2      [3];
    char PostNr2        [5];
    char Adresse3      [50];
    char Landekode3      [3];
    char PostNr3        [5];
    char Navn2    [90];
    char FoedtDato2 [8];
    char Res2      [2];             
} FSP ;


void fsp2Buffer(fsp *f,  char * buf)
{
    int Lenght = strlen (buf);
    ZeroMemory(buf,Lenght);
    char *tmpPtr = &buf[0];
   
    memcpy(tmpPtr,f->navn1,90);
    tmpPtr+=90;

    memcpy(tmpPtr,f->Adresse1,50);
    tmpPtr+=50;

//    .... etc.
}

void Buffer2fsp(fsp *f,  char * buf)
{
  ZeroMemory(f,sizeof(*f));
  char *tmpPtr = &buf[0];

  memcpy(f->navn1,tmpPtr, 90);
  tmpPtr+=90;

  memcpy(f->Adresse1,tmpPtr,50);
  tmpPtr+=50;

//    .... etc.
}



Jens B http://fotx.net/borrisholt
Avatar billede drone Nybegynder
10. maj 2001 - 13:38 #5
Havde det her nu været i PLI (som jeg primært koder i), så havde jeg da både buffer og FSP kun indeholder char, defineret buffer og FSP til at dele hukommelse. Sagt på en anden måde, ville jeg sætte pointeren til starten af FSP til starten af buffer, og omvendt.

dcl buffer char(374);
dcl 1 FSP based(adr(buffer)),
      3 navn1 ..
      3 res2 char(2);


navnet memcpy, får mig til at tro at man kopierer
indholdet af hukomelsen fra en startaddrese, et antal bytes frem, over i en anden startaddresse.
Er det så nødvendigt at tage hver enkelt del af structuren for sig, kan man ikke gøre det i en operation ?

Avatar billede jpk Nybegynder
10. maj 2001 - 13:40 #6
Jo, der er ingen grund til at kopiere hver del... Du kan bare tage hele strukturen (den ligger konsekutivt i memory)
du kan også definere din buffer og struct til at bruge det samme memory, brug \"union\"!
Avatar billede borrisholt Novice
10. maj 2001 - 13:43 #7
Jeg er ikke sikker på det her virker ...

void fsp2Buffer(fsp *f,  char * buf)
{
    memcpy(buf,f,sizeof(*f));
}

void Buffer2fsp(fsp *f,  char * buf)
{
  memcpy(f,buf, sizeof(*f));
}

Men jeg tror det. Det kræver at en struct ligger linært i hukkomelsen. Prøv og se ad og meld lige tilbage ...

Jens B
Avatar billede jpk Nybegynder
10. maj 2001 - 13:43 #8
ex på brug af union:

union NumericType        // Declare a union that can hold the following:
{
    int        iValue;  // int value
    double      dValue;  // double value
};

Avatar billede drone Nybegynder
10. maj 2001 - 13:48 #9
Jeg har lige tænkt lidt over det, det går nok ikke. Alle mine char arrays i strukturen, slutter jo alle med en null, denne vil jeg jo ikke have med over i min buffer. Da jeg jo så i praksis kun kan få adgang til den første.

Borrisholt\'s ide er vel så hermed forklaret!?!
Avatar billede drone Nybegynder
10. maj 2001 - 14:01 #10
->Borrisholt nej det sidste virker ikke helt.

Men der mangler vel også nogle erklæringer i Buffer2fsp og fsp2Buffer
Avatar billede borrisholt Novice
10. maj 2001 - 14:04 #11
Nå men anyway som du selv siger så kan du ikke bruge den metode alligevel ... Fordi du ikke vil have NULL terminering med .. Så du må kopiere dem en ad gangen.

Jens B
Avatar billede drone Nybegynder
10. maj 2001 - 14:08 #12
Resultatet fra compileringen:

fsp2Buffer\' : cannot convert parameter 2 from \'char (*)[501]\' to \'char *\'
Avatar billede drone Nybegynder
10. maj 2001 - 14:10 #13
memo til mig selv pas nu på den enter tast.

Ovenstående sker i
fsp2Buffer(&FSP,&buffer);
Avatar billede drone Nybegynder
10. maj 2001 - 14:12 #14
Point hermed givet til borrisholt for en løsning der kan bruges.
Og lidt til JPK som tak for indsatsen
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