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ú

Mensajes - Khronos14

#391
Hola Leo Gutiérrez, gracias por responder. También pensé en utilizar listas enlazadas, pero son más lentas, ya que son de acceso secuencial.

Saludos.
#392
Programación C/C++ / Problema con arrays dinámicos
31 Diciembre 2010, 16:40 PM
Hola, practicando un poco con punteros me surgió un problema. Estoy creando una clase llamada TStringList (como la que existe en Delphi) y creé una función Add(). Funciona bastante bien, el problema ocurre cuando introduces más de 5 o 6 cadenas, que la primera cadena se pierde y salen caracteres raros.

Código main.

Código (cpp) [Seleccionar]

#include <iostream>
#include "stringlist.h"

using namespace std;

const int CHAR_MAX_LENGTH = 20;

int showmenu()
{
int option = 0;
   do
   {
       cout << "1.- Añadir string" << endl;
       cout << "2.- Mostrar strings" << endl;
       cout << "3.- Salir" << endl;
       cout << "Introduce una opcion: ";
       cin >> option;
   }while(option < 1 && option > 3);
return option;
}

int main()
{
char buff[CHAR_MAX_LENGTH];
int option = 0;
TStringList *List = new TStringList();
       do
       {
           option = showmenu();
           switch(option)
           {
               case 1: cout << "Introduce una cadena: ";
                       cout.flush();
                       cin >> buff;
                       List->Add(buff);
                       break;
               case 2: for (int i = 0; i < List->GetCount(); i++)
                           cout << "Item " << i + 1 << ": " << List->GetItem(i) << endl;

                       break;
           }

       }while(option != 3);
delete(List);
return 0;
}



Código stringlist.h
Código (cpp) [Seleccionar]

#ifndef _H_STRINGLIST
#define _H_STRINGLIST

struct SL_ITEM{
   char *string;
};

class TStringList{
   private:
       SL_ITEM *Items;
       long numItems;
   public:
       TStringList();
       ~TStringList();
       void Add(char *cadena);
       long GetCount();
       char * GetItem(long Index);
};

#endif



Código stringlist.cpp
Código (cpp) [Seleccionar]

#include "stringlist.h"
#include <memory>
#include <malloc.h>
#include <string.h>

TStringList::TStringList()
{
   numItems = 0;
}

TStringList::~TStringList()
{
   if (numItems > 0)
   {
           for (int i = 0; i < numItems; i++)
               Items[i].string = NULL;
           Items = NULL;
        /*
             Aquí también tengo alguna duda.
             Probé con delete [] Items; pero compilado en Linux me suelta un stack error, en Windows, simplemente se cierra la aplicación  :huh:
        */
   }

}

void TStringList::Add(char *cadena)
{
   if (numItems > 0){
       SL_ITEM * NewItems = (SL_ITEM*) malloc((numItems + 1) * sizeof(SL_ITEM));
       /*for (int i = 0; i < numItems; i++)
           {
               NewItems[i].string = (char *) malloc(strlen(Items[i].string) + 1);
               strcpy(NewItems[i].string, Items[i].string);
           }*/
       memcpy(NewItems, Items, sizeof(*Items));
       memcpy(Items, NewItems, sizeof(*NewItems));
       NewItems = NULL; //Creo que no hace falta
   }
   else Items = (SL_ITEM*) malloc(sizeof(SL_ITEM));
       Items[numItems].string = (char *) malloc(strlen(cadena) + 1);
       strcpy(Items[numItems].string, cadena);
       numItems++;
}

long TStringList::GetCount()
{
   return numItems;
}

char * TStringList::GetItem(long Index)
{
   if (Index < numItems && Index >= 0)
       return Items[Index].string;
   else return NULL;
}



Espero que puedan echarle un ojo y comentar.

Saludos.
#393
Cita de: Ferno en 31 Diciembre 2010, 03:07 AM
Me supongo que en la condición, en vez de ":=" iría un "=". verdad?

Pero Ferno se refiere a una condición, estás usando el operador de asignación en una condición.


if a[i] := p[j] then begin //sería =


Además, aquí creo que los paréntesis son necesarios.


until (j > M)  or (i > N);



Para devolver un valor con una función puedes usar result, en vez del nombre de la función.
#394
Cita de: XXX-ZERO-XXX en  6 Diciembre 2010, 22:58 PM
y sin el 0 tamb xD porfavor.. esq creo q al combinarlos es q da el error :S

Es tan simple que con cambiar está línea ya lo haces:

Código (csharp) [Seleccionar]

Lista[i] = Rnd.Next(8);


por esta:

Código (csharp) [Seleccionar]

Lista[i] = Rnd.Next(1, 8);


Y como la lista tiene tamaño 7 y le pides valores entre 1 y 7, siempre te va a mostrar desde 1 hasta 7 pero con los números desordenados.

Saludos.
#395
Por lo que entendí tienes un array de tamaño 7 y quieres almacenar en ese array números desde el 0 al 7, sin que se repitan. El algoritmo creo que es bastante sencillo. Prueba a hacer algo como esto:

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
       private static int[] Lista = new int[7];

       public static bool NumExists(int Num, int MaxPos)
       {
           bool resultado = false;
               for (int i = 0; i < MaxPos; i++)
                   if (Lista[i] == Num)
                   {
                       resultado = true;
                       break;
                   }
           return resultado;
       }

       public static void RandomNumbers()
       {
           Random Rnd = new Random(unchecked((int)DateTime.Now.Ticks));
           for (int i = 0; i < Lista.Length; i++)
               do{
                   Lista[i] = Rnd.Next(8);
               }while(NumExists(Lista[i], i) == true);
           Rnd = null;
       }

       static void Main(string[] args)
       {
           RandomNumbers();
           for (int i = 0; i < Lista.Length; i++)
               Console.WriteLine("Número: {0}", Lista[i]);
           Console.ReadLine();
       }
   }
}



La salida de la consola sería algo como esto:


Número: 7
Número: 5
Número: 0
Número: 1
Número: 6
Número: 4
Número: 2


Saludos.
#396
Estoy siguiendo el proyecto, y la verdad, la versión 0.0.5 debería incorporar un administrador de memoria.

http://wiki.osdev.org/Projects

En esa página puedes encontrar muchísimos "prototipos" de Kernel y podrías emplear algún módulo para administrar la memoria para poder usar funciones como malloc() y free().

Este Kernel me gustó mucho http://www.dynacube.net/

Cuenta con Administrador de Memoria, Administrador de Procesos, Sistema de Archivos FAT12 y una pequeña GUI.

Me parece una tontería lo que estas haciendo. Son "programas" en modo kernel, que con posteriores versiones seguramente tengan que ser modificados para funcionar.
Yo que tu trabajaría primero con la memoria e intentaría hacer un administrador de procesos básico.

Saludos.

#397
Programación General / Re: tipo de lenguaje
13 Noviembre 2010, 10:53 AM
Cita de: Leo Gutiérrez. en 13 Noviembre 2010, 01:25 AM
Cita de: Khronos14 en 12 Noviembre 2010, 21:49 PM
Para administrar servidores, lo mejor es: perl, bash y awk.

Saludos.

¿por qué?  :rolleyes:

Estoy estudiando Administración de Sistemas Informáticos y son los mejores lenguajes script para automatizar tareas en entornos UNIX.

Saludos.
#398
Programación General / Re: tipo de lenguaje
12 Noviembre 2010, 21:49 PM
Para administrar servidores, lo mejor es: perl, bash y awk.

Saludos.
#399
La última, Delphi XE o la anterior, Delphi 2010.

Saludos.
#400
Creo que deberías buscar en google la definición de UNICODE o UTF-8.

.NET trabaja en UNICODE nativo, es decir, el tipo de datos char ocupa 2 bytes en vez de 1. Si no se muestran los caracteres UNICODE en tu equipo puede ser porque no tengas las fuentes de idiomas instaladas, los Windows Ultimate suelen tener todas instaladas...