Allocare un vettore dinamicamente all'interno di una funzione.

di il
11 risposte

Allocare un vettore dinamicamente all'interno di una funzione.

Come da titolo volevo essere chiarito un dubbio se possibile :partendo dal fatto che mi riferisco al linguaggio C++ ,è possibile utilizzare una funzione per allocare dinamicamente qualcosa tramite valori che essa calcola? Esempio: devo creare delle C string (con array di char, non posso utilizzare la classe string) con dei numeri letti da un file (considerati quindi come char, non come int,ma posso anche leggerli come int e successivamente convertirli). Come posso fare per allocare dinamicamente in stringhe C questi numeri? In tutti i casi (credo) il risultato sarebbe un array 2D di char, in cui la prima dimensione è il numero di numeri presenti sul file mentre la seconda dimensione il numero di cifre (+1, per il carattere di terminazione).
La prima dimensione la potrei determinare tramite una prima lettura del file tramite una variabile che funge da buffer e che mi incrementa un contatore ogni successivo prelievo, e questo credo sia corretto, ma per quanto riguarda la seconda dimensione come posso procedere? Avevo pensato di determinare di quante cifre fosse composto ogni numero dividendo per 10 finchè il risultato non è 0, in questo modo effettivamente avrei il numero n di cifre da cui è composto... poi potrei usare n come seconda dimensione dell'array. Ma nella pratica questo come andrebbe scritto? E' un ragionamento corretto o mi sto complicando la vita inutilmente ed è possibile percorrere strade piu semplici? Grazie in anticipo per un eventuale risposta.

11 Risposte

  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    Per la dimensione della stringa puoi fornire tu una dimensione massima, per es. se lavori con valori interi a 32 bit il valore massimo rappresentabile sarà 4294967295 quindi in questo caso ti bastano 11 caratteri...
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    candaluar ha scritto:


    Per la dimensione della stringa puoi fornire tu una dimensione massima, per es. se lavori con valori interi a 32 bit il valore massimo rappresentabile sarà 4294967295 quindi in questo caso ti bastano 11 caratteri...
    vorrei farlo dinamicamente, in modo da non occupare piu spazio di quanto necessario... il mio professore ci tiene a queste cose...
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    Allora leggi in una stringa temporanea di 80 caratteri, ci "stampi" sopra il valore con sprintf, ne determini strlen e poi ci aggiungi 1 per il terminatore così hai la dimensione, allochi e copi dalla stringa temporanea in questa nuova stringa.
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    candaluar ha scritto:


    Allora leggi in una stringa temporanea di 80 caratteri, ci "stampi" sopra il valore con sprintf, ne determini strlen e poi ci aggiungi 1 per il terminatore così hai la dimensione, allochi e copi dalla stringa temporanea in questa nuova stringa.
    avevo pensato una cosa simile, il problema principale per me è: come faccio a fare in modo che faccia questo PER OGNI NUMERO presente nel file? non riesco ad impostare la funzione..
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    Intanto comincia con il leggere tutti i valori numerici e a stamparli a video. Questo è il primo passo.
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    candaluar ha scritto:


    Intanto comincia con il leggere tutti i valori numerici e a stamparli a video. Questo è il primo passo.
    si su questo sono d'accordo e ci sono riuscito, il mio problema ora è appunto quello che ti ho descritto... non è una cosa che posso fare manualmente poichè non so a priori quanti numeri ci sono nel file ne tantomeno da quante cifre sono composti..
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    Ora devi fare un primo ciclo sul file per determinare il quantitativo di valori, per poi allocare un array di puntatori char *
    Dopo fai un altro ciclo sul file e per ciascun valori fai la sequenza che abbiamo visto prima
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    candaluar ha scritto:


    Ora devi fare un primo ciclo sul file per determinare il quantitativo di valori, per poi allocare un array di puntatori char *
    Dopo fai un altro ciclo sul file e per ciascun valori fai la sequenza che abbiamo visto prima
    Ho scoperto che l'esercizio voleva che prima prendessi i numeri come interi, una volta fatto questo dovevo convertirli in char e procedere come stiamo facendo... però ho provato questo
    void trasforma_numeri(char** numerichar,int& quantitanumeri,int numeri[])/* numeri[] è il vettore in cui ci sono tutti i numeri prelevati da file, quantitanumeri è il numero di elementi da cui e composto, numerichar è un puntatore a puntatore con cui ho allocato un vettore a puntatori della stessa dimensione di quello che contiene i numeri.*/
    {
    	char prova[11];
    	for(int i=0;i<quantitanumeri;i++)
    	{
    		itoa(numeri[i],prova,10);
    		numerichar[i]= new char[strlen(prova)+1];
    		numerichar[i]=prova;
    	}
    	
    	
    }
    
    però quando provo a fare un cout delle stringhe che cosi ottengo mi restituisce tutti caratteri strani cosa ho sbagliato?
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    numerichar[i]=prova;
    Qui devi usare una cara e vecchia strcpy()
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    candaluar ha scritto:


    numerichar[i]=prova;
    Qui devi usare una cara e vecchia strcpy()
    oddio è vero, che errore stupido ... per il resto per quanto riguarda l'allocazione dinamica di ogni "numero" l'ho eseguita correttamente?
  • Re: Allocare un vettore dinamicamente all'interno di una funzione.

    l'allocazione dinamica di ogni "numero" l'ho eseguita correttamente?
    Se dovessi farlo io la variabile 'prova' la rinominerei in 'temp' e le assegnerei più spazio del necessario (considera magari che si lavori a 64 bit...); comunque, anche a 32bit 11 caratteri non sono sufficienti, considera anche il caso che ci sia il segno, esempio -2000000000
Devi accedere o registrarti per scrivere nel forum
11 risposte