Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il notebook gaming 'budget' che non ti aspetti
Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il notebook gaming 'budget' che non ti aspetti
Il Lenovo LOQ 15i Gen 10 (15IRX10) offre prestazioni convincenti grazie al Core i7-13650HX e alla RTX 5060 Laptop a 100W, mantenendo un prezzo competitivo tra 1100 e 1300 euro. Costruzione solida, buon display e ampia espandibilità lo rendono una scelta equilibrata per chi cerca un notebook gaming accessibile ma moderno.
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Abbiamo giocato a lungo a Battlefield 6, abbiamo provato tutte le modalità multiplayer, Redsec, e le numerose personalizzazioni. In sintesi, ci siamo concentrati su ogni aspetto del titolo per comprendere al meglio uno degli FPS più ambiziosi della storia dei videogiochi e, dopo quasi due mesi, abbiamo tirato le somme. In questo articolo, condividiamo con voi tutto ciò che è Battlefield 6, un gioco che, a nostro avviso, rappresenta esattamente ciò che questo genere attendeva da tempo
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-03-2006, 16:06   #1
FagioloOne
Member
 
L'Avatar di FagioloOne
 
Iscritto dal: Sep 2005
Città: Venezia
Messaggi: 160
[c++]array bidimensionali

Sono un programmatore autodidatta perciò se il problema è stupido, o dovuto alla mia ignoranza mi scuso già in precedenza.

Devo creare una funzione che dato un determinato array me lo ridia indietro modificato, come unico valore qualcuno mi sa aiutare. Il mio libro non spiega un bel niente e tutte le mie prove con i puntatori sono stati infruttuose, grazie in anticipo per le vostre eventuali risposte.
FagioloOne è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2006, 19:14   #2
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Non ti sei spiegato molto bene.
Devi manipolare i valori delle componenti di un array bidimensionale?
Oppure devi ottenere un singolo valore, che in qualche modo ti rappresenta l'intero array (ad esempio: una stringa hash)?

Comunque, visto che parli di array bidimensionali... si possono fare, con un trucco.
Quando tu dichiari, ad esempio, "int m[5][6]", m è un array (statico) di 5 array (statici) a 6 componenti intere. Tu vuoi riprodurre questo comportamento con i puntatori, in modo da poter allocare la matrice in modo dinamico.

La prima difficoltà sta nel capire il tipo giusto.
Se m fosse un array di int, e tu lo passassi a una funzione, esso verrebbe convertito in un puntatore di tipo int* (al suo primo elemento): ma dato che m è un array di array, dovrebbe essere convertito in un puntatore ad array di int anziché ad int. Effettuando un'altra conversione, viene fuori che m deve diventare un puntatore a puntatore a int.

Adesso che hai capito che tipo di oggetto devi trattare, devi capire come farlo.
Anzitutto, devi allocare la memoria giusta: se la matrice ha rows righe e cols colonne, allora è chiaro che dovrai allocare prima un vettore di rows vettori di int, e poi rows vettori di cols int.
Ad esempio:
Codice:
int **matrix_alloc(int rows, int cols)
{
    int i, **p;

    p = (int**)malloc(rows*sizeof(int*));
    if (p==NULL)
        return NULL;
    for (i=0; i<rows; i++)
    {
        p[i] = (int*)malloc(cols*sizeof(int));
        if (p[i]==NULL) break;
    }
    if (i<rows) /* l'inizializzazione della riga i-esima e' fallita */
    {
        for (--i; i>=0; i--)
            free(p[i]);
        free(p);
        return NULL;
    }
    return p;
}
Nota la sintassi di inizializzazione delle righe: dato che p è un puntatore, p[i] ha lo stesso significato di *(p+i). Questo torna utile quando devi scrivere i valori delle componenti della matrice:
Codice:
m[i][j] = my_expr();
Per deallocare, liberi prima le singole righe, e poi il vettore:
Codice:
void matrix_dealloc(int **p, int rows)
{
    int i;

    for (i=0; i<rows; i++)
        free(p[i]);
    free(p);
}
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2006, 20:49   #3
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2782
Ho sentito dire che la memoria va disallocata nell'ordine inverso a quello in cui la si è allocata, un po' come fa il tuo programma quando dice "l'inizializzazione della riga i-esima e' fallita".
Non so spiegarti bene il perchè ma da quel che ho capito quando disallochi la memoria parte dal puntatore che gli dai fino alla fine+1, andando a fare un casino poi nei puntatori successivi.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2006, 21:14   #4
mr_hyde
Senior Member
 
