infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: VladS din Noiembrie 05, 2005, 16:01:13



Titlul: memcpy
Scris de: VladS din Noiembrie 05, 2005, 16:01:13
Aveam la o problema ceva de genu memcpy(a, b, sizeof(b) ); unde b era vector constant. Si luam wa pe 5 teste. Am facut debuging o saptamana. Am schimbat  cu o copiere cu for si, surpiza, am luat 100. Stie cineva care ar fi explicatia?


Titlul: memcpy
Scris de: Valentin Stanciu din Noiembrie 05, 2005, 18:05:29
sigur ai pus bine argumentele?
memcpy(sursa, destinatie, cat)


Titlul: memcpy
Scris de: Daniel Pasaila din Noiembrie 05, 2005, 18:31:26
Bineinteles ca functiile care lucreaza cu memoria sunt sigure. Verifica daca vectorul b nu e mai mare cunva decat vectorul a, astfel poti sa scrii peste marginea superioara a lui a. Altceva nu stiu ce ar putea fi...


Titlul: memcpy
Scris de: VladS din Noiembrie 09, 2005, 20:17:51
M-am mai uitat odata pe sursa si am gasit ceva de genu.
Cod:

inline void operator = (int x[]) {
       memcpy(v,x,sizeof(x));
}
...
bla= pre[ a ];

Unde pre[a] e vector constant. Oricum ciudat ca a mers doar pe o parte din teste...


Titlul: memcpy
Scris de: Mircea Pasoi din Noiembrie 09, 2005, 20:59:34
Citat din mesajul lui: TYTUS
M-am mai uitat odata pe sursa si am gasit ceva de genu.
Cod:

inline void operator = (int x[]) {
       memcpy(v,x,sizeof(x));
}
...
bla= pre[ a ];

Unde pre[a] e vector constant. Oricum ciudat ca a mers doar pe o parte din teste...


hmm, la apelul operatorului = cu int x[] ca parametru, ia vezi cat e sizeof(x).. cred ca x este transmis ca int* , deci sizeof(x) va fi sizeof(int), adica 4, deci copierea nu face mare lucru


Titlul: memcpy
Scris de: VladS din Noiembrie 10, 2005, 08:28:35
Eu folosesc mereu formatul asta de apel (cu sizeof ) la functiile cu memoria si pana acum nu am mai avut probleme.
S-ar putea ca sizeof( const int[]x) != sizeof (int []x ) ?


Titlul: memcpy
Scris de: cristi8 din Noiembrie 10, 2005, 12:42:21
Cod:
int x[1200];

inline void f (int x[]) {
       printf("%d\n", sizeof(x));
}


apelul "f(x);" afiseaza 4.


Titlul: memcpy
Scris de: Mircea Pasoi din Noiembrie 10, 2005, 12:45:05
Citat din mesajul lui: TYTUS
Eu folosesc mereu formatul asta de apel (cu sizeof ) la functiile cu memoria si pana acum nu am mai avut probleme.
S-ar putea ca sizeof( const int[]x) != sizeof (int []x ) ?


Ai verificat ce ti-am zis? Cand trimiti un vector ca parametru se trimite ca int* , deci sizeof() va fi 4, nu marimea vectorului.


Titlul: memcpy
Scris de: VladS din Noiembrie 13, 2005, 10:08:16
Am verificat, aveti dreptate. Deci daca mai fac copiere intr-o functie corect ar fi
Cod:
memcpy(a,b, d*sizeof(b) );

Bine ca stiu, oricum pana acuma nu m-am ars la faza asta, da puteam s-o patesc intr-un concurs. Mersi.


Titlul: memcpy
Scris de: cristi8 din Noiembrie 13, 2005, 11:30:00
dar vezi in interiorul functiilor cand primesti ca parametru ceva si tu stii ce marime are, e mult mai sigur sa pui
Cod:
1008*sizeof(int)

asta in caz ca stii ca ai defapt un "int x[1008];"