[AIDE]fonction qui entre un tableau et en resort 1...

Statut
N'est pas ouverte pour d'autres réponses.

k o D

Elite
Bon j'explique plus en détail.

En Pascal (Dev pascal), je suis en train de faire un combat naval.

Evidemment pour placer les bateaux par exemple, celà me prend déjà 100 lignes de code.

Pour alléger mon programme principal donc, j'avais déjà créé une unité.

Dans cette unité, je voudrais mettre une fonction qui demande une introduction d'une variable tableau (array) et qui resort un tableau...

Or voilà, impossible...

J'ai mis un code d'exemple:

:arrow: Mon fichier principal:

Code:
program test5;
uses crt,test;                      {test est le nom de l'unité}
var a:array[1..2] of integer;
begin
a[1]:=1;
a[2]:=2;
mic(a);                               {mic est la fonction}
writeln(a[1],' - ',a[2];
end.
:arrow: Mon unité:

Code:
unit test;
interface
function mic (z:array[1..2]of integer) :array[1..2] of integer;
implementation
function mic (z:array[1..2]of integer) :array[1..2] of integer;
         begin
         z[1]:=10;
         z[2]:=20;
         mic:=z;
         end.
begin
end.
Et voilà le résultat en compilant:

Compiling c:\windows\bureau\prog\test5.pas
Compiling test.pas
test.pas(3,22) Fatal: Syntax error, OF expected but [ found
Et il se trouve que la ligne visée est la déclaration de la fonction dans mon unité.

Celle-ci:
Code:
function mic (z:array[1..2]of integer) :array[1..2] of integer;
Voilà... alors si qq1 avait la solution, çà serait bien sympathique :cool:
 
D

D R C

ex membre
il faut pas préciser la taille de ton tableau....tu dois juste mettre "array of integer"

edit: çà compte aussi pour la déclaration du param que la fonction retourne
 
1er
OP
k o D

k o D

Elite
D R C a dit:
il faut pas préciser la taille de ton tableau....tu dois juste mettre "array of integer"

edit: çà compte aussi pour la déclaration du param que la fonction retourne
Et bien non... j'ai essayé.

Voici mon unité:

Code:
unit test; 
interface 
function mic (z:array of integer) :array[1..2] of integer;
implementation 
function mic (z:array of integer) :array[1..2] of integer;
         begin 
         z[1]:=10; 
         z[2]:=20; 
         mic:=z; 
         end. 
begin 
end.
Ps: j'ai essayé aussi ceci:

Code:
unit test; 
interface 
function mic (z:array of integer) :array of integer;
implementation 
function mic (z:array of integer) :array of integer;
         begin 
         z[1]:=10; 
         z[2]:=20; 
         mic:=z; 
         end. 
begin 
end.
Et j'ai cette erreur:

test.pas(3,36) Fatal: Syntax error, identifier expected but ARRAY found
 

RBC9

Elite
me rappelle pus en pascal ...

mais en général on passe l'adresse du tableau et on travaille dessus ... simple et rapide ....
 
1er
OP
k o D

k o D

Elite
RBC9 a dit:
me rappelle pus en pascal ...

mais en général on passe l'adresse du tableau et on travaille dessus ... simple et rapide ....
Pas très bien compris là... :roll:
 

moustic

Touriste
et tu as essayé avec un type

Code:
// déclaration
type montableau = array[1..2] of integer;

var z:vecteur;



function mic (z:vecteur) :vecteur;
sinon ben tu peux travailler avec un tableau déclaré accessible dans tout le code (public en VB).

désolé le Delphi/pascal c'est un peu loin pour moi, j'connais plus trop la synthaxe.
 

AcidBird

Elite
je peux me gourer mais à première vue je dirais que le problème vient du fait que ta fonction renvois un tableau, elle ne travaille pas sur le paramètre que tu passes ...

Hors tu appelles ta fonction comme suis :

Mic(a) --> aucun tableau pour récupérer le résultats ...

Essaie peut-être a := mic(a);

Ou alors, change la déclaration de ta fonction pour passer le paramétre par adresse et pas par valeur (comme le conseil RBC), ca devrait donner un truc du genre :

procedure mic(var a:array ...)
begin
...
A[1] := 10
a[2] := 20
...
end;

Autre détails aussi, Z est une variable locale --> détruite une fois la fonction finies ... hors, mic :=Z ne fait pas de copie de ton tableau mais assigne l'adresse de Z à mic qui pointe donc vers cette variable locale. En retour, tu n'auras pas de résultat puisque ce qu'il y avait à l'adresse de Z à été "nettoyé".
 
D

D R C

ex membre
AcidBird a dit:
Ou alors, change la déclaration de ta fonction pour passer le paramétre par adresse et pas par valeur (comme le conseil RBC), ca devrait donner un truc du genre :

procedure mic(var a:array ...)
begin
...
A[1] := 10
a[2] := 20
...
end;
je pensais aussi a "function mic (var z:array of integer) :array of integer;"
 
1er
OP
k o D

k o D

Elite
moustic a dit:
et tu as essayé avec un type

Code:
// déclaration
type montableau = array[1..2] of integer;

var z:vecteur;



function mic (z:vecteur) :vecteur;
sinon ben tu peux travailler avec un tableau déclaré accessible dans tout le code (public en VB).

désolé le Delphi/pascal c'est un peu loin pour moi, j'connais plus trop la synthaxe.
D'après mon prof, je devrais faire avec les pointeurs, donc bien définir un nouveau type.

Je vais essayer celà et je dis quoi :)
 

moustic

Touriste
arf les pointeurs en pascal, j'ai jamais fait, 'fin si tu trouve une soluce, merci de la poster pour faire profiter les autres (et moi aussi :oops: ) :wink:
 

RBC9

Elite
k 0 DiaK a dit:
D'après mon prof, je devrais faire avec les pointeurs, donc bien définir un nouveau type.

Je vais essayer celà et je dis quoi :)
RBC9 a dit:
me rappelle pus en pascal ...

mais en général on passe l'adresse du tableau et on travaille dessus ... simple et rapide ....
au risque de me repeter ....
 
1er
OP
k o D

k o D

Elite
RBC9 a dit:
k 0 DiaK a dit:
D'après mon prof, je devrais faire avec les pointeurs, donc bien définir un nouveau type.

Je vais essayer celà et je dis quoi :)
RBC9 a dit:
me rappelle pus en pascal ...

