|
741
|
Programación / Programación C/C++ / Re: otra manera de escribir *envp++
|
en: 7 Febrero 2017, 22:38 pm
|
En estos casos, ten en cuenta el orden en que se llaman los operadores: http://es.cppreference.com/w/cpp/language/operator_precedencePrimero, el post-incremento(_++). Luego, la desreferencia(*). *envp++;
Eso es lo mismo que: *(envp++);
El post-incremento retorna el valor que tiene actualmente, e incrementa el valor de la variable (el retorno sigue siendo el antiguo). Así pues, poner ese * ahí no hace nada funcional. En caso de que te refieras a: str = *envp++;
Pues hace lo esperado. str tendrá el valor de *envp, y luego se incrementará. El compilador usualmente optimizará estas cosas, no es un tema realmente preocupante. Es más importante la legibilidad del código y, por supuesto, la funcionalidad. Si programases C++, sí que podría tener algo más de repercusión al trabajar con objetos. Pero no mucha más.
|
|
|
744
|
Programación / Programación C/C++ / Re: Estructuras anidadas en lenguaje C. -
|
en: 5 Febrero 2017, 15:06 pm
|
void get_String( texto_t * NomDir );
get_String( ptrAlumno->nombre );
ptrAlumno->nombre no es texto_t*, es texto_t. para pasarle la dirección de memoria, el operador &: get_String( &ptrAlumno->nombre );
Y otra cosa importante: alumno *ptrAlumno;
es un puntero a alumno, no un alumno. Tienes que reservar memoria: alumno *ptrAlumno = (alumno *) malloc(sizeof(alumno ));
Y un detalle más. Cuando sea así, postea el error. Este era un código corto, pero en códigos largos, sin el error, puede ser complicado ver el problema (y no siempre vamos a compilar nosotros el código para ver los errores)
|
|
|
746
|
Programación / Programación C/C++ / Re: Como declaro una variable como no dfinida o especificada en C
|
en: 4 Febrero 2017, 17:38 pm
|
Un int guarda números. Tú quieres leer un número O una línea en blanco. No puedes leer una línea en blanco en un int, así que hay que hacerlo al revés: primero, leer la línea que introduce el usuario como una cadena, y luego, si no está vacía, transformarla en int. Eso es lo que hago en el mensaje que puse antes. Si no entiendes algo de esos códigos, dímelo. Pero esa es una manera.
|
|
|
747
|
Programación / Programación C/C++ / Re: Como declaro una variable como no dfinida o especificada en C
|
en: 4 Febrero 2017, 16:40 pm
|
Los códigos que te puse son cortos. Dime qué partes no entiendes, y las explico. if(c!=0){ printf("\n El valor de r es igual a: %f",r ); }else if(c==0){ printf("\n La longitud de la circunferencia es 0"); EXIT? // Como hago para salir de la condición "else if"? }else{ printf("\n Defina la variable longitud del radio: "); }
Si de la segunda condicion quieres pasar directamente al else, pues, directamente, mételo todo junto: if(c!=0){ printf("\n El valor de r es igual a: %f",r ); }else{ printf("\n La longitud de la circunferencia es 0"); printf("\n Defina la variable longitud del radio: "); }
Además, no necesitas poner la condición "c==0". Si no se cumple "c!=0" significa que siempre se cumplirá "c==0".
|
|
|
748
|
Programación / Programación C/C++ / Re: Como declaro una variable como no dfinida o especificada en C
|
en: 4 Febrero 2017, 16:14 pm
|
Para lo que buscas: Utiliza fgets para leer en la cadena. Si el usuario pulsa enter, la cadnea tendrá longitud 1 y su primer caracter será el salto de linea: #include <stdio.h> #include <string.h> int main(){ char c[50]; }
Luego, si no es un salto de línea, conviertes la cadena a un int con stoi: #include <stdlib.h> #include <stdio.h> int main(){ char c[50]; if(c[0] != '\n'){ } }
|
|
|
749
|
Programación / Programación C/C++ / Re: RegSetValueEx me crea la regla en chino?
|
en: 4 Febrero 2017, 14:54 pm
|
Perdona que responda así, pero me tengo que ir y no quería dejar esto: https://github.com/ivancea/Varios/blob/master/C%2B%2B/reg.hÉchale u ojo a cómo lo llamo ahí. *Creo que funcionaba correctamente*. Luego cuando esté si no te funcionó así, lo pruebo. EDITO: Ya lo probé, y bien. Ese RegSetValueEx, en mi caso, llama a RegSetValueAxA (la versión ANSI). También podrías llamar explícitamente a RegSetValueKeyExW usando wstring. #include <windows.h> #include <iostream> void regAdd(HKEY type, std::string ruta, std::string valor, std::string data){ HKEY key; RegCreateKey(type,ruta.c_str(),&key); RegSetValueExA(key, valor.c_str(), 0, REG_SZ, (const BYTE*)data.c_str(),data.size()); RegCloseKey(key); } int main(){ regAdd(HKEY_CURRENT_USER, "Test", "prueba", "datos"); }
Y con respecto al error que tienes tú: En el primer código que pusiste, no puedes llamar a strlen con de TCHAR*. Yo de ti prescindiría de los LPCTSTR y pasaría directamente los valores de las string. Y bueno, en vez de strlen, valor.size().
|
|
|
750
|
Programación / Programación C/C++ / Re: [C++][Consulta] Error inesperado con destructor
|
en: 3 Febrero 2017, 14:35 pm
|
void Eliminar(ArbolBinario *rama) { if(NULL != rama->izda) Eliminar(rama->izda); if(NULL != rama->dcha) Eliminar(rama->dcha); delete rama; }
Eliminar no establece las ramas a NULL. COn esta función recursiva, estás eliminando todas las ramas, pero de manera incorrecta: Primero, liberas la memoria de cada lado de la rama. Luego, llamas al destructor de la rama y la liberas. El destructor de la rama, ya llama a Eliminar. Solo que ahora, llama a Eliminar sobre unas ramas que no apuntan a nada válido.
|
|
|
|
|
|
|