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 - edr89

#1
Java / NullPointerException al abrir ventana
6 Diciembre 2015, 04:23 AM
Hola, buen día.

He buscado un poco acerca del error y todo apunta a que en alguna parte del código deberia haber un objeto pero se encuentra con un null y la aplicación truena.

La aplicación es muy sencilla y se pueden agregar autores a una base de datos en Derby, hay un boton que abre una ventana para dar de alta un Folder, y cada folder tiene asociado un Autor. Para poder dar de alta un Folder es necesario escribir el nombre del folder y despues el usuario da click en un boton que dice buscar, el boton debería abrir una ventana donde despliega la lista de autores que previamente hemos agregado, entonces se selecciona uno y se puede dar de alta un Folder.

El problema es que al dar click en buscar autor la aplicación falla y aparece el siguiente mensaje:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at mx.uam.ayd.negocio.ControlAgregarFolder.buscarAutor(ControlAgregarFolder.java:31)
at mx.uam.ayd.presentacion.VentanaAltaFolder$1.actionPerformed(VentanaAltaFolder.java:114)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)


Anteriormente teniamos la misma aplicacion pero las clases se llamaban Libros, solamente ajustamos los nombre y quitamos un campo que no necesitamos y al correr la aplicación esta fallando. El flujo es mas o menos el siguiente:

EL boton que dispara la accion para desplegarla ventana con autores es el siguiente:
Código (java) [Seleccionar]
/**
* This method initializes jButtonBuscarAutor
*
* @return javax.swing.JButton
*/
private JButton getJButtonBuscarAutor() {
   if (jButtonBuscarAutor == null) {
       jButtonBuscarAutor = new JButton();
       jButtonBuscarAutor.setBounds(new Rectangle(347, 120, 86, 40));
       jButtonBuscarAutor.setText("Buscar");
       jButtonBuscarAutor.addActionListener(new java.awt.event.ActionListener() {
           public void actionPerformed(java.awt.event.ActionEvent e) {
               autor = control.buscarAutor();
               if(autor != null) {
               jLabelNombreAutor.setText(autor.toString()); //Muestra el nombre del autor actualmente seleccionado
               }
           }
       });
   }
   return jButtonBuscarAutor;
}


Y la clase control tiene el siguiente código:
Código (java) [Seleccionar]
public class ControlAgregarFolder {
private DAOFolder DAOFolders;//libreria
private DAOAutor DAOautores;
private VentanaAltaFolder VentanaFolder;

public ControlAgregarFolder(DAOFolder DAOFolders, DAOAutor autores) {
   this.DAOFolders = DAOFolders;
   this.DAOautores = autores;
}

public void inicia() {
   VentanaFolder = new VentanaAltaFolder(this);
   VentanaFolder.setVisible(true);
}

public Autor buscarAutor() {
//En la siguiente linea el programa esta fallando, cuando ejecuta DAOautores.dameAutores()
   Autor arregloAutores[] = DAOautores.dameAutores(); // Obtiene lista de autores
   DialogoSeleccionAutor dialogo = new DialogoSeleccionAutor(new JFrame(),arregloAutores);
// Crea el dialogo con la lista de autores
   dialogo.setVisible(true); // Muestra el dialogo
   return dialogo.getAutorSeleccionado(); // Regresa el autor seleccionado en el dialogo
}

public void agregarFolder(String nombre, Autor autor, String ruta) {
   DAOFolders.agregaFolder(new Folder(nombre,autor,ruta));
}
}


