En un par de días, me has resuelto dudas que ningún profesor me había dejado claras y por ello te doy las gracias. Eres muy bueno y procuraré seguirte en la medida de lo posible. Un saludo y gracias por compartir estos videotutoriales.
La verdad que seria un placer tenerlo como profesor. Con sus videos y sin interactividad con los visitantes, logra llegar a los puntos de ignorancia sobre el tema, que tenemos los que empezamos de cero. Con sólo ver una vez cada video, pude lograr a la primera crear vectores y matrices dinámicas. Con un nivel de complejidad alto para mi "NADA" de conocimientos. Los videos anteriores me parecieron fáciles. Se nota su experiencia con alumnos. Felicitaciones y gracias por compartir. Quiero aprender a programar PICs en C. Pero claro, primero tenía que aprender C y me topé con Ud. que se convirtió en uno mis profesores favoritos. Saludos desde Buenos Aires...
POR FIIIIIIIN ME HA SALIIIIIDOOOOOO. Por dios, he estado atascado, pensando que no entendia Malloc ni Realloc, pero NO, el problema era un error de escritura, casi me vuelvo loco. Por fin vuelvo a la carga a verme tus videos, esperate que en un par de meses, acabo este curso ;). Muchas gracias por tus videos y mucho apoyo!!!
Me tomó varias horas y tratar de resolver el problema, lo hice primeramente con vectores, me costo bastante establecer la logica y en una parte en la q me travé recoorte 5 papelitos para verlo de una forma mas visual. ahi comprendi cosas q se me pasaban en la codificacion. Una vez teniendo clara la forma de operar procedi a realizarlo con punteros. pondre las dos resoluciones un poco orgulloso del logro mas q por ponerlo. Devo decir q al hacerlo con punteros salto q el algoritmo no funcionaba bien y tuve q volver a pensarlo una vez resuelto porsegui con punteros, cuando termine de hacerlo y continué viendo el video observe q las formas en q resolvimos el problema fue la misma. lo cual resulto muy interesante. saludos emilio. //Con vectores -------------------------------------------------- int main() { int N=20, i, j; int vector[N]; aleatorio(vector,N); for (i=0; i
El warning es porque en la línea 15 te falto un puntero en el primer int osea tiene que ser vector = (int*)malloc(N*sizeof(int)); ya lo tenias pero al explicar lo borraste, por cierto , gracias muy buen video
Cuando borraste los punteros de ejemplo del primer int le borraste los dos en lugar de dejar uno; por eso debe ser el warning, genial el vídeo, saludos.
Estan muy buenos los videos, me sirvieron mucho para programación y algoritmos. Lo que no me quedo muy claro es el algoritmo que diseñaste para comparar los elementos del vector (al comienzo del video cuando reescribís un valor sobre otro). Muy buen aporte para los estudiantes. Saludos..
esque me pidieron un codigo en la escuela pero no me sale y no encuentro el error: #include #include int main(){ //FILE* archivo; int i = 0, aux = 1, *arreglo; char tecla; //archivo = fopen("datos.txt", "w"); arreglo = (int*)malloc(aux * sizeof(int)); //if(archivo == NULL){ // printf("El archivo no fue creado"); // exit(-1); //} //else{ // printf("El archivo 'datos.txt' fue creado CORRECTAMENTE "); //} do{ printf("Ingrese un registro: "); scanf("%i", *(arreglo + i)); // Segun yo aqui no debe de tener el & ¿o si? printf("Quieres ingresar otro registro? (s = si, n = no): "); do{ fflush(stdin); scanf("%c", &tecla); if((tecla != 's' && tecla != 'S') && (tecla != 'n' && tecla != 'N')){ // Para que solo pueda yngresar n, N, s y S printf("%c", 07); printf("Intente de nuevo: "); } }while((tecla != 's' && tecla != 'S') && (tecla != 'n' && tecla != 'N')); if(tecla == 's' || tecla == 'S'){ arreglo = (int*)realloc(arreglo, aux++); } }while(tecla == 's' || tecla == 'S'); printf(" "); while(i < aux){ printf("%i, ", *(arreglo + i)); i++; } printf("
Javi Pérez Cano Realmente no puedo decirte porque el compilador da un numero u otro, puede que el compilador de Dev C++ no cumpla el estandar, pero lo que si que te digo seguro es que un int se concibio para que tuviese 2 bytes y que llegase al numero maximo de (2^16)/2, que son 32 mil y pico... prueba a meterle un numero mayor de 64mil, a ver que si almacena correctamente el numero. Creo que esta es la mejor solucion para salir de dudas. Un saludo.
Eso es en C++ . cito: " Se requiere el uso del casting en C++ debido al fuerte sistema de tipos, mientras que éste no es el caso de C." (Ya se que pasaron >3 años, pero para no confundir al que lea su comentario).
Cuando escribis en el min 14:40 (* (vector+i) == *(vector+j)) que significa los *. Y como funcionan la busqueda de elementos en el vector a travez de la suma de posicion como por ej vector+j
No sé si seguirás queriendo una explicación, pero aquí te dejo una: Básicamente "vector" contiene una direccion de memoria y al otorgarle el * es lo mismo que decirle "lo que hay dentro de", es decir, *(vector+1) devuelve lo que hay dentro de la la direccion de memoria almacenada en "vector" + 1. Porqué el +1? Porque cuando haces el malloc o creas un array, la memoria reservada está "alineada". La direccion de memoria de vector + 1 es la contigua a vector, y la de vector + 2, es la contigua la de vector +1...
Llevo un par de días buscando información al respecto y de verdad que el video me ha resuelto muchas dudas, ya que en mi caso tengo que hacer una estructura (fichas de clientes) los cuales no se cuantos pueden ser y a la vez una de las variables de la estructura serán facturas ( las cuales irán incrementando) al igual que la estructura de clientes. En mi caso el procedimiento sería igual? Pero en vez de disminuyendo incrementando con N++ ?
Creo que el tercer bucle que usas, no es necesario sólo podías aumentar la j a una posición más y luego refrescarla en el valor actual. Bueno eso pienso yo 😅 además estoy aprendiendo. Solo es mi opinión gracias👍👋
En el video de matrices dinamicas no pusiste un puntero en donde en este video en el minuto 7:00 dices que va, entonces nadamas se ponen en los tipos de datos? por ejemplo: si es una matriz dinamica **m1, se asignaria asi el valor?: m1 = (int**)malloc(tamaño*sizeof(int*)); no se le pone un puntero menos en esta parte que dandoasi: *m1 = (int**)ma...... ???
+Mihael Arce Baldo Para este tipo de cosas los simpsons lo explicaron muy bien: ua-cam.com/video/LhpPfkpOCDk/v-deo.html Ya fuera de bromas, es erróneo tal como yo lo hice, pero como lo que tu haces es reservar memoria, pues mientras que no reserves menos de la que ocupas, no debes de tener ningun problema, simplemente estas reservando espacio de mas que nunca va a ser utilizado. Otra posible explicación es que el compilador se de cuenta y optimice el tamaño, esto ultimo no lo puedo asegurar puesto que no se en detalle como funciona el compilador de C (existen varios diferentes y creeme que entender como funciona un compilador no es naaaaada sencillo). Un saludo.
una pregunta y espero me puedas responder por que en vez de poner el REALLOC no pusistes simplemente este codigo for(i = 0 ; i < E ; i++){ printf("%i, ",*(vec+i)); } printf(" ");
realloc asigna una nuevo valor al espacio de memoria asignado previamente al vector. Lo que expones en tu comentario es para mostrar por pantalla los valores asignados en el vector (printf) y NO para asignar nuevo espacio de memoria. (Ya se que pasaron >3 años, pero para no confundir al que lea su comentario).
Para usar realloc se tiene que ultilizar malloc primero por ley? osea q no se puede usar realloc cuando se asigna un vector con cantidad N de la manera tradicional?
Noop, siempre primero un malloc o calloc (en el siguiente video se explica) y despues se podra hacer un realloc... sino siempre usariamos un realloc xD!!
He hecho el programa y me tira un error de windows al ejecutar, copio mi codigo porque veo todo identico... a ver si alguien me ayuda: (El depurador me dice que el error salta en el bucle de impreson del vecotor redimensionado, pero no se por que, en el da un error de segmentacion) #include #include #include void aleatorio (int *vector, int N); int main(){ int i, j, k; int N = 10; int *vector; vector =(int*)malloc(N*sizeof(int)); //asigna un tamaño al vector dinamico if(vector == NULL){ printf("No se ha podido reservar espacio de memoria para el vector- "); } else{ aleatorio(vector, N); for(i=0; i
Ya he encontrado mis dos errore: 1-: en el segundo if puse: if(vector = NULL) en lugar de if(vector == NULL){ 2- if((vector+1)==(vector+j)) confundi la i con un 1 y solo me imprimia un termino la segunda vez if((vector+i)==(vector+j)) Todo ok!
No terminaste de explicar realloc, la verdad me desiluciono, porque seria bueno aprender C desde un canal tan completo, pero me gusta saber como funciona cada cosa y solo hiciste un ejercicio innecesario y no explicaste el funcionamiento de realloc.
Javi Pérez Cano Pues lo cierto es que es correcto, son 2 bytes o 16 bits.Aqui puedes leerlo en la wikipedia:en.wikipedia.org/wiki/C_data_types Un saludo.
En un par de días, me has resuelto dudas que ningún profesor me había dejado claras y por ello te doy las gracias. Eres muy bueno y procuraré seguirte en la medida de lo posible.
Un saludo y gracias por compartir estos videotutoriales.
La verdad que seria un placer tenerlo como profesor.
Con sus videos y sin interactividad con los visitantes, logra llegar a los puntos de ignorancia sobre el tema, que tenemos los que empezamos de cero.
Con sólo ver una vez cada video, pude lograr a la primera crear vectores y matrices dinámicas.
Con un nivel de complejidad alto para mi "NADA" de conocimientos.
Los videos anteriores me parecieron fáciles.
Se nota su experiencia con alumnos. Felicitaciones y gracias por compartir.
Quiero aprender a programar PICs en C.
Pero claro, primero tenía que aprender C y me topé con Ud. que se convirtió en uno mis profesores favoritos.
Saludos desde Buenos Aires...
Una pregunta, ¿para qué sirve el código que ya estaba? que habla de el por el min. 12:22.
@@atzayacatzintorres3888 El metodo "aleatorio" solo llena el vector con numeros aleatorios que pueden ser entre 0 y 2.
ya es tu profesor online en todo lo que sube a su canal jajaj
POR FIIIIIIIN ME HA SALIIIIIDOOOOOO. Por dios, he estado atascado, pensando que no entendia Malloc ni Realloc, pero NO, el problema era un error de escritura, casi me vuelvo loco. Por fin vuelvo a la carga a verme tus videos, esperate que en un par de meses, acabo este curso ;).
Muchas gracias por tus videos y mucho apoyo!!!
Me tomó varias horas y tratar de resolver el problema, lo hice primeramente con vectores, me costo bastante establecer la logica y en una parte en la q me travé recoorte 5 papelitos para verlo de una forma mas visual. ahi comprendi cosas q se me pasaban en la codificacion. Una vez teniendo clara la forma de operar procedi a realizarlo con punteros. pondre las dos resoluciones un poco orgulloso del logro mas q por ponerlo. Devo decir q al hacerlo con punteros salto q el algoritmo no funcionaba bien y tuve q volver a pensarlo una vez resuelto porsegui con punteros, cuando termine de hacerlo y continué viendo el video observe q las formas en q resolvimos el problema fue la misma. lo cual resulto muy interesante.
saludos emilio.
//Con vectores --------------------------------------------------
int main() {
int N=20, i, j;
int vector[N];
aleatorio(vector,N);
for (i=0; i
El warning es porque en la línea 15 te falto un puntero en el primer int osea tiene que ser
vector = (int*)malloc(N*sizeof(int));
ya lo tenias pero al explicar lo borraste, por cierto , gracias muy buen video
Venía a decir lo mismo. No podía prestar atención al resto del video. Me molestaba ese * que faltaba. 😜
ne
lo sabia
Excelentes tus tutoriales, super didácticos, gracias por compartirlos!
Cuando borraste los punteros de ejemplo del primer int le borraste los dos en lugar de dejar uno; por eso debe ser el warning, genial el vídeo, saludos.
Estan muy buenos los videos, me sirvieron mucho para programación y algoritmos. Lo que no me quedo muy claro es el algoritmo que diseñaste para comparar los elementos del vector (al comienzo del video cuando reescribís un valor sobre otro). Muy buen aporte para los estudiantes. Saludos..
Emilio tío esto es facilísimo, complícame la vida un poco.
pd: gracias por estos vídeos, están bárbaros
Cuando te pasas a Java y aprender la programación orientada a objetos veras el siguiente paso en la escala de complicación xD
explicas muy bien, quizás un poco difíciles los ejemplos pero muy bueno el curso en general.
muy claro para los q tienen ciertos conocimientos previos..pero para comenzar a progrmamar ...mmmmm!!!!
Este es el bloque 7.2, hay casi 40 videos previos, jejeje, esta pensado para enseñar solo que son el malloc y el realloc.
Un saludo.
si el usuario quiere asignar un valor a una posicion determinada del vector seria asi: scanf("%i", *(arreglo + i)); o me equivoco en algo?
esque me pidieron un codigo en la escuela pero no me sale y no encuentro el error:
#include
#include
int main(){
//FILE* archivo;
int i = 0, aux = 1, *arreglo;
char tecla;
//archivo = fopen("datos.txt", "w");
arreglo = (int*)malloc(aux * sizeof(int));
//if(archivo == NULL){
// printf("El archivo no fue creado");
// exit(-1);
//}
//else{
// printf("El archivo 'datos.txt' fue creado CORRECTAMENTE
");
//}
do{
printf("Ingrese un registro: ");
scanf("%i", *(arreglo + i)); // Segun yo aqui no debe de tener el & ¿o si?
printf("Quieres ingresar otro registro? (s = si, n = no): ");
do{
fflush(stdin);
scanf("%c", &tecla);
if((tecla != 's' && tecla != 'S') && (tecla != 'n' && tecla != 'N')){ // Para que solo pueda yngresar n, N, s y S
printf("%c", 07);
printf("Intente de nuevo: ");
}
}while((tecla != 's' && tecla != 'S') && (tecla != 'n' && tecla != 'N'));
if(tecla == 's' || tecla == 'S'){
arreglo = (int*)realloc(arreglo, aux++);
}
}while(tecla == 's' || tecla == 'S');
printf("
");
while(i < aux){
printf("%i, ", *(arreglo + i));
i++;
}
printf("
");
system("pause");
return 0;
}
Cuando haces el realloc no se lo deberias guardar en un auxiliar de la variable "vector" ? en caso de que no encuentre lugar y pierda los datos
gracias excelente ejemplo
Gracias por los videos
Un short int si ocupa 2 pero no es el caso. Un saludo
Javi Pérez Cano Realmente no puedo decirte porque el compilador da un numero u otro, puede que el compilador de Dev C++ no cumpla el estandar, pero lo que si que te digo seguro es que un int se concibio para que tuviese 2 bytes y que llegase al numero maximo de (2^16)/2, que son 32 mil y pico... prueba a meterle un numero mayor de 64mil, a ver que si almacena correctamente el numero.
Creo que esta es la mejor solucion para salir de dudas.
Un saludo.
Buenas,
Supongo que ya lo sabrás pero el Warning fue porque sin querer borraste el puntero del entero en el malloc del vector.
Saludos.
el warning segun wikipedia es porque antes de usar malloc debemos usar una funcion llamado casting. es.wikipedia.org/wiki/Malloc
Eso es en C++ .
cito:
" Se requiere el uso del casting en C++ debido al fuerte sistema de tipos, mientras que éste no es el caso de C."
(Ya se que pasaron >3 años, pero para no confundir al que lea su comentario).
Excelentes temas, tengo la siguiente pregunta.- Es recomendable usar realloc en caso de que el vector resultante es mas grande que el original?
Ugh no logro entender el codigo de cuando hay que eliminar los datos repetidos, me hace mucho ruido. No lo veo claro :(
Gracias pana.
Un dato INT no es de tamaño 4 bytes? aclrame esa duda bro, y muy buen video.
short int = 2 bytes = 16 bits.
Depende la arquitectura del SO
Mi mente explotó
Cuando escribis en el min 14:40 (* (vector+i) == *(vector+j)) que significa los *. Y como funcionan la busqueda de elementos en el vector a travez de la suma de posicion como por ej vector+j
No sé si seguirás queriendo una explicación, pero aquí te dejo una:
Básicamente "vector" contiene una direccion de memoria y al otorgarle el * es lo mismo que decirle "lo que hay dentro de", es decir, *(vector+1) devuelve lo que hay dentro de la la direccion de memoria almacenada en "vector" + 1. Porqué el +1? Porque cuando haces el malloc o creas un array, la memoria reservada está "alineada". La direccion de memoria de vector + 1 es la contigua a vector, y la de vector + 2, es la contigua la de vector +1...
Bueno te referías a vector + i, pero es el mismo principio
Llevo un par de días buscando información al respecto y de verdad que el video me ha resuelto muchas dudas, ya que en mi caso tengo que hacer una estructura (fichas de clientes) los cuales no se cuantos pueden ser y a la vez una de las variables de la estructura serán facturas ( las cuales irán incrementando) al igual que la estructura de clientes. En mi caso el procedimiento sería igual? Pero en vez de disminuyendo incrementando con N++ ?
Creo que el tercer bucle que usas, no es necesario sólo podías aumentar la j a una posición más y luego refrescarla en el valor actual. Bueno eso pienso yo 😅 además estoy aprendiendo. Solo es mi opinión gracias👍👋
7 años despues sigue salvando, deberias ser santo
Amigo tengo una duda para que sirve la libreria time.h Grasias por tus videos son muy buenos pero cada vez se ba poniendo dificil
para los numeros random
En el video de matrices dinamicas no pusiste un puntero en donde en este video en el minuto 7:00 dices que va, entonces nadamas se ponen en los tipos de datos? por ejemplo: si es una matriz dinamica **m1, se asignaria asi el valor?: m1 = (int**)malloc(tamaño*sizeof(int*)); no se le pone un puntero menos en esta parte que dandoasi: *m1 = (int**)ma...... ???
Y x que al
compilar imprime 4?
Por qué te compiló el programa si al primer (int) de la línea 15 no le pusiste (int*) como supuestamente se debe hacer?
+Mihael Arce Baldo Para este tipo de cosas los simpsons lo explicaron muy bien:
ua-cam.com/video/LhpPfkpOCDk/v-deo.html
Ya fuera de bromas, es erróneo tal como yo lo hice, pero como lo que tu haces es reservar memoria, pues mientras que no reserves menos de la que ocupas, no debes de tener ningun problema, simplemente estas reservando espacio de mas que nunca va a ser utilizado. Otra posible explicación es que el compilador se de cuenta y optimice el tamaño, esto ultimo no lo puedo asegurar puesto que no se en detalle como funciona el compilador de C (existen varios diferentes y creeme que entender como funciona un compilador no es naaaaada sencillo).
Un saludo.
Gracias :)
Alguien me podría guiar en la función void aleatorio que usa
una pregunta y espero me puedas responder por que en vez de poner el REALLOC no pusistes simplemente este codigo
for(i = 0 ; i < E ; i++){
printf("%i, ",*(vec+i));
}
printf("
");
realloc asigna una nuevo valor al espacio de memoria asignado previamente al vector.
Lo que expones en tu comentario es para mostrar por pantalla los valores asignados en el vector (printf) y NO para asignar nuevo espacio de memoria.
(Ya se que pasaron >3 años, pero para no confundir al que lea su comentario).
Para usar realloc se tiene que ultilizar malloc primero por ley? osea q no se puede usar realloc cuando se asigna un vector con cantidad N de la manera tradicional?
Noop, siempre primero un malloc o calloc (en el siguiente video se explica) y despues se podra hacer un realloc... sino siempre usariamos un realloc xD!!
Cierto! :D Gracias, exelente canal sigue asi!
En que video explicaba como crear un número random
6:13
cok iyi
A veces imprime 3 y otras veces imprime 1 o 2 valores (después de hacer realloc) ¿es normal?
a mi me hace exactamente lo mismo
No puede ser normal
Claro que sí es normal, para eso sirve el 'srand', para sacar un valor 'random', es decir, aleatorio.
macho
He hecho el programa y me tira un error de windows al ejecutar, copio mi codigo porque veo todo identico... a ver si alguien me ayuda:
(El depurador me dice que el error salta en el bucle de impreson del vecotor redimensionado, pero no se por que, en el da un error de segmentacion)
#include
#include
#include
void aleatorio (int *vector, int N);
int main(){
int i, j, k;
int N = 10;
int *vector;
vector =(int*)malloc(N*sizeof(int)); //asigna un tamaño al vector dinamico
if(vector == NULL){
printf("No se ha podido reservar espacio de memoria para el vector-
");
}
else{
aleatorio(vector, N);
for(i=0; i
Ya he encontrado mis dos errore:
1-:
en el segundo if puse:
if(vector = NULL)
en lugar de
if(vector == NULL){
2-
if((vector+1)==(vector+j))
confundi la i con un 1 y solo me imprimia un termino la segunda vez
if((vector+i)==(vector+j))
Todo ok!
@@xadrianc Increible lo que un solo signo puede hacer
A mi me pasó lo mismo
y si el primer elemento del vector es igual al ultimo? de donde saco el siguiente numero para reemplazar? ahí me mato ! Saludos
el van
ne
No terminaste de explicar realloc, la verdad me desiluciono, porque seria bueno aprender C desde un canal tan completo, pero me gusta saber como funciona cada cosa y solo hiciste un ejercicio innecesario y no explicaste el funcionamiento de realloc.
La explicacion es incorrecta. Un Int son 4bytes
Javi Pérez Cano Pues lo cierto es que es correcto, son 2 bytes o 16 bits.Aqui puedes leerlo en la wikipedia:en.wikipedia.org/wiki/C_data_types
Un saludo.
+Javi Pérez Cano El dato será incorrecto, pero la explicación, además de correcta me parece excelente!