Foros del Web » Programación para mayores de 30 ;) » Programación General »

PARA LOS GURUS. Help

Estas en el tema de PARA LOS GURUS. Help en el foro de Programación General en Foros del Web. Hola que tal, estoy teniendo un problema. Primero describo el proyecto, el lenguaje y la plataforma. Proyecto programa para instituto, estoy preparandolo para un final ...
  #1 (permalink)  
Antiguo 19/04/2005, 18:52
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 8 meses
Puntos: 0
PARA LOS GURUS. Help

Hola que tal, estoy teniendo un problema.
Primero describo el proyecto, el lenguaje y la plataforma.
Proyecto programa para instituto, estoy preparandolo para un final de la facultad.
Solo llegamos hasta archivo y listas nada mas sobre MS-DOS, por mi cuenta porque era un detalle para presentar en la facultad el programa, habia que investigar, trate con las clases pero la verdad que como autidacta creo que es un poquitin complejo el tema si no se entiende bien del principio, pero de todas formas me pase a 32 bits y estoy haciendo el programa sobre WINDOWS XP, en C++ en el IDE Builder 6.0. Aclaro eso de la facu por unos post que lei anteriormente.

Bueno tuve problemas en cuanto a que he creado una funcion que me crea un vector dinamico con una estructura del tipo config, el parametro para crear el tamaño del vector lo utilizo pasando por referencia un "int &i" declarado tambien en la funcion cuando vean el codigo a continuacion sera mas claro.
La cosa es que mi idea, era crear una funcion que la pueda usar varias veces al principio el llamado es para pasar los datos de un archivo a un vector y de ahi pasar los datos a un StringGrid y un ListBox, de esta manera tengo un detalle de los cursos en el stringgrid y al listbox lo utilizo para seleccionar un curso y despues modificarlo en el vector y volver a escribir en el archivo los cambios. Bueno a la parte de la seleccion para la modificacion no llegue aun ya que no me anda la funcion, la unica forma de lograr en parte que el compilador no me tire errores, fue crear un prototipo en la clase del formulario que uso, lo hice en la parte de declaraciones publicas(unit2.h), despues en el cpp (unit2.cpp) la defino y la llamo en otra fucion que es la del boton que realiza la carga en el vector y luego realiza la carga del vector al stringgrid. Pero esto ultimo no me funciona y probe toda la tarde y no lo consegui esto lo hice a ojo porque es un despelote manejar funciones en un ide asi que hacerlo en un simple devc++ por ejemplo, pero lo tome como desafio y bueno aca estoy remando aca dejo los archivos espero que se haya entendido algo de la explicacion y cualquier cosa que necesiten para hecharme una mano me preguntan.

unit2.h
Código PHP:
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
#include <Grids.hpp>
#include <ActnList.hpp>
//---------------------------------------------------------------------------
class TInsCur : public TForm
{
__published// IDE-managed Components
        
TPageControl *PageControl1;
        
TTabSheet *TabSheet1;
        
TLabel *Label1;
        
TLabel *Label5;
        
TLabel *Label6;
        
TLabel *Label2;
        
TLabel *Label3;
        
TLabel *Label4;
        
TLabel *Label8;
        
TLabel *Label7;
        
TEdit *Edit1;
        
TEdit *Edit2;
        
TEdit *Edit3;
        
TEdit *Edit4;
        
TButton *Button1;
        
TTabSheet *TabSheet2;
        
TTabSheet *TabSheet3;
        
TStringGrid *StringGrid1;
        
TButton *Button2;
        
TButton *Button3;
        
TListBox *ListBox1;
        
void __fastcall Button1Click(TObject *Sender);
        
void __fastcall Button2Click(TObject *Sender);
        
void __fastcall Button3Click(TObject *Sender);
private: 
// User declarations
public:  // User declarations
        
__fastcall TInsCur(TComponentOwner);
        
struct config
        
{
         
int id;
         
char curso[30];
         
int prec_c;
         
int prec_m;
         
char mat[30];
         
int idmat;
        };
        
void almacenacur(config *vecint &l);
};
 
