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

Discussion dans 'Web, design' créé par k o D, 17 Mai 2004.

Statut de la discussion:
Fermée.
  1. Offline
    k o D Belge !
    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:

    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:
    k o D, 17 Mai 2004
    #1
  2. Offline
    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
    D R C, 17 Mai 2004
    #2
  3. Offline
    k o D Belge !
    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:

    k o D, 17 Mai 2004
    #3
  4. Offline
    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 ....
    RBC9, 17 Mai 2004
    #4
  5. Offline
    k o D Belge !
    Pas très bien compris là... :roll:
    k o D, 17 Mai 2004
    #5
  6. Offline
    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.
    moustic, 17 Mai 2004
    #6
  7. Offline
    AcidBird Touriste
    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é".
    AcidBird, 18 Mai 2004
    #7
  8. Offline
    D R C ex membre
    je pensais aussi a "function mic (var z:array of integer) :array of integer;"
    D R C, 18 Mai 2004
    #8
  9. Offline
    k o D Belge !
    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 :)
    k o D, 18 Mai 2004
    #9
  10. Offline
    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:
    moustic, 18 Mai 2004
    #10
  11. Offline
    RBC9 Elite
    au risque de me repeter ....
    RBC9, 18 Mai 2004
    #11
  12. Offline
    k o D Belge !
    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 :)
    k o D, 19 Mai 2004
    #12
  13. Offline
    AcidBird Touriste
    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.
    AcidBird, 19 Mai 2004
    #13
  14. Offline
    dagibbon Elite
    arf, c'est simple, crée ton type:
    puis apres; dans ta UNIT:
    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 :p 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
    dagibbon, 19 Mai 2004
    #14
  15. Offline
    RBC9 Elite
    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é)
    RBC9, 19 Mai 2004
    #15
  16. Offline
    MoTh Elite
    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).
    MoTh, 19 Mai 2004
    #16
  17. Offline
    k o D Belge !
    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 :p :D
    k o D, 19 Mai 2004
    #17
  18. Offline
    moustic Touriste
    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).
    moustic, 19 Mai 2004
    #18
  19. Offline
    MoTh Elite
    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:
    MoTh, 19 Mai 2004
    #19
  20. Offline
    k o D Belge !
    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
    k o D, 24 Mai 2004
    #20
Statut de la discussion:
Fermée.