Curso completo de programación con lenguaje C

Leos

#450 El codigo esta en catalan por eso no hay problemas, lo he traducido para ponerlo aqui.

todo error de traducción al ponerlo aquí xD

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

int dies;

int num_dies(int any, int mes);
int vicies(int any);

int main(void){
    
int any, mes; printf("\nIntrodueix un any: "); scanf("%d", &any); printf("\nIntrodueix un mes: "); fflush(stdin); scanf("$d", &mes); printf("\n%d de dies!", num_dies(any, mes)); system("pause"); return 0; } int vicies(int any){ if(any%4==0 && (any%100!=0 || any%400==0)) return 1; return 0; } int num_dies(int any, int mes){
if(mes==1 || mes==3 || mes==5 || mes==7 || mes==8 || mes==10 || mes==12) dies=31; if(mes==2){ if(vicies(any))dies=29; else dies=28; } if(mes==4 || mes==6 || mes==9 || mes==11 ) dies=30; return dies; }

Aquí codigo tal cual.

1 1 respuesta
gonya707

#451 entiendo xD

En ese caso es lo del return dias y que te falta declarar la variable dias

int num_dies(int año, int mes){   

int dias;

if(mes==1 || mes==3 || mes==5 || mes==7 || mes==8 || mes==10 || mes==12) 
	dias=31;
if(mes==2){
	if(vicies(año))dias=29;
	else dias=28;
}
if(mes==4 || mes==6 || mes==9 || mes==11 ) 
	dias=30;

return dias;

}
1 respuesta
Leos

#452 Eso ya lo había probado y me sigue imprimiendo 0, me lo he mirado mil veces y he probado de todo, me tiene loco ya xD

1 respuesta
gonya707

#453 quita la variable dias de ser global y declarala dentro de la funcion.

1 respuesta
Leos

#454 También estaba probado y me imprime basura.

1 respuesta
gonya707

#455 imprime tambien el mes que estas metiendo a la funcion, fijo que esta haciendo algo raro, no entra por ningun if y entonces el valor de dias no se modifica

1 respuesta
Leos

#456 El numero que me imprime no es ni el año ni el mes, que ahora que lo has dicho me he fijado, pero siempre imprime el mismo.

Siempre cometo errores super chorras y fijo que ahora es algo muy tonto xD

1 respuesta
gonya707

#457 ya se que ese no es el objetivo, pero hazlo para ver si todo se esta haciendo como debería. Dejar trazas es un buen método para depurar código

... olvidalo, he visto el error

cuando escaneas el mes has puesto $d en vez de %d

Leos

Buah menudo error más tonto que rabia.

Muchas gracias por la ayuda!

sasher

#445 Esos

fflush(stdin)

... http://c-faq.com/stdio/gets_flush2.html

B

Acabamos de zambullirnos en el increíble mundo de las funciones y punteros.

Me ha dado un corte de digestión y he muerto.

¿Por casualidad no tendréis por ahí algún ejercicio suelto muy básico (que hasta un mono te lo haga si hace falta) sobre esas dos materias?

2 respuestas
gonya707

#461 mira en el tema que escribi en este mismo hilo acerca de punteros... :p algo habrá

cabron

#461

Pues si te rayas con funciones y punteros, ya verás cuando veas los punteros a funciones xD

GrAnRA

Antes de crear un hilo, queria preguntar aqui.

Estoy dando en la carrera Java orientado en aplicaciones moviles (Android) y no se nada de programar.

He preguntado a gente y me dicen que antes de nada aprenda C++ y POO.

Alguien me puede decir que es lo mejor para aprender java en aplicaciones moviles?

Y lo mejor... alguien tiene tutoriales para aprender desde 0 y que yo pueda ir practicando en casa paso a paso?

2 respuestas
cabron

#464

Lo que te han recomendado no tiene ningún sentido, no hagas ni caso.

Eso sí, si empiezas desde 0 es bastante mejor que empieces con aplicaciones de consola, intentar aprender a programar al mismo tiempo que tienes que aprender todas las historias de Android (Actividades, Intentos, etc) no solo va a ser complicado, si no que te puede dar un visión equivocada ya que todas esas cosas no existen en cuanto salgas de Android.

De todas formas no preguntes aquí hombre que desvías la conversación a algo que no tiene que ver, nadie te va a pegar por abrir un hilo para tu duda.

2
M

#464 Hombre en lo de POO tienen razón, pero C++ no es necesario para nada, aprende Java en condiciones y luego ya das el salto a android, si empiezas con android directamente no vas a enterarte de nada.

2
Clinisvud

