Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DaniekL en 8 Abril 2012, 23:56 pm



Título: Problemas con el compilador [Solucionado]
Publicado por: DaniekL en 8 Abril 2012, 23:56 pm
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

Código
  1. //drawsomething.c
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero
  6.  
  7. //Funcion que muestra el uso y sale
  8. void usage(char *s) {
  9. 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);
  10. exit(0);
  11. }
  12.  
  13. //Añade una nueva palabra a la lista
  14. void add(char *word) {
  15. FILE *wordlist;
  16. wordlist = fopen(PATH, "w");
  17. if(wordlist == NULL) {
  18. printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
  19. exit(0);
  20. }
  21. fwrite(word, sizeof(word), 1, wordlist);
  22. fclose(wordlist);
  23. }
  24. //Funcióm que busca la palabra
  25. void find(int tamano, char *l) {
  26. FILE *wordlist;
  27. char letters[13], *aux;
  28. int check, i; /*check comprueba si la palabra leida contiene las letras que pasamos como argumento.
  29.                       Si check es mayor o igual que el tamaño de la palabra, esta cumple las caracteristicas*/
  30. strcpy(letters, l);
  31. letters[12] = '\0';
  32. wordlist = fopen(PATH, "r");
  33. if(wordlist == NULL) {
  34. printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
  35. exit(0);
  36. }
  37. aux = fgets(NULL, 15, wordlist);
  38. while(aux != NULL) {
  39. if(strlen(aux) == tamano) {
  40. for(i = 0; i < 12; i++) {
  41. if(strstr(aux, letters[i]) != NULL) {
  42. check++;
  43. }
  44. }
  45. if(check >= tamano) {
  46. printf("%s\n", aux);
  47. }
  48. }
  49. aux = fgets(NULL, 15, wordlist);
  50. }
  51. }
  52.  
  53. int main(int argc, char *argv[]) {
  54. if(argc < 3)
  55. usage(argv[0]);
  56. if(strcmp(argv[1], "-a"))
  57. add(argv[2]);
  58. else
  59. find(atoi(argv[1]), argv[2]);
  60. return 0;
  61. }

El problema viene cuando lo compilo. Uso el gcc y me arroja este resultado:
Código:
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.


Título: Re: Problemas con el compilador
Publicado por: do-while en 9 Abril 2012, 00:32 am
¡Buenas!

El error esta aqui:
Código
  1. #define PATH = "/home/daniel/.drawsom/wordlist"
  2.  

Te sobra el =

Deberia ser:
Código
  1. #define PATH = "/home/daniel/.drawsom/wordlist"
  2.  

Cuando utilizas #define para definir constantes se hace asi:

#define CONSTANTE VALOR

no

#define CONSTANTE = VALOR

¡Saludos!


Título: Re: Problemas con el compilador
Publicado por: Beakman en 9 Abril 2012, 00:36 am
En vez de poner esto:
Código
  1. #define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero

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

Y acá:
Código
  1. 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'.


Título: Re: Problemas con el compilador
Publicado por: do-while en 9 Abril 2012, 00:39 am
XD, es cierto, mira que lo he dicho, pero se me ha olvidado quitar el =. Hay sueño...


Título: Re: Problemas con el compilador
Publicado por: Beakman en 9 Abril 2012, 00:43 am
Jaja. Yo llegué tarde.


Título: Re: Problemas con el compilador
Publicado por: soyloqbuskas en 9 Abril 2012, 00:44 am
¡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:
Código
  1. #define PATH = "/home/daniel/.drawsom/wordlist" //El PATH del fichero

Por esta otra:
Código
  1. 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:
Citar
char *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:
Código
  1. //Funcióm que busca la palabra
  2. void find(int tamano, char *l) {
  3.        FILE *wordlist;
  4.        char letters[13], *aux;
  5.        int check, i; /*check comprueba si la palabra leida contiene las letras que pasamos como argumento.
  6.                       Si check es mayor o igual que el tamaño de la palabra, esta cumple las caracteristicas*/
  7.        strcpy(letters, l);
  8.        letters[12] = '\0';
  9.        wordlist = fopen(PATH, "r");
  10.        if(wordlist == NULL) {
  11.                printf("[Fatal Error!!] while opening wordfile\nAborting...\n");
  12.                exit(0);
  13.        }
  14.        aux = fgets(NULL, 15, wordlist);
  15.        while(aux != NULL) {
  16.                if(strlen(aux) == tamano) { // quitamos el for()
  17.                        if(strstr(aux, letters) != NULL) { //sustituimos el puntero a caracter letters[i] por letters
  18.                                  check++;
  19.                        }
  20.  
  21.                        if(check >= tamano) {
  22.                                printf("%s\n", aux);
  23.                        }
  24.                }
  25.                aux = fgets(NULL, 15, wordlist);
  26.        }
  27.  
  28.  

Un saludo.


Título: Re: Problemas con el compilador
Publicado por: DaniekL en 9 Abril 2012, 23:10 pm
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...