C++ array di puntatori a strutture.
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Pag 1 di 2 12 UltimoUltimo
Visualizzazione risultati da 1 a 15 di 26

Discussione: C++ array di puntatori a strutture.

Cambio titolo
  1. #1
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417

    C++ array di puntatori a strutture.

    Sto avendo alcuni problemi a fare quanto in oggetto.

    allora: questa è la struttura:
    Codice:
    struct prodotti {
    	char * nome;
    	int codice;
    	int qta;
    	int prezzo;
    	int tot;
    };
    Siccome il testo del problema dice chiaramente che non ci sono più di 100 prodotti invoglia ad utilizzare un array.

    Se facessi però un array di strutture occuperei troppo spazio. Inoltre mi incasinerei nel gestirla.
    Allora volgio realizzare un array di puntatori a struttura in modo da avere i puntatori anche nulli.

    Ma... come faccio??
    pensavo così:
    Codice:
    prodotti *magazzino[100];
    e una funzione che accetta come parametro questo?? Cosa devo mettere??

  2. #2
    FRAK! L'avatar di The Dix
    Registrato il
    09-05
    Località
    Roma
    Messaggi
    11.830
    beh se nn ti dice niente il compliatore... potrebbe essere giusta ma a quel punto tanto vale fare una lista no?

  3. #3
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417
    Citazione The Dix
    beh se nn ti dice niente il compliatore... potrebbe essere giusta ma a quel punto tanto vale fare una lista no?
    anch'io ci pensavo...

    Comunque il compilatore si arrabbia abbastanza!

  4. #4
    Headless Dove L'avatar di sydarex
    Registrato il
    07-04
    Messaggi
    7.847
    Se devi fare un array di puntatori, poi creare ogni volta la struttura e linkarla nell'array, tanto vale che usi un vector, una list, o l'insieme delle STL che si avvicina di più alle tue esigenze.


  5. #5
    Bannato L'avatar di Eclipse
    Registrato il
    02-04
    Località
    C++atania
    Messaggi
    5.604
    è la stessa cosa ma guarda che un array di strutture ti occupa quanto le strutture puntate dall'array di puntatori.
    Riguardo alla lista in questo caso è totalmente inutile, molto meglio un array come quello. Ti conviene semplicemente farti un array di 100 prodotti, tra l'altro è la cosa che occupa meno e quella più veloce

  6. #6
    SenzaPensieri L'avatar di Tozai
    Registrato il
    10-02
    Località
    Roma
    Messaggi
    2.014
    Tra l'altro l'array, essendo un allocazione di tipo statico, viene rilasciata all'uscita della routine e quindi non devi pensare tu al free ...

  7. #7
    Headless Dove L'avatar di sydarex
    Registrato il
    07-04
    Messaggi
    7.847
    Citazione Eclipse
    è la stessa cosa ma guarda che un array di strutture ti occupa quanto le strutture puntate dall'array di puntatori.
    Riguardo alla lista in questo caso è totalmente inutile, molto meglio un array come quello. Ti conviene semplicemente farti un array di 100 prodotti, tra l'altro è la cosa che occupa meno e quella più veloce
    Ma se ho ben capito, possono esserci al massimo 100, ma anche meno.
    Lui vuole evitare lo spreco di memoria, e imho un vector è la cosa migliore.


  8. #8
    SenzaPensieri L'avatar di Tozai
    Registrato il
    10-02
    Località
    Roma
    Messaggi
    2.014
    Puoi anche riallocare ogni volta memoria, ma ne vale la pena?
    Allochi cmq 100 puntatori, il guadagno in termini di memoria non credo ci sia ...
    o se c'è credo sia trascurabile.
    E poi scusa, in cosa ti incasinesresti nel gestire l'array? Basta un indice. Secondo me ti incasinerai con i puntatori
    Se poi alla fine devi utilizzare tutti e 100 i puntatori, usi più memoria che con l'array.

  9. #9
    Bannato L'avatar di Eclipse
    Registrato il
    02-04
    Località
    C++atania
    Messaggi
    5.604
    se al massimo arrivano a 100 può usare i puntatori, non che comunque cambi moltissimo.. però usare una lista per una roba simile proprio non lo capisco

  10. #10
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417
    Diciamo che l'indicazione è che non ci sono più di 100 prodotti proprio per dire di usare un array.

    In realtà gestirò al massimo una decina di prodotti.
    Per questo pensavo di utilizzare i puntatori. Vengono inizializzati a NULL in modo di sapere quando fermarmi (quando non ho più elementi).

  11. #11
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417
    Per rendere il tutto più chiaro vi faccio vedere il programma funzionante solo sul main. Se potreste darmi una mano a fare le 3 funzioni :
    inizializzazione
    lettura
    scrittura

    Codice:
    # include <stdio.h>
    # include <stdlib.h>
    
    struct prodotti {
    	char * nome;
    	int codice;
    	int qta;
    	int prezzo;
    	int tot;
    };
    
    
    char * strdup(char *);
    int strlen(char *);
    int strcmp(char*,char*); //0 se uguali, >0 se 1 >2, <0 se 1<2
    
    int main (int argc, char * argv[]) {
    
    	prodotti *magazzino[100];
    	int curr_posit=0;
    	FILE * fin, * fout;
    
    	
    	for (int i=0;i<100;i++) {	// Funzione di inizializzazione
    		magazzino[i]=0;			//
    	}							//
    
    	if (argc!=3) exit(1);		//Controllo sugli argomenti
    	
    					
    	char buf[100];				//Qui inizia la funzione di lettura
    	int num_buf;
    	
    	
    	fin=fopen(argv[1],"r");
    	if (fin==0) {
    		printf("\n\nFile non aperto. Il programma verra' terminato.\n"); 
    		exit(2);
    	}
    	while (!feof(fin)) {
    		prodotti *temp=(prodotti *) malloc(sizeof(prodotti));
    		fscanf(fin,"%s",buf);
    		temp->nome=strdup(buf);
    		fscanf(fin,"%i",&num_buf);
    		temp->codice=num_buf;
    		fscanf(fin,"%i",&num_buf);
    		temp->qta=num_buf;
    		fscanf(fin,"%i",&num_buf);
    		temp->prezzo=num_buf;
    		//temp caricato
    		//confronto se esiste gi&#224; per aggiornare i precedenti
    		int trovato=0;
    		for (int i=0;magazzino[i]!=0;i++) {
    			if (strcmp(magazzino[i]->nome,temp->nome)==0 && (magazzino[i]->codice==temp->codice)) {
    				magazzino[i]->qta+=temp->qta;
    				free (temp);
    				trovato=1;
    				break;
    			}
    		}
    		if (trovato!=1)	magazzino[curr_posit++]=temp; //Se non &#232; stato trovato aggiungo la struttura all'array.
    	}
    	fclose(fin);	
    	//Fine leggi!
    
    	// Inizio funzione di scrittura
    	fout=fopen(argv[2],"w");
    	if (fout==0) {
    			printf("\n\nFile non aperto. Il programma verra' terminato.\n");
    			exit(2);
    		}
    	
    	int j=0;
    	int totmerci=0;
    	for (j=0;j<curr_posit;j++) {
    		fprintf(fout,"%s ",magazzino[j]->nome);
    		fprintf(fout,"%i ",magazzino[j]->codice);
    		fprintf(fout,"%i ",magazzino[j]->qta);
    		fprintf(fout,"%i\n",magazzino[j]->prezzo);
    		totmerci+=magazzino[j]->qta*magazzino[j]->prezzo;
    	}
    	fprintf(fout,"Valore totale delle merci: %i",totmerci);
    	fclose(fout);
    	printf("Elaborazione completata");
    	// Fine funzione di scrittura
    
    	system("PAUSE");
    	return 0;
    		
    }
    
    int strlen(char *str) {
    	int i;
    	for (i=0;str[i]!='\0';i++)
    	{}
    	return i;
    }
    
    
    char * strdup(char *str) {
    
    	int i,lung=strlen(str);
    	char *temp=(char *)malloc(sizeof(char)*lung);
    	for (i=0;i<lung;i++) {
    		temp[i]=str[i];
    	}
    	temp[i]='\0';
    	return temp;
    }
    
    int strcmp(char *str1,char *str2) {
    	int i=0;
    	int l1=strlen(str1),l2=strlen(str2);
    	if (l1>l2) {
    		for (i=0;i<l2;i++) {
    			if (str1[i]<str2[i]) return -1;
    			else if (str1[i]>str2[i]) return 1;
    			else continue;
    		}
    		return 1;
    	}
    	else for (i=0;i<l1;i++) {
    			if (str1[i]<str2[i]) return -1;
    			else if (str1[i]>str2[i]) return 1;
    			else continue;
    		}
    	if (l1==l2) return 0;
    	else return -1;
    }

  12. #12
    Headless Dove L'avatar di sydarex
    Registrato il
    07-04
    Messaggi
    7.847
    Ma non usavi C++?


  13. #13
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417
    si, perch&#232;?

  14. #14
    ~ Over My Head ~ L'avatar di Finalfire
    Registrato il
    06-03
    Località
    Italy
    Messaggi
    5.011
    Perche' syd ha intravisto un bel po' di "stile C" anziche' C++

    E poi, C++ e' per le classi. C no.

  15. #15
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417
    Citazione Finalfire
    Perche' syd ha intravisto un bel po' di "stile C" anziche' C++

    E poi, C++ e' per le classi. C no.
    vabb&#232;, ma sempre c++ rimane.
    Solo orientato in modo strutturato.

Pag 1 di 2 12 UltimoUltimo

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •