Mindmap-Galerie Attraversamento del ciclo TMap
Attraversamento del ciclo di TMap in UEC (implica principalmente la modifica del valore originale), inclusi esempi di codice, Analisi del problema, Metodi di modifica, ecc.
Bearbeitet um 2024-02-01 10:23:17Attraversamento del ciclo TMap
esempio di codice
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM(rif) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { per (Curva verticale automatica: Curva verticale) { for (int32 i = 0; i < VerticalCurve.Value.Datas.Num(); i) { if (VerticalCurve.Value.Datas[i].PointTangencyType == EPointTangencyType::PointTangencyType) { VerticalCurve.Value.Datas[i].Elevation_Start = VerticalCurve.Value.Datas[i].Elevation_PointTangency - VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i].Grade; VerticalCurve.Value.Datas[i].Elevation_End = VerticalCurve.Value.Datas[i].Elevation_PointTangency VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i 1].Grade; } } } return InCurvaVerticale; }
Analisi del problema
In questo codice, l'intenzione è modificare alcuni valori del parametro passato per riferimento. Tuttavia, il risultato dell'esecuzione del codice è che la modifica non riesce.
Il problema risiede nel ciclo for (auto VerticalCurve: InVerticalCurve). In questo ciclo, VerticalCurve è un elemento copiato, non un riferimento all'elemento nella InVerticalCurve originale. Pertanto, le modifiche a VerticalCurve non influenzeranno gli elementi nella InVerticalCurve originale.
Per modificare i parametri passati per riferimento, è possibile utilizzare un ciclo di riferimento basato su intervallo oppure utilizzare un iteratore.
Metodo di modifica
Utilizza cicli basati su riferimenti
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM(rif) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { per (auto e Curva verticale: InCurva verticale) { for (int32 i = 0; i < VerticalCurve.Value.Datas.Num(); i) { if (VerticalCurve.Value.Datas[i].PointTangencyType == EPointTangencyType::PointTangencyType) { VerticalCurve.Value.Datas[i].Elevation_Start = VerticalCurve.Value.Datas[i].Elevation_PointTangency - VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i].Grade; VerticalCurve.Value.Datas[i].Elevation_End = VerticalCurve.Value.Datas[i].Elevation_PointTangency VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i 1].Grade; } } } return InCurvaVerticale; }
Auto& viene utilizzato qui per garantire che VerticalCurve sia un riferimento all'elemento nella InVerticalCurve originale. Invece di copiare il valore, in questo modo, le modifiche alla VerticalCurve influenzeranno la InVerticalCurve originale.
Usa l'iteratore
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM(rif) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { for (auto It = InVerticalCurve.CreateIterator(); It; It) { for (int32 i = 0; i < It.Value().Datas.Num(); i) { if (It.Value().Datas[i].PointTangencyType == EPointTangencyType::PointTangencyType) { It.Value().Datas[i].Elevation_Start = It.Value().Datas[i].Elevation_PointTangency - It.Value().Datas[i].T * It.Value().Datas[i]. Grado; It.Value().Datas[i].Elevation_End = It.Value().Datas[i].Elevation_PointTangency It.Value().Datas[i].T * It.Value().Datas[i 1]. Grado; } } } return InCurvaVerticale; }
In questo esempio modificato, CreateIterator() viene utilizzato per ottenere l'iteratore TMap, quindi viene utilizzato nel ciclo per accedere agli elementi. In questo modo possiamo modificare direttamente It.Value() e quindi la InVerticalCurve originale