Announcement

Collapse
No announcement yet.

Refactoring TMap<int*,bool> setting into a Function

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Refactoring TMap<int*,bool> setting into a Function

    Be gentle, I'm only little and still very amateur. Thought I had my head wrapped around pointers and references, but perhaps not.

    Here is the original code not inside a separate function, working as intended.

    Code:
    UBehaviors.cpp
        ///UE_LOG(LogTemp, Warning, TEXT("ThreatLevel : %d"), npc->Behavior->ThreatLevel);
                ///UE_LOG(LogTemp, Warning, TEXT("Distance : %d"), npc->Behavior->Distance);
    
                if (!npc->Behavior->HighValue)
                {
                    npc->Behavior->HighValue = &npc->Behavior->Distance;
                    npc->Behavior->Comparisons[&npc->Behavior->Distance] = true;
                }
    
                for (auto& item : npc->Behavior->Comparisons)
                {
                    ///UE_LOG(LogTemp, Warning, TEXT("%d is the high value"), *npc->Behavior->HighValue);
    
                    if (*item.Key > *npc->Behavior->HighValue)
                    {
                        npc->Behavior->HighValue = item.Key;
                        ///UE_LOG(LogTemp, Warning, TEXT("The address of HighValue is now %d"), npc->Behavior->HighValue);
                        item.Value = true;
                        ///UE_LOG(LogTemp, Warning, TEXT("The value of %d is now %s"), item.Key, item.Value ? TEXT("True") : TEXT("False"));
    
                    } else if( item.Key != npc->Behavior->HighValue)
                    {
                        item.Value = false;
                        ///UE_LOG(LogTemp, Warning, TEXT("The value of %d is %s"), item.Key, item.Value ? TEXT("True") : TEXT("False"));
                    }
                }
    I put that directly into a function, but the item.Values were not updating. So I tried to turn bool into a pointer as well.

    Code:
    UBehaviors.h
        bool* True = new bool(true);
        bool* False = new bool(false);
    
    UBehaviors.cpp
    void UBehaviors::CompareValues(ANPC* npc, TMap<int*, bool*> comparisonMap)
    {
        ///UE_LOG(LogTemp, Warning, TEXT("ThreatLevel : %d"), npc->Behavior->ThreatLevel);
        ///UE_LOG(LogTemp, Warning, TEXT("Distance : %d"), npc->Behavior->Distance);
    
    
        if (!npc->Behavior->HighValue)
        {
            npc->Behavior->HighValue = &npc->Behavior->Distance;
            *npc->Behavior->Comparisons[&npc->Behavior->Distance] = *npc->Behavior->True;
        }
    
        for (auto& item : comparisonMap)
        {
            UE_LOG(LogTemp, Warning, TEXT("%d is the high value at address %d"), *npc->Behavior->HighValue, npc->Behavior->HighValue);
    
            if (*item.Key > *npc->Behavior->HighValue)
            {
                npc->Behavior->HighValue = item.Key;
                UE_LOG(LogTemp, Warning, TEXT("The address of HighValue is now %d"), npc->Behavior->HighValue);
                *item.Value = *npc->Behavior->True;
                UE_LOG(LogTemp, Warning, TEXT("The value of %d is now %s"), item.Key, item.Value ? TEXT("True") : TEXT("False"));
    
            } else if (item.Key != npc->Behavior->HighValue)
            {
                *item.Value = *npc->Behavior->False;
                UE_LOG(LogTemp, Warning, TEXT("The value of %d is %s"), item.Key, item.Value ? TEXT("True") : TEXT("False"));
            }
        }
    }
    I created True and False because I needed a way to add a bool into the map

    Code:
    UBehaviors.cpp
                npc->Behavior->Distance = npc->Scorer->GetDistanceScore(npc, npc->currentTarget);
                if (!npc->Behavior->Comparisons.Contains(&npc->Behavior->Distance))
                {
                    npc->Behavior->Comparisons.Add(&npc->Behavior->Distance, npc->Behavior->False);
                }
    But trying to read the value of the bools when set through the function, they all return true.

    Code:
    UBehaviors.cpp
        //Movement determination
            if (*npc->Behavior->Comparisons[&npc->Behavior->Distance] ) // && npc->GetVelocity().Size() < 1
            {
                UE_LOG(LogTemp, Warning, TEXT("%s has moved to target"), *npc->GetName());
                npc->movementComponent->MoveTo(npc, npc->currentTarget);
            }
    Currently, this code only runs on one npc, the only one in the level, if that's important or not.
    The first thing I need to wrap my head around is why the original code doesn't work when refactored to a function. I did the everything while experimenting without understanding fully.

    #2
    The function won't work because in the end you aren't pointing to the "value" anymore; you're operating on pointers.

    Pass value as a const int32 instead, copying around an int or bool will cost you nothing, no need for pointer to primitives.

    Btw, never use "int" keyword, always specify the size.
    | Savior | USQLite | FSM | Object Pool | Sound Occlusion | Property Transfer | Magic Nodes | MORE |

    Comment


      #3
      Originally posted by BrUnO XaVIeR View Post
      The function won't work because in the end you aren't pointing to the "value" anymore; you're operating on pointers.
      Firstly, thanks for the reply. I figured it would be something of that sort. To clarify, why doesn't *bool = *anotherbool; work.

      Originally posted by BrUnO XaVIeR View Post
      Pass value as a const int32 instead, copying around an int or bool will cost you nothing, no need for pointer to primitives.
      "Edit: I did try passing the values as const int32, but as the distance was changing in a seperate area, it wasn't being reflected in the function"

      I'll try to remain concise in my thought process:
      I need high value to update, preferably without constantly setting it. So I made it a pointer.
      I made the comparison values pointers so that I can use their address, so if they are the high value and they change, it's instantly reflected.
      In my mind, this makes it all as simple as adding the comparison value once to an array, and then looping through it every X amount of time to check for changes

      I wouldn't be surprised if I'm completely over-complicating it

      I'll also note, I'm not sure if it's relevant to why the values aren't being reflected from a seperate function, but the npc->Behavior is an instance of UBehaviors, where the comparison map is. The function the code above is in is within a static function. In case that makes a difference.

      Comment

      Working...
      X