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 - rir3760

#1251
En C++ (C++98, habrá que revisar el nuevo estándar) no puedes utilizar variables para indicar el numero de elementos en un array, deben ser constantes.

Y para indicar el valor inicial de cada elemento en un array utilizas una lista de valores delimitada con llaves. Eso aplica de forma recursiva si cada elemento (como es tu caso) también es un array:
Código (cpp) [Seleccionar]
const int linea = 3
const int columna = 3;

// ...

int mat[linea][columna] = {
   {5, 1, 2},
   {5, 1, 2},
   {5, 1, 2}
};


Un saludo
#1252
Cita de: Lotharsan en 16 Julio 2012, 01:13 AMAunque ahora me ha quedado la duda de porqué una función como scanf or getchar no se hicieron ya contemplando esta situación en la que leen datos residuales o símplemente no se les añadió la opción de eliminar datos residuales después de haber leido la información
Ese no es el problema.

Los dolores de cabeza se deben al uso intercalado de funciones que no ignoran el espacio blanco (getchar/fgets/etc.) con funciones que usualmente si lo hacen como scanf o fscanf.

En lugar de llamar a "getchar" para descartar un carácter puedes utilizar scanf para leer los tres datos:
do {
   printf("Introduce la distancia recorrida: ");
   scanf("%f", &e);

   printf("Introduce la velocidad media: ");
   scanf("%f", &v);
   printf("El tiempo invertido ha sido %.2f\n", v / e);

   printf("quieres repetirlo? ");
   scanf(" %c", &r);
}while (r == 's' || r == 'S');

Con el espacio en " %c" nos aseguramos de descartar la secuencia de espacio blanco a continuación del numero indicando la velocidad.

De nuevo solo es cuestión de manejar bien las funciones. Y si eso no basta se puede desarrollar una propia (y a la medida).

Un saludo
#1253
Programación C/C++ / Re: Librerias en linux?
19 Julio 2012, 18:27 PM
Solo falta indicar el tipo de retorno de la función "main", debe ser "int":

int main(void)
{
   /* ... */
   
   return 0; /* 0 == Terminacion normal (sin errores) */
}


También debes verificar no se realice una división entre cero.

Un saludo
#1254
Cita de: DickGumshoe en 19 Julio 2012, 09:43 AM
A mí siempre me ha pedido el (char*) antes de usar malloc().
Si compilas como C no debe pedirte la conversión, ella es automática.
Si compilas como C++ la conversión es obligatoria.


Cita de: DickGumshoe en 19 Julio 2012, 09:43 AM
Por otra parte, yo siempre he usado:

variable = (char *) malloc (20 * sizeof(char));

Creo que es necesario poner también el sizeof(char) para que sepa que tiene que reservar el espacio de 20 char, al menos así lo vi yo por los libros a partir de los que aprendí C.
No es necesaria esa multiplicación ya que "sizeof(char)" siempre es igual a uno.

Un saludo
#1255
Si estas aprendiendo C++ deberías utilizar las facilidades que este provee como es la clase string. Si no tienes una referencia de calidad puedes utilizar la del sitio (en ingles) C plus plus.

Un ejemplo sencillo (para el caso demasiado largo) es:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

string fn(char texto[]);

int main()
{
string s;

s = fn("Esta es una cadena de prueba");
cout << s << endl;

return 0;
}

string fn(char texto[])
{
string s(texto);

return s;
}


Un saludo
#1256
Cita de: fMtQr en 19 Julio 2012, 02:36 AM
No hay manera, haber si puedes ayudarme,

...

Error :
test.cpp: In function 'char* func()':
test.cpp:4:7: warning: address of local variable 'txt2' returned [enabled by default]
test.cpp: In function 'int main()':
test.cpp:13:13: error: incompatible types in assignment of 'char*' to 'char [20]'


En que me equivoco??
Lo primero que debes aclarar es el lenguaje de programación que estas utilizando ya que el código fuente es C pero la extensión "cpp" sugiere que es C++. ¿Cual de ellos?

Si se trata de C debes seguir la solución de Leo Gutiérrez y si se trata de C++ puedes utilizar la clase string.

Un saludo
#1257
En relacion al programa de BlackZeroX (Astaroth):
end[1] = (char*)((size_t)end[0] + strFln);

/* ... */

memcpy((void*)((int)ret + sizeL + strRln), end[1], sizeR);

Esas conversiones no son necesarias. La primera porque el puntero resultante (sin conversiones) es del tipo apropiado y la segunda porque un puntero de cualquier tipo puede pasarse sin problemas a una función que espere uno de tipo "void *" (la única excepción son funciones con un tipo variable de argumentos como "printf" pero eso ya es otra historia).


Se puede crear una función que remplace las instancias de una subcadena por otra utilizando "strstr", "sprintf" y aritmética de punteros. Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *remplazar(char const *cad, char const *sub, char const *rem);

int main(void)
{
  char *p = " xxxxx\n xxxxx\n xxxxx\n";
  char *q;
 
  printf("%s----\n", p);
  q = remplazar(p, "xxxxx", "Hello, world");
  printf("%s", q);
  free(q);
 
  return EXIT_SUCCESS;
}

char *remplazar(char const *cad, char const *sub, char const *rem)
{
  char *nueva;
  char const *p;
  char *q;
 
  size_t nc_cad = strlen(cad);
  size_t nc_sub = strlen(sub);
  size_t nc_rem = strlen(rem);
 
  if (nc_rem > nc_sub)
     nueva = malloc((nc_cad / nc_sub + 1) * nc_rem);
  else
     nueva = malloc(nc_cad + 1);
  if (nueva == NULL)
     return NULL;
 
  q = nueva;
  while ((p = strstr(cad, sub)) != NULL){
     q += sprintf(q, "%.*s%s", (int) (p - cad), cad, rem);
     cad = p + nc_sub;
  }
  q += sprintf(q, "%s", cad);
 
  if ((q = realloc(nueva, q - nueva + 1)) == NULL){
     free(nueva);
  }
  return q;
}


Un saludo
#1258
No es necesario. Toda cadena literal por ejemplo:
char *msg = "Hola";

Es en realidad un array anónimo (sin nombre) que se almacena en alguna dirección de memoria y consiste de los caracteres indicados mas el terminador de cadena '\0'.

Un saludo
#1259
Programación C/C++ / Re: Ayuda array facil
11 Marzo 2012, 02:05 AM
Si como indicas todavía no puedes utilizar punteros (supongo tampoco un array de arrays) lo que debes hacer es utilizar una sentencia de selección ("if" o "switch") para imprimir el mes. Para darte un ejemplo:
Código (cpp) [Seleccionar]
if (x.mes == 0)
   cout << "Enero";
else if (x.mes == 1)
   cout << "Febrero";

...

else
   cout << "Diciembre";


Aparte de eso tienes varios errores en el programa, tres de estos son:

* En la definición de la función "mostrar" no indicas el nombre del parámetro, debería ser:
Código (cpp) [Seleccionar]
void mostrar(fecha x) ...

* No puedes utilizar el carácter 'ñ' como parte del nombre de una variable.

* No hay consistencia entre los indices utilizados en la función "main" (utilizas como mes el valor 12) y en la función "mostrar" (ahí el ultimo mes tiene el indice 11).

Un saludo
#1260
Programación C/C++ / Re: Contar caracters
11 Marzo 2012, 01:55 AM
Advierto: para variar me voy a pasar de "pesadito" (mas bien [CENSORED]).

Cita de: Xandrete en 10 Marzo 2012, 16:00 PMSólo una cosa. El tipo char tiene asociado el rango [-128,127], no el [-127,127]. Codificación Ca2.
No exactamente. Es mas complicado.

Para empezar el tipo "char" es equivalente a "signed char" (lo usual, al menos en PCs de escritorio) o "unsigned char" y, aquí el problema, eso es "implementation defined". Por ello el rango valido del tipo "char" es CHAR_MIN  .. CHAR_MAX (ambas macros cortesía del encabezado <limits.h>).

En el caso del tipo "signed char" y considerando que el mínimo numero de bits que lo componen es ocho su rango mínimo garantizado es -127 .. 127. Ello porque el estándar de C no especifica como serán representados los números negativos. De nuevo lo usual es complemento a dos pero bien puede utilizarse complemento a uno o magnitud con signo y en ese caso se debe considerar al (inútil) cero negativo.

Cita de: Xandrete en 10 Marzo 2012, 16:00 PMPor otro lado, quisiera recomendar la buena costumbre de utilizar operaciones aritméticas con caracteres. Por ejemplo, si se desea crear un array con una posición para cada letra minúscula. crearlo como int array['z'-'a'+1]. De esta manera quedará más clara la función del array y nos aseguramos de no haber contado mal las letras del abecedario >.<

Y también me gustaría aconsejar usar la directiva define o declarar variables constantes para asignar identificadores:

Código (cpp) [Seleccionar]
#define NUMOFLETTERS 'z'-'a'+1
...
int array[NUMOFLETTERS];
Cuando las macros resultan en expresiones la convención es colocarlas delimitadas por paréntesis, de no hacerlo se pueden presentar casos donde la expresión termina con resultados no deseados, por ejemplo si declaramos un array con el doble de elementos:
int array[NUMOFLETTERS * 2];
Se presenta un error lógico.

Un saludo