FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Pedro Sam 23 Nov 2024 - 15:50

» Un autre pense-bête...
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Je n'arrive pas à faire passer mon string par ma DLL Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Je n'arrive pas à faire passer mon string par ma DLL Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Je n'arrive pas à faire passer mon string par ma DLL Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Je n'arrive pas à faire passer mon string par ma DLL Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Je n'arrive pas à faire passer mon string par ma DLL Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Je n'arrive pas à faire passer mon string par ma DLL Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Je n'arrive pas à faire passer mon string par ma DLL Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Je n'arrive pas à faire passer mon string par ma DLL Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment :
SSD interne Crucial BX500 2,5″ SATA – 500 ...
Voir le deal
29.99 €

 

 Je n'arrive pas à faire passer mon string par ma DLL

Aller en bas 
4 participants
AuteurMessage
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyLun 16 Juil 2012 - 20:32

Salut tout le monde.

@Tous ceux qui peuvent me répondre : merci d’avance.

Je suis en train de coder une DLL en DELPHI 6, dont la fonction devrait retourner
une chaine de caractères calculée en fonction d’un nombre entier transmis par référence.
Le test de la DLL n’est pas satisfaisant et déclenche 2 erreurs.

Pour vous donner une idée précise du problème, voici une adaptation du source (en DELPHI)
de la DLL ; un programme-test en Panoramic et les 2 copies d’écran des erreurs.

Code DELPHI : ai-je commis une erreur dans ce code?
Code:

library MaDLL;

uses ShareMem,math;

{$R *.res}

{ ---------------------------------------------------------- }
function MaFonction(n: int64): string;
var s : string;
begin
  { Ici, les instructions qui vont construire la chaine de caractères
    en fonction du paramètre n du type int64.
    En effet, il s'agit d'un entier assez long (au moins 12 chiffres).
    Par exemple : le contenu de s est : }

    s := 'Ceci est un test de ce que pourrait être le contenu de la chaine';
    s := s + ' de caracteres que doit retourner au programme appellant ';
    s := s + '(en Panoramic), la fonction MaFonction. '  ;
    s := s + 'Cette chaine pourrait contenir plus de 255 caractères';
    MaFonction := s;
    result := s;

end;

{ ------------------------------------------------------------------ }
function TestMaFonction(var value: Extended; var Sortie : string): integer; stdcall;

begin
  sortie := MaFonction(Trunc(Value));
  result := 0;
end;

exports
    TestMaFonction;
end.


Code PANORAMIC
Code:


dim value,Sortie$, i%
width 0,1000
memo 1 :width 1, 980
dll_on "MaDLL.dll"
value = 1234567890987654321
sortie$ = string$(255," ")
i% = dll_call2("TestMaFonction", adr(Value), adr(Sortie$))
item_add 1,sortie$
dll_off


1ere erreur en exécutant le programme Panoramic





Je n'arrive pas à faire passer mon string par ma DLL 1157128693


2eme erreur après avoir appuyé sur OK et fermé PANORAMIC



Je n'arrive pas à faire passer mon string par ma DLL 1157129060



Merci pour votre attention

A+


j'ai édité le programme en PANORAMIC
La 2eme erreur a disparu


Dernière édition par papydall le Lun 16 Juil 2012 - 22:47, édité 1 fois
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: re   Je n'arrive pas à faire passer mon string par ma DLL EmptyLun 16 Juil 2012 - 21:39

As tu essayé de couper la ficelle.... Laughing heu....le string... Laughing
Oui bon , de diminuer le nbre de caracteres....


Edit : desolé , c'était trop tentant ....
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyLun 16 Juil 2012 - 21:51

J’ai modifié la DLL : la chaine de sortie ne contient que le mot ‘Bonjour’
La 1ere erreur est toujours présente mais il n’y a plus de 2eme erreur !
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: re   Je n'arrive pas à faire passer mon string par ma DLL EmptyLun 16 Juil 2012 - 22:09

Jean debord m'a écris dans un post de formater ma variable $ avant l'appelle de la dll

celà te donnerai


Sortie$=string$( Nbre de caracteres, " ")

il y a un espace entre les guillemets
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyLun 16 Juil 2012 - 22:52

j'ai édité le programme en PANORAMIC
La 2eme erreur a disparu mais la 1ere erreur se manifeste toujours
bien que la sortie semble correcte.
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyLun 16 Juil 2012 - 23:32

Pour passer une chaîne de caractères à une DLL en Delphi 6, je fais comme ceci:
Code:
function MaFonction(chaine: pchar): integer; stdcall; export;
var
  MaChaine: string;
begin
  MaChaine:= pchar(pstring(chaine)^);
...

Et en Panoramic, je l'appelle comme ceci:
Code:

dim s$, res%
s$ = "Ma chaîne de caractères pour ma DLL"
res% = dll_call1("MaFoncton",adr(s$))

Pour recevoir en Panoramic un résultat sous forme de chaîne de caractères, je fais comme ceci:
Code:
function MaFonctionBis(s: integer): integer; stdcall; export;
var
  txt: string;
begin
  txt := 'Mon résultat en chaîne de caractères à retourner à Panoramic';
  CopyTextToPanoramic(integer(@txt), 0, s);
  result := 0;
end;

avec la mention du module suivant dans les clauses USES:
Code:
  TextToPanoramic in 'TextToPanoramic.pas';

et ce moduleTextToPanoramic.pas a le source suivant:
Code:
unit TextToPanoramic;
{
Cette unité contient la procédure
    CopyTextToPanoramic(source,offset,destination);
source et destination sont des pointeurs sur des strings Panoramic ou des PChar
en Delphi. offset est le décalage à partir duquel on écrit dans la destination
( 0 signifie depuis le début). La copie s'arrêtre automatiquement dès que la fin
d'un des strings est rencontré.
}

interface
procedure CopyTextToPanoramic(inp, offs, out:integer); stdcall;

implementation

procedure CopyTextToPanoramic(inp, offs, out:integer); stdcall;
var
    xout,yinp: pchar;
    n: integer;
begin
    xout := pchar(pstring(out)^);
    yinp := pchar(pstring(inp)^);
    if offs>0 then begin
        for n:=1 to offs do begin
            inc(xout);
            if (xout^ = #0) then exit  { sortir si l'offset va à la fin}
        end
    end;
    while (xout^ <> #0) and (yinp^ <> #0) do begin
        xout^ := yinp^;
        inc(xout);
        inc(yinp);
    end;
end;


end.

En en Panoramic, je l'appelle comme ceci:
Code:

dim s$,res%
s$ = string$(255," ")
res% = dll_call1("MaFonctionBis",adr(s$)
message "Le résultat est: "+s$
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyLun 16 Juil 2012 - 23:47

Salut klaus

Merci pour ton intervention.
je vais étudier ta proposition et je te tiens au courant.

lol!
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyMar 17 Juil 2012 - 5:57

@Klaus.

Si ce n’est pas trop te demander, je te remercie d’avance
de bien vouloir consacrer un peu de ton temps pour
corriger ce que je n’arrive pas à le faire.
Voici le source de ma DLL
Code:

library Chiffres2Lettres;

 { cette DLL transforme un nombre en chiffres en un nombre en lettres
  de 0 à 99 999 999 999 999 999,99
  c-a-d de zero à
  quatre-vingt dix-neuf billiards
  neuf cent quatre-vingt dix-neuf billions
  neuf cent quatre-vingt dix-neuf milliards
  neuf cent quatre-vingt dix-neuf millions
  neuf cent quatre-vingt dix-neuf mille
  neuf cent quatre-vingt dix-neuf
  virgule quatre-vingt dix-neuf }

uses  Math; //necessaire pour les fonctions mathématiques log10, power etc..
{ =============================================================================}
function NombreEnLettres(nombre: int64): string; export;
var d, n2 : int64;
    s : string[1];
const
  Chiffres : array[0..19] of string =
    ('' , 'un' , 'deux' , 'trois' , 'quatre' , 'cinq' , 'six' , 'sept' ,
    'huit' , 'neuf' , 'dix' , 'onze' , 'douze' , 'treize' ,
    'quatorze' , 'quinze' , 'seize' ,'dix-sept' , 'dix-huit' , 'dix-neuf');
  Dizaines : array[2..9] of string =
    ('vingt' , 'trente' , 'quarante' , 'cinquante' , 'soixante' , '' ,
    'quatre-vingt' , '');
  PuissancesMille : array[1..6] of string =
    ('mille', 'million', 'milliard', 'billion', 'billiard', 'trillion'); // etc...
begin
  CASE nombre of
    0..19:  result := Chiffres[nombre];  // fin
    20..69,80..89:
      if ((nombre mod 10 = 1) and (nombre <> 81)) then
      result := Dizaines[nombre div 10] + ' et ' + NombreEnLettres(nombre mod 10)
      else  //  on dit trente et un mais quatre-vingt un !
      result := Dizaines[nombre div 10] + ' ' + NombreEnLettres(nombre mod 10);
    70..79,90..99:
      if (nombre = 71) then  //  71 = 'soixante' et onze !
      result := Dizaines[nombre div 10 -1] + ' et ' + NombreEnLettres(nombre mod 10 +10)
      else
      result := Dizaines[nombre div 10 -1] + ' ' + NombreEnLettres(nombre mod 10 +10);
    100..999:
        if (nombre div 100 =1) then  // on ne dit pas un cent !
          result := 'cent' + ' '+ NombreEnLettres(nombre mod 100)
        else
        begin
          if (nombre mod 100)=0 then s := 's' else s := '';
        result := Chiffres[nombre div 100]+' '+'cent' + s + ' '+ NombreEnLettres(nombre mod 100);
        end;
    else
    begin
    { ex: 10^6 = 1M <=> exp (6 x ln(10) = 1M <=> 6 x ln(10) = ln (1M)
      <=> 6 = ln(1M) / ln(10) = Log10 (1M) }
      d := trunc(log10(nombre)) div 3;  // arrondir puiss. 10
      n2 := trunc(power(10 , d * 3)); // vers groupe puissances de 1000 +proche
      if (trunc(log10(nombre))=3) and (trunc(nombre/1000)=1) then  // on ne dit pas un mille  !
        result := PuissancesMille[d] + ' ' + NombreEnLettres(nombre mod n2)
      else
      begin
        if d=1 then s := '' else s := 's';  // s au pluriel sauf mille !
        result := NombreEnLettres(nombre div n2) + ' ' + PuissancesMille[d]
          + s + ' ' + NombreEnLettres(nombre mod n2);
      end;
    end;
  END; { case }
  if result = '' then result := 'zero';
end;
{ =============================================================================}
function NbEnLettres(var montant: Extended; var somme : string): integer; stdcall; export;
begin
  somme := NombreEnLettres(Trunc(montant));
  somme := somme + ' virgule ' + NombreEnLettres(round(100 * frac(montant)));
  result := 0;
end;
{ =============================================================================}
  exports NombreEnLettres, NbEnLettres;
end.
 
La compilation de la DLL est correcte.
Et voici le programme Panoramic qui fait l’appel

Code:

dim montant,Somme$, i%
width 0, 1000
dll_on "Chiffres2Lettres.dll"
montant = 123456789.12
' somme$ = string$(255," ")
i% = dll_call2("NbEnLettres", adr(montant), adr(Somme$))
print Somme$
dll_off
Le resultat est décevant.
J’ai beau essayer comme tu l’as indiqué mais en vain !

Je n’ai pas bien saisis le transfert d’une chaine de caractères entre la DLL et l’appelant.


Sans vouloir te jeter des fleurs, je te remercie vivement de ta disponibilité
à apporter ton aide à tous et je te félicite pour ton immense savoir.
Bien que, toi et moi, nous ayons à peu près le même âge, je suis ravi d’être ton élève !


flower sunny flower
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
jean_debord

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyMar 17 Juil 2012 - 8:44

Dans la fonction :
Code:

function NombreEnLettres(nombre: int64): string; export;
Il manque le stdcall, et je pense qu'on ne peut pas passer des entiers de 64 bits en Panoramic, seulement des entiers de 32 bits ?

Et dans la fonction :
Code:

function NbEnLettres(var montant: Extended; var somme : string): integer; stdcall; export;
je pense qu'on ne peut pas passer le type Extended non plus, seulement le type Double ?

Par ailleurs , les fonctions ne peuvent retourner que des entiers, et les chaînes de caractères doivent être passées sous forme de pointeurs sur des chaînes à zéro termical, soit ZSTRING PTR en FreeBasic et PCHAR en Delphi.
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

Klaus


Nombre de messages : 12331
Age : 75
Localisation : Ile de France
Date d'inscription : 29/12/2009

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyMar 17 Juil 2012 - 10:06

J'ai fait une version de démonstration de ta DLL pour renvoyer une chaine de caractères, tout en prenant un entier en entrée:
Code:

library Chiffres2Lettres;

 { cette DLL transforme un nombre en chiffres en un nombre en lettres
  de 0 à 99 999 999 999 999 999,99
  c-a-d de zero à
  quatre-vingt dix-neuf billiards
  neuf cent quatre-vingt dix-neuf billions
  neuf cent quatre-vingt dix-neuf milliards
  neuf cent quatre-vingt dix-neuf millions
  neuf cent quatre-vingt dix-neuf mille
  neuf cent quatre-vingt dix-neuf
  virgule quatre-vingt dix-neuf }

uses
  Math, SysUtils,
  TextToPanoramic in 'TextToPanoramic.pas';

//necessaire pour les fonctions mathématiques log10, power etc..
{ =============================================================================}
function NombreEnLettres(nombre, txt: integer): integer, stdcall; export;
var
    sresult: string;

begin
  if nombre>0 then sresult := IntToStr(nombre);
  if sresult = '' then sresult := 'zero';
  CopyTextToPanoramic(integer(@sresult), 0, txt);
  retulr := 0;
end;
{ =============================================================================}
  exports NombreEnLettres;
end.
 
Cela retourne le nombre en chaîne de caractères (certes numériques), ou le mot "zéro". Ceci pour montrer comment on retourne des strings vers Panoramic.

Jean-Debord a parfaitement relevé les anomalies dans ta DLL.

Pour les entiers:
Panoramic ne connait que les variables déclarées par "dim x%". En Delphi, in faut les déclarer "integer", pas autre chose.

Pour les flottants:
Tu ne peux les passer que par adresse, de la manière suivante:
Code:

dim valeur, res%
valeur = 4*atn(1) : ' pi
res% = dll_call1("MaFonction",adr(valeur))
et en Delphi, il faut que tu récupères cela en utilisant le param_tre (déclaré en integer) comme un pointeur.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL EmptyMar 17 Juil 2012 - 12:10

@jean_debord et Klaus

Vous êtes très gentils, merci pour vos interventions.
Le stdcall je le connais, il a du être perdu lors de la mise au point du programme !

Pour les autres remarques, j’en tiendrais compte.
Je vais revoir ma copie pour faire aboutir ma DLL.
J’y arriverais certainement et c’est grâce à vous.

A+

Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Contenu sponsorisé





Je n'arrive pas à faire passer mon string par ma DLL Empty
MessageSujet: Re: Je n'arrive pas à faire passer mon string par ma DLL   Je n'arrive pas à faire passer mon string par ma DLL Empty

Revenir en haut Aller en bas
 
Je n'arrive pas à faire passer mon string par ma DLL
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
»  Faire passer toutes les balles rouges dans la partie droite
» width() left() height() top() + string$
» string$(0,chr$(32)) sans erreur
» Demande de nouvelle fonction sur les chaînes de caractères.
» Création d'une variable string à partir d'une DLL

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: