Newsgroup: it.comp.lang.c
Titolo: Aiuto agli esperti del C

Ciao a tutti, devo correggere il mio esame universitario di programmazione
avanzata in C e in un punto il compilatore del Turbo C++ mi da il seguente
errore:
Lvalue required
Cos'è????
Vi metto anche la funzione dove mi si presenta l'errore:
int inserisci(GRAPH *p,char *cod)
{
   p[corrente.nome=(char *)malloc(strlen((cod)+1)*sizeof(char)); qui mi da
l'errore!!!!!!
   if(p[corrente].nome==NULL)
     return(-1);
   strcpy(p[corrente].nome=cod);
   corrente++; 
   return(1);
}
in pratica mi da errore alla prima linea della funzione. Ricordo che
corrente è una variabile globale...questa funzione dovrebbe solo copiare
la stringa cod nel campo nome della struttura,eppure non capisco cosa non
vada...
Se qualcuno mi può dare una mano...Grazie a tutti,ciao!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 l'errore!!!!!!
non sono esperto di c ma non credo che p[corrente.nome= significhi
qualcosa.. perlomeno dovresti chiudere la parentesi!
comunque AFAIK lvalue è ciò che sta a sinistra di un assignment (l=left) e
rvalue a destra (r=right)
per esempio:
foovar = foovalue;
 ^^^      ^^^^
lvalue = rvalue
ps nota che ho scritto AFAIK: potrebbe essere una cazzata..
-- 
[Filippo...........................]
[Linux User #342745................]
        ==[...penguin powered...]==

 ps nota che ho scritto AFAIK: potrebbe essere una cazzata..
sì scusate, la riga di codice corretta è
p[corrente].nome=(char *)malloc(strlen((cod)+1)*sizeof(char));
avevo intuito che Lvalue stava per Left value, ma non riesco a capire
perchè mi dia errore...d'altra parte sto allocando la memoria, non vedo
altro modo di allocarla...boh! 


    strcpy(p[corrente].nome=cod);
                            ^ [ = al posto di , ]
anche questo è un errore di battitura? (copiancollare il codice no eh?)
ps.. non so se è espressamente dettato dallo standard ma non si dovrebbe
usare return 0 se la funzione ha successo?


 usare return 0 se la funzione ha successo?
no
-- 
sbi

 usare return 0 se la funzione ha successo?
Mi spiace contraddirti ma la funzione di libreria strcpy() ha un prototipo
del tipo:
char *strcpy(char *destinazione, char *source);
il carattere = proprio non ha nulla a che fare con questa
funzione...!Comunque...
Per quanto riguarda il return sě, mi pare che zero voglia dire successo,
ma nulla mi vieta di usare altri numeri...
Cmq fa lo stesso, ti ringrazio lo stesso per le risposte, devo riuscire a
risolverlo perchč altrimenti non riesco nemmeno a vedere se gira
correttamente...


   strcpy(p[corrente].nome=cod);
^^^^^^^^^^^^^^^^^^^^^^
questa non l'ho capita forse
strcpy(p[corrente].nome,cod);

Flavio ha scritto:





Nemmeno spostando il +1 come mi hai detto tu funziona...è la stessa
cosa...sto impazzendo...


 vada... 
magari dico fesserie, ma al posto della riga critica puoi usare la 
funzione strdup (che chiama malloc automaticamente).
poi, se divessi copiare la stringa cod a tutti i costi con malloc, mi 
pare che dovresti scrivere:
p[corrente].nome=(char *)malloc((strlen(cod)+1)*sizeof(char));
ciao.

    strcpy(p[corrente].nome=cod);
qui presumo che tu volessi mettere una virgola al posto del
segno di =.
ciao,
e.

    strcpy(p[corrente].nome=cod);
                           ^^^
 
tu tenti di dare un assignment come argomento a una funzione?
sei tu che usi il carattere = al posto della virgola mica io ti sei riposto
da solo..


cosa...sto impazzendo...
Allora il tuo problema non č la malloc ma il p[corrente].name
che poi mi accorgo ora che p č un puntatore quindi in linea di massima
dovrebbe essere p->name;
Cmq posta un pň di codice in piů.

Cmq posta un pò di codice in più.
Ehm ... p è un semplice puntatore o un vero e proprio array del quale
quel p è il primo elemento?

 Se qualcuno mi può dare una mano...Grazie a tutti,ciao!
Ti sono stati inviati molti post, rispondi se hai risolto il problema o no :)
Ciao
M

vi metto tutto quello che ho 
fatto.in
 pratica devo memorizzare i dati in
una lista di adiacenza per un grafo.Un file di dati per esempio è fatto
così:
6
p4 1 p6
p2 2 p6 p5
p1 3 p3 p5 p4
p3 0
p6 0
p5 0
La prima riga è il numero dei vertici esistenti.Le altre righe sono il
nome del vertice (primo campo), il numero degli archi che escono dal
suddetto vertice (secondo campo) e i relativi link (terzo campo).
Per ora ho fatto così:
FILE1.c
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "lib.h"
void main()
{ char src[20];
  GRAPH *p;
  printf("Inserire il nome del file: ");
  scanf("%s", src);
  p=readgraph(src);
  if(p==NULL)
   printf("\nErrore apertura file!");
}
---------------------------------------
FILE2.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "lib.h"
int numporte;
int corrente=0;
GRAPH *readgraph(char *src){
GRAPH *p;
FILE *pfile;
char nome[10];
char vicino[10];
int coll;
int i;
int indice,indice2;
if((pfile=fopen(src,"r"))==NULL){
  return(NULL);
 }
 fscanf(pfile,"%d\n",&numporte);
 if((p=(GRAPH *)malloc(numporte*sizeof(GRAPH)))==NULL)
  return(NULL);
  while(fscanf(pfile,"%s %d",nome,&coll)!=EOF){
   indice=inserisci(p,nome);
   if(indice<0)
     return(NULL);
   i=0;
   while(i<coll)
    fscanf(pfile,"%s",vicino);
    }
   fclose(pfile);
   if((pfile=fopen(src,"r"))==NULL){
    return(NULL);
    }
   fscanf(pfile,"%d\n",&numporte);
   while(fscanf(pfile,"%s %d",nome,&coll)!=EOF){
    i=0;
    if((p[indice].listad=(int *)malloc(coll*sizeof(int)))==NULL)
       return(NULL);
    while(i<coll){
      fscanf(pfile,"%s",vicino);
      indice=get_index(p,nome);
      indice2=get_index(p,vicino);
      p[indice].listad[i]=indice2;
      i++;
	 }
    }
   fclose(pfile);
   return(p);
}
int inserisci(GRAPH *p, char *cod){
 p[corrente].nome=(char *) malloc(strlen((cod)+1)*sizeof(char));
  if(p[corrente].nome==NULL)
   return(-1);
 strcpy(p[corrente].nome,cod);
 corrente++;
 return(1);
}
int get_index(GRAPH *p, char *name){
  int i;
  for(i=0;i<numporte;i++){
   if((strcmp(p[i].nome,name))==0)
    return(i);
  }
  return(-1);
}
------------------------
LIB.h
struct graph{
   int numero;
   char nome[10];
   int *listad;
};
typedef struct graph GRAPH;
GRAPH *readgraph(char *src);
int get_index(GRAPH *p, char *name);
int inserisci(GRAPH *p, char *cod);
Solo che quell'errore non mi fa più continuare e non posso nemmeno vedere
se il tutto mi funziona o meno (ovviamente...)


 char nome[10];
Qui, invece, scopriamo che è un array di char.
Gli array non sono puntatori, e non sono lvalue.
Max

 p[corrente].nome=(char *) malloc(strlen((cod)+1)*sizeof(char));
1) p[corrente].nome
non e' un puntatore ma un array di 10 char. Ridefiniscilo nella struct
come
char *nome;
2) strlen((cod)+1)
il +1 deve stare fuori dall'argomento di strlen()
(strlen(cod)+1)
3) sizeof(char) e' 1, sempre. Puoi ometterlo tranquillamente
4) il cast non serve in c
p[corrente].nome=malloc(strlen(cod)+1);
-- 
-=[]=---iAN CooG/HokutoForce+TWT---=[]=-

 p[corrente].nome=malloc(strlen(cod)+1);
avete ragione,ho sbagliato nel file lib.h per nome, non mi ero accorto che
non l'avevo messa a puntatore...però anche modificandolo produce lo stesso
errore...ci sto rinunciando ragazzi,è due giorni che ci sono sopra! 


errore...ci sto rinunciando ragazzi,è due giorni che ci sono sopra! 
Mi sono ricopiato il codice, modificando:
struct graph{
   int numero;
   char nome[10]; 
   int *listad;
};
in
struct graph{
   int numero;
   char *nome;
   int *listad;
};
e 
 p[corrente].nome=(char *) malloc(strlen((cod)+1)*sizeof(char)); //
vedi nota
con
 p[corrente].nome = (char*) malloc(strlen(cod)+1);
compila come un treno.
Nota personale.
Cerca di evitare di incasinarti mettendo espressioni come quelle con
100 parentesti. Meglio procedere per gradi e rendere il codice
leggibile visto che basta dimenticarnte una e si diventa matti a
trovare l'errore poi.

 compila come un treno.

Ho provato anche con queste correzioni ma il mio TurboC++ versione 3.0 mi
continua a dare sempre lo stesso errore.Vi ringrazio tutti, molto gentili
e disponibili...mi sa che ci rinuncio...
ma può essere la versione del mio compilatore il problema??perchè se fosse
così provo a installare ad esempio il Borland per windows,magari non mi da
errore...


 errore...
Confermo che con le correzioni il codice da te postato compila. Ma ora mi
chiedo.. visto che sono 4 funzioni in 50 linee di codice, perché non
riscrivi tutto da capo linea per linea compilando ogni volta ? Prima o poi
l'errore viene fuori no ?
Parti da una compilazione minimale fino ad arrivare a quella completa.
Oppure, divertiti con i commenti (comincia col commentare tutti i corpi
delle funzioni per poi tirare fuori dai commenti linea dopo linea tutto).
E' molto banale tuttavia, anziché "ci sto rinunciando ragazzi,è due
giorni che ci sono sopra!", in 20 minuti al massimo risolvi, o quanto meno
individui l'errore preciso. 
PS: gli errori in compilazione non sono poi così misteriosi, e
fare operazioni come queste potrebbe essere una valida alternativa anche
al postare sul ng
Cia`
M.