Referencia de un char [] en una función.[Akai pasate por favor que modificado]xD

Iniciado por anonimo12121, 24 Marzo 2011, 13:05 PM

0 Miembros y 1 Visitante están viendo este tema.

anonimo12121

#10
Es esto? http://www.cplusplus.com/reference/iostream/stringstream/
Es que yo esto nunca lo había visto creo. xD



Mira un ejemplo de lo que quiero. Es que no se si me habéis entendido o no os entiendo yo xDD.
Si podéis fijaros en global me funciona.
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
char hola[20];
class clase{
    private:
    public:
        clase();
        //char hola[20];
        void cambiar_nombre(char *name,int a,int b);
};
clase::clase(){
    //strcpy(hola,"megaman-01.bmp");
};
void clase::cambiar_nombre(char *name,int a,int b){
    char c[2];
    itoa(a,c,10);
    name[b]=c[0];
    name[b+1]=c[1];
    cout << c[0] << endl;
    cout << c[1] << endl;
    cout << name << endl;
    cout << name << endl;
   
};
int main(int argc,char *argv[]){
    clase c;
    strcpy(hola,"megaman-01.bmp");
    c.cambiar_nombre(hola,15,8);
    cout << "\n----------------------------"<< endl;
    cout << hola;
    cin.get();
    cin.get();
   
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Te lo puse en el segundo post, después que dijeras que "no usas printf y esas cosas". >,<

Hay que fijarse más

anonimo12121

#12
Cita de: Akai en 25 Marzo 2011, 14:58 PM
Te lo puse en el segundo post, después que dijeras que "no usas printf y esas cosas". >,<

Hay que fijarse más
Estoy ciego perdido perdona XDD

Por cierto sabéis alguno de esto en español?

EDITO:

Usando sprintf me pasa lo mismo con la asignación.
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
//char hola[20];
class clase{
   private:
   public:
       clase();
       char hola[20];
       void cambiar_nombre(char *name,int a,int b);
};
clase::clase(){
   strcpy(hola,"megaman-01.bmp");
};
void clase::cambiar_nombre(char *name,int a,int b){
   char c[2];
   sprintf(c, "%d",a);
   name[b]=c[0];
   name[b+1]=c[1];
   cout << c[0] << endl;
   cout << c[1] << endl;
   cout << name << endl;
   cout << name << endl;
   
};
int main(int argc,char *argv[]){
   clase c;
   c.cambiar_nombre(c.hola,15,8);
   cout << "\n----------------------------"<< endl;
   cout << c.hola;
   cin.get();
   cin.get();
   return 0;
}




EDITO 2:

Akai tu querias decir esto?
Código (cpp) [Seleccionar]
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc,char *argv[]){
   char t[2];
   char cadena[20];
   strcpy(cadena,"megaman-01.bmp");
   sprintf(t,"%d",20);
   cadena[8]=t[0];
   cadena[9]=t[1];
   cout << cadena;
   cin.get();
   return 0;
}



EDITO 3: XDDD

Mi código de buscar carácter y modificarlo funciona solo me hace falta aprender lo de referenciar. Para poder modificar variables no globales con la función XDD.
Código (cpp) [Seleccionar]
#include <iostream>
#include <sstream>
using namespace std;
void acarga_imagen(char *name,int n, int v){
   char t[2];
   for(int i=0;i<n;i++){
       for(int j=0;;j++){
           if(name[j]=='.')break;
           if(name[j]=='-'){
               sprintf(t,"%d",v);
               if(v<10)name[j+1]='0';
               else name[j+1]=t[0];
               if(v<10)name[j+2]=t[0];
               else name[j+2]=t[1];
               break;
           }
       }
   }
   cout << name;
};
int main(int argc,char *argv[]){
   char nombre[]="megaman-01.bmp";
   acarga_imagen(nombre,1,5);
   //cout << nombre;
   cin.get();
   return 0;
}code]



