• Viernes 3 de Mayo de 2024, 01:40

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - player_

Páginas: [1]
1
C/C++ / La variable local no se destruye?
« en: Martes 19 de Octubre de 2010, 14:50 »
Hola, tengo este pequeño fragmento de código:

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void funcion(int* &p)
  5. {
  6.  int local = 3;
  7.  
  8.  p = &local;  
  9. }
  10.  
  11. int main()
  12. {
  13.  int numero;
  14.  int *n = &numero;
  15.  numero = 2;
  16.  
  17.  funcion(n);
  18.  
  19.  cout << *n << endl;
  20.  cout << numero << endl;
  21.  system("PAUSE");
  22.  
  23.  return 0;  
  24. }
  25.  


Como podéis ver, creo un puntero en el main que apunta a una variable número y lo paso por referencia a la función.

Una vez dentro de la función, creo una variable local y hago que apunte a esa variable local.

Una vez que salgo de la función, la variable local (en teoría) se debería destruir, pero cuando imprimo el contenido del puntero nuevamente en el main, me da el valor que tenía la variable local dentro de la función.

Por qué el puntero me da el valor de la variable local de la función si se supone que se ha destruido al salir de la función y ya no existe?

Gracias.

2
C/C++ / Puntero this
« en: Miércoles 6 de Octubre de 2010, 23:10 »
Hola, me gustaría plantear algunas dudas acerca de lo que hace internamente el puntero this en el compilador con C++.

Por ejemplo tengo una clase cualquiera:

class MiClase
{
    private: int x;

    public:
             void GetX() const;
             void SetX(int x);
};

Imaginemos que yo creo un objeto de la clase MiClase llamado objeto.

Ahora en el main invoco al metodo GetX ----> objeto.GetX();

Pues bien, al ser el método:

void MiClase::GetX() const
{

}

el compilador internamente trata el puntero this de esta forma?

const MiClase *const this
ó de esta otra?
const MiClase *this

Creo que será de la primera forma no? Porque el puntero this siempre es constante (al hacer *const this indica que es un puntero constante que no puede cambiar de valor) y const MiClase indica que el objeto que invoca al método es de tipo MiClase y sus valores no son modificables.

Ahora al invocar al método SetX(int x) -----> objeto.SetX(5);

void MiClase::SetX(int x)
{

}

el compilador internamente trata al puntero this así?

MiClase *const this;

o así?

MiClase *this;

De nuevo pienso que será de la primera manera no? Porque volvemos a indicar que *const this es un puntero constante (no cambia de valor) y en este caso el valor del objeto que invoca al método sí se puede modificar.

A ver si estoy en lo cierto, sino os agradecería que me lo explicarais para tenerlo bien claro.

Gracias.

3
C/C++ / Función con & delante
« en: Sábado 18 de Septiembre de 2010, 12:07 »
Hola, es la primera vez que veo esto y me ha surgido la duda.

Por ejemplo, una función así:

int *ObtenerDireccionEntero(int num)

devolvería la dirección de memoria del entero que se pasa como parámetro, pero la función:


int &ObtenerDireccionEntero(int num)

qué devolvería?

Gracias.

4
C/C++ / Librería STL
« en: Jueves 16 de Septiembre de 2010, 18:56 »
Hola, podéis indicarme dónde conseguir la librería STL para C++?

Estoy usando ubuntu y como compilador el geany (parece que no la trae por defecto porque he hecho una prueba y no funciona).

Gracias.

5
C/C++ / Compilación
« en: Jueves 2 de Septiembre de 2010, 08:45 »
Hola, me piden que haga algo un poco extraño, a ver si me podéis guiar un poco.

Tengo un fichero .h con una clase y sus métodos.

Luego tengo un fichero .cpp con varios prototipos de funciones y el desarrollo de esas funciones.

Desde el .h, dentro de los métodos de la clase, tengo que hacer llamadas a esas funciones desarrolladas en el .cpp, entonces, como no están incluidas, el compilador me manda mensajes de error como que esas funciones no se han declarado.

Qué puedo hacer?

Gracias.

6
C/C++ / Búsqueda de caminos
« en: Viernes 27 de Agosto de 2010, 01:12 »
Hola, tengo un fichero de texto con un laberinto de este estilo que lo cargo en una matriz:

##############E######## ####
#  ##  # ####                  # #
#                               ########
########### #####S#########

Una vez cargado, quiero comprobar si existe un camino válido, es decir, que puedo llegar desde E(entrada) hasta S (salida) sin problemas. En este caso debería indicarme que sí, pero por ejemplo, en este otro:


##############E######## ####
#  ##  # ####               ###  ## #
#                            ##########
########### #####S#########

Debería decirme que no porque hay una '#' bloqueando la entrada, tampoco podría si bloquea la salida o hay símbolos '#' que cortan el paso entre la entrada y la salida en cualquier punto de la matriz.


La entrada y salida pueden estar en cualquiera de los bordes del rectangulo, asi que cada vez habra que buscar un camino distinto según la situación.

Tenéis algún ejemplo o link para hacer esto con algún algoritmo de búsqueda en amplitud o algo parecido?

Lo necesitaría en C o C++.

Gracias.

7
C/C++ / Copiar doble puntero C
« en: Lunes 23 de Agosto de 2010, 14:23 »
Hola.

Tengo dudas de si lo que hago es correcto.

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.   char **mat, **matAux;
  8.   int i, j;
  9.  
  10.  
  11.   //Reservo memoria para una matriz 5x5
  12.   mat = (char**) malloc(sizeof(char*) * 5);               //Creamos la matriz dinamica
  13.    
  14.       if(mat != NULL)
  15.       {
  16.           for(i=0 ; i < 5; i++)
  17.           {    
  18.               mat[i] = (char*) malloc(sizeof(char) * 5);            
  19.           }  
  20.       }    
  21.      
  22.       //La relleno de letras a
  23.       for(i = 0; i < 5; i++)
  24.       {
  25.           for(j = 0; j < 5; j++)
  26.           {
  27.               mat[i][j] = 'a';                      
  28.           }      
  29.                  
  30.       }
  31.                
  32.                
  33.         //Imprimo su contenido        
  34.         for(i = 0; i < 5; i++)
  35.         {            
  36.              for(j = 0; j < 5; j++)
  37.              {
  38.                  printf("%c", mat[i][j]);        
  39.              }        
  40.              
  41.              printf("n");
  42.         }  
  43.        
  44.         printf("n");
  45.         printf("n");
  46.         printf("n");
  47.        
  48.    
  49.    
  50.     //Reservo memoria para una matriz 10x10 en una matriz auxiliar
  51.     matAux = (char**) malloc(sizeof(char*) * 10);              
  52.    
  53.       if(matAux != NULL)
  54.       {
  55.           for(i=0 ; i < 10; i++)
  56.           {    
  57.               matAux[i] = (char*) malloc(sizeof(char) * 10);            
  58.           }  
  59.       }    
  60.      
  61.       //Libero la memoria de la 5x5
  62.       for(i=0 ; i < 5 ; i++)
  63.       {
  64.           free(mat[i]);
  65.       }
  66.       free(mat);
  67.  
  68.       //Hago que mat apunte a la matriz 10x10
  69.       mat = matAux;                
  70.        
  71.      
  72.       //Libero la memoria de matAux
  73.       for(i=0 ; i < 10 ; i++)
  74.       {
  75.           free(matAux[i]);
  76.       }
  77.       free(matAux);
  78.                  
  79.      
  80.       //Relleno la matriz de letras b
  81.       for(i = 0; i < 10; i++)
  82.       {
  83.           for(j = 0; j < 10; j++)
  84.           {
  85.               mat[i][j] = 'b';                      
  86.           }      
  87.                  
  88.       }
  89.                
  90.                
  91.       //La imprimo por pantalla
  92.         for(i = 0; i < 10; i++)
  93.         {            
  94.              for(j = 0; j < 10; j++)
  95.              {
  96.                  printf("%c", mat[i][j]);        
  97.              }        
  98.              
  99.              printf("n");
  100.         }  
  101.        
  102.                
  103.     system("PAUSE");
  104.     return 0;    
  105. }
  106.  
  107.  
  108.  

Lo que quiero hacer es crear una matriz dinamica "mat", crear una matriz auxiliar "matAux", liberar la memoria de "mat" creada anteriormente, hacer que "mat" apunte al mismo contenido que "matAux" y liberar la memoria liberada por "matAux".

Es correcto lo que he hecho? Es correcta la manera de hacer que "mat" apunte al mismo contenido que "matAux" haciendo mat = matAux;?

