elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 ... 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [70] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 ... 102
691  Programación / Programación C/C++ / Re: Ayuda C++ ID returned 1 exit status en: 2 Abril 2019, 10:22 am
Puede ser porque tengas abiertas dos ventanas donde estés ejecutando el mismo programa.
Si no es eso, coloca tú código porque no somos adivinos. Suerte :-X
692  Programación / Programación C/C++ / Re: como inicializar una matriz char** en: 2 Abril 2019, 00:45 am
Coloca el resto de tú código para que pueda ver el problema
693  Programación / Programación C/C++ / Re: como inicializar una matriz char** en: 1 Abril 2019, 22:27 pm
Imagino que te refieres a usando memoria dinámica. En ese caso el proceso es el siguiente, tanto en una función con parámetros como en el <main>:
Código
  1. int **matriz;
  2. int filas = 4, columnas = 4;
  3.  
  4. matriz = new int* [filas]; // reservamos memoria en el puntero para tantos punteros como filas tenga la matriz
  5. for(int i = 0; i < filas; ++i) // por cada fila
  6.    matriz[i] = new int [columnas]; // reservamos espacio para x columnas
  7.  
También se podría hacer al revés y crear punteros para cada columna y luego reservar filas pero se suele hacer así.
No olvides luego liberar toda la memoria dinámica que hemos reservado... Suerte :-X
694  Programación / Programación C/C++ / Re: Sumar las posiciones par de una cifra en: 31 Marzo 2019, 13:57 pm
Hola. Y si pruebas a hacerlo así?

#include <iostream>
using namespace std;

void suma_pos_pares(int n, int& suma, int& contador){
    while(n != 0){
      if(contador%2 == 0)suma += n%10;
      n /= 10;
      ++contador;
    }
}

int main(){
    int n;
    int suma = 0;
    int contador = 1;
    cin >> n;
    suma_pos_pares(n, suma, contador);
    cout << suma << endl;
}


 :D

Coloca tu código entre etiquetas de código GeSHi :-X

Es una forma de simplificarlo pero en la función <suma_pos_pares()>, el último parámetro creo que sobra completamente (ya que además hacer uso de el puede dar a errores al ser pasado por referencia) y el segundo parámetro también lo quitaría y que devuelva la suma la propia función. Imagina que usas la función esa 3 veces y olvidas poner el contador a 1 y la suma a 0 antes de cada ejecución; la primera ejecución sería correcta pero las dos siguientes, no.
Además la idea del contador para coger solo las posiciones pares funciona bien cuando lo piensas pero complica un poco más el código.

Para sumar las posiciones pares de un número, ¿qué necesitas saber? El número. Suficiente. Entonces podemos dejarlo así:
Código
  1. int sumarPosicionesPares(int numero){
  2.    int suma = 0;
  3.    while(numero != 0){
  4.        numero /= 10;
  5.        suma += numero % 10;
  6.        numero /= 10;
  7.    }
  8.    return suma;
  9. }
695  Programación / Programación C/C++ / Re: Uso de referencias con memoria dinámica [C++] en: 31 Marzo 2019, 13:47 pm
En tu línea 6 tienes declarado el puntero p, pero sin inicializar, no apunta a NULL
Tienes razón en esto. Fue fallo mío que pensé en asignarle NULL pero lo olvidé al estar pensando en el resto de la explicación :xD
Además no conocía la diferencia entre <NULL> y <nullptr> así que gracias también por ello.

¿ Por qué se dice que la macro NULL no es recomendada en C++ ?, he visto varias fuentes que afirman eso pero no logro entender el por que. Sé que la macro 'NULL' viene desde C y que representa el numero entero 0 y que 'nullptr' fue agregado en C++11 pero ¿ qué problemas puede conllevar el usar la macro 'NULL'. ?
Por lo que he leído yo es porque <NULL> equivale a un 0 de tipo <int>; mientras que <nullptr> equivale a 0 también (si muestras el valor puedes verlo) siempre sigue siendo de tipo puntero, como dice @Loretz es de tipo <nullptr_t>. Entonces se evita el uso de <NULL> porque puede dar errores de ambigüedad al cambiar el tipo de dato.

Como &p[0] y &p[1] son las direcciones consecutivas en memoria capaces de guardar sendos int(s), deben diferir en sizof(int*), ni más ni menos.
Es cierto que sus posiciones de memoria deben diferir en el tamaño del tipo de dato que puede almacenar. Pero como comenté, uso posiciones de memoria consecutivas y simples ya que lo que quería que se entendiese era ver de qué posiciones de memoria estamos hablando en cada momento.

