matrices en c++ crash con algo basico en visualC++

Iniciado por newone, 28 Noviembre 2010, 19:15 PM

0 Miembros y 2 Visitantes están viendo este tema.

newone

hola volviendo al estudio del c++ esoty con matrices,
uzando visualc++ esto compila asi pero hace un crasHHHH

como debo hacerlo ?

void inicializar_matriz_int(int** m,int filas,int columnas, int dato)
{
for(int i=0; i<filas; i++)
{
for(int j=0; j<columnas; j++)
{
    m[i][j]=dato;//CRASHHHHHHHHH!!!!!
}
}
}


int main()
{
      int fecha_actualizada[32][3];
      inicializar_matriz_int((int**)fecha_actualizada,32,3,101);

      return 0;
}




APOKLIPTICO

Me parece que el problema está cuando le pasas la matriz a la función, le haces un cast (int**) probá poniendo ** atrás de la matriz.
Osea:
Código (cpp) [Seleccionar]
inicializar_matriz_int(**fecha_actualizada,32,3,101);
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.

Beakman

Eso funciona cuando es un puntero a puntero, una matriz dinámica.
Sería algo asi:
Código (c++) [Seleccionar]

int main()
{
      //int fecha_actualizada[32][3];
      int **fecha_actualizada = new int*[32];
     
      for( int x=0;x<32;x++ ) fecha_actualizada[x] = new int[3];
     
      inicializar_matriz_int( fecha_actualizada,32,3,101 );
     
      for( int x=0;x<32;x++ )
      for( int y=0;y<3;y++ )
      {
      cout << " Posicion " << x << " - " << y ;
      cout << " Dato: " << fecha_actualizada[x][y] << endl;
      }
     
      //libera memoria
      for(int x=0;x<32;x++)
      delete[] fecha_actualizada[x];
      delete[] fecha_actualizada;
      //libera memoria
      return 0;
}

¡Micronet!

Cita de: qily en 28 Noviembre 2010, 21:03 PM
Eso funciona cuando es un puntero a puntero, una matriz dinámica.
Sería algo asi:
Código (c++) [Seleccionar]

int main()
{
      //int fecha_actualizada[32][3];
      int **fecha_actualizada = new int*[32];
     
      for( int x=0;x<32;x++ ) fecha_actualizada[x] = new int[3];
     
      inicializar_matriz_int( fecha_actualizada,32,3,101 );
     
      for( int x=0;x<32;x++ )
      for( int y=0;y<3;y++ )
      {
      cout << " Posicion " << x << " - " << y ;
      cout << " Dato: " << fecha_actualizada[x][y] << endl;
      }
     
      //libera memoria
      for(int x=0;x<32;x++)
      delete[] fecha_actualizada[x];
      delete[] fecha_actualizada;
      //libera memoria
      return 0;
}



Hola que tal pense hacer otro tema pero esta vez me puse a investigar (por fin jeje) y me tope con este tema.. que tiene casi el mismo error que yo... mi problema esque queria intentar llenar una matriz. de la siguiente manera en C++:

#include<iostream>
using namespace std;
int main (){
//Enteros
int e,r,s,f,i=0,j=0,x=0,y=0;
              int **mat= new int*[50];   ////Utilizando tecnica de qily
//Pide Valores de Matriz 1
cout<<"Valores: "<<endl;
cout<<"Numero de filas: "; cin>>e;
cout<<"Numero de columnas: "; cin>>f;
//Lleno matriz
for(i=0;i<e;i++){
for(j=0; j<f; j++){
mat[i][j]=rand()%100;      ///////"ERROR"
}
}
//Muestro matriz
for(i=0;i<e;i++){
for(j=0; j<f; j++){
cout<<mat[i][j]<<" ";
}cout<<endl;
}
system("pause");
return 0;
}


ya que despues de esto quiero utilizar esa misma matriz para hacer la suma de matrices

Cij= Aij+Bij

este programa ya lo tengo impreso desafortunadamente y... lo tengo en DevC++...

pero lo quiero pasar a C++


Preguntas:

  int **mat= new int*[50];         
