Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Ritornare da funzione una matrice ( array 2d )

    Salve a tutti, inconsapevolmente questo pomeriggio, durante una delle mie esercitazioni personali che svolgo per prepararmi all'uso del c++, ho scoperto di essermi imbattuto in una bella rogna per molti ( amatori perlomeno ^^ ) come me.
    Mi dico, voglio provare a creare una simulazione della battaglia navale con il c++.. alchè organizzo bene le idee e tiro giù qualche linea su come proseguire per la programmazione.
    Dopo pochissimo mi imbatto in questo dubbio.. come creo una matrice tramite funzione, inizializzando i suoi elementi a 0 ( stando a significare "casella vuota", dove non sono presenti navi ) riportandola dalla funzione al main per poter poi interagire con essa facendo funzionare le funzioni di disposizione navi, e battaglia vera e propria?

    In sostanza, devo creare un array multidimensionale 10x10, inizializzare i suoi elementi a zero, e riportarlo al main con return..
    Finchè si tratta di ritornare array monodimensionali nessun problema, riporto l'indirizzo dell'array, lo assegno ad un puntatore del main e poi modifico da lì..

    Ma in questo caso mi sono trovato di fronte a problemi di compilazione tra la fase appunto di return della funzione e la fase di "assegnazione" al puntatore del main..
    Qualcuno di voi sa darmi qualche dritta, o può postarmi un esempio anche con una semplicissima matrice 2x2 da riportare al main?

    Se può servire poi posso incollare il codice che per ora ho scritto anche se non credo sarebbe molto utile visto che credo di aver descritto abbastanza bene il problema.. se per caso servisse l'importante è che ce l'ho
    grazie a tutti quelli che vorranno aiutarmi!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Occorre ritornare un puntatore a puntatore (anche se io userei un array e lavorerei sugli indici).
    Più o meno:
    codice:
    int** make_matrix(int rows, int cols) {
    
        int** mtx = new int*[rows];
        for (int i =0; i<rows; i++) {
            mtx[i] = new int[cols];
            memset(mtx[i],0,sizeof(int)*cols);
        }
        return mtx;
    }
    
    void destroy_matrix(int** mtx, int rows) {
    
        for (int i =0; i<rows; i++) {
            delete[] mtx[i];
        }
        delete[] mtx;
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    39
    come dice shodan oppure, se "matrice" è la matrice che hai creato nella funzione

    return (int **)&(matrice[0]);

    naturalmente la funzione deve essere di tipo int**.

  4. #4
    grazie a tutti e due delle risposte, in effetti è un metodo che non avevo vagliato e funziona, ma cercando nel web altre soluzioni mi sono imbattuto in questa:
    Costui ha voluto ricreare il gioco dell'othello ( sostanzialmente si tratta dello stesso tipo di lavoro che dovrei realizzare io, almeno per quanto riguarda la stesura della matrice dove disporre le flotte.. e l'ha realizzata così:

    codice:
       
    
    #include <stdio.h>
    
    #include <stdlib.h>
     
    #define BLACK  1
    
    #define NONE   0
    
    #define WHITE -1
    
    int** board;        
    
    int size;          
    
    int current = BLACK;
     
    int count;       
      
    void initialize ( const int n ) {
      
      int i, j;
            board = (int**)malloc( sizeof(int*) * n );
        for ( i=0; i < n; i++ ) {
            board[i] = (int*)malloc( sizeof(int) * n );
            for ( j=0; j < n; j++ ) {
                board[i][j] = NONE;
            }
        }
        board[n/2-1][n/2-1] = WHITE;
        board[n/2-1][n/2]   = BLACK;
        board[n/2][n/2-1]   = BLACK;
        board[n/2][n/2]  = WHITE;
     
            size = n;
    }
    In quel modo lui più tardi ( nel main ) richiama la funzione passando il valore 8 corrispondente al numero di righe/colonne, e utilizza il puntore **board anche nelle altre funzioni.. posso farlo perchè è stato dichiarato subito dopo i define e quindi è una variabile generale del programma.. oppure è malloc che svolge una particolare funzione di memorizzazione, che vale per tutto il programma una volta eseguito?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    malloc() riserva memoria, non fa altro. Tuttavia è poco pratico gestire un puntatore in quel modo e se anche sul momento appare "geniale", col tempo (e la programmazione), ci si accorge del contrario.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.