Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C] Matrice dinamica

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104

    [C] Matrice dinamica

    Buongiorno a tutti,
    ho un problema con un progetto.
    Devo gestire una lista di invitati e le simpatie/antipatie tra essi.
    Ho deciso di usare una matrice in cui inserire l'intero che indica l'antipatia o la simpatia tra 2 invitati (rappresentati dagli indici)
    Quando creo la matrice non so ancora quanti elementi, quindi questa dovrebbe ridimensionarsi (aumentare) ad ogni inserimento di invitato.

    Come faccio?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se usi il C (non il C++) c'è la realloc per reallocare memoria ma per il suo uso devi impostare con chiarezza i tuoi dati ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    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

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    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 © 2024 vBulletin Solutions, Inc. All rights reserved.