Iscritto dal: Nov 2005
Città: Genova
Messaggi: 937
anche io non ho capito benissimo la domanda.
Parli di C++ (quindi classi, ereditarieta', eccezioni...) e array.
Hai bisogno di una funzione che modifichi un array.

Da quanto dici immagino che l'array esista gia' e tu non lo debba creare (in caso contrario ti e' gia' stato spiegato come fare, anche se, in C++, e' meglio usare new[], delete [] e try/catch(std::bad_alloc)).

Immagino quindi diverse possibilita':
1) hai una CLASSE che implementa il tipo di dato array (e, dal titolo del tuo thread, immagino array bidimensionale)

In questo caso, dovresti creare una funzione del tipo

void Mastrussa(CMatrix& mat)
{
[...]
funzioni varie che elaborano e modificano "mat"
}

Nota che in realta' si passa il reference dell'istanza di una classe: e' questo che ti permette di "cambiare" all'interno della funzione il parametro, pe meglio dire NON viene creata una copia del parametro ma elaborato DIRETTAMENTE il parametro passato.

Al termine della funzione "mat" sara' restituita al chiamante modificata.

2) tu hai gia' una classe che implementa la matrice e vuoi aggiungere un metodo che elabori i dati in essa contenuti e restituisca un qualche risultato su questi, ad esempio per il calcolo del deteminante di una matrice

Allora dovresti avere una cosa del tipo

class CMatrix
{
[...]
public:
double determinante() const
throw(std::runtime_error);

dove:
1 - "const" si ha perche' il calcolo del determinante non porta ad alcuna modificazione dei dati interni della matrice;
2 - la throw e' per comunicare al chiamante eventuali errori (ad esempio nel caso in cui si sia chiesto il determinante di una matrice NON quadrata)

e quindi dovresi implementare la funzione:

double CMatrix::determinante const
{
if (this->rows() != this->columns())
throw std::runtime_error("Matrice non quadrata, determinante impossibile");

// calcolail determinante
}

In questo caso puoi avere il determinate della matrice come:

CMatrix mat;

// popola mat in qualche modo

double det;
try
{
det = mat.determinante();
std::cout << "Determinante = " << det << std::endl;
}
catch (const std::exception& e)
{
std::cerr << "Impossbile calcolare il determinante - " << e.what() << std::endl;
}

Se invece la tua funzione deve cambiare in qualche modo i dati della matrice la funzione non dovra' essere const, ad esempio
/**
* \brief Inverte la matrice
*
* \throw std::runtime_error in caso di errori
*/
void inverti() throw(std::runtime_error);

E il codice per la chiamata:

CMatrix mat;

try
{
mat.inverti();
std::cout << "Matrice inversa: " << std::endl << mat << std::endl;
}
catch (const std exception& e)
{
std::cerr << "Impossibile invertire matrice - " << e.what() << std::endl;
}

3) (caso comune al C)
hai un array bidimensionale e devi creare una funzione che ne cambi i valori.
In questo caso, visto che in realta' per passare un array devi passare un puntatore, tu passi gia' i valori "per reference" (be', in realta' passare un puntatore e' il modo del C per implementare il passaggio di parametri per reference), quindi modifichi gia' la matrice

Un ultima cosa:
per gli array monodimensionali in C e' lecito scrivere

void funzione(int the_array[])

ovvero indichi alla funzione che trattera' un array ma non specifichi le dimensioni

Per i bi-dimensionali invece NON e' possibile scrivere

void funzione(int the_matrix[][])

Devi indicare almeno una delle dimensioni (mi sembra la seconda, ma non ricordo bene). Immagiono che questo limite sia dovuto a come vengono memorizzate in C le matrici in un unico blocco di memoria contiguo...

Ciao,
Mr Hyde
__________________
MacMini Late 2009/MacMini 2018
mr_hyde è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il notebook gaming 'budget' che non ti aspetti Lenovo LOQ 15i Gen 10 (15IRX10) alla prova: il n...
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando Due mesi di Battlefield 6: dalla campagna al bat...
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
La NASA prova i droni marziani nella Dea...
IBM acquisisce Confluent, leader nella g...
La Commissione Europea indaga AWS e Azur...
Sonda spaziale ESA JUICE: rilasciata una...
PS5 PRO a 698€? L'offerta che nessuno si...
L'equipaggio di Shenzhou-21 ha completat...
Dal milione di download alla rimozione f...
Legno, pelle naturale e socket AM5: la G...
Attenti a X-GPU: la piattaforma sospetta...
La Lotus Eletre Plug-in esiste davvero, ...
Garanzia estesa su Pixel 9 Pro e 9 Pro X...
Addio intelligenza artificiale su Window...
FRAME 4000D LCD RS ARGB, il nuovo case d...
Netflix: AV1 ora gestisce il 30% dello s...
Tesla Optimus inciampa in pubblico e div...
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: 22:43.


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