Pasar Matriz a un vector y mostrarlo
//ya lo corregi,thank you, lo que no entiendo es por que no funciona cuando
//declaro arriba int matriz[M][N]; y si funciona cuando la pongo luego de
//la lectura de filas y columnas , me podrias decir please !
bien... pase por alto la pregunta pero vamos a ello.
cuando declaraste las variables int M,N,z,i,j;no le tenias dado un valor inicial, como por ejemplo un cero.
Al crear una variable a nivel de harware cuando haces int loquesea; estas pillando un trozo de memoria del tamaño para que quepa un int, eso son 4 bytes(puede variar), pero realmente no sabes que valor había tenido esa casilla antes. Es como cuando compras una casa vieja a la que los antiguos dueños se hayan ido y la dejaran lleno de trastos, simplemente compras la casa y no sabes que hay dentro. Otra cosa es hacer int loquesea = 0;, o puede que otro valor inicial, entonces en ese caso sí que sabes que hay dentro.Tú problema es que la memoria tiene residuos porque no sabes los valores de i y j antes de los scanfs, pero sí después, esos i y j pueden y deben tener residuos de otros programas que han liberado memoria antes, a la que luego has reservado con todo lo que había, si ese dato estuviera corrupto ni sabes el tamaño de la matriz, podría ser 0, 1, 1000 o bien 235132512541243532236452. Incluso puede tener algo incoherente que el programa no sepa representarlo.
Es buena practica dar un valor inicial siempre a todas las variables, ni que sea cero. ¡Recuerde eso!
Otra cosa... No puedes declarar una matriz de un tamaño fijo y cambiar el tamaño luego después. imajina un restaurante que vas comer con tu familia que siempre esta lleno, llamas por telefono y pides mesa para 4, luego allí te encuentras con un amigo en medio del camino y quieres cambiar, pero ya han rodeado tu mesa con otras mesas y no puedes agrandarla más por que no hay espacio, hay que trasladar a toda la familia a una nueva área del restaurante a una área más amplia. Eso se llama memoria dinámica, puedes usar realocar. Básicamente es como llamar al sirviente, pedimos mesa para 5 y trasladamos toda la familia a esa mesa más ancha. La memoria es física, no puedes expandirla pero si buscar una área más amplia, si la hay claro.
la forma correcta de crear una matriz es esta
const int fila 10;
const int columna 10;
int matriz[fila][columna];
Y te preguntarás... ¿Cómo le doy el tamaño que yo quiera?¡Simples, eso no se puede hacer! Pero como somos pesados seguiremos preguntando lo mismo, u te diré que se usa alocación dinámica de memoria, en otras palabras se usa malloc(memory allocator) que simplemente reserva, pero no da un valor inicial, o calloc que reserva y formatea ese espacio con nulos por ejemplo, luego hay que liberar memoria con free. En el caso de querer pedir otra mesa más grande esta realloc, que pide un trozo mayor de memoria y mueve todo a ese nuevo trozo. Así es la forma correcta de reservar memoria, es lo estándar, es la diferencia entre saber programar y hacer chapuzas informáticas, si trasladas ese código a cualquier ordenador tienes la garantía del estándar ISO de que sí te va funcionar. XDD
Debes buscar cómo reservar memoria dinámica, por que así es como se trabaja, si lo haces de la otra forma puedes que hasta pierdas un puesto de trabajo en una entrevista por ese "pequeño" detalle.
En fin, ya no te molesto más, solo quiero que lo sepas vamos, a mi también me choco por que me parecía muy cómodo de la forma que dices, hasta que tope con compañeros que ejercen de forma profesional y me lo explicaron que la forma correcta es memoria dinámica o declarar la matriz fila y columna como const para no poder pedir su tamaño posteriormente con scanf. Ahora bien, hay 2 caminos, supere de una vez y te adaptas, o siga tu vida toda programando de forma incorrecta, total, que más da, si me funciona seguiré utilizando esa forma ya que me funciona, pero si te falla el programa por cosas tan tontas como esa, imaginas que pasa cuando tienes un programa de 10k lineas al que escribiste tu en tu casa y lo llevas al curro para enseñar a tu jefe y resulta que no va jajajaja. Seria muy doloroso cambiar 10 mil lineas para que trabaje con punteros y memoria dinámica jajajaja. O bien puedes jurar a tu jefe que en tu casa si funciona dicho código jajaja.
venga suerte XDDD