Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: Matrici dinamiche in C

  1. #1

    Matrici dinamiche in C

    Se chiedo di stamparmi la matrice con la classica notazione matrix[i][j] non ho nessun problema, ma questi sopravvengono quando uso i puntatori, con la notazione *(matrix+colonne*i+j).
    Ecco il listato problematico:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    int main(void){
        int **pos = NULL, righe, colonne;
        int i, j;
        printf("Inserisci il numero delle righe: ");
        scanf("%d", &righe);
        printf("Inserisci il numero delle colonne: ");
        scanf("%d", &colonne);
        pos = (int **)malloc(righe*sizeof(int*));
        for(i=0; i<righe; i++){
            pos[i]=(int *)malloc(colonne*sizeof(int));
        }
        for(i=0; i<righe; i++){
            for(j=0; j<colonne; j++){
                printf("%d", *(pos+colonne*i+j));
            }
            printf("\n");
        }
    }
    Ultima modifica di MItaly; 30-11-2015 a 02:46 Motivo: Tag CODE

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    L'indicizzazione con l'istruzione *(matrix+colonne*i+j) è possibile solo se gestisci la matrice come se fosse un array monodimensionale:

    codice:
    int *matrix;
    ...
    matrix = (int *) malloc(righe*colonne*sizeof(int));
    ...
    for (i=0; i<righe; i++) {
        for (j=0; j<colonne; j++) {
            printf("%d\n", *(matrix + colonne*i + j));
        }
    }
    tieni presente chiaramente che, se non inizializzi in qualche modo i valori della matrice, otterrai solo la stampa di valori sporchi.
    every day above ground is a good one

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    Se chiedo di stamparmi la matrice ...
    Forse volevi scrivere qualcosa del genere

    codice:
    int v=1;
    pos  = (int **)malloc(righe * sizeof(int *));
    for(i = 0; i < righe; i++)
    {
        pos[i] = (int *)malloc(colonne * sizeof(int));
               
        for(j = 0; j < colonne; j++)
    		*(*(pos+i)+j) = v++;
    }       
    
    
    for(i=0; i<righe; i++)
    {
    	for(j=0; j<colonne; j++)
    		printf("%d ", *(*(pos+i)+j));
    
    
    	printf("\n");
    }
    E' importante anche dare un valore agli elementi della matrice altrimenti vedrai "spazzatura".
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Grazie . Lavorando sempre con i puntatori se faccio, ad esempio:
    codice:
     for(i=0; i<righe; i++){
            for(j=1; j<colonne; j++){
                if(una certa condizione) *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
                else *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
            }
        }
    Mi dà l'errore: "error: lvalue required as increment operand" (analogo per l'altro)?
    Ultima modifica di MItaly; 30-11-2015 a 02:46

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa ma hai letto il codice che ti ho indicato? L'espressione che usi è sbagliata ... leggi quella corretta.

    P.S. Usa i tag CODE per il codice nel forum
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    Grazie . Lavorando sempre con i puntatori se faccio, ad esempio:

    for(i=0; i<righe; i++){
    for(j=1; j<colonne; j++){
    if(una certa condizione) *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
    else *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
    }
    }
    Mi dà l'errore: "error: lvalue required as increment operand" (analogo per l'altro)?
    codice:
    (*(matrix+colonne*i+(j-1)))++;
    lascio a te capire perché.

    Quote Originariamente inviata da oregon
    Scusa ma hai letto il codice che ti ho indicato? L'espressione che usi è sbagliata ... leggi quella corretta.
    diventa corretta se gestisce la matrice come un array monodimensionale, quindi usando un puntatore singolo. E' un modo alternativo (più con finalità didattiche che altro) di gestione delle matrici n-dimensionali.
    every day above ground is a good one

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    diventa corretta se
    Certo, d'accordo con te. Quello che intendo è che lui è partito da un doppio puntatore che punta ad un vettore di puntatori.

    Dato che vuole seguire questa strada, avevo suggerito il codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Perché però, se ad esempio riempio la matrice in questo modo:
    codice:
    for(i=0; i<righe; i++){
            for(j=1; j<colonne; j++){
                (*(matrix+colonne*i+j))=(*(matrix+colonne*i+(j-1)))++;
            }
        }
    E poi la stampo
    ...
    codice:
    for(i=0; i<righe; i++){
            for(j=0; j<colonne; j++){
                printf("%d ", (*(matrix+colonne*i+j)));
            }
            printf("\n");
        }
    mi stampa sul terminale:
    1 1 1 1 1 1 1 1 1 0
    1 1 1 1 1 1 1 1 1 0
    ?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    Perché però[
    Devi indicare quale codice hai usato per l'allocazione altrimenti si fa confusione tra i vari metodi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E soprattutto, ipotizzando che tu stia usando il metodo del puntatore singolo, che output ti attendi?
    every day above ground is a good one

Tag per questa discussione

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.