PDA

View Full Version : [C] perchè questa benedetta funzione dà errori su errori?!?!


D4rkAng3l
26-05-2005, 18:45
Ciao,
oddioo l'esame si avvicina (è su carta, non deve girare eil proff guarda più che altro la logica che ci stà dietro)....questo era il primo esercizio di un vecchio esame...esercizio a sbarramento...ovvero se non si prendono 7 punti su 10 su questo puoi anche aver fatto gli altri esercizzi tutti perfetti ma sei tristemente bocciato...

Come logica ci dovrei essere...perchè ad occhio e croce è la stessa usata dal proff nella soluzione ma non mi gira e il compilatore dà vari errori...

Potete dirmi cosa ci sia di sbagliato e se come logica ci stà?


/* La funzione int Comp(LStr *L) riceve il puntatore al primo nodo della lista
ordinata in senso non decrescente rispetto al valore del campo val, la
modifica in modo tale che elementi consecutivi che hanno lo stesso valore
del campo val sono sostituiti da un elemento il cui valore del campo val è
lo stesso e il campo str è la stringa prodotta dalla concatenazione, nell'
ordine, delle strighe degli elementi sostituiti. La funzione ritorna il
numero massimo di elementi con lo stesso valore del campo val */

#include <stdio.h>
#include <stdlib.h>

typedef struct VStr{
long val;
char *str;
struct VStr *next;
}VStr, *LStr;

int Comp(LStr *L){

int max = 0; // Valore massimo da restituire al chiamante
int numvol = 0; // Numero di doppioni trovati per un determinato elemento
int nuovalunghezza; // Numero di caratteri della nuova stringa
int val; // Contiene il valore del campo val puntato da L

LStr prev; /* Contiene l'indirizzo del nodo che precede il nodo puntato
da L */

prev = NULL; // Inizialmente prev corrisponde a NULL perchè L punta 1° nodo

while(L!=NULL) // Scorre la lista fino alla fine

/* Se L non punta al primo nodo e il valore del campo val del nodo
precedente (messo in val) è uguale al valore del campo val del nodo
corrente */

if(prev != NULL && val == L->val){
/* Calcola la nuova lunghezza della nuova stringa */
nuovalunghezza = strlen(prev->str)+strlen(L->str);
/* Rialloca dinamicamente per inserire la nuova stringa */
prev->str = realloc((prev->str, (nuovalunghezza+1)*sizeof(char));
/* Concatena le 2 strinhe nel campo str puntato da prev */
strcat(prev->str, L->str);

/* Linka il nodo puntato da prev al nodo puntato da L (L sarà
eliminato) */
prev->next = L->next;

/* Libera la memoria del vettore il cui puntatore è nel campo str
puntato da L */
free(L->str);
/* Elimina il nodo L e libera la memoria */
free(L);

L = prev->next; // Aggiorna il valore di L al nodo successivo

numvol++; // Incrementa il numero di doppioni trovati
}

else{
if(numvol > max)
max = numvol;

numvol = 1;
val = L->val;
prev = L;
L = L->next;
}

if(numvol > max)
max = numvol;

return max;
}


Ancora infinitamente grazie

Ciao
Andrea

VegetaSSJ5
26-05-2005, 19:40
puoi specificare gli errori che ti dà il compilatore?

D4rkAng3l
27-05-2005, 09:47
Gli errori che mi dà sono questi:

g++.exe -x c++ -c C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c -o C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.o -Wall -fpermissive
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c: In function `int Comp(VStr **)':
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:36: request for member `val' in `*L', which is of non-aggregate type `VStr *'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:38: request for member `str' in `*L', which is of non-aggregate type `VStr *'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:40: warning: left-hand operand of comma expression has no effect
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:40: parse error before `;'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:42: request for member `str' in `*L', which is of non-aggregate type `VStr *'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:42: warning: implicit declaration of function `int strcat(...)'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:46: request for member `next' in `*L', which is of non-aggregate type `VStr *'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:50: request for member `str' in `*L', which is of non-aggregate type `VStr *'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:54: assignment to `VStr **' from `VStr *'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:64: request for member `val' in `*L', which is of non-aggregate type `VStr *'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:65: assignment to `VStr *' from `VStr **'
C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:66: request for member `next' in `*L', which is of non-aggregate type `VStr *'
Failure


Però mi sembra strano...come logica ci stà?

VegetaSSJ5
27-05-2005, 09:54
non ho tempo di fare prove cmq mi salta subito all'occhio il fatto che nella dichiarazione della funzione hai dichiarato il parametro LStr *L, ti ricordo che LStr è già stato dichiarato come ppuntatore di per se quindi è come se tu al parametro scrivessi VStr **L. prova a cambiare l'intestazione della funzione con Lstr L.
credo che tu abbia anche fatto anche un altro tipo di errore. metti le parentesi graffe anche al blocco a cui si riferisce il while...

e inoltre perchè compili con il g++?? se il programma è scritto in c devi compilare con il gcc.

D4rkAng3l
27-05-2005, 10:00
non ho tempo di fare prove cmq mi salta subito all'occhio il fatto che nella dichiarazione della funzione hai dichiarato il parametro LStr *L, ti ricordo che LStr è già stato dichiarato come ppuntatore di per se quindi è come se tu al parametro scrivessi VStr **L. prova a cambiare l'intestazione della funzione con Lstr L.
credo che tu abbia anche fatto anche un altro tipo di errore. metti le parentesi graffe anche al blocco a cui si riferisce il while...

e inoltre perchè compili con il g++?? se il programma è scritto in c devi compilare con il gcc.

ops che idiota....ma perchè mi fregano sempre gli errori di distrazione...mi ero dimenticato di averlo dichiarato come puntatore nel typedef...grazie...

cmq distrazione apparte...come logica ci stava?dici che come esame su carta sarebbe passato?

VegetaSSJ5
27-05-2005, 10:23
credo che tu abbia anche fatto anche un altro tipo di errore. metti le parentesi graffe anche al blocco a cui si riferisce il while...

e inoltre perchè compili con il g++?? se il programma è scritto in c devi compilare con il gcc.
hai letto questo?

cmq credo che come esame su carta sia più che sufficiente anche se LStr *L è un errore...

D4rkAng3l
27-05-2005, 12:35
si risolto..mannaggia alla mia maledettissima distrazione..cmq perchè nel typedef della struct si dichiara due tipi...uno normale e l'altro puntatore quando poi ne usa uno solo?!?!che senso ha?!?!

VegetaSSJ5
27-05-2005, 12:54
cmq perchè nel typedef della struct si dichiara due tipi...uno normale e l'altro puntatore quando poi ne usa uno solo?!?!che senso ha?!?!
ma scusa non hai scritto tu quella funzione? se l'hai scritta tu dovresti anche sapere perchè hai dichiarato due tipi nel typedef... :p
cmq io di solito ne uso uno solo e cioè il tipo "non puntatore" (tanto per farmi capire), questo perchè quando uso i puntatori voglio farlo esplicitamente per evitare errori, e poi perchè a me piace fare proprio così... ;)

D4rkAng3l
27-05-2005, 12:59
ma scusa non hai scritto tu quella funzione? se l'hai scritta tu dovresti anche sapere perchè hai dichiarato due tipi nel typedef... :p
cmq io di solito ne uso uno solo e cioè il tipo "non puntatore" (tanto per farmi capire), questo perchè quando uso i puntatori voglio farlo esplicitamente per evitare errori, e poi perchè a me piace fare proprio così... ;)

no la definizione della struct era data dal proff...è per questo che non mi spiego perchè le metta entrambe...
Anche io preferirei usare il tipo non puntatore...tanto basta aggiungerci un bel * davanti e credo sia più chiaro...però lui fà così...vuole che sia fatto così...che devo fà...mi adeguo alla sua volontà

VegetaSSJ5
27-05-2005, 13:13
no la definizione della struct era data dal proff...è per questo che non mi spiego perchè le metta entrambe...
Anche io preferirei usare il tipo non puntatore...tanto basta aggiungerci un bel * davanti e credo sia più chiaro...però lui fà così...vuole che sia fatto così...che devo fà...mi adeguo alla sua volontà
se lui vuole che sia fatto così allora fallo così altrimenti gli caschi sul c...o! :D