Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-09-2009, 16:36   #1
mamo139
Senior Member
 
L'Avatar di mamo139
 
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
[c++] sto scrivendo una classe per la gestione di matrici...

sto scrivendo una classe per la gestione delle matrici...

matrici.h
Codice:
#include <cstdlib>
#include <iostream>

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#ifndef _MATRICI_H
#define _MATRICI_H 1

//**************** class ******************//

class matrice {
    public:
        int r;
        int c;
        double ** m;
        
        //costruttore e distruttore
        matrice();
        ~matrice();
        
        //crea matrice
        void create(int r, int c);
        void create_with_value(int r, int c, double value);
        
        //visualizza matrice
        void print();
        
        //caricamento - salvataggio matrici
        void load_from_file(char * file);
        void save_in_file(char * file);
        
        //operazioni su matrici
        friend matrice operator+(matrice, matrice);
        
        
};
    
#endif
matrici.cpp
Codice:
#include "matrici.h"

//costruttore
matrice::matrice(){
    r = 0;
    c = 0;    
}

//distruttore
matrice::~matrice(){
    
}

//creazione matrice
void matrice::create(int r, int c){ // r = righe, c = colonne

    int x,y;
     
    this->r = r;
    this->c = c;
    m = new double *[r];
    for(x=0;x<r;x++)
        m[x] = new double[c];

         
}
void matrice::create_with_value(int r, int c, double value){
    
    int x,y;
     
    this->r = r;
    this->c = c;
    m = new double *[r];
    for(x=0;x<r;x++)
        m[x] = new double[c];
            
    for(x=0;x<r;x++)
        for(x=0;x<r;x++)
            m[x][y] = value;
     
}

//visualizza matrice
void matrice::print(){
     
     int x,y;
     
     for(x=0;x<r;x++){
          for(y=0;y<c;y++)
               printf("%12.6f\x20",m[x][y]);
          printf("\n");     
     }
     printf("\n");
     
}

//caricamento - salvataggio matrici
void matrice::load_from_file(char * file){
    
    FILE *stream;
    char *buffer, *number;
    long filesize, readed;
    long x, y=0, mr=0, mc=0, r=0, c=0;

    stream = fopen(file,"rb");
    fseek(stream,0,SEEK_END);
    filesize = ftell(stream);
    rewind(stream);
    
    buffer = (char *) malloc(filesize * sizeof(char));
    number = (char *) malloc(100 * sizeof(char));
    readed = fread(buffer,1,filesize,stream);
    
    for(x=0; x<filesize ;x++){ //conta colonne
        if(buffer[x] == '\x09')
            mc++;
        if(buffer[x] == '\x0D'){
            mc++;
            break;
        }
    }
    for(x=0; x<filesize ;x++){ //conta righe
        if(buffer[x] == '\x0D')
            mr++;
    }
    
    create(mr, mc);
    
    for(x=0; x<filesize ;x++){
        if(buffer[x] == '\x0A')
            continue;
        if(buffer[x] == '\x09' || buffer[x] == '\x0D'){
            number[y] = '\x00';
            this->m[r][c] = atof(number);
            y=0;
            c++;
            if(buffer[x] == '\x0D'){
                r++;
                c=0;
            }
        }
        else{
            number[y] = buffer[x];
            y++;
        }
    }

}

void matrice::save_in_file(char * file){

    int x,y;
    FILE * stream;
    stream = fopen(file, "w+");
    
    for(x=0;x<r;x++){
        for(y=0;y<c;y++){
            fprintf(stream,"%.6f",m[x][y]);
            if(y<c-1) fprintf(stream,"\x09");
        }
        fprintf(stream,"\n");     
    }
    fclose(stream);

}

//operazioni su matrici
matrice operator+(matrice a,matrice b){
    
    matrice c;
    int x,y,i;
     
    if(a.r != b.r || a.c != b.c)
        exit(0);
     
    c.create(a.r, a.c);
     
     for(x=0;x<c.r;x++)
          for(y=0;y<c.c;y++)
               c.m[x][y] = a.m[x][y]+b.m[x][y];   

    return c;
}
possiamo provarla con questo codice
Codice:
#include "matrici.h"


int main(int argc, char *argv[])
{
    long x;

    matrice a,b;
    a.load_from_file("a.txt");
    a.save_in_file("b.txt");

    a.print();

    for(x=0;x<1000000000;x++)
        b = a + a;
    
    b.print();

    getchar();
    return 1;
}
questo esempio di codice espone molto bene il problema: effettuando 1000000000 l'operazione b = a + a; la memoria utilizzata dal programma continua ad aumentare all'infinito... devo riuscire a liberare la memoria quando essa non serve piu.
Solo che non so come fare...

grazie
__________________
http://mamo139.altervista.org
mamo139 è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2009, 20:09   #2
british
Member
 
L'Avatar di british
 
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
credo proprio che tu debba implementare l'overload dell'operatore di assegnamento ( e quindi anche il costruttore di copia e il distruttore)

ciao!

british
british è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2009, 20:19   #3
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
banalmente: quel programma contiene un tot di operatori new e nemmeno un delete, l'effetto collaterale che esponi mi sembra il minimo.
hint: il distruttore della classe matrice é vuoto. riempilo
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2009, 23:56   #4
mamo139
Senior Member
 
L'Avatar di mamo139
 
Iscritto dal: Sep 2006
Città: Bologna/Milano
Messaggi: 525
Quote:
Originariamente inviato da fero86 Guarda i messaggi
banalmente: quel programma contiene un tot di operatori new e nemmeno un delete, l'effetto collaterale che esponi mi sembra il minimo.
hint: il distruttore della classe matrice é vuoto. riempilo
riempito con un bel po di delete

Quote:
Originariamente inviato da british Guarda i messaggi
credo proprio che tu debba implementare l'overload dell'operatore di assegnamento ( e quindi anche il costruttore di copia e il distruttore)

ciao!

british
hai ragione... ho risolto il problema mettendo un copy constructor, un assignment operator e dei bei delete nel distruttore...

grazie a tutti e due
__________________
http://mamo139.altervista.org
mamo139 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:49.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v