Y donde se supone que esta fallando es en la linea que hace referencia al DAOAutor cuyo codigo es:
Código (java) [Seleccionar]
public Autor[] dameAutores() {
ArrayList <Autor> autoresTemp = new ArrayList <Autor>();
try {
// Crea el statement
Statement statement = ManejadorBD.dameConnection().createStatement();
// Recibe los resutados
ResultSet rs = statement.executeQuery("SELECT * FROM Autores");
while(rs.next())
{
// Crea una nueva instancia del objeto
Autor autor = new Autor(rs.getString("nombre"),rs.getString("apellido"));
autoresTemp.add(autor);
}
Autor autoresTempArreglo[]=new Autor[autoresTemp.size()];
autoresTemp.toArray(autoresTempArreglo);
return autoresTempArreglo;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}


edito: conseguimos resolver el problema comenzando desde cero, no supe porque daba el error.  En los DAO algunos métodos regresaban null si fallaba algo en la conexion o las sentencias de SQL, imaginé que por ahi estaba el problema.

Saludos
#2
GNU/Linux / Ayuda al instalar SPICE Opus
21 Junio 2015, 00:28 AM
Hola, quiero instalar SPICE Opus en ubuntu y en el sitio oficial dice cómo hacerlo, he seguido los pasos pero estoy atorado en la ultima parte que dice así:

CitarSetting up the environment
We shall assume that you are using BASH. Add the following two lines to /etc/profile
(you must be root in order to be able to do it).
OPUSHOME=INSTALL_PREFIX
export OPUSHOME
where INSTALL_PREFIX is the tree where you installed Spice Opus.
It is also convenient if you add INSTALL_PREFIX/bin to your path.
Add the following two lines at the end of /etc/profile
PATH=$PATH:$OPUSHOME/bin
export PATH
Log out and log in again for the changes to take effect.

No tengo idea de como hacer eso, como tal no tengo el directorio etc/profile mas bien dice etc/profile.d y en la carpeta hay dos archivos bash_completion.sh, vte.sh, esas dos lineas que indica el tutorial no se donde agregarlas.

En usr/local me aparecen las carpetas bin, lib, src donde hay archivos de SPICE que instaló previamente pero en la parte final no se que hacer.

Alguien me podria ayudar?
#3
Java / Programa no entra a ciclo for
6 Junio 2015, 22:17 PM
Hola a todos tengo dos ciclos anidados pero al compilar, el ciclo con el indice j no lo esta ejecutando. Error es una variable booleana y mientras la matricula coincida con otro registro sera true.
Lo mas extraño de todo es que sí permite ingresar la matricula pero nunca entra al ciclo
. Estuve imprimiendo las variables e incluso mensajes aleatorios para ver hasta donde sí corre el programa y el ciclo for con índice j nunca lo hace.

Me podrian dar alguna pista?? :huh:
Código (java) [Seleccionar]
for(i=0;i<10;i++) {
           
            carros[i] = new Barato();
            //El usuario ingresa varios datos... lo importante es validar que ningun automovil tiene la misma matricula.

            System.out.print("Matricula: ");
            do {
                error = false;
                carros[i].setMatricula(scanStr.nextLine());
                for(j=0; j<(i-1); j++) {
                    if( carros[i].getMatricula().equals(carros[j].toString() ) ) {
                        error = true;
                        j = i;
                    }
                }
            } while(error); 
            System.out.println("Usted ha ingresado:\n" + carros[i].getMarca() +" "+ carros[i].getModelo()+ " color " + carros[i].getColor() +  ", precio: " + carros[i].getPrecio() + ", matricula: " + carros[i].getMatricula());
        }
#4
Hola que tal, estuvimos probando el esquema de circuito de la figura pero no logramos medir los valores que arroja la simulacion en SPICE. Los voltajes medidos no cumplen la ley de Kirchhoff para un lazo cerrado. Armamos en la tablilla de acuerdo al diagrama y las fuentes constantemente modificaban sus valores, al querer reajustar por ejemplo la fuente de 3v se modificaba la de 4v y viceversa. ¿Alguien sabe por qué ocurre esto?

Si aumentamos la corriente tambien lo hace el voltaje y este fenomeno ya no ocurre, pero si conservamos los valores originales de 5v, 4v y 3v para cada una de las fuentes el circuito se comporta muy raro. No tenemos posibilidad de cambiar algun elemento, debemos medir las tensiones y corrientes  como lo indica el diagrama. Sospechaba que debiamos cambiar la polaridad de alguna fuente pero ya no pudimos probarlo



HIPOTESIS 1: La fuente de 5v alimenta a la de 3v por la manera en que están conectadas, la corriente que entra en el nodo 4 proveniente de la fuente de 5v se divide en dos caminos, el primero con una resistencia de 1.2k y el otro con una resistencia de 0 Ohms, entonces la corriente tiene mayor libertar de flujo si se va por la terminal de la fuente de 3 Volts

Les dejo la simulación en Spice Opus, no medi las corrientes, preferí aplicar Ley de Ohm para encontrar los valores, creo que con esos voltajes basta. Sigo pensando si es posible medir los valores de la simulación sin modificar las fuentes.

Practica Circuitos Electricos

v1 1 0 dc=4
r1 2 1 1.2k
r2 1 3 330
r3 0 3 1.2k
r4 2 0 330
v2 2 4 dc=5
r5 0 4 1.2k
v3 3 4 dc=3
.control
op

print v(1),v(2),v(3),v(4)

.endc
.end

#5
Hola, en esta ocasión inicio con Bash Script en Ubuntu y estoy teniendo problemas para filtrar información e imprimir solo ciertos datos relativos al CPU, cores, memoria cache, ram, etc. La información está en los comandos:

Código (bash) [Seleccionar]
cat /proc/cpuinfo
lscpu


Para eso utilizo la siguiente sentencia y funciona:

Código (bash) [Seleccionar]
cat /proc/cpuinfo | grep "processor" | awk '{print $1 $3}'

Pero cuando quiero hacer lo mismo para el comando lscpu imprime información extra "NUMAnode0"

Código (bash) [Seleccionar]
lscpu | grep "CPU(s):" | awk '{print $1 $2}'

CPU(s):4
NUMAnode0



man lscpu hace referencia a la opción -p,--parse [=LIST], ¿Cómo puedo personalizar con una lista pero en formato normal, es decir imprimir del renglon CPU(s) hasta el renglon Socket(s)?
Encontre en la red que anteriormente se usaba -e,--extended [=LIST] pero esa opción ya no es valida no me la acepta. Saludos  :huh:
#6
PHP / Agregar entradas a base de datos
7 Abril 2015, 06:47 AM
Hola, estoy trabajando con unas plantillas y  necesito modificarlas pero mi conocimiento de php es nulo. La página despliega una tabla con distintos productos, entonces hay un checkbox para comprar, al hacer click redirecciona a otra página.

Me gustaria que cuando alguien de click en comprar se ejecutara un INSERT into TABLA values(...).
Tengo otro archivo con un formulario y quise copiar la parte donde hace los inserts into pero las estructuras de ambos archivos son diferentes y no se aquí como introducir las sentencias para que se agreguen entradas a la base de datos.

Si alguien me puede orientar al respecto se los agradeceré.
Código (php) [Seleccionar]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Articulos</title>
<style type="text/css">
.titulo {
font-family: Tahoma, Geneva, sans-serif;
font-size: 24pt;
color: #09F;
}
.titulo {
color: #C00;
}
.encabezado1 {
font-family: Georgia, "Times New Roman", Times, serif;
font-weight: bold;
font-size: 16pt;
}
.bienvenida {
font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif;
font-style: italic;
color: #933;
}
</style>
<script src="SpryAssets/SpryValidationCheckbox.js" type="text/javascript"></script>
<link href="SpryAssets/SpryValidationCheckbox.css" rel="stylesheet" type="text/css" />
</head>

<body>
<h1 align="center" class="titulo"><img src="images/header-object.png" width="879" height="88" alt="logo" /> </h1>
<h1 align="center" class="titulo">Itianguis</h1>
<p>&nbsp;</p>
<p class="encabezado1">LISTA DE ARTICULOS</p>
<p>&nbsp;</p>
<p class="bienvenida">Bienvenido estos son los articulos que tenemos disponibles para ti
</p>
<table width="881" border="1">
  <tr>
    <td width="293">Imagen del articulo</td>
    <td width="107">ID del articulo</td>
    <td width="75">Costo</td>
    <td width="255">Descripcion</td>
    <td width="117">Comprar</td>
  </tr>
  <tr>
    <th><img src="images/productos/asha 303.jpg" alt="asha" name="asha" width="225" height="225" id="asha" /></th>
    <td>Asha_303</td>
    <td>$1200</td>
    <td>Smartphone listo para comunicarte cuenta con sistema propio. watsaap, camara de 3 megapixeles</td>
    <th><label><a href="compraexitosa.php"><span id="sprycheckbox1">
      <input type="checkbox" name="checkbox1" id="checkbox1" />
      <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></label>
    <label for="compra">      </label></th>
  </tr>
  <tr>
    <td><img src="images/productos/galaxy s3.jpg" width="194" height="224" alt="galaxy" /></td>
    <td>GalaxyS3</td>
    <td>$3000</td>
    <td>Nuevo samsung galaxy S3mini con android 4.2 camara de 3 megapixeles y nuevas aplicaciones</td>
    <td><label><a href="compraexitosa.php"><span id="sprycheckbox2">
      <input type="checkbox" name="checkbox2" id="checkbox2" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></label></td>
  </tr>
  <tr>
    <td><img src="images/productos/galaxy fame.jpg" width="275" height="183" alt="fame" /></td>
    <td>Galaxy_fame</td>
    <td>$1500</td>
    <td>Galaxy fame cuenta con sistema android camara de 2 megapixeles</td>
    <td><label><a href="compraexitosa.php"><span id="sprycheckbox4">
      <input type="checkbox" name="checkbox4" id="checkbox4" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></label></td>
  </tr>
  <tr>
    <td><img src="images/productos/lumia 900.jpg" width="281" height="171" alt="lumia" /></td>
    <td>Lumia</td>
    <td>$3500</td>
    <td>Nuevo Nokia Lumia con sistema windows Phone cuenta con whatsapp correo electronico y muchas aplicaciones mas</td>
    <td><a href="compraexitosa.php"><span id="sprycheckbox5">
      <input type="checkbox" name="checkbox5" id="checkbox5" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></td>
  </tr>
  <tr>
    <td><img src="images/productos/pavilon dv4.jpg" width="303" height="204" alt="pavilon" /></td>
    <td>Pavilon</td>
    <td>$5000</td>
    <td>Lap top HP pavilon procesador core i3 ram 4GB DD 500 GB OS Windows 7 Home Basic</td>
    <td><a href="compraexitosa.php"><span id="sprycheckbox6">
      <input type="checkbox" name="checkbox6" id="checkbox6" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></td>
  </tr>
  <tr>
    <td><img src="images/productos/pavilon dv7.jpg" width="189" height="159" alt="pavilon1" /></td>
    <td>Pavilon_dv7</td>
    <td>$6000</td>
    <td>Lap top HP pavilon dv7procesador core i3 ram 3GB DD 500 GB OS Windows 7 Home Premium</td>
    <td><a href="compraexitosa.php"><span id="sprycheckbox7">
      <input type="checkbox" name="checkbox7" id="checkbox7" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></td>
  </tr>
  <tr>
    <td><img src="images/productos/pavilon dv600.jpg" width="282" height="179" alt="pav" /></td>
    <td>Pavilon_dv600</td>
    <td>$5500</td>
    <td>Lap top HP pavilon procesador pentium dual core ram 2GB DD 500 GB OS Windows 7 Home Premium</td>
    <td><a href="compraexitosa.php"><span id="sprycheckbox8">
      <input type="checkbox" name="checkbox8" id="checkbox8" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></td>
  </tr>
  <tr>
    <td><img src="images/productos/toshiba satelite.jpg" width="270" height="186" alt="toshiba" /></td>
    <td>Toshiba</td>
    <td>$6000</td>
    <td>Lap top Toshiba Satellite procesador core i5 ram 4GB DD 500 GB OS Windows 7 Home Premium</td>
    <td><a href="compraexitosa.php"><span id="sprycheckbox9">
      <input type="checkbox" name="checkbox9" id="checkbox9" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></td>
  </tr>
  <tr>
    <td><img src="images/productos/toshiba.jpg" width="262" height="192" alt="toshi" /></td>
    <td>Toshiba_Sate</td>
    <td>$7000</td>
    <td>Lap top Toshiba Satellite procesador core i5 ram 4GB DD 500 GB OS Windows 7 Profesional</td>
    <td><a href="compraexitosa.php"><span id="sprycheckbox10">
      <input type="checkbox" name="checkbox10" id="checkbox10" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></td>
  </tr>
  <tr>
    <td><img src="images/productos/Toshiba1.jpg" width="261" height="170" alt="tosii" /></td>
    <td>Toshiba_sat</td>
    <td>$9250</td>
    <td>Lap top Toshiba Satellite procesador core i7 ram 4GB DD 500 GB OS Windows 7 Profesional</td>
    <td><a href="compraexitosa.php"><span id="sprycheckbox11">
      <input type="checkbox" name="checkbox11" id="checkbox11" />
    <span class="checkboxRequiredMsg">Realice una selección.</span></span>Comprar</a></td>
  </tr>
</table>
<p class="bienvenida">&nbsp;</p>
<script type="text/javascript">
var sprycheckbox1 = new Spry.Widget.ValidationCheckbox("sprycheckbox1");
</script>
</body>
</html>
#7
Hola, tengo el siguiente programa donde servidor genera números y cliente imprime los datos recibidos, es decir, el cliente emite una petición, el servidor la lee, genera un numero y lo regresa al cliente, este ultimo lee el dato recibido.

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define NHILOS 2

void servidor();
void cliente();
int produce(int pet);
void lee(int prod);

int pet=0, prod=0;
omp_lock_t C1; //Candado Servidor
omp_lock_t C2; //Candado Cliente

int main (int argc, char *argv[])
{
   int id;
   srand (time(NULL));
   omp_init_lock(&C1);
   omp_init_lock(&C2);
   omp_set_lock(&C1);
   omp_set_lock(&C2); 
   omp_set_num_threads(NHILOS);
   #pragma omp parallel sections shared(pet,prod)
{
#pragma omp section
{
  printf(" Serv_id: %d\n",omp_get_thread_num());
  servidor();
}
#pragma omp section
{
  printf("Clie_id: %d\n",omp_get_thread_num());
  cliente();
}
}

   return 0;
}

void servidor()
{
while(1)
{
omp_set_lock(&C1);
prod = produce(pet);
omp_unset_lock(&C2);
}
}

void cliente()
{
while(1)
{
pet = rand()%3;
printf("Cliente genera la peticion: %d\n",pet);
omp_unset_lock(&C1);
omp_set_lock(&C2);
lee(prod);
sleep(2);
}
}


int produce(int pet)
{
printf("Procesando petición: %d\n",pet);
prod++;
return prod;
}

void lee(int prod)
{
printf("El servidor envia el producto: %d\n",prod);
}


¿Cómo puedo implementar N clientes y 1 servidor? Ahora se tienen N tareas cliente() y un solo servidor que queda en espera de peticiones de algún cliente.¿Cómo creo las N tareas, sin mas con N hilos?

Ahora se tienen 3 candados: Cliente, Petición y Servidor y la funcion cliente es mas o menos asi:
void cliente()
{
while(1)
{
omp_set_lock(&C3); //Peticion
pet = rand()%3;
printf("Cliente genera la peticion: %d\n",pet);
omp_unset_lock(&C1); //Servidor
omp_set_lock(&C2); //Cliente
lee(prod);
omp_unset_lock(&C3)
sleep(2);
}
}


Ya tengo las partes solo que no se como conectarlas, saludos!!
#8
Hola resumo un poco de información que he encontrado, esperando que sea leida y corregida:

Concurrencia: Varias tareas se ejecutan de forma simultanea, compartiendo los recursos disponibles segun sea el caso. Se utiliza la asignación de tiempos alternando entre distintas tareas que ocurren todas a la vez.

Un programa concurrente es un conjunto de tareas secuenciales ejecutadas en paralelismo abstracto o real y puede incrementar la velocidad, eficiencia, desempeño y tiempo de respuesta adaptándose a situaciones multitarea.

La programación concurrente  se puede clasificar por la forma en que se ejecuta en:
     - Multiprogramación (se cuenta con un solo procesador)
     - Programacion paralela (multiprocesador o multicomputadora)
     - Programación distribuida (red de estaciones de trabajo)

La asignación de tiempos se llama time-slicing.
La multiprogramación es un paralelismo abstracto porque el procesador asigna recursos a cada tarea.
En un paralelismo real el programa concurrente corre en una maquina con mas de un procesador (multicore)

saludos!
#9
Hola, quisiera consultar cons ustedes algunos detalles generales sobre programación concurrente. El programa del curso abarca:

- Conceptos básicos.
- Procesos e hilos.
- Modelo de programación de memoria compartida (sincronización, candados, semaforos, barreras)
- Modelo de programación de paso de mensajes.

Para empezar tengo el libro: M. Ben-Ari, Principles of concurrent and distributed programming pero poco he entendido la verdad.

Conozco nada respecto al tema y he encontrado poco, sería bueno que alguien pudiese comentar información al respecto.

¿Es lo mismo Programación concurrente a programación en paralelo?

saludos!
#10
Hola, he buscado información sobre recursividad pero en su mayoria son algoritmos de busqueda y ordenamiento, debo crear un arreglo de tamaño n e imprimirlo en pantalla de modo que forme un rectangulo, es decir, si el usuario elige 4, el resultado es:

1 1 1 1
1 1 1 2
1 1 2 3
1 2 3 4


Cada elemento se guarda en el arreglo de forma recursiva, cómo funciona esto?.

Poco he hecho con recursividad y estoy mas acostumbrado a trabajar con iteraciones, en este caso se me ha ocurrido trabajar con ciclos for() para ir procesando renglon por renglon pero no es recursividad.

   1. Si la funcion se llama a si misma el arreglo se crea dentro o fuera de la funcion? es local o global?
   2. Puedo reservar espacio dinamico para el arreglo del tamaño que indica el usuario? es decir:x = malloc(sizeof(int) * n);
   3. Al llamar a la función el arreglo se pasa como parametro? si es que se crea fuera de la funcion
   
Mi problema es desarrollar el algoritmo para guardar la secuencia de numeros , por favor si alguien me puede orientar se lo agradeceré.

Saludos!
#11
Hola, de nuevo posteando códigos de nivel básico-intermedio, uso una lista simple para ir almacenando cada digito del numero convertido:

Comentarios y sugerencias bienvenidas! :)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXBASE 9
struct numeroB10
{
    int num;
    struct numeroB10 *next;
};
typedef struct numeroB10 BASE;
typedef BASE *BASE_PTR;

