PDA

Visualizza la versione completa : [c] help struttura


Lucked
11-06-2004, 00:19
ciao! dov'è l'errore? ..Mi segnala "tipo incompatibile" :bubu: :ciauz:



#include <stdio.h>

int main()
{
struct agenda
{
char nome[15];
char cognome[15];
char cellulare[15];
char email[30];
int numero_ragazze[10];
} a1, a2, a3;

a1.numero_ragazze = 4;
a2 = a1;
printf("%d", a2.numero_ragazze);

getch();
return 0;
}

internet
11-06-2004, 00:23
Originariamente inviato da Lucked



struct agenda
{
char nome[15];
char cognome[15];
char cellulare[15];
char email[30];
int numero_ragazze;
} a1, a2, a3;


prova così

Lucked
11-06-2004, 00:28
si è vero...mi sono fatto confondere dal numero delle ragazze!
ora ho fatto un'altra prova!...
....
....
a1.nome = "Luca";
a2 = a1;
printf("%s", a2.nome);

qui perche non funxiona? :dhò:

internet
11-06-2004, 00:38
in C per fare questo, devi usare la funzione strcpy()



strcpy(a1.nome, "Luca");
a2 = a1;
printf("%s", a2.nome);

/dev/null
11-06-2004, 00:38
Originariamente inviato da Lucked
si è vero...mi sono fatto confondere dal numero delle ragazze!
ora ho fatto un'altra prova!...
....
....
a1.nome = "Luca";
a2 = a1;
printf("%s", a2.nome);

qui perche non funxiona? :dhò: Perchè nome è un'array, non un puntatore...
Prova così:
struct agenda
{
char *nome;
char cognome[15];
char cellulare[15];
char email[30];
int numero_ragazze;
} a1, a2, a3;
PS: Anche per nome, cognome, cellulare e email devi usare puntatori se vuoi usare lo stesso metodo.


PS2: Se il valore da inserire non è statico (ma dinamico, ad esempio è un valore inserito da input) devi usare necessariamente gli array, non puoi usare i puntatori, in questo caso puoi usare la funzione strcpy.


:ciauz:

Lucked
11-06-2004, 01:14
Siii..ho trovato la strada che mi piace!
dichiaro nella struct un puntatore nome e poi faccio:

a1.nome = "Luca";

ho delle domande però:

1)ma se poi faccio:
a1.nome = "Andrea";

"Luca" rimarrà da qualche parte nella memoria dell'heap o si cancella? :confused:
---------------------------------------------------------------
2)è più o meno conosciuto il motivo per cui se faccio:

char nome[15];
nome = "Luca";

è errore?

per sopravvivere a ciò mi pare si usi, come mi avete detto la funzione strcpy

/dev/null
11-06-2004, 01:36
Originariamente inviato da Lucked
Siii..ho trovato la strada che mi piace!
dichiaro nella struct un puntatore nome e poi faccio:

a1.nome = "Luca";

ho delle domande però:

1)ma se poi faccio:
a1.nome = "Andrea";

"Luca" rimarrà da qualche parte nella memoria dell'heap o si cancella? :confused:
Rimane in memoria in una parte della memoria chiamata (mi pare) tabella delle stringhe...
TUTTE le costanti rimangono in memoria... E se provi a modificarle cambierà il valore di tutti i puntatori che puntano alla stesa stringa.


2)è più o meno conosciuto il motivo per cui se faccio:

char nome[15];
nome = "Luca";

è errore?

per sopravvivere a ciò mi pare si usi, come mi avete detto la funzione strcpy Perchè cerchi di inserire un aray in un array, e ciò non va bene:
non va bene nemmeno fare:

int a[3], b[3] = { 1, 2, 3 };
a = b;

per lo stesso motivo: non puoi assegnare a un array il valore di un altro array.
Devi assegnarlo elemento per elemento, e la funzione strcpy fa proprio questo


:ciauz:

internet
11-06-2004, 01:43
Originariamente inviato da Lucked
Siii..ho trovato la strada che mi piace!
dichiaro nella struct un puntatore nome e poi faccio:

a1.nome = "Luca";

ho delle domande però:

1)ma se poi faccio:
a1.nome = "Andrea";

"Luca" rimarrà da qualche parte nella memoria dell'heap o si cancella? :confused:


"Luca" è una stringa costante che in teoria non potresti modificare, ma in realtà l'area di memoria che la contiene non è garantito che sia protetta (anche se sui x86 esiste un bit per proteggere alcune pagina dalla scrittura)

di solito su queste architetture è memorizzata nel DATA SEGMENT



char nome[15];
nome = "Luca";

è errore?


si, in C devi usare la strcpy se vuoi copiarlo in un array

in C++ puoi usare la classe string, che ti permette di fare questo


string nome = "Luca";
string cognome = "Rossi";

Loading