He puesto un ejemplo simplificado de un problema real que tengo, tengo una matriz "mat", más adelante cargo una nueva matriz dinamica "matAux", libero la memoria de "mat" y hago que apunte a "matAux" y finalmente libero la memoria de "matAux".

Si hago esto una vez, funciona bien, pero si vuelvo a hacer lo mismo, me da un error de ejecución, y realmente no sé si lo que estoy haciendo lo estoy haciendo bien.

Gracias.

8
C# / Imprimir ListView
« en: Domingo 2 de Mayo de 2010, 23:51 »
Hola a todos. Necesito imprimir el contenido de un ListView, tenéis algún ejemplo o podríais explicarme cómo?

Gracias.

9
C/C++ / No redondear números
« en: Lunes 22 de Febrero de 2010, 09:07 »
Hay alguna forma de que haciendo cálculos con valores double, el valor se almacene en una variable con los dígitos exactos del cálculo y no con el redondeo automático que hace?

Gracias.

10
Bases de Datos / VB y access
« en: Martes 6 de Octubre de 2009, 11:10 »
Hola a todos.
Tengo que crear una base de datos con access y a parte realizar un menú que me de acceso a la base de datos para poder dar de alta, modificar, eliminar...etc
Había pensado hacer ese menú en VB y conectarlo a la base de datos hecha con access.

La pregunta es la siguiente, pensáis que tiene mucha dificultad? Sería mejor hacer toda la aplicación con access y olvidarme de VB?

No tengo nada de experiencia programando con VB y tendría que ponerme desde cero, también aprovecho para pediros algún tutorial bueno sobre VB donde explique como declarar las variables, tipos de datos, bucles, funciones, estructuras...etc porque los que he visto por internet no me convencen demasiado.

Tengo tiempo para hacerlo tranquilamente y mi intención es la de aprender, por eso pregunto si vale la pena complicarse la vida o no.

Gracias.

11
C/C++ / array y puntero
« en: Domingo 27 de Septiembre de 2009, 22:13 »
Tenemos un array

int array[3] = {10, 20, 30};

para acceder al primer elemento mediante un puntero podemos acceder como *array, pero como accederiamos al segundo y tercero mediante un puntero?

Gracias.

12
C/C++ / return en función
« en: Domingo 16 de Agosto de 2009, 23:47 »
Si por ejemplo tengo una funcion con 3 parametros (uno de ellos pasado por referencia como si estuviera usando C++, ya sé que en C no se hace así) que devuelve un valor x declarado dentro de la función:

int Funcion (int a, int &b, int c)
{
int x;
-
-
-
return x;
}

como llamo a la función dentro del main para que me imprima ese valor devuelto?

main()
{
-
-
-
printf("El valor es que devuelve la funcion es %d", Funcion(a, b, c));
return 0;
}

lo hago así y no me sale, de qué forma se llama correctamente a la función?

