Dev - C++ - Me da un fallo de conversión

 
Vista:
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 03/07/2020 21:22:31
Buenas gente del foro:

ME dan estos errores.
Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Mensaje La conversión de un tipo entero a un tipo de puntero requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función Interfaz_consola_nativo_01_cpp C:\Users\Usuario\Documents\Visual Studio 2019\Projects\DLL_y_interfaz_nativo_01_cpp\Interfaz_consola_nativo_01_cpp\Interfaz_consola_nativo_01_cpp.cpp 119

Código de la interfaz de C++ nativo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// Versión que muestra título de la ventana, tamaño, posición del cursor, etc.
// Mostrar textos que viene de la dll es con wcout. Textos desde la interfaz con cout.
 
#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.
 
using namespace std;
//using std::cout;
//using std::cin;
 
// Función posición del cursor.
void gotoxy(int x, int y)
{
	HANDLE hcon;
	hcon = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD dwPos;
	dwPos.X = x;
	dwPos.Y = y;
	SetConsoleCursorPosition(hcon, dwPos);
}
 
// Definir estas funciones.
typedef LPTSTR(__stdcall* Mensaje)();
typedef double(__stdcall* Volumen)(double, double, double, double);
typedef double(__stdcall* Litros)(double, double);
typedef double(__stdcall* ResultadoPorcentaje)(int, double, double);
typedef double(__stdcall* VolumenLitros)(double, double, double, double, double);
typedef double(__stdcall* CantidadTubosLitros)(double, double, double);
typedef double(__stdcall* TotalLitros)(double, double, double);
 
int main(void)
{
	// Variables.
	const double Pi = 3.14;
	double radio;
	double altura;
	//double volumen;
	//double litros;
	double nivelAgua;
	//double resultadoPorcentaje;
	//double resultadoLitros;
	//double volumenLitros;
	double mitadBarra;
	double cantidadTubos;
	//double cantidadTubosLitros;
	//double totalLitros;
 
	// Importar dll.
	HINSTANCE hDLL = 0;
	Mensaje mensaje;
	Volumen volumen;
	Litros litros;
	ResultadoPorcentaje resultadoPorcentaje;
	VolumenLitros volumenLitros;
	CantidadTubosLitros cantidadTubosLitros;
	TotalLitros totalLitros;
 
	hDLL = LoadLibrary(L"C:\\Users\\Usuario\\Documents\\Visual Studio 2019\\Projects\\DLL_y_interfaz_nativo_01_cpp\\Debug\\DLL_y_interfaz_nativo_01_cpp.dll");
	mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
	volumen = (Volumen)GetProcAddress(hDLL, "Volumen");
	litros = (Litros)GetProcAddress(hDLL, "Litros");
	resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");
	volumenLitros = (VolumenLitros)GetProcAddress(hDLL, "VolumenLitros");
	cantidadTubosLitros = (CantidadTubosLitros)GetProcAddress(hDLL, "CantidadTubosLitros");
	totalLitros = (TotalLitros)GetProcAddress(hDLL, "totalLitros");
 
	// Mostrar caracteres correctamente en pantalla y título de la ventana.
	SetConsoleOutputCP(65001);
	wchar_t titulo[128];
	MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
	SetConsoleTitle(titulo);
 
	// Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
	SMALL_RECT r = { 0, 0, 49, 35 }; // X = 49, Y = 9.
	SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
 
	// Ocultar cursor.
	CONSOLE_CURSOR_INFO cci;
	GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
	cci.bVisible = 1; // 0 oculta cursor. 1 muestra cursor.
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
 
	// Posición del cursor.
	gotoxy(3, 2);
 
	// Mostrar textos en pantalla.
	wcout << mensaje() << endl;
	gotoxy(0, 4);
	cout << "Introduce el radio en m.: ";
	cin >> radio;
	cout << "Introduce la altura en m. ";
	cin >> altura;
	cout << "Introduce altura del agua. Máximo es de " << altura << ":";
	cin >> nivelAgua;
	cout << "Introduces cantidad de tubos: ";
	cin >> cantidadTubos;
 
	// Dibujo de la barra.
	cout << "\n";
	cout << ("0 %                     50 %                   100 %") << endl;
	cout << ("┌────────────────────────┬───────────────────────┐") << endl;
 
	// Mitad de la barra para que no sea muy grande en la pantalla.
	mitadBarra = resultadoPorcentaje / 2;
 
	if (mitadBarra > 50)
	{
		mitadBarra = 50;
	}
 
	// Rellenar la barra.
	for (double i = 1; i <= mitadBarra; i++)
	{
		cout << ("█");
	}
 
	// Si llega a 100 se pone el # en rojo.
 
	if (resultadoPorcentaje > 100)
	{
		cout << ("#");
	}
	// Fin dibujo de la barra.
 
	// Pisición del texto a mostrar.
	gotoxy(0, 11);
 
	//cout << "\nPorcentaje: " << resultadoPorcentaje << " %.";
 
 
	FreeLibrary(hDLL);
 
	// Esperando pulsar Enter para salir.
	cin.get();
	return 0;
}

La dll compila bien. Desde que puse este código falla.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Dibujo de la barra.
	cout << "\n";
	cout << ("0 %                     50 %                   100 %") << endl;
	cout << ("┌────────────────────────┬───────────────────────┐") << endl;
 
	// Mitad de la barra para que no sea muy grande en la pantalla.
	mitadBarra = resultadoPorcentaje / 2;
 
	if (mitadBarra > 50)
	{
		mitadBarra = 50;
	}
 
	// Rellenar la barra.
	for (double i = 1; i <= mitadBarra; i++)
	{
		cout << ("█");
	}
 
	// Si llega a 100 se pone el # en rojo.
 
	if (resultadoPorcentaje > 100)
	{
		cout << ("#");
	}
	// Fin dibujo de la barra.

