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

    [C] Allocare spazio per matrice di cui non conosco il numero di righe

    Come da titolo, se io devo dichiare una matrice e quindi allocarne lo spazio, come faccio se non conosco il numero di righe?

    Sono sempre stato convinto di poter fare

    codice:
    int righe=0;
    char matrix[righe+1][N];
    Però ho scoperto che così non funziona bene. Se conosco un numero massimo di righe che verranno utilizzate il problema non si pone, mi basta usare quel numero, ma se non ho la minima idea del numero max di righe come posso fare?
    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Devi usare la funzione realloc (opportunamente ...)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
        int m, n;
        char *v;
    } charv;
    
    int new_charv(charv *v, int n, int m) {
        v->m = m;
        v->n = n;
        v->v = (char *)malloc(sizeof(char)*n*m);
        return (v->v == NULL) ? 0 : 1;
    }
    
    int expand_charv(charv *v, int m) {
        char *tmp = (char *)realloc(v->v, sizeof(char)*v->n*m);
        if(tmp != NULL) {
            v->m = m;
            v->v = tmp;
            return 1;
        }
        return 0;
    }
    
    int insert_charv(charv *v, int m, int n, char c) {
        if(m >= v->m) {
            if(!expand_charv(v, m)) return 0;
        }
        v->v[m*(v->n)+n] = c;
    }
    
    char get_charv(charv *v, int m, int n) {
        return v->v[m*(v->n)+n];
    }
    
    void free_charv(charv *v) {
        free(v->v);
        v->v = NULL;
    }
    
    int main()
    {
       charv v;
       new_charv(&v, 2, 2);
       insert_charv(&v, 0, 0, 'a');
       insert_charv(&v, 2, 1, 'c');
       printf("%c%c", get_charv(&v, 0, 0), get_charv(&v, 2, 1));   
       free_charv(&v);
       return 0;
    }
    Questo è un esempio, ovviamente non ti è necessario usare quelle funzioni di accesso se sei sicuro di rispettare i limiti...

    Puoi ben notare che è modificabile solo il numero di righe e non quello di colonne, nel caso ti servisse modificare anche quello devi usare una struttura diversa: un array allocato dinamicamente di puntatori ad array allocati dinamicamente...
    Oppure questo stesso metodo usato sopra e un po' di memcpy al posto giusto...
    "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.