Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: memcpy  (Citit de 4063 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
VladS
Vizitator
« : 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?
Memorat
svalentin
Nu mai tace
*****

Karma: 88
Deconectat Deconectat

Mesaje: 704



Vezi Profilul
« Răspunde #1 : Noiembrie 05, 2005, 18:05:29 »

sigur ai pus bine argumentele?
memcpy(sursa, destinatie, cat)
Memorat
danielp
Vorbaret
****

Karma: 34
Deconectat Deconectat

Mesaje: 194



Vezi Profilul
« Răspunde #2 : 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...
Memorat

I can't get a life if my heart's not in it
VladS
Vizitator
« Răspunde #3 : 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...
Memorat
domino
Echipa infoarena
Nu mai tace
*****

Karma: 281
Deconectat Deconectat

Mesaje: 1.340



Vezi Profilul WWW
« Răspunde #4 : 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
Memorat
VladS
Vizitator
« Răspunde #5 : 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 ) ?
Memorat
cristi8
Vizitator
« Răspunde #6 : 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.
Memorat
domino
Echipa infoarena
Nu mai tace
*****

Karma: 281
Deconectat Deconectat

Mesaje: 1.340



Vezi Profilul WWW
« Răspunde #7 : 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.
Memorat
VladS
Vizitator
« Răspunde #8 : 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.
Memorat
cristi8
Vizitator
« Răspunde #9 : 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];"
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines