I think what you are looking for is a constructor for your new type that 
uses incomplete initialization


type ExampleEvent

        fld1::ASCIIString
        fld2::Int16
        fld3::Int64
        fld4::Int64
        fld5::Int64
        fld6::Int64
        fld7::Int64

        function ExampleEvent(fld1, fld2)
          obj = new()  # create new object, without assigning values to 
fields
          obj.fld1 = fld1
          obj.fld2 = fld2
        
          return obj
        end
end

  Now you can use this constructor when assigning elements to the array

   events = Vector{ExampleEvent}(1000)
   for i=1:10
      events[i] = ExampleEvent("abc", i)
   end
   events[5].fld3 = 7  # assign to previously undefined field

   Note that you will get an error if you try to read a value from a field 
that hasn't been set yet:

   event = ExampleEvent("abc", 2)
   y = event.fld3  # error, accessing undefined reference

  Best,
    Jared Crean

On Friday, July 22, 2016 at 2:38:27 PM UTC-4, [email protected] wrote:
>
>
> Thanks Cameron. 
>
> What I wanted to do was assign values to fields but the example you posted 
> requires me to pass values to all fields in my type. 
>
> If I do: events[1] = ExampleEvent("asdf",123), julia throws an error since 
> I need to pass values to ALL my type's fields. I don't always have to use 
> all fields & sometimes do not have data for all fields, thus I don't want 
> to be obligated to pass even null values to them since it is 
> verbose/excessive. Nor do I want to rewrite constructors for all fields 
> since I already have named fields for sake of programming ease. 
>
> See what I mean? 
>
> Moreover, let's say I've filled 10 elements of my 1000 element array & a 
> few milliseconds later I get a value for element 5, fld3. How do I index 
> into element 5 of the events Vector & ONLY set fld3? 
>
> Yes I've seen push! & looks good but I'm pretty religious about 
> precallocating in any lang even if it is much larger than needed since 
> processing these datasets require as much efficiency as possible.
>
> I think more intuitive Composite Type Arrays for morons like me would make 
> Juila much easier to work with since I've seen a fair amount of 
> uncertainty/confusion from people having similar conceptual use cases. I 
> know I'm thinking from a perspective of other language(s) but some language 
> constructs are there because they work & make a programmer's life easier. 
> Is there an easy way to set field value(s) whenever I get them? 
>
> On Friday, July 22, 2016 at 2:01:41 PM UTC-4, Cameron McBride wrote:
>>
>> Your ExampleEvent is completely analagous to a C-like struct. With 
>> Stefan's bit, you now have a single dimension array of ExampleEvent type 
>> (hence ndims(events) is 1). 
>>
>> You can do this:
>> julia> events[1] = ExampleEvent("asdf",2,3,4,5,6,7)
>> ExampleEvent("asdf",2,3,4,5,6,7)
>>
>> And if you have more, you can do this: 
>> julia> push!(events, ExampleEvent("ghjk", 2,3,4,5,6,7))
>> 1001-element Array{ExampleEvent,1}:
>>     ExampleEvent("asdf",2,3,4,5,6,7)
>>  #undef
>>    ⋮
>>  #undef
>>     ExampleEvent("ghjk",2,3,4,5,6,7)
>>
>> Cameron
>>
>> On Fri, Jul 22, 2016 at 1:48 PM, <[email protected]> wrote:
>>
>>> Thanks Stefan!
>>>
>>> I thought it would be like declaring a struct array in c/c++ i.e. 
>>> something like ExampleEvent events[2][1000]; Then set each field in the 
>>> events array as I encounter the required value in my algo: e.g. 
>>> events[1][1].fld1 = "ABC";  events[1][1].fld2 = 123;   etc
>>>
>>> How do I access elements in the events Vector since ndims(events) = 1? I 
>>> don't see anything in the docs about indexing into a preallocated Vector 
>>> data structure. I see methods like push! splice! etc but not anything that 
>>> will let me use the elements of my preallocation on the fly. 
>>>
>>>
>>> On Thursday, July 21, 2016 at 3:21:54 PM UTC-4, Stefan Karpinski wrote:
>>>>
>>>> It's a little unclear what you want to do that you can't figure out how 
>>>> to accomplish. You can allocate an uninitialized vector of ExampleEvent 
>>>> objects:
>>>>
>>>> julia> type ExampleEvent
>>>>                fld1::ASCIIString
>>>>                fld2::Int16
>>>>                fld3::Int64
>>>>                fld4::Int64
>>>>                fld5::Int64
>>>>                fld6::Int64
>>>>                fld7::Int64
>>>>        end
>>>>
>>>> julia> events = Vector{ExampleEvent}(1000)
>>>> 1000-element Array{ExampleEvent,1}:
>>>>  #undef
>>>>  #undef
>>>>  #undef
>>>>    ⋮
>>>>  #undef
>>>>  #undef
>>>>  #undef
>>>>
>>>>
>>>>
>>>>
>>>> On Thu, Jul 21, 2016 at 2:51 PM, <[email protected]> wrote:
>>>>
>>>>>
>>>>> Hi 
>>>>>
>>>>> I was working on processing large data sets & historically I've used 
>>>>> structs in C++ & other languages for this type of task. I attempted to 
>>>>> use 
>>>>> a Composite Type in Julia & preallocate a large array before filling it 
>>>>> w/values as my algo processes the data. 
>>>>>
>>>>> My example was:
>>>>>
>>>>> type ExampleEvent
>>>>>
>>>>>         fld1::ASCIIString
>>>>>         fld2::Int16
>>>>>         fld3::Int64
>>>>>         fld4::Int64
>>>>>         fld5::Int64
>>>>>         fld6::Int64
>>>>>         fld7::Int64
>>>>>
>>>>> end
>>>>>
>>>>> I googled around & from what I found, & all the docs examples I tried 
>>>>> out, there isn't an obvious way to declare an array of composite type 
>>>>> without having to do some work arounds. 
>>>>>
>>>>> I liked the language in several other respects but it seems to be 
>>>>> missing helpful tools to make the programmer's life easy. Am I missing 
>>>>> something? If not, why is a data structure like this not easily 
>>>>> available? 
>>>>>
>>>>> thanks in advance
>>>>>
>>>>> best,
>>>>> A 
>>>>>
>>>>
>>>>
>>

Reply via email to