mais en général on passe l'adresse du tableau et on travaille dessus ... simple et rapide ....
au risque de me repeter ....
Désolé je n'avais pas compris celà. Je sais pas si tu aais vu mon message plus haut, mais j'ai mis que je n'avais pas compris ce que tu avais dit :wink:

Je poste dès que j'ai la solution :)
 

AcidBird

Elite
Bon en gros : lors de l'appel d'une fonction, il y a 2 façon de passer les paramètres à cette fonction : par valeur ou par adresse.

Lors d'un passage par valeur, La variable est copiée à un autre elmplacement mémoire, tu peux donc en faire ce que tu veux dans le corps de ta fonction sans modifier la valeur du paramètre passé : voila un petit exemple

function returnInt(x : Integer) : integer
begin
X := X + 10;
Result := X;
end;

Function test
var
a,b : Integer;
begin
A := 5;
B := ReturnInt(a)
end;

Dans ce cas, à la fin du programme, a vaudra 5 et b 15.

Lors d'un passage par adresse, c'est l'adresse mémoire de la variable qui est passée, de ce fait, lorsque tu modifies ce paramètres, les chagements influences la valeur du paramètre utilisé voila un petit exemple

Function ModInt(var x: integer) : integer
begin
X := X + 10;
Result := X;
end;

Function test
var
a,b : Integer;
begin
A := 5;
B := ReturnInt(a)
end;

Dans ce cas, à la fin du programme, A vaudra 15 et b vaudra également 15.
 

dagibbon

Elite
arf, c'est simple, crée ton type:
type mon_tableau_d_entiers
tab: array [1..2] of integer;
end;
puis apres; dans ta UNIT:
unit test;
interface
function mic (z:array of integer) :mon_tableau_d_entiers;
implementation
function mic (z:array of integer) :mon_tableau_d_entiers;
begin
z[1]:=10;
z[2]:=20;
mic.tab:=z;
end.
begin
end.
et hop, le tour est joué..mais tu passes par un record...

J'ai deja eu besoin de passer par la quand une fonction doit renvoyer plusieurs valeurs sans pouvoir modifier de variable globale.

