Getting wrong value in variable in C using structs - c

I have problems getting the right value for cociente; every time I run it, cociente is printed as 1 but that is not the value I want to assign it, this is the code where I print:
printf("\nEl valor del cociente es: %d",(polinomio_->polinomio->cociente));.
This is my code:
#include<stdio.h>
#include<stdlib.h>
typedef struct termino
{
int exponente;
float cociente;
} termino;
typedef struct polinomio
{
termino* polinomio;
int size;
} polinomio;
void multiplicarEscalar(int escalar, termino* term){
term->cociente = (term->cociente)*(float)escalar;
}
main()
{
int size_;
termino* terminos;
int cociente_temporal;
polinomio *polinomio_;
//polinomio_ = malloc(sizeof(polinomio));
//printf("%d",(sizeof(polinomio_)*2));
printf("Bienvenido al cálculo de operaciones usando 1 polinomio.\n");
printf("Ingrese la cantidad de términos que tendrá el polinomio.");
scanf("%d",&size_);
terminos =(termino*) malloc(sizeof(termino) * size_);
polinomio_ = (polinomio*) malloc(sizeof(polinomio) );
polinomio_->polinomio = terminos;
polinomio_->size = size_;
printf("Ingrese el cociente 0:\n");
scanf("%d",&cociente_temporal);
polinomio_->polinomio->cociente = cociente_temporal;
//multiplicarEscalar(2,polinomio_->polinomio);
printf("\nEl valor del cociente es: %d",(polinomio_->polinomio->cociente));
free(polinomio_);
}

You are using "%d" to print a float. That leads to undefined behavior.
Instead of
printf("\nEl valor del cociente es: %d",(polinomio_->polinomio->cociente));
use
printf("\nEl valor del cociente es: %f",(polinomio_->polinomio->cociente));
// ^^^

Related

Why is this happening? (memory lose(?))

I can't seem t find why my program is crashing with segmentation fault.
char *nom;
char **tmp=&nom;
printf("Creando ruta ...\n");
printf("\nIntrodueix el id de la ruta: ");
int ID=demanaInt();
int existe=checkIfRutaExisteix(ID);
if(existe==1){
printf("Ja existeix una ruta amb aquesta ID (id ha de ser unica)");
return;
}
printf("\nIntrodueix el nom de la ruta: ");
demanaString(tmp);
printf("\nIntrodueix el numero de parades: ");
int numParades=demanaInt();
Ruta *r = malloc(sizeof(*r) + sizeof(Parades) + sizeof(*(r->parades.coordenades)) * numParades + sizeof(nom));
strcpy(r->nom, nom);
if(numParades!=-1){
r->parades.numParades=numParades;
}else{
return;
}
int c;
for(int i=0;i<numParades;i++){
r->parades.coordenades[i] = malloc(sizeof(*(r->parades.coordenades[i])*2));
printf("Introdueix la coordenada x de la parada numero %d: ", i);
c=demanaInt();
if(c==-1){
return;
}
r->parades.coordenades[i][0]=c;
printf("Introdueix la coordenada y de la parada numero %d: ", i);
c=demanaInt();
if(c==-1){
return;
}
r->parades.coordenades[i][1]=c;
printf("%d, %d\n", r->parades.coordenades[i][0], r->parades.coordenades[i][1]);
}
printf("Introdueix ID regio: ");
r->IDregio=demanaInt();
r->ID=ID;
guardaRutaCSV(r);
Just before asking for an int evreything is correct, but after that I seem to lose information.
This is my output of GDB:
Creando ruta ...
Introdueix el id de la ruta: 4
Introdueix el nom de la ruta: ref
Introdueix el numero de parades: 3
Introdueix la coordenada x de la parada numero 0: 1
Introdueix la coordenada y de la parada numero 0: 2
1, 2
Introdueix la coordenada x de la parada numero 1: 3
Introdueix la coordenada y de la parada numero 1: 4
3, 4
Introdueix la coordenada x de la parada numero 2: 5
Introdueix la coordenada y de la parada numero 2: 6
5, 6
Breakpoint 1, generarRuta () at ruta.c:90
90 printf("Introdueix ID regio: ");
(gdb) p r->parades.coordenades[0][1]
$1 = 2
(gdb) n
91 r->IDregio=demanaInt();
(gdb) p r->parades.coordenades[0][1]
$2 = 2
(gdb) n
Introdueix ID regio: 99
92 r->ID=ID;
(gdb) p r->parades.coordenades[0][1]
No se puede acceder a la memoria en la dirección 0x555500000067
Why is no longer accesible the information inside the array?
PD: here is the struct:
typedef struct _parades{
int numParades;
int *coordenades[];
} Parades;
typedef struct _ruta{
int ID;
Parades parades;
int IDregio;
char nom[];
} Ruta;
A struct with a flexible array member (array with []) can't be used as a member in another struct. From the C spec (6.7.2.1):
A structure or union shall not contain a member with incomplete or function type (hence,
a structure shall not contain an instance of itself, but may contain a pointer to an instance
of itself), except that the last member of a structure with more than one named member
may have incomplete array type; such a structure (and any union containing, possibly
recursively, a member that is such a structure) shall not be a member of a structure or an
element of an array.
The shall here indicates that the compiler should be giving you a diagnostic message for this code. (Parades being such a structure means it can't be used as a member in Ruta)

passing 'float (float)' to parameter of incompatible type 'float' [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 2 years ago.
Improve this question
#include <stdio.h>
#include <math.h>
//// PROTOTIPOS DE FUNCIONES
int numeroPagos(int anios);
// devuelve el numero de pagos mensuales
float interesMensual(float interesAnualTantoPorCiento);
// devuelve el interés mensual, correspondiente a un interés anual dado como tanto por ciento
// interesMensual=(1+interesAnual)^(1/12)-1
float pago(float capital, float interesMensual, int numeroPagos);
// devuelve la cuota mensual de la hipoteca
// pago= capital x ((1+interés mensual)n x interés mensual) / ((1+interés mensual)n-1)
// n = numeroPagos
void leerCondicionesHipoteca(float * capital, float * interesAnualTantoPorCiento, int * anios);
// lee por teclado el capital, el interés anual (en %) y el número de años
//printTablaAmortizacion(float capital,float interesAnualTantoPorCiento,float anios);
// muestra la tabla de amortización de la hipoteca que incluye el pago mensual, los intereses
// el capital amortizado y el capital vivo
// intereses = capital vivo anterior * interés mensual
// amortizado = pago mensual – intereses
// capital vivo actual = capital vivo anterior - amortizado
//// IMPLEMENTACION FUNCION PRINCIPAL
int main()
{
float capital,interesAnualTantoPorCiento;
int anios;
leerCondicionesHipoteca(&capital, &interesAnualTantoPorCiento, &anios);
numeroPagos(anios);
interesMensual(interesAnualTantoPorCiento);
pago(capital, interesMensual, numeroPagos);
}
//// IMPLEMENTACION RESTANTES FUNCIONES
void leerCondicionesHipoteca(float * capital, float * interesAnualTantoPorCiento, int * anios)
{
printf("Introduce el capital: ");
scanf("%f", capital);
printf("Introduce el interes anual : ");
scanf("%f", interesAnualTantoPorCiento);
printf("Introduce el numero de anios: ");
scanf("%d", anios);
}
int numeroPagos(int anios)
{
return anios*12;
}
float interesMensual(float interesAnualTantoPorCiento)
{
float n;
n=(pow(1+interesAnualTantoPorCiento,((1/12)-1)));
return n;
}
float pago(float capital, float interesMensual, int numeroPagos)
{
float n,p,interes,anios;
n=numeroPagos;
interes=interesMensual+1;
p= (capital *interes *n * interesMensual)/(interes*(n-1));
printf("pago mensual: %f", p);
}
printTablaAmortizacion(float capital,float interesAnualTantoPorCiento,float anios)
{
}
I don't know what's the problem, I´m trying to use a function inside another one and it gives me this error:
passing 'float (float)' to parameter of incompatible type 'float'
and I have to keep the functions like that, I can just change the inside part of them. So I have tried to put the function inside the other instead using in the main one function first and the other after
The arguments to pago() should be the values returned from numeroPagos() and interesMensual(). You're passing the functions themselves.
int main()
{
float capital,interesAnualTantoPorCiento;
int anios;
leerCondicionesHipoteca(&capital, &interesAnualTantoPorCiento, &anios);
pago(capital, interesMensual(interesAnualTantoPorCiento), numeroPagos(anios));
}
Notice you're passing a function pointer instead of float value here:
pago(capital, interesMensual, numeroPagos);
Both interesMensual and numeroPagos are function pointers.

I'm getting negative output from a do-while loop, when it's supposed to stop at 0

I'm building a program for the problem set 1 of CS50x called "cash" that is written in C. I don't know how to make the function cant_de_monedas work on my main function, and when I tried to print the return "dinero" after each loop it keeps counting down even after it reachs 0.
//inclusión de librerías
#include <stdio.h>
#include <cs50.h>
//llamado de la función cant_de_monedas para su funcionamiento en main
float cant_de_monedas(float dinero, int monedas);
int main(void)
{
//input del dinero principal
float dinero = get_float("Insertar dinero: ");
//ajuste de monedas a 0
int monedas= 0;
//llama a la función cant_de_monedas
float cambio = cant_de_monedas(dinero, monedas);
printf("Cantidad de monedas de vuelto: %i\n", monedas);
}
//analiza las monedas necesarias de cambio para una cantidad de dinero variable en centavos de dolar
float cant_de_monedas(float dinero, int monedas)
{
//suma una moneda mientras el dinero sea mayor o igual a 25
do
{
monedas++;
dinero=dinero-25;
printf("%f\n", dinero);
}
while (dinero>=25);
//suma una moneda mientras el dinero se encuentre entre 25 y 10 incluído
do
{
monedas++;
dinero=dinero-10;
printf("%f\n", dinero);
}
while (dinero<25 && dinero>=10);
//suma una moneda mientras el dinero se encuentre entre 10 y 5 incluído
do
{
monedas++;
dinero=dinero-5;
printf("%f\n", dinero);
}
while (dinero<10 && dinero>=5);
//suma una moneda mientras el dinero se encuentre entre 5 y 1
do
{
monedas++;
dinero=dinero-1;
printf("%f\n", dinero);
}
while (dinero<5 && dinero>1);
//suma una moneda mientras el dinero sea 1
do
{
monedas++;
dinero=dinero-1;
printf("%f\n", dinero);
}
while (dinero==1);
return monedas;
}
The output that I get from it is:
$ ./cash
Insertar dinero: 51
26.000000
1.000000
-9.000000
-14.000000
-15.000000
-16.000000
Cantidad de monedas de vuelto: 0
I have three remarks:
You seem to be working with floating point numbers, while there can be quite some rounding issues with those. I'd advise you to work with integer values only.
If you do need to work with floating numbers, I advise you to use double instead of float.
Instead of a do-while, just use a while (imagine the condition is never met, then the loop is not executed at all).

matrix of characters in c , I need to pass a matrix to a function as a parameter

I need to pass a matrix to a function as a parameter but when checking if it is happening or not I try to print the value of the matrix [1][1] and it does not work
int Cabe_proceso(int pag, int cel,int pal,char Memoria_fisica[1][pal-1]){
printf("[%s]\n",Memoria_fisica[1][1]);
}
int main(void){
int palabras, celdas;
printf("Ingrese la cantidad de palabras soportadas por la memoria principal\n");
scanf("%i",&palabras);
printf("Ingrese la cantidad de palabras que define el tamano de un marco de paginas\n");
scanf("%i",&celdas);
int marcos =palabras/celdas;
int i,j,aux=celdas,m=1;
if(palabras%celdas ==0){
marcos= marcos;
}else{
marcos++;
}
char *Memoria_fisica[1][palabras-1];
for(i=0;i<1;i++){
for(j=0;j<palabras;j++){
Memoria_fisica[i][j]= "0";
}
}
for(i=0;i<1;i++){
for(j=0;j<palabras;j++){
printf("[%s]\n",Memoria_fisica[i][j]);
if(j==aux-1){
printf("--------------marco %i\n", m);
aux=aux+celdas;
m++;
}
}
if(palabras%celdas!=0){
printf("------------------marco %i\n",marcos);
}
}
printf("%i\n",celdas);
Cabe_proceso(1,celdas,palabras,Memoria_fisica);
return 0;
}
I included the bookstores stdio.h , stdlib.h, strings.h

caesar cipher in C, using arrays and chars, I get an error in the numbers

Here is the code, basically I gotta do the ceasar cipher in C using arrays and chars only, here is what I have so far:
#include <stdio.h>
#include <stdlib.h>
main ()
{
char alfabeto[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int a=0;
int b=0;
int m=0;
int c=0;
//char letra;
int cont=0;
char k[]={};
printf("Introduzca un primer numero 'a':\n");
scanf(" %i", &a);
printf("Introduzca un segundo numero 'b':\n");
scanf(" %i", &b);
printf("Introduzca una palabra clave entre 4 y 10 letras (cuando termine presione '.'):\n");
//Falta una validacion para la palabra.
for (int j=0;j<10;j++)
{
scanf(" %c",&k[j]);
cont=j; //cuenta la cantidad de elementos
if (k[j]=='.')
{
j=10;
}
}
for(int j=0;j<cont;j++) //Error in this bit I think.
{
for (int i=0;i<26;i++)
{
if (alfabeto[i]==k[j])
{
m=i;
i=26;
}
}
c = ( (a * m) + b );
printf("%c es: %i \t",k[j],c);
}
}
It uses a formula where c=(a*m+b).
m being the position of the original letter for example: A=0 then m=0.
a being a number you choose as well as b.
In my case I chose a=1 and b=3 and the word CESAR as the key word.
According to the formula the output number of each letter should be c.
The output should be:
C es: 5 E es: 7 S es: 21 A es: 3 R es: 20
Yet it is this:
WrongOutput
UPDATE:
I had to correct this:
char k[]={};
Into this:
char k[10]={'\0'};
Now I get the right output:
Right Output

Resources