[AYUDA expertos en C]Problema programa en C. se supone que está bien,pero tira error.

#include <stdio.h>
#include <math.h>
#define DOS 2
long IDaDiscriminante (int a,int b,int c){
long resultado;
resultado=b*b-4*a*c;
return resultado;
}
void vCalculaSoluciones (int a,int b, long IDiscriminante, float* fSolucion1,float* fSolucion2){
fSolucion1=(-b+sqrt(IDiscriminante))/DOS*a;
fSolucion2=(-b-sqrt(IDiscriminante))/DOS*a;
}
int main(){
char s;
long IDiscriminante;
int ia,ib,ic;
float fResultado1,fResultado2;
printf("Introduzca los coeficientes de la ecuacion \n");
scanf("%[^\n]",s); ia=atoi(s);
scanf("%[^\n]",s); ib=atoi(s);
scanf("%[^\n]",s); ic=atoi(s);

IDiscriminante=IDaDiscriminante(ia,ib,ic);
if(IDiscriminante<0)
printf("No existen soluciones reales \n");
else{
vCalculaSoluciones(ia,ib,IDiscriminante, &fResultado1,&fResultado2);
printf("Las soluciones son %f y %f",fResultado1,fResultado2);
}
}

viene así tal cual en un supuesto práctico, pero lo ejecuto en el DEv-C++ y me saca el siguiente error:
"[Error] invalid conversion from 'char' to 'const char*' [-fpermissive]" (en las lineas de color rojo)
y luego:
[Error] cannot convert 'float*' to 'float' for argument '4' to 'void vCalculaSoluciones(int, int, long int, float, float)' (linea color lila)


No entiendo como corregirlo,se supone que está en un libro de exámenes para la oposición,que está el código correcto,y sin embargo no me tira. lo pongo en codepad.org,y me saca errores también en las mismas lineas.. como coño lo soluciono?me gustaria verlo en funcionamiento,pero no puedo compilarlo
Hace bastante que no toco C y ando oxidado pero prueba a poner asterisco (*) delante de fSolucion1 y fSolucion2

Así:

*fSolucion1=(-b+sqrt(IDiscriminante))/DOS*a;
*fSolucion2=(-b-sqrt(IDiscriminante))/DOS*a;


En los scanf pon un & antes de la s. Así:

scanf("%[^\n]",&s); ia=atoi(s);   
scanf("%[^\n]",&s); ib=atoi(s);   
scanf("%[^\n]",&s); ic=atoi(s);   
Primero de todo identa el codigo porque si no es imposible leer algo.

1 - Te faltaba añadir la libreria stdlib si no se quejaba de los atoi, que ademas han de recibir una direccion de memoria &s
2 - Te falta cuando compiles con el comando, linkar la libreria de maths con el -lm : gcc miprograma.c -o programa.exe -lm
3 - Te faltaban los pointer en los fSolucion y de paso un cast a float si no el compilador soltaba warning de conversion a float desde double.
4 - La funcion main, tiene que devolver un integer y no retornabas nada.
5 - Los scanf esperaban un char * y donde guardar la informacion.

Y mas cosas que se me olvidaran y que fijo que no se controlan, que pasa si metes un numero de mas de 1 dígito?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define DOS 2

long IDaDiscriminante (int a,int b,int c){
    long resultado;
    resultado=b*b-4*a*c;
    return resultado;
}

void vCalculaSoluciones (int a,int b, long IDiscriminante, float *fSolucion1,float *fSolucion2){
    *fSolucion1 = (float) (-b+sqrt(IDiscriminante))/DOS*a;
    *fSolucion2 = (float) (-b-sqrt(IDiscriminante))/DOS*a;
}

int main(){

   char s;
   long IDiscriminante;
   int ia,ib,ic;
   float fResultado1,fResultado2;

   printf("Introduzca los coeficientes de la ecuacion \n");
   scanf("%s",&s); ia=atoi(&s);
   scanf("%s",&s); ib=atoi(&s);
   scanf("%s",&s); ic=atoi(&s);

   IDiscriminante=IDaDiscriminante(ia,ib,ic);

   if(IDiscriminante<0) {
      printf("No existen soluciones reales \n");
   } else {
    vCalculaSoluciones(ia,ib,IDiscriminante, &fResultado1,&fResultado2);
    printf("Las soluciones son %f y %f",fResultado1,fResultado2);
   }

   return 1;
}


PD: Acostumbrate cuando compiles a hacerlo con los parametros -Wall -Wextra para que te muestre todos los warnings y warning que te muestre, warning que has de arreglar, asi te aseguras que luego tu programa (si el codigo esta bien planteado) no hara el tonto

Adjuntos

No entiendo porque se usa atoi ahí. Cuando scanf ya te permite leer números enteros:

int n;
scanf("%d",&n);
muchas gracias a todos por la ayuda!

Ya digo que el programa no es mio,está copiado tal cual de un libro de ejercicios de supuestos prácticos para una oposición,o sea, que cualquier error o cosa mal puesta, es culpa del que ha editado el libro [+risas] .

trataré de arreglarlo con los cambios recomendados por vosotros, y seguiré viendo otros supuestos,a ver cuantos al pasarlos a ordenador tiran bien a la primera :-|

muchas gracias de nuevo por la ayuda [beer]

PD: que programa me recomendais para C? uso windows 10 de 32,aunque tambien puedo usar w7 de 64, por si la compatibilidad fuese 1 problema
Yo normalmente cuando hago C, suelo tirar de notepad++ y una terminal a un Linux (PuTTY)

Si quieres ejemplos de codigo de C, te puedo pasar algunos bastante completitos (threads, ficheros, etc..)
https://github.com/guillerg86/filesystemDriver
https://github.com/guillerg86/Gekko

@hyrulen Por cierto si te fijas en el anterior comentario mio, hay 1 spoiler, ahi tienes el codigo ya arreglado
6 respuestas