Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - MAFUS

#801
¿Y si empiezas con algo más sencillo y te centras solo en la comunicación bluetooth? Cuando sepas manejarla podrás juntarla con el resto del código. De todas formas te diría que intentaras usar el modelo de trabajo que usan los PLC:

1. Comunicación con el exterior. Serial COM, USB, Bluetooth.
2. Leer las entradas.
3. Ejecución del programa, cálculos, acciones, etc.
4. Refresco de las salidas.
5. Vuelta al punto 1.

Como puedes ver es una máquina de estados con trabajos bien definidos y fácil de depurar.
#802
¿Lo que falla en tu código?
Hay muchos signos de puntuación. Mejor si usaras isalnum para saber si un carácter es una letra/número o algo más.

Cuando usas gets para tomar una frase también copias el carácter de nueva línea. Si no lo eliminas de ella, que no lo haces, siempre tendrás que el último carácter de dicha frase nunca será igual al primero

Cuando copias frase2 a palin usas el mismo índice para los dos. Esto quiere decir que cuándo te saltas un signo de puntuación de los que has indicado en el if el contenido de palin en esa posición se quedará con un dato basura.

¿Qué quiere decir esto?
frase2: hola? soy yo
palin : 3klmQRjkla34


Y copias con tu código frase2 a palin
frase2: hola? soy yo
palin : holaQRsoyayo


Recuerda que las variables locales no se inicializan a 0.

De igual forma se te olvida marcar el final de la cadena palin con el carácter nulo.

En el while(lol<100), si dices que la cadena tiene como máximo 100 caracteres ¿cómo llegas al indice 100 para mostrarla letra a letra? deberías llegar hasta i que es el largo calculado con strlen.


#803
Para este caso la función de la biblioteca estándar isalpha te va muy bien.
Con el siguiente código lo comprenderás.
Sea frase la frase válida con al menos una letra a operar, i y j los índices del inicio de la frase y final de frase respectivamente:
for(i = 0, j = strlen(frase); j >= i; ++i, --j) {
   if(!isalpha(frase[i]))
       ++j;
   else if(!isalpha(frase[j]))
       --i;
   else if(tolower(frase[i]) != tolower(frase[j]))
       break;
}


Cómo funciona:
sabemos que al final de cada bucle i aumentará y j disminuirá por tanto si el caracter en i no es una letra lo debemos descartar. Eso lo hará el bucle automáticamente cuando llegue al final pero debemos impedir que j no se mueva. Cómo ya hemos dicho que al final j va a disminuir en una unidad vamos a tener que incrementarlo en una unidad para que en la próxima iteración se quede igual (apuntando al mismo caracter.
El funcionamiento de j para i es similar.
Cuando el bucle ya compara dos caracteres si son iguales pasa a la próxima iteración, si son diferentes quiere decir que la frase no es palíndromo y para el bucle con break.

Lo que nos dará si la frase es palíndromo será mirar si i es menor a j.
#804
Para que veas porqué ha fallado pon el siguiente código:
int strindex(char s[], char t[])
{
    int i, j, k;
   
    for (i = strlen(s)-1;  i>=0; i--)
    {
        for (j=i, k=strlen(t)-1; s[j]==t[k]; j--, k--) {
            printf("[ %c -- %c ] [ %i -- %i ]\n", s[j], t[k], j, k);
        }
        printf("<<< k = %i>>>\n", k);
        if (k == 0 )
            return i;
    }

    return -1;
}


Cuándo el segundo bucle llega al final k se decrementa así que cuándo llegas al if(k == 0) k tiene el valor -1.
#805
Te recomiendo te pases por esta web http://www.prometec.net/modulo-1/
Va desde lo más básico hasta proyectos enteros.
#806
Eso quiere decir que la función no acepta argumentos y no devuelve ningún dato. Es lo mismo que void mensaje(). Es una cuestión de estilos.
#807
Existe el bucle pero no está reflejado en el código. luisito45 dice:
CitarEl script obviamente no esta completo pero [...]
#808
Debes venir de algún lenguaje de alto nivel, por cómo veo cómo tratas el if y lo llamas script.
Todas las opciones de una decisión tienen que estar escritas en su forma larga, y sí, es repetir mucho código.
En tu caso sería:
if ( frase[n] != ' ' &&
     frase[n] != ',' &&
     frase[n] != '?' &&
     frase[n] != '¿' &&
     frase[n] != '!' &&
     frase[n] != '¡' )


Por cierto & es el operador AND a nivel de bits. El operador lógico AND para todo el dato es &&.
#809
Siguen siendo problemas con la memoria. En este caso punteros y paso de argumentos por referencia, que no existe en C pero se emula.
Un poco de teoría:
La memoria de un ordenador el lineal y se accede a ella dando al controlador de memoria, que en verdad es un demultiplexor, un número entero sin signo del mismo tamaño en bits que el controlador puede aceptar.
Por otra parte la memoria la maneja el sistema operativo. Éste es el encargado de ofrecer una porción para que tu programa instale en ella su código y sus datos y, por razones de seguridad y para que no puedas interferir con otros programas y servicios del sistema, vigila que tu programa no salga de esa porción asignada.
C es un lenguaje de nivel medio y eso significa que es de tan bajo nivel que el programador puede indicarle qué posición de memoria exacta quiere leer o escribir pero al mismo tiempo es de tan alto nivel que tiene estructuras para no tener que vérselas con saltos manuales y puede encerrar regiones de código en funciones que hacen todo el trabajo de la pila por él.
Los punteros de C son los encargados de guardar las direcciones de memoria a las que queremos acceder.

[ Ya casi termino ]

Todos los argumentos de las funciones se pasan por valor. Eso quiere decir que el dato que recibe la función es una copia del original y por tanto toda modificación que se haga dentro de la función de ese dato sólo afecta a la función. Quien la ha llamado no notará que haya pasado nada.
Para poder cambiar dicho dato hay que pasar la dirección de memoria de éste, así lo que se ha copiado es dicha dirección por tanto dentro de la función está el mismo puntero y se puede acceder y cambiar el contenido de la memoria. Cambiando el contenido de la memoria dentro de la función también se cambia para todo el sistema, así lo que se haga dentro de la función también lo ven desde fuera. Por cierto, el operador que devuelve la dirección de memoria de un dato es el ampersand ( & ).

[Juntándolo todo y resolviendo el error]

La función scanf, para simplificar y en tu contexto, toma un dato del buffer de entrada del mismo formato que le has indicado en la cadena de argumentos, un entero, y lo deposita en la variable que le has indicado.
Pero la función espera un puntero a la variable, por lo que te he expuesto anteriormente, es decir una dirección de memoria válida dentro de tu programa. Al darle directamente choice le dices a scanf que el contenido de choice, vete a saber cuál es, es la dirección de memoria en la que debe depositar lo recogido desde el buffer de entrada. Cómo choice puede contener cualquier cosa lo más seguro es que sea tratado como una dirección de memoria que apunta a un lugar fuera del espacio de tu programa y el sistema operativo, para que no se causen males mayores, lo aborta inmediatamente.
Por tanto debes darle a scanf la dirección de memoria de choice para que ponga el dato en tu variable.
Así el código que debes poner es
scanf("%i", &choice);
#810
El penúltimo argumento de openpty es const struct termios *termp. Con ella controlas el comportamiento del terminal. A lo mejor tu solución está por aquí.