From:  Spiros Bousbouras <spibou@gmail.com>
Date:  06 Jul 2023 19:13:47 Hong Kong Time
Newsgroup:  news.alt119.net/comp.ai.shells
Subject:  

Re: Combining ChatGPT with a Fortran compiler

NNTP-Posting-Host:  null

[ Crossposting to  comp.ai.shells ]

On Thu, 6 Jul 2023 07:34:53 +0200
Giorgio Pastore  wrote:
> Il 06/07/23 04:37, Beliavsky ha scritto:
> > On Tuesday, April 4, 2023 at 10:36:13 PM UTC-4, Beliavsky wrote:
> >> https://github.com/mherrmann/fix is a project using ChatGPT to fix
> >> errors in a user's C++ code. The same procedure could be used to prompt
> >> ChatGPT to fix code it generates with feedback from the compiler. If such
> >> tools are created for Fortran it will raise the productivity of Fortran
> >> programmers, especially newer ones. It is also possible that resources such
> >> as Stack Overflow and now ChatGPT make people lazy and less likely to read
> >> books to understand the programming languages they use.
> > 
> > I wrote a Python program at
> > https://github.com/Beliavsky/ChatGPT-Fortran-generator that will
> > iteratively present ChatGPT with a Fortran code and a compiler error
> > message and ask for a fix. You do need a paid account to use it, but the
> > cost for ChatGPT 3.5 is very low. I have submitted hundreds of queries and
> > paid less than $0.20.
>
> I do not recommend ChatGPT for serious programming work. In principle, 
> it could become a valuable resource. However, it would require a 
> specific training that is currently lacking.
> 
> As an illustration, I can show herefollowing a recent interaction I had 
> on the topic of Fortran pointers. Even if somewhat long, it may be 
> interesting.

It is , I have been wanting to see such a thing for a long time. I'm not
interested enough to create an account with one of the chatbots to experiment
myself but it's good to see an actual transcript as opposed to theoretical
claims that chatbots can be used for debugging.

From the experiences people have posted on newsgroups I visit , chatbots
at present do not seem any good at technical stuff. They're fine for "blah
blah" stuff. So if anyone wants a poem on , say , how Fortran is great for
numerical analysis code , I'm sure the chatbots will do a great job. But
for actual code , I doubt it. Around similar lines , see also the following
2 threads :

    From: Sylvia Else 
    Newsgroups: comp.misc
    Subject: ChatGPT fails at algebra
    Date: Thu, 9 Feb 2023 16:10:31 +1100
    Message-ID: 

    From: Sylvia Else 
    Newsgroups: comp.misc
    Subject: Trying to teach ChatGPT algebra
    Date: Sat, 11 Feb 2023 09:45:29 +1100
    Message-ID: 


> Giorgio
> 
> ==
> User (me) : what will be the output of this piece of code?
> 
> program abc
> implicit none
> integer, pointer :: a,b,c
> 
> allocate(b,c)
> b=42
> c=1
> a=>b
> b=>c
> print*,a,b,c
> ChatGPT
> 
> Based on the provided code snippet, the output will be:
> 
>             1          42           1
> 
> Here's the explanation:
> 
> 1.    The variables a, b, and c are declared as integer pointers using 
> the pointer attribute.
> 2.    Memory is allocated for the variables b and c using the allocate 
> statement.
> 3.    The value 42 is assigned to b (b = 42).
> 4.    The value 1 is assigned to c (c = 1).
> 5.    The pointer a is assigned to point to b (a => b).
> 6.    The pointer b is assigned to point to c (b => c).
> 7.    Finally, the values of a, b, and c are printed using the print 
> statement, resulting in the output 1 42 1.
> 
> User
> After your point 5, I would expect that printing a and b would give 42 
> and 42. after point 6, printing  b and c should give 1 and 1. Am I wrong?
> ChatGPT
> 
> Apologies for the confusion. You are correct. After point 5, printing a 
> and b will give the output 42 42. After point 6, printing b and c will 
> give the output 1 1. Here's the corrected explanation:
> 
> 1.    The variables a, b, and c are declared as integer pointers using 
> the pointer attribute.
> 2.    Memory is allocated for the variables b and c using the allocate 
> statement.
> 3.    The value 42 is assigned to b (b = 42).
> 4.    The value 1 is assigned to c (c = 1).
> 5.    The pointer a is assigned to point to b (a => b).
> 6.    The pointer b is assigned to point to c (b => c).
> 7.    Finally, the values of a, b, and c are printed using the print 
> statement, resulting in the output 42 42 1.
> 
> User
> I am confused. If, after point 6, b and c will be printed as '1 1', the 
> only doubt remains on the value printed in correspondence with a. Shoud 
> it be '1 1 1' or '42 1 1'?
> ChatGPT
> 
> Apologies for the confusion caused by my previous response. After point 
> 6, printing a, b, and c will give the output 1 1 1.
> 
> Here's the corrected explanation:
> 
> 1.    The variables a, b, and c are declared as integer pointers using 
> the pointer attribute.
> 2.    Memory is allocated for the variables b and c using the allocate 
> statement.
> 3.    The value 42 is assigned to b (b = 42).
> 4.    The value 1 is assigned to c (c = 1).
> 5.    The pointer a is assigned to point to b (a => b).
> 6.    The pointer b is assigned to point to c (b => c).
> 7.    Finally, the values of a, b, and c are printed using the print 
> statement, resulting in the output 1 1 1.
> 
> User
> Then, if, compiling the program with gfortran, I get '42 1 1' should be 
> considered a compiler error?
> ChatGPT
> 
> Apologies for the confusion caused by my previous responses. You are 
> correct. Compiling the program with gfortran and getting the output 42 1 
> 1 indicates a discrepancy with the expected behavior according to the 
> Fortran code you provided.
> 
> In Fortran, when you use pointer assignment (=>), the target variable 
> takes on the value and type of the pointed-to variable. Therefore, after 
> the line b => c, the value of b should be 1 rather than 42. The 
> subsequent print statement should output 1 1 1.
> 
> If the compiler produces the output 42 1 1, it suggests a potential 
> issue with the compiler or the code itself. It's recommended to 
> double-check the code and ensure there are no other modifications or 
> factors affecting the behavior. Additionally, consider using the latest 
> version of gfortran or an alternative Fortran compiler to see if the 
> issue persists.
> User
> What is, according to the Fortran standard, the exact meaning of a=>b : 
> 1) a is pointing the the memory location pointed by b at the time the 
> instruction is executed, or 2) is pointing to b even if after that 
> instruction b is made pointing to another memory location
> ChatGPT
> 
> According to the Fortran standard, when you use the pointer assignment a 
> => b, it establishes the association that a is pointing to the memory 
> location pointed by b at the time the instruction is executed (Option 1 
> in your question).
> 
> Once the pointer association a => b is made, a will continue to point to 
> the memory location originally pointed by b. Any subsequent changes to b 
> will not affect the association between a and the original memory 
> location. Therefore, even if b is made to point to another memory 
> location after the pointer association is established, a will still 
> point to the original memory location.
> 
> In the code you provided earlier, the output 42 1 1 suggests that the 
> compiler might not be adhering strictly to the Fortran standard in this 
> particular case. The behavior may vary depending on the compiler and its 
> specific implementation of pointer assignments.
> User
> At this point I do not understand your answer. You said that a continues 
> pointing to the original location of b. That location contains the 
> integer 42. b at the time the print statemt is executed, b points to c, 
> so both b and c should be printed as 1. Why you say that '42 1 1'  is 
> not the expected output?
> ChatGPT
> 
> Apologies for the confusion caused by my previous responses. You are 
> correct, and I apologize for the incorrect information in my previous 
> explanations.
> 
> In the code you provided, after the pointer assignments a => b and b => 
> c, the expected output should indeed be 42 1 1.
> 
> The pointer assignment a => b establishes that a is pointing to the 
> memory location pointed by b, which initially contains the value 42. 
> Then, the pointer assignment b => c changes the pointer b to point to 
> the memory location pointed by c, which contains the value 1. However, 
> the pointer assignment does not affect the existing pointer a, so a 
> still points to the original memory location containing 42.
> 
> Therefore, the correct output of the program should be 42 1 1. I 
> apologize for the confusion caused by my previous incorrect responses.

Can't fault it for politeness  :-D