me podrias explicar que se esta haciendo en este pedazo de codigo.  :-[


mat[j]=rand()%100;      ///////"ERROR"
Entonces si esto esta incorrecto como haria para rellenar la matriz en c++ ¿?


"La Tarea No Se Hace, Pero No Indica Que No Se Ayude Al Estudiante"

leogtz

Te da error porque no estás incluyendo la librería adecuada para rand(), dicha librería se encuentra en <cstdlib>

#include <cstdlib>

Lo que preguntas es sobre asignación dinámica de memoria, se crea espacio en memoria primero para las filas, te falta asignar espacio para las columnas.

Código (cpp) [Seleccionar]
signed int **matriz = new int *[filas];                         // Filas.
    for(unsigned int i = 0; i < filas; i++)
    matriz[i] = new int[columnas];                              // Columnas.


Y por supuesto hay que liberar la memoria, para evitar memory leaks.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

¡Micronet!

Cita de: Leo Gutiérrez. en 26 Diciembre 2010, 20:11 PM
Te da error porque no estás incluyendo la librería adecuada para rand(), dicha librería se encuentra en <cstdlib>

#include <cstdlib>

Lo que preguntas es sobre asignación dinámica de memoria, se crea espacio en memoria primero para las filas, te falta asignar espacio para las columnas.

Código (cpp) [Seleccionar]
signed int **matriz = new int *[filas];                         // Filas.
    for(unsigned int i = 0; i < filas; i++)
    matriz[i] = new int[columnas];                              // Columnas.


Y por supuesto hay que liberar la memoria, para evitar memory leaks.







#include<iostream>
#include <cstdlib>
using namespace std;
int main (){
//Enteros
int e,r,s,f,j=0,x=0,y=0;
          signed int **mat= new int *[50];   ////Utilizando tecnica de qily
//Pide Valores de Matriz 1
cout<<"Valores: "<<endl;
cout<<"Numero de filas: "; cin>>e;
cout<<"Numero de columnas: "; cin>>f;
//Lleno matriz
for(unsigned int i=0;i<e;i++){
mat[i]=new int *[50];   <<error
//a value of type"int **" cannot be assigment to an entity            <<error
//of type "signed int *"                                                             <<error
for(j=0; j<f; j++){
mat[i][j]=rand()%100;      ///////"ERROR"
}
}
//Muestro matriz
for(unsigned int i=0;i<e;i++){
for(j=0; j<f; j++){
cout<<mat[i][j]<<" ";
}cout<<endl;
}
system("pause");
return 0;
}
   




bueno use el codigo q me dijiste y masomenos como haya entendido
me salen esos errores.. y si lo de rand si fue por la libreria no me acordaba..

"La Tarea No Se Hace, Pero No Indica Que No Se Ayude Al Estudiante"

leogtz

Cita de: ¡Micronet! en 27 Diciembre 2010, 18:25 PM






#include<iostream>
#include <cstdlib>
using namespace std;
int main (){
//Enteros
int e,r,s,f,j=0,x=0,y=0;
          signed int **mat= new int *[50];   ////Utilizando tecnica de qily
//Pide Valores de Matriz 1
cout<<"Valores: "<<endl;
cout<<"Numero de filas: "; cin>>e;
cout<<"Numero de columnas: "; cin>>f;
//Lleno matriz
for(unsigned int i=0;i<e;i++){
mat[i]=new int *[50];   <<error
//a value of type"int **" cannot be assigment to an entity            <<error
//of type "signed int *"                                                             <<error
for(j=0; j<f; j++){
mat[i][j]=rand()%100;      ///////"ERROR"
}
}
//Muestro matriz
for(unsigned int i=0;i<e;i++){
for(j=0; j<f; j++){
cout<<mat[i][j]<<" ";
}cout<<endl;
}
system("pause");
return 0;
}
   




bueno use el codigo q me dijiste y masomenos como haya entendido
me salen esos errores.. y si lo de rand si fue por la libreria no me acordaba..

Mal, sigues teniendo errores, el código que te puse fue para que lo copiaras y pegaras, donde ponía filas debías poner tu variable que usaste para las filas, igual para las columnas.

Otra cosa, ¿por qué le pones nombres a las variables como e -> filas, f -> columnas?, los nombres para las variables deben ser especificos para lo que quieres hacer, para el contexto del programa, ayudate a ti mismo.



Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <ctime>
using std::cout;
using std::endl;
using std::cin;
int main(void)
{
    signed int filas;
    signed int columnas;

    srand(time(0));

    std::cout << "Filas : ";
    cin >> filas;
    std::cout << "Columnas : ";
    cin >> columnas;

    // Asignar espacio a la matriz:
    signed int **matriz = new int *[filas];                         // Filas.
    for(unsigned int i = 0; i < filas; i++)
    matriz[i] = new int[columnas];                              // Columnas.

    // Asignar valores a la matriz
    for(unsigned int i = 0; i < filas; i++)
    {
        for(unsigned int j = 0; j < columnas; j++)
        {
            matriz[i][j] = rand() % 100;
            cout << matriz[i][j] << " ";
        }
        cout << endl;
    }

    // Liberar el espacio de la matriz
    for(unsigned int i = 0; i < filas; i++)
    delete[] matriz[i];

    delete[] matriz;
    return 0;
}
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

¡Micronet!

Cita de: Leo Gutiérrez. en 27 Diciembre 2010, 18:56 PM

Otra cosa, ¿por qué le pones nombres a las variables como e -> filas, f -> columnas?, los nombres para las variables deben ser especificos para lo que quieres hacer, para el contexto del programa, ayudate a ti mismo.



La verdad no ce... normalmente uso extras para trabajar mejor aunque se que
hago uso inecesario de memoria... pero intentare no hacerlo muchas gracias leo... logre lo que queria hacer en C++ =]


Suma La matriz con la misma matriz las veces que quieras (por si se le es util a quien tubo el problema desde un inicio  ;) :

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(void)
{
    signed int filas;
    signed int columnas;

    srand(time(0));

    std::cout << "Filas : ";
    cin >> filas;
    std::cout << "Columnas : ";
    cin >> columnas;

    // Asignar espacio a la matriz:
    signed int **matriz = new int *[filas];                         // Filas.
    for(unsigned int i = 0; i < filas; i++)
    matriz[i] = new int[columnas];                              // Columnas.

    // Asignar valores a la matriz
    for(unsigned int i = 0; i < filas; i++)
    {
        for(unsigned int j = 0; j < columnas; j++)
        {
            matriz[i][j] = rand() % 100;
            cout << matriz[i][j] << " ";
        }
        cout << endl;
    }
cout<<endl<<endl;

cout<<"Cuantas Veces quieres hacer la suma de tu matriz ";
int numv; cin>>numv; int ini=1;
while(ini<=numv){
//Sumando matriz
  for(unsigned int i = 0; i < filas; i++)
    {
        for(unsigned int j = 0; j < columnas; j++)
{
matriz[i][j]= matriz[i][j]+ matriz[i][j];
  cout << matriz[i][j] << " ";
}cout<<endl;}
  ini+=1;cout<<endl<<endl;
}
    // Liberar el espacio de la matriz
    for(unsigned int i = 0; i < filas; i++){delete[] matriz[i];}

delete[] matriz;
system ("pause");
    return 0;
}

"La Tarea No Se Hace, Pero No Indica Que No Se Ayude Al Estudiante"