PREGUNTAS CONTESTADAS -

 Hay un total de 745 Preguntas.<<  >> 

    Pregunta:  65390 - ESTRUCTURAS COMO PARAMETROS
Autor:  Juan Ortiz
Hola, mi problema es el siguiente, tengo creado una estructura, despues creo un vector que el tipo es la estructura, y cuando lo quiero pasar como parametro me da errores por todos lados, como seria el prototipo? lo que tengo es lo siguiente:

#include<stdio.h>
#include<conio.h>
#include<string.h>
void carga (libros []);

main ()
{
typedef struct {
int cod, cant;
char autor[20], tit[20];} libros;
libros exis [10];
int opc;
carga (exis);
do {
printf ("1-PRESTAMO DE LIBROS 2-DEVOLUCION DE LIBROS 3-FIN");
do {
scanf (" %d", &opc);
} while ((opc<1) && (opc>3));
switch (opc)
{
case 1: presupuesto (); break;
case 2: devolucion (); break;
};while ( opc != 3);
getch ();
return 0;
}

Obvio falta declarar la funcion esa y las otras, y un monton de cosas. Espero que me puedan ayudar. Gracias :)
  Respuesta:  Capitan Kirk
El problema es que has definido el prototipo de la función carga ANTES de definir la estructura libros, por lo que, para empezar, ya te dará un error en la definición de ese prototipo (no te reconoce el tipo del parámetro). Debes sacar la definición de la estructura fuera de la función main (no puede ir ahí si la defines con typedef) y ponerla antes de la definición del prototipo de función. Como sugerencia, estructura tus programas de este modo:

- #include (archivo(s) de cabecera a incluir)
- #define (definición de macros, si los usas)
- typedef struct (definiciones de estructuras de datos)
- Prototipos de funciones
- Variables globales, si las usas
- Función main()
- Resto de funciones (las declaradas en los prototipos)

De este modo, te aseguras de que todo lo que utilices ha sido declarado previamente.

Saludos,

    Pregunta:  65458 - DIFERENCIA ENTRE <<ENDL Y N
Autor:  carlos munuera
Mi pregunta es: ¿ cual es la diferencia entre <<endl y <<" " en el lenguaje de programacion c?
  Respuesta:  NOIS dev
Buenas, aunque hayas puesto " " deduzco que te referías a "\n", la diferencia es simplemente que endl es especifico de iostream y \n es un carácter genérico de un salto de línea, un carácter especial, realmente no hay diferencia en cuanto a funcionalidad.

Estos son algunos de esos caracteres especiales:

\n Salto de línea
\t Tabulación horizontal
\v Tabulación vertical
\a Alerta sonora
\0 Carácter nulo
\b Mueve el cursor hacia atrás
\” Comillas dobles como texto

Saludos!

    Pregunta:  65843 - SWICH COMPUESTO (CON DOS VARIABLES) EN C
Autor:  Alejandro Caro
como hago un switch compuesto (con dos variables) en c , cuando lo intento me tira error

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
double a, b, c, r1, r2, real, compleja, d; //Declaración de variables
int varseleccion;
printf("a = "); printf("b = "); printf("c = ");
printf("Ecuaci¢n: %e.x^2 + %e.x + %e", a, b, c);

switch (varseleccion){ //Ecuación degenerada
case a = 0 && case b = 0: //<-- case label does not reduce to an integer constant
printf("La ecuaci¢n es degenerada");
break;
case a = 0 && case b != 0: //Dos raíces reales iguales //<-- case label does not reduce to an integer constant
r1 = -c / b;
//r2 = r1
printf("r1 = r2 = %e", r1);
break;
default:
d = pow(b,2) - 4 * a * c;

switch (varseleccion){
case d >= 0: //Dos raíces reales diferentes //<-- case label does not reduce to an integer constant
r1 = (pow(-b + (pow(b,2) - 4 * a * c), (1 / 2))) / (2 * a);
r2 = (pow(-b - (pow(b,2) - 4 * a * c), (1 / 2))) / (2 * a);
printf("r1 = %e", r1);
printf("r2 = %e", r2);
break;
default: //Dos raíces complejas conjugadas
real = -b / (2 * a);
compleja = ((pow(b,2) + 4 * a * c), ((1 / 2))) / (2 * a); //<-- warning: value computed is not used|
printf("r1 = %e + %e.i", real, compleja);
printf("r2 = %e + %e.i", real, compleja);
}
}
return 0;
}
  Respuesta:  Capitan Kirk