Código de la DLL
:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "pch.h"
 
extern "C"
{
    __declspec(dllexport) LPTSTR WINAPI Mensaje();
    __declspec(dllexport) double WINAPI Volumen(double, double, double, double);
    __declspec(dllexport) double WINAPI Litros(double, double);
    __declspec(dllexport) double WINAPI ResultadoPorcentaje(int, double, double);
    __declspec(dllexport) double WINAPI VolumenLitros(double, double, double, double, double);
    __declspec(dllexport) double WINAPI CantidadTubosLitros(double, double, double);
    __declspec(dllexport) double WINAPI TotalLitros(double, double, double);
};
 
// Mensaje.
LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll. Versión: 1.0.0"); }
 
// Cálculo volumen.
double __stdcall Volumen(double volumen, double PI, double radio, double altura)
{
    return volumen = PI * (radio * radio) * altura;
}
 
// Cálculo litros.
double __stdcall Litros(double litros, double volumen)
{
    return litros = volumen * 1000;
}
 
// Cálculo porcentaje en % del litro de agua.
double __stdcall ResultadoPorcentaje(int resultadoPorcentaje, double nivelAgua, double altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}
 
// Cálculo litros de agua.
double __stdcall VolumenLitros(double volumenLitros, double PI, double radio, double nivelAgua, double resultadoLitros)
{
    return volumenLitros = PI * (radio * radio) * nivelAgua;
    return resultadoLitros = volumenLitros * 1000;
}
 
// Cálculo litros por cantidad de tubos
double __stdcall CantidadTubosLitros(double cantidadTubosLitros, double cantidadTubos, double resultadoLitros)
{
    return cantidadTubosLitros = cantidadTubos * resultadoLitros;
}
 
// Cálculo cantidad de litros con total de tubos.
double __stdcall TotalLitros(double totalLitros, double litros, double cantidadTubos)
{
    return totalLitros = litros * cantidadTubos;
}

¿Seguro que cambiar de int a double o al reves?
Me la juego

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 04/07/2020 09:30:22
En la dll tienes WINAPI y en el exe __stdcall. Esas cosas no suelen ser buena idea. GetProcAddress no va a encontrar las funciones

No sé dónde da el error, pero un puntero que accede a memoria debe ser un puntero a algo, para saber cómo debe acceder a la memoria, y a un int hay que ponerle un cast a algún tipo de puntero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 04/07/2020 12:01:21
Buenos días:

Entonces habrá que cambiar los WINAPI por otra cosa para que hagamos las cosas que se tenga buenas ideas. Todo lo que he se ha logrado es gracias a ti.

Los fallos lo indica aquí.
captura-2145610

Ver zoom.

Me señala la variable esta, resultadoPorcentaje.
1
2
	// Mitad de la barra para que no sea muy grande en la pantalla.
	mitadBarra = resultadoPorcentaje / 2;

Por lo que te he entendido.
En el archivo DLL_al_poder.cpp tengo esto así con el WINAPI.
1
2
3
4
5
6
7
8
9
10
extern "C"
{
    __declspec(dllexport) LPTSTR WINAPI Mensaje();
    __declspec(dllexport) double WINAPI Volumen(double, double, double, double);
    __declspec(dllexport) double WINAPI Litros(double, double);
    __declspec(dllexport) double WINAPI ResultadoPorcentaje(double, double, double);
    __declspec(dllexport) double WINAPI VolumenLitros(double, double, double, double, double);
    __declspec(dllexport) double WINAPI CantidadTubosLitros(double, double, double);
    __declspec(dllexport) double WINAPI TotalLitros(double, double, double);
};

Lo he cambiado de esta otra manera.
1
2
3
4
5
6
7
8
9
10
extern "C"
{
    __declspec(dllexport) LPTSTR __stdcall Mensaje();
    __declspec(dllexport) double __stdcall Volumen(double, double, double, double);
    __declspec(dllexport) double __stdcall Litros(double, double);
    __declspec(dllexport) double __stdcall ResultadoPorcentaje(double, double, double);
    __declspec(dllexport) double __stdcall VolumenLitros(double, double, double, double, double);
    __declspec(dllexport) double __stdcall CantidadTubosLitros(double, double, double);
    __declspec(dllexport) double __stdcall TotalLitros(double, double, double);
};


Haciendo pruebas con esta variable
1
resultadoPorcentaje
Lo he pasado a int y a double en todas partes y sigue con lo mismo.

Saludos.

PD: Que pena, con lo emocionado que estaba, ajajajjaja. Aún así, muchísimas gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 04/07/2020 12:51:39
WINAPI es una convención de llamada definida en visual studio como __stdcall, igual que PASCAL o CALLBACK. El problema es que si en un sitio pones una función como WINAPI y en otro como __stdcall y resulta que en el visual estudio 2022 viene definido WINAPI como __fastcall deja de funcionar todo.

Es que los errores hablan de ResultadoPorcentaje, no de resultadoPorcentaje. resultadoPorcentaje se supone que es una variable donde hay una función, y lo usas como si fuera un double, Si es una función, que lo es, tendrás que poner mitadBarra = resultadoPorcentaje(3, 4.6, 5.2) / 2;. El nombre de una función sin parámetros el c lo toma como la dirección de memoria de esa función, no como una llamada a esa función.

