Problemas con el compilador [Solucionado]

Iniciado por DaniekL, 8 Abril 2012, 23:56 PM

0 Miembros y 1 Visitante están viendo este tema.

DaniekL

Hola.

Verán, estoy haciendo un programa que lee una lista de palabras y las compara con una lista de letras.
Aquí de lo muestro

//drawsomething.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero

//Funcion que muestra el uso y sale
void usage(char *s) {
printf("\t-----Usage-----\n\nTo add a word use: %s -a <the_word>\nTo find a word use: %s <length_of_the_word> <the_possible_letter>\n", s, s);
exit(0);
}

//Añade una nueva palabra a la lista
void add(char *word) {
FILE *wordlist;
wordlist = fopen(PATH, "w");
if(wordlist == NULL) {
printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
exit(0);
}
fwrite(word, sizeof(word), 1, wordlist);
fclose(wordlist);
}
//Funcióm que busca la palabra
void find(int tamano, char *l) {
FILE *wordlist;
char letters[13], *aux;
int check, i; /*check comprueba si la palabra leida contiene las letras que pasamos como argumento.
                     Si check es mayor o igual que el tamaño de la palabra, esta cumple las caracteristicas*/
strcpy(letters, l);
letters[12] = '\0';
wordlist = fopen(PATH, "r");
if(wordlist == NULL) {
printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
exit(0);
}
aux = fgets(NULL, 15, wordlist);
while(aux != NULL) {
if(strlen(aux) == tamano) {
for(i = 0; i < 12; i++) {
if(strstr(aux, letters[i]) != NULL) {
check++;
}
}
if(check >= tamano) {
printf("%s\n", aux);
}
}
aux = fgets(NULL, 15, wordlist);
}
}

int main(int argc, char *argv[]) {
if(argc < 3)
usage(argv[0]);
if(strcmp(argv[1], "-a"))
add(argv[2]);
else
find(atoi(argv[1]), argv[2]);
return 0;
}


El problema viene cuando lo compilo. Uso el gcc y me arroja este resultado:
drawsomething.c: En la función 'add':
drawsomething.c:13:19: error: expected expression before '=' token
drawsomething.c: En la función 'find':
drawsomething.c:28:19: error: expected expression before '=' token
drawsomething.c:37:5: aviso: el paso del argumento 2 de 'strstr' crea un puntero desde un entero sin una conversión [activado por defecto]
/usr/include/string.h:342:14: nota: se esperaba 'const char *' pero el argumento es de tipo 'char'


He revisado los errores pero no veo el fallo y como el compilador lleva tiempo haciendo cosas raras pues a lo mejor es un fallo (sin ofender al gran Stallman   :laugh: :laugh: :laugh:) por que ademas, sale que tengo errores en la libreria string.h.

Si alguien tiene la solución al problema (que me jugaría el brazo a que es una chorrada) le agradeceía mucho que me ayudase.  ;-)

Gracias. Un abrazo.

do-while

¡Buenas!

El error esta aqui:

#define PATH = "/home/daniel/.drawsom/wordlist"


Te sobra el =

Deberia ser:

#define PATH = "/home/daniel/.drawsom/wordlist"


Cuando utilizas #define para definir constantes se hace asi:

#define CONSTANTE VALOR

no

#define CONSTANTE = VALOR

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Beakman

En vez de poner esto:
#define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero

Poné esto:
#define PATH "/home/daniel/.drawsom/wordlist" //El PATH del fichero

Y acá:
if( strstr( aux, letters[ i ] ) != NULL) {

La función strstr tiene que recibir dos cadenas, y vos le estás pasando una cadena y un carácter. Tenés que hacer una cadena con ese carácter y el '\0'.

do-while

XD, es cierto, mira que lo he dicho, pero se me ha olvidado quitar el =. Hay sueño...
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Beakman


soyloqbuskas

¡Buenas DaniekL!

Ya he dado con tus problemas.

El 1º esta en la definicion del PATH. No puedes definir el PATH = VALOR, lo tienes que definir como un char *.

Cambia esta linea:
#define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero

Por esta otra:
char * PATH = "/home/daniel/.drawsom/wordlist"; //El PATH del fichero

Y el 2º error lo tienes en el strtstr(). Esta funcion se define de esta manera:
Citarchar *strstr(const char *s1, const char *s2);

Siendo s1 y s2 2 cadenas de caracteres, y lo que hace es buscarte la cadena s1 dentro de la cadena s2. Por tanto no hace falta que recorrars tu la cadena s2 (s2).

Por tanto, tu funcion find() ahora queda asi:

//Funcióm que busca la palabra
void find(int tamano, char *l) {
       FILE *wordlist;
       char letters[13], *aux;
       int check, i; /*check comprueba si la palabra leida contiene las letras que pasamos como argumento.
                     Si check es mayor o igual que el tamaño de la palabra, esta cumple las caracteristicas*/
       strcpy(letters, l);
       letters[12] = '\0';
       wordlist = fopen(PATH, "r");
       if(wordlist == NULL) {
               printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
               exit(0);
       }
       aux = fgets(NULL, 15, wordlist);
       while(aux != NULL) {
               if(strlen(aux) == tamano) { // quitamos el for()
                       if(strstr(aux, letters) != NULL) { //sustituimos el puntero a caracter letters[i] por letters
                                 check++;
                       }
                       
                       if(check >= tamano) {
                               printf("%s\n", aux);
                       }
               }
               aux = fgets(NULL, 15, wordlist);
       }



Un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

DaniekL

Ostias, es verdad. :xD No me extraña que tuviese ese error, llevaba siglos sin usar #define y respecto al fallo en string.h. Porque no se que puede ser...