Gracias por la respuesta ya que me diste la idea de probar el mismo programa para ver las posiciones de memoria que se utilizan. He añadido otra función para que se vea mejor el paso de un puntero por valor y por referencia.
Código
  1. int main(){
  2. int *p = nullptr;
  3. cout << "p esta en " << &p << " y su contenido es " << p << endl;
  4. reservarMemoria(p,2);
  5. p[0] = 1;
  6. cout << "p[0] esta en " << &p[0] << " y su contenido es " << p[0] << endl;
  7. p[1] = 2;
  8. cout << "p[1] esta en " << &p[1] << " y su contenido es " << p[1] << endl;
  9. anular(p,1);
  10. // cout << "p[1] esta en " << &p[1] << " y su contenido es " << p[1] << endl;
  11. }
  12.  
  13. void reservarMemoria(int *&v, int size){
  14. cout << "FUNCION RESERVAR MEMORIA (puntero por referencia)" << endl;
  15. cout << "v esta en " << &v << " y su contenido es " << v << endl;
  16. v = new int [size];
  17. }
  18.  
  19. void anular(int *v, int pos){
  20. cout << "FUNCION ANULAR (puntero por valor)" << endl;
  21. cout << "v esta en " << &v << " y su contenido es " << v << endl;
  22. v[pos] = 0;
  23. }

Al ejecutarlo obtenemos la siguiente salida (las posiciones de memoria depende de cada ejecución) donde podemos observar que coinciden los valores que comenté en mi anteior explicación:
Código:
p esta en 0x7fff4ce5ed50 y su contenido es 0
FUNCION RESERVAR MEMORIA (puntero por referencia)
v esta en 0x7fff4ce5ed50 y su contenido es 0
p[0] esta en 0x5650660fe280 y su contenido es 1
p[1] esta en 0x5650660fe284 y su contenido es 2
FUNCION ANULAR (puntero por valor)
v esta en 0x7fff4ce5ed38 y su contenido es 0x5650660fe280
En la función <reservarMemoria()> como se pasa el puntero por referencia se ve que la dirección de memoria de <v> (&v) es la misma que la de <p> (&p). Sin embargo en la función <anular()> como se pasa el puntero por valor, la dirección de memoria de <v> (&v) es distinta  a la de <p> (&p) aunque el valor que guardan que es la dirección de memoria de <p[0]> (&p[0]) en ambos casos, sí es la misma.
696  Programación / Programación C/C++ / Re: Sumar las posiciones par de una cifra en: 31 Marzo 2019, 13:01 pm
Algo tan tonto como lo siguiente:
Código:
numero = 1234
numero(1234) >= 0? Si
    ultima_cifra = 4
    numero = 123
    ultima_cifra = 3
    suma += ultima_cifra // 3
    numero = 12
numero(12) >= 0? Si
    ultima_cifra = 2
    numero = 1
    ultima_cifra = 1
    suma += ultima_cifra // 4
    numero = 0
numero(0) >= 0? Si
    ultima_cifra = 0
    numero = 0
    ultima_cifra = 0
    suma += ultima_cifra // 4
    numero = 0
numero(0) >= 0? Si...

Creo que ya te has dado cuenta del problema no?? :rolleyes:
697  Programación / Programación C/C++ / Re: Sumar las posiciones par de una cifra en: 31 Marzo 2019, 00:40 am
Te doy la idea para que le encuentres la utilidad. Hay una utilidad que se usa mucho cuando se trabaja con números de formas similares a esta que es:
Código
  1. int numero = 123456789;
  2. int ultima_cifra = numero % 10; // 9
  3. numero /= 10; // 12345678
Ahora puedes adaptar esta idea a tu necesidad.
Si te surge algún problema, envía tu código para que podamos ver dónde falla. Suerte :-X
698  Programación / Programación C/C++ / Re: Necesito pedir un número constantemente y con el 0 salir del programa en: 30 Marzo 2019, 23:05 pm
Eso lo puedes solucionar con un <while> de forma bastante sencilla, el esquema sería el siguiente:
Código
  1. // pides un numero
  2. while(numero != 0){
  3.    // haces lo que tengas que hacer con ese numero
  4.    // pides otro numero
  5. }
699  Programación / Programación C/C++ / Re: Modularidad en: 30 Marzo 2019, 22:10 pm
AQUÍ te dejo un enlace donde aparece un problema muy similar al tuyo.
Bueno más que similar es el mismo... Así que la respuesta es la misma también.

Y te recomiendo que no sigas abriendo temas nuevos para el mismo problema, si quieres responde en el que ya está creado para que no tengan que estar luego borrando temas repetidos. O especificas qué duda tienes o colocas tu código para ver cómo podemos ayudar. El programa no te lo vamos a dar hecho. Suerte  :-X
700  Programación / Programación C/C++ / Re: Uso de referencias con memoria dinámica [C++] en: 30 Marzo 2019, 18:44 pm
Después de darle unas cuántas vueltas creo que he llegado a una explicación. Si alguien ve algo raro o incorrecto que me lo comente para corregirlo ya que creo que puede servir para gente que tenga dudas con esto :-X
Voy a usar un ejemplo muy sencillo para explicar esto:
Código
  1. void anular(int *v, int pos){
  2.    v[pos] = 0;
  3. }
  4.  
  5. int main(){
  6.    int *p;
  7.    p = new int [2];
  8.    p[0] = 1;
  9.    p[1] = 2;
  10.    anular(p,1);
  11. }

En la línea 6, declaramos un puntero (almacena una dirección de memoria) <p> y hacemos que apunte a <NULL>. Vamos a suponer que se guarda en la posición de memoria 0x1 (voy a usar posiciones de memoria consecutivas para simplificar el ejemplo). Entonces quedaría así:
Código:
0x1(p) = NULL 

En la línea 7, reservamos memoria para guardar dos enteros. Suponemos que sus posiciones son 0x2 y 0x3 respectivamente y en las líneas 8 y 9 asignamos valores a esas posiciones. Entonces tenemos:
Código:
0x1(p) = 0x2
0x2(p[0]) = 1
0x3(p[1]) = 2

En la línea 10, llamamos a la función <anular()>, la cual recibe el puntero que almacena la dirección de memoria del primer elemento del array. Al ser pasado por valor, se copia el contenido de <p> en <v> (suponemos <v> en 0x4) y el 1 se copia en <pos> (suponemos 0x5). Entonces tenemos antes de ejecutar la función:
Código:
0x1(p) = 0x2
0x2(p[0]) = 1
0x3(p[1]) = 2
0x4(v) = 0x2
0x5(pos) = 1

Al ejecutar la línea 2, el contenido se modifica en el "array original" (que es siempre el mismo porque sólo tenemos uno). Esto es porque <v> almacena la misma posición de memoria que <p> (OJO: <v> no almacena la posición de memoria dónde se guarda <p>, sino la dirección de memoria que se guarda EN <p>).
Por eso para hacer cambios o acciones sobre el array en sí, no es necesario pasarlo por referencia, porque ambos punteros apuntan al mismo sitio.

Sin embargo, si tenemos esta alternativa:
Código
  1. void reservar(int *&v, int size){
  2.    v = new int [size];
  3. }
Y queremos reservar memoria, esto es una operación que se debe aplicar, siguiendo con el mismo ejemplo, sobre 0x1 (dirección en la que hemos guardado <p>), no sobre 0x4 (dirección en la que hemos guardado <v>). Al pasar por referencia la tabla de direcciones de memoria anterior quedaría de la siguiente manera:
Código:
0x1(p) = 0x2
0x2(p[0]) = 1
0x3(p[1]) = 2
0x1(v) = 0x2 (no hemos copiado el valor de <p> en otra direccion de memoria sino que usamos la direccion de memoria de <p>
0x5(pos) = 1
Y entonces ahora sí que podemos aplicar la orden de reserva sobre <v> ya que en realidad la estamos aplicando sobre <p> (realmente se lo estamos aplicando a la dirección 0x1).

Entonces mi conclusión es que el paso por referencia es para operar sobre la dirección de memoria DÓNDE está el puntero, no para operar sobre la dirección de memoria que está EN el puntero. Por lo que supongo que a efectos de "eficiencia", es lo mismo hacer un paso por referencia que por valor (en ambos casos pasamos únicamente una dirección de memoria, en un caso la dirección dónde está el puntero y en el otro, la dirección que guarda el puntero)


Espero que le sirva a alguien. :-X
Páginas: 1 ... 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [70] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines