UTNianos

Versión completa: Ayuda - Error de pascal
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, este es mi primer mensaje en el foro y mañana al mediodía tengo que entregar el TP de algoritmos. Tengo todo hecho pero a la hora de compilar el programa en dev-pascal me tira un error que no tengo idea de por qué está mal. Les dejo el código

Spoiler: Mostrar

Type
str100 = string[100];
str50 = string[50];
str3 = string[3];
Tvec = Array [1..40] of byte;
TRInfo = record
CodTema: string[3];
pos: byte;
End;
TPtr = ^TLista;
TLista = record
RInfo: TRInfo;
Sgte: TPtr;
End;
Tnodo =TLista;
TregEnlaces=Record
Esp: char;
Curso: word;
Grupo: byte;
Enlace: str100;
Descripcion: str50;
Responsable: str50;
CodigoTema: str3;
End;
Tarchinfo = file of TRinfo;
TarchEnlaces = file of TregEnlaces;
TarchTLista = file of TLista;

VAR
i: byte;
ArchEnlaces: TarchEnlaces;
Vec: TVec;
Ptr: TPtr;
Lista: Tnodo;
TemaSelec: string[3];
ArchDesc: text;
CodTema: string[3];
NombreTema: string[50];
Info: TRInfo;
ArchUnif: TarchEnlaces;
ArchIn: TarchEnlaces;
Cant: integer;
P: byte;
NomFisArch: string[15];
Puntero: TPtr;




PROCEDURE MostrarEnlacesTema (VAR ArchEnlaces: tArchEnlaces; VAR Vector: Tvec; i:integer; T:TRegEnlaces);

Begin
i:=0;
Assign (ArchEnlaces, 'EnlacesK1193.DAT');
Reset (ArchEnlaces);

WHILE (Vector[i] <> -1) AND (i<40) DO
Begin
i:= i+1;
Seek (ArchEnlaces, Vector [i]);
Read (ArchEnlaces, T);
Write (ArchEnlaces);
End;
End;



PROCEDURE ArmarVecPosics (VAR Vec:Tvec; VAR Ptr:TPtr; Lista:Tnodo; TemaSelec:string[3];i:integer;BuscarNodo:TPtr);

Begin
i:=0;
Ptr:= Lista;

WHILE (Ptr <> Nil) DO
Ptr:= BuscarNodo(Ptr; TemaSelec);
Vec[i]:= Ptr^.info.Tema;
i:= i+1;

END;

IF i<= 40
THEN
Begin
Vec[i]:= -1;
END;
END;



PROCEDURE MostrarDescTema (NroIngresado:byte; VAR CodTema: string[3]; ArchDesc: Text);

Begin
Case NroIngresado of
1: NombreTema:= 'Responsabilidad Social';
CodTema:= RS
Assign (ArchDesc,'RS.TXT');
End;
2: NombreTema:= 'Responsabilidad Social Universitaria';
Assign (ArchDesc,'RSU.TXT');
CodTema:= RSU
End;
3: NombreTema:= 'Desarrollo Sustentable';
CodTema:= DS
Assign (ArchDesc,'DS.TXT');
End;
4: NombreTema:= 'Formacion y Educacion Ambiental';
Assign (ArchDesc,'FEA.TXT');
CodTema:= FEA
End;
5: NombreTema:= 'Tics y Cuidado Ambiental';
Assign (ArchDesc,'TIC.TXT');
CodTema:= TIC
End;
6: SalirPrograma:= ReadKey;
End;
end;
Reset (ArchDesc);
Rewrite (ArchDesc,
'Tema: ', NombreTema,' Fecha: ',DateToStr
'Codigo de Tema: ', CodTema,' Hora: ', TimeToStr
'Definicion: ');

Close (ArchDesc);
End;



Function BuscarNodo (puntero: TPtr; info: TRInfo): TPtr;

Begin
While (puntero <> NIL) AND (info.CodTema <> puntero^.info.CodTema)
Begin
puntero := puntero^.Sgte;
End;
BuscarNodo := puntero;
End;



PROCEDURE Estrategia1.1 (VAR Lista:TLista; VAR ArchUnif:TRegEnlaces; VAR Archln:TRegEnlaces; VAR Rinfo: TRinfo; VAR Cant: int);
Begin
Lista:= Nil;
write('Ingrese cantidad de Archivos a unificar:');
read(Cant);
P:=0;
For i to Cant do
begin
write('Ingrese nombre fisico del archivo:');
read(NomFisArch);
assign(Archin, NomFisArch);
reset(NomFisArch);
While not EOF(Archin) do
begin
read(Archin, TRenlaces);
write(ArchUnif, TRenlaces);
Rinfo.CodTema:=TRenlaces.CodigoTema;
Rinfo.pos:= P;
Procedure InsertarDelante (var Lista: TLista; Valor: TRInfo);
P:=P+1;
end;
end;
end;





