Autor
|
Tema: Referencia de un char [] en una función.[Akai pasate por favor que modificado]xD (Leído 15,112 veces)
|
anonimo12121
|
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. #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();
|
|
« Última modificación: 25 Marzo 2011, 15:12 pm por Xafi »
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Te lo puse en el segundo post, después que dijeras que "no usas printf y esas cosas". >,<
Hay que fijarse más
|
|
|
En línea
|
|
|
|
anonimo12121
|
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. #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? #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. #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. 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)); } };
|
|
« Última modificación: 25 Marzo 2011, 23:56 pm por Xafi »
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Si quieres pasar por referencia en C++, es tan simple como: 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)
|
|
|
En línea
|
|
|
|
anonimo12121
|
Ya lo he solucionado no se que era lo que me pasaba XD siento las molestias gracias. #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; }
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Un consejo, Xafi: Si esta comprobación 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
|
|
|
En línea
|
|
|
|
anonimo12121
|
Un consejo, Xafi: Si esta comprobación 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. #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".
|
|
« Última modificación: 29 Marzo 2011, 16:34 pm por Xafi »
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
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.
|
|
|
En línea
|
|
|
|
anonimo12121
|
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?
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Referencia a argumento en funcion.-
Programación Visual Basic
|
mdg
|
1
|
2,148
|
9 Agosto 2007, 23:43 pm
por CeLaYa
|
|
|
funcion palindroma por referencia(con punteros)
Programación C/C++
|
roser24
|
1
|
5,753
|
6 Mayo 2010, 03:01 am
por biribau
|
|
|
Hacer referencia al último archivo modificado en un directorio
Scripting
|
TheMaker
|
2
|
5,630
|
4 Octubre 2010, 16:39 pm
por orvtech
|
|
|
Pasar matriz char a una función como referencia
Programación C/C++
|
KISKE
|
2
|
7,288
|
18 Junio 2013, 13:07 pm
por KISKE
|
|
|
Problemas pasando por referencia un char...
Programación C/C++
|
jomoza
|
1
|
1,673
|
20 Diciembre 2014, 22:47 pm
por ivancea96
|
|