Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C] Matrice dinamica

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Una matrice altro non è che una lista di liste. In C questo si traduce in un puntatore a puntore ad int, la cui prima dimensione è rapprsentata da puntatori ad int. Una cosa del genere, assumendo N = 5.

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

    int main(int argc, char **argv){

    int i, j, n = 5, **matrix;

    if(!(matrix = (int **)malloc(n*sizeof(int *))))
    abort();

    for(i = 0; i < n; i++){
    *(matrix+i) = (int *)malloc(n*sizeof(int));
    for(j = 0; j < n; j++)
    *((*(matrix+i))+j) = rand()%100;
    }

    for(i = 0; i < n; i++){
    for(j = 0; j < n; j++)
    printf("%d\t", *((*(matrix+i))+j));
    printf("\n");
    }


    SE non sai a priori la dimensione di N, allora dovresti, nel caso, allocare una nuova matrice di dimensione N+1 e copiarvi dentro i dati, con una funzione ad hoc.

    Due alternative:

    1. Array fornito dalla libreria glib.
    2. Una linked list di linked lists (non devi piu preoccuparti di reallocare, ma perdi la possiblità di acceder agli elementi con [][], a meno che tu non ti crei una funzione ad hoc che lo faccia).
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da infinitejustice Visualizza il messaggio
    Una matrice altro non è che una lista di liste. In C questo si traduce in un puntatore a puntore ad int, la cui prima dimensione è rapprsentata da puntatori ad int. Una cosa del genere, assumendo N = 5.

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

    int main(int argc, char **argv){

    int i, j, n = 5, **matrix;

    if(!(matrix = (int **)malloc(n*sizeof(int *))))
    abort();

    for(i = 0; i < n; i++){
    *(matrix+i) = (int *)malloc(n*sizeof(int));
    for(j = 0; j < n; j++)
    *((*(matrix+i))+j) = rand()%100;
    }

    for(i = 0; i < n; i++){
    for(j = 0; j < n; j++)
    printf("%d\t", *((*(matrix+i))+j));
    printf("\n");
    }


    SE non sai a priori la dimensione di N, allora dovresti, nel caso, allocare una nuova matrice di dimensione N+1 e copiarvi dentro i dati, con una funzione ad hoc.

    Due alternative:

    1. Array fornito dalla libreria glib.
    2. Una linked list di linked lists (non devi piu preoccuparti di reallocare, ma perdi la possiblità di acceder agli elementi con [][], a meno che tu non ti crei una funzione ad hoc che lo faccia).
    *(matrix+i)
    *((*(matrix+i))+j)
    Perché non usare semplicemente le parentesi:
    matrix[i]
    matrix[i][j]

    Anche se non conosci N non serve copiare tutto (o almeno: se serve si arrangia la realloc):
    • realloc di matrix
    • realloc di matrix[j] con 0 <= j < length(matrix)
    • eventuale inizializzazione ultima riga e ultima colonna di matrix
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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