Procedure Pascal ?

Fermé
gotomtom Messages postés 55 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 novembre 2012 - Modifié par gotomtom le 13/12/2010 à 23:09
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 14 déc. 2010 à 11:53
Bonjour,

Tout se compile, mais le programme ne fait pas ce que je veux.

Voici l'unité insertion //

Unit Uinsertion;
INTERFACE
Procedure insertion (a:INTEGER;b:INTEGER);

IMPLEMENTATION

Procedure insertion (a:INTEGER; b:INTEGER);


BEGIN
WRITELN ('taper 2 chiffres');
READLN (a,b);
END;
END.//

1e remarque, je suis obligé de mettre les END comme ça. Si je rajoute un BEGIN, Geany gronde !

Voici le programme //

Program S1E1;
uses Uinsertion, Uechange;

VAR
d:INTEGER;
e:INTEGER;

BEGIN
insertion (d, e);
WRITELN ('A=',' ',d,' ','B=',' ',e);
echange (d, e);
WRITELN ('A=',' ',d,' ','B=',' ',e);
READLN;
END.//
Mon problème est que le programme ne lit pas les variables d et e insérées. Donc les chiffres restent à 0 (A=0 et B=0). Si j'hôte les READLN de l'unité et que je l'ajoute à la main dans le programme, ça fonctionne parfaitement, y compris l'échange de variables.
L'erreur m'étonne d'autant plus, que l'unité Uechange fonctionne correctement, c'est vraiment l'unité Uinsertion qui pose problème. Pourtant, j'ai l'impression d'avoir fait la même chose au niveau des variables.
Où est mon erreur ?
Merci
A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
13 déc. 2010 à 23:49
Même erreur que ce midi, tu as oublié les VAR !

Remarque :
Il n'est pas normal que Geany ne supporte pas les begin avant les end (moi je n'ai pas eu de problème avec Dev-Pascal)
De plus, tu n'es pas obligé de faire une unité par procédure, tu peux (et c'est conseillé) mettre des méthodes associées dans une même unité. D'ailleurs tu peux mettre tes méthodes directement dans le corps du programme sans avoir à créer d'unités...
1
gotomtom Messages postés 55 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 novembre 2012 95
Modifié par gotomtom le 14/12/2010 à 01:01
Il signifie quoi le VAR ?

Je crois que VAR = paramètre en entrée/sortie.

A midi, je suis d'accord. a=5 et b=6 à l'entrée au clavier (exemple). a=6 et b=5 à la sortie, donc là je comprend paramètre en entrée/sortie. La valeur diffère durant la procédure.

Mais pour l'insertion, je ne comprends pas. a=5 à l'entrée au clavier et a=5 à la sortie de la procédure. La valeur ne diffère pas. Je ne comprends pas pourquoi il s'agit d'un paramètre en entrée/sortie.

Si nous devons mettre les procédures dans des unités, je pense que c'est pour nous familiariser avec la programmation orientée objet.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 déc. 2010 à 11:42
Je n'irai pas jusqu'à dire que c'est pour faire de la POO, mais pour l'encapsulation ça peut être une bonne idée. Cependant une procédure par unité c'est quand même abusif ! Mais bon, si c'est scolaire...

Concernant le mot clé VAR, lorsqu'il est utilisé dans les paramètres d'une fonction/procédure, il s'agit de passer le paramètre par variable, alors que sans le VAR il est passé par valeur :

exemple :
procedure p1(a:integer); // a est passé par valeur   
begin   
     a:=5;   
end;   

procedure p2(var b:integer); // b est passé par variable   
begin   
     b:=3;   
end;   

var x,y:integer   
BEGIN   
      x:=1; y:=1;   
      p1(x); // la valeur de x (c'est à dire 1) est passé à p1   
      p2(y); // la variable y est passé à p2   
      writeln(x,' ',y); // 1 3   
END.

Ce qui se passe, c'est que ce n'est pas la variable x qui est passé à p1, mais sa valeur : 1, en conséquence même si on modifie a, en aucun cas x ne sera modifié. Par contre y est passé par variable à p2, donc modifier b c'est modifier y.

Dans ton cas : de même qu'il fallait mettre var pour la procédure échange car les valeurs de a et b étaient modifiées, dans ton problème d'insertion, il faut donc mettre les var pour récupérer les modifications de a et b opérées au moment du readln.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 déc. 2010 à 11:53
Pour compléter mon exemple, en gros ce que le programme fait c'est :

x:=1; y:=1;

// p1(x);
a:=x;
a:=5; // on modifie a, mais pas x

// p2(y);
b<=>y
b:=3; <=> y:=3; // on modifie y en modifiant b

writeln(x,' ',y); // x=1, y=3
0