EDIT: arf, j'avais pas lu ^^ sinon, les pointeurs, evidemment c'est plus beau, plus fin... :wink: Fais une liste chainée avec double baladeur, et tu renvoies les adresses des pointeurs
 

RBC9

Elite
k 0 DiaK a dit:
RBC9 a dit:
k 0 DiaK a dit:
D'après mon prof, je devrais faire avec les pointeurs, donc bien définir un nouveau type.

Je vais essayer celà et je dis quoi :)
RBC9 a dit:
me rappelle pus en pascal ...

mais en général on passe l'adresse du tableau et on travaille dessus ... simple et rapide ....
au risque de me repeter ....
Désolé je n'avais pas compris celà. Je sais pas si tu aais vu mon message plus haut, mais j'ai mis que je n'avais pas compris ce que tu avais dit :wink:

Je poste dès que j'ai la solution :)
oki ... Acid vient de l'expliquer ..( c'est parfait car j'aurais ete incapable de te donner un ex en pascal :) )
(D'ailleurs je savais pas qu on faisait encore du pascal , ceci sans critique ni mechanceté)
 

MoTh

PaW
D'après moi le pascal est encore donné car c'est un language très proche du language usuel.

De ce fait les cours de base en informatique sont donné en pascal pour l'apprentissage de la structure de programmation.

J'ai suivis ca aussi a une époque. Mais j'aurais été incapable de pondre une ligne de code. Et puis RBC avait déjà bien expliqué la base d'utilisation d'un tableau au travers d'une fonction.
Donc en passant sa référence (adresse ou pointeur).
 
1er
OP
k o D

k o D

Elite
MoTh a dit:
D'après moi le pascal est encore donné car c'est un language très proche du language usuel.

De ce fait les cours de base en informatique sont donné en pascal pour l'apprentissage de la structure de programmation.

J'ai suivis ca aussi a une époque. Mais j'aurais été incapable de pondre une ligne de code. Et puis RBC avait déjà bien expliqué la base d'utilisation d'un tableau au travers d'une fonction.
Donc en passant sa référence (adresse ou pointeur).
Alors si on donne encore du pascal RBC, enfin je ne suis qu'en 5ème humanité aussi hein :wink:

Pour le truc il faudra que ej reteste plus tard car j'ai réussi à pulvériser mon record d'erreur de compilation : 32 ^^ :D
 

moustic

Touriste
k 0 DiaK a dit:
Pour le truc il faudra que ej reteste plus tard car j'ai réussi à pulvériser mon record d'erreur de compilation : 32 ^^ :D
lol 32 c'est rien, c'est quand on fait de la POO (prog. orienté objet) en C++ qu'on récolte un tas d'erreurs de compilation imcompréhensibles (souvenir , souvenir) :D

Sinon la soluce de créer un type est bonne, c'est vrai qu'a chaque fois(dans d'autres langages (c,vb,java)) quand je veux retourner plusieurs valeurs d'une fonction ben je passe par une structure.

L'autre soluce, les pointeurs, j'suis daccord mais faut bien programmer proprement (désalouer correctement, chose que l'on oublie souvant).
 

MoTh

PaW
Eh bien dans le cas d'un tableau étant donné que la référence premiere de celui ci est un pointeur je vois pas trop le problème d'utiliser des pointeurs ou pas :wink:
 
1er
OP
k o D

k o D

Elite
Bon voilà, j'ai (enfin!) su essayer.

Et çà ne fonctionne toujours pas :!:

Voici ce que j'ai (un ptit test)

:arrow: Le programme:

Code:
program test5; 
uses crt,test;                     {test est le nom de l'unité}
type tableau: array [1..2] of integer;
var a:tableau;
begin 
a[1]:=1; 
a[2]:=2; 
mic(a);                               {mic est la fonction} 
writeln(a[1],' - ',a[2]);
end.
:arrow: Mon unité:
Code:
unit test; 
interface 
function mic (z:tableau) :tableau;
implementation 
function mic (z:tableau) :tableau;
         begin 
         z[1]:=10; 
         z[2]:=20; 
         mic:=z; 
         end. 
begin 
end.
:arrow: L'erreur de compilation:

Code:
Compiling c:\windows\bureau\prog\test5.pas
Compiling test.pas
test.pas(3,36) Fatal: Syntax error, identifier expected but ARRAY found
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut