Curso completo de programación con lenguaje C

B

#600

Así a ojo utiliza el mal llamado teorema fundamental de la numeración, échale un ojo a esto: https://es.wikipedia.org/wiki/Sistema_de_numeraci%C3%B3n

Un saludo.

Clinisvud

Para quien le interese, hay un curso gratuito en edx sobre sistemas embebidos:
https://www.edx.org/course/embedded-systems-shape-world-utaustinx-ut-6-03x

1 respuesta
B

#602 gracias por el curso, aunque lo veo mas logico aqui https://www.mediavida.com/foro/dev/programacion-desarrollo-microcontroladores-501665

gracias por el aviso

1 respuesta
Clinisvud

#603 Toda la razón, se me fue la olla y me confundí de post.

11 días después
iSecOne

Una pregunta tonta, si en una función que sea: "enseña el polinomio pasado como parámetro"; y la función es: void escribir(Pol p), siendo Pol una estructura, que sería más correcto, escribir(*p) o escribir(p[0])??

Ambas funcionan evidentemente, pero lei que había que pasar como parámetros después de tener todo hecho, y no se si estaría bien cambiando eso, o dejando escribir(*p).

Muchas gracias por la ayuda.

1 respuesta
Gif

#605

p[0] es una array de Pol y pasas el elemento 0, con *p estas desreferenciando un puntero para pasar una copia de una estructura tipo Pol.

1 respuesta
iSecOne

#606 No entendí lo de desreferenciando el puntero, pero creo que entonces lo correcto es *p, pero al desreferenciarlo ya se pasa como parámetro, no?

1 respuesta
Gif

#607 como tienes declarado p?

Pol p; // stack
Pol* p; // heap
Pol p[num]; // array

Al desreferenciar el puntero estas pasando una struct Pol, si tienes la de stack tienes que pasar p, si es heap *p y el de array p[num] el numero que quieras pasarle.

1 respuesta
iSecOne

#608

Pol *p

O sea que lo correcto es escribir(*p), muchas gracias compañero :D

1 respuesta
cabron

#609

No es que sea correcto o incorrecto, en C los arrays son punteros, así que p[0] es totalmente válido y es quivalente a *p, pero no tiene mucho sentido ya que normalmente esa notación se usa cuando el puntero apunta a varios elementos, y quieres seleccionar uno en concreto, p[0] elige el primero, p[1] el segundo, etc.

Si solo tienes uno y pones p[0] es confuso por que estás dando a entender que hay más de uno y que estás eligiendo el primero, cuando realmente solo tienes uno.

iSecOne

Muchísimas gracias por la ayuda a ambos, y lo siento por no haber dicho que era en C hahaha No me di cuenta.
Os dedicaré mi 10 ;)

Vandalus

Buenas. Estoy actualmente en practicas de ASIX y solo dimos en primero de este grado superior , "programación básica" (solo java).

En la cual teníamos un profesor que básicamente parece que solo daba clases para dos personas que además venían de la universidad y sabían programar muchísimo mas que la media de la clase.
La cosa es que me dejo en un estado donde programar me empezó a dar asco y a pesar de aprobar, la verdad que no se me quedo mucha cosa y me quito las ganas de hacer DAM.

Bueno al tema, en las practicas hay mucho programador y en mis ratos libres me intereso por su trabajo, el cual me esta interesando bastante.

La cosa es que me han dicho que empiece por C y desde cero.

Antes de empezar con el curso que hay en este post, pregunto. ¿me aconsejáis C? estoy motivado y tengo tiempo libre que dedicarle, pero no se si empezar o no por este lenguaje.

3 respuestas
iSecOne

#612 yo soy novicio también en C, empecé este curso con él. Pero tengo entendido que es un buen comienzo, y que a partir de C te será más fácil aprender otros lenguajes como C++ o Java. Además, creo que para empezar C es bastante sencillo y deja una base en general para luego aprender otros lenguajes.

De todas formas, espera a ver que dicen programadores mediavideros más experimentados.

PD: aquí un material que me ayudó bastante junto a este hilo para sacar el cuatri, en el que voy a sacar más de nueve casi fijo: https://www.youtube.com/playlist?list=PLw8RQJQ8K1ySN6bVHYEpDoh-CKVkL_uOF . Un saludo y no te rindas. Y si necesitas cualquier ayuda (no soy un experto pero al principio te puedo ayudar) no dudes en mandar un MP o así :)

Gif

#612 empieza por C y después tira a C++ o Java aprender los lenguajes te resultara ya mucho mas fácil.

Yo aprendí C en ASIX, después en DAM Java y C++(Proyecto Final, un videojuego tipo lemmings)

B

#612

C es mi lenguaje favorito, sirve para absolutamente todo y sabes que estás haciendo en cada momento. Problema? Hay cosillas que si no sabes algo de arquitectura de computadoras y física/sistemas digitales/electrónica no vas a pillar al vuelo (y si lo haces ole tú!), es decir, las vas a pillar pero la curva de aprendizaje se va a torcer porque tardarás en hacerte con esas cosas como punteros, operaciones a nivel de bit, ... Pero por lo demás no tendrás problema, sólo es cuestión de pillarlo con ganas y dedicarle tiempo, como todo.

Otro lenguaje que suelo recomendar para gente con curiosidad pero perezosa por definición es python, pero si tienes tiempo y ganas, apúntate este como segundo lenguaje.

En cuanto C++, java, ... lenguajes pascal-like, una vez sepas C, aprender estos va a ser pan comido, la sintaxis al menos, sólo tendrás que estudiarte el paradigma de la programación orientada a objetos (basicamente encapsulación, herencia y polimorfismo). Lo bueno de aprender python como segundo lenguaje en vez de estos es que es multiparadigma y podrás aprender los conceptos de la POO, tener un lenguaje tipo navaja suiza que te valdrá para casi todo donde no necesites un rendimiento brutal y además cosas de programación funcional(otro de los grandes paradigmas de programación), tremendamente potentes y útiles como map, reduce, filter y lambda.

Un saludo.

10 días después
Fransacreblu

no habia visto que tenian este curso, creo que va siendo hora de aprender C

29 días después
B

Alguien sabría resolver lo que está subrallado en amarillo? Estoy atascado en esto, demasiado rebuscado xD

Gracias!

B

Esta es mi propuesta:

28 días después
willy_chaos

Aprovecho el tema para preguntar a ver si alguien sabe indicarme por donde comenzar.

Me gustaría dada una dirección de memoria (pasada por argumento al programa) , reservar esa dirección de memoria para usarla (a todo esto para plataformas Windows)

Si tengo la dirección de memoria 0xABCFE101 pues poder decir

miprograma 0xABCFE101

Y que dentro de mi programa pueda usar exactamente esa dirección como dirección de memoria de una variable. Obviamente intentaría usarla, pero puede que este siendo usada por otro programa, así que mi programa a cada cierto tiempo generaría un sigalarm y consultaría si esta sigue en uso.

Es algo que se me ha ocurrido hace unos días y me gustaría saber si es posible indicarlo.

3 respuestas
jamontenegro

#619 creo que es imposible reservar direcciones de memoria concretas que tu quieras

1 respuesta
cabron

#619
En un sistema operativo moderno se usa memoria virtual, eso significa que la dirección de memoria 0xABCFE101 es exclusiva del proceso en el que estás, cada proceso tiene su propia dirección 0xABCFE101 y es imposible que otro programa la esté usando, ya que no es una dirección real, si no virtual.

El problema que puedes tener al intentar acceder a una dirección de memoria así por las buenas es que no esté paginada a memoria física real y entonces te dará un segment fault, memory access violation o algo parecido.

1 respuesta
_rAiDeN_

#621 Creo que tal y como lo cuentas da pie a confusión de ahí la respuesta de #620. Sobre lo de reservar cualquier dirección de memoria en las cpus actuales es el mmu junto al sistema operativo el que se encarga de ello de forma que no podemos reservar memoria con la dirección que nos salga del... En un sistema moderno no puedes hacer lo que pretendes.

Si lo que quieres es tener un puntero con una dirección determinada y que apunte a un objeto que puede ir cambiando puedes hacer lo siguiente

int var=1;
int * const p = &var;

De esa forma siempre tendrás la misma dirección de memoria para el puntero.

1 1 respuesta
cabron

#622