PROCEDURE Estrategia2.2 (VAR Puntero:Tptr; Lista:Tnodo; Tema:string[3]; ArchDef: text, VAR Vec:Tvec; ArhcEnlaces: TArchEnlaces);
Begin
PROCEDURE MostrarDescTema (CodTema; ArchDesc);
IF NroIngresado = 6 THEN
Begin
Write('Finalizado el programa');
End;
ELSE
Begin
PROCEDURE ArmarVecPosics (Vec; Puntero; Lista; Tema);
PROCEDURE MostrarEnlacesTema (ArchEnlaces; Vec);
End;
END;



PROGRAM TrabajoPractico2;

Begin

PROCEDURE Estrategia1.1 (Lista; ArchUnif; ArchIN; Rinfo);

PROCEDURE Estrategia2.2 (Puntero; Lista; Tema; ArchDesc; Vec; ArchEnlaces);

END.




El error dice 75/28 "Fatal: Syntax error, ; expected but ( found".

O sea el error estaría en este proceso, justo antes de "(Ptr;TemaSelec);" como si esperase que la sentencia terminara así "BuscarNodo;"

Spoiler: Mostrar

PROCEDURE ArmarVecPosics (VAR Vec:Tvec; VAR Ptr:TPtr; Lista:Tnodo; TemaSelec:string[3];i:integer;BuscarNodo:TPtr);

Begin
i:=0;
Ptr:= Lista;

WHILE (Ptr <> Nil) DO
Ptr:= BuscarNodo(Ptr; TemaSelec);
Vec[i]:= Ptr^.info.Tema;
i:= i+1;

END;

IF i<= 40
THEN
Begin
Vec[i]:= -1;
END;
END;


Ese es el único error que me tira, y me parece que es muy tonto y no me estoy dando cuenta. O al menos eso espero, si me pueden ayudar me salvarían la materia!!! Espero haber sido claro, cualquier cosa pregunten. Espero alguna respuesta, gracias!!

EDIT: CHAN recién cuando publiqué el post vi que había una opción para compilar el programa acá mismo, así lo hice y me tiró muchos más errores que en dev-pascal :/ Bueno, ahora me estaré fijando qué onda estos errores que tiró...
Si nadie te responde hasta dentro de un ratito, te lo reviso yo; ahora estoy desde el celular y veo el código cortado, y no me deja scrollear horizontal
Es cuestión de saber leer el error.

75/28 "Fatal: Syntax error, ; expected but ( found".

Dice que en la linea 75 de codigo, columna 28 esperaba un ; pero encontró un (.

El problema acá es que le pasaste los argumentos a BuscarNodo separados por ; y no por ,

Ptr:= BuscarNodo(Ptr; TemaSelec);
//Tendría que ser Ptr:= BuscarNodo(Ptr, TemaSelec);


Saludos!

EDIT:

Intenté correrlo y no es tu único problema:
1)Fijate que definiste la funcion BuscarNodo después de haberla invocado.
Siempre las funciones y procedimientos que se usan en otras funciones o procedimientos se definen ANTES.

2)Cuando tenés un while en donde vas a tener varias lineas de código, si o si tiene que ir entre un Begin y un End.

Y por último y porque me tengo que ir y no tengo más tiempo:

PROCEDURE ArmarVecPosics (VAR Vec:Tvec; VAR Ptr:TPtr; Lista:Tnodo; TemaSelec:string[3];i:integer;BuscarNodo:TPtr);

está mal, no podés (creo) pasar [] en los parámetros. Igual, más allá de eso, TemaSelect después se lo pasas a buscar nodo, debería ser un TRInfo.

Espero que te ayude a empezar a ver bien los errores.

Saludos!
Gracias por las correcciones Marvelek!

Bueno, para el que haya leído comento que corregí lo que me indicó Marvelek pero ahora me tira otros errores

"69/61 Error: Unknown record field identifier INFO"
"69/66 Error: Unknown record field identifier CODTEMA"

y el mismo error de antes persiste

"84/28 Fatal: Syntax error, ; expected but ( found" (Cambió la posición porque puse la función antes del procedimiento que la llama)

Esos errores de arriba ya me los había tirado antes, no sé por qué después dejaron de salir... Bueno la cosa es que yo tengo definido el registro TRInfo

TRInfo = record
CodTema: string[3];
pos: byte;
End;

y esos errores de los identificadores que me tira dev-pascal en la función:

Spoiler: Mostrar

Function BuscarNodo (puntero: TPtr; info: TRInfo): TPtr;

Begin
While (puntero <> NIL) AND (info.CodTema <> puntero^.info.CodTema)DO
Begin
puntero := puntero^.Sgte;
End;
BuscarNodo := puntero;
End;