EDITO4: pfff.
He tenido que solucionar una cosa que me daba error por que se me cerraba el programa y erá al asignarle un valor a el puntero lo que he tenido que hacer es copiar el puntero a una array de la funcion y modificar la array .
CODE.
Código (cpp) [Seleccionar]
void sprite::acarga_imagen(char *name,int n){
    char t[2];
    char t2[20];
    strcpy(t2,name);
    for(int i=0;i<n;i++){
        for(int j=0;;j++){
            if(name[j]=='.')break;
            if(name[j]=='-'){
                sprintf(t,"%d",i+1);
                if(i<10)t2[j+1]='0';
                else t2[j+1]=t[0];
                if(i<10)t2[j+2]=t[0];
                else t2[j+2]=t[1];
            }
        }
        ERROR << t2 << endl;
        animacion[i]=SDL_LoadBMP(t2);
        SDL_SetColorKey(animacion[i],SDL_SRCCOLORKEY,SDL_MapRGB(animacion[i]->format,ct.r,ct.g,ct.b));
    }
};
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Si quieres pasar por referencia en C++, es tan simple como:
Código (cpp) [Seleccionar]
void sprite::acarga_imagen(char* name,int & n){

De esta forma, pasas n por referencia. Fin del problema


Por otro lado, lo de sprintf, si, me refería a eso, PERO falla una cosa, sprintf si el número es menor que 10, no te va a imprimir 09 o 08, por tanto, no tienes dos carácteres en la cadena (entendiendo estos dos carácteres como representables (numeros, letras), y posiblemente tengas el final de cadena). Entonces, eso deberás gestionarlo tu (si num <10 haces de una forma, sino, de otra)

anonimo12121

Ya lo he solucionado no se que era lo que me pasaba XD siento las molestias gracias.

Código (cpp) [Seleccionar]
#include <iostream>
#include <sstream>
using namespace std;
class clase{
    private:
    public:
        clase();
        char nombre[100];
        void acarga_imagen(char *name,int n);
};
clase::clase(){
    strcpy(nombre,"megaman-01.bmp");
};
void clase::acarga_imagen(char *name,int n){
    char t[2];
    for(int i=1;i<n+1;i++){
        for(int j=0;;j++){
            if(name[j]=='.')break;
            if(name[j]=='-'){
                sprintf(t,"%d",i);
                if(i<10)name[j+1]='0';
                else name[j+1]=t[0];
                if(i<10)name[j+2]=t[0];
                else name[j+2]=t[1];
                break;
            }
        }
        cout << name << endl;
    }
};
int main(int argc,char *argv[]){
    clase c;
    c.acarga_imagen(c.nombre,5);
    cin.get();
    return 0;
}
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Un consejo, Xafi:
Si esta comprobación
Código (cpp) [Seleccionar]
  if(i<10)name[j+1]='0';
                else name[j+1]=t[0];
                if(i<10)name[j+2]=t[0];
                else name[j+2]=t[1];


La sacases fuera del bucle, ganarías en velocidad. De hecho, podrías hacer dos bucles, uno de 0 a 9, otro de 10 en adelante.

Simplemente un consejo para evitar comprobaciones que no tienen sentido una vez pasas la frontera del 10

anonimo12121

Cita de: Akai en 29 Marzo 2011, 15:29 PM
Un consejo, Xafi:
Si esta comprobación
Código (cpp) [Seleccionar]
 if(i<10)name[j+1]='0';
               else name[j+1]=t[0];
               if(i<10)name[j+2]=t[0];
               else name[j+2]=t[1];


La sacases fuera del bucle, ganarías en velocidad. De hecho, podrías hacer dos bucles, uno de 0 a 9, otro de 10 en adelante.

Simplemente un consejo para evitar comprobaciones que no tienen sentido una vez pasas la frontera del 10
Voy analizar bien lo que dices para ver si lo puedo optimizar como dices en lo escrito. pero creo que lo conforme esta los hace esa comparación cuando llega al '-'.
Gracias.

EDITO: vale creo que ya entendí XD
EDITO2: No se me ocurre otra forma XDDD
EDITO3: La única forma que se me acaba de ocurrir es esta.
Código (cpp) [Seleccionar]
#include <iostream>
#include <sstream>
using namespace std;
class clase{
   private:
   public:
       clase();
       char nombre[100];
       void acarga_imagen(char *name,int n);
};
clase::clase(){
   strcpy(nombre,"megaman-01.bmp");
};
void clase::acarga_imagen(char *name,int n){
   char t[2];
   for(int i=1;i<n+1;i++){
       if(n<10){
           for(int j=0;;j++){
               if(name[j]=='.')break;
               if(name[j]=='-'){
                   sprintf(t,"%d",i);
                   name[j+1]='0';
                   name[j+2]=t[0];
                   break;
               }
           }
       }
       else {
           for(int j=0;;j++){
               if(name[j]=='.')break;
               if(name[j]=='-'){
                   sprintf(t,"%d",i);
                   name[j+1]=t[0];
                   name[j+2]=t[1];
                   break;
               }
           }
       }
           
       cout << name << endl;
   }
};
int main(int argc,char *argv[]){
   clase c;
   c.acarga_imagen(c.nombre,5);
   cin.get();
   return 0;
}


PD: Creo que así me ahorra un "if".
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Si, a eso me refería. Y no, no te ahorras un if. Bueno, quizá en el código si, pero en ejecución ahorras iterar comprobando cada vez.

anonimo12121

Cita de: Akai en 29 Marzo 2011, 16:35 PM
Si, a eso me refería. Y no, no te ahorras un if. Bueno, quizá en el código si, pero en ejecución ahorras iterar comprobando cada vez.
Como puedo saber formas de optimizar mis códigos?
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Puff... Ahí ya no sabría decirte tan claro. Principalmente la experiencia va enseñándote esos truquillos con el tiempo. Por otro lado, tener en cuenta los costes asimptóticos de tus algoritmos también te va dando esa visión.

Luego hay libros que se meten bastante en ese tema pero el único que conozco es Code Complete 2, de Steve McConnel. En si es un libro dedicado a desarrollo de software, pero incluye un capítulo de optimización y "tunning" de código, (no tengo enlace para descargarlo, pero estoy seguro que no será dificil encontrarlo).

Por otro lado, quizá sea suerte mía que en la facultad haya tenido hasta ahora, en las asignaturas relacionadas con la programación, profesores bastante exigentes con el tema de los costes.