Sí se puede, de nuevo hay que diferenciar memoria virtual de memoria física. La memoria física a ti la pela cual es, por que no tienes nunca acceso a ella (salvo que programes en modo kernel), lo único que te importa es la virtual.

Los sistemas operativos suelen tener funciones propias para reservar direcciones de memoria específicas (mmap() en linux, VirtualAlloc() en windows), y donde se ponga esa dirección de memoria físicamente te es indiferente, lo único que te importa es que la dirección virtual a la que está mapeada es la que tu has pedido.

1 respuesta
_rAiDeN_

#623 Leyendo mi respuesta anterior al no especificar entre virtual y física igual confunde.
Para aclararlo si puedes reservar la dirección que quieras pero realmente no la estas reservando físicamente sino dentro del Virtual Address Space de ese proceso en concreto de ahí mi afirmación sobre que no es posible reservar cualquier dirección de memoria.

Todo viene del ejemplo de #619 te inventas una dirección de memoria 0xF lo que sea y desde tu aplicación intentas reservar esa dirección de memoria usando VirtualAlloc() la estas reservando dentro de su Virtual Address Space es decir estamos siempre reservando memoria virtual. Hasta aquí fantástico.

La pregunta es si iniciamos el proceso A que reserva la dirección 0xF. No se hasta donde es posible acceder a esa posición de memoria desde otra aplicación al tratarse de memoria virtual para cada proceso. Es decir esos 2 procesos estarían compartiendo la misma memoria virtual.

En un sistema sin mmu al reservar una dirección 0xF por ejemplo cualquier proceso puede acceder a esa posición de memoria de ahí la respuesta anterior acerca de que con los sistemas actuales no es posible hacer lo que el compañero quiere.

Leyendo un poco acerca del tema del virtual address space parece que es posible llegar a compartir el mismo, si hay algún valiente que lo pruebe que nos cuente que tal. Para 619 puede ser lo que buscas.

https://msdn.microsoft.com/es-es/library/windows/desktop/aa366912(v=vs.85).aspx

1 respuesta
willy_chaos

#624 Si si, no me acordaba de lo de la MMU, pero en C bajo linux si que puedes hacer una peticion a shared memory para que dos programas compartan una misma direccion de memoria.

A ver la idea era hacer una especie de BadRam para Windows y poder aprovechar memorias con direcciones jodidas.

Silvio_Dante

No soy capaz ni de hacer funcionar el primero :psyduck: jajaja

Todo sale bien, o eso creo, me da 0 errores y 0 warrnings al compilarlo. El problema viene a la hora de ejecutarlo. Cuando lo ejecuto no pasa nada, se queda la consola en negro con la barra baja parpadeando tal que así:

Hay algo mal aquí?

spoiler

PD: Ya se que llego 2 años tarde XD

2 respuestas
B

#626

Prueba añadiendo un salto de linea a fprintf

fprintf(stdout, "Hello world!\n");

O bien con:

fprintf(stdout, "Hello world!\n");
fflush(stdout);

La explicación es que basicamente el sistema a veces tapona la salida standar y con poner salto de linea suele llegar, sino toca liberarla con flush. Es lo que tiene utilizar fprintf en vez de printf, que sinceramente, no sé porqué quieres hacerlo así.

Un saludo.

Edito: Ya sé porqué, acabo de ver el ejemplo que ponen, cuando no vayais a trabajar con flujos diferentes al standar, recomiendo evitar problemas y en lugar de:

fprintf(stdout, "Hello world!\n");

utilizar simplemente:

printf("Hello world!\n");

En teoría deberían funcionar ambos, pero a veces pasan estas cosas.

1 respuesta
gonya707

#626 muy raro me parece, deberia funcionar :/

Silvio_Dante

#627 Nada :cry: he probado de las dos maneras y hace lo mismo, se queda la barra baja de la consola parpadeando y nada mas. Igual es problema de mi ordenador o el dev c++ que tengo o vete tu a saber... Como curiosidad, he probado el mismo ejercicio en lenguaje python y si me funciona XD. También decir que no tengo ninguna clase de conocimientos de programación, igual estoy metiendo la pata en algo muy obvio y no me doy cuenta jaja

1 respuesta
xoubi

#629 Prueba a darle a F10 después de compilar el código.

1 respuesta