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 - snake_linux

#51
Cita de: ivancea96 en 25 Agosto 2015, 19:17 PM
La memoria puede o no ser del programa. Si accedes a memoria del programa, no dará error. Si accedes a memoria a la que tu programa no puede acceder, puede dar error. No es fijo. Depende de las circunstancias.

Entonces, para que sirve redimensionar la matriz, ¿ para reservale una cantidad de memoria que solo va a usar la matriz y que así no hayan fallos ?

Gracias y saludos.
#52
Bueno gracias a vuestra ayuda, he conseguido entender los arrays dinámicos, el caso es que he intentado crear un ejemplo de una matriz dinámica y redimensionarla.

La he redimensionado y funciona perfectamente, pero al redimensionarla, los 3 nuevos índices, cada subindices(punteros dentro de punteros), he hecho que sean de 30 elementos y no de 80, por lo que al referirme al elemento 35 me debería dar error, y no es así, funciona perfectamente,

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

void main() {

int **p;
p=(int **)malloc(sizeof(int *)*5);
int x;
for(x=0;x<5;x++){

p[x]=(int *)malloc(sizeof(int)*80);

}

p[3][45]=10;
printf("El numero guardado es %d\n", p[3][45]);

p=(int **)realloc(p, sizeof(int *)*8);
int y;
for(y=5; y<8; y++){

p[y]=(int *)malloc(sizeof(int)*30);

}
p[6][35]=25;
printf("Después de redimensionar %d\n", p[6][35]);

free(p);

}


¿ Por que no da error? ¿he redimensionado mal la matriz?:

Gracias de antemano, saludos.
#53
Cita de: ivancea96 en 25 Agosto 2015, 18:08 PM
Una matriz, no es más que un puntero que apunta a un array de punteros.
Así que una vez reservada memoria para el array de punteros, hay que reservar memoria para cada puntero. Eso lo haces con el for.

Gracias por la aclaración, ya me has resuelto la duda, gracias :)
#54
Cita de: ivancea96 en 25 Agosto 2015, 15:45 PM
Los punteros realmente, solo es eso, un apuntador a una dirección de memoria. Luego los usas como veas.

Pero sí, en general, pasar variables por referencia, arrays y matrices.

Lo único eso, una matriz:
int **matriz;
matriz = (int**) malloc(sizeof(int*) * 10);
int i;
for(i=0; i<10; i++)
    matriz[i] = (int*) malloc(sizeof(int) * 10);

matriz[1][8] = 66;


Así obtendrías una matriz de 10x10 dinámica. Realmente es lo mismo que un array, pero jugando con tipos. Ya ahí usas los punteros como quieras.

int *****matriz;
Disfruta rellenándolo con una matriz de 5 dimensiones xD

No me ha quedado claro el código que me has puesto, si con la segunda linea ya reservas espacio para una matriz, ¿ Para que es ese for ?.

Gracas.

Saludos.
#55
Cita de: ivancea96 en 25 Agosto 2015, 14:14 PM
Un array es un puntero. La diferencia es, que en evz de apuntar a 1 variable, apunta a un conjunto de variables, una delante de otra (en memoria).

No, no lo es. El primero tiene 10 chars de memoria. El segundo, solo es un puntero.
A nivel práctico sí, ambos son punteros. Pero para utilizar el segundo como puntero, tienes que reservarle memoria:

char *nombre;
nombre = (char*) malloc(sizeof(char) * 10);

Con eso, igualamos el puntero a una dirección de memoria que contiene 10 char.

Para acceder a cada uno, utilizas el operador []:
nombre[5] = 'C';

Si utilizas malloc para reservar memoria, luego tienes que liberarla:
free(nombre);

Entonces, una vez que has reservado la memoria necesaria para el char *, la única diferencia entré eso y crear un array de la manera clásica de char nombre[valor] es que la primera forma, se hace con memoria dinámica, por lo que puedo liberar ese espacio cuando quiera y además puedo incluso (por lo que he leido investigando) redimensionarlo sin perder los datos que tenía. ¿ Es así ?.