No puedes emocionarte mucho con el c, la cuerda es muy larga.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 04/07/2020 13:31:31
Buenas.

A pesar de lo que dijiste. He hecho todo hasta con float de paso para que no tire tanto de la RAM.

¿Entonces como lo dejo tanto en la dll y el exe?
¿En WINAPI para los dos o en __stdcall?

Luego lo que dijiste, pues no lo capto.

¿Algún ejemplo?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 04/07/2020 15:35:49
Yo pondría en los dos __stdcall.

Tengo un ejemplo muy sencillo:
1
2
int n = suma(10, 7) / 2;   // perfecto
int m = suma / 2;          // Error	C2296	'/': no es válido; el operando izquierdo es de tipo 'Suma'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 04/07/2020 16:07:11
Hola:

Por ejemplo esto:
1
float mitadBarra = resultadoPorcentaje / 2;

Como puedes ver, la variable resultadoPorcentaje cambia su valor, por eso lo puse así. En C# no da ningún tipo de error.

¿Entonces cómo lo haces lo que quiero?

Si le pongo directamente números, no varía.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 04/07/2020 18:18:48
No sé lo que tendrás en c#, pero en lo que has puesto de c++ tienes ResultadoPorcentaje resultadoPorcentaje;. Y ResultadoPorcentaje es una función, así que si llamas a resultadoPorcentaje sin parámetros estás pretendiendo dividir un puntero a ResultadoPorcentaje entre dos sin cast ni nada, y eso da error siempre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 04/07/2020 18:29:19
Buenas:

Todo lo que he hecho arriba es en C++. Entiendo lo que dices, pero no se hacerlo para evitarlo.

El ejemplo en C# es este.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System;
 
namespace Calculo_cilindro_consola_03_cs
{
    class Program
    {
        static void Main(string[] args)
        {
            // Mostrar título de la ventana.
            Console.Title = "Cálculo litros de un depósito - C# 2019";
 
            // Tamaño de la ventna. 55 X y 16 Y.
            Console.SetWindowSize(55, 16);
 
            #region Variables.
            // Variables.
            const double Pi = 3.14;
            float PI = Convert.ToSingle(Pi);
            float radio, altura, volumen, litros, nivelAgua, resultadoPorcentaje,
                resultadoLitros, volumenLitros, mitadBarra, cantidadTubosLitros,
                totalLitros;
            int cantidadTubos;
            #endregion
 
            do
            {
                #region Introducción de datos en la pantalla.
                // Limpiar pantalla.
                Console.Clear();
 
                // Cursor visible.
                Console.CursorVisible = true;
 
                // Introducción de datos.
                Console.Write("Introduce el radio en m.: ");
                radio = float.Parse(Console.ReadLine());
                Console.Write("Introduce la altura en m.: ");
                altura = float.Parse(Console.ReadLine());
                Console.Write("Introduce altura del agua. Máximo es de {0}: ", altura);
                nivelAgua = float.Parse(Console.ReadLine());
                Console.Write("Introduce cantidad de tubos: ");
                cantidadTubos = int.Parse(Console.ReadLine());
                #endregion
 
                #region Cálculos.
                // Cálculo volumen.
                volumen = PI * (radio * radio) * altura;
 
                // Cálculo litros.
                litros = volumen * 1000;
 
                // Cálculo porcentaje en % del litro de agua.
                resultadoPorcentaje = nivelAgua * (100 / altura);
 
                // Cálculo litros de agua.
                volumenLitros = PI * (radio * radio) * nivelAgua;
                resultadoLitros = volumenLitros * 1000;
 
                // Cálculo litros por cantidad de tubos
                cantidadTubosLitros = cantidadTubos * resultadoLitros;
 
                // Cálculo cantidad de litros con total de tubos.
                totalLitros = litros * cantidadTubos;
                #endregion
 
                #region Dibujado barra de progreso.
                // Dibujo de la barra.
                Console.WriteLine();
                Console.WriteLine("0 %                     50 %                   100 %");
                Console.WriteLine("┌────────────────────────┬───────────────────────┐");
                Console.ForegroundColor = ConsoleColor.Yellow;
 
 
                // Mitad de la barra para que no sea muy grande en la pantalla.
                mitadBarra = resultadoPorcentaje / 2;
 
                if (mitadBarra > 50)
                {
                    mitadBarra = 50;
                }
 
                // Rellenar la barra.
                for (int i = 1; i <= mitadBarra; i++)
                {
                    Console.Write("█");
                }
 
                // Si llega a 100 se pone el # en rojo.
                if (resultadoPorcentaje > 100)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("#");
                }
                #endregion
 
                #region Mostrar textos en pantalla.
                // Pisición del texto a mostrar.
                Console.SetCursorPosition(0, 9);
 
                // Muestra porcentaje del depósito.
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.Write("\nPorcentaje: ");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(resultadoPorcentaje.ToString("N2") + " %.");
 
                // Muestra cantidad de agua que hay actualmente y el total.
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.Write("\nLitros de agua: ");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write(resultadoLitros.ToString("N2"));
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine(" / " + litros + " L. total de un tubo.");
 
                // Cantidad de tubos sin contar la base conectada, solo tubos independiente.
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.Write("\nCantidad de Litros total por " + cantidadTubos + " tubos: ");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write(cantidadTubosLitros.ToString("N2"));
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine(" / " + totalLitros.ToString("N2") + " L.");
                #endregion
 
                // Cursor invisible.
                Console.CursorVisible = false;
 
                // Pulse cualquier tecla para continuar.
                Console.ReadKey();
            } while (true);
        }
    }
}

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 04/07/2020 20:19:54
Te veo espeso. Vas a tener que tomarte un par de años de vacaciones.

