› Foros › PlayStation 3 › Scene
#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;
}
}
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
#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);
}
#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);
}
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
Juen escribió:Aparentemente todo correcto.Si no es mucho preguntar, ¿para qué quieres el número?
#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);
}
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.
#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;
}
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.
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.
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.
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!
char c = (char *) malloc(sizeof(char));
char *c = (char *) malloc(sizeof(char));
char *c = (char *) malloc(5*sizeof(char));
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.
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.
...
fp = popen("ls -a", "r");
fread(out, strlen(out), 1, fp);
pclose(fp);
...
...
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);
#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);
}
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.
Salu2
[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.
[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.
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.
Shell: ls -a
.
..
.DS_STORE
Shell
?
#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.
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.
char *in = (char *) malloc(sizeof(char));
char *in = (char *) malloc(1024*sizeof(char));
blipi escribió:Por lo demás, todo perfecto. Ánimo y continua con tu proyecto!
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.
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.
}
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);
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?
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...
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.
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
Salu2
...
chdir("hola\ adios");
...
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