[C++ eee Delphi]

0

Witam. Przepraszam że tu zawędrowałem
ale mam pytanie multi językowe...
Czy taka konstrukcja w C++:

struct dupa {
int zmienna1;
char tekst[];
int zmienna2;
}

jest równoważna z taką w Delphi

type
TDupa = packed record
Zmienna1 : Integer;
Tekst : Array of Char;
Zmienna2 : Integer;
end;

konkretnie chodzi mi o pole Tekst, bo w Delphi
to jest wskaźnik 4 bajtowy i przez to nie wiem jak
taki rekord zrzutować po przez Move() na ciąg bajtów
w jakiejś tablicy (tzn żeby pojawiły się kolejne znaki
z Tekstu a nie kolejne 4 od wskaźnika)
i jestem ciekaw jak jest w C++ z tym polem Tekst ?
Czy da się taką operację wykonąć ?

0

Wypowiem się tylko w kwestii C++.

char tekst[];

jest równoważne z

char *tekst;

Innymi słowy jest to wskaźnik (4 bajty).
Jeśli teraz zaalokujemy dla niego pamięć (20 bajtów):

text = new char[20];

to text wskazuje na pierwszy bajt tej "tablicy".
Jeśli masz drugą tablicę, np. tab to możesz napisać:

Move(tekst, tab, 6);    //przenosi 6 bajtów z tekst do tab
0

Jeśli masz drugą tablicę, np. tab to możesz napisać:

Move(tekst, tab, 6);    //przenosi 6 bajtów z tekst do tab

hmm... ok, thx, czyli mniej więcej jest tak samo jak w Delphi.

Co do tego Move to tak trochę nie wiadomo o co mi chodzi
więc wytłumaczę. Chodzi o ten cały struct. Dostałem link
od Szymka do opisu protokołu GG i tam wszystkie pakiety
opisywane są w ten sposób:

struct jakas_nazwa {
int zmienna1;
int zmienna2;
//itd...
}

no i zachodzę w głowę, po co to jest pisane w ten sposób ?
Można by napisać: pakiet zawiera następujące pola itd...
więc chyba struct ma jakieś znaczenie w C i może deklaracja
takiej struktury jest pomocna w pisaniu programu...

Wymyśliłem sobie że struct to jest to samo co record
i ma to ułatwiać odczytanie/zapisanie danych z/do gniazda
no bo jak chcemy odczytać pakiet z dwoma integerami
to wystarczy:

type
TRec = record
zmienna1 : Integer;
zmienna2 : Integer;
end;

a potem przy odbieraniu

var
Rec : TRec
begin
Socket.ReceiveBuf(Rec, SizeOf(Rec));
end;

no i w przypadku takiego rekordu to ma sens ale kiedy
pojawia się w rekordzie:

char tekst[]; czyli Array of Char;

to po takiej operacji, zostały by pewnie odczytane
do pola tekst tylko 4 bajty, przynajmniej w Delphi
i dla tego zastanawiam się czy może w C++ było by
inaczej ? bo jeśli nie to po diabła wypisują te
structy w dokumentacji ... ?

Tak się zastanawiam czy ktoś mnie zrozumie... :-D

0
<font color="green"> Wypowiem się tylko w kwestii C++.

char tekst[];
jest równoważne z
char *tekst;

</span>

a to jest nieprawda (tzn nie do konca)
np:

char pText1[10];
char *pText2;

i metode

void JakasMetoda(char** pData)
{
......
}

i spróbujemy skoplikowac taki kawalek kodu

JakasMetoda(&pText1);
JakasMetoda(&pText2);

to dla pierwszej linijki kompilator wywali ze nie mo|e skastowac z
char (*)[10] do char**

0

a to jest nieprawda (tzn nie do konca)

Hmm, no rzeczywiście. Przyznam, że nie wiedziałem (a wynika to stąd, że nigdy nie używam zapisu char[]). Ale jest jeszcze jeden błąd zarówno u mnie, jak i u Ciebie. Nie można napisać takiej deklaracji:

char text[];

Jeśli jest to w strukturze, to OK, ale inaczej jest to błąd.

Zmyliło mnie może to, że oba poniższe zapisy są poprawne i stosowane często wymiennie:

char pText1[] = "abcd";
char *pText2 = "abcd";
0

To teraz ja od strony Delphi:

struct dupa {
 int zmienna1;
 char tekst[];
 int zmienna2;
}

jest równoważna z taką w Delphi

type
 TDupa = packed record
  Zmienna1 : Integer;
  Tekst : PChar;
  Zmienna2 : Integer;
 end;

Jest to odpowiednik char* i w tym wypadku także tego char [], ponieważ w tym wypadku nie chodzi o typy.
A jest to bardzo wygodne przy wykorzystaniu Move, bo się podaje po prostu Tekst, jako parametr w Move (żadnych adresów jawnych).
Zastanawia mnie tylko jedna rzecz. Czy w C jest wyjustowanie do np. 4 bajtów?

0

Nie bardzo wiem co chcesz justowac Dryobates ;) ale cos takiego justuje :
[code]
union tagJAKAS {
struct tagSTRUCT {
char cZnak;
}
int Align;
};
[/code]
i masz wyrownanie do 4 (ofcoz na OS 32bitowym ;) ) - chyba o to chodzilo ?!.
NA linuxie pod gcc jest tez taki trik :
[code]
struct tagSTRUCT {
charcStr[3];
} attribute ((packed));
[/code]
pakuje az milo :) w porownaniu bez packed :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1