Estás utilizando mal switch. Su sintaxis es:

switch (nombre_variable)
{
case valor_1:
(codigo);
break;
case valor_2:
(codigo);
break;
default:
(codigo);
break;
}

nombre_variable es la variable de control del switch, y por supuesto que debe haber sido iniciada a algún valor antes de entrar al switch. Cosa que no has hecho, has entrado con varseleccion pero sin haberle asignado un valor previamente.

Los elementos valor_1, valor_2, etc (pueden ser tantos como haga falta) no pueden ser variables, deben ser valores constantes y de tipo entero. Por eso te indica "case label does not reduce to an integer constant". Por supuesto, no puedes utilizar asignaciones, operaciones ni comparaciones: el resultado, aunque sea de tipo entero, no sería una constante de tipo entero.

Para lo que quieres hacer, es mucho más sencillo utilizar comparaciones simples, con if. Por cierto, las comparaciones de igualdad serían

if (a == 0)

sí, con dos signos igual consecutivos (y la condición del if siempre va entre paréntesis), si pones simplemente

if (a = 0)

te va a hacer dos cosas:

1. La variable a pasa a valer 0 (le has hecho una asignacion, no una comparacuion).

2. El resultado de if (a = 0) es siempre verdadero, dado que lo que hay entre paréntesis (que es lo que estás comprobando) es una asignación, que siempre va a poder hacerse.

Otros detalles, relacionados con la lógica de tu programa, son:

Si a == 0 y b != 0, no tienes dos raíces reales, lo que tienes es una ecuación de primer grado con una sola solución. Las dos raíces iguales las tienes en el caso a != 0, b == 0.

Si ya has calculado el discriminante en la variable d (d = pow(b,2)- 4*a*c), no necesitas volverlo a calcular cuando calculas las raíces. Además, tenías la b en el sitio equivocado. Simplemente sería

r1 = (-b + pow(d, (1.0 / 2.0) ) ) / (2 * a)
r2 =

Cuando utilizas para calcular la raíz cuadrada la función pow, estás empleando como exponente la expresión (1/2). Matemáticamente, es correcto, pero al compilar el compilador te va a evaluar el 1 como entero, el 2 como entero, y el resultado de la division entera 1/2 es cero, con lo que al final estás elevando a cero. En las operaciones entre números de distintos tipos (en tu caso, entre int y double) se "promociona" a los de menor rango al mayor rango (es decir, los int, momentáneamente, te los considera como double), pero en este caso, dado que el (1/2) lo tienes entre parentesis, te calcula primero el parentesis como entero (resultado, 0) y luego te lo promociona a double (resultado, 0.0, y no el 0.5 que debería ser). La conclusión de este rollo es que, cuando utilices constantes numéricas que vayan a trabajar con tipos float o double, les añadas detrás el punto decimal. Bastaría con poner (1. / 2.) en lugar de (1/2). El poner el 0 detrás del punto decimal es por legibilidad, para verlo al primer golpe de vista.

De todos modos, tienes una función sqrt para calcular la raíz cuadrada.

Si las raíces no son reales (d < 0), has hecho mal el cálculo de la parte compleja. Simplemente, cambia el signo a d:

d = -d;
compleja = sqrt(d) / (2*a);
printf("r1 = %e + %e.i", real, compleja);
printf("r2 = %e - %e.i", real, compleja);

Saludos,

    Pregunta:  65847 - ALLEGRO.H NO SUCH FILE OR DIRECTORY
Autor:  marcos sanchez
Hola, recientemente me he descargado la biblioteca allegro, desde el compilador del cual trabajo, dev cpp 4.9.9.2. y cuando intento ejecutar un simple código, me tira un error que me lo marca en la línea de: #include <allegro.h> y me dice: allegro.h no such file or directory, es como que no me reconoce la librería. No se que es lo que sucede, bueno, espero que alguien me pueda ayudar...
  Respuesta:  marcos sanchez
