Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    79

    [Dev C++] Ri-allocare dinamicamente una matrice, codice non funzionante

    Salve ragazzi,
    da ormai due settimane mi sto dilettando nel comporre un programma che permetta di giocare a Snake.
    In questo periodo sono scontrato con nuovi concetti che mi hanno dato parecchio filo da torcere, visto che non sono un esperto di programmazione, ma fin qui fortunatamente me la sono cavata, lo snake per ora è a turni, bisogna premere sempre il tasto per farlo muovere (ergo, devo ancora vedermi i timer per farlo muovere automaticamente se non viene premuto niente), ma qualcosa dal nulla ha preso vita .

    Ora è tempo di farlo crescere, nel vero senso della parola !! Quando mangia il frutto, la sua dimensione dovrebbe aumentare di un'unità. Per questo sin dall'inizio ho pensato di usare gli array dinamici, di cui avevo sentito parlare.
    In memoria lo snake è rappresentato dall'array bidimensionale intero snakeArray 4x4, il quale dovrebbe incrementare di una riga ogni volta che cresce.
    All'inizio ho provato ad usare le istruzioni new e delete, ma poi mi sembra di aver capito girovagando per il web che questa coppia non ammette una terza funzione che ri-allochi la memoria preservando i dati, quindi mi sono buttato su malloc e realloc.

    Ho isolato il codice di allocamento e ri-allocamento per testarlo e capire esattamente cosa succede. Il codice qui sotto compila correttamente, ma durante l'esecuzione, dopo che inserisco il nuovo numero di righe per cui ri-allocare la matrice, compare la finestra di errore in windows che mi impone di terminare il programma e la console dos si chiude.
    Ho pensato che probabilmente c'è qualcosa che non funziona perchè si tenta l'accesso ad aree di memoria non di competenza del programma, ma sinceramente non capisco cosa sbaglio .
    Complice di questa incomprensione il fatto che non riesco ad eseguire il debug del codice a causa del fatto che quando provo a farlo mi viene chiesto se salvare o meno le informazioni per eseguire il debug, io rispondo yes e clicco su debug, e a questo punto mi viene ancora chiesto se salvare le informazioni per il debug e via così . Insomma continuo a salvare delle informazioni per il debug e il debug non posso farlo .

    Qui sotto il codice incriminato :



    int main(int argc, char *argv[])
    {
    int **snakeArray;
    const int COLONNE=4; // il valore delle colonne rimane costante
    int a =0; //serve successivamente per il riempimento della matrice
    int righe = 4; //primo valore delle righe, che poi cambierà
    int nuoverighe=0;

    snakeArray=(int**)malloc(righe * sizeof(int*)); //prima allocazione con malloc, delle righe

    //per ogni riga alloca un array di colonne
    for(int i=0; i<righe; i++)
    snakeArray[i] = (int*)malloc(COLONNE * sizeof(int));

    //----------inizializzazione e stampa della prima matrice---------------
    cout<<"prima matrice"<<endl;
    for (int i=0;i<righe;i++){

    cout<<endl;

    for (int j=0;j<COLONNE;j++){
    if (j==0) snakeArray[i][j]=0;
    if (j==1) snakeArray[i][j]=0;
    if (j==2) snakeArray[i][j]=8;
    if (j==3) {snakeArray[i][j]=6-a; a++;}



    cout<<" " <<snakeArray[i][j]<<" ";

    }
    }

    cout<<endl;

    //-----------richiede la nuova dimensione delle righe della matrice---------

    cout<<endl<<"Inserisci nuovo numero di righe: "<<endl;
    cin>>nuoverighe;

    //******fin qui tutto ok, stampa correttamente e chiede il nuovo valore in input******


    //------------rialloca la matrice secondo le nuove righe--------------
    snakeArray=(int**)realloc(snakeArray, nuoverighe * sizeof(int*));

    for(int i=0; i<nuoverighe; i++)
    snakeArray[i] = (int*)realloc(snakeArray[i], COLONNE * sizeof(int)); //RIalloca le colonne

    //------------inizializza i nuovi elementi della matrice e la stampa a schermo------------
    cout<<"Secondo snake, riallocato: "<<endl;

    for (int i=righe+1;i<nuoverighe;i++)
    //parte dalla riga successiva all'ultima della prima
    // dichiarazione, perchè le altre sono già in memoria
    {

    cout<<endl;

    for (int j=0;j<COLONNE;j++){
    if (j==0) snakeArray[i][j]=0;
    if (j==1) snakeArray[i][j]=0;
    if (j==2) snakeArray[i][j]=8;
    if (j==3) {snakeArray[i][j]=6-a; a++;}

    cout<<" " <<snakeArray[i][j]<<" ";

    }
    }

    cout<<endl;

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    Ringrazio molto chiunque leggerà e/o mi darà consigli sul da farsi.

    Inoltre, piccola curiosità: ho assoluto bisogno di dichiarare una variabile int in una classe, ma inspiegabilmente non lo posso fare, nemmeno dichiarandola statica. Come posso risolvere? .

    Nuovamente grazie.
    "La fortuna aiuta gli audaci"
    (e non gli adagiati)

  2. #2

    Re: [Dev C++] Ri-allocare dinamicamente una matrice, codice non funzionante

    Originariamente inviato da Loue
    Il codice qui sotto compila correttamente
    falso:
    codice:
    main.cpp: In function 'int main(int, char**)':
    main.cpp:9: error: 'malloc' was not declared in this scope
    main.cpp:16: error: 'cout' was not declared in this scope
    main.cpp:16: error: 'endl' was not declared in this scope
    main.cpp:39: error: 'cin' was not declared in this scope
    main.cpp:45: error: 'realloc' was not declared in this scope
    main.cpp:73: error: 'system' was not declared in this scope
    main.cpp:74: error: 'EXIT_SUCCESS' was not declared in this scope

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 © 2024 vBulletin Solutions, Inc. All rights reserved.