View Full Version : [C]problema in compilazione
DaRk\S0ul
03-03-2009, 16:49
sono alle prime armi e da manuale devo provare a fare un programma di nome detab che tolga i caratteri \t e li sostituisca con uno spazio bianco per ogni tab.
ho provato in questo modo ma mi da parecchi errori che non riesco a risolvere.
#include <stdio.h>
#define limite =30
char detab (char stringa[], int limite);
main ()
{ int i, c;
char stringa[limite];
stringa = detab(stringa,limite);
printf("%s", stringa);
return 0;
}
char detab (char stringa[], int limite)
{ int i, c;
for (i=0; i != '\t' && (c=getchar())!= EOF;++i)
{stringa[i]=c;}
if ((c=getchar()=='\t')
{
for (i;i=='\t';++i)
stringa[i]=' ';
}
return stringa;
}
come errori mi riporta sempre gli stessi anche nell'esercizio che in un post di poco piu giù ho scritto e sono:
cambiatabulazioni.h:11: error: syntax error before ‘=’ token
cambiatabulazioni.h: In function ‘main’:
cambiatabulazioni.h:14: error: syntax error before ‘=’ token
cambiatabulazioni.h:15: error: ‘stringa’ undeclared (first use in this function)
cambiatabulazioni.h:15: error: (Each undeclared identifier is reported only once
cambiatabulazioni.h:15: error: for each function it appears in.)
cambiatabulazioni.h:15: error: syntax error before ‘=’ token
cambiatabulazioni.h: At top level:
cambiatabulazioni.h:23: error: syntax error before ‘=’ token
cambiatabulazioni.h: In function ‘detab’:
cambiatabulazioni.h:26: error: ‘stringa’ undeclared (first use in this function)
cambiatabulazioni.h:29: error: syntax error before ‘{’ token
cambiatabulazioni.h:30: error: syntax error before ‘)’ token
FixFixFix
03-03-2009, 16:59
non ci va l'uguale nella define, e non mettere tutto nel .h...
DaRk\S0ul
03-03-2009, 17:03
nel senso di fari vari file e poi includerli?
ok ma questo non è il problema vero?
FixFixFix
03-03-2009, 17:20
metti almeno il main in un .c
così non se può proprio vedere...non so manco se si può...
DaRk\S0ul
03-03-2009, 17:47
tieni presente che sto seguendo il libro e il libro imposta il linguaggio in questa maniera, sono al primo capitolo, quindi non può essere quello il problema.
agente mm8
03-03-2009, 17:56
Ci sono parecchi errori.
Allora, come ha detto fix non ci vuole l'uguale nel #define.
Non c'è bisogno di mettere il metodo in un header, in fondo è solo un metodo oltre il main, quindi puoi tenere tutto in un unico file programma.c
Inoltre non è char detab(...), perché così restituisce un carattere, quindi è char* detab(...), così che restituisca un puntatore char, praticamente un array di caratteri, cioè una stringa.
E poi, scusa, non è meglio dichiarare void la funzione detab, ricevere un puntatore stringa (e non un array), e così non dover ritornare nulla?
DaRk\S0ul
03-03-2009, 20:18
ok infatti ero parecchio indeciso su quel char detab però io i puntatori ancora non li ho fatti,infatti sono al primo capitolo.
se dichiarassi void e non mi restituisse niente come farei a stampare la nuova struinga senza '\t'?
grazie per le risposte comunque.
agente mm8
04-03-2009, 14:14
dichiarandolo void, modificheresti la stringa, senza bisogno di ritornare nulla.
Il codice verrebbe dunque:
int main ()
{ int i, c;
char stringa[limite];
detab(stringa,limite);
printf("%s", stringa);
return 0;
}
P.S.: Il metodo main deve ritornare un int, infatti hai inserito return 0.
federico100mt
04-03-2009, 14:30
Si daccordo, intanto fai compilare il codice senza le cose complesse.:)
DaRk\S0ul
04-03-2009, 17:16
ok perfetto ho apportato le modifiche che mi hai consigliato ed in effetti va molto meglio cosi
comunque int non è necessario al main forse lo è solo nel c++.
per il resto ho risolto altri piccoli errori ma me ne mancano due uguali
syntax error before numeric constant
uno sulla dichiarazione della funzione void e l'altro quando la implemento cioè
void detab (char stringa[], int limite)
agente mm8
04-03-2009, 18:56
Puoi postare il tuo codice attuale?
Comunque, per la funzione void, sicuro di aver tolto il return?
DaRk\S0ul
04-03-2009, 19:23
sisi il return è tolto
comunque ecco il codice
#include <stdio.h>
#define limite 30
void detab (char stringa[], limite);
main ()
{ int i, c;
char stringa[limite];
detab(stringa,limite);
printf("%s", stringa);
return 0;
}
void detab (char stringa[], limite)
{ char stringa[limite];
int i, c;
for (i=0; i != '\t' && (c=getchar())!= EOF;++i)
{stringa[i]=c;}
if ((c=getchar())=='\t')
for (i;i=='\t';++i)
stringa[i]=' ';
}
ad entrambi i void riporta quell'errore.
agente mm8
05-03-2009, 12:37
devi fare:
void detab(string[limite]){...}
l'errore te lo da perché cerchi di avere due variabili con lo stesso nome: stringa[] che viene data in pasto a detab come argomento, e stringa[] che definisci nello stesso detab.
DaRk\S0ul
05-03-2009, 15:32
no scusami non ho capito
dove devo mettere il codice che dici tu?
se lo metto quando vado ad implementare il detab mi da errore di sintassi prima di [
ti dispiace ricopiarmi il programma con le modifiche?
agente mm8
05-03-2009, 17:59
Hai ragione, ho sbagliato io.
Praticamente al posto di
void detab(char stringa[], int limite)
devi inserire
void detab(char stringa[limite])
ecco tutto.
wingman87
05-03-2009, 18:38
@DaRk\S0ul
Prova a descrivere a parole l'algoritmo che vorresti implementare, tradurlo in codice poi non sarà difficile. Finora quali argomenti hai visto? Per sapere cosa puoi e cosa non puoi fare
DaRk\S0ul
05-03-2009, 20:45
Hai ragione, ho sbagliato io.
Praticamente al posto di
void detab(char stringa[], int limite)
devi inserire
void detab(char stringa[limite])
ecco tutto.
sembrerò scemo ma continua a non andare ora ti riposto il codice ho provato a mettere quel codice che mi hai dato tu ad entrambi i void ma mi da sempre problemi
#include <stdio.h>
#define limite 30
void detab(char stringa[limite]);
main ()
{ int i, c;
char stringa[limite];
detab(stringa,limite);
printf("%s", stringa);
return 0;
}
void detab (char stringa[],int limite)
{ char stringa[limite];
int i, c;
for (i=0; i != '\t' && (c=getchar())!= EOF;++i)
{stringa[i]=c;}
if ((c=getchar())=='\t')
for (i;i=='\t';++i)
stringa[i]=' ';
}
@DaRk\S0ul
Prova a descrivere a parole l'algoritmo che vorresti implementare, tradurlo in codice poi non sarà difficile. Finora quali argomenti hai visto? Per sapere cosa puoi e cosa non puoi fare
grazie per il consiglio ma ti posso dire che io gia faccio cosi infatti ho continuato facendo altri esercizi (con uno dei quali ho lo stesso problema)
e i relativi codici mi sono usciti facilmente, il mio problema per ora è evidentemente il main ()
wingman87
05-03-2009, 21:19
grazie per il consiglio ma ti posso dire che io gia faccio cosi infatti ho continuato facendo altri esercizi (con uno dei quali ho lo stesso problema)
e i relativi codici mi sono usciti facilmente, il mio problema per ora è evidentemente il main ()
Ti ho dato quel consiglio perché al di là dell'errore di compilazione ce n'è sicuramente uno (anzi di più) di natura algoritmica. Per vedere meglio gli errori ti consiglio di indentare in questo modo:
if/for/while/...(...)
{
...codice...
}
oppure
if/for/while/...(...){
...codice...
}
e non
if/for/while/...(...)
{...codice...}
e poi rileggere meglio il codice confrontandolo con la descrizione discorsiva dell'algoritmo
DaRk\S0ul
05-03-2009, 22:47
ok allora grazie dei consigli domani mi rivedo la funzione.
vorrei solo chiarire prima i problemi del main e capirli per bene poi mi dovrò solo sbattere un pò sull'algoritmo.
buona notte.
Intanto non comprendo perché dichiari nel main la seguente stringa se poi non utilizzi queste variabili.
int i, c;
Poi il prototipo della funzione, cioè quello che hai messo in alto, deve essere uguale a quello della dichiarazione, cioè quello che hai messo alla fine.
I parametri delle funzioni non si confondono con la dichiarazione di variabili, possono anche avere nomi uguali, così come tu hai fatto, ma per una maggiore capibilità conviene utilizzare dei nomi magari simili ma comunque diversi. Tieni conto che il tuo codice dovranno poi rileggerlo altri sviliuppatori ed in questo stato nessuno capisce nulla :D
Tornando all'ultimo codice scritto: il main si che è totalmente sbagliato, soprattutto nella chiamata di funzione. NOn noti che non c'è corrispondenza tra i parametri impostati nella fuznione e ciò che tu gli stai passando nel main?!
Poi volevo dirti. Ma questo non è sicuramente esercizio da inizio linguaggio. Il primo capitolo sarà una specie di scheda riassuntiva del C. Le funzioni le farai quasi alla fine. Che libro è?
DaRk\S0ul
06-03-2009, 12:13
si è vero, i e c sono rimasugli di quello che era un precedente main.
comunque il libro è "il linguaggio C" seconda edizione di Kernighan e Ritchie.
il codice del main mi è stato suggerito da mm8 e sinceramente non capisco cosa c'è di sbagliato, mi ritrovo con il ragionamento per il main.
Ce l'ho pure io quel libro. Il primo capitolo è una panoramica completa di ciò che accadrà se prosegui a leggere.
Ti consiglio di leggere dal capitolo 2 in poi, che se non erro inizia dalle dichiarazioni di variabili :D
DaRk\S0ul
06-03-2009, 14:23
e sto maledetto libro perchè mi fa fare esercizi se è meglio comprendere gli altri capitoli prima?
agente mm8
06-03-2009, 17:51
Comunque l'errore (mentre ti aiutavo ho considerato solamente la sintassi, lasciando stare completamente l'algoritmo) è che la dichiarazione della funzione (quella in alto) deve essere uguale alla funzione vera e propria! Per questo ti da errore.
DaRk\S0ul
06-03-2009, 18:44
si era quello che volevo cioè che mi aiutassi a capire gli errori del main perchè poi con l'algoritmo devo sbattermici io.
comunque uguali in che senso?
agente mm8
06-03-2009, 19:34
void detab(char stringa[limite]);
main(){
...
}
void detab(char stringa[limite]){
...
}
DaRk\S0ul
08-03-2009, 00:40
ho fatto cosi ma non andava, nel main quindi ho modificato la chiamata della funziona ma ancora da problemi.
#include <stdio.h>
#define limite 30
void detab(char stringa[limite]);
main ()
{
char stringa[limite];
detab(stringa[limite]);
printf("%s", stringa);
return 0;
}
void detab (char stringa[limite])
{ char stringa[limite];
int i, c;
for (i=0; i != '\t' && (c=getchar())!= EOF;++i)
{stringa[i]=c;}
if ((c=getchar())=='\t')
for (i;i=='\t';++i)
stringa[i]=' ';
}
errori:
cambiatabulazioni.h: In function ‘main’:
cambiatabulazioni.h:7: warning: passing argument 1 of ‘detab’ makes pointer from integer without a cast
cambiatabulazioni.h: In function ‘detab’:
cambiatabulazioni.h:16: error: ‘stringa’ redeclared as different kind of symbol
cambiatabulazioni.h:15: error: previous definition of ‘stringa’ was here
wingman87
08-03-2009, 01:03
ho fatto cosi ma non andava, nel main quindi ho modificato la chiamata della funziona ma ancora da problemi.
#include <stdio.h>
#define limite 30
void detab(char stringa[limite]);
main ()
{
char stringa[limite];
detab(stringa[limite]);
printf("%s", stringa);
return 0;
}
void detab (char stringa[limite])
{ char stringa[limite];
int i, c;
for (i=0; i != '\t' && (c=getchar())!= EOF;++i)
{stringa[i]=c;}
if ((c=getchar())=='\t')
for (i;i=='\t';++i)
stringa[i]=' ';
}
errori:
cambiatabulazioni.h: In function ‘main’:
cambiatabulazioni.h:7: warning: passing argument 1 of ‘detab’ makes pointer from integer without a cast
cambiatabulazioni.h: In function ‘detab’:
cambiatabulazioni.h:16: error: ‘stringa’ redeclared as different kind of symbol
cambiatabulazioni.h:15: error: previous definition of ‘stringa’ was here
Errore rosso: stringa[limite] significa "l'elemento dell'array stringa di indice limite". L'argomento della funzione è un puntatore (l'array è di fatto un puntatore al primo elemento dell'array). Quindi invece di "stringa[limite]" devi scrivere solo "stringa"
Errore magenta: Hai usato lo stesso identificatore per due variabili distinte nello stesso scope.
Comunque se guardi i messaggi del compilatore sono intuitivi, se però non conosci un minimo di inglese è un problema.
Risolti questi problemi dovrebbe compilare, poi dovrai dedicarti all'algoritmo.
PS: non serve a nulla scrivere
void detab(char stringa[limite]);
Il compilatore se non dà errore lo ignora. Questo significa che anche se hai scritto "limite" in realtà alla funzione potrai passare un array di qualsiasi dimensione senza che il compilatore ti dica nulla. Quindi la signature la puoi scrivere o così:
void detab(char stringa[]);
oppure così:
void detab(char* stringa);
agente mm8
08-03-2009, 11:12
Infatti, se hai già nella funzione detab la variabile char stringa[] come argomento, non devi ridichiarla nella funzione. per questo ti da errore.
P.S.: quando il compilatore dà warning, non sono veri e propri errori ma solo avvertimenti.
DaRk\S0ul
08-03-2009, 15:42
ok il primo errore l'ho capito ed aggiustato
ma il secondo in che modo va cambiato char stringa[limite]? cioè devo dichiarare una nuova variabile di tipo char []?
per il resto io con l'inglese me la cavicchio e ciò che l'errore dice lo comprendo, il problema è che non è proprio esplicito e quindi cado in difficoltà?
Cristiano87
08-03-2009, 17:28
non ridefinire ciò che è già definito!
void detab (char stringa[limite])
{ char stringa[limite];
gli argomenti, tra parentesi tonde, sono già dichiarati
quel codice lo devi sostituire con
void detab(char stringa[])
{
Inizia a rendere il codice più leggibile mettendo in lettere maiuscole le costanti:
-la definizione della grandezza del buffer è in una macro quindi la vedi anche nella funzione.
-quando riempi di spazi bianchi vai in buffer overflow ed il for non ha per niente senso (ti fermi quando trovi un tab, ma il tab se non sta all'inizio non sta da nessuna parte).
DaRk\S0ul
08-03-2009, 22:40
bene compila quindi ora ho solo da scovare errori nell'algoritmo.
ringrazio tutti per il prezioso aiuto.
1000 grazie.
agente mm8
09-03-2009, 13:22
di niente ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.