int input_numero_natural();
int input_mayor_base();
BASE_PTR add_to_list(int residuo, BASE_PTR prev_rec);
char input_error_sino();
void liberar_espacio(BASE_PTR ultimo);

int main()
{
    int numero=0,aux=0,cociente=0,residuo=0,base=0;
    char bucle='0';
    BASE_PTR digit_addr=NULL;
    BASE_PTR impresor=NULL;
    do
    {
        system("CLS");
        printf("Conversor de base 10 a base n\n\nInstrucciones: Ingresa un numero natural en base 10: ");
        numero = input_numero_natural(); //Se valida que sea un dato entero y positivo
        printf("\nAhora elige una base entre 1 y 9 para convertir el numero: ");
        base = input_mayor_base(); //Validacion de base
            if(numero<base)
                puts("\nEl numero a convetir es el mismo!");
            else
            {
                aux = numero;
                    while(aux>=base)
                    {
                        cociente = aux/base;
                        residuo = aux%base;
                        digit_addr = add_to_list(residuo,digit_addr);
                        aux = cociente;
                    }
                digit_addr = add_to_list(aux,digit_addr);
                impresor = digit_addr;
                printf("\nEl numero %d en base 10 es igual a ",numero);
                    while(impresor!=NULL)
                    {
                        printf("%d",impresor->num);
                        impresor = impresor->next;
                    }
                printf(" en base %d",base);
                liberar_espacio(digit_addr);
                digit_addr=NULL;
                impresor=NULL;
            }
        printf("\n\nQuieres convertir otro numero? ( S/N ): ");
        bucle = input_error_sino();
    }while(bucle=='S');
    return (0);
}