Bueno, vuelvo a escribir para decir que ya le he encontrado una respuesta, y, es que, yo estaba siguiendo un manual que utiliza allegro pero una versión vieja, entonces, el problema es que yo tengo que escribir:
#include <allegro/allegro5>, y en el manual me aparecía:
#include <allegro>.

    Pregunta:  65904 - PROBLEMA: PUNTERO A CAMPO DE ESTRUCTURA
Autor:  Marcos Sanchez
Bueno, ando molestándolos nuevamente, tengo que hacer un programita que tiene que(entre otras cosas) leer un archivo de texto y corroborar si uno de los campos (el campo fecha), contiene un cero en alguno de los 4 primeros caracteres, para lo que use un puntero(cadena) para que apunte al arreglo (fecha), y el puntero itera a través de un lazo for. Pero me tira un error que me dice:

In function `void sacarRegCeros()':
46 C:... incompatible types in assignment of `char (*)[10]' to `char*[10]'

Espero que alguien me pueda ayudar, muchas gracias.

(Utilizo el dev cpp 4.9.9.2)
Este es el codigo:

//Este programa debe leer un archivo, y copiar los contenidos de las fechas de nac
// que no tengan ceros como principio. Ademas, los registros que estén bien,
//deben ser guardados y ordenados con un campo mas llamado numeroDeCliente.

#include <iostream>
#include <stdio.h>
#include <string.h>
#define ARCHIVO "PASADOBIEN.DAT"

struct cli {char fechaN[10];
char nombre[35];
char direccion[35];
};
struct client {int numeroDcli;
char feechaN[10];
char nombreE[35];
char direccionE[35];
};

FILE *archivoPtr;
FILE *pasPtr;

void abrirA(void);
void sacarRegCeros(void);
void guardarRe(struct cli comprobar);
void cerrar(void);
int main (void);
/******************************************************************************/
void abrirA(void)
{
archivoPtr = fopen("ARCHIVOnuevo.DAT", "r");
pasPtr = fopen ("PASADOBIEN.DAT", "a+");
sacarRegCeros();
return;
}
/******************************************************************************/
void sacarRegCeros(void)
{
fseek(archivoPtr, 0L, SEEK_SET);
struct cli comprobar;
memset(&comprobar,0,sizeof(comprobar));
int contador;
char *cadena[10];
cadena = &comprobar.fechaN;

while(archivoPtr != NULL)
{
for(contador = 0; contador <4; contador++)
{
if(cadena[contador] == 0)
{fseek(archivoPtr, sizeof(comprobar), SEEK_CUR);
}
if((contador == 3)&& cadena[contador] !=0)
{guardarRe(comprobar);
fseek(archivoPtr, sizeof(comprobar), SEEK_CUR);
}
}

}
return;
}
/******************************************************************************/
void guardarRe(struct cli comprobar)
{
fseek(pasPtr, 1L, SEEK_END);
struct client n;
n.numeroDcli = ftell(pasPtr)/sizeof(n);
strcpy(n.feechaN, comprobar.fechaN);
strcpy(n.nombreE, comprobar.nombre);
strcpy(n.direccionE, comprobar.direccion);
fwrite(&comprobar, sizeof(comprobar), 1, pasPtr);
return;
}
/******************************************************************************/
void cerrar (void)
{
fclose(archivoPtr);
fclose(pasPtr);
return;
}
/******************************************************************************/

/******************************************************************************/
int main(void)
{ abrirA();
cerrar();
printf("archivo procesado");
system("pause");
return 0;
}
  Respuesta:  Capitan Kirk
En la función sacarRegCeros has declarado

char *cadena[10];

con lo que cadena es un array de 10 punteros a char.

En C / C++, el nombre de un array es un puntero al primer elemento del array. En este caso, cadena contendrá la dirección donde comienza un array de 10 punteros a char. Por ser una declaración explícita, se resuelve en tiempo de compilación y no puede cambiarse su valor en tiempo de ejecución. Al hacer la asignación

cadena = &comprobar.fechaN;

estás intentando cambiar la dirección de comienzo de ese array en tiempo de ejecución, cosa que no puedes hacer, y es ese el error que te está dando, o al menos así lo creo, dado que en el código que has posteado la línea 46 corresponde a una comparación.

Saludos,

|<  <<  65 66 67 68 69 70 71 72 73 74 75  >>  >|