Creëer een Fortran-programma voor automatische documentatie van code
description
Met deze prompt krijg je een op maat gemaakt Fortran-programma dat automatisch documentatie genereert, waardoor je tijd bespaart en de kwaliteit van je code-onderhoud verbetert. Het helpt fouten te verminderen en maakt samenwerking makkelijker doordat documentatie altijd actueel is. Dit is efficiënter dan handmatige documentatie en zorgt voor consistente resultaten.
prompt
Help me een Fortran-programma te maken dat automatisch documentatie genereert voor mijn code. Specificaties:
- Beschrijving van de codebase of module: <geef een korte beschrijving van de codebase of module>
- Welke documentatie-informatie wil ik genereren (bijvoorbeeld: functiebeschrijvingen, variabelen, input/output specificaties): ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een eenvoudig Fortran-programma dat automatisch documentatie genereert in Markdown-formaat voor jouw codebase. Dit programma leest een bronbestand, zoekt naar speciale commentaarregels die functiebeschrijvingen en input/output specificaties bevatten, en genereert daaruit een gestructureerde Markdown-documentatie.
**Voorbeeld Fortran-programma:**
```fortran
program generate_docs
implicit none
character(len=*), parameter :: input_file = 'jouw_code.f90'
character(len=*), parameter :: output_file = 'documentatie.md'
integer :: unit_in, unit_out, ios
character(len=1024) :: line
logical :: in_function = .false.
character(len=256) :: current_function = ''
integer :: line_number = 0
! Open het bronbestand
open(newunit=unit_in, file=input_file, status='old', action='read', iostat=ios)
if (ios /= 0) then
print *, 'Fout bij openen van inputbestand.'
stop
end if
! Open het outputbestand
open(newunit=unit_out, file=output_file, status='replace', action='write', iostat=ios)
if (ios /= 0) then
print *, 'Fout bij openen van outputbestand.'
stop
end if
write(unit_out, '(A)') '# Documentatie voor Numerieke rekencode voor thermische analyse'
write(unit_out, '(A)') '## Functiebeschrijvingen en specificaties'
write(unit_out, *)
do
read(unit_in, '(A)', iostat=ios) line
if (ios /= 0) exit
line_number = line_number + 1
! Zoek naar functiebeschrijvingen
if (index(line, '!@functie') /= 0) then
! Voorbeeld: !@functie BerekenTemperatuur
call process_function(line, current_function, unit_out)
in_function = .true.
else if (in_function .and. index(line, '!@input') /= 0) then
call process_input(line, current_function, unit_out)
else if (in_function .and. index(line, '!@output') /= 0) then
call process_output(line, current_function, unit_out)
else if (line == '') then
in_function = .false.
end if
end do
close(unit_in)
close(unit_out)
contains
subroutine process_function(line, func_name, out)
character(len=*), intent(in) :: line
character(len=*), intent(inout) :: func_name
integer, intent(in) :: out
character(len=256) :: fname
fname = trim(line(9:)) ! Na de '!@functie '
func_name = fname
write(out, '(A)') '### Functie: ' // trim(fname)
write(out, '(A)') 'Beschrijving:'
end subroutine process_function
subroutine process_input(line, func_name, out)
character(len=*), intent(in) :: line
character(len=*), intent(in) :: func_name
integer, intent(in) :: out
character(len=256) :: input_desc
input_desc = trim(line(8:)) ! Na '!@input '
write(out, '(A)') '- **Input voor `' // trim(func_name) // '`**: ' // trim(input_desc)
end subroutine process_input
subroutine process_output(line, func_name, out)
character(len=*), intent(in) :: line
character(len=*), intent(in) :: func_name
integer, intent(in) :: out
character(len=256) :: output_desc
output_desc = trim(line(9:)) ! Na '!@output '
write(out, '(A)') '- **Output van `' // trim(func_name) // '`**: ' // trim(output_desc)
end subroutine process_output
end program generate_docs
```
**Gebruik:**
- Voeg in je Fortran-code commentaar toe in het volgende formaat:
```fortran
!@functie BerekenTemperatuur
!@input Temperatuur, Tijd
!@output Temperatuur na berekening
subroutine BerekenTemperatuur(...)
! code
end subroutine
```
- Plaats dit programma in dezelfde directory als je codebestand en noem het bijvoorbeeld `generate_docs.f90`.
- Compileer en voer uit:
```bash
gfortran generate_docs.f90 -o generate_docs
./generate_docs
```
- De gegenereerde documentatie komt in `documentatie.md`.
---
**Integratie in je ontwikkelworkflow en tips voor automatisering:**
1. **Automatiseren met Makefile of scripts:**
- Voeg een stap toe in je buildproces (bijvoorbeeld in een Makefile) die dit script automatisch uitvoert na elke codewijziging.
- Voorbeeld: `make generate_docs`
2. **Gebruik versiebeheer hooks:**
- Integreer het genereren van documentatie in je Git hooks (bijvoorbeeld pre-commit of pre-push) zodat de documentatie altijd up-to-date is.
3. **CI/CD integratie:**
- Voeg in je CI-pipeline een stap toe die de documentatie automatisch bijwerkt en controleert.
4. **Verbetering van commentaarformat:**
- Gebruik consistente en gestructureerde commentaarblokken zodat het script ze eenvoudig kan parseren.
5. **Extra functionaliteiten:**
- Breid het script uit om ook variabelen, globale parameters en meer gedetailleerde beschrijvingen te verwerken.
- Overweeg het gebruik van bestaande tools of parserlibraries voor Fortran (zoals fparser) indien beschikbaar.
Door deze aanpak wordt je documentatie automatisch en consistent bijgewerkt, wat tijd bespaart en de kwaliteit van je project verhoogt.
provider: deepseek
model: deepseek-chat
Hier is een Fortran-programma dat automatisch Markdown-documentatie genereert voor uw numerieke rekencode:
```fortran
program auto_documentatie
implicit none
character(len=100) :: bestandsnaam, regel, functienaam
character(len=500) :: beschrijving
integer :: iostat, eenheid, i
logical :: in_functie = .false.
! Open uitvoerbestand voor documentatie
open(newunit=eenheid, file='THERMISCHE_ANALYSE_DOC.md', status='replace')
! Schrijf hoofdtitel
write(eenheid, '(a)') '# Documentatie Numerieke Thermische Analyse Code'
write(eenheid, '(a)') '## Codebase Beschrijving'
write(eenheid, '(a)') 'Numerieke rekencode voor thermische analyse en warmteoverdracht simulaties.'
write(eenheid, '(a)') ''
! Loop door alle Fortran-bestanden in de directory
call execute_command_line('ls *.f90 > bestanden.lst')
open(newunit=10, file='bestanden.lst', status='old')
do
read(10, '(a)', iostat=iostat) bestandsnaam
if (iostat /= 0) exit
write(eenheid, '(a)') '## Bestand: '//trim(bestandsnaam)
write(eenheid, '(a)') ''
! Analyseer elk bestand
open(newunit=11, file=trim(bestandsnaam), status='old')
do
read(11, '(a)', iostat=iostat) regel
if (iostat /= 0) exit
! Detecteer functie/subroutine declaraties
if (index(regel, 'function') > 0 .or. index(regel, 'subroutine') > 0) then
in_functie = .true.
functienaam = extract_naam(regel)
beschrijving = ''
write(eenheid, '(a)') '### '//trim(functienaam)
write(eenheid, '(a)') '**Type:** '//trim(extract_type(regel))
endif
! Zoek naar commentaar voor beschrijving
if (in_functie .and. index(regel, '!') > 0) then
beschrijving = trim(beschrijving)//' '//trim(regel(index(regel, '!')+1:))
endif
! Detecteer input/output variabelen
if (in_functie .and. (index(regel, 'intent(in)') > 0 .or. &
index(regel, 'intent(out)') > 0 .or. &
index(regel, 'intent(inout)') > 0)) then
write(eenheid, '(a)') '- '//trim(extract_variabele(regel))//&
' ('//trim(extract_intent(regel))//')'
endif
! Einde functie detectie
if (in_functie .and. index(regel, 'end') > 0 .and. &
(index(regel, 'function') > 0 .or. index(regel, 'subroutine') > 0)) then
write(eenheid, '(a)') '**Beschrijving:** '//trim(beschrijving)
write(eenheid, '(a)') ''
in_functie = .false.
endif
end do
close(11)
end do
close(10)
close(eenheid)
print *, 'Documentatie gegenereerd: THERMISCHE_ANALYSE_DOC.md'
contains
function extract_naam(regel) result(naam)
character(len=*), intent(in) :: regel
character(len=100) :: naam
integer :: start, einde
start = index(regel, 'function')
if (start == 0) start = index(regel, 'subroutine')
start = start + 9 ! Skip "function " of "subroutine "
einde = index(regel(start:), '(') + start - 2
if (einde < start) einde = len_trim(regel)
naam = regel(start:einde)
end function extract_naam
function extract_type(regel) result(type_str)
character(len=*), intent(in) :: regel
character(len=20) :: type_str
if (index(regel, 'function') > 0) then
type_str = 'Functie'
else
type_str = 'Subroutine'
endif
end function extract_type
function extract_intent(regel) result(intent_str)
character(len=*), intent(in) :: regel
character(len=10) :: intent_str
if (index(regel, 'intent(in)') > 0) then
intent_str = 'Input'
else if (index(regel, 'intent(out)') > 0) then
intent_str = 'Output'
else
intent_str = 'Input/Output'
endif
end function extract_intent
function extract_variabele(regel) result(var_str)
character(len=*), intent(in) :: regel
character(len=50) :: var_str
integer :: start, einde
start = index(regel, '::') + 2
einde = index(regel(start:), ',')
if (einde == 0) einde = len_trim(regel)
var_str = adjustl(regel(start:start+einde-2))
end function extract_variabele
end program auto_documentatie
```
## Integratie in ontwikkelworkflow:
### 1. Makefile integratie:
```makefile
doc:
gfortran auto_doc.f90 -o auto_doc
./auto_doc
echo "Documentatie bijgewerkt: $(date)" >> doc_log.txt
```
### 2. Git pre-commit hook:
Maak een bestand `.git/hooks/pre-commit`:
```bash
#!/bin/bash
gfortran auto_doc.f90 -o auto_doc
./auto_doc
git add THERMISCHE_ANALYSE_DOC.md
```
### 3. CI/CD pipeline (bijv. GitHub Actions):
```yaml
name: Generate Documentation
on: [push, pull_request]
jobs:
documentatie:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Genereer documentatie
run: |
sudo apt-get install gfortran
gfortran auto_doc.f90 -o auto_doc
./auto_doc
- name: Upload documentatie
uses: actions/upload-artifact@v2
with:
name: documentation
path: THERMISCHE_ANALYSE_DOC.md
```
## Tips voor automatisering:
### 1. Commentaar conventies:
Gebruik gestructureerde commentaar:
```fortran
! TEMPERATUUR_BEREKENING: Bereken temperatuurverdeling
! Input: temp_ini - initiële temperatuur [K]
! dt - tijdstap [s]
! Output: temp_new - nieuwe temperatuur [K]
! Auteur: Jan Jansen
! Datum: 2024-01-15
```
### 2. Automatische scheduling:
```bash
# Voeg toe aan crontab (elke dag om 02:00)
0 2 * * * /pad/naar/auto_doc >> /var/log/doc_update.log
```
### 3. Real-time monitoring:
```bash
# Watch voor bestandswijzigingen
inotifywait -m -e modify *.f90 | while read; do
./auto_doc
done
```
### 4. Documentatie kwaliteitscontrole:
```fortran
! Controleer op ontbrekende documentatie
if (len_trim(beschrijving) == 0) then
print *, 'WAARSCHUWING: Geen beschrijving voor '//trim(functienaam)
endif
```
## Aanbevolen verbeteringen:
1. **Metadata extractie**: Voeg ondersteuning toe voor auteur, datum, versie
2. **Dependency tracking**: Documenteer functie-afhankelijkheden
3. **Template systeem**: Maak aanpasbare output templates
4. **Cross-referencing**: Genereer links tussen gerelateerde functies
Dit programma genereert consistente documentatie en kan eenvoudig worden geïntegreerd in uw bestaande workflow!