Aparte de lo que he puesto que se en el post, y junto con esto, ¿ No hay nada más sobre punteros ? Es que estoy investigando por internet de allí y allá y como veo la info "a cachos" no me entero.

Saludos y gracias.
#56
Programación C/C++ / Ayuda con punteros en C
25 Agosto 2015, 14:07 PM
Hola a tod@s, como sabeis estoy aprendiendo C, ya se lo básico pero me he puesto a aprender punteros y estoy hecho un lio, no son pocas las veces que he intentado aprender punteros en C y no lo asimilo ni por a ni por b.

Lo básico de punteros más o menos lo se, se que los punteros se declaran con:


tipo *var;


ej:


int *p;


El caracter & delante de una variable se usa para hayar la dirección de memoria de dicha variable, para después, guardarla en un puntero, ej:


int *p;
int a=5;
p=&a;


Y también se que el caracter * sirve para hayar el valor de lo que apunta un puntero, por ejemplo

int *p;
int a=5;
p=&a;
int b=*p;
printf("el valor de b es: %d\n", b);


Hasta ahí llego, el problema lo tengo en cosas más avanzadas, como cuando leo la relación que hay entre punteros y arrays, no acabo de entenderlo, por ejemplo he escuchado que un array es un puntero pero ya digo no me queda del todo claro como manejarlos.

Por ejemplo, no veo la diferencia entre un


char nombre[10];


de un:


char *nombre;


¿Es lo mismo?

También, si me pudieran explicar un poco los punteros (quitando lo básico que he puesto arriba que se) se lo agradecería muchísimo.

Saludos.
#57
Gracias por vuestros comentarios, me han servido bastante, de momento aprenderé C en profundidad, que me parece un lenguaje increible.

Saludos.
#58
Hola a tod@s, resulta que ya más o menos se lo básico de C (me falta entender bien los punteros) y me preguntaba si el siugiente lenguaje que debía aprender es C++, mi meta real, es aprender C, python y PHP, son los 3 lenguajes que más me interesan, pero por otro lado me llama mucho la atención colaborar en algún juego libre como Xonotic o Minetest, que están hechos en C++, además estoy viendo últimamente que casi todo se hace en C++ y es como si me sabiera mal no aprender C++ por que voy a estar un poco "de lado".

Por otro lado me da cosa aprender C++ por que entonces, junto con python y php serían 4 lenguajes... y no se, parece ya demasiado, y no se si me costaría mucho aprender C++ ¿ Sabiendo C me costaría mucho trabajo aprender C++ ? En caso negativo, me gustaría que me recomendaran un libro (en español) donde te enseñen C++ sabiendo ya C, es decir, que no empiece a enseñarte desde C.

Salu2.
#59
Cita de: engel lex en 24 Agosto 2015, 20:59 PM
dejo esto aquí

http://www.makigas.es/articulos/c-cpp/por-que-no-deberias-usar-scanf/

Gracias por el enlace, me ha servido de mucha ayuda, tanto para saber los inconvenientes de scanf como para ver como funciona internamente.

Saludos.
#60
Hola a tod@s, hago este post por no hacer dos y no ser tan pesado, el caso es que ya sé más o menos lo básico del maravilloso lenguaje C, pero los punteros aún no los manejo del todo bien y me gustaría que me recomendarais una buena lectura (en español) que expliquen bien los punteros, no solo lo básico si no también algo un poco más avanzado, pero empezando desde el principio.

Una segunda duda que tengo es que en un programilla que he hecho hace poco, scanf me deja \n en el buffer, y al volver a leerlo con fgetc (el stdin me refiero) pues fallaba por que leia ese caracter de más, lo solucioné usando fgets y eliminando el ultimo caracter del string con strlen (para eliminar de lo que había leido el \n).

¿ Qué opinan entonces sobre scanf()? ¿ Es aconsejable ? ¿ Es una mala práctica ? ¿ Es mejor usar fgets ? o si no es así ¿ cuando usar uno u otro ?.

Gracias de antemano.

Saludos.