13
C/C++ / Ordenar números de menor a mayor
« en: Domingo 12 de Julio de 2009, 00:22 »
Hola a todos. Estoy revisando este código que imprime un array y luego ordena sus números de menor a mayor, pero tengo una duda con este proceso. El código es el siguiente:

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define SIZE 10
  5.  
  6.  
  7. int main( void )
  8. {  
  9.  
  10.    int a[ SIZE ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
  11.    int pass;
  12.    int i;  
  13.    int hold;
  14.    
  15.    printf( "Data items in original ordern" );
  16.    
  17.    
  18.    for ( i = 0; i < SIZE; i++ ) {
  19.       printf( "%4d", a[ i ] );
  20.    }
  21.  
  22.    
  23.   for ( pass = 1; pass < SIZE; pass++ ) {
  24.  
  25.      
  26.      for ( i = 0; i < SIZE - 1; i++ ) {      
  27.  
  28.          
  29.          if ( a[ i ] > a[ i + 1 ] ) {  
  30.             hold = a[ i ];                  
  31.             a[ i ] = a[ i + 1 ];
  32.             a[ i + 1 ] = hold;
  33.          }
  34.  
  35.       }
  36.  
  37.     }/
  38.  
  39.    printf( "nData items in ascending ordern" );
  40.  
  41.    
  42.    for ( i = 0; i < SIZE; i++ ) {
  43.       printf( "%4d", a[ i ] );
  44.    }
  45.  
  46.    printf( "n" );
  47. system("PAUSE");
  48.    return 0;
  49.  
  50. }
  51.  
  52.  

La parte que está en negrita es la que me da dudas. Voy a depurarla hasta donde me pierdo:

 for ( pass = 1; pass < SIZE; pass++ ) {  EMPEZAMOS CON LA PRIMERA PASADA

  for ( i = 0; i < SIZE - 1; i++ ) {      

         
         if ( a[ i ] > a[ i + 1 ] ) {  
            hold = a[ i ];                  
            a[ i ] = a[ i + 1 ];
            a[ i + 1 ] = hold;


primer ciclo del segundo for     i=0; i<9; 0++
si a[0] es mayor que a[1] EN ESTE CASO NO, valor de a[0] almacenado, SEGUIMOS CON EL FOR


segundo ciclo del segundo for i=1; i<9, 1++
si a[1] mayor que a[2] EN ESTE CASO CIERTO, 6 es mayor que 4, SEGUIMOS
hold= a[1]
a[1]=a[2]
a[2]=hold        ahora hold tiene asignado el valor de a[2]

entonces, como quedaría el array en este momento?

{ 2, 4, ¿6?,} ó {2, 4} La verdad que no entiendo muy bien cómo la variable hold va almacenando los nuevos valores y sustituyéndolos o intercambiándolos en el array, a ver si alguien me lo puede explicar. Gracias!!

14
C/C++ / Dos while juntos
« en: Lunes 6 de Julio de 2009, 13:48 »
En el código anterior de dibujar un cuadrado con asteriscos, no se volvía al primer for hasta que j era mayor que columnas y se se hacían todos sus ciclos. Por qué en estos 2 while se vuelve al primer while si no se han cumplido los 10 ciclos de while (column <= 10)? A cada ciclo, sale de ese while, hace n y vuelve a entrar al primero, por qué no lo hace 10 veces seguidas y cuando 11<=10 y da falso sale de ahí, hace n y vuelve al primer while?

Y también quería preguntar, qué hace if (row % 2)? Al principio del todo row = 10, por lo tanto 10 % 2 = 0, entonces cómo es la condición? Si row % 2, qué más? Gracias.

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. main()
  6. {
  7.      
  8.       int row = 10, column;
  9.      
  10.       while (row >=1) {
  11.             column =1;
  12.            
  13.             while (column <= 10){
  14.             if(row % 2)
  15.             printf("<");
  16.             else
  17.             printf(">");
  18.            
  19.            ++column;
  20.             }
  21.            
  22.             --row;
  23.             printf("n");
  24.             }
  25.            
  26.             system ("PAUSE");
  27.             return 0;
  28.             }
  29.  
  30.  

15
C/C++ / Explicación de código
« en: Domingo 5 de Julio de 2009, 19:37 »
Alguien por favor me puede explicar por qué este código imprime el cuadrado con asteriscos y lo de dentro está vacío?

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main(void)
  6. {
  7.    int i, j, filas ,columnas;
  8.    
  9.    printf("Introduzca el numero de filas: ");
  10.    fflush(stdout);
  11.    if (scanf("%d", &filas) != 1)
  12.       return EXIT_FAILURE;
  13.    
  14.    printf("Introduzca el numero de columnas: ");
  15.    fflush(stdout);
  16.    if (scanf("%d",&columnas) != 1)
  17.       return EXIT_FAILURE;
  18.    
  19.    for (i = 1; i <= filas; i++){
  20.       for(j = 1; j <= columnas ; j++)
  21.          if (i == 1 || i == filas || j == 1 || j == columnas)
  22.             printf("*");
  23.          else
  24.             printf(" ");
  25.      
  26.       printf("n");
  27.    }
  28.    
  29.    system ("PAUSE");
  30.    return 0;
  31. }
  32.  
  33.  
He encontrado el código por internet y no consigo comprender el funcionamiento de los 2 for seguidos. No veo por qué el for hace que en la primera fila todo sean asteriscos, en las siguientes solo haya asteriscos en los laterales del cuadrado y lo de dentro esté vacío y en la ultima fila vuelva a aparecer toda la fila con asteriscos. Tampoco comprendo por qué filas pone asteriscos en filas y columnas pone asteriscos en columnas. Se agradecería una explicación del funcionamiento de estos 2 for juntos por pasos con algún ejemplo práctico que aclare la situación. Gracias!!!

Páginas: [1]