4

http://support.zeus.com/zws/examples/2005/12/16/hello_world_in_perl_and_cが見つかり、この2つの例が機能しています。

今、私はエイダのためにこれを試しました、そして、私は2日以来それを成し遂げることができません。

fcgi_stdio.ads

with Interfaces.C;
with Interfaces.C.Strings;

package fcgi_stdio is
    function FCGI_Accept return Interfaces.C.int;
    pragma Import (C, FCGI_Accept, "FCGI_Accept");

    procedure FCGI_printf (str : Interfaces.C.Strings.chars_ptr);
    pragma Import (C, FCGI_printf, "FCGI_printf");
end fcgi_stdio;

test.adb

with fcgi_stdio;
with Interfaces.C;
with Interfaces.C.Strings;

procedure Test is
begin
    while Integer (fcgi_stdio.FCGI_Accept) >= 0 loop
        fcgi_stdio.FCGI_printf (Interfaces.C.Strings.New_String ("Content-Type: text/plain" & ASCII.LF & ASCII.LF));
        fcgi_stdio.FCGI_printf (Interfaces.C.Strings.New_String ("Hello World from Ada!" & ASCII.LF));
    end loop;
end Test;

コンソールで実行すると、次のエラーが発生します。

$ ./test
raised STORAGE_ERROR : stack overflow or erroneous memory access

Apache error_logは次のことを示しています:

Premature end of script headers: test

誰かが私がそれをどのように機能させることができるかについての考えを持っていますか?

4

1 に答える 1

7

Mac OS Xで実験してみると、問題はFCGI_printf()varargs関数であるようです。これはFCGI_fprintf()、varargsも呼び出します。

int FCGI_fprintf(FCGI_FILE *fp, const char *format, ...)
{
    va_list ap;
    int n = 0;
    va_start(ap, format);          <------ crash here

Adaにはvarargs関数を指定する標準的な方法がなく、GNATにも実装定義の方法がありません。

GNATのドキュメントによると、解決策はvarargs関数のCラッパーを提供することです。

#include <fcgi_stdio.h>
int FCGI_printf_wrapper(const char *msg)
{
  return FCGI_printf(msg);
}

ラッパーをインポートします。

procedure FCGI_printf (str : Interfaces.C.Strings.chars_ptr);
pragma Import (C, FCGI_printf, "FCGI_printf_wrapper");

このプログラムのもう1つの問題は、Adaでは、Cや他の多くの言語とは異なり"\n"、文字列に改行文字を挿入する方法ではないことです。試す

fcgi_stdio.FCGI_printf
  (Interfaces.C.Strings.New_String ("Content-Type: text/plain" 
                                    & ASCII.LF & ASCII.LF));

[編集13.1.13]

于 2013-01-12T23:26:30.043 に答える