Discussione:
Strutture e stringhe
(troppo vecchio per rispondere)
Luca
2016-06-06 14:57:11 UTC
Permalink
Ciao,
sto facendo amicizia con le strutture e i puntatori a queste.
Sotto un programmino di cui ho evidenziato gli errori che non riesco a
capire, specie i primi 2 (che poi sono lo stesso errore).
Grazie mille

#include <stdio.h>

#define MAXS 100
#define MAXA 200

typedef enum {
HOBBY, AUTO, CASA, SPORT
} Categoria;

typedef struct {
Categoria cat;
float prezzo;
char descr[MAXS];
} Annuncio;

typedef struct {
Annuncio ann[MAXA];
int numAnn;
} ArchivioAnn;

int main () {
ArchivioAnn arch;
ArchivioAnn *p;
Annuncio A;
p=&arch;
A.descr="Usato"; //ERRORE
p->ann[0].descr="nuovo"; //Errore
scanf("%s",A.descr); // OK
p->ann[0].cat=AUTO; //OK
scanf("%d",p->ann[0].cat); //warning, ma eseguito restituisce Errore di
Segmentazione
return 0;
}

*Output gcc*

prova1.c: In function ‘main’:
prova1.c:26:9: error: incompatible types when assigning to type
‘char[100]’ from type ‘char *’
A.descr="Usato"; //ERRORE
^
prova1.c:27:17: error: incompatible types when assigning to type
‘char[100]’ from type ‘char *’
p->ann[0].descr="nuovo"; //Errore
^
prova1.c:30:2: warning: format ‘%d’ expects argument of type ‘int *’,
but argument 2 has type ‘unsigned int’ [-Wformat=]
scanf("%d",p->ann[0].cat); //warning, ma eseguito restituisce Errore
di Segmentazione
^

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Jack
2016-06-06 15:30:42 UTC
Permalink
Post by Luca
Ciao,
sto facendo amicizia con le strutture e i puntatori a queste.
Sotto un programmino di cui ho evidenziato gli errori che non riesco a
capire, specie i primi 2 (che poi sono lo stesso errore).
Grazie mille
#include <stdio.h>
#define MAXS 100
#define MAXA 200
typedef enum {
HOBBY, AUTO, CASA, SPORT
} Categoria;
typedef struct {
Categoria cat;
float prezzo;
char descr[MAXS];
} Annuncio;
typedef struct {
Annuncio ann[MAXA];
int numAnn;
} ArchivioAnn;
int main () {
ArchivioAnn arch;
ArchivioAnn *p;
Annuncio A;
p=&arch;
A.descr="Usato"; //ERRORE
p->ann[0].descr="nuovo"; //Errore
scanf("%s",A.descr); // OK
p->ann[0].cat=AUTO; //OK
scanf("%d",p->ann[0].cat); //warning, ma eseguito restituisce Errore di
Segmentazione
return 0;
}
*Output gcc*
prova1.c:26:9: error: incompatible types when assigning to type
‘char[100]’ from type ‘char *’
A.descr="Usato"; //ERRORE
^
te lo dice che errore e', stati tentando di assegnare ad array di caratteri un puntatore a carattere.
Post by Luca
prova1.c:27:17: error: incompatible types when assigning to type
‘char[100]’ from type ‘char *’
p->ann[0].descr="nuovo"; //Errore
^
stesso problema.

Le soluzioni sono due,
O definisci descr come puntatore:

char* descr;
e allora puoi asseganre le stringhe come stai tentando di fare.
Ma occhio che a questo punto descr punta ad un literal, cioe' ad una costante, che NON puoi modificare.

oppure lasci cosi com'e' la definizione, ma devi usare le funzioni strcpy(), strncpy(), strcat(), strncat() ecc. per gestire le stringhe.
Post by Luca
prova1.c:30:2: warning: format ‘%d’ expects argument of type ‘int *’,
but argument 2 has type ‘unsigned int’ [-Wformat=]
scanf("%d",p->ann[0].cat); //warning, ma eseguito restituisce Errore
di Segmentazione
^
vai a leggere come funziona scanf(), gli argomenti dopo il "" devono essere puntatori, la prima scanf() che usi non ti da' errore per caso.

Ciao Jack
Giacomo Degli Esposti
2016-06-06 15:36:17 UTC
Permalink
Post by Luca
Ciao,
sto facendo amicizia con le strutture e i puntatori a queste.
Sotto un programmino di cui ho evidenziato gli errori che non riesco a
capire, specie i primi 2 (che poi sono lo stesso errore).
[...]
Post by Luca
*Output gcc*
prova1.c:26:9: error: incompatible types when assigning to type
‘char[100]’ from type ‘char *’
A.descr="Usato"; //ERRORE
^
In C non puoi assegnare direttamente ad un array, devi usare
la funzione strcpy()

strcpy( A.descr, "Usato" );
Post by Luca
prova1.c:30:2: warning: format ‘%d’ expects argument of type ‘int *’,
but argument 2 has type ‘unsigned int’ [-Wformat=]
scanf("%d",p->ann[0].cat); //warning, ma eseguito restituisce Errore
di Segmentazione
^
Leggi attentamente il warning: ti dice proprio quale errore stai
commettendo: lui si aspetta un puntatore a intero mentre tu
gli passi un intero. Per ragioni storiche il C e' poco schizzinoso
e genera un warning ma quello che accade a run time e' che il
valore intero viene interpretato come un indirizzo di memoria
(il puntatore) e quindi punta a zone di memoria casuali che
poi ti danno il segmentation error.
Per risolvere, passagli &(p->ann[0].cat)

ciao
Giacomo
Luca
2016-06-06 16:19:16 UTC
Permalink
Post by Giacomo Degli Esposti
Post by Luca
prova1.c:30:2: warning: format ‘%d’ expects argument of type ‘int *’,
Post by Luca
but argument 2 has type ‘unsigned int’ [-Wformat=]
scanf("%d",p->ann[0].cat); //warning, ma eseguito restituisce Errore
di Segmentazione
^
Leggi attentamente il warning: ti dice proprio quale errore stai
commettendo: lui si aspetta un puntatore a intero mentre tu
gli passi un intero. Per ragioni storiche il C e' poco schizzinoso
e genera un warning ma quello che accade a run time e' che il
valore intero viene interpretato come un indirizzo di memoria
(il puntatore) e quindi punta a zone di memoria casuali che
poi ti danno il segmentation error.
Per risolvere, passagli &(p->ann[0].cat)
grazie ad entrambi, l'errore sulla stringa l'ho capito.

Capito anche che a scanf 8per l' enum) devo passare un puntatore al tipo
che si aspetta (int in questo caso), però non so come risolvere.
Applicando la soluzione suggerita &(p->ann[0].cat) mi restituisce sempre
errore perchè in effetti la scanf si aspetta un puntatore a int, mentre
io le sto passando un puntatore a enum, gcc mi dice "argument 2 has type
'enum Categoria *'"

Forse la scanf non è idonea ad acquisire un enum da tastiera?
Grazie ciao

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Luca
2016-06-06 16:23:51 UTC
Permalink
Post by Luca
Forse la scanf non è idonea ad acquisire un enum da tastiera?
risolto sostituendo il formato %d con %u nella scanf. Mi sembra una
questione di schizzinosità o sbaglio?
Anche perchè se metto %d mi da Errore di segmentazione se eseguo il
programma.
Ciao

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Andrea Rimicci
2016-06-07 15:37:09 UTC
Permalink
Post by Luca
Forse la scanf non è idonea ad acquisire un enum da tastiera?
Attenzione: in tastiera devi mettere il NUMERO assegnato al tuo enum,
non la stringa che lo rappresenta.

Tra l'altro, vedo che non li hai assegnati in dichiarazione.

Se fosse:

typedef enum {
HOBBY=0, AUTO=1, CASA=2, SPORT=3
} Categoria;


E in tastiera scrivi 3 (che sarebbe SPORT), dovrebbe funzionare.
--
andrea - ri mi cci, name
Andrea Rimicci
2016-06-07 15:30:34 UTC
Permalink
Post by Luca
io le sto passando un puntatore a enum, gcc mi dice "argument 2 has type
'enum Categoria *'"
E' solo un pochetto schizzinoso, dagli in pasto (int*)&(p->ann[0].cat)
e dovrebbe calmarsi. Non c'e' bisogno di mettere "%u", anzi e' errato,
perche' gli enum sono interpretati come int (salvo casi particolari ma
non e' il tuo).
--
andrea - ri mi cci, name
Luca
2016-06-07 19:16:10 UTC
Permalink
Post by Andrea Rimicci
E' solo un pochetto schizzinoso, dagli in pasto (int*)&(p->ann[0].cat)
e dovrebbe calmarsi.
grazie!!! questo è sicuramente concettualmente corretto

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
a***@gmail.com
2016-09-18 10:35:58 UTC
Permalink
On Monday, 6 June 2016 16:36:17 UTC+1, Giacomo Degli Esposti wrote:

[...]
Post by Giacomo Degli Esposti
In C non puoi assegnare direttamente ad un array, devi usare
la funzione strcpy()
Non e` del tutto esatto. Puoi farlo solo se stai assegnando:

char a[] = "pippo";
enoquick
2016-09-19 03:11:00 UTC
Permalink
Post by a***@gmail.com
[...]
Post by Giacomo Degli Esposti
In C non puoi assegnare direttamente ad un array, devi usare
la funzione strcpy()
char a[] = "pippo";
Quello non e' un assegnamento ma una dichiarazione con inizializzazione
a***@gmail.com
2016-09-19 08:33:49 UTC
Permalink
On Monday, 19 September 2016 04:11:01 UTC+1, enoquick wrote:

[...]
Post by enoquick
Post by a***@gmail.com
char a[] = "pippo";
Quello non e' un assegnamento ma una dichiarazione con inizializzazione
Puntualizzazione stupida. Una inizializzazione *assegna* quel valore ad un'area di memoria. Il punto vero e` che in un'inizializzazione con un literal, il nome dell'array NON decade a puntatore al primo elemento.
enoquick
2016-09-19 23:07:35 UTC
Permalink
Post by a***@gmail.com
[...]
Post by enoquick
Post by a***@gmail.com
char a[] = "pippo";
Quello non e' un assegnamento ma una dichiarazione con inizializzazione
Puntualizzazione stupida. Una inizializzazione *assegna* quel valore ad un'area di memoria. Il punto vero e` che in un'inizializzazione con un literal, il nome dell'array NON decade a puntatore al primo elemento.
Arrampicata sugli specchi
Vedila come vuoi,ma ti consiglio di studiare (il C)
Ed in C (e C++) non si puo assegnare un array primitivo per copia
Al massimo si possono copiare i puntatori vedendo l'array come puntatore
al primo elemento ma non e' la stessa cosa.

int a; // dichiarazione (il valore e' indefinito)
int a=5; // dichiarazione con inizializzazione;
a=5; // assegnamento


riprova con gli array
4ndre4
2016-09-20 07:17:11 UTC
Permalink
Io non ho bisogno di arrampicarmi sugli specchi, e tantomeno con un idiota come te, enoquick. Io sto parlando di inizializzazione di un array con un literal stringa, operazione del tutto lecita in C. Nell'inizializzazione con un literal stringa, il nome dell'array non decade in puntatore al suo primo elemento. Sei tu che devi ripassarti il C.
enoquick
2016-09-20 23:06:30 UTC
Permalink
Post by 4ndre4
Io non ho bisogno di arrampicarmi sugli specchi, e tantomeno con un idiota come te, enoquick. Io sto parlando di inizializzazione di un array con un literal stringa, operazione del tutto lecita in C. Nell'inizializzazione con un literal stringa, il nome dell'array non decade in puntatore al suo primo elemento. Sei tu che devi ripassarti il C.
Sei tu,bene
Avrei dovuto capirlo prima
Post by 4ndre4
il testo qui sotto lo hai scritto tu
Non e` del tutto esatto. Puoi farlo solo se stai assegnando:

char a[] = "pippo";
Post by 4ndre4
fine
Ti sembra una assegnazione ?

Dopo questa (per i soliti insulti,non per l'errore tuo commesso) puoi
andare nel killfile anche qui
4ndre4
2016-09-21 07:14:29 UTC
Permalink
Imbecille, io non ho commesso nessun errore. Io sto proprio parlando di un'inizializzazione, come spiegato più e più volte. Il tuo kill file ficcatelo al culo.
4ndre4
2016-09-20 17:30:37 UTC
Permalink
On 20/09/2016 00:07, enoquick wrote:

[...]
LOL :) Tu che consigli di studiare il C e` veramente il colmo, visto le
figuracce che hai appena fatto altrove. Io non ho bisogno di
arrampicarmi sugli specchi, e tantomeno con un idiota come te, enoquick.
Io sto parlando di inizializzazione di un array con un literal stringa,
operazione del tutto lecita in C. Nell'inizializzazione con un literal
stringa, il nome dell'array non decade in puntatore al suo primo
elemento. Sei tu che devi studiarti il C. Il codice che ho scritto nel
mio messaggio precedente e` chiaro.
--
4ndre4
Loading...