delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2000/11/20/10:58:40

Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT sources DOT redhat DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT sources DOT redhat DOT com>
List-Help: <mailto:cygwin-help AT sources DOT redhat DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT sources DOT redhat DOT com
Delivered-To: mailing list cygwin AT sources DOT redhat DOT com
From: tprinceusa AT mindspring DOT com
Date: Mon, 20 Nov 2000 10:57:48 -0500
To: erik DOT nim AT risoe DOT dk
Cc: cygwin AT sourceware DOT cygnus DOT com
Subject: Re: C calls to Fortran with strings
Message-ID: <Springmail.105.974735868.0.64709800@www.springmail.com>
X-Originating-IP: 134.134.248.27

erik DOT nim AT risoe DOT dk wrote:
> Hi,

I am using the gcc compiler under Cygwin on a NT platform for applications
where I call Fortran subroutines from C code. This is working smoothly with
one strange exception: If more than one string are present in Fortran
subroutines the program crashes. Apparently everything works with ONE string
only. The following simple example illustrates the problem: 

-------- main.c ----------

#include 

extern void sub1_(char *s1, unsigned int);
extern void sub2_(char *s1, unsigned int, char *s2, unsigned int);

int main() {

  static char s1[] = "String1 ver 0";
  static char s2[] = "String2 ver 0";

  /*  This works well  */
  printf("\n First test:\n");
  printf(" In main: s1 = %s. Length = %d\n", s1, strlen(s1));
  sub1_(s1, strlen(s1));
  printf(" In main: s1 = %s. Length = %d\n", s1, strlen(s1));

  /*  This crashes  */
  printf("\n Second test:\n");
  sub2_(s1, strlen(s1), s2, strlen(s2));
  printf(" In main: s1 = %s. Length = %d\n", s1, strlen(s1));
  printf(" In main: s2 = %s. Length = %d\n", s2, strlen(s2));

  return(0); }

-------- sub1.f ------- 

      SUBROUTINE SUB1(S1)
*
      CHARACTER*(*) S1
*
      WRITE(*, *) 'In SUB1: S1 = ', S1, '. Length = ', LEN(S1)
*
      S1 = 'String1 ver 1'
      RETURN
      END

------- sub2.f ------- 

      SUBROUTINE SUB2(S1, S2)
*
      CHARACTER*(*) S1, S2
*
      WRITE(*, *) 'In SUB2: S1 = ', S1, '. Length = ', LEN(S1)
      WRITE(*, *) 'In SUB2: S2 = ', S2, '. Length = ', LEN(S2)
*
      S1 = 'String 1 ver 2'
      S2 = 'String 2 ver 2'
*
      RETURN
      END

------- makefile ------- 

test: main.o sub1.o sub2.o
	gcc -Wall -o test main.o sub1.o sub2.o -lg2c

main.o: main.c
	gcc -Wall -c main.c

sub1.o: sub1.f
	gcc -Wall -c sub1.f

sub2.o: sub2.f
	gcc -Wall -c sub2.f

------- output ------- 

 First test:
 In main: s1 = String1 ver 0. Length = 13
 In SUB1: S1 = String1 ver 0. Length =  13
 In main: s1 = String1 ver 1. Length = 13

 Second test:
 In SUB2: S1 =
      0 [main] test 1000 handle_exceptions: Exception:
STATUS_ACCESS_VIOLATION
   1036 [main] test 1000 stackdump: Dumping stack trace to
test.exe.stackdump
-----------------

Can any one tell me what's wrong and how I possible can avoid the problem? 


Kind regards 


Erik Nim

Risoe National Laboratory
Wind Energy and Atmospheric Physics Department
Denmark

IIRC, the calling convention of f2c/g77 places all the string length arguments at the end of the calling sequence.  You could verify this most easily with an f2c translation of your Fortran.  Other helpers which have been recommended include "cfortran.h" and similar tools which you should find discussed in the archives of comp.lang.fortran.  F2K intends to standardize this, but up to now, f2c/g77 are the closest to a standard.

HTH

Tim

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe AT sourceware DOT cygnus DOT com

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019