| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  24-11-2004, 18:37 | #1 | 
| Senior Member Iscritto dal: Jun 2002 Città: Dublin 
					Messaggi: 5989
				 | 
				
				[C] Conteggio degli elementi in un puntatore ad array
			 
		Avendo una array del tipo:
 Codice: char * miaarr = {'c', 'i', 'a', 'o'};Codice: int len = 0; while (*miaarr--); while (*miarr++) len++;  ). Dov'è il vero errore? 
				__________________ C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! | 
|   |   | 
|  24-11-2004, 18:52 | #2 | |
| Senior Member Iscritto dal: Aug 2001 Città: San Francisco, CA, USA 
					Messaggi: 13827
				 | 
				
				Re: [C] Conteggio degli elementi in un puntatore ad array
			 Quote: 
 Non puoi inizialare un array in quella maniera semplicemente perchè non ne hai allocato lo spazio  Hai solo allocato lo spazio per contenere l'indirizzo di memoria che conterrà il puntatore "miaarr" . Per funzionare quella cosa deve essere così : char *miaarr; (per inizialare 4 elementi) miaarr = calloc(4, sizeof(char)); Poi puoi dare ai singoli elementi dell' array i valori che vuoi . In definitiva lo spazio lo allochi tu , gli array hanno sempre una dimensione decisa da te , la loro dimensione non viene decisa automaticamente dal compilatore, quindi non serve contarne la dimensione , dato che dovresti già saperla tu . Il tuo metodo va in segmentation fault perchè usando il puntatore in quel modo cerchi di accedere ad un area di memoria protetta non allocata per l'applicazione che cerca di accederci. Ciao 
				__________________ GPU Compiler Engineer | |
|   |   | 
|  24-11-2004, 19:01 | #3 | 
| Senior Member Iscritto dal: Jun 2002 Città: Dublin 
					Messaggi: 5989
				 | 
		OK, grazie, ho capito fin qui. La domanda principale è però: se io la dichiaro come variabile globale in "main.c", ne alloco e riempio lo spazio in "main.c", lo libero e lo rialloco in "altro.c" con diversa grandezza (in poche parole se lo spazio in questione è soggetto a cambiamento), non c'è comunque un metodo per contarne gli elementi? 
				__________________ C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! | 
|   |   | 
|  24-11-2004, 19:07 | #4 | |
| Senior Member Iscritto dal: Aug 2001 Città: San Francisco, CA, USA 
					Messaggi: 13827
				 | Quote: 
 Il conteggio delle dimensioni degli array è comunque impossibile , perchè non c'è nessuna regola in C che vieti l'overflow degli array (e quindi non c'è modo che il programma venga a conoscenza che questo evento è successo), in pratica niente in C controlla che il tuo programma ha superato l'ultimo elemento dell' array e avvisa il programma di ciò , è unicamente compito del programmatore conoscere la dimensione degli array allocati nella memoria e gestirli a dovere , se non lo fa il risultato è quello che hai ottenuto poco fa , "Segmentation Fault"  Ciao 
				__________________ GPU Compiler Engineer | |
|   |   | 
|  24-11-2004, 19:20 | #5 | ||
| Senior Member Iscritto dal: Jun 2002 Città: Dublin 
					Messaggi: 5989
				 | Quote: 
  Ok, cambio metodo...  Quote: 
 Vabbe', grazie lo stesso. Ciao! 
				__________________ C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! | ||
|   |   | 
|  24-11-2004, 19:48 | #6 | ||
| Senior Member Iscritto dal: Aug 2001 Città: San Francisco, CA, USA 
					Messaggi: 13827
				 | Quote: 
  Quote: 
  ( mamma mia , che esempio idiota che ho fatto  ) , come può farlo anche con l'Assembly , non è un difetto del linguaggio, è solo che è messo a disposizione + controllo del programma al programmatore Ciao 
				__________________ GPU Compiler Engineer | ||
|   |   | 
|  24-11-2004, 20:29 | #7 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Per gli array statici si può fare: int c[] = {8,9,7,5}; printf("%d\n", sizeof(c)/sizeof(int)); | 
|   |   | 
|  24-11-2004, 21:26 | #8 | |
| Senior Member Iscritto dal: Aug 2001 Città: San Francisco, CA, USA 
					Messaggi: 13827
				 | Quote: 
 Si , è vero , questo si può fare su quelli statici , ma non su quelli dinamici come nell'e sempio, comunque in quanto proprio array "statici" di una dimensione prefissata inizialmente dal programmatore risulta ancora + inutile calcolarne la dimensione Ciao 
				__________________ GPU Compiler Engineer | |
|   |   | 
|  24-11-2004, 21:32 | #9 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Chiaro...
		 | 
|   |   | 
|  24-11-2004, 22:38 | #10 | 
| Senior Member Iscritto dal: Jun 2002 Città: Dublin 
					Messaggi: 5989
				 | 
		Ah, ora e' tutto chiaro, hai ragione.   Grazie mille, sei stato utilissimo! 
				__________________ C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! | 
|   |   | 
|  25-11-2004, 15:50 | #11 | |
| Moderatore Iscritto dal: Nov 2003 
					Messaggi: 16211
				 | Quote: 
 Attenzione: funziona solo con gli array, non con i puntatori! 
				__________________ Ubuntu è un'antica parola africana che significa "non so configurare Debian"  Chi scherza col fuoco si brucia. Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu | |
|   |   | 
|  25-11-2004, 23:07 | #12 | 
| Senior Member Iscritto dal: Jun 2002 Città: Dublin 
					Messaggi: 5989
				 | 
		Ok, ma come ho gia' detto, faro' in un altro modo. In effetti era un problema che non avevo mai incontrato, ma ora che sto provando a clonare "Il giudizio giudizioso" (trovate il download su Punto Informatico) in C con le GTK+ mi sono trovato a dover ottenere il numero di elementi in una array di char * e non volevo aggiornare il valore ad ogni aggiunta/rimozione, quindi cercavo un metodo per poterlo trovare dinamicamente durante l'esecuzione.
		 
				__________________ C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 17:41.









 
		 
		 
		 
		









 
  
 



 
                        
                        










