|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Un ripasso in "C"
scusate se vi chiedo cose banali ma èda un pò che non programmo
parlando di strutture ........ Codice:
struct nome_non_obbligatorio{
int età;
char nome[50];
} nome_struttura;
e se voglio allocare 50 strutture di quel tipo scrivo: Codice:
struct nome_struttura[50]; e se desidero allocare 'n' strutture dinamicamente ? qui ahimè on mi ricordo più nulla grazie 1000 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
per l'allocazione dinamica delle strutture, è una cosa che sinceramente non ho ancora mai studiato (considera però che il C lo studio proprio da poco) ma, volendo ragionare di 'fantasia' (anzi, di ignoranza...) mi viene da pensare che potresti farlo con i puntatori e con malloc.
Faccio un esempio, ma non so proprio se possa essere corretto: Codice:
typedef struct STRUTTURA *PSTRUTTURA; PSTRUTTURA variabile = (PSTRUTTURA)malloc(sizeof(struct STRUTTURA)); Piccolo edit per il codice da te postato: Codice:
struct nome_non_obbligatorio{
int età;
char nome[50];
} nome_struttura;
dove tu dici "nome_struttura", non è il nome (etichetta della struttura) ma l'istanza. Poi, se non erro una struttura deve necessariamente avere un'etichetta (quella che tu hai chiamato "nome_non_obbligatorio"). Quindi: struct etichetta { variabili....... } istanza ; e, sempre se ho capito bene le strutture, puoi evitare inizialmente di dichiarare un'istanza, ma non un'etichetta (il nome della struttura).
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
Ultima modifica di RaouL_BennetH : 08-02-2005 alle 14:27. |
|
|
|
|
|
#3 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Re: Un ripasso in "C"
Quote:
Se ti interessa che nome_struttura sia un altro nome per struct nome_non_obbligatorio, devi cominciare la definizione con la parola typedef. Quote:
Se vuoi allocare dinamicamente n oggetti di tipo nome_struttura, ordinati in un vettore, devi dichiarare un puntatore a puntatori a nome_struttura: Codice:
nome_struttura **ns; Codice:
ns = malloc(n*sizeof(nome_struttura*)); Codice:
for (i=0; i<n; i++)
ns[i] = malloc(sizeof nome_struttura);
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Re: Re: Un ripasso in "C"
Quote:
Codice:
struct {
int età;
char nome[50];
} agenda;
supponiamo di avere in un file i seguenti dati: 22 annalisa 35 patrizia 30 anna 40 aldo 45 giovanni 50 giacomo e di volerli memorizzare dinamicamente nella struttura sopra; ovviamente io, non conosco a priori il numero di strutture da allocare in memoria, quindi, si dovrà ricorrere alla malloc() ahimè, non mi ricordo nella maniera più assoluta come dichiarare un "array" di puntatori (**ptr???) che punteranno alle n-esime strutture |
|
|
|
|
|
|
#5 | |||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Re: Re: Re: Un ripasso in "C"
Quote:
Dovresti fare così: Codice:
typedef struct agenda {
int age;
char name[50];
} agenda;
Quote:
Oppure: ricavare il numero delle righe del file, e allocare dinamicamente un array di tanti puntatori ad agenda quante sono le righe del file. Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
non ho mai usato le liste, che vantaggio offrono ?
|
|
|
|
|
|
#7 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Svantaggi: fare una ricerca diventa più dispendioso in termini di tempo.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
grazie ziosilvio
una domanda sulla scanf() stavo facendo delle prove di input con la scanf e non mi è chiaro il suo comportamento; se passo a questa: Codice:
scanf("%c %d %d %d %s",&carattere, &a, &b, &c, &s);
Codice:
t 123 456 678 pippo se ora digito: Codice:
<spazio>t 123 456 678 pippo "4260124 4232996 4247784" ha senso tutto ciò ? ultima domanda se dalla scanf() scritta sopra desidero che il parametro '%s' stringa possa essere di lunghezza variabile a piacere dell'utente, come dichiaro la variabile 's' ? Ultima modifica di misterx : 11-02-2005 alle 10:11. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
allora la funzione scanf è la + pericolosa che c'è ... cmq la dimesione della stringa è definita con una lunghezza e sforare la lunghezza significa fare danni.
Il miglior modo per le stringhe è questo: Codice:
fgets (stdin, sString, iLung); ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
ma io devo per forza usare la scanf()
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
ah cmq in casi in cui non puoi sapere a priori il numero degli elementi si ricorre per forza ad allocazioni dinamiche.
Ti metto modificato per il tuo semplice caso: Codice:
#define N 50
typedef struct Info{
int iAge;
char cName[N];
}Data;
typedef struct EL{
Data Info;
struct EL *pNext;
} Node;
/* visualizza la lista */
void See_List (Node *pHead){
while (pHead != NULL){
/* visualizza tutti i campi che ti interessano */
printf ("%s\t%d",pHead->Info.cName, pHead->Info.iAge);
}
}
/* inserimento in testa */
void Insert_Element (Node **pHead, Data Value){
Node *pApp;
pApp = malloc (sizeof(Node));
pApp->Info = Value;
if (*pHead == NULL){
pApp->pNext = NULL;
*pHead = pApp;
}
else{
pApp->pNext = *pHead;
*pHead = pApp;
}
}
/* main */
int main (void){
Node *Head;
/* funtion */
return (0);
}
Se hai domande chiedi pure. ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
Quote:
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
è per un progetto ed è vivamente consigliato l'uso della scanf() per via della formattazione nelle specifiche del progetto mi si dice che l'input sarà sempre corretto, quindi, nessuna necessità di un controllo, ma, l'ulimo parametro della scanf() deve essere una stringa della quale non si conosce a priori la sua lunghezza potrei usare un: char *s; ma punterebbe a cosa ? |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
va be però la dimensione la devi per forza mettere dato che una stringa la devi mettere sotto un array oppure metterla dinamicamente non ne ho la + pallida idea e non so neanche se è possibile
![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#15 | |||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16213
|
Quote:
Nella tua chiamata, scanf si aspetta una stringa costituita da un carattere, tre numeri interi, e una stringa, separati l'uno dall'altro da uno o più caratteri di spaziatura. Comunque io userei questa sintassi: Codice:
scanf("%c%d%d%d%s",&carattere,&a,&b,&c,&s");
Quote:
Lo spazio è un carattere, quindi scanf scrive ' ' in &carattere. Dopodiché dovrebbe leggere uno spazio, invece si ritrova 't', quindi termina senza modificare gli altri valori. Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
io l'ho trovato un sistema per catturare l'input "ridontante" della scanf() |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
Quote:
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
quello che chiedevo in definitiva era questo: Codice:
#include <stdio.h>
#include <stdlib.h>
char *creaparola(int carattere, char terminatore);
int main()
{
char comando, *buf;
int a, b ,c;
int carattere;
printf("Digita una comando: ");
scanf("%c%d%d%d%c",&comando, &a, &b, &c, &carattere);
buf = creaparola(carattere,'\n');
printf("%c %d %d %d %s",comando, a, b, c, buf);
return 0;
}
/****************************************************************************/
char *creaparola(int carattere, char terminatore)
{
char *buf='\0';
int i = 0;
while((carattere = getchar()) != terminatore){
buf = (char *) realloc(buf, i+1);
buf[i++] = (char)carattere;
}
buf[i]='\0';
return buf;
}
|
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
ok ma ti appoggi sempre a una funzione esterna quindi è inutile prendere il carattere nello scanf.
Comunque il mio consiglio è quello di non mettere i prototipi ma di usare una gerarchia quale: le funzioni chiamate sono sempre sopra le funzioni chiamanti. Se diventa molto lungo il progetto sai almeno dove cercare e diventa + leggibile. ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
questa porzione di codice, riempie una lista dall'alto verso il basso nel senso che, l'ultimo elemento ad entrare è anche il primo ad uscire quindi, lista di tipo LIFO
Ma come diamine si fa a riempirla al contrario ? Ho provato a memorizzare un puntatore alla struttura chiamato "old" di modo che la struttura precedente riceva prima di una nuova allocazione l'indirizzo della nuova struttura; ma perchè diamine non funziona ? Codice:
struct punti {
int x1, y1;
char *nomepunto;
struct punti *next;
} ;
typedef struct punti punti ;
punti *testapnt = NULL, *tmppnt;
punti *old = NULL;
void punto(int x1 , int y1, char *nomepunto){
if(old != NULL)
tmppnt->next = old;
tmppnt= (punti *) malloc(sizeof(punti ));
tmppnt->x1 = x1;
tmppnt->y1 = y1;
tmppnt->nomepunto= nomepunto;
tmppnt->next = NULL; // casomai la lista finisce, eventualmente il NULL viene sovrascritto da "old"
old = tmppnt; // memorizzo indirizzo precedente
(if testapnt == NULL)
testapnt = tmppnt;
}
Ultima modifica di misterx : 13-02-2005 alle 12:19. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:19.



