Si tienes una variable llamada suma donde está una función importada de una dll, si pones int a = suma(3, 5) /2 y no da ningún error, si pones int a = suma /2 te da un error, tienes otra variable llamada resultadoPorcentaje que tiene otra función de la misma dll, y si pones double a = resultadoPorcentaje / 2 te da el mismo error que con suma / 2, ¿cuál es el problema?

En c# tienes
float radio, altura, volumen, litros, nivelAgua, resultadoPorcentaje, resultadoLitros, volumenLitros, mitadBarra, cantidadTubosLitros, totalLitros;
En c# es un float y así claro que no da error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 05/07/2020 03:30:29
Buenas:

¿Quieres decir que int a = suma /2 en C# como es un float no da error?

¿En C++ si da error?

Si sabes donde está el error, lo puedes comentarlo para terminar con este problema de una vez.

Código de la dll de C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "pch.h"
 
extern "C"
{
    __declspec(dllexport) LPTSTR __stdcall Mensaje();
    __declspec(dllexport) double __stdcall Volumen(float, float, float, float);
    __declspec(dllexport) double __stdcall Litros(float, float);
    __declspec(dllexport) double __stdcall ResultadoPorcentaje(float, float, float);
    __declspec(dllexport) double __stdcall VolumenLitros(float, float, float, float, float);
    __declspec(dllexport) double __stdcall CantidadTubosLitros(float, float, float);
    __declspec(dllexport) double __stdcall TotalLitros(float, float, float);
};
 
// Mensaje.
LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll. Versión: 1.0.0"); }
 
// Cálculo volumen.
double __stdcall Volumen(float volumen, float PI, float radio, float altura)
{
    return volumen = PI * (radio * radio) * altura;
}
 
// Cálculo litros.
double __stdcall Litros(float litros, float volumen)
{
    return litros = volumen * 1000;
}
 
// Cálculo porcentaje en % del litro de agua.
double __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}
 
// Cálculo litros de agua.
double __stdcall VolumenLitros(float volumenLitros, float PI, float radio, float nivelAgua, float resultadoLitros)
{
    return volumenLitros = PI * (radio * radio) * nivelAgua;
    return resultadoLitros = volumenLitros * 1000;
}
 
// Cálculo litros por cantidad de tubos
double __stdcall CantidadTubosLitros(float cantidadTubosLitros, float cantidadTubos, float resultadoLitros)
{
    return cantidadTubosLitros = cantidadTubos * resultadoLitros;
}
 
// Cálculo cantidad de litros con total de tubos.
double __stdcall TotalLitros(float totalLitros, float litros, float cantidadTubos)
{
    return totalLitros = litros * cantidadTubos;
}



Código de la interfaz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.
 
using namespace std;
//using std::cout;
//using std::cin;
 
// Función posición del cursor.
void gotoxy(int x, int y)
{
	HANDLE hcon;
	hcon = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD dwPos;
	dwPos.X = x;
	dwPos.Y = y;
	SetConsoleCursorPosition(hcon, dwPos);
}
 
// Definir estas funciones.
typedef LPTSTR(__stdcall* Mensaje)();
typedef double(__stdcall* Volumen)(float, float, float, float);
typedef double(__stdcall* Litros)(float, float);
typedef double(__stdcall* ResultadoPorcentaje)(float, float, float);
typedef double(__stdcall* VolumenLitros)(float, float, float, float, float);
typedef double(__stdcall* CantidadTubosLitros)(float, float, float);
typedef double(__stdcall* TotalLitros)(float, float, float);
 
int main(void)
{
	// Variables.
	const double Pi = 3.14;
	float radio;
	float altura;
	//double volumen;
	//double litros;
	float nivelAgua;
	float resultadoPorcentaje;
	//double resultadoLitros;
	//double volumenLitros;
	float mitadBarra;
	float cantidadTubos;
	//double cantidadTubosLitros;
	//double totalLitros;
 
	// Importar dll.
	HINSTANCE hDLL = 0;
	Mensaje mensaje;
	Volumen volumen;
	Litros litros;
	ResultadoPorcentaje resultadoPorcentaje;
	VolumenLitros volumenLitros;
	CantidadTubosLitros cantidadTubosLitros;
	TotalLitros totalLitros;
 
	hDLL = LoadLibrary(L"C:\\Users\\Meta\\Documents\\Visual Studio 2019\\Projects\\DLL_y_interfaz_nativo_01_cpp\\Debug\\DLL_y_interfaz_nativo_01_cpp.dll");
	mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
	volumen = (Volumen)GetProcAddress(hDLL, "Volumen");
	litros = (Litros)GetProcAddress(hDLL, "Litros");
	resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");
	volumenLitros = (VolumenLitros)GetProcAddress(hDLL, "VolumenLitros");
	cantidadTubosLitros = (CantidadTubosLitros)GetProcAddress(hDLL, "CantidadTubosLitros");
	totalLitros = (TotalLitros)GetProcAddress(hDLL, "totalLitros");
 
	// Mostrar caracteres correctamente en pantalla y título de la ventana.
	SetConsoleOutputCP(65001);
	wchar_t titulo[128];
	MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
	SetConsoleTitle(titulo);
 
	// Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
	SMALL_RECT r = { 0, 0, 49, 35 }; // X = 49, Y = 9.
	SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
 
	// Ocultar cursor.
	CONSOLE_CURSOR_INFO cci;
	GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
	cci.bVisible = 1; // 0 oculta cursor. 1 muestra cursor.
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
 
	// Posición del cursor.
	gotoxy(3, 2);
 
	// Mostrar textos en pantalla.
	wcout << mensaje() << endl;
	gotoxy(0, 4);
	cout << "Introduce el radio en m.: ";
	cin >> radio;
	cout << "Introduce la altura en m. ";
	cin >> altura;
	cout << "Introduce altura del agua. Máximo es de " << altura << ":";
	cin >> nivelAgua;
	cout << "Introduces cantidad de tubos: ";
	cin >> cantidadTubos;
 
	// ########## Dibujo de la barra.
	cout << "\n";
	cout << ("0 %                     50 %                   100 %") << endl;
	cout << ("┌────────────────────────┬───────────────────────┐") << endl;
 
	// Mitad de la barra para que no sea muy grande en la pantalla.
	mitadBarra = resultadoPorcentaje / 2;
 
	if (mitadBarra > 50)
	{
		mitadBarra = 50;
	}
 
	// Rellenar la barra.
	for (float i = 1; i <= mitadBarra; i++)
	{
		cout << ("█");
	}
 
	// Si llega a 100 se pone el # en rojo.
 
	if (resultadoPorcentaje > 100)
	{
		cout << ("#");
	}
	// ########## Fin dibujo de la barra.
 
	// Pisición del texto a mostrar.
	gotoxy(0, 11);
 
	//cout << "\nPorcentaje: " << resultadoPorcentaje << " %.";
 
 
	FreeLibrary(hDLL);
 
	// Esperando pulsar Enter para salir.
	cin.get();
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 05/07/2020 09:53:46
resultadoPorcentaje es un puntero a funcion, o si esto parece complicado, es una funcion.
Solo lograras que el compilador acepte que lo uses en una expresion matermatica si lo tratas como una funcion.
Osea, si la llegas a poner es una expresion matematica, INVOCA a la funcion, PASALE parametros y USA su valor de retorno,

Si persistes en poner resultadoPorcentaje / 2 el compilador te seguira reclamando que no puede dividir una funcion o la direccion de memoria por 2, que es lo que te ha dicho Nacho varias veces.

Para que no haya error, haz algo como:

1
resultadoPorcentaje(1.0, 2.0,3.0) / 2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 05/07/2020 10:00:53
Voy a probar poniendo esto:

1
resultadoPorcentaje(0.0) / 2

Pensaba que resultadoPorcentaje lo tenía como variable.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 05/07/2020 10:21:09
typedef double(__stdcall* ResultadoPorcentaje)(int, double, double);
ResultadoPorcentaje resultadoPorcentaje;

Eso le estás diciendo al compilador de c++ que es resultadoPorcentaje. O pones algo que concuerde con eso o te dará errores, y a cabezón no le ganas al compilador. Al compilador de c# le estás diciendo que es un float.

Otra cosa muy frecuentre entre programadores es pretender discutir con el compilador, y el compilador siempre tiene razón. Nunca se cansa, no tiene hambre, no está hasta los guebos, no le importa repetir mil veces lo mismo, no vas a conseguir convencerle de nada...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 05/07/2020 10:25:37
Por que pasas 1 solo parametro si la funcion recibe 3 parametros?

(El primer parametro podrias eliminarlo en la definicion de la funcion y pasar 2 cuando la invocas, pero ahora la tienes definida con 3 parametros, asi que pasale 3)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 06/07/2020 00:17:49
Buenas Rodrigo:

¿Estás hablando de pasarle un o tres parámetros a este código?

1
2
3
4
5
// Cálculo porcentaje en % del litro de agua.
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}

Ni no pongo nada como altura, sale error, por eso pongo lo que pongo en float.
ResultadoPorcentaje resultadoPorcentaje;
;)

Hola Nacho:
Lo puse ya todo en float por si acaso.

En esta parte se que queja.
1
resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");

Y dice uno de los errores.

Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error (activo) E0513 no se puede asignar un valor de tipo "ResultadoPorcentaje" a una entidad de tipo "float" Interfaz_consola_nativo_01_cpp C:\Users\Meta\Documents\Visual Studio 2019\Projects\DLL_y_interfaz_nativo_01_cpp\Interfaz_consola_nativo_01_cpp\Interfaz_consola_nativo_01_cpp.cpp 64
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 06/07/2020 00:52:48
Si una funcion esta definida con 3 parametros, pasale 3 parametros.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 06/07/2020 01:15:10
Si te refieres a esta.

1
2
3
4
5
6
7
8
9
// Cálculo porcentaje en % del litro de agua.
 
double __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
 
{
 
    return resultadoPorcentaje = nivelAgua * (100 / altura);
 
}

No se como.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 06/07/2020 01:56:38
Relee mi primera intervencion en este thread. Ahi hay un ejemplo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 06/07/2020 10:00:01
Lo he puesto tiplo float a todos por si acaso.

1
2
	// Mitad de la barra para que no sea muy grande en la pantalla.
	mitadBarra = resultadoPorcentaje(0, 0, 0) / 2;

captura-2146172

Por lo que veo, tengo el diseño mal.

1
2
3
4
5
// Cálculo porcentaje en % del litro de agua.
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}

Ya que solamente necesito el valor de resultadoPorcentaje para añadirlo en un cout << "Tanto porciernto: " << resultadoPorcentaje << endl;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 06/07/2020 11:15:17
Que linea marca el error ?
Le sacaste una foto a la pantalla con el error que muestra, pero no a la linea que tiene el error.

Si usas valores literales (como 0), asegurate que los valores literales sean del tipo que la funcion espera.
0 es un numero entero. 0.0 es un float. La funcion recibe float. Cambia la invocacion para que reciba floats.

Si escribiste un cout con "resultadoPorcentaje" como lo estas proponiendo de nuevo cometes el mismo error.
resultadoPorcentaje NO ES un valor. Es una funcion que tienes que invocar para obtener un valor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 06/07/2020 11:44:15
Lo puse así;
1
2
	// Mitad de la barra para que no sea muy grande en la pantalla.
	mitadBarra = resultadoPorcentaje(0.0, 0.0, 0.0) / 2;

Errores a parit del código de abajo.
1
2
3
4
if (resultadoPorcentaje > 100)
	{
		cout << ("#");
	}

Gravedad Código Descripción Proyecto Archivo Línea Origen Estado suprimido
Error (activo) E0042 los tipos de operando no son compatibles ("ResultadoPorcentaje" y "int") Interfaz_consola_nativo_01_cpp C:\Users\Meta\Documents\Visual Studio 2019\Projects\DLL_y_interfaz_nativo_01_cpp\Interfaz_consola_nativo_01_cpp\Interfaz_consola_nativo_01_cpp.cpp 122 IntelliSense





Gravedad Código Descripción Proyecto Archivo Línea Origen Estado suprimido
Error C2446 >': no hay conversión de 'int' en 'ResultadoPorcentaje' Interfaz_consola_nativo_01_cpp C:\Users\Meta\Documents\Visual Studio 2019\Projects\DLL_y_interfaz_nativo_01_cpp\Interfaz_consola_nativo_01_cpp\Interfaz_consola_nativo_01_cpp.cpp 122 Compilación





Gravedad Código Descripción Proyecto Archivo Línea Origen Estado suprimido
Mensaje La conversión de un tipo entero a un tipo de puntero requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función Interfaz_consola_nativo_01_cpp C:\Users\Meta\Documents\Visual Studio 2019\Projects\DLL_y_interfaz_nativo_01_cpp\Interfaz_consola_nativo_01_cpp\Interfaz_consola_nativo_01_cpp.cpp 122 Compilación
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 06/07/2020 12:06:45
Te estás liando con la larga cuerda de c++.

Tienes una dll con esta función
1
2
3
4
double __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}

Esa función quieres usarla en c++. Para eso primero tiienes que decirle al c++ cóno es la función.
1
typedef double(__stdcall* ResultadoPorcentaje)(float, float, float);

Ahora esa función tienes que meterla en una variable
ResultadoPorcentaje resultadoPorcentaje;

Ahí pones lo que devuelve GetProcAddress
1
resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");

resultadoPorcentaje no es un int, no es un float, no es un double, no es una fecha, no es una cadena de caracteres, es UNA FUNCION.
Como esta
1
2
3
4
5
6
7
8
9
void gotoxy(int x, int y)
{
	HANDLE hcon;
	hcon = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD dwPos;
	dwPos.X = x;
       dwPos.Y = y;
       SetConsoleCursorPosition(hcon, dwPos);
}

Como esta
1
2
3
4
5
6
7
8
9
int main(void)
{
	// Variables.
	const double Pi = 3.14;
	float radio;
	float altura;
	//double volumen;
	//double litros;
	float nivelAgua;
}

Y una función se llama con el nombre y () si no tiene parámetros, con (2) si acepta un int, con (2, 4,5) si acepta un int y un float...
Tu función
1
2
3
4
double __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}
quiere tres float porque eso le has dicho al c++ que lleva aquí
1
typedef double(__stdcall* ResultadoPorcentaje)(float, float, float);

Así que mientras no la llames con el nombre, abrir paréntesis, un float, otro float, otro float, cerrar paréntesis te va a dar error de aquí al final del universo ya sea por el big cruch o ya sea por el gran desgarrón o lo que sea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 06/07/2020 12:08:04
El if que muestras de nuevo usa resultadoPorcentaje como si fuera un valor. Si ya invocaste la funcion y ya obtuviste un valor, el que almacenaste en la variable mitadBarra, no seria razonable usar ese valor en vez de cometer el mismo error otra vez de usar resultadoPorcentaje como si fuera un valor?

Te sugiero cambiar el valor de la funcion resultadoPorcentaje a calcularPorcentaje porque veo que crees que resultadoPorcentaje es un resultado y no se convences que es una funcion que tienes que invocar para que sea un valor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 06/07/2020 16:25:32
TEngo el progrma mal diseñado.

1
resultadoPorcentaje = nivelAgua * (100 / altura);

Esto son solo variables, en el cual el resultado de almacena en resultadoPorcentaje. Por lo que cuentan, no hay que hacer funcion a esto.

se mira el niveAgua que tiene un valor, la altura también y el 100 que es fijo.

O lo que es lo mismo:
1
resultadoPorcentaje = 8 * (100 / 2)

Resultado del valor es 50 ara este ejemplo que pongo.

resultadoPorcentaje = 50

Tendría que estar or ahí esta operación
1
resultadoPorcentaje = nivelAgua * (100 / altura);
por algún lado, el propio usuario no lo toca directamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 06/07/2020 17:29:13
Cambiaste el programa?
Dejo de haber error?
Podrias confirmar que es lo que haces y cual es el resultado que obtienes?

Sospecho que no entiendes el paso de parametros de las funciones, o las funciones en general.

Sugiero que leas y te eduques al respecto primero, y despues que hayas leido y entendido como definir funciones, como pasar parametros, como llamarlas, etc. vuelvas a tu programa y veas que la distancia hasta que funcione es menor.

No tiene sentido esta iteracion en ese thread tratando de ayudarte en cual es un error especifico.

Esto te lo digo porque si modificaste el programa como te he indicado, pasando 3 parametros de tipo float y ha compilado y funcionado, AUNQUE de valores que no te sirven, cosa que no se porque no has reportando. Igual este programa te sirve, pues luego, en vez de pasar valores literales como 1.0, 2.0, 3.0 tendrias que usar variables que contengan los valores que si te sirven, pero en vez de esto vuelves aqui a decir que parece que tienes el programa mal disen~ado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 06/07/2020 18:47:06
El fallo es el mismo.

No he salido de ahí.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 07/07/2020 00:11:41
Estoy a la espera que muestres el programa que tienes y que NO CONTIENE resultadoPorcentaje como si fuera una variable, sino que aparece con una funcion invocada con 3 parametros.

Puedes sacarle una foto a la pantalla tal como lo hiciste antes, con el trozo de programa que contiene resultadoPorcentaje usado como corresponde y con el error que aparece?

Si sigues usando resultadoPorcentaje como variable estaremos iterando por siempre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 07/07/2020 14:26:55
Voy hacerlo de otra manera. Por fin funciona.

Quito de la dll este código:
1
2
3
4
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}

Este código de abajo lo pongo en la interfaz.
1
resultadoPorcentaje = nivelAgua * (100 / altura);

La dll si compila.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "pch.h"
 
extern "C"
{
    __declspec(dllexport) LPTSTR __stdcall Mensaje();
    __declspec(dllexport) float __stdcall Volumen(float, float, float, float);
    __declspec(dllexport) float __stdcall Litros(float, float);
    //__declspec(dllexport) float __stdcall ResultadoPorcentaje(float, float, float);
    __declspec(dllexport) float __stdcall VolumenLitros(float, float, float, float, float);
    __declspec(dllexport) float __stdcall CantidadTubosLitros(float, float, float);
    __declspec(dllexport) float __stdcall TotalLitros(float, float, float);
};
 
// Mensaje.
LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll. Versión: 1.0.0"); }
 
// Cálculo volumen.
float __stdcall Volumen(float volumen, float PI, float radio, float altura)
{
    return volumen = PI * (radio * radio) * altura;
}
 
// Cálculo litros.
float __stdcall Litros(float litros, float volumen)
{
    return litros = volumen * 1000;
}
 
// Cálculo porcentaje en % del litro de agua.
//float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
//{
//    return resultadoPorcentaje = nivelAgua * (100 / altura);
//}
 
// Cálculo litros de agua.
float __stdcall VolumenLitros(float volumenLitros, float PI, float radio, float nivelAgua, float resultadoLitros)
{
    return volumenLitros = PI * (radio * radio) * nivelAgua;
    return resultadoLitros = volumenLitros * 1000;
}
 
// Cálculo litros por cantidad de tubos
float __stdcall CantidadTubosLitros(float cantidadTubosLitros, float cantidadTubos, float resultadoLitros)
{
    return cantidadTubosLitros = cantidadTubos * resultadoLitros;
}
 
// Cálculo cantidad de litros con total de tubos.
float __stdcall TotalLitros(float totalLitros, float litros, float cantidadTubos)
{
    return totalLitros = litros * cantidadTubos;
}

Archivo .def lo dejo así:
1
2
3
4
5
6
7
8
LIBRARY DLL_al_poder
EXPORTS
Mensaje
Volumen
Litros
VolumenLitros
CantidadTubosLitros
TotalLitros

Código completo en la interfaz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.
 
using namespace std;
//using std::cout;
//using std::cin;
 
// Función posición del cursor.
void gotoxy(int x, int y)
{
	HANDLE hcon;
	hcon = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD dwPos;
	dwPos.X = x;
	dwPos.Y = y;
	SetConsoleCursorPosition(hcon, dwPos);
}
 
// Definir estas funciones.
typedef LPTSTR(__stdcall* Mensaje)();
typedef float(__stdcall* Volumen)(float, float, float, float);
typedef float(__stdcall* Litros)(float, float);
//typedef float(__stdcall* ResultadoPorcentaje)(float, float, float);
typedef float(__stdcall* VolumenLitros)(float, float, float, float, float);
typedef float(__stdcall* CantidadTubosLitros)(float, float, float);
typedef float(__stdcall* TotalLitros)(float, float, float);
 
// Variables.
const double Pi = 3.14;
float radio;
float altura;
//double volumen;
//double litros;
float nivelAgua;
float resultadoPorcentaje;
//double resultadoLitros;
//double volumenLitros;
float mitadBarra;
float cantidadTubos;
//double cantidadTubosLitros;
//double totalLitros;
 
