Autor Beitrag
reox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37



BeitragVerfasst: Fr 13.02.09 00:09 
Ich hab mal eine ganz grundsätzliche Frage: Ich verwende diese Methode um die entfernung zwischen zwei punkten auszurechnen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        public double getDistance(GeoCoordinate g1, GeoCoordinate g2)
        {
            // parse the stuff from grad to rad, because the Math Class uses rad
            g1.Latitude /= 180 * Math.PI;
            g2.Latitude /= 180 * Math.PI;
            g1.Longitude /= 180 * Math.PI;
            g2.Longitude /= 180 * Math.PI;

            return (Math.Acos(Math.Sin(g1.Latitude) * Math.Sin(g2.Latitude) + Math.Cos(g1.Latitude) * Math.Cos(g2.Latitude) * Math.Cos(g2.Longitude - g1.Longitude)))*6378.137;
        }

Nun wunder ich mich die ganze zeit warum mein Programm nicht funktioniert und habe testweise den wert den ich zurückbekomme durch einen fixen ersetzt. Und siehe da es geht!
Nun werden die beiden GeoCoordinaten die ich als Parameter mitgebe, im Aufrufenden Programm verändert!
wenn ich den Aufruf
double dist = helper.getDistance(c1, center);
verwende, haben die werte c1 und center nacher genau diese /180*PI, wurden also in RAD umgerechnet.
Jetzt bin ich etwas verwirrt, da ich dieses verhalten nur aus C kenne, wenn ich dort Pointer übergebe. Sind Parameter automatisch "Pointer" in C#??? Irgendwie kann ich mir das net vorstellen, da auch andere Methoden nach dem gleichen Prinzip dieses verhalten nicht zeigen... Wo ist mein Fehler?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 13.02.09 00:16 
Klassen sind Referenzdatentypen, Du übergibst der Methode also eine Referenz auf die Instanz der Klasse.
Hier hatten wir letztens was dazu: www.c-sharp-forum.de...=0&postorder=asc

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
reox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37



BeitragVerfasst: Fr 13.02.09 00:24 
ah ok ich verstehe... das hat mir aber auch noch niemand gesagt^^ (und wir lernen das in der schule :D)

aber wie könnte ich das im konkreten fall lösen, wenn ich umbedingt ein neues Objekt übergeben möchte?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 13.02.09 00:30 
Nun, Du kannst zum einen Überlegen, ob GeoCoordinate wirklich eine Klasse sein muss oder ob's auch ein struct tut. Die sind nämlich Wertdatentypen.

Ansonsten sehe ich nicht, dass ein Weg daran vorbei geht, eine Kopie anzulegen und diese der Methode als Parameter zu übergeben. Dazu könntest Du in Deiner Klasse z.B. das ICloneable-Interface implementieren. Die Arbeit in der entsprechenden Clone-Methode nimmt Dir dabei das Framework leider nicht ab.

Wie ich gerade sehe, gibt es auch noch die MemberwiseClone-Methode, die bereits eingebaut ist. Die solltest Du Dir mal angucken, aber wirklich aufmerksam lesen, was die macht. Und schauen, ob Dir das reicht.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
reox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37



BeitragVerfasst: Fr 13.02.09 00:49 
mh das ist jetzt die frage... das objekt speichert zZ 2 double und 2 Strings. Ich brauch das ganze in 3 verschiedenen programmen, da hab ich mir gedacht wäre eine klasse evt ganz hilfreich...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 13.02.09 01:21 
Die Frage ist doch eher was es für einen Sinn macht die übergebenen Werte überhaupt zu verändern. Da es sich um eine Klasse handelt, kannst du genauso gut Getter implementieren, die den Wert als Radiant oder Grad zurückgeben (ggf. boolscher Parameter z.B.), so wie du es gerade brauchst. Dann kannst du dir das Umrechnen an der Stelle sparen und hast das ganze Problem erst gar nicht.

Jedenfalls halte ich es für bedenklich, wenn man überhaupt Zwischenberechnungen in einem übergebenen Wert speichert. Dafür sind lokale Variablen viel besser geeignet.
reox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37



BeitragVerfasst: Fr 13.02.09 18:43 
mh naja ich verwende ja auch schon so Properties.
Ich hab jetzt das ICloneable implementiert und es geht auch so nun wunderbar!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 13.02.09 19:14 
Was jaenicke meinte:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
class GeoCoordinate
{
...
  public double LatitudeInRadians {
    get { return Latitude / 180 * Math.PI; }
  }
}
Es gibt hier wirklich keinen Grund, das Objekt zu verändern.

PS:
user profile iconreox hat folgendes geschrieben Zum zitierten Posting springen:
// parse the stuff from grad to rad, because the Math Class uses rad

Unser Gradmaß heißt "degree", grad ist wieder was Anderes ;) .

_________________
>λ=