creo que se refiere a que yo no definí el tipo de registro TRInfo, cosa que sí hice... no sé si estoy entendiendo mal. Es como si nunca hubiera definido TRInfo y por lo tanto los campos "info.CodTema" no existen, es así? Gracias por la ayuda
(16-11-2012 10:35)Marvelek escribió: [ -> ]PROCEDURE ArmarVecPosics (VAR Vec:Tvec; VAR Ptr:TPtr; Lista:Tnodo; TemaSelec:string[3];i:integer;BuscarNodo:TPtr);

está mal, no podés (creo) pasar [] en los parámetros. Igual, más allá de eso, TemaSelect después se lo pasas a buscar nodo, debería ser un TRInfo.

This.

En el type tendrías que declarar un neuvo tipo de dato,

Onda:


Type
str3 = string[3];


Después en tu VAR, harás


Var
TemaSelec: str3;


Y entonces cuando lo uses en los procedimientos y funciones, usás el "str3" que declaraste vos como tipo de dato.
Así que ese pedacito de código deberías modificarlo, y volvé a recompilar.
Lo mismo con CodTema; hacé lo mismo que dije al principio.

Otra cosa:

Cita:"84/28 Fatal: Syntax error, ; expected but ( found" (Cambió la posición porque puse la función antes del procedimiento que la llama)

Es el mismo error pero no es en la misma línea.

Probablemente vayas corrigiendo y te vayan saliendo más detalles.
El compilador frente a determinados eventos, agarra y compila hasta donde está el primer error que encuentra.
Te muestra el error, y deja de compilar

En otros casos quizás te pase que más que un error sea alguna especie de advertencia; en ese caso compilaría pero te mostraría un mensaje también
Hola nanuit, gracias por responder! Hice lo que me decís, modifiqué los strings. Pero no me cambió nada, me sigue tirando los errores que indiqué en el post anterior. Y eso que me dijiste que el error de sintaxis me lo muestra en otra línea sí, me lo muestra en otra linea pero en el mismo llamado a función de antes:

Spoiler: Mostrar

PROCEDURE ArmarVecPosics (VAR Vec:Tvec; VAR Ptr:TPtr; Lista:Tnodo; RTemaSelec:TRInfo;i:integer;BuscarNodo:TPtr);

Begin
i:=0;
Ptr:= Lista;

WHILE (Ptr <> Nil) DO
Begin
Ptr:= BuscarNodo(Ptr, RTemaSelec);
Vec[i]:= Ptr^.info.Tema;
i:= i+1;

END;

IF i<= 40
THEN
Begin
Vec[i]:= -1;
END;
END;


Como había aclarado entre los paréntesis, parece que no se entendió bien, la posición cambió porque lo que hice fue copiar y pegar la función BuscarNodo antes y el procedimiento que la llama quedó más abajo, por eso tira otra posición, pero sigue siendo en el mismo lugar en realidad. En esa función donde indiqué antes.

Dejo el código con todas las correcciones que me hicieron por las dudas

Spoiler: Mostrar

Type
str100 = string[100];
str50 = string[50];
str3 = string[3];
str15 = string[15];
Tvec = Array [1..40] of byte;
TRInfo = record
CodTema: string[3];
pos: byte;
End;
TPtr = ^TLista;
TLista = record
RInfo: TRInfo;
Sgte: TPtr;
End;
Tnodo =TLista;
TregEnlaces=Record
Esp: char;
Curso: word;
Grupo: byte;
Enlace: str100;
Descripcion: str50;
Responsable: str50;
CodigoTema: str3;
End;
Tarchinfo = file of TRinfo;
TarchEnlaces = file of TregEnlaces;
TarchTLista = file of TLista;

VAR
i: byte;
ArchEnlaces: TarchEnlaces;
Vec: TVec;
Ptr: TPtr;
Lista: Tnodo;
TemaSelec: str3;
ArchDesc: text;
CodTema: str3;
NombreTema: str50;
Info: TRInfo;
ArchUnif: TarchEnlaces;
ArchIn: TarchEnlaces;
Cant: integer;
P: byte;
NomFisArch: str15;
Puntero: TPtr;




PROCEDURE MostrarEnlacesTema (VAR ArchEnlaces: tArchEnlaces; VAR Vector: Tvec; i:integer; T:TRegEnlaces);

Begin
i:=0;
Assign (ArchEnlaces, 'EnlacesK1193.DAT');
Reset (ArchEnlaces);

WHILE (Vector[i] <> -1) AND (i<40) DO
Begin
i:= i+1;
Seek (ArchEnlaces, Vector [i]);
Read (ArchEnlaces, T);
Write (ArchEnlaces);
End;
End;

