Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11690[/thread]

Perl in C++?

Leser: 44


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
pktm
 2008-04-22 21:36
#108750 #108750
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hi!

Man kann doch bestimmt auch in einem C++-Quellcode "mal eben" einen Teil Perl einbetten. Wie denn? :)

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
lichtkind
 2008-04-22 22:07
#108753 #108753
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
na für C gibts CPAN:Inline aber c++ brr
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
pktm
 2008-04-22 22:10
#108755 #108755
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hm, ich will in C++ schreiben, und da Perl einbetten, nicht anders herum.
http://www.intergastro-service.de (mein erstes CMS :) )
murphy
 2008-04-22 23:02
#108758 #108758
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
perlembed beschreibt, wie man das macht.
When C++ is your hammer, every problem looks like your thumb.
warp
 2009-03-25 17:56
#119830 #119830
User since
2009-03-25
5 Artikel
BenutzerIn
[default_avatar]
Ich greife diesen alten Thread mal auf, da es hier genau um mein Problem geht.

Ich versuche auch, Perl aus C++ heraus aufzurufen und habe in Visual C++ 2008 Express Edition ein Minimal-Programm geschrieben, was die perl510.dll (von ActivePerl) lädt und dort Funktionen aufruft.

Hier der Code:
Code (cpp): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include "perl.h"

static PerlInterpreter *my_perl;

int _tmain(int argc, _TCHAR* argv[])
{
    char *args[] = { "", "-e", "0" };

    my_perl = perl_alloc();
    perl_construct( my_perl );
    perl_parse( my_perl, NULL, 3, args, (char **)NULL );
    perl_run( my_perl );
    perl_destruct( my_perl );
    perl_free( my_perl );

    return 0;
}


Leider gibt's folgende Exception beim Aufruf von perl_parse():
Unbehandelte Ausnahme bei 0x7c92b1fa in Perl-Test.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000010.

Was mache ich denn falsch?
Last edited: 2009-03-25 21:47:37 +0100 (CET)
renee
 2009-03-25 18:06
#119831 #119831
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dir fehlt auf jeden Fall mal ein
Code: (dl )
#include <EXTERN.h> 
und noch mehr.

Am besten schaust Du Dir mal http://perldoc.perl.org/perlembed.html an.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2009-03-25 18:13
#119833 #119833
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
cool, endlich wird unser forum auch von den suchmaschinen gefunden.

c-code kann übrigens auch in c-code-tags eingebettet werden:
[code=c]...[/code] [code=cpp]...[/code]

zum thema selbst kann ich leider nicht helfen...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
warp
 2009-03-26 18:50
#119864 #119864
User since
2009-03-25
5 Artikel
BenutzerIn
[default_avatar]
Danke schon mal für eure Antworten. Ja, ich habe das Forum über Google gefunden. :-)

Am fehlenden Include konnte es ja nicht liegen, denn es ließ sich ja auch ohne kompilieren.
Trotzdem hab ich's getestet und keine Verbesserung feststellen können.

Stattdessen hat das Einfügen des Aufrufs von PERL_SYS_INIT() gefruchtet. Jetzt läuft das Programm, also es macht ein Konsolenfenster auf, in das ich perl-Befehle tippen kann und sie am Ende mit Strg+D, Enter ausführen lassen kann.

Das Programm sieht also jetzt so aus:
Code (cpp): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include "perl.h"

static PerlInterpreter *my_perl;

int _tmain(int argc, _TCHAR* argv[])
{
    PERL_SYS_INIT(&argc, (char***) &argv);
    my_perl = perl_alloc();
    perl_construct( my_perl );
    perl_parse( my_perl, NULL, argc, (char**) argv, (char **)NULL );
    perl_run( my_perl );
    perl_destruct( my_perl );
    perl_free( my_perl );
    PERL_SYS_TERM();

    return 0;
}


Bloß habe ich noch nicht erkannt, was PERL_SYS_INIT() tut. Laut meiner IDE steckt hinter diesem Makro die Funktion Perl_sys_init(), die so aussieht:
Code (cpp): (dl )
1
2
3
PERL_CALLCONV void      Perl_sys_init(int* argc, char*** argv)
        __attribute__nonnull__(1)
        __attribute__nonnull__(2);

und __attribute__nonnull__() wiederum ist einfach leer definiert. Also kann ich da irgendwie keine Funktion erkennen.
Dennoch: ohne gibt's ne Exception, mit geht's. :-)
esskar
 2009-03-26 19:26
#119866 #119866
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich kenns so, aus perl.c

Code (c): (dl )
1
2
3
4
5
6
void Perl_sys_init(int* argc, char*** argv)
{
    PERL_UNUSED_ARG(argc); /* may not be used depending on _BODY macro */
    PERL_UNUSED_ARG(argv);
    PERL_SYS_INIT_BODY(argc, argv);
}
betterworld
 2009-03-26 20:10
#119867 #119867
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
2009-03-26T17:50:11 warp
Bloß habe ich noch nicht erkannt, was PERL_SYS_INIT() tut. Laut meiner IDE steckt hinter diesem Makro die Funktion Perl_sys_init(), die so aussieht:
Code (cpp): (dl )
1
2
3
PERL_CALLCONV void      Perl_sys_init(int* argc, char*** argv)
        __attribute__nonnull__(1)
        __attribute__nonnull__(2);


Naja, es ist halt ein Prototyp, gell. So ist das halt normalerweise, wenn man Header von C-Bibliotheken einbindet: Da sind nur die Prototypen drin, und die Implementation ist dann im Quelltext der Bibliothek, der aber normalerweise nicht installiert ist bzw. an einem definierten Pfad vorliegt. Eine IDE kann zwar schlaue mysteriöse Sachen machen, aber auch nur im Bereich des Möglichen ;)
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2008-04-22 21:36.