//---------------------------------------------------------------------------
extern PACKAGE TInsCur *InsCur;
//---------------------------------------------------------------------------
#endif 
unit2.cpp
Código PHP:
//---------------------------------------------------------------------------
#define path ("C:\\Documents and Settings\\All Users\\Escritorio\\config.dc")
// Con esto modifico a gusto el path sobre el cual trabajar con los arhivos.
#include <vcl.h>
#include <stdio.h>
#include <ctype.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#include "estructuras.h"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TInsCur *InsCur;
//---------------------------------------------------------------------------
__fastcall TInsCur::TInsCur(TComponentOwner)
        : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TInsCur::Button1Click(TObject *Sender)
{
 
int cid=0;
 
config auxaux1aux2;
 
FILE *fp, *fr;// fp Escritura - fr Lectura
 
char paths[100];
 
strcpy(pathspath);
 
//Verificar que esten completos todos los campos.
 
if(Edit1->Text==""||Edit2->Text=="")
 {
 
ShowMessage("Completar NOMBRE DEL CURSO y COSTO DEL CURSO");
 }
 else
 {

        if((
fr=fopen(path,"a+"))==NULL)
        {
         
ShowMessage("El archivo no se pudo cargar1.");
         exit(
0);
        }
        else
        {
           
fread(&auxsizeof(aux), 1fr);
           while(!
feof(fr))
           {
            
cid=cid+1;
            
fread(&auxsizeof(aux), 1fr);
           }
                
aux.id=cid+1;
                
strcpy(aux.cursoEdit1->Text.c_str());
                
aux.prec_c=Edit2->Text.ToInt();
                
strcpy(aux.matEdit3->Text.c_str());
                
aux.prec_m=Edit4->Text.ToInt();
                
aux.idmat=cid+1;
                if((
fp=fopen(path,"a+"))==NULL)
                {
                
ShowMessage("El archivo no se pudo cargar2.");
                exit(
0);
                }
                
fwrite(&auxsizeof(aux), 1fp);
                
fclose(fp);
        }
// cierra la lectura del archivo
        // Termina lectura y escritura de archivo.-

 
Edit1->Text="";
 
Edit2->Text="";
 
Edit3->Text="";
 
Edit4->Text="";
 
fread(&aux2sizeof(aux2), 1fr);
 while(!
feof(fr))
 {
  
fread(&aux2sizeof(aux2), 1fr);
 }
 
ShowMessage(aux2.id);
 
fclose(fr);
 }
}
//---------------------------------------------------------------------------
void __fastcall TInsCur::Button2Click(TObject *Sender)
{
  
StringGrid1->Cells[0][0]="Curso";
  
StringGrid1->Cells[1][0]="Costo";
  
StringGrid1->Cells[2][0]="Material";
  
StringGrid1->Cells[3][0]="Costo";
  
configvec;
  
int l,i;
  
TInsCur::almacenacur(vecl);
  for(
i=0i<li++)
  {
   
StringGrid1->Cells[0][i+1]=vec[i].curso;
   
StringGrid1->Cells[1][i+1]=vec[i].prec_c;
   
StringGrid1->Cells[2][i+1]=vec[i].mat;
   
StringGrid1->Cells[3][i+1]=vec[i].prec_m;
   
ListBox1->Items->Add(vec[i].curso);
  }
 
StringGrid1->RowCount=i+1;
 
//Termina creacion de filas
 //-------------------------
 
}
//---------------------------------------------------------------------------
 
void __fastcall TInsCur::Button3Click(TObject *Sender)
{
 
//int vec[10];
 //ShowMessage(ListBox1->Items->Strings[ListBox1->ItemIndex]);
 //almacenacur(vec);
 //ShowMessage("a");
 //Comparar hasta entontrar en el vector que se creo
}
//---------------------------------------------------------------------------
//Forma de usar una funcion general para la creacion de un vector
//y almacenamiento de datos en memoria.
void TInsCur::almacenacur(config *vecint &l)
{
  
// Construir las filas necesaria de la matriz para mostrar datos
 
FILE *fp,*fp2;
 
config lee,lee2;
 
int j=0;
 
char paths[100];
 
strcpy(pathspath);
 
l=0;
//Crear vector para almacenar cambios
 
fp=fopen(path"r");
 
fread(&leesizeof(lee), 1fp);
 while(!
feof(fp))
 {
   
l++;
   
fread(&leesizeof(lee), 1fp);
 }
//l da la cantidad de elementos
 
vec = new config[l];
 
delete vec//Liberamos memoria
 //Añadimos los elementos del archivo al vector
 //para trabajar los datos desde memoria y acualizar ante
 // algun cambio.
 
fp2=fopen(path"r");
 
fread(&lee2sizeof(lee2), 1fp2);
 while(!
feof(fp2))
 {
  
vec[j].id=lee2.id;
  
strcpy(vec[j].curso,lee2.curso);
  
vec[j].prec_c=lee2.prec_c;
  
strcpy(vec[j].mat,lee2.mat);
  
vec[j].prec_m=lee2.prec_m;
  
vec[j].idmat=lee2.idmat;
  
j++;
  
fread(&lee2sizeof(lee2), 1fp2);
 }
 
fclose(fp2);

Espero sugerencias
Gracias.
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #2 (permalink)  
Antiguo 20/04/2005, 00:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No lei demasiado el codigo pero evidentemente esto es un error:

Código:
vec = new config[l];
delete vec; //Liberamos memoria
//Añadimos los elementos del archivo al vector
//para trabajar los datos desde memoria y acualizar ante
// algun cambio.
fp2=fopen(path, "r");
fread(&lee2, sizeof(lee2), 1, fp2);
while(!feof(fp2))
{
  vec[j].id=lee2.id;
  strcpy(vec[j].curso,lee2.curso);
  vec[j].prec_c=lee2.prec_c;
  strcpy(vec[j].mat,lee2.mat);
  vec[j].prec_m=lee2.prec_m;
  vec[j].idmat=lee2.idmat;
  j++;
  fread(&lee2, sizeof(lee2), 1, fp2);
}
fclose(fp2);
No podes primero liberar la memoria y despues acceder a ella, para darte un ejemplo es como que yo alquile una pelicula en el videoclub, la devuelva y despues la vea, imposible.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 20/04/2005, 01:28
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Tampoco es correcto el uso que haces de config*, la variable vec de la funcion Button2Click sigue estando inicializada a basura porque almacenacur no puede cambiar el valor al que vec apunta. vec para esa funcion es una variable local y solo cambia la direccion a la que apunta dentro de su ambito.

Se me ocurren dos formas de solucionarlo (probalas):

Con esta signatura void TInsCur::almacenacur(config **vec, int &l), le asignas su valor a *vec con new y entonces tambien cambia en Button2Click, tenes que llamar a almacenacur con &vec.

Con esta otra signatura void TInsCur::almacenacur(config* &vec, int &l), seguis trabajando como hasta ahora.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #4 (permalink)  
Antiguo 20/04/2005, 18:29
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 8 meses
Puntos: 0
La verdad que tuve si un error con eso de new y delete jajajaja es que en medio de pruebas me habia dado resultado liberar y accesar de igual manera a esa parte de la memoria pero a lo mejor fue otro error que me dio la impresion esa.
En cuanto lo que me pusiste eternal idol voy a probar de la segunda manera usando la signatura con config* &vec para no cambiar nada, porque de la primera manera creo que me haria muchos problemines,.
Gracias y estare posteando con los resultados conseguidos.
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #5 (permalink)  
Antiguo 21/04/2005, 19:26
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 8 meses
Puntos: 0
Bueno escribia para avisar que todo me salio de pelos hice lo que dijiste eternal idol y de hecho e usado la misma tecnica para pasar parametros enteros que necesito usar entre diferentes formularios y de mas.
Asi que muy agradecido estoy y cualquier otro problemin por aca me veran
Saludos
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #6 (permalink)  
Antiguo 21/04/2005, 23:36
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Me alegro de que haya servido
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:16.