Function BuscarNodo (puntero: TPtr; info: TRInfo): TPtr;

Begin
While (puntero <> NIL) AND (info.CodTema <> puntero^.info.CodTema)DO
Begin
puntero := puntero^.Sgte;
End;
BuscarNodo := puntero;
End;

PROCEDURE ArmarVecPosics (VAR Vec:Tvec; VAR Ptr:TPtr; Lista:Tnodo; RTemaSelec:TRInfo;i:integer;BuscarNodo:TPtr);

Begin
i:=0;
Ptr:= Lista;

WHILE (Ptr <> Nil) DO
Begin
Ptr:= BuscarNodo(Ptr, RTemaSelec);
Vec[i]:= Ptr^.info.Tema;
i:= i+1;

END;

IF i<= 40
THEN
Begin
Vec[i]:= -1;
END;
END;



PROCEDURE MostrarDescTema (NroIngresado:byte; VAR PCodTema: CodTema; ArchDesc: Text);

Begin
Case NroIngresado of
1: NombreTema:= 'Responsabilidad Social';
PCodTema:= RS
Assign (ArchDesc,'RS.TXT');
End;
2: NombreTema:= 'Responsabilidad Social Universitaria';
Assign (ArchDesc,'RSU.TXT');
PCodTema:= RSU
End;
3: NombreTema:= 'Desarrollo Sustentable';
PCodTema:= DS
Assign (ArchDesc,'DS.TXT');
End;
4: NombreTema:= 'Formacion y Educacion Ambiental';
Assign (ArchDesc,'FEA.TXT');
PCodTema:= FEA
End;
5: NombreTema:= 'Tics y Cuidado Ambiental';
Assign (ArchDesc,'TIC.TXT');
PCodTema:= TIC
End;
6: SalirPrograma:= 'Porgrama finalizado";
End;
end;
Reset (ArchDesc);
Rewrite (ArchDesc,
'Tema: ', NombreTema,' Fecha: ',DateToStr
'Codigo de Tema: ', CodTema,' Hora: ', TimeToStr
'Definicion: ');

Close (ArchDesc);
End;

Procedure InsertarDelante (var Lista: TLista; Valor: TRInfo);
Var Ptr: TLista;
Begin
New (Ptr);
Ptr^.Info := Valor;
Ptr^.Sgte := Lista;
Lista := Ptr;
End;





PROCEDURE Estrategia1.1 (VAR Lista:TLista; VAR ArchUnif:TRegEnlaces; VAR Archln:TRegEnlaces; VAR Rinfo: TRinfo; VAR Cant: int);
Begin
Lista:= Nil;
write('Ingrese cantidad de Archivos a unificar:');
read(Cant);
P:=0;
i:=1;
For i to Cant do
begin
write('Ingrese nombre fisico del archivo:');
read(NomFisArch);
assign(Archin, NomFisArch);
reset(NomFisArch);
While not EOF(Archin) do
begin
read(Archin, TRenlaces);
write(ArchUnif, TRenlaces);
Rinfo.CodTema:=TRenlaces.CodigoTema;
Rinfo.pos:= P;
Procedure InsertarDelante (var Lista: TLista; Valor: TRInfo);
P:=P+1;
end;
end;
end;





PROCEDURE Estrategia2.2 (VAR Puntero:Tptr; Lista:Tnodo; Tema:str3; ArchDef: text, VAR Vec:Tvec; ArhcEnlaces: TArchEnlaces);
Begin
PROCEDURE MostrarDescTema (CodTema; ArchDesc);
IF NroIngresado = 6 THEN
Begin
Readkey;
End;
ELSE
Begin
PROCEDURE ArmarVecPosics (Vec; Puntero; Lista; Tema);
PROCEDURE MostrarEnlacesTema (ArchEnlaces; Vec);
End;
END;



PROGRAM TrabajoPractico2;

Begin

PROCEDURE Estrategia1.1 (Lista; ArchUnif; ArchIN; Rinfo);

PROCEDURE Estrategia2.2 (Puntero; Lista; Tema; ArchDesc; Vec; ArchEnlaces);

END;




Lo que sí me desorienta mucho son los errores de los identificadores de INFO y CODTEMA. Yo declaré el tipo de registro en el Type y no tengo idea de por qué me está tirando esos dos errores, como si nunca lo hubiera declarado. Tal vez estoy entendiendo mal
VAR Ptr:TPtr
.
.
.

Vec[i]:= Ptr^.info.Tema;


TPtr = ^TLista;

TLista = record
RInfo: TRInfo;
Sgte: TPtr;
End;

TRInfo = record
CodTema: string[3];
pos: byte;
End;
Hola! Disculpame pero no entiendo tu solución, podrías explicarme un poco más detalladadamente? Porque no sé en dónde iría ese código, gracias!
URLs de referencia