View Full Version : [C]malloc e allocazione di record
manu@2986
06-06-2006, 15:37
Ciao a tutti...
ho questa struttura:
typedef char Stringa[MAX_NAME_LEN];
typedef struct Studente {
Stringa nome, cognome;
int matricola;
Stringa corso_di_laurea;
}Studente;
devo allocare un record usando la malloc...ma...booo non funziona!
ho provato a fare così io:
Studente el;
el = (Studente *)malloc(sizeof(struct Studente));
ma nulla da errore(Undefined structure 'Studente').... :mc: :mc:
qualche suggerimento su come fare??! grazie
ciao
beppegrillo
06-06-2006, 15:42
Ciao a tutti...
ho questa struttura:
typedef char Stringa[MAX_NAME_LEN];
typedef struct Studente {
Stringa nome, cognome;
int matricola;
Stringa corso_di_laurea;
}Studente;
devo allocare un record usando la malloc...ma...booo non funziona!
ho provato a fare così io:
Studente el;
el = (Studente *)malloc(sizeof(struct Studente));
ma nulla da errore(Undefined structure 'Studente').... :mc: :mc:
qualche suggerimento su come fare??! grazie
ciao
struct Studente {
Stringa nome, cognome;
int matricola;
Stringa corso_di_laurea;
};
typedef Studente
Spero di non sbagliarmi con la sintassi, ma non puoi dichiarare un typedef di una struttura che non esiste ancora.
manu@2986
06-06-2006, 15:54
il fatto è che quella struttura è stata scritta dal professore nella descrizione dell'esercizio...e io l'ho copiata così!!!doooo :muro:
comunque non credo sia quello l'errore...non funziona lo stesso..
trallallero
06-06-2006, 15:59
Ciao a tutti...
ho questa struttura:
typedef char Stringa[MAX_NAME_LEN];
typedef struct Studente {
Stringa nome, cognome;
int matricola;
Stringa corso_di_laurea;
}Studente;
devo allocare un record usando la malloc...ma...booo non funziona!
ho provato a fare così io:
Studente el;
el = (Studente *)malloc(sizeof(struct Studente));
ma nulla da errore(Undefined structure 'Studente').... :mc: :mc:
qualche suggerimento su come fare??! grazie
ciao
typedef struct
{
...
...
} Studente;
cosi' definisci la struct Studente, poi dichiarare un pointer:
Studente *pS;
adesso puoi allocare:
pS = (Studente *) malloc(sizeof(struct Studente))
sizeof(struct Studente) ??? ne allochi solo una ?
ciao
trallallero
06-06-2006, 16:01
il fatto è che quella struttura è stata scritta dal professore nella descrizione dell'esercizio...e io l'ho copiata così!!!doooo :muro:
comunque non credo sia quello l'errore...non funziona lo stesso..
consiglio: cerca "Tricky C" su google e scaricalo, e' un ottimo manuale del C, in italiano ;)
manu@2986
06-06-2006, 16:01
si ne alloco solo una...perchè poi questo record verrà assegnato a un campo di una tabella indicizzata tramite codice hash...ecc ecc ecc :)
blindwrite
06-06-2006, 16:02
typedef struct studente{
char cognome_nome[N];
char matricola[N];
char corso_di_laurea[N];
struct studente*next;
}Studente;
si puo fare la typedef mentre si dichiara la struttura
nel main
Studente *el;
el = (studente*)malloc(sizeof(studente));
blindwrite
06-06-2006, 16:03
corso di de Martin?
tutti con gli stessi problemi..
manu@2986
06-06-2006, 16:05
niente non funziona...mi da sempre errore sulla struct Studente....
blindwrite
06-06-2006, 16:10
ecco un esempio su come dichiarare e manipolare una lista di dati:
#include <stdlib.h>
#include <stdio.h>
typedef struct nodo {
int info;
struct nodo *next;
}nodo;
//inserimento in testa
nodo *leggi_lista(void) {
int a;
nodo *p, *primo=NULL;
primo = NULL;
scanf("%d", &a);
while (a != -1) {
p = (nodo*)malloc(sizeof(nodo));
p->info = a;
p->next = primo;
primo = p;
scanf("%d", &a);
}
return(primo);
}
void stampa_lista(nodo *primo) {
while (primo != NULL) {
printf("%d -> ", primo->info);
primo = primo->next;
}
printf("NULL\n");
return;
}
//orinamento crescente
nodo *bubble_sort(nodo *primo) {
struct nodo *p, *ultimo;
int flag, appo;
ultimo = NULL;
flag = 1;
while (flag == 1) {
p = primo;
flag = 0;
while (p->next != ultimo) {
if (p->info > (p->next)->info) {
appo = p->info;
p->info = (p->next)->info;
(p->next)->info = appo;
flag = 1;
}
p = p->next;
}
ultimo = p;
}
return(primo);
}
int main(void) {
nodo *primo;
printf("Inserisci gli elementi (-1 per terminare): ");
primo = leggi_lista();
primo = bubble_sort(primo);
stampa_lista(primo);
system("PAUSE");
return(1);
}
manu@2986
06-06-2006, 16:13
uu...usando borland 5.02 mi dava sempre errore...invece usando dev c++ no!bah misteri...
trallallero
07-06-2006, 07:35
uu...usando borland 5.02 mi dava sempre errore...invece usando dev c++ no!bah misteri...
non mi toccare il broland eh :O :)
perche non posti tutto il sorgente ?
manu@2986
08-06-2006, 11:18
ma non mi spiego neanche io sta cosa...ho compilato con dev c++ e mi trova errori diversi...correggo quelli e in borland funziona... :confused:
comunque ora è tutto ok...anche io ritengo migliore borland...sarà perchè l'ho sempre usato ma mi trovo veramente meglio...
trallallero
08-06-2006, 12:11
ma non mi spiego neanche io sta cosa...ho compilato con dev c++ e mi trova errori diversi...correggo quelli e in borland funziona... :confused:
comunque ora è tutto ok...anche io ritengo migliore borland...sarà perchè l'ho sempre usato ma mi trovo veramente meglio...
c'e' poco da stupirsi:
qui dove lavoro abbiamo vari tipi di servers:
Sun 2 vers diverse, Linux 2 vers diverse e ognuno ha il suo compilatore con la sua versione.
Il comp di Linux ultima versione, per esempio, e' severissimo, ti controlla anche i commenti :muro:
Prendi un main cosi:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char *s;
char ss[strlen(s)];
return 0;
}
un Sun dice
Error: integral constant expression expected
un altro Sun dice
Error: The function strlen must have a prototype.
Error: An integer constant expression is required within the array subscript operator.
per i 2 Linux tutto ok. :mbe: su altre cose e' pignolissimo :confused:
in questo caso mi fido + del secondo Sun perche' piu' pignolo.
Un compilatore che ti da errore non e' un rompiballe ma ti avverte che qualcosa non va.
Ci fosse l'opzione per fargli creare l'eseguibile lo stesso, nonostante gli errori,
non e' che poi il prog. funzionerebbe ... ;)
corso di de Martin?
tutti con gli stessi problemi..
inteso che non si tratta di universita di torino? cioe, al corso di c di informatica di unito (altro insegnante), hanno appena dato il medesimo esercizio...e vai che i prof riciclano? :) lol
manu@2986
08-06-2006, 12:37
Un compilatore che ti da errore non e' un rompiballe ma ti avverte che qualcosa non va.
Ci fosse l'opzione per fargli creare l'eseguibile lo stesso, nonostante gli errori,
non e' che poi il prog. funzionerebbe ... ;)
beh ovvio... :) ;)
solo che mi ha stupito che il borland mi segnalasse errori incomprensibili, mentre l'altro mi ha segnalato errori completamente diversi(cavolate)....
trallallero
08-06-2006, 14:46
beh ovvio... :) ;)
solo che mi ha stupito che il borland mi segnalasse errori incomprensibili, mentre l'altro mi ha segnalato errori completamente diversi(cavolate)....
dai posta gli errori, plz :fagiano:
manu@2986
08-06-2006, 15:32
inteso che non si tratta di universita di torino? cioe, al corso di c di informatica di unito (altro insegnante), hanno appena dato il medesimo esercizio...e vai che i prof riciclano? :) lol
anche io faccio informatica a torino..
manu@2986
08-06-2006, 15:33
dai posta gli errori, plz :fagiano:
ehmmm non mi ricordo + quali erano....ma eran talmente stupidi che me li son dimenticati..non son di quegli errori che te li attacchi e te li ricordi x sempre..
blindwrite
08-06-2006, 15:58
inteso che non si tratta di universita di torino? cioe, al corso di c di informatica di unito (altro insegnante), hanno appena dato il medesimo esercizio...e vai che i prof riciclano? :) lol
credo che i prof facciano fare sempre le stesse cose :mc:
comunque io sono al polito.
a no perche avevo sentito prof de martin che non conosco....quindi riassumendo io e manu siamo a informatica con un prof e tu sei con de martin al poli sempre di torino....ehehe in ogni caso qualcuno avra linkato all altro la traccia dell esercizio perche se sostieni che sono uguali è l unica spiegazione...
blindwrite
08-06-2006, 19:19
già che ci sono qualcuno puo dare uno sguardo a questo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct poli{
int coefficiente;
int grado;
struct poli *next;
}polinomio;
void leggi_p (polinomio* testa)
{
polinomio *nuovo,*tmp;
nuovo=testa;
printf("inserisci polinomio\n");
while(nuovo->next!=NULL){
nuovo=nuovo->next;
}
nuovo=(polinomio*) malloc (sizeof(polinomio));
scanf("%d %d", &nuovo->coefficiente, &nuovo->grado);
nuovo->next=NULL;
}
void stampa_p(polinomio *testa)
{
polinomio *p;
p=testa;
for(p->next;p->next!=NULL;p=p->next){
printf("%dx^%d ", p->coefficiente, p->grado);
}
}
int main ()
{
int i;
polinomio *testa;
testa=(polinomio*)malloc (sizeof(polinomio));
testa->next=NULL;
for(i=0;i<2;i++){
leggi_p(testa);
}
stampa_p(testa);
system("PAUSE");
}
per il mometo dovrebbe farmi inserire due polinomi e stamparli.. ma c'è un casino con i puntatori...
con questa modifica invece stampa l'elemento dummy in testa e il primo..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct poli{
int coefficiente;
int grado;
struct poli *next;
}polinomio;
void leggi_p (polinomio* testa)
{
polinomio *nuovo,*tmp;
nuovo=testa;
printf("inserisci polinomio\n");
while(nuovo->next!=NULL){
nuovo=nuovo->next;
}
tmp=(polinomio*) malloc (sizeof(polinomio));
scanf("%d %d", &tmp->coefficiente, &tmp->grado);
tmp->next=NULL;
nuovo->next=tmp;
}
void stampa_p(polinomio *testa)
{
polinomio *p;
p=testa;
for(p->next;p->next!=NULL;p=p->next){
printf("%dx^%d ", p->coefficiente, p->grado);
}
}
int main ()
{
int i;
polinomio *testa;
testa=(polinomio*)malloc (sizeof(polinomio));
testa->next=NULL;
for(i=0;i<2;i++){
leggi_p(testa);
}
stampa_p(testa);
system("PAUSE");
}
blindwrite
08-06-2006, 19:29
ho risolto così anche se è molto sgraziato:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct poli{
int coefficiente;
int grado;
struct poli *next;
}polinomio;
void leggi_p (polinomio* testa)
{
polinomio *nuovo,*tmp;
nuovo=testa;
printf("inserisci polinomio\n");
while(nuovo->next!=NULL){
nuovo=nuovo->next;
}
nuovo->next=(polinomio*) malloc (sizeof(polinomio));
scanf("%d %d", &nuovo->next->coefficiente, &nuovo->next->grado);
nuovo->next->next=NULL;
}
void stampa_p(polinomio *testa)
{
polinomio *p;
p=testa->next;
for(p->next;p!=NULL;p=p->next){
printf("%dx^%d ", p->coefficiente, p->grado);
}
}
int main ()
{
int i;
polinomio *testa;
testa=(polinomio*)malloc (sizeof(polinomio));
testa->next=NULL;
for(i=0;i<2;i++){
leggi_p(testa);
}
stampa_p(testa);
system("PAUSE");
}
se qualcuno trova qualcosa di più fine mi faccia un fischio grazie
trallallero
09-06-2006, 07:29
ho risolto così anche se è molto sgraziato:
...
se qualcuno trova qualcosa di più fine mi faccia un fischio grazie
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct poli
{
int coefficiente,
grado;
struct poli *next;
} polinomio;
void leggi_p (polinomio* testa)
{
polinomio *nuovo,
*tmp ;
nuovo = testa;
printf("inserisci polinomio\n");
while(nuovo->next != NULL)
nuovo = nuovo->next;
nuovo->next = (polinomio*) malloc (sizeof(polinomio));
scanf("%d %d", &nuovo->next->coefficiente,
&nuovo->next->grado);
nuovo->next->next = NULL;
}
void stampa_p(polinomio *testa)
{
polinomio *p;
p = testa->next;
for( p->next; p != NULL; p = p->next )
printf("%dx^%d \n", p->coefficiente, p->grado);
}
int main ()
{
int i;
polinomio *testa;
testa = (polinomio*)malloc(sizeof(polinomio));
testa->next = NULL;
for( i = 0; i < 2; i++ )
leggi_p(testa);
stampa_p(testa);
/*system("PAUSE"); PAUSE ??? */
}
beh ... vedi che gia' indentandolo un pochino, diventa un peletto piu' graziato ;)
scherzi a parte, piu' che alla "grazia" dovresti pensare a deallocare cio' che hai allocato ;)
'ndo sta la free() :confused:
Fraggerman
09-06-2006, 13:08
Ciao a tutti...
ho questa struttura:
typedef char Stringa[MAX_NAME_LEN];
typedef struct Studente {
Stringa nome, cognome;
int matricola;
Stringa corso_di_laurea;
}Studente;
devo allocare un record usando la malloc...ma...booo non funziona!
ho provato a fare così io:
Studente el;
el = (Studente *)malloc(sizeof(struct Studente));
ma nulla da errore(Undefined structure 'Studente').... :mc: :mc:
qualche suggerimento su come fare??! grazie
ciao
allora l'ho provato on devc++ e da un errore perchè devi dichiarare el come puntatore... quindi "Studente *el"... altrimenti la malloc nn funziona perchè ritorna un puntatore.
per il resto è ok
ciao
blindwrite
09-06-2006, 15:14
no riesco a capire perche questo codice funziona:
#include <stdio.h>
#include <stdlib.h>
typedef struct dato{
char info[12];
struct dato *next;
} dato;
int main ()
{
dato *testa,*p;
int i;
testa=(dato*)malloc(sizeof(dato));
p=testa;
for(i=0;i<3;i++){
printf("inserisci info\n");
p->next=(dato*)malloc(sizeof(dato));
scanf("%s" ,p->next->info);
p=p->next;
p->next=NULL;
}
p=testa->next;
for(p->next;p!=NULL;p=p->next){
printf("%s ",p->info);
}
system("PAUSE");
}
e quest'altro no:
#include <stdio.h>
#include <stdlib.h>
typedef struct dato{
char info[12];
struct dato *next;
} dato;
int main ()
{
dato *testa,*p;
int i;
testa=(dato*)malloc(sizeof(dato));
p=testa->next;
for(i=0;i<3;i++){
printf("inserisci info\n");
p=(dato*)malloc(sizeof(dato));
scanf("%s" ,p->info);
p=p->next;
p->next=NULL;
}
p=testa->next;
for(p->next;p!=NULL;p=p->next){
printf("%s ",p->info);
}
system("PAUSE");
}
la logica sembra essere la stessa ma non funziona!
trallallero
09-06-2006, 15:38
ehm ... mi sa che hai fatto un copy/paste errato ;)
i 2 sorgenti sono identici :D
blindwrite
09-06-2006, 16:51
il problema è che no ho sbagliato a scrivere .... il secondo è diverso
estratto primo
testa=(dato*)malloc(sizeof(dato));
p=testa;
estratto secondo
testa=(dato*)malloc(sizeof(dato));
p=testa->next;
poi nel primo
printf("inserisci info\n");
p->next=(dato*)malloc(sizeof(dato));
scanf("%s" ,p->next->info);
p=p->next;
p->next=NULL;
e nel secondo
printf("inserisci info\n");
p=(dato*)malloc(sizeof(dato));
scanf("%s" ,p->info);
p=p->next;
p->next=NULL;
secondo me dovrebbero fare la stessa cosa ma il secondo non và
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.