Tengo un par de dudas:

Para imprimir ciertos elementos de un array usando el estilo de "%.5s", ¿hay alguna manera de definir el rango con una variable en vez de con un número? Algo como "%.Xs".

La otra: tengo un array de hasta 256 elementos que saco con fgets. ¿Cómo puedo saber hasta dónde está lleno el array?

1 respuesta
9 días después
L

Muchas gracias.
Genial el artículo.
Saludos

Maaarc

#467 Lo primero creo que no se puede y lo segundo con sizeof()

1 respuesta
B

#469 Quizá no he entendido bien su pregunta pero sizeof devuelve el tamaño del tipo de la variable, que en el caso que ha dicho siempre va a ser de 256*sizeof del tipo.

1 1 respuesta
Maaarc

#470 cierto, que use strlen, que es lo que quiere.

Se me fue la olla, lo siento por las confesiones.

1
Clinisvud

Gracias fenómenos.

28 días después
bornex

Disculpad que escriba por aquí pero necesito un poco de referencia, y seguramente que sabéis más que yo de esto.

¿Hay alguna web de referencia donde se puedan consultar librerías específicas para C? (estilo tcpdump/libpcap)

EDIT: Aprovecho para preguntar una dudilla que me está ocurriendo.
Tengo una función tal que así:

void funcion(char *nombre, int valor, Lista *l1);

Dentro modifico nombre para ponerle uno que he encontrado en la lista (por ejemplo), estoy haciendo un paso por referencia, lo encuentro y lo modifico, pero cuando imprimo la variable nombre dentro del main para ver si ha encontrado la palabra, me pone (NULL). ¿Porqué?

herre

Si haces algo rollo:

void fun(char *nombre) {
        nombre = "Adios";
}

int main(void) {
        char *n = "Hola";
        fun(n);
        printf("%s\n", n);  // => "Hola"
}

fun está recibiendo el valor de la localización en memoria a la que apunta n (y que contiene "Hola" ), y creando una variable local que apunta al mismo sitio. Cuando haces

nombre = "Adios";

dentro de fun, estas cambiando la variable local nombre a apuntar a una nueva cadena de texto "Adios". La variable n en main no se va a ver afectada.

Si intentas desreferenciar nombre dentro de fun vas a tener un segfault porque C no permite modificar "string literals".

La forma correcta de hacerlo es aceptar un puntero a la cadena de texto en fun, y pasarle la dirección del puntero que quiere modificar desde main:

void fun(char **nombre) {
        *nombre = "Adios";
}

int main(void) {
        char *n = "Hola";
        fun(&n);
        printf("%s\n", n);  // => Adios
}

Pero mejor: No hagas esto. Calcula un valor dentro de tu función y devuelve un nuevo valor.

1 respuesta
gonya707

mi manera sencilla de verlo es que solo puedes asignar un valor a un char* en el momento que lo creas, pero no en medio de la ejecucion, para hacer eso usa strcpy

strcpy(char *destino, char * origen);
1 respuesta
bornex

#474 Se que con tu segunda opción funciona, pero es un ejercicio que he pillado de cursos anteriores y la cabecera debe ser como he dicho:

void pop(char *nombre, int *retorno, Pila *p);

En el main le paso así:

char *salida;
int retorno;
pop(salida, &retorno, &pila);
fflush(stdout);
printf("Extraemos...\n");
printf("Valor extraido: %s\n", salida);

Dentro de la función pop he probado todo y nada.

#475 Si uso strcpy dentro de la función me da un Segmentation fault. La verdad es que me estoy quedando un poco pillado con este asunto.

2 respuestas
gonya707

#476 eso es que no has iniciado la cadena apropiadamente, en vez de

char *cadena;

usa

char cadena[100];
2 respuestas
herre

#476 Probablemente esté pensado para que lo hagas como te dice #477.

El tema es que si inicias una cadena de texto como "un puntero a un char":

char *str = "Hola MV";

tu compilador, dependiendo de la arquitectura, seguramente va a guardar la cadena de texto en el code segment y va a apuntar el puntero a ella (valga la redundancia), por tanto no vas a poder modificarla. Si la creas como un array de chars:

char str[] = "Hola MV";

Reservará memoria de forma normal para el array y lo "llenará" con el string literal.

1 respuesta
bornex

#477 #478 Perfecto gente, así es como debía hacerlo usando un array. Gracias :)

Fyn4r

El tema del array es que puedes tener problemas con los tamaños (si se te va de la dimensión, que vale que no debería pero luego hay buffer overflow y mierdas así xd)

Usuarios habituales