Mejor respuesta robert01 , 23 febrero 2023 - 09:03
Ya encontré la solución luego de probar de todo. Solo cambié el valor 0 de tamano por 1. Saludos
Ir al mensaje completoMejor respuesta robert01 , 23 febrero 2023 - 09:03
Ya encontré la solución luego de probar de todo. Solo cambié el valor 0 de tamano por 1. Saludos
Ir al mensaje completoEscrito 22 febrero 2023 - 06:01
Hola. ¿Como les va a todos? Tengo un pequeño problema. Esta parte de código en C es para abrir y leer una matriz en un archivo de texto. El problema que tiene es que no lee correctamente si es de 4 x 4, lee como si fuera de 3x3 y con errores. Hay algo que no veo. No se programar en c.
#include <stdio.h> #include <stdlib.h> #include "mi_libreria.h" int main() { int tamano; double** matriz; if (archivo == NULL) { return 1; } // Contar número de filas tamano = 0; if (c == '\n') { tamano++; } } // Crear matriz for (int i = 0; i < tamano; i++) { } // Leer valores for (int i = 0; i < tamano; i++) { for (int j = 0; j < tamano; j++) { return 1; } } } for (int i = 0; i < tamano; i++) { for (int j = 0; j < tamano; j++) { } } calcular_matriz_inversa(matriz, tamano); for (int i = 0; i < tamano; i++) { for (int j = 0; j < tamano; j++) { } } for (int i = 0; i < tamano; i++) { free(matriz[i]); } free(matriz); return 0; }
Gracias
Editado por robert01, 22 febrero 2023 - 06:27 .
Escrito 23 febrero 2023 - 09:03 Mejor respuesta
Ya encontré la solución luego de probar de todo. Solo cambié el valor 0 de tamano por 1. Saludos
Escrito 24 febrero 2023 - 09:27
Ya encontré la solución luego de probar de todo. Solo cambié el valor 0 de tamano por 1. Saludos
Que bien robert01,
Lo que no sabemos C aprendimos algo hoy.
Saludos
Escrito 25 febrero 2023 - 04:17
Hola Egostar!
Es increíble pero si sabía algo de C pero no me acordaba por el paso del tiempo. Ayer encontré un código muy parecido a este como parte de un programa que había hecho en 2005 en unos backup.
Ese código que puse ahí fue generado por www.chat.openai.com. Se me ocurrió probar que podía llegar a obtener preguntando.
El código de la dll es:
#include "inversa.h" __declspec(dllexport) calcular_matriz_inversa(double** matriz, int tamano) { // Implementación del cálculo de la matriz inversa } void calcular_matriz_inversa(double **matriz, int tamano) { double temp; int i, j, k; double identidad[tamano][tamano]; // Inicializar la matriz identidad for (i = 0; i < tamano; i++) { for (j = 0; j < tamano; j++) { identidad[i][j] = (i == j) ? 1 : 0; } } // Convertir la matriz original en una matriz triangular superior for (i = 0; i < tamano; i++) { for (j = i + 1; j < tamano; j++) { temp = matriz[j][i] / matriz[i][i]; for (k = i; k < tamano; k++) { matriz[j][k] -= temp * matriz[i][k]; } for (k = 0; k < tamano; k++) { identidad[j][k] -= temp * identidad[i][k]; } } } // Convertir la matriz triangular superior en la matriz identidad for (i = tamano - 1; i >= 0; i--) { for (j = i - 1; j >= 0; j--) { temp = matriz[j][i] / matriz[i][i]; for (k = 0; k < tamano; k++) { identidad[j][k] -= temp * identidad[i][k]; } } } // Normalizar la matriz identidad for (i = 0; i < tamano; i++) { temp = matriz[i][i]; for (j = 0; j < tamano; j++) { identidad[i][j] /= temp; } } // Copiar la matriz inversa en la matriz original for (i = 0; i < tamano; i++) { for (j = 0; j < tamano; j++) { matriz[i][j] = identidad[i][j]; } } }
#ifndef DLL_INVERSA_H #define DLL_INVERSA_H #ifdef __cplusplus extern "C" { #endif void calcular_matriz_inversa(double *matriz, int tamano, double *matriz_inversa); #ifdef __cplusplus } #endif #endif
Saludos
Escrito 25 febrero 2023 - 09:05
El problema lo tienes si la última linea de tu archivo de texto no termina en un retorno de línea '\n', entonces feof en ese punto es cierto y con elle te falta una linea por contar.
Pero si no es el caso vas a tener un problema. Imagina que después de escribir tu matriz de 4x4 hay varios retornos de línea, tu código fallará. O tienes bien definido y limitado es número de retornos de línea que se pueden escribir al final del archivo, o tienes que ajustar el código de lectura.
Para el caso de necesitar el control de este asunto, propongo este ajuste que te permite leer el tamaño independientemente de si hay uno, ninguno o cientos de retornos al acabar tu archivo:
// Calculando el tamaño del archivo fseek(archivo, 0, SEEK_END); long Size = ftell(archivo); fseek(archivo, 0, SEEK_SET); // Reservando un buffer suficientemente grande char *buffer = (char*)malloc(Size); // Leyendo el número de líneas útiles del archivo tamano = 0; while(fgets(buffer, Size, archivo) && *buffer != '\n') tamano++; free(buffer);
Saludos.
Escrito 25 febrero 2023 - 10:27
El problema lo tienes si la última linea de tu archivo de texto no termina en un retorno de línea '\n', entonces feof en ese punto es cierto y con elle te falta una linea por contar.
Pero si no es el caso vas a tener un problema. Imagina que después de escribir tu matriz de 4x4 hay varios retornos de línea, tu código fallará. O tienes bien definido y limitado es número de retornos de línea que se pueden escribir al final del archivo, o tienes que ajustar el código de lectura.
Para el caso de necesitar el control de este asunto, propongo este ajuste que te permite leer el tamaño independientemente de si hay uno, ninguno o cientos de retornos al acabar tu archivo:
cpp
// Calculando el tamaño del archivo fseek(archivo, 0, SEEK_END); long Size = ftell(archivo); fseek(archivo, 0, SEEK_SET); // Reservando un buffer suficientemente grande char *buffer = (char*)malloc(Size); // Leyendo el número de líneas útiles del archivo tamano = 0; while(fgets(buffer, Size, archivo) && *buffer != '\n') tamano++; free(buffer);
Saludos.
Hola Escafandra. Gracias por tu aporte. Ya voy a probar cuando consiga que el compilador se pueda ejecutar. No se porque ahora me dice que no puede reconocer gcc.
Saludos