/*Funcion: input_mayor_base
  Proposito: Valida que los datos de entrada del usuario sean numeros y evita que se procesen letras, signos o
             numeros negativos, se usa al pedir la base a convertir.*/
int input_mayor_base()
{
    int respuesta;
    while((scanf("%d",&respuesta) != 1)||respuesta<=1||respuesta>MAXBASE) //en caso de ñ y datos raros.
        {
            while (getchar() != '\n');
            if(respuesta>MAXBASE)
            {
                printf("\nSolo puedes convertir hasta base 9: ");
            }
            else
            {
                printf ("\nDato no valido intenta de nuevo: ");
            }
        }
    return respuesta;
}
/*Funcion: input_numero_natural()
  Proposito: Valida que los datos de entrada del usuario sean numeros y evita que se procesen letras, signos o
             numeros negativos, se usa al pedir la base a convertir.*/
int input_numero_natural()
{
    int respuesta;
    while((scanf("%d",&respuesta) != 1)||respuesta<=0) //en caso de ñ y datos raros.
        {
            while (getchar() != '\n');
            if(respuesta==0)
            {
                printf("\nEl numero 0 es el mismo para todas las bases: ");
            }
            else
            {
                printf ("\nDato no valido intenta de nuevo: ");
            }
        }
    return respuesta;
}
/*Funcion: BASE_PTR add_to_list()
  Proposito: Crear un bloque en memoria para el numero a convertir*/
BASE_PTR add_to_list(int residuo, BASE_PTR prev_rec)
{
    BASE_PTR new_rec = NULL;
    new_rec = (BASE_PTR) malloc(sizeof(BASE)); // Crear jugador
    if(!new_rec)
    {   //Validacion de malloc
        printf("Error al reservar memoria");
        exit(1);
    }
    new_rec->num= residuo;
    new_rec->next = NULL;
    if(prev_rec) //Si hay un elemento antes
    {
        new_rec->next = prev_rec;

    }
    return(new_rec);
}
/*Funcion:input_error_sino
  Proposito: Valida que la respuesta sea el caracter S o N,
  se usa en la ultima pregunta para volver a correr el programa */
char input_error_sino()
{
    char respuesta;
    respuesta = getche();
    respuesta = toupper(respuesta);
    printf("\n\n");
        while(respuesta!='S'&&respuesta!='N') //Error si teclea otra cosa
            {
                printf("Opcion invalida, intenta de nuevo: ");
                respuesta = getche();
                puts("");
                respuesta = toupper(respuesta);
            }//Fin mensaje error
    return (respuesta);
}
/*Funcion:liberar_espacio()
  Proposito: borrar numeros generados.*/
void liberar_espacio(BASE_PTR ultimo)
  {
      BASE_PTR aux = NULL;
      aux = ultimo;
      while(aux->next!=NULL)
      {
          ultimo = ultimo->next;
          free(aux);
          aux = ultimo;
      }
      free(aux);
  }
#12
Hola, alguien sabe como deshabilitar el redondeo en operaciones.

Ejemplo: 6*(-1.033333) = -6.199998

Excel muestra -6.200000

El tamaño de la celda es lo suficientemente grande
El formato numero despliega varias cifras significativas

:huh: a alguien le ha pasado?
#13
Hola, la semana pasada pregunté por una lista ligada simple y partiendo de ese código agregué un apuntador al campo anterior para convertirla en una lista doble circular.

El problema creo sucede cuando le paso los parametros a la funcion que crea el nodo en la linea 30, los parametros son el nombre del jugador, el apuntador del elemento anterior y el apuntador al siguiente.

Lo que me esta costando trabajo es visualizar cuando se crea el primer elemento que apunta a si mismo y los demas apuntan al anterior o posterior pero no a si mismos  :huh:

Pregunta: Que apuntador se debe pasar para el campo siguiente?
cuando es una lista simple se pasa la direccion del elemento anterior para asignarle en su campo siguiente el valor del nuevo nodo, pero aqui??

reedito: cometi de nuevo el error de asignacion en: if(i==0), ya edite el código


#include <stdio.h>
#include <stdlib.h>
struct persona
{
   char *nombre;
   struct persona *next;
   struct persona *prev;
};
typedef struct persona JUGADOR;

typedef JUGADOR *J_PTR;
       J_PTR first = NULL;
       J_PTR last = NULL;

J_PTR add_to_list(char *ch, J_PTR prev_rec,J_PTR next_rec);

int main()
{
   int i,num_jugadores;
   char *nombre;
   J_PTR j_addr = NULL;
   printf("Escribe el numero de jugadores: ");
   scanf("%d",&num_jugadores);
   while(getchar()!='\n');
   printf("\nAhora cada uno de sus nombres\n\n");
   for(i=0;i<num_jugadores;i++)
   {
       printf("Jugador %d: ",i+1);
       scanf("%s",&nombre);
       j_addr = add_to_list(nombre, j_addr, first); /*la funcion devuelve new_rec*/
           if(i==0)
           {
               first = j_addr;
           }
       last = j_addr;
       last->next = first;

           printf("Nombre:%s\nprev: %p  \nnext: %p\n",nombre,(void *)j_addr->prev,(void *)j_addr->next);

       puts("\n");
   }
}

J_PTR add_to_list(char *name, J_PTR prev_rec,J_PTR next_rec)
{
   J_PTR new_rec = NULL;
   new_rec = (J_PTR) malloc(sizeof(JUGADOR)); // Crear jugador
   if(!new_rec)
   {   //Validacion de malloc
       printf("Error al reservar memoria");
       exit(1);
   }
   new_rec->nombre = name;
   new_rec->next = NULL;
   new_rec->prev = NULL;
   if(prev_rec) //Si hay un elemento antes
   {
       prev_rec->next = new_rec;
       new_rec->prev = prev_rec;
   }
   new_rec->next = next_rec;
   return(new_rec);
}
#14
Hola, tengo una función que pide el nombre de una persona, quiero que regrese el arreglo de caracteres para que en main se haga uso del nombre tecleado. Hay un tema donde usan apuntadores, he tratado de adaptarlo a mi funcion pero me da error, algo estoy haciendo mal:

/*Que debe regresar?*/ input_nombre()
{
    char nombre[20];
    int longitud=0;
    do
    {
        printf("Persona 1: ");
        scanf("%s",&nombre);
            while (getchar() != '\n');
        longitud = strlen(nombre);
        if(longitud>20)
        {
            printf("\nError, el nombre no puede ser mayor a 20 caracteres\n\n");
        }

    }while(longitud>20);
    return //El nombre de la persona
}


Eventualmente voy a guardar el nombre en una estructura en su campo nombre[20]  :huh:
#15
Hola, estoy construyendo una lista de numeros pero al compilar me da error por el operador ->, alguien nota el error?
#include <stdio.h>
#include <stdlib.h>
typedef struct st_num //Plantilla para numero aleatorio.
{
    int rand_num;
    struct st_num *ptr_next;
}st_num;

typedef struct
{
    st_num *head;
    st_num *last;

}fila;

int main()
{
    int i;
    int respuesta_num; //Dato tecleado por usuario
    char key_buff[40];
    st_num *nodo;
    menu_principal(); //Borrar pantalla y desplegar texto
    scanf("%d",&respuesta_num);
    gets(key_buff); //limpiar buffer
    fila->head = NULL;
    fila->last = NULL;

    for(i=0;i<respuesta_num;i++)
    {
        nodo = (st_num *) malloc(sizeof(st_num)); //Direccion de bloque creado
        nodo->rand_num = rand()%100+1;
            if(i=0) //Edicion de primer elemento
            {
                fila->head = nodo;
                fila->last = nodo;
                nodo->ptr_next = NULL;
            }
            if(nodo->ptr_next != NULL)
            {
                nodo ->ptr_next = fila->head;
            }
        fila->head = nodo;
        printf("%d\n",nodo->ptr_next);
    }
}
#16
Hola, estoy aprendiendo estructuras y apuntadores, tengo un código muy básico:
#include <stdio.h>
void main()
{
    typedef struct coordinate
        {
            char nombre[15];
            int x,y;
        }coordinate;
    coordinate ubicacion_01,ubicacion_02;
    coordinate  *ptr_punto;
    ptr_punto=&ubicacion_01;
    puts("Escribe el nombre del lugar");
    gets(ptr_punto->nombre);
    printf("Lugar: %s",(*ptr_punto).nombre);
    getch();
}
}


Pregunta:

Se deben inicializar las variables al crear una estructura?, si a x,y les doy el valor de cero el compilador me da error, hay algun problema si no inicializo el arreglo nombre y las variables enteras?

La sentencia typedef esta bien dentro de main? o debo declarar la estructura fuera como prototipo?
saludos!
#17
Hola, tengo un problema con algo tan sencillo:

1- Entrada de nombre sin problemas, al dar una nueva linea la entrada de matricula falla
2- como matricula se imprimen datos basura, no te deja escribir nada, por lo tanto la condicion no funciona y lo demas tampoco  :(
int informacion_personal()
{
    char nombre_apellido[50];
    char id[12];
    unsigned short numero_caracteres=0;
    printf("Para finalizar escribe tu nombre y matricula\n\n");
    printf("Nombre: ");
    scanf(" %c",&nombre_apellido);
    printf("\nMatricula: ");
    scanf("%c",&id);
    numero_caracteres = strlen(id);
    if(numero_caracteres>9)
    {
        printf("Demasiados caracteres!\n");
    }
    strcpy(nombre,nombre_apellido);
    printf("%s %s",matricula,nombre);
    getch();
}


No hay mucho que pueda hacer, intente con gets pero al correr se salta la instruccion y no puedes escribir nada, tenia asignado los valores a variables globales (nombre y matricula) pensando que eso era el problema pero no, reasigne a locales y nada.
#18
Cambiar la impresion de un arreglo (C++)

Como puedo imprimir las tabulaciones para darle forma al triangulo en C?
#include<stdio.h>

int main()
{
    int i,j=1,k=1,tab,n=4; //i = renglones  j = elementos
    long int elemento;
    for(i=0;i<14;i++) //Renglones 0,1,2,3,4,5...
    {
        for(j=0;j<k;j++) //Renglon 0, elemento 1
        {
            elemento = (facto(i))/(facto(j)*(facto(i-j)));
            printf("%d ",elemento);

        }
        k++;
        printf("\n");
        n-=1;

    }
}

facto(long long int num)
{
   int i=num;
   long long fact=1;
   for(i=num;i>1;i--)
    {
        fact*=i;
    }
    return fact;
}


Estaba intentando con:
for(tab=n;tab>0;tab--)
        {
            printf("\t");
        }

pero queda mal, muy mal  :laugh:
#19
Hola,
tengo que calcular el valor de e^x con la serie 1+x+((x^2)/2!)+((x^n)/n!)
encontre un tema relacionado, el código descrito da el mismo resultado que el que yo he hecho.

1- No estoy seguro si he definido bien las variables
2- Para numeros muy grandes el resultado es falso, se arroja un numero negativo, leí en otro tema que se debe definir una funcion que permita numeros muy grandes (a la hora de calcular el factorial) porque la compilacion tiene un limite.

¿Se puede definir una variable mayor a long long?

Como me ha sucedido en ocasiones anteriores, el programa funciona pero no tengo la certeza de que el código este bien escrito. Comentarios y sugerencias bienvenidas.

#include <stdio.h>
#include <math.h>
main()
{
    int e,respuesta,n;
    float resultado=0;
    printf("Calcular e^x\n ");
    printf(" Valor de x: ");
    scanf("%d",&respuesta);
    printf(" Numero de terminos: ");
    scanf("%d",&n);
    for(e=n;e>1;e--)
        {
            resultado+= (pow(respuesta,n)) / (facto(n));
            n--;
        }
    resultado += 1 + respuesta;

    printf("\ne^%d: %.4f",respuesta,resultado);
}

facto(long long int num)
{
   int i=num;
   long long fact=1;
   for(i=num;i>1;i--)
    {
        fact*=i;
    }
    return fact;
}

saludos!
#20
Hola,
estoy revisando el tema de arreglos y necesito crear un programa que calcule el promedio de 5 calificaciones tecleadas, esto va por alumno. Creo que el problema esta en los renglones 29, 30.

Al final cuando imprime el promedio del alumno 1, alumno 2 etc, solamente el primer dato es correcto, los demas no, imagino que estoy asignando mal los valores a cada variable del arreglo alumno[r].

Mi idea es la sig: Se ingresan las 5 calificaciones que se suman y guardan en califsum, despues se calcula el promedio de dichos datos y se almacena el resultado en alumno[n], al final se tienen los promedios de 10 alumnos en el arreglo. Tambien debo obtener el promedio general, pero no se como trabajar los elementos de un arreglo (en general para sumar, restar,etc)

#include <stdio.h>

main()
{
    int i=0,j,k=1,r=0,alu=1,calif=0,califsum=0,respuesta=0;
    float califprom=0,alumno[10]={0};
    printf("Cuantos alumnos quieres registrar?: ");
    scanf("%d,",&respuesta); //El numero de alumnos esta contenido en respuesta
    while(respuesta>10)
    {
        printf("El sistema no permite registrar mas de 10 alumnos por sesion.\n");
        printf("Cuantos alumnos quieres registrar?: ");
        scanf("%d,",&respuesta); //El numero de alumnos esta contenido en respuesta
    }
    for(i=0;i<respuesta;i++) //Bucle para el numero de alumnos
    {
        j=0;
        printf("Teclea las calificaciones del alumno %d:\n",i+1);
        while(j<5) //Bucle por 5 calificaciones
        {
            printf("%d. ",k); //Se imprime el numero de calificacion 1. 2. 3. etc.
            scanf("%d",&calif);
            califsum+= calif;
            k++;
            j++;
        }
        k=1;
        califprom = califsum / 5;
        alumno[r] = califprom;
        r++;
    }
    printf("\nDetalle de calificaciones:\n\n");
    r=0;
    while(alu<=respuesta)
    {
        printf("Promedio Alumno %d: %.2f\n",alu,alumno[r]);
        alu++;
        r++;
    }
}


¿Se pueden imprimir incrementos ++ en printf()? en la linea 18 por ejemplo tuve que modificar porque al tener i++ las cosas no funcionaban:
printf("Teclea las calificaciones del alumno %d:\n",i++);

espero entiendan lo que trato de hacer,
saludos!
#21
El código compila y ejecuta pero por alguna razon me toma 1 y 2 como no validos

#include<stdio.h>
int main()
{
    int respuesta, cal, total_cal, food, foodfor,loopcal=0;
    printf("\t\tPrograma de calorias\n\n");
printf("1. Cuanto has comido hoy? \n");
printf("2. Indice de Masa Corporal \n");
printf("   Elige una opcion: ");
scanf("%c", &respuesta);
    switch (respuesta)
{
case 1:
{
                    printf("Ingresa los datos de los alimentos.\n\n ");
printf("Cuantos alimentos comiste?: ");
scanf("%d",&food);
printf("Teclea las calorias de cada alimento: ");
for(foodfor = 0;foodfor<=food;foodfor++)
                    {
                        scanf("%d",&cal);
                        loopcal = (loopcal + cal);
                        total_cal = loopcal;
                    }
printf("Has comido %d calorias.",total_cal);
break;
}
case 2:
{
printf("Indice de Masa Corporal\n");
printf("Please Wait...\n");
break;
}
            case 3:
                {
                    printf("Adios!");
                }
default:
                {
while(respuesta!=1&&respuesta!=2&&respuesta!=3)
                        {
                            printf("Opcion no valida, intenta de nuevo\n");
                            scanf("%d",&respuesta);
                        }
                }
}
    return 0;
}


El primer caso te debe preguntar cuantos alimentos comiste y despues te pide ingresar las calorias de cada alimentos, si comí 10 tecleo 10 etc, al final te dice todo lo que consumiste. Empezó a fallar desde que agregue for() en el caso 1, lo releo y no encuentro la falla.

ayuda por favor.
#22
Hola,
Necesito calcular la raiz cuadrada de un numero, encontre en la red una funcion que no necesita de la libreria math.h, todo ejecuta pero no termino de entender el for loop de la raiz:

#include<stdio.h>
#include<conio.h>

float SquareRoot(float num);
void main()
        {
        int input;
        float square;
        printf("Escribe el numero: ");
        scanf("%d",&input);
            if(input<0)
            {
                printf("La raiz de un numero negativo no esta definida, por favor intenta de nuevo.");
            }

        square = SquareRoot(input);
        printf("\n La raiz de %d es: %.5f",input, square);
        getch();
        }

float SquareRoot(float num)
{
    float x = num;
    if(num >= 0)
        {
            int i;
            for(i = 0; i < 20; i ++)

            x = (((x * x) + num) / (2 * x));

            return x;
        }
}


¿Porqué i<20?, num es el dato que el usuario va a teclear que es = x, entonces mientras el loop corre ¿qué le pasa a x?

x1 = las operaciones indicadas con el dato que escribe el usuario.
x2 = las mismas operaciones ahora con el nuevo dato resultado de x1.
x3 = operaciones con el dato que se genero en x2.
xn = ...

es asi como sucede?

sospecho que la condicion en for() y la expresion de X se reducen a meras formulas matematicas, no recuerdo muy bien como resolver una raiz cuadrada con precision y cifras significativas.

Trato de pensar en alguna funcion que resuelva con dos numeros de raiz entera como (4, 9) para buscar raices en dicho intervalo. La cuestion es que no puedo usar sqrt() de math.h.

Sugerencias bienvenidas!
#23
Hola,
estoy llevando introducción a la programación en la universidad y nos dan C, aprendemos las funciones principales, definicion de variables, uso de loops, la sintaxis, etc.
Creo que aprender C es importante pero no fundamental, empiezo a familiarizarme con C++  y me di cuenta que algunas cosas cambian como printf por cout, scanf por cin, detalles de sintaxis; pero el algoritmo y diseño del programa no cambia.

¿Qué pasa por ejemplo si quiero trabajar con java, visual basic, authorware? Es indispensable el conocimiento de C? Si quisiera enfocarme en GUI's?

Desconozco el panorama general de la programacion pero me parece un poco atrasado aprender C, tal vez estoy en lo incorrecto, tengo esta impresión por un libro que encontre en la biblioteca, era el manual del header file graphics.h, no tenia idea que la libreria ya es obsoleta y que la manera de manejar los gráficos ha cambiado, pero eso lo descubrí hasta que terminé de transcribir un ejemplo de código y no compilaba.  ;-)

Saludos!


#24
Hola, recien empiezo a trabajar con C y necesito crear un programa que cuente el numero de ceros que hay en una cadena que ingresa el usuario, es decir, el usuario teclea 5,4,3,8,0,1,7,3, al final la aplicacion debe de decir el numero total de ceros es uno, o tres, o cinco, etc.
#include <stdio.h>
int main()
{
int smplnum;
int sumaceros;
sumaceros=0;
char respuesta;
respuesta=' ';
printf("quieres agregar un numero?, escribe s=si, n=no\n");
scanf("%c",&respuesta);
while(respuesta=='s'|| respuesta=='S')
{
printf("Escribe el numero.\n");
scanf("%d",&smplnum);
if(smplnum ==0)
{
           sumaceros=sumaceros+1;
}
else
{

printf("quieres agregar un numero?, escribe s= si, n=no");
scanf("%c",&respuesta);
}
}
printf("el numero de ceros es %d.\n",sumaceros);
}


Puedo compilar el programa, no me marca ningun error pero al correrlo me pide un numero, si es igual a cero el loop corre y vuelve a preguntar por el nuevo numero pero al teclear un numero distinto de cero la aplicacion pregunta, me da el numero de ceros y ce cierra. El problema esta en :
printf("quieres agregar un numero?, escribe s= si, n=no");
scanf("%c",&respuesta);

el scanf de la condicion else se lo salta,  no me deja teclear mas numero y termina el programa.
Por favor si alguien tiene idea de que sucede agradeceré sus comentarios.
Saludos!

#25
Hola,

estoy ejecutando una macro de excel que extrae información de un libro y lo copia a otro, el archivo con datos se llama protocolo y todo se copia al informe de protocolo.

Tengo 2 protocolos, ejecuto la macro para el primero, ya que extrae la información cierro el primer protocolo y abro el segundo, al ejecutar la macro me da el Error 9 Subindice fuera de intervalo. Siempre tengo que cerrar y abrir ambos documentos, protocolo e informe y esto es lo que quiero evitar ya que a veces tengo 6 o 7 protocolos y pierdo algo de tiempo cerrando y abriendo todo de nuevo.

La información la copio de un libro a otro haciendo referencia entre libros con:

Windows().Activate
Range().Select
Selection.Copy
Windows().Activate
Range().Select
ActiveSheet.Paste


Hay datos que pueden no tienen una celda fija, lo unico que se me ocurrio fue activar una celda del informe y hacer un vlookup:

Windows("Informe de Protocolo.xlsm").Activate
    Range("R47").Select
    ActiveCell.FormulaR1C1 = _
        "=VLOOKUP(""Nota"",'[protocolo.xls]Registro Ingreso'!R60:R85,2,FALSE)"


¿Hay alguna forma mas eficiente de extraer la información?
¿Cómo puedo evitar el error 9?

Saludos.
#26
Software / VBA Excel, Loop de acuerdo a fecha
1 Septiembre 2011, 09:46 AM
En cierto punto de una macro hay un Loop que elimina todos los renglones con fecha distinta a la fecha deseada, esta fecha siempre va a ser de un dia anterior al actual:

Do Until ActiveCell = "31/08/2011"
Selection.EntireRow.Delete
Loop


Hoy es 01 de Septiembre, por lo tanto la macro elimina todos los dias de agosto menos 31, lo que quiero evitar es tener que cambiar la fecha en la macro cada vez que la ejecuto, intente cambiando la fecha por:

Do Until ActiveCell = "Today()-1"

Pero no funciona, sin embargo, escribiendo la fecha en formato "dd/mm/yyyy" funciona correctamente. ¿Cuál es la forma correcta para indicar que reste un dia?

Saludos