Avatar billede emileej Nybegynder
19. juni 2001 - 14:01 Der er 33 kommentarer og
3 løsninger

free() kald med et this->... argument.

Jeg har et medlem af en class, der i en funktion fra den samme class, bliver initialiseret ved hjælp af en malloc(); - i en anden medlemsfunktion, skal jeg så frigive hukommelsen for, at gøre antallet af elementer større/mindre, og så skal jeg jo først frigive den hukommelse, der allerede er tildelt pointeren - det gør jeg på følgende måde:

free(this->values);

Når jeg kører programmet, får jeg bare en acess violation på den linie... hvad sker der for den?!

E-)mil
http://eej.dk
http://fotx.net/emileej
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 14:25 #1
mere kode, tak
Avatar billede emileej Nybegynder
19. juni 2001 - 14:40 #2
oki oki :)

        int *tempValues;
        tempValues=(int *)malloc((sizeof(int)*this->count));
        int i;
        for(i=1;i<=this->count;i++){
                tempValues[i-1]=this->values[i-1];
        }
        free(this->values);
        this->count--;
        this->values=(int *)malloc((sizeof(int)*count));
        for(int i=1, j=0;j<=this->count;i++){
                if(i!=idx)j++;
                this->values[j-1]=tempValues[i-1];
        }
        free(tempValues);
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 14:43 #3
Hmm - kigger lige, men realloc burde kunne gøre det for dig
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 14:44 #4
Hvad med
  this->values=(int *)malloc((sizeof(int)*this->count));
??
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 14:46 #5
Med realloc:

1) flyt værdierne ned så du overskrive idx-positionen
2) this->count--;
3) realloc(this->values,sizeof(int)*this->count);
Avatar billede emileej Nybegynder
19. juni 2001 - 14:51 #6
kan jeg også bruge realloc i den funktion, hvor jeg bruger
this->count++;
?
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 14:53 #7
Yeps.

1) this->count++;
2) realloc(this->values,sizeof(int)*this->count);
3) Flyt lidt rundt på dem
Avatar billede emileej Nybegynder
19. juni 2001 - 15:03 #8
Nu ser den således ud, og den brokker sig endnu mere end før:

        int *tempValues, *tempXCoordinates, *tempYCoordinates;
        tempValues=(int *)malloc((sizeof(int)*(this->count-1)));
        int i;
        for(int i=1, j=0;j<=this->count-1;i++){
                if(i!=idx)j++;
                tempValues[j-1]=this->values[i-1];
        }
        this->count--;
        this->values=(int *)realloc((void *)this->count,sizeof(int));
        for(i=1;i<=this->count;i++){
                this->values[i-1]=tempValues[i-1];
        }
        free(tempValues);

:(
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 15:09 #9
Du skal jo gøre som jeg siger (utestet):

for(int i=1, j=0;j<=this->count-1;i++){
  if(i!=idx)j++;
  this->values[j-1]=this->values[i-1];
}
this->count--;
this->values=(int *)realloc(this->values,sizeof(int)*this->count);
Avatar billede emileej Nybegynder
19. juni 2001 - 15:25 #10
jammen bliver al data da ikke overskrevet ved kaldet til realloc? og hvis jeg bare skriver derud af - så rammer jeg vel ualkerede sektore i rammen...
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 15:28 #11
realloc kopierer selv. Ellers er der ikke meget fidus. Den er så smart at lade
data ligge hvor de ligger, hvis der er plads. Og ellers flytter den det selv.
Avatar billede emileej Nybegynder
19. juni 2001 - 15:30 #12
det virker ikke i den funktion hvor jeg bruger this->count++ - der får jeg en access vilation i linien:
this->values[j-1]=this->values[i-1];
og det er jo også klart, når jeg jo bevæger mig ud på ualokkeret område i rammen:

        for(int i=1;i<=this->count+1;i++){
                this->values[i-1]=this->values[i-1];
        }
        this->count++;
        this->values=(int *)realloc(this->values,sizeof(int)*this->count);
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 15:31 #13
Jamen for sytten sure sokker da også. Du skal jo gøre som jeg siger i
Kommentar fra erikjacobsen 19/06 2001 14:53:23 

For du skal lave pladsen først, ikke ??
Avatar billede emileej Nybegynder
19. juni 2001 - 15:36 #14
hehe - nååå - jeg var bare doven og tog en direkte c/p af det du skrev :)~
Avatar billede emileej Nybegynder
19. juni 2001 - 15:42 #15
Har jeg forstået dig ret hvis det er dette du mener?:

        this->count++;
        this->values=(int *)realloc(this->values,sizeof(int)*this->count);
        this->values[this->count-1]=value;

Det ser fint nok ud, men jeg får stadigt den acces violation... :(
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 15:45 #16
Hvordan alloc-er du this->values første gang? Og er det ved første indsættelse,
eller senere du får fejlen.

Ja, det er bare smukt. Findes der noget kønnere end et kompakt C-program?
Ja, et endnu kompaktere:

      this->values=(int *)realloc(this->values,sizeof(int)*(++(this->count)));
      this->values[this->count-1]=value;
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 15:46 #17
Måske man endda kan
  this->values=((int *)realloc(this->values,sizeof(int)*(++(this->count)))[this->count-1]=value);

....men ok, det er ikke dit problem lige nu. Hold dig bare til de 3 linier.
Avatar billede emileej Nybegynder
19. juni 2001 - 15:48 #18
jammen hvad er det så der er galt? jeg får en acces violation, når jeg prøver at aflæse værdien af this->values i en anden funktion...
Avatar billede erikjacobsen Ekspert
19. juni 2001 - 15:52 #19
Jamen, så svar på mit spørgsmål, ellers spilder vi da hinandens tid:
\"Hvordan alloc-er du this->values første gang? Og er det ved første indsættelse,
eller senere du får fejlen.\"
Avatar billede emileej Nybegynder
19. juni 2001 - 16:20 #20
Oki - det må du undskylde - havde ikke set at du havde skrevet det :(

Jeg allokerer ikke this->values, da objektet fra start af jo ikke har nogle værdier (this->count=0). Den allokeres først, når der bliver tilføjet nogle værdier (i den funktion du lige har hjulpet med).

Jeg regner med at det er ved første indsættelse, at fejlen sker, da jeg ikke kan se det precist :-/
Avatar billede emileej Nybegynder
19. juni 2001 - 16:30 #21
Skal jeg allokere den til nul elementer eller?
Avatar billede emileej Nybegynder
20. juni 2001 - 09:23 #22
Så nu har jeg lavet mit hjemmearbejde :)
Jeg har lavet om i constructoren, så \"values\" initieres med en malloc af een int. Så har jeg fået afgrænset problemet til, at der kun kommer acess violation i funktionen til at fjerne et element:

        for(int i=1, j=0;j<=this->count-1;i++){
                if(i!=idx)j++;
                this->values[j-1]=this->values[i-1];
                this->xCoordinates[j-1]=this->xCoordinates[i-1];
                this->yCoordinates[j-1]=this->yCoordinates[i-1];
        }
        this->count--;
        this->values=(int *)realloc(this->values,sizeof(int)*this->count);
        this->xCoordinates=(int *)realloc(this->xCoordinates,sizeof(int)*this->count);
        this->yCoordinates=(int *)realloc(this->yCoordinates,sizeof(int)*this->count);

E-)mil
Avatar billede emileej Nybegynder
20. juni 2001 - 09:59 #23
Du skal ikke tage dig af de to andre vaiabler - de gennemgår bare den samme procedyre som this->values :)
Avatar billede emileej Nybegynder
20. juni 2001 - 10:03 #24
Jeg har testet lidt mere, og borland builder giver en \"invalid pointer opreation\" runtime fejl - før jeg får min acces violation fra windows - stadigt i overstående funktion...
Avatar billede borrisholt Novice
20. juni 2001 - 13:28 #25
emilj>> Såvidt jeg kan se så bruger du en Dynamisk array. Det gøres således i C++ :

  int n = this->count;
  int* tempValues = new int[n];
  for(int i=1; i<= n; i++)
    tempValues[i-1]=this->values[i-1];


Jens B
Avatar billede borrisholt Novice
20. juni 2001 - 13:29 #26
når så du er færdig med at bruge din tempValues kaldes delete tempValues;

Jens B
Avatar billede emileej Nybegynder
20. juni 2001 - 14:44 #27
Så vidt jeg ved, skal der da bruges en konstant værdi ved initialiseringen int* tempValues = new int[...];
Det var derfor jeg ikke prøvede den måde - har dog ikke C++ kørende, men jeg tester det om 2 sek...
Avatar billede emileej Nybegynder
20. juni 2001 - 14:52 #28
Der mangler jo delen hvor jeg laver om på størrelsen af this->values; hvordan gør jeg det i dit forslag?
Avatar billede erikjacobsen Ekspert
20. juni 2001 - 19:41 #29
Du der, emil, kan du ikke lige sende al din kode til mig (klik på mit navn), så
kan jeg lige hælde det igennem en oversætter her... Det er nemmere end
at konstruere det hele igen :)

Du kan godt initialisere this->value til at pege på et array med 0 elementer. Og ja,
det skal alloc-es.
Avatar billede ap Nybegynder
08. juli 2001 - 01:49 #30
Undskyld jeg blander mig lidt, men hvis formålet med koden er at fjerne et felt (idx) fra Values,
er det så ikke nemmere og hurtigere at gøre dette

this->count--;
for(int i=idx, i<this->count;i++){
    this->values[i] = this->values[i+1];
    }
this->values=(int *)realloc(this->values,sizeof(int)*this->count);

og forøvrigt er det nemmere at bruge memcpy til at kopiere indholdet istedet for at tage hver enkelt index.
Avatar billede erikjacobsen Ekspert
08. juli 2001 - 01:54 #31
Jo, ap, det var jo noget i den stil vi skulle nå frem til, men den er vist opgivet
af spørgeren.
Avatar billede ap Nybegynder
08. juli 2001 - 02:11 #32
Det har du sikkert ret i, men det kan være han dukker op lige pludselig.
Avatar billede emileej Nybegynder
17. juli 2001 - 14:29 #33
Hehe - BØH!
Narhj narhj - har skam ikke glemt jer - er bare først liiige kommet hjem fra ferie i syden :)

E-)mil
Avatar billede erikjacobsen Ekspert
17. juli 2001 - 14:32 #34
Ferie i syden - det kan bestemt ikke være bedre end ferie ude på min
græsplæne :)) Men mener du \"ferie uden Internet\" ... oh, gru, oh rædsel....
Avatar billede emileej Nybegynder
20. juli 2001 - 10:33 #35
*lol*
Undskyld jeg ikke har fået testet dit bud endnu, men jeg har en del havearbejde, jeg er blevet prakket på af de gamle :)~

E-)mil
http://eej.dk
http://fotx.net/emileej
Avatar billede emileej Nybegynder
23. august 2001 - 17:05 #36
Beklager meget den lange stilhed, men tid er ikke meget jeg har af for tiden, så projektet er røget nederst i bunken...

Jeg deler pointene lige imellem jer, og kigger på jeres svar, når jeg får tid :)

E-)mil
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