[TUTORIAL] Programando en C

Acabo de encontrarme este hilo!

Dios mío lo que me he estado perdiendo :O En 1 mes o así me pondré a programar lo que pueda (al principio poca cosa) y luego iré subiendo el nivel si puedo. Os iré leyendo mientras.

Me encanta programar y no se me da mal del todo, así que veremos que sale! Enorme el tutorial XD
muy intersante,estoy dando mis primeros pasos
Yo estoy con c+-, y la verdad ya tengo muchos conocimientos, estoy digamos en el final del temario, asi que a ver que tal :D
al abrir elprograma me salen varias opciones a elegir C# settings C++ settings etc


cual cojo
Gracias por la información, voy tener darle un tiempo para leer todo el tutorial [boing]
Gracias por el tutorial, vaya que hace buena falta gente que se dedique a aprender a programar a ver si por nuestros propios medios lo logramos en vez de andarse quejando que la scene no avanza lo suficientemente rapido de lo que ellos esperan
Muy bueno el tutorial... siempre es bueno recordar viejos términos que si no, nos oxidamos, jejeje.
Tengo una duda: he creado un array de numeros y lo he rellenado con 15 numeros. Me gustaría saber como pasar la totalidad del array a una variable long en el mismo orden para trabajar con ella como si de un solo numero se tratara.

Pongo un ejemplo:
#include <string.h>

int main (void) {
   int n[15];
   int i;

//Inicializo el array con el valor 0 en todas las celdas
   for (i=0; i<15; i++) {
      n[i]=0;
   }
}


Mi duda sería como pasar el valor del conjunto del array, en el ejemplo "000000000000000" (pudiendo ser cualquier otro numero) a una variable para trabajar directamente con el numero en su totalidad.

Espero ser claro, lo hago lo mejor que puedo. Un saludo.
Recorre el vector desde el final multiplicando 10⁰, 10¹, 10² el valor del vector y lo acumulas en una variable, vamos, lo que viene siendo el Teorema Fundamental de la numeración
Juen escribió:Recorre el vector desde el final multiplicando 10⁰, 10¹, 10² el valor del vector y lo acumulas en una variable, vamos, lo que viene siendo el Teorema Fundamental de la numeración


¿Que opinas pues de este código, que es para lo que lo necesitaba, en el que genero un numero completamente aleatorio de 15 cifras?, ¿algo mal?, ¿algo bien?, ¿mejores opciones?. Gracias por tu ayuda.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main (void) {
   long int n;
   int i;
   srand((unsigned)time(NULL));
   
   for (i=0; i<15; i++) {
      n += (rand()%10) * (pow(10, i));
   }
   
   printf("\n%li", n);
}
Aparentemente todo correcto.Si no es mucho preguntar, ¿para qué quieres el número?
Si quieres un consejo, mira la manera como te lo pongo que es mucho mas eficiente.
Pasas de 136 multiplicaciones a solamente 15. Piensa en porque, ya que pensar en cosas como estas es igual, o mas importante, que dominar un lenguaje como C.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main (void) {
   long int n = 0;
   int i;
   srand((unsigned)time(NULL));
   
   for (i=0; i<15; i++) {
      n *= 10;
      n += (rand()%10);
   }
   
   printf("\n%li", n);
}



Salu2
mellon escribió:Si quieres un consejo, mira la manera como te lo pongo que es mucho mas eficiente.
Pasas de 136 multiplicaciones a solamente 15. Piensa en porque, ya que pensar en cosas como estas es igual, o mas importante, que dominar un lenguaje como C.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main (void) {
   long int n = 0;
   int i;
   srand((unsigned)time(NULL));
   
   for (i=0; i<15; i++) {
      n *= 10;
      n += (rand()%10);
   }
   
   printf("\n%li", n);
}

Salu2


Bueno, he visto y comprobado tu solución y es efectivamente mas eficiente como tú dices. Mediante una traza comprobé lo que dijiste de las multiplicaciones y ciertamente en mi codigo se ejecutan 136. Así que nada, muchas gracias por tu ayuda, me encanta aprender y que haya alguien dispuesto a ayudarme ^^ ojalá yo este en tu lugar pronto jeje.

Juen escribió:Aparentemente todo correcto.Si no es mucho preguntar, ¿para qué quieres el número?


Pues en principio el número lo quería para generar una clave aleatoria en base a un número constante, veremos si soy capaz de hacerlo. El proyecto es por pura curiosidad, no tiene ninguna finalidad concreta, al menos aún. Un saludo.
Siento mucho no haber ampliado el tuto aun, sigo sin internet (mis padres me han quitado el router), y solo me puedo conectar a ratos cuando ellos no están (si encuentro el router antes).

Gracias a todos aquellos que vais resolviendo dudas mientras no estoy!

Espero lo entendáis, pronto continuaré escribiendo!
Shantotto está baneado por "utilizar clon para saltarse baneo temporal"
Prueba esto, sin ninguna multiplicación y suponiendo que rand() devuelve un número de 15 bits (MAX_RAND es 32767).

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (void) {
   long int n;

   srand((unsigned)time(NULL));
   n=(((long int)rand()<<45) | ((long int)rand()<<30) | ((long int)rand()<<15) | (long int)rand());
   
   printf("\n%li", n);
}


Te da un número de 60 bits, muy superior al tuyo de 15. Si quieres lo puedes acotar haciéndole un modulo 1000000000000000.

Dependiendo de la aplicación que vayas a hacer, si implica seguridad ese número es muy débil, ya que aunque sea de 60 bits (o elijas el de 15 dígitos decimales) el número que generes dependerá de la semilla de la srand, que es fácilmente repetible y que toma como valores el unsigned int de 32 bits. Es decir, que de los 10^15 (2^60) valores que pretendes obtener, "sólo" podrás obtener 2^32 (aprox 4.3*10^9) distintos, Aparte de que al inicializar con time estás dando muchas pistas de por dónde cae tu semilla.
En cualquier caso no creo que el RNG del compilador sea criptográficamente seguro.
Tampoco quiero hacer un programa para la NASA, es simple curiosidad jeje.

Justo hace un par de días termine de leer un libro de introducción a la programación en C/C++ el cual terminaba en la programación orientada a objetos. Me gustaría que me recomendarais otro algún libro para ampliar mis conocimientos y que estuviera mas o menos dentro de mi nivel. Un saludo y gracias una vez mas.
Shantotto escribió:Prueba esto, sin ninguna multiplicación y suponiendo que rand() devuelve un número de 15 bits (MAX_RAND es 32767).

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (void) {
   long int n;

   srand((unsigned)time(NULL));
   n=(((long int)rand()<<45) | ((long int)rand()<<30) | ((long int)rand()<<15) | (long int)rand());
   
   printf("\n%li", n);
}


Te da un número de 60 bits, muy superior al tuyo de 15. Si quieres lo puedes acotar haciéndole un modulo 1000000000000000.

Dependiendo de la aplicación que vayas a hacer, si implica seguridad ese número es muy débil, ya que aunque sea de 60 bits (o elijas el de 15 dígitos decimales) el número que generes dependerá de la semilla de la srand, que es fácilmente repetible y que toma como valores el unsigned int de 32 bits. Es decir, que de los 10^15 (2^60) valores que pretendes obtener, "sólo" podrás obtener 2^32 (aprox 4.3*10^9) distintos, Aparte de que al inicializar con time estás dando muchas pistas de por dónde cae tu semilla.


Buenas,

Está bastante interesante esa forma de generar un número aleatorio, al principio no me enteraba pero informándome un poco de los bitwise operators, veo que generas 4 rands, los colocas a nivel de bits con << para moverlos x posiciones a la izquierda y después los juntas con "|" que seria un OR a nivel de bits. Gracias, he programado bastantes cosas pero nunca había tocado cosas así a nivel de bits.

Cuando el autor del hilo tenga tiempo sería una buena idea incluir estos conceptos en el tutorial ya que se usan bastante en los payloads y esos temas (Para ir tirando en la wikipedia se puede encontrar bastante cosa de los bitwise operators).

Saludos
(mensaje borrado)
Sí, pretendía tocar el tema de las operaciones con bits, pero debido a que es un poco mas "difícil" de entender, y realmente, en aspectos de programación en general casi nunca se tocan, lo había dejado para el final.

Sigo sin internet, pero hoy voy a escribir un poco mientras no vuelvan mis padres.

Os dejo un regalo (os agradecería que, aparte de mirar el código, leyerais este pequeño párrafo)
Durante el tiempo que he estado sin internet, he hecho una cosilla que puede ayudar a alguien.
Alguien sabe lo que son los vectores en C++? Viene a ser una array de C pero dinámicas, no hace falta incluir ninguna delimitacion/tamaño ([x]) y simplemente se pueden ir añadiendo variables en ella.
He hecho algo parecido en C, le falta muchísima optimización, pues hay muchas rutinas repetitivas que se podrían simplificar. Leeros los comentarios que aparecen por allí. También os interesara los múltiples "type casting" que se hacen, las conversiones entre tipos de variables, y lo que a mi más me gusto: como obtener la dirección de un parametro de una función cuando se usa (...) como parametro (mirad la función pushConvertStruct() de la class _ARRAY). Aun no lo hemos tratado en el tutorial, pero también aparece el concepto de class.
La función push() cuando se usa char* (tipo de variable 4, como veréis cuando leáis el código) se tiene que optimizar muchísimo, de hecho, lo ideal sería hacer lo mismo que se hace con el "pushConvertStruct()", es decir, guardar la dirección a la cadena de char, y no los chars.
En la función main() podéis ver el funcionamiento al completo y comentado de la class.

En fin, sin más preámbulos:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

class _ARRAY{
private:
   int varType;

   int itemsCount;
   int currentSize;
   
   int subItemsCount;
   char customStruct[200];
   int structSize;
   int structPos;
   int structItem;
   int itemsPerPos;

   void *bufferHolder;
   int *charIndex;

   void *toReturn;

public:
   /*
   varType:
      1: INT
      2: FLOAT
      3: DOUBLE
      4: CHAR
      5: CUSTOM (STRUCT)
   */
   _ARRAY(int _varType){
      this->varType = _varType;
      this->clear();
   }

   //Para efectuar un mejor clear() se debería usar free()
   void clear(){
      this->bufferHolder = NULL;
      this->charIndex = NULL;
      this->toReturn = NULL;
      this->itemsCount = 0;
      this->subItemsCount = 0;
      this->currentSize = 0;
      this->structSize = 0;
      this->structPos = 0;
      this->structItem = 0;
      this->itemsPerPos = 0;
      strcpy(customStruct, "");
   }

   //Función para establecer el tamaño de la structure
   void setStructSize(int _structSize){
      this->structSize = _structSize;
   }

   //Función para convertir una structure a array
   void pushConvertStruct(char *fmt, ...){
      if(varType != 5)
         return;

      unsigned long argPos = (unsigned long)(&fmt);
      
      int fmtLen = strlen(fmt);

      int readding = 1;
      int i = 0;
      int readChar = 0;
      int readSize = 0;
      while(readding = 1 && i < fmtLen){

         readSize = 0;

         if(readChar){
            switch(fmt[i]){
               case 'c':
               case 'd':{
                  if(itemsCount==0){
                     strcat(customStruct, "%d");
                     itemsPerPos++;
                  }

                  currentSize += 4;
                  if(bufferHolder == NULL)
                     bufferHolder = malloc(currentSize);
                  else
                     bufferHolder = realloc(bufferHolder, currentSize);

                  argPos = (argPos+(unsigned long)sizeof(long));
                  ((int*)bufferHolder)[subItemsCount] = *(int*)argPos;
                  
                  subItemsCount++;
               }break;
               case 'f':{
                  if(itemsCount==0){
                     strcat(customStruct, "%f");
                     itemsPerPos++;
                  }

                  currentSize += 4;
                  if(bufferHolder == NULL)
                     bufferHolder = malloc(currentSize);
                  else
                     bufferHolder = realloc(bufferHolder, currentSize);

                  argPos = (argPos+(unsigned long)sizeof(long));
                  ((float*)bufferHolder)[subItemsCount] = *(float*)argPos;
                  
                  subItemsCount++;
               }break;
               case 's':{
                  if(itemsCount==0){
                     strcat(customStruct, "%s");
                     itemsPerPos++;
                  }

                  currentSize += 4;
                  if(bufferHolder == NULL)
                     bufferHolder = malloc(currentSize);
                  else
                     bufferHolder = realloc(bufferHolder, currentSize);

                  argPos = (argPos+(unsigned long)sizeof(long));
                  unsigned long pointer = *(unsigned long*)(argPos);
                  ((unsigned long*)bufferHolder)[subItemsCount] = pointer;

                  subItemsCount++;
               }break;
            }
            readChar = 0;            

         }else if(fmt[i] == '%')
            readChar = 1;
         else if(fmt[i] == '\0')
            readding = 0;

         i++;
      }

      itemsCount++;
      
   };

   //Guardar elementos en la array
   int push(void *item){
      int allocSize = 0;

      switch(this->varType){
         case 1:{
            allocSize = sizeof(int);
         }break;
         case 2:{
            allocSize = sizeof(float);
         }break;
         case 3:{
            allocSize = sizeof(double);
         }break;
         case 4:{
            allocSize = sizeof(char) * strlen((char *)item) + 1;
            if(charIndex == NULL)
               charIndex = (int*)malloc(sizeof(int));
            else
               charIndex = (int*)realloc(charIndex, (itemsCount)*sizeof(int));
         }break;
         default:
            return 0;
         break;
      }
      
      int temp_location = currentSize;
      currentSize += (allocSize);

      if(bufferHolder == NULL)
         bufferHolder = malloc(allocSize);
      else
         bufferHolder = realloc(bufferHolder, currentSize);
      
      switch(this->varType){
         case 1:{
            ((int*)bufferHolder)[itemsCount] = *(int*)item;
         }break;
         case 2:{
            ((float*)bufferHolder)[itemsCount] = *(float*)item;
         }break;
         case 3:{
            ((double*)bufferHolder)[itemsCount] = *(double*)item;
         }break;
         case 4:{
            for(int i = 0; i < (int)strlen((char *)item); i++)
               ((char *)bufferHolder)[temp_location+i] = ((char*)item)[i];

            ((char *)bufferHolder)[currentSize-1] = '\0';

            charIndex[itemsCount] = temp_location;
         }break;
         default:
            return 0;
         break;
      }
      
      itemsCount++;

      return (itemsCount-1);
   };

   /*
   No es ni mucho menos el mejor algoritmo para ordenar, de hecho, implica una cantidad de loops extremadamente elevada,
   a cuantos mas elementos, mas loops.
   Su uso es muy simple:
      Tenemos un elemento A en la posicion 1
      Otro elemento B en la posicion 2
      Si A > B, se intercambian las posiciones
      Es decir, A pasa a estar en la posicion 2 i B en la 1
      Se hacen loops hasta que no hace ningún cambio, lo cual significa que todos estan ordenados.
   */
   void order(int orderLoop){
      int loops = 0;
      if(this->varType < 4){
         int changes = 1;
         while(changes){
            changes = 0;
            for(int i = 0; i < itemsCount-1; i++ && loops++){

               if(orderLoop == 0){

                  switch(this->varType){
                     case 1:{   
                        if(((int*)bufferHolder)[i] > ((int*)bufferHolder)[i+1]){
                           int buffer = ((int*)bufferHolder)[i+1];
                           ((int*)bufferHolder)[i+1] = ((int*)bufferHolder)[i];
                           ((int*)bufferHolder)[i] = buffer;
                           changes = 1;
                        }
                     }break;
                     case 2:{
                        if(((float*)bufferHolder)[i] > ((float*)bufferHolder)[i+1]){
                           float buffer = ((float*)bufferHolder)[i+1];
                           ((float*)bufferHolder)[i+1] = ((float*)bufferHolder)[i];
                           ((float*)bufferHolder)[i] = buffer;
                           changes = 1;
                        }
                     }break;
                     case 3:{
                        if(((double*)bufferHolder)[i] > ((double*)bufferHolder)[i+1]){
                           double buffer = ((double*)bufferHolder)[i+1];
                           ((double*)bufferHolder)[i+1] = ((double*)bufferHolder)[i];
                           ((double*)bufferHolder)[i] = buffer;
                           changes = 1;
                        }
                     }break;
                  }
               }else{

                  switch(this->varType){
                     case 1:{   
                        if(((int*)bufferHolder)[i] < ((int*)bufferHolder)[i+1]){
                           int buffer = ((int*)bufferHolder)[i+1];
                           ((int*)bufferHolder)[i+1] = ((int*)bufferHolder)[i];
                           ((int*)bufferHolder)[i] = buffer;
                           changes = 1;
                        }
                     }break;
                     case 2:{
                        if(((float*)bufferHolder)[i] < ((float*)bufferHolder)[i+1]){
                           float buffer = ((float*)bufferHolder)[i+1];
                           ((float*)bufferHolder)[i+1] = ((float*)bufferHolder)[i];
                           ((float*)bufferHolder)[i] = buffer;
                           changes = 1;
                        }
                     }break;
                     case 3:{
                        if(((double*)bufferHolder)[i] < ((double*)bufferHolder)[i+1]){
                           double buffer = ((double*)bufferHolder)[i+1];
                           ((double*)bufferHolder)[i+1] = ((double*)bufferHolder)[i];
                           ((double*)bufferHolder)[i] = buffer;
                           changes = 1;
                        }
                     }break;
                  }
               }
            }
         }
      }
      printf("\t%d LOOPS\n", loops);
   }

   //Devuelve el número de elementos en la array
   int count(){
      return this->itemsCount;
   }

   //Devuelve un puntero hacia el elemento indicado
   _ARRAY *ret(int pos, int item = 0){
      if(pos >= itemsCount)
         return this;
      
      switch(this->varType){
         case 1:{
            toReturn = &((int*)bufferHolder)[pos];
         }break;
         case 2:{
            toReturn = &((float*)bufferHolder)[pos];
         }break;
         case 3:{
            toReturn = &((double*)bufferHolder)[pos];
         }break;
         case 4:{
            toReturn = &((char*)bufferHolder)[charIndex[pos]];
         }break;
         case 5:{
            int i = 2;
            toReturn = &i;
            this->structPos = pos;
            this->structItem = item;
         }break;
      }
      
      return this;
   }
   
   /* Conversiones a un tipo de variable concreta*/
   int toInt(){
      if(toReturn == NULL)
         return 0;
      
      int retVal;
      if(this->varType < 4){
         retVal = *(int*)toReturn;
      }else{
         if(this->varType == 4)
            retVal = atoi((char*)toReturn);
         else{

            int switcher;
            int n = 0;
            for(int i = 0; n <= structItem ; i++){
               if(i != 0 && i%2 != 0){
                  n++;
                  switcher = i;
               }
            }

            switch(this->customStruct[switcher]){
               case 'd':
               case 'f':
               case 'c':{
                  retVal = ((int*)bufferHolder)[(itemsPerPos*this->structPos)+structItem];
               }break;
               case 's':{                  
                  retVal = atoi((char*)((unsigned long*)bufferHolder)[(itemsPerPos*this->structPos)+structItem]);
               }break;
            }
         }
      }
      toReturn = NULL;
      return retVal;
   };

   float toFloat(){
      return toDouble();
   };

   double toDouble(){
      if(toReturn == NULL)
         return 0;
      
      double retVal;
      if(this->varType < 4)
         retVal = *(double*)toReturn;
      else{
         if(this->varType == 4)
            retVal = atof((char*)toReturn);
         else{

            int switcher;
            int n = 0;
            for(int i = 0; n <= structItem ; i++){
               if(i != 0 && i%2 != 0){
                  n++;
                  switcher = i;
               }
            }

            switch(this->customStruct[switcher]){
               case 'd':
               case 'f':
               case 'c':{
                  retVal = ((double*)bufferHolder)[(itemsPerPos*this->structPos)+structItem];
               }break;
               case 's':{                  
                  retVal = atof((char*)((unsigned long*)bufferHolder)[(itemsPerPos*this->structPos)+structItem]);
               }break;
            }
         }
      }

      toReturn = NULL;

      return retVal;
   };

   char *toChar(){
      if(toReturn == NULL)
         return 0;

      char *retVal;
      if(this->varType == 4)
         retVal = (char*)toReturn;
      else if(this->varType == 5){
         
         int switcher;
         int n = 0;
         for(int i = 0; n <= structItem ; i++){
            if(i != 0 && i%2 != 0){
               n++;
               switcher = i;
            }
         }

         switch(this->customStruct[switcher]){
            case 'd':
            case 'c':{
               
            }break;
            case 'f':{

            }break;
            case 's':{
               retVal = (char*)((unsigned long*)bufferHolder)[(itemsPerPos*this->structPos)+structItem];
            }break;
         }
      }else{

      }

      toReturn = NULL;

      return retVal;
   };
   /* End conversiones */
};

int main(int argc, char *argv[]){
   
   printf("\n");

   system("pause");
   
   printf("\n");

   printf("\tCreando array (INT)\n");
   printf("\tInicializando valores\n");

   //Creamos la array, usando tipo INT
   _ARRAY cArray(1);
   
   //Iniciamos las variables
   int a = 5;
   int b = 2;
   int c = 3;
   int d = 9;
   int e = 8;
   int f = 1;
   
   //Debemos pasarlas como punteros, asi que, le pasamos la direccion (&)
   cArray.push(&a);
   cArray.push(&b);
   cArray.push(&c);
   cArray.push(&d);
   cArray.push(&e);
   cArray.push(&f);

   printf("\n");

   system("pause");
   
   printf("\n");
   
   printf("\tMostrar valores\n");

   //Enseñamos en pantalla el valor de cada posicion:
   //.ret(posicion) devuelve el valor como puntero
   //->toInt(), asi como todas las funciones que acaban en ->to... devuelven la variable en dicho valor (hacen conversiones automáticamente)
   for(int i = 0; i < cArray.count(); i++)
      printf("\t%d\n", cArray.ret(i)->toInt());   
   
   printf("\n");

   system("pause");
   
   printf("\n");

   printf("\tOrdenando la array\n");
   //Ordenamos las variables por orden ascendente (0) o descendente (1)
   cArray.order(0);
   
   printf("\n");

   system("pause");
   
   printf("\n");

   
   printf("\tMostrar valores ordenados\n");
   //Mostramos de nuevo todas las variables, pero ordenadas
   for(int i = 0; i < cArray.count(); i++)
      printf("\t%d\n", cArray.ret(i)->toInt());   
   
   printf("\n");

   system("pause");

   printf("\n");

   printf("\tCreamos la 2a array (STRUCT)\n");
   printf("\tInicializando valores\n");

   //La borramos
   cArray.clear();
   
   //Creamos una nueva array que servirà para guardar las estructuras
   _ARRAY sArray(5);
   
   //Creamos una estructura
   struct _TEST_STRUCT{
      int a;
      int b;
      char c[200];
      char d[200];
   };
   //Creamos dos variables locales para la estructura
   _TEST_STRUCT testStruct1 = {77, 66, "PRUEBA DE STRING 1!", "666"};
   _TEST_STRUCT testStruct2 = {99, 108, "PRUEBA DE STRING 2!", "9.987657"};

   //Guardamos el tamaño total de la structure
   sArray.setStructSize(sizeof(_TEST_STRUCT));

   //Enviamos las estructuras
   sArray.pushConvertStruct("%d%d%s%s", testStruct1.a, testStruct1.b, testStruct1.c, testStruct1.d);
   sArray.pushConvertStruct("%d%d%s%s", testStruct2.a, testStruct2.b, testStruct2.c, testStruct2.d);

   
   printf("\n");

   system("pause");
   
   printf("\n");
   
   printf("\tMostrando valores\n\n");
   //Mostramos variable local 0, elemento 0
   printf("\t%d\n", sArray.ret(0, 0)->toInt());   //Devolvemos tipo INT
   //Mostramos variable local 0, elemento 1
   printf("\t%d\n", sArray.ret(0, 1)->toInt());   //Devolvemos tipo INT
   //Mostramos variable local 0, elemento 2
   printf("\t%s\n", sArray.ret(0, 2)->toChar());   //Devolvemos tipo CHAR ARRAY
   //Mostramos variable local 0, elemento 3   
   printf("\t%d\n", sArray.ret(0, 3)->toInt());   //Devolvemos tipo INT (auto-conversión: string->int)
      
   printf("\n");

   //Mostramos variable local 1, elemento 0
   printf("\t%d\n", sArray.ret(1, 0)->toInt());   //Devolvemos tipo INT
   //Mostramos variable local 1, elemento 1
   printf("\t%d\n", sArray.ret(1, 1)->toInt());   //Devolvemos tipo INT
   //Mostramos variable local 1, elemento 2
   printf("\t%s\n", sArray.ret(1, 2)->toChar());   //Devolvemos tipo CHAR ARRAY
   //Mostramos variable local 1, elemento 3
   printf("\t%f\n", sArray.ret(1, 3)->toFloat());   //Devolvemos tipo FLOAT (auto-conversión: string->float)
   
   printf("\n");

   system("pause");

   return 0;
}


Nota1: Como bien a recalcado Shantotto, que parece que no me acabé de explicar bien, lo siento, este código es puramente educativo, su finalidad práctica es nula, a no ser que se optimice (que prácticamente implica cambiar todo el código), puesto que la función realloc(), permitidme usar las palabras de el mismo Shantotto, fragmenta mucho la RAM y básicamente, corrompe el heap. En otras palabras, no conviene abusar de la función realloc.

Nota2: Falta añadir conversiones de números (en general) a string, pero no tiene mucho secreto. Se puede crear un char* e ir añadiendole los caracteres mediante strcat, o sino, mucho más limpio y efectivo, usar realloc() (funcion parecida a malloc, pero que en vez de borrar todo lo existente, añade mas memoria a una memoria ya previa mas pequeña) y indirecciones con * para guardar los valores.
Faltaba algo más de lo cual no me acuerdo xd
Shantotto está baneado por "utilizar clon para saltarse baneo temporal"
blipi, te aconsejo que no abuses del realloc, debería ser el último recurso. Eso fragmenta la RAM que da gusto y llegado cierto momento el heap puede ser un puto campo de minas que no te permita hacer mallocs aunque haya mucha RAM libre, pero dispersa. En realidad es mucho mas limpio ir añadiendo a un único buffer, aparte de bastante más rapido: un realloc es un malloc, un memcpy y un free.

Por cierto, las operaciones con bits son el pan nuestro de cada dia de los que nos dedicamos a los microcontroladores, ahí los recursos no son casi infinitos como en un PC y cada posición de RAM, de flash, cada clock, cada algoritmo y cada céntimo de dólar que cuesta un micro más potente cuenta.
Sí, ya se que realloc no es la mejor solución, como ya he dicho ese código se tiene que mejorar y optimizar muchísimo, puesto que no tiene una función práctica sino educativa. Ya recalcaré más el hecho de que no conviene abusar de realloc.

Personalmente, yo nunca trabajaría, ni trabajaré, con eso. Una linked list, por decir algo parecido, es mil veces mejor que eso (refiriéndome a esa class).

Referente a bits... cuando decía aspectos de programación, hacía alusión a código usado en este tuto, o incluso a programación para ps3 (donde, como mucho, harás 1 o 2 en caso de usar tiny3d). Si la intención es hacer payloads, como alguien señaló, estamos en el tuto equivocado xd
Entiendo, y estoy de acuerdo contigo que en programación más avanzada o orientada a otro tipo de plataformas, como podrían ser los microcontroladores (con los cuales he trabajado escasamente, hice un robot con 2 servos y detector de obstáculos por infrarrojos y nada más (en Basic xd)), sí se use mucho más los bits, que como dices tú, se tiene que aprovechar cada dólar que te gastas en eso!

Salu2 y gracias!
Me autocito para que me deis vuestro consejo:
xXDraklordXx escribió:Justo hace un par de días termine de leer un libro de introducción a la programación en C/C++ el cual terminaba en la programación orientada a objetos. Me gustaría que me recomendarais otro algún libro para ampliar mis conocimientos y que estuviera mas o menos dentro de mi nivel. Un saludo y gracias una vez mas.
xXDraklordXx escribió:Me autocito para que me deis vuestro consejo:
xXDraklordXx escribió:Justo hace un par de días termine de leer un libro de introducción a la programación en C/C++ el cual terminaba en la programación orientada a objetos. Me gustaría que me recomendarais otro algún libro para ampliar mis conocimientos y que estuviera mas o menos dentro de mi nivel. Un saludo y gracias una vez mas.


La programación para objetos está pensada para C++, aunque puedes aplicar conceptos a C. A partir de aquí, si pudieras indicar un poco más que sabes hacer, en general, y por donde te gustaría ir, quizás te podría recomendar algo.
blipi escribió:
xXDraklordXx escribió:Me autocito para que me deis vuestro consejo:
xXDraklordXx escribió:Justo hace un par de días termine de leer un libro de introducción a la programación en C/C++ el cual terminaba en la programación orientada a objetos. Me gustaría que me recomendarais otro algún libro para ampliar mis conocimientos y que estuviera mas o menos dentro de mi nivel. Un saludo y gracias una vez mas.


La programación para objetos está pensada para C++, aunque puedes aplicar conceptos a C. A partir de aquí, si pudieras indicar un poco más que sabes hacer, en general, y por donde te gustaría ir, quizás te podría recomendar algo.

En general me gustaría saber de todo un poco de ambos lenguajes. De momento sé manejar operadores, punteros y referencias, cadenas, estructuras, funciones, arrays, algo de objetos (el libro que tengo no profundiza en el tema) y ficheros, todo a un nivel "medio".

Edit: ¿Como declaro un array unidimensional dinamico? Tengo una ligera idea pero no quiero tocar temas de memoria sin conocer antes lo que hago. Un saludo.
xXDraklordXx escribió:
blipi escribió:
xXDraklordXx escribió:Justo hace un par de días termine de leer un libro de introducción a la programación en C/C++ el cual terminaba en la programación orientada a objetos. Me gustaría que me recomendarais otro algún libro para ampliar mis conocimientos y que estuviera mas o menos dentro de mi nivel. Un saludo y gracias una vez mas.


La programación para objetos está pensada para C++, aunque puedes aplicar conceptos a C. A partir de aquí, si pudieras indicar un poco más que sabes hacer, en general, y por donde te gustaría ir, quizás te podría recomendar algo.

En general me gustaría saber de todo un poco de ambos lenguajes. De momento sé manejar operadores, punteros y referencias, cadenas, estructuras, funciones, arrays, algo de objetos (el libro que tengo no profundiza en el tema) y ficheros, todo a un nivel "medio".

Edit: ¿Como declaro un array unidimensional dinamico? Tengo una ligera idea pero no quiero tocar temas de memoria sin conocer antes lo que hago. Un saludo.

Te recomiendo que entiendas y aprendas muy bien como funcionan los punteros ya que en soy muy útiles aunque quizás algo complejos de entender en un principio.
Una vez entendidos te harás una idea de como crear estructuras dinámicas.
Te dejo un curso que parece tener muy buena pinta (acabo de buscártelo, no lo he leído profundamente):
http://www.elrincondelc.com/cursos/punteros.php

Un saludo y ánimo! ;)
Qarl escribió:Te recomiendo que entiendas y aprendas muy bien como funcionan los punteros ya que en soy muy útiles aunque quizás algo complejos de entender en un principio.
Una vez entendidos te harás una idea de como crear estructuras dinámicas.
Te dejo un curso que parece tener muy buena pinta (acabo de buscártelo, no lo he leído profundamente):
http://www.elrincondelc.com/cursos/punteros.php

Un saludo y ánimo! ;)


No puedo ver el powerpoint, de todos modos, mi comprensión de punteros me lleva a declararlo así, ¿es correcto? (Hablamos de un array, no de una estructura)
char c = (char *) malloc(sizeof(char));
Casi, puesto que es un puntero, debes declararlo como tal, te has dejado un *, char *c.
char *c = (char *) malloc(sizeof(char));

Aquí solo tendrías sitio para 1 char, si quieres más sitio:
char *c = (char *) malloc(5*sizeof(char));

Ahora serían 5.

Crear arrays dinamicamente, consiste básicamente en esto. Mirate el codigo que subí hace 1 o dos días, en la página anterior de este mismo post. Allí hay mucha cosa respecto este tema.
Solo añado que el uso de realloc, buscalo, ya verás para que sirve, no conviene abusar de el.
blipi escribió:Casi, puesto que es un puntero, debes declararlo como tal, te has dejado un *, char *c.
char *c = (char *) malloc(sizeof(char));

Aquí solo tendrías sitio para 1 char, si quieres más sitio:
char *c = (char *) malloc(5*sizeof(char));

Ahora serían 5.

Crear arrays dinamicamente, consiste básicamente en esto. Mirate el codigo que subí hace 1 o dos días, en la página anterior de este mismo post. Allí hay mucha cosa respecto este tema.
Solo añado que el uso de realloc, buscalo, ya verás para que sirve, no conviene abusar de el.


Ups, pues en mi código lo tenía así pero aquí se me coló. Pues me alegro de haber sacado eso por mí mismo (sin despreciar vuestra ayuda por supuesto) mediante el estudio. Sinceramente no me gusta nada estudiar pero me apasiona la programación y lo he cogido con muchas ganas. Antes hacía mis cosillas pero ahora la estoy estudiando. blipi, si no es mucho pedir, una recomendación de libro para profundizar en el tema. Sólo encuentro libros para novatos o avanzados y se podría decir que yo estoy en un nivel intermedio...

Mi principal meta es crear una shell en C para poder adaptarla a dispositivos con iOS. Al menos tengo un objetivo claro y lucharé por conseguirlo hasta que dé con otro proyecto interesante.

Venga un saludo señores y gracias por todo.

Edit: Ya miré tu código cuando lo posteastes. Este es el hilo que mas sigo de EOL y en el que mas esperanzas pongo. Por suerte este hilo no es como los demás y aquí se puede hablar de cosas sensatas, pero ese es otro tema jeje.
xXDraklordXx escribió:Mi principal meta es crear una shell en C para poder adaptarla a dispositivos con iOS. Al menos tengo un objetivo claro y lucharé por conseguirlo hasta que dé con otro proyecto interesante.

Venga un saludo señores y gracias por todo.

Edit: Ya miré tu código cuando lo posteastes. Este es el hilo que mas sigo de EOL y en el que mas esperanzas pongo. Por suerte este hilo no es como los demás y aquí se puede hablar de cosas sensatas, pero ese es otro tema jeje.

Ánimo con el proyecto! [oki] [oki]

La verdad que sí, este es uno de los pocos hilos que no están llenos de spam y comentarios que sobran o suben el tono.
Trataré de pasarme por aquí a menudo para ayudar en lo posible jeje.

Salu2 ;)
Siento abrumar con dudas......... Solo me falta un detalle para tener una base para la shell, ¿cómo recojo el resultado de un comando en un array por ejemplo?

Edit: Bueno, al final encontré la funcion popen, que realiza el trabajo que yo quiero. El problema viene al leer el resultado y almacenarlo en el array dinámico, no sé como hacerlo.

Mi idea era esta pero no funciona al no saber como declarar el tamaño de un array dinámico.
...
   fp = popen("ls -a", "r");
   fread(out, strlen(out), 1, fp);
   pclose(fp);
...
Mira, lo que tienes que hacer es obtener el la cantidad de caracteres que tiene el "archivo" y después declarar el tamaño de la array.
Sería algo así:
...
    char *out=NULL; // Declaramos el puntero vacío y sin tamaño.
    int len=0; // Variable donde almacenaremos la cantidad de caracteres que tiene el "archivo".
...
    fp = popen("ls -a", "r");
    len = obtenerTamaño(fp); // Esta función no existe, debes buscar una que haga esto o algo similar.
    out = new char[len]; // Damos al puntero el tamaño que hemos obtenido (variable len).
    out <--- fp; // Tienes que buscar una función para meter el contenido del fichero en la array.
    cout << out; // Imprimimos el resultado del comando "ls -a".
    pclose(fp);
Qarl escribió:Mira, lo que tienes que hacer es obtener el la cantidad de caracteres que tiene el "archivo" y después declarar el tamaño de la array.
Sería algo así:
...
    char *out=NULL; // Declaramos el puntero vacío y sin tamaño.
    int len=0; // Variable donde almacenaremos la cantidad de caracteres que tiene el "archivo".
...
    fp = popen("ls -a", "r");
    len = obtenerTamaño(fp); // Esta función no existe, debes buscar una que haga esto o algo similar.
    out = new char[len]; // Damos al puntero el tamaño que hemos obtenido (variable len).
    out <--- fp; // Tienes que buscar una función para meter el contenido del fichero en la array.
    cout << out; // Imprimimos el resultado del comando "ls -a".
    pclose(fp);


He optado por leerlo caracter a caracter (abajo dejo el código). Funcionar funciona pero no sé por qué al final de la lectura me recoge estos 2 ¿carácteres?: "\377\377".
#include <stdio.h>
#include <stdlib.h>

int main (void) {
   char *in = (char *) malloc(sizeof(char));
   FILE *fp;
   
   printf("Shell: ");
   gets(in);
   
   fp = popen(in, "r");
   while (!feof(fp)) {
      printf("%c", fgetc(fp));
   }
   pclose(fp);
   
   free(in);
}
Si pudieses poner todo lo que te aparece en consola desde que escribes el comando hasta que lo imprimes a lo mejor se me ocurre algo que pueda estar pasando. [tadoramo]

Salu2 ;)
Qarl escribió:Si pudieses poner todo lo que te aparece en consola desde que escribes el comando hasta que lo imprimes a lo mejor se me ocurre algo que pueda estar pasando. [tadoramo]

Salu2 ;)


Dame un momento. (Uso Xcode como IDE) no sé si influirá...

Edit: aquí lo tienes.

[Session started at 2011-02-15 22:24:25 +0100.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1510) (Wed Sep 22 02:45:02 UTC 2010)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".
tty /dev/ttys000
Loading program into debugger…
Program loaded.
run
[Switching to process 9903]
Running…
warning: this program uses gets(), which is unsafe.
Shell: ls -a
.
..
.DS_Store
Shell
\377\377
Debugger stopped.
Program exited with status value:0.

Otro ejemplo. Uno de esos caracteres sale siempre al final, el otro parece ser "aleatorio"...

[Session started at 2011-02-15 22:27:24 +0100.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1510) (Wed Sep 22 02:45:02 UTC 2010)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".
tty /dev/ttys002
Loading program into debugger…
Program loaded.
run
[Switching to process 9989]
Running…
warning: this program uses gets(), which is unsafe.
Shell: PWD
\377/Users/crazy-al3x/Documents/Programación Mac OS X/Shell/build/Debug
\377
Debugger stopped.
Program exited with status value:0.

Decir que esto ocurre en la consola debug de Xcode. Al ejecutarlo desde la terminal simplemente aparece un signo de interrogación ("?").
Es raro la verdad :-?
Pero.. ¿todo eso te imprime tu programa cuando lo ejecutas? ¿porque no le quitas todo eso del principio y alguna que otra cosa innecesaria por ahora? Te lo recomiendo para evitar quebraderos de cabeza y que luego encima no sea culpa tuya jaja.
Qarl escribió:Es raro la verdad :-?
Pero.. ¿todo eso te imprime tu programa cuando lo ejecutas? ¿porque no le quitas todo eso del principio y alguna que otra cosa innecesaria por ahora? Te lo recomiendo para evitar quebraderos de cabeza y que luego encima no sea culpa tuya jaja.

Eso es porque es la consola debug no el terminal. Al hacerlo desde terminal el resultado es este:

Shell: ls -a
.
..
.DS_STORE
Shell
?


Edit: Bueno acabo de descubrir que ese caracter equivale al -1 en la tabla ASCII y mediante un código, que considero inutil, puedo ignorarlo. Así quedaría ahora el código, pero sigo con la duda de por qué esta ahí ese caracter.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void) {
   char *in = (char *) malloc(sizeof(char));
   char c;
   FILE *fp;
   
   do {
      printf("Shell: ");
      gets(in);
      
      fp = popen(in, "r");
      
      while (!feof(fp)) {
         c = fgetc(fp);
         if (c!=-1) {
            printf("%c", c);
         }
      }
      pclose(fp);
   } while (strcmp(in, "exit"));

   
   free(in);
   
   fpurge(stdin);
   printf("Pulse Intro para finalizar...");
   getchar();
}
xXDraklordXx escribió:Me autocito para que me deis vuestro consejo:
xXDraklordXx escribió:Justo hace un par de días termine de leer un libro de introducción a la programación en C/C++ el cual terminaba en la programación orientada a objetos. Me gustaría que me recomendarais otro algún libro para ampliar mis conocimientos y que estuviera mas o menos dentro de mi nivel. Un saludo y gracias una vez mas.

HOIJA:
hay va eso:
programacion en c, metodologia, algoritmos y estructura de datos. de Joyanes Aguilar y Ignacio Zahonero Martines.
Magnifico libro para iniciarse, ademas explica c con vistas a pasarse a c++.

Stroustrup B.- The C++ Programing Languaje
Si , es muy pesado, todo el mundo recomienda este libro, pero es que es muy bueno.

Despues de este libro debes de ser capaz de seguir por tu cuenta, son muy buenos.

La serie Como si estubiera en primero de la universidad de navarra son muy buenos ademas de gratis,
de estos si dejo el link:


http://www.tecnun.es/typo3/index.php?id=1559


Asi mismo te recomiendo que veas otros lenguajes para ver otras maneras de hacer las cosas, aunque no sea a fondo.
Java es muy facil para desarrolladores c, y tiene una barbaridad de soluciones ya implementadas.

perl es el gran recomendado, aprendes mucho de programacion.
ruby me encanta, su framework rails es magnifico.
phyton no lo he visto mucho, pero indudablemente es buenisimo, sobretodo por que
sin tener ni idea de phyton, pero si de programacion se entienden perfectamente los codigos.

Algo de ingenieria del software tampoco biene mal, sobretodo para abstraerse del codigo.
Si necesitas mas avisa.
el_itineranT escribió:
xXDraklordXx escribió:Me autocito para que me deis vuestro consejo:
xXDraklordXx escribió:Justo hace un par de días termine de leer un libro de introducción a la programación en C/C++ el cual terminaba en la programación orientada a objetos. Me gustaría que me recomendarais otro algún libro para ampliar mis conocimientos y que estuviera mas o menos dentro de mi nivel. Un saludo y gracias una vez mas.


hay va eso:
programacion en c, metodologia, algoritmos yestructura de datos. de Joyanes Aguilar y Ignacio Zahonero Martines.
Magnifico libro para iniciarse, ademas explica c con vistas a pasarse a c++.

Stroustrup B.- The C++ Programing Languaje
Si , es muy pesado, todo el mundo recomienda este libro, pero es que es muy bueno.

Despues de este libro debes de ser capaz de seguir por tu cuenta, son muy buenos.

La serie Como si estubiera en primero de la universidad de navarra son muy buenos ademas de gratis,
de estos si dejo el link:


http://www.tecnun.es/typo3/index.php?id=1559


Asi mismo te recomiendo que veas otros lenguajes para ver otras maneras de hacer las cosas, aunque no sea a fondo.
Java es muy facil para desarrolladores c, y tiene una barbaridad de soluciones ya implementadas.

perl es el gran recomendado, aprendes mucho de programacion.
ruby me encanta, su framework rails es magnifico.
phyton no lo he visto mucho, pero indudablemente es buenisimo, sobretodo por que
sin tener ni idea de phyton, pero si de programacion se entienden perfectamente los codigos.

Algo de ingenieria del software tampoco biene mal, sobretodo para abstraerse del codigo.
Si necesitas mas avisa.


Pues agradezco tu ayuda muchísimo. Comentarte que he seguido tu consejo antes de que me lo dieras, C y C++ no son los primeros lenguajes que toco y ni mucho menos serán los últimos. He hecho de todo un poco pero hasta la fecha estos dos son los que mas me han gustado y en los que mas estoy profundizando.

Miraré los libros que me has dejado y ya te comentaré. Un saludo y gracias de nuevo.
@xXDraklordXx

Un pequeño detalle:
char *in = (char *) malloc(sizeof(char));

Esto es correcto, sin embargo, estas creando una array de tamaño 1, es decir, que como mucho acepta 1 letra. Si lees mas de una letra con gets(), como sería el caso de "C:\\...." estas causando un "overflow", que significa, "usando más memoria de la asignada", pues, si tu reservas espacio para 1 letra con el malloc, y luego le escribes 5 letras (por ejemplo), te pasas.
Un estándar al declarar variables char* como buffer (buffer es, más o menos, "contenedor") de un directorio, se declaran de 1024 carácteres:
char *in = (char *) malloc(1024*sizeof(char));


Luego, ese -1, lo devuelve la función fgetc(), indicando que se ha acabado la lectura o bien que hay un error de lectura. Así pues, ese -1 puede ser ignorado tal y como tu haces con el if.

Por lo demás, todo perfecto. Ánimo y continua con tu proyecto!
blipi escribió:Por lo demás, todo perfecto. Ánimo y continua con tu proyecto!

Pues me he encontrado con una sorpresita por parte de mi iPhone. Al empezar con la shell me di cuenta de que es bastante "pobre" y no conoce comandos como "cd" o "help" así que me huelo tener que programarla entera, cosa que evidentemente sería mucho mas productiva y didáctica pero igual de pesada... Empezando por lo fácil y ya no sé como seguir. No sé como podría programar comandos como "ls" o "cd"... Me parece que esto va a tener que esperar y que voy a tener que tragar por algo mas sencillito de momento jeje.
xXDraklordXx escribió:
blipi escribió:Por lo demás, todo perfecto. Ánimo y continua con tu proyecto!

Pues me he encontrado con una sorpresita por parte de mi iPhone. Al empezar con la shell me di cuenta de que es bastante "pobre" y no conoce comandos como "cd" o "help" así que me huelo tener que programarla entera, cosa que evidentemente sería mucho mas productiva y didáctica pero igual de pesada... Empezando por lo fácil y ya no sé como seguir. No sé como podría programar comandos como "ls" o "cd"... Me parece que esto va a tener que esperar y que voy a tener que tragar por algo mas sencillito de momento jeje.

Yo en tu caso haría algo así:
- Creas una función a la que la pasarás una cadena de caracteres la cual será el comando introducido por el usuario.
- Dentro de dicha función, compruebas la cadena introducida con todos los comandos declarados y programados previamente por tí.
- Si la cadena de caracteres coincide con algún comando que has definido, se ejecutará.

En plan código sería algo así:
int ejecutar(char comando[32])
{
     if(comando=="ls")
     {
          funcion_ls();
          return 0;
     }
     else if(comando=="chmod")
     {
          funcion_chmod();
          return 0;
     }
     else if(comando=="reboot")
     {
          funcion_reboot();
          return 0;
     }
     else
          return -1; // Esto quiere decir que no se ha encontrado el comando, devolvemos -1 por ejemplo para saberlo.
}


Después tendrías que currarte uno a uno los comandos con funciones que haya en el SDK de iPhone y tal... unas prácticamente no tendrás que tocar nada, en otras te tendrás que comer la cabeza y admitir parámetros y demás... eso ya es cuestión de tiempo y práctica jeje.

Espero haberte ayudado, un saludo y ánimo ;)
Bueno y ya que estamos para intentar quitarme un poco de trabajo y posibles errores. ¿Como puedo declarar una cadena sin especificar cuánta memoria debe usar para que ni sobre ni falte?

Edit: Qarl, el como pasar los comandos, y saber si existen o no, lo tengo mas o menos claro, el problema es el completar la función "ls" por ejemplo... En el caso de esa función lo que no sé es cómo obtener todos los archivos de un directorio...

Edit 2: Vaya, no tenía tan claro como pasar los comandos... No sé como recoger una cadena y de ella obtener por un lado el comando y por otro los argumentos tal y como lo haría con "argv[]"... Veo que esto me está empezando a quedar grande :( Pensé en el uso de strtok y trocear la cadena en base a los espacios para obtener cada argumento por separado en un array por ejemplo. El problema es que los argumentos también necesitan información, como por ejemplo "ping -c 5 www.google.es". Conclusión, si no resuelvo esto ya me puedo ir olvidando...
Puedes probar a usar la función sscanf(string,formato,variables) para coger los valores por separado pero tendrías el problema de que no siempre es igual el formato de los comandos. La función hace lo mismo que un scanf pero cogiendo los valores de una string existente.

Aquí tienes un ejemplo:
   char a[21],b[21],original[42];

   // suponiendo que original tienes 2 palabras de 20 caracteres cada una separadas por un espacio

   sscanf(original,"%s %s",a,b);


Saludos
xXDraklordXx escribió:Bueno y ya que estamos para intentar quitarme un poco de trabajo y posibles errores. ¿Como puedo declarar una cadena sin especificar cuánta memoria debe usar para que ni sobre ni falte?

Pues... deberías de obtener la cantidad de caracteres que el usuario introduce, y una vez los sepas, asignar un tamaño al puntero.
Ejemplo:
char *comando = NULL;
// Aquí pediríamos al usuario que introduzca el comando y calcularíamos la cantidad de caracteres introducidos.
char comando = new char[tamañoObtenido];


xXDraklordXx escribió:Edit: Qarl, el como pasar los comandos, y saber si existen o no, lo tengo mas o menos claro, el problema es el completar la función "ls" por ejemplo... En el caso de esa función lo que no sé es cómo obtener todos los archivos de un directorio...
Edit 2: Vaya, no tenía tan claro como pasar los comandos... No sé como recoger una cadena y de ella obtener por un lado el comando y por otro los argumentos tal y como lo haría con "argv[]"... Veo que esto me está empezando a quedar grande :( Pensé en el uso de strtok y trocear la cadena en base a los espacios para obtener cada argumento por separado en un array por ejemplo. El problema es que los argumentos también necesitan información, como por ejemplo "ping -c 5 http://www.google.es". Conclusión, si no resuelvo esto ya me puedo ir olvidando...

Creo que estás "empezando la casa por el tejado" jejeje, yo primero me centraría en programar una consola sencilla sin parámetros. Después de tener más o menos una estructura del programa pues ya desarrollar un sistema de parámetros que los vayas obteniendo buscando espacios entre cada uno.

No te desanimes hombre, esto se hace poco a poco XD
Salu2 ;)
Sin palabras, peazo de kurro, estudie hace un tiempo c, y la verdad que refresca la memoria bastante
Muy grande la currada que te has pegado, eso lo primero.

Pero solo pensaba una cosa, que tiene que ver esto con la Scene de la PS3. No debería estar en el apartado de PC? Lo digo porque no se que uso tiene, pero si me decis que se usa para tal cosa, pues por mí no hay problema.
djnardo escribió:Muy grande la currada que te has pegado, eso lo primero.

Pero solo pensaba una cosa, que tiene que ver esto con la Scene de la PS3. No debería estar en el apartado de PC? Lo digo porque no se que uso tiene, pero si me decis que se usa para tal cosa, pues por mí no hay problema.

En parte tienes razón.. pero como C es un lenguaje que se usa en PS3 pues no molesta aquí, y viene bien para encontrarlo rápido y tal.

PD: He hecho un tutorial sobre instalar el PSL1GHT en Ubuntu, si lo quieres añadir al hilo principal como nota final para que los usuarios que aprendan trasteen con PS3. Por si acaso lo quieres poner éste es el tutorial.

Un saludo, gracias!! ;)
Qarl escribió:Creo que estás "empezando la casa por el tejado" jejeje, yo primero me centraría en programar una consola sencilla sin parámetros. Después de tener más o menos una estructura del programa pues ya desarrollar un sistema de parámetros que los vayas obteniendo buscando espacios entre cada uno.

No te desanimes hombre, esto se hace poco a poco XD
Salu2 ;)

Prefiero empezar por aquí para tener claro como hacer el resto ya que si luego encuentro una forma mejor de pasar los argumentos tendría que volver a escribir todo lo que llevase hecho. Finalmente he encontrado una forma de separar el texto de una cadena por espacios en índices de un array. Eso si, en C no he sido capaz y he tenido que echar mano del SDK del iPhone. Pero bueno, como es para eso para lo que lo quiero de momento no me comeré más la cabeza xD. Veremos si puedo seguir ahora...

Edit: No quiero preguntar tanto ( [mamaaaaa] ) pero lo que pregunto lo busco antes y al no encontrarlo recurro a vosotros... Al usar la función chdir() y una dirección con espacios la ruta no cambia. Este es el código que estoy probando sin resultado:

...
chdir("hola\ adios");
...

Estando la carpeta (hola adios/) en la raiz. Sin embargo al ejecutar en terminal cd hola\ adios sí que responde...

Edit 2: Ignorad lo anterior. Le estaba pasando mal la dirección, me comí la cabeza añadiendo la barra oblicua "\" a la dirección cuando no era necesario. Ahora funciona sin problemas xD. Pues esto marcha, ya tengo escrita la función cd() XD
xXDraklordXx escribió:Prefiero empezar por aquí para tener claro como hacer el resto ya que si luego encuentro una forma mejor de pasar los argumentos tendría que volver a escribir todo lo que llevase hecho


Lo de ingenieria del software va por aqui, si tienes que volver a esribir codigo para hacer modificaciones, eso se considera un error de diseño, su escalabilidad es nula, y eso tambien es un error de programacion.Yo procuraria hacer muchos metodos que realicen las acciones simples, y el modulo principal, solo hace las llamadas a los metodos(estos metodos a su vez tienen que tener otros metodos), de manera que añadir funcionalidades nuevas o modificaciones no tengas que empezar de nuevo el codigo.

Es decir, eso lo realiza un modulo aparte, de manera que implementarlo signifique una unica linea en el programa principal(esto en POO es mucho mas visible y facil)

decir, que soy estudiante de ing.informatica (en curso) y que puedo estar metiendo la pata hasta el fondo, si me equivoco agradezco a qualquiera que me corrija.
448 respuestas
13, 4, 5, 6, 79