int main(void)
{
	// Importar dll.
	HINSTANCE hDLL = 0;
	Mensaje mensaje;
	Volumen volumen;
	Litros litros;
	//ResultadoPorcentaje resultadoPorcentaje;
	VolumenLitros volumenLitros;
	CantidadTubosLitros cantidadTubosLitros;
	TotalLitros totalLitros;
 
	hDLL = LoadLibrary(L"C:\\Users\\Meta\\Documents\\Visual Studio 2019\\Projects\\DLL_y_interfaz_nativo_01_cpp\\Debug\\DLL_y_interfaz_nativo_01_cpp.dll");
	mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
	volumen = (Volumen)GetProcAddress(hDLL, "Volumen");
	litros = (Litros)GetProcAddress(hDLL, "Litros");
	//resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");
	volumenLitros = (VolumenLitros)GetProcAddress(hDLL, "VolumenLitros");
	cantidadTubosLitros = (CantidadTubosLitros)GetProcAddress(hDLL, "CantidadTubosLitros");
	totalLitros = (TotalLitros)GetProcAddress(hDLL, "totalLitros");
 
	// Mostrar caracteres correctamente en pantalla y título de la ventana.
	SetConsoleOutputCP(65001);
	wchar_t titulo[128];
	MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
	SetConsoleTitle(titulo);
 
	// Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
	SMALL_RECT r = { 0, 0, 49, 35 }; // X = 49, Y = 9.
	SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
 
	// Ocultar cursor.
	CONSOLE_CURSOR_INFO cci;
	GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
	cci.bVisible = 1; // 0 oculta cursor. 1 muestra cursor.
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
 
	// Posición del cursor.
	gotoxy(3, 2);
 
	// Mostrar textos en pantalla.
	wcout << mensaje() << endl;
	gotoxy(0, 4);
	cout << "Introduce el radio en m.: ";
	cin >> radio;
	cout << "Introduce la altura en m. ";
	cin >> altura;
	cout << "Introduce altura del agua. Máximo es de " << altura << ":";
	cin >> nivelAgua;
	cout << "Introduces cantidad de tubos: ";
	cin >> cantidadTubos;
 
	// ########## Dibujo de la barra.
	cout << "\n";
	cout << ("0 %                     50 %                   100 %") << endl;
	cout << ("┌────────────────────────┬───────────────────────┐") << endl;
 
	// Mitad de la barra para que no sea muy grande en la pantalla.
	resultadoPorcentaje = nivelAgua * (100 / altura);
 
	if (mitadBarra > 50)
	{
		mitadBarra = 50;
	}
 
	// Rellenar la barra.
	for (float i = 1; i <= mitadBarra; i++)
	{
		cout << ("█");
	}
 
	// Si llega a 100 se pone el # en rojo.
 
	if (resultadoPorcentaje > 100)
	{
		cout << ("#");
	}
	//########## Fin dibujo de la barra.
 
	// Pisición del texto a mostrar.
	gotoxy(0, 11);
 
	cout << "\nPorcentaje: " << resultadoPorcentaje << " %.";
 
 
	FreeLibrary(hDLL);
 
	// Esperando pulsar Enter para salir.
	cin.get();
	return 0;
}

captura-2146517

No se como se quita esos sobrantes textos que aparece al final, pero bueno, por fin ya se puede leer la dichoza dll.

Hay otra cosa que quiero hacer pero no me sale y hago esta pregunta.

Todos los cálculos matemáticos los quiero en la dll, como este de abajo, que al final tuve que ponerlo en la interfaz.
1
2
	// Mitad de la barra para que no sea muy grande en la pantalla.
	resultadoPorcentaje = nivelAgua * (100 / altura);

¿Hay posibilidad de ponerlo en la dll o no?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 07/07/2020 14:50:48
Pensnado bien.

Esta parte del código del dibujado que indica abajo.

¿Se puede poner en la dll?

Solo lo llamo desde la interfaz y ya está.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
	// ########## Dibujo de la barra.
	cout << "\n";
	cout << ("0 %                     50 %                   100 %") << endl;
	cout << ("┌────────────────────────┬───────────────────────┐") << endl;
 
	// Mitad de la barra para que no sea muy grande en la pantalla.
	resultadoPorcentaje = nivelAgua * (100 / altura);
 
	if (mitadBarra > 50)
	{
		mitadBarra = 50;
	}
 
	// Rellenar la barra.
	for (float i = 1; i <= mitadBarra; i++)
	{
		cout << ("█");
	}
 
	// Si llega a 100 se pone el # en rojo.
 
	if (resultadoPorcentaje > 100)
	{
		cout << ("#");
	}
	//########## Fin dibujo de la barra.

Otra cosa. Si el texto que está en la dll, si uso acentos, como la parabra Versión, con la tilde en la ó, o algo similar, no lee bien. Si lo hace la interfaz porque está programado para ello.

¿Hay solución también?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 07/07/2020 15:52:05
O sea, como te has empeñado en usar una función de la dll como si fuera un float, la quitas de la dll.

Si los dos usan unicode y la misma página de códigos puedes escribir hasta en chino.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 07/07/2020 16:06:05
¿Cómo lo harías sin el floar? ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Rodrigo (539 intervenciones) el 07/07/2020 17:18:41
Por que quieres usar una dll?
Usar una implica esto de las funciones, que claramente intentas evitar leer y aprender.
Te sugiero hacer todo localmente y aprender esto en otro momento.

Yo me retiro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 07/07/2020 17:59:40
Por curiosidad.

Calculos y leer textos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 07/07/2020 18:55:18
Muchísimas gracias a todos.

Les puse un 1. Si ven que me falta alguno, lo hacen saber.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me da un fallo de conversión

Publicado por Nacho (181 intervenciones) el 07/07/2020 19:39:19
¿Y quién te a puesto a ti los -1?

No es cuestión de si float o no float. Si declaras algo como una función y no la usas como una función el c++ va a darte errores siempre, aunque no esté en una dll y la declares en un h.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Me da un fallo de conversión

Publicado por Meta (45 intervenciones) el 07/07/2020 20:12:24
Lo entendí. Al final dichos cálculos hay que ponerlo en la interdaz y ya está.

No me importa quien pone los -1. Un ofendido, indignado. Da igual.

Y por ustedes, gracias de nuevo y el tiempo.

;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar