code: def ctype(self):
          
          if self.dtype == "logical":
              return "C_BOOL"
          elif self.dtype == "complex":
              #We don't actually know what the precision of the complex numbers is because
              #it is defined by the developer when they construct the number with CMPLX()
              #We just return double to be safe; it is a widening conversion, so there
              #shouldn't be any issues.
              return "C_DOUBLE_COMPLEX"
          elif self.dtype == "character":
              return "C_CHAR"
          elif self.dtype in ["integer", "real"]:
              if self.kind is None:
                  if self.dtype == "integer":
                      return "C_INT"
                  else:
                      return "C_FLOAT"
                  
              if self._kind_module is None and self.kind is not None:
                  self.dependency()
              if self._kind_module is None and self.kind is not None:
                  raise ValueError("Can't find the c-type for {}".format(self.definition()))
              elif self._kind_module is not None:
                  #We look up the parameter in the kind module to find out its
                  #precision etc.
                  import re
                  default = self._kind_module.members[self.kind].default
                  vals = default.split("(")[1].replace(")", "")
                  ints = list(map(int, re.split(",\s*", vals)))
                  if self.dtype == "integer" and len(ints) == 1:
                      if ints[0] <= 15:
                          return "C_SHORT"
                      elif ints[0] <= 31:
                          return "C_INT"
                      elif ints[0] <= 63:
                          return "C_LONG"
                  elif self.dtype == "real" and len(ints) == 2:
                      if ints[0] <= 24 and ints[1] < 127:
                          return "C_FLOAT"
                      elif ints[0] <= 53 and ints[1] < 1023:
                          return "C_DOUBLE"
docs: Returns the name of the c_type from iso_c_binding to use when declaring
          the output parameter for interaction with python ctypes.