Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - ivancea96

#741
En estos casos, ten en cuenta el orden en que se llaman los operadores: http://es.cppreference.com/w/cpp/language/operator_precedence

Primero, 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.
#742
El campo de la estructura no se llama "texto_t". Se llama "nombre" o "direccion", según cual quieras.
ptrAlumno->nombre.tipo = 1;
Además, "tipo" no es un puntero, as´ñi que pones "." en vez de "->".
#743
El primero en generar un algoritmo fue el primer hombre en pensar, así que tendremos que remontarnos al paleolítico (o antes :X)
#744
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)
#745
Si nunca trabajaste con cadenas de caracteres o si lo vas  ahacer más adelante, entonces lo mejor que puedes hacer es aceptar el 0 (o un valor negativo) como "comando" para pedir el radio.
Citar       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: ");
          scanf("%.2f", &r);
       }
#746
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
Los códigos que te puse son cortos. Dime qué partes no entiendes, y las explico.

Citar   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: ");
      scanf("%.2f", &r);
   }

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: ");
      scanf("%.2f", &r);
   }


Además, no necesitas poner la condición "c==0". Si no se cumple "c!=0" significa que siempre se cumplirá "c==0".
#748
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];
fgets(c, 50, stdin);

printf("%i - %i", (int)c[0], strlen(c));
}


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];
fgets(c, 50, stdin);

if(c[0] != '\n'){
int n = atoi(c);
printf("%i", n);
}
}
#749
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.

Código (cpp) [Seleccionar]
#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
Código (cpp) [Seleccionar]
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.