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ú

Temas - digimikeh

#46
Hola!

Me parece extraño que tenga que definir una función friend anteponiendo el espacio de nombre si se supone que lo dejé estipulado al principio:

Código (cpp) [Seleccionar]

//Persona.h

namespace Agenda{
  class Persona{
     
     int edad;
     friend int f_obtenerEdad();

  };
}


Código (cpp) [Seleccionar]

//Persona.cpp
#include "Persona.h"
using namespace Agenda;

int f_obtenerEdad(Persona & _p){
  return _p.edad;          //Error, edad es privado
}



En cambio, si lo hago asi:
Código (cpp) [Seleccionar]

//Persona.cpp
#include "Persona.h"
using namespace Agenda;

int Agenda::f_obtenerEdad(Persona & _p){
  return _p.edad;         //Esto lo asimila correctamente
}



Tenía entendido que si yo escribía "using namespace X", no era necesario llamar a los miembros de un objeto usando X:: , pero en este caso del friend no se cumple, por qué será?

Gracias..
#47
Que tal..

Este error sinceramente no le hallo lógica, imagino que debe ser un tipo de política de c++...

Código (cpp) [Seleccionar]


void FuncionA(int indice){

     switch (indice){

          case 0:
               int edad = 0;        //Error C2360
               //hacer otra cosa...

          case 1:
               //hacer otras cosas...

     }

}



Código (cpp) [Seleccionar]


void FuncionA(int indice){

     switch (indice){

          case 0:
               int edad;       
               edad = 0;       //Esto no da error

          case 1:
               //hacer otras cosas...

     }

}



Debo declarar siempre sin definir una variable cuando entro al cuerpo de un case ?

#48
Programación C/C++ / c++ bajo nivel
25 Febrero 2019, 17:50 PM
Hola, es posible acceder al hardware de video usando c++ o necesito implementar asm?

Algún ejemplo de bajo nivel que me puedan dar? (no de video, sino de cualquier cosa)
Eso es más que nada para ver que tan bajo nivel puede llegar c++
Gracias
#49
Según he venido entendiendo hasta ahora, si yo creo un puntero, éste intenta localizar memoria en el espacio dinamico.... estos espacios de memoria deben ser liberados, pero que pasa en el siguiente caso?

Código (cpp) [Seleccionar]

void Persona::IngresarNombre(const char * nombre){
    strcpy(this->nombre, nombre);
   
    delete nombre;   //Es esto necesario?
}



Que sucede con ese puntero a char que está como parámetro?, se elimina solo o yo debo eliminarlo también?

o es mejor idea esto?:

Código (cpp) [Seleccionar]

void Persona::IngresarNombre(const char nombre[16]){
    strcpy(this->nombre, nombre);
}

Gracias.
#50
Código (cpp) [Seleccionar]


int main (){

       int * numero = new int[49];
       numero[151] = 750;
       std::cout << numero[151] << std::endl;   //esto imprime 750 sin problemas...


       return 0;
}


Como verán, estoy creando un puntero con una dimensión de 49 espacios de memoria del tipo int, luego estoy asignando un valor a un indice que está mas allá del rango (49) y luego lo imprimo en pantalla....  lo curioso es que me funciona, por que ?... es que acaso es lo mismo declarar:

Código (cpp) [Seleccionar]

int * numero = new int[49];


que

Código (cpp) [Seleccionar]

int * numero = new int;


que opinan?..
Saludos..
#51
Hola!

Estoy intentando crear una agenda y me he topado con algo que me parecio extraño:

Código (cpp) [Seleccionar]

//Persona.h
class Persona{

       int edad;

public:
       Persona() : edad(60){};
       int LeerEdad() const {
              return this->edad;
       }

};


Código (cpp) [Seleccionar]

//main.cpp
#include <iostream>
#include "Persona.h"

Persona * personas;

int main (){
       
       personas = new Persona;

       std::cout << personas->LeerEdad() << std::endl   //Esto imprime 60

       std::cout << personas[0].LeerEdad() << std::endl //Esto imprime 223525

       return 0;

}


Me parecía haber leido en alguna parte que personas y personas[0] apuntaban al mismo segmento de memoria..... pero están imprimiendo dos valores diferentes... No son lo mismo?  El uso que quiero darle a "personas" es el de un arreglo.


Saludos y gracias.
#52
Buenas amigos..

Tenía entendido que la palabra reservada "friend" permitía acceder a todas mis variables privadas de mi clase desde fuera, es como una excepción a la regla, para friend sería todo publico.

He querido utilizar el operador sobrecargado << para que mi clase pueda ser impresa por la salida estándar.

Esto es lo que tengo:

Código (cpp) [Seleccionar]

//Persona.h
#include <iostream>

class Persona{

    char * nombre;
    int edad;

public:

    Persona();
    ~Persona();
   
    //La siguiente linea da error si no coloco la palabra friend al principio
    std::ostream & operator<<(std::ostream & os, Persona & _estaPersona);
    char * LeerNombre() const;
    int LeerEdad() const;
     void InsertarNombre(const char * _nuevoNombre);
     void InsertarEdad(const int _nuevaEdad);

};



Código (cpp) [Seleccionar]

//Persona.cpp

#include "Persona.h"

using namespace std;

//Sobrecarga operador
ostring & operator<<(ostring & os, const Persona & _estaPersona){
    os << "Nombre : " << _estaPersona.LeerNombre() << endl;
    os << "Edad     : " << _estaPersona.LeerEdad() << endl;
    return os;
}

char * Persona::LeerNombre(){
    return nombre;
}

int Persona::LeerEdad(){
    return edad;
}

void Persona::InsertarNombre(const char * _nuevoNombre){
    strcpy(nombre, _nuevoNombre);
}

void Persona::InsertarEdad(const int _nuevaEdad){
    edad = _nuevaEdad;
}



Código (cpp) [Seleccionar]

//main.cpp
#include Persona.h

int main (){
    Persona p;
    p.InsertarNombre("ElHacker");
    p.Edad(37);
   
    std::cout << p << endl;
}


Lo que no entiendo, es que según la definición de friend, esto no me calza, yo no quiero acceder desde fuera a una propiedad privada, solo estoy intentando acceder a LeerNombre() y LeerEdad() que son publicas, no debería necesitar colocar friend... es que acaso friend con el operador trabaja de forma distinta?

Gracias de antemano.
#53
Hola!
Me he topado con el siguiente escenario:

Código (cpp) [Seleccionar]


//En este fragmento al terminar la función, se destruye el contenido de suma y retorna null o vacío, y el puntero suma sigue existiendo en memoria....
int RetornaUnaSuma(int a, int b){

    int * suma = new int;
    *suma = a+b;
    return *suma;
}

//Aqui intento retornar un puntero creado dentro de la misma función...
int * RetornaUnaSuma(int a, int b){

    int * suma = new int;
    *suma = a+b;
    return suma;

    //pero al terminar la función, se destruye el contenido y retorna una dirección de memoria sin contenido, el puntero sigue existiendo..
}



Según yo es mala práctica declarar punteros que quieras retomar dentro de una función o un ámbito...  bueno aparte de mala practica no funciona el retorno...Es como lo pienso?...

Probablemente se pueda devolver punteros cuando éstos mismos ingresan como argumento...

La función sería:

Código (cpp) [Seleccionar]

//Segun yo esto debe funcionar...
int * RetornaUnaSuma(int * pSuma, int a, int b){

    *pSuma = a+b;
    return pSuma;

}



Que opinan...
Saludos.
#54
Hola amigos..

pues tal como se lee en el título, seguramente me creerán idiota o algo por el estilo (asumo que es muy probable que sea así después de hacer esta pregunta)..

Creí que los punteros tenían un poder enorme en la programación, referencia memoria en vez de valor, supuse que era la opción perfecta para interactuar con muchos datos, pero después de ver que los arreglos y matrices internamente se procesan como punteros (pues son las reglas que conozco al menos de manejar mucha información) no le hallé mas sentido a los punteros, es decir... si tengo :

Código (cpp) [Seleccionar]


int numero = 5;

void ConsultarNumero(){
   cout << "Numero es : " << numero << endl;
}

void ModificarNumero(){
    numero = 6;
}

void SumarUnoAlNumero(){
     numero++;
}



En vez de :

Código (cpp) [Seleccionar]


int main (){
   int * numero = new int;
   *numero = 5;
   consultarNumero(numero);
   modificarNumero(numero, 6);
   sumarUnoAlNumero(numero);

}

void consultarNumero(int * _numero){
     cout << "El numero es : " << *_numero << endl;
}

void modificarNumero(int * _numero, int _nuevoNumero){
    *_numero = _nuevoNumero;
}

void sumarUnoAlNumero(int * _numero){
    *_numero++;
}





Como verán, simplemente reemplacé el puntero por una variable global, de todas formas sin puntero estoy accediendo a una variable compartida sin la necesidad de consultar su memoria...

Alguien me podría guiar sobre el uso de punteros?
Gracias de antemano.
#55
Hola señores..
Estoy intentando entender la sintaxis de Unreal.. y me topé con esto que no tengo claro:

Código (cpp) [Seleccionar]

UBoxComponent * caja = CreateDefaultSubmesh<UBoxComponent>(TEXT("Cubo"));


lo que va entre < > no me queda claro que cosa es, obviamente es una clase pero por qué va entre signos mayor y menor que... y que sería CreateDefaultSubMesh ?

Gracias.
#56
Hola amigos.

Tengo una alternativa para comprimir y descomprimir archivos desde el codigo, pero es algo bruta, simplemente usando la funcion system();  donde el parámetro es la linea de comando para comprimir o descomprimir:

Código (cpp) [Seleccionar]

system("gzip archivo.txt");
system("gzip -d archivo.txt");


Sin embargo, no se, algo me dice que no debo hacerlo asi, o quiza me persigue la idea de que debo aprender a toda costa a hacerlo usando librerias como zlib o 7zip...

Algun ejemplo de como comprimir o descomprimir?.. imagino que tengo que usar la clase FILE

Gracias de antemano.
#57
He estado buscando distintas formas de convertir de int a float, char* a string, char* a int, char* a float, string a float.. o cualquier otra que se venga en mente, hay varias funciones que hacen esto:

atoi()
stoi()
to_string()
etc...

Sin embargo, me encontré con que se puede hacer cualquier tipo de conversión usando stringstream:

Código (cpp) [Seleccionar]

stringstream ss;
int numero;
string strNumero = "5";
ss << strNumero;
ss >> numero;


Hacer esto es extremadamente fácil, sin hacer un tipo de cast o invocar alguna función extra, y funciona...  La duda es, hay alguna restricción de conversión para stringstream?

Gracias.
#58
Buenas.

Estoy practicando C++ en 3 equipos, dos de ellos son OSX y otro es Xubuntu Linux, comparto mi aprendizaje entre los computadores usando git, así que actualizo el código cada vez que me cambio de equipo.

El problema en concreto es que en osx, al llegar a cierta parte del programa, se cierra mostrándome el mensaje "Bus Error : 10", cosa que no sucede cuando lo compilo y lo ejecuto en linux, me da la espina que puede ser algo del compilador, en ambos ejecuto la misma sentencia para compilar:

$c++ -o programa programa.cpp

Tengo identificada la linea que me manda ese error, está relacionada con la función
strcpy();

Tengo entendido que el error se refiere a que estoy invocando o asignando un valor a un indice que no existe o que tiene un formato incorrecto.  Pero de ser así, linux también debería botarme el programa..

El programa esta aqui:

https://paste.ofcode.org/BYUkcz7MFesBRRFyXjNCGg
Linea 352 específicamente.


*** EDIT ***
----------------

indiceAlumnoSeleccionado equivale a -1 al momento de usar strcpy, y eso marca el error de Bus Error 10, es lógico!, pero, por qué en linux me lo permite?..

*** EDIT 2 **
----------------

Linux permite la ejecución pero funciona mal, bueno, ya tengo identificado el problema, pero sería bueno si alguien sabe, me pueda explicar por qué los compiladores se comportan así, mi programa tenía un error y el compilador del Linux lo omitió...
#59
Buenas

Cuando estamos dentro de una funcion y llamamos a otra  que pasa en la ejecucion?

Ejemplo:

Código (cpp) [Seleccionar]

Void sumar(){
     // hace una cosa 1
     // hace otra.cosa mas 2
     MostrarMenuPrincipal();
     // hace otra.cosa 3
     // hace 4

     Int valor;
     std::cout << "ingrese valor: ";
     Std::cin >> valor;

     Switch (valor){
         case 1:
               Cout << "es uno ";
               Break;
      }
}

Void MostrarMenuPrincipal(){
       // hace otras cosas 5
}


Que sucede?
1. Cuando se ejecuta la funcion sumar() va a llegar hasta la llamada a la funcion MostrarMenuPrincipal() y esperara a que esa funcion devuelva un valor o termine, por lo que la linea «hacer otra.cosa 3» no sera ejecutada al intante...

2. Cuando se ejecuta la funcion sumar() va a llegar hasta la llamada a la funcion MostrarMenuPrincipal() y al instante continuara paralelamente ejecutando ambas funciones....

Les pregunto esto ya que en un programa de practica que realice ayer me paso algo extraño, cuando la funcion que llamaba dentro de otra tenia un menu y una interaccion con el usuario mediante cin, la ejecucion de la funcion anterior (en este caso.sumar() ) no se ejecutaba mas quedaba bloqueada por la llamada a la nueva funcion, sin embargo, si esta nueva funcion no.tenia cin, la ejecutaba y luego volvia a la funcion anterior..

#60


Hola!, no me hace lógica ver que "cin >> respuesta", el programa al llegar a esa instancia pasa de largo como si nada..

Bajo qué circunstancias pasan estas omisiones ?

Saludos y gracias..



Ya esta, acabo de entender como funciona...
Si el objeto cin intenta guardar un valor tipo entero y yo le paso un flotante, el siguiente objeto cin será omitido..

En mi caso, el "cin >> respuesta" no estaba siendo leído porque el ingreso del cin anterior guardaba el ingreso como int, pero yo le estaba ingresando float mientras lo ejecutaba... es decir, la matriz TablaAsigNotas es de tipo INT, y en consola yo ponía valores flotantes...

Curiosa la forma en como trabaja el flujo de entrada con el buffer..

Gracias de todas formas..

MOD: Imagen adaptada a lo permitido. No hacer doble post. Usa el botón modificar.
#61
Hola a todos..

Yo programaba en C# y no es para nada difícil, al pasar a C++ vi que ambos lenguajes compartían muchas cosas, la forma en que se declaran las variables, los bucles, en general la sintaxis es muy similar, y ambos son orientados a objetos..... hasta ahora, no he encontrado tan difícilmente el C++ llevo un año estudiándolo, entiendo que me falta mucho por aprender pero, quizá sea que C# me sirvió como base ? .. puede ser...

Pero por qué la gente le tiene tanto terror a C++ ?, qué es lo que piensan ustedes que es lo mas complicado, lo que te hace dejar C++, lo que puede desanimarte?, no croe que sean los punteros, si bien tienen una lógica un tanto compuesta, no son difíciles de aprender si entiendes como se maneja la memoria.. debe haber algo mas?..

Saludos.
#62
Hola amigos.

Una consulta, yo tengo entendido que en C++ los arreglos son como punteros, es decir, se apunta a la posición de memoria del primer indice en adelante hasta donde termina el array en la cantidad de bytes que ocupa por el tipo... vale

Que sucede en este caso ?


int main (){
int misNumeros[] = {0, 4, 1, 8, 3, 9};
OrdenaMayorAMenor(misNumeros);
}

void OrdenarMayorAMenor(int números[]){
//..blablabla

}


Que estoy haciendo aquí?.. estoy copiando el valor (duplicando el vector) ?
como puedo optimizar el uso de la memoria?.. puedo usar referencia o puntero aquí en el parámetro?

gracias.
#63
Hola..

cuando yo escribo:


char vocal = 'a';
cout << &vocal;


Esto me sigue arrojando el valor y no la dirección...