Dynamic memory allocation is a crucial concept in Fortran, especially when dealing with data structures whose size cannot be determined at compile time. This topic will cover the basics of dynamic memory allocation, including how to allocate and deallocate memory, and practical examples to illustrate these concepts.
Key Concepts
-
Dynamic Memory Allocation:
- Allows the program to request memory during runtime.
- Useful for handling data structures with sizes that are not known until the program is running.
-
ALLOCATE Statement:
- Used to allocate memory for variables.
- Syntax:
ALLOCATE(variable_name(size))
-
DEALLOCATE Statement:
- Used to free the allocated memory.
- Syntax:
DEALLOCATE(variable_name)
-
Automatic Arrays:
- Arrays whose size is determined at runtime but are automatically deallocated when they go out of scope.
Practical Examples
Example 1: Allocating and Deallocating a Simple Array
PROGRAM DynamicArrayExample
IMPLICIT NONE
INTEGER, ALLOCATABLE :: array(:)
INTEGER :: n, i
! Ask the user for the size of the array
PRINT *, 'Enter the size of the array:'
READ *, n
! Allocate memory for the array
ALLOCATE(array(n))
! Initialize the array
DO i = 1, n
array(i) = i * 2
END DO
! Print the array
PRINT *, 'Array elements:'
DO i = 1, n
PRINT *, array(i)
END DO
! Deallocate the memory
DEALLOCATE(array)
END PROGRAM DynamicArrayExampleExplanation:
- The program prompts the user to enter the size of the array.
- The
ALLOCATEstatement is used to allocate memory for the array based on the user input. - The array is initialized and printed.
- Finally, the
DEALLOCATEstatement is used to free the allocated memory.
Example 2: Using Automatic Arrays
PROGRAM AutomaticArrayExample
IMPLICIT NONE
CALL ProcessArray(5)
END PROGRAM AutomaticArrayExample
SUBROUTINE ProcessArray(n)
IMPLICIT NONE
INTEGER, INTENT(IN) :: n
INTEGER :: i
REAL :: array(n)
! Initialize the array
DO i = 1, n
array(i) = i * 1.5
END DO
! Print the array
PRINT *, 'Array elements:'
DO i = 1, n
PRINT *, array(i)
END DO
END SUBROUTINE ProcessArrayExplanation:
- The subroutine
ProcessArraytakes an integernas an argument. - An automatic array
arrayis declared with sizen. - The array is initialized and printed.
- The array is automatically deallocated when the subroutine exits.
Exercises
Exercise 1: Dynamic Matrix Allocation
Task: Write a program that dynamically allocates a 2D matrix based on user input, initializes it with random numbers, prints the matrix, and then deallocates the memory.
Solution:
PROGRAM DynamicMatrixExample
IMPLICIT NONE
REAL, ALLOCATABLE :: matrix(:,:)
INTEGER :: rows, cols, i, j
! Ask the user for the size of the matrix
PRINT *, 'Enter the number of rows:'
READ *, rows
PRINT *, 'Enter the number of columns:'
READ *, cols
! Allocate memory for the matrix
ALLOCATE(matrix(rows, cols))
! Initialize the matrix with random numbers
CALL RANDOM_SEED()
DO i = 1, rows
DO j = 1, cols
CALL RANDOM_NUMBER(matrix(i, j))
END DO
END DO
! Print the matrix
PRINT *, 'Matrix elements:'
DO i = 1, rows
PRINT *, (matrix(i, j), j = 1, cols)
END DO
! Deallocate the memory
DEALLOCATE(matrix)
END PROGRAM DynamicMatrixExampleExercise 2: Dynamic Array of Structures
Task: Create a program that dynamically allocates an array of structures to store student information (name and grade), initializes the array, prints the information, and deallocates the memory.
Solution:
PROGRAM DynamicStructArrayExample
IMPLICIT NONE
TYPE :: Student
CHARACTER(LEN=50) :: name
REAL :: grade
END TYPE Student
TYPE(Student), ALLOCATABLE :: students(:)
INTEGER :: n, i
! Ask the user for the number of students
PRINT *, 'Enter the number of students:'
READ *, n
! Allocate memory for the array of students
ALLOCATE(students(n))
! Initialize the array
DO i = 1, n
PRINT *, 'Enter name for student ', i, ':'
READ *, students(i)%name
PRINT *, 'Enter grade for student ', i, ':'
READ *, students(i)%grade
END DO
! Print the student information
PRINT *, 'Student Information:'
DO i = 1, n
PRINT *, 'Name: ', students(i)%name, ', Grade: ', students(i)%grade
END DO
! Deallocate the memory
DEALLOCATE(students)
END PROGRAM DynamicStructArrayExampleCommon Mistakes and Tips
- Forgetting to Deallocate Memory: Always ensure that you deallocate memory to avoid memory leaks.
- Incorrect Allocation Size: Double-check the size of the allocation to ensure it matches the intended dimensions.
- Using Uninitialized Memory: Always initialize allocated memory before using it to avoid undefined behavior.
Conclusion
Dynamic memory allocation in Fortran allows for flexible and efficient use of memory, especially when dealing with data structures whose size is not known at compile time. By mastering the ALLOCATE and DEALLOCATE statements, you can create more dynamic and adaptable programs. Practice with the provided examples and exercises to solidify your understanding of these concepts.
Fortran Programming Course
Module 1: Introduction to Fortran
- Introduction to Fortran
- Setting Up the Development Environment
- Basic Syntax and Structure
- Writing Your First Fortran Program
Module 2: Basic Concepts
- Variables and Data Types
- Operators and Expressions
- Input and Output
- Control Structures: If Statements
- Control Structures: Loops
Module 3: Arrays and Strings
Module 4: Procedures and Functions
Module 5: Advanced Data Structures
Module 6: File Handling
Module 7: Advanced Topics
Module 8: Best Practices and Optimization
- Code Optimization Techniques
- Debugging and Profiling
- Writing Maintainable Code
- Fortran Standards and Portability
