Forum: PC-Programmierung Verständnisfrage zu C#


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin M. (ats3788)


Lesenswert?

Hallo Ich bin ein C# Noop komme aus der Pascal C++ Welt
und schreibe ein C# Program für meine Bedürfnisse um.

Ich habe das ein Verständnis Problem

   public void Loop()
            {
                CPUMainboard_t Temperature;
                Temperature = GetSystemInfo();

                var command = new SendCommand((int)Command.kCore4Speed, 
f.ToString());
                 _cmdMessenger.SendCommand(command);

Der Author definiert eine Loop Schleife in main und das vertsähe ich 
nicht

>var command = new SendCommand((int)Command.kCore4Speed, f.ToString());

In C++ oder Pascal wird mit new ein Neues Object erstellt und auf dem 
Heap abgelegt ist das in C# nicht der Fall was macht das new hier, 
erstellt es nur eine neue Instanz ohne neuen Speicher anzufordern. Einen 
schönen Tag noch.

: Bearbeitet durch User
von Dirk K. (merciless)


Lesenswert?

Martin M. schrieb:
>>var command = new SendCommand((int)Command.kCore4Speed, f.ToString());
>
> In C++ oder Pascal wird mit new ein Neues Object erstellt und auf dem
> Heap abgelegt ist das in C# nicht der Fall was macht das new hier,
> erstellt es nur eine neue Instanz ohne neuen Speicher anzufordern. Einen
> schönen Tag noch.
1
command
 ist nach dieser Zeile ein Object vom Typ
1
SendCommand
Das
1
var
überlässt dem Compiler die Wahl, welchen Typ er hier
verwendet. Und ja, es wird Speicher alloziert.

merciless

von STK500-Besitzer (Gast)


Lesenswert?

Martin M. schrieb:
> Der Author definiert eine Loop Schleife in main und das vertsähe ich
> nicht

Bloß, weil das Ding "Loop" heißt, ist es noch lange keine.
Die Funktion wird irgendwo - vermutlich regelmäßig - aufgerufen.

Den Rest hat Dirk schon erklärt.

von Bastler (Gast)


Lesenswert?

Steht doch da, es wird eine neues Objekt erzeugt:
1
  var command = new SendCommand(...)

Und der Konstruktor hat eben zwei Parameter:
1
  var erster = (int)Command.kCore4Speed;
2
  var zweiter = f.ToString();
3
4
  var command = new SendCommand(erster, zweiter);

von Martin M. (ats3788)


Lesenswert?

Dirk K. schrieb:
> Und ja, es wird Speicher alloziert.

Danke wie kann man den freigeben in Pascal wirt mit  object.free
der Speicher wieder freigegeben.
I denke mal das macht C# automatisch als Moderne Sprache.
Die fertige Loop function sieht so aus und
funktioniert tadellos


1
            public void Loop()
2
            {
3
                //CPUMainboard.GetSystemInfo();
4
5
                CPUMainboard_t Temperature;
6
                Temperature = GetSystemInfo();
7
                
8
                var command1 = new SendCommand((int)Command.kCore1Temp, Temperature.TempCore1);
9
                 _cmdMessenger.SendCommand(command1);
10
11
                var command2 = new SendCommand((int)Command.kCore2Temp, Temperature.TempCore2);
12
                _cmdMessenger.SendCommand(command2);
13
14
                var command3 = new SendCommand((int)Command.kCore3Temp, Temperature.TempCore3);
15
                _cmdMessenger.SendCommand(command3);
16
17
                var command4 = new SendCommand((int)Command.kCore4Temp, Temperature.TempCore4);
18
                _cmdMessenger.SendCommand(command4);
19
20
                var command5 = new SendCommand((int)Command.kCore1Clock, Temperature.ClockCore1);
21
                _cmdMessenger.SendCommand(command5);
22
23
                var command6 = new SendCommand((int)Command.kCore2Clock, Temperature.ClockCore2);
24
                _cmdMessenger.SendCommand(command6);
25
26
                var command7 = new SendCommand((int)Command.kCore3Clock, Temperature.ClockCore3);
27
                _cmdMessenger.SendCommand(command7);
28
29
                var command8 = new SendCommand((int)Command.kCore4Clock, Temperature.ClockCore4);
30
                _cmdMessenger.SendCommand(command8);
31
32
                var command9 = new SendCommand((int)Command.kGPUClock, Temperature.ClockGPU);
33
                _cmdMessenger.SendCommand(command9);
34
35
                var command10 = new SendCommand((int)Command.kGPUTemp, Temperature.TempGPU);
36
                _cmdMessenger.SendCommand(command10);
37
38
39
                DateTime LocalDate = DateTime.Now;
40
                DateTime utcDate = DateTime.UtcNow;
41
42
43
                int Month = LocalDate.Month;
44
                int Year = LocalDate.Year;
45
                int Day = LocalDate.Day;
46
47
                int Hour = LocalDate.Hour;
48
                int Min = LocalDate.Minute;
49
                int Sec = LocalDate.Second;
50
51
                string date = String.Format("--> {0}:{1}:{2} {3}.{4}.{5} <--\r", Hour, Min, Sec, Day, Month, Year);
52
53
                Console.Write("Counter : ");
54
                Console.WriteLine(Counter++);
55
56
                var command11 = new SendCommand((int)Command.kGetTime, date);
57
                _cmdMessenger.SendCommand(command11);
58
                               
59
                Thread.Sleep(2500);
60
            }

Und ja Loop wurde in Main definiert


1
 
2
       static void Main(string[] args)
3
        {
4
     Console.WriteLine("Start the application...");
5
           
6
             var receive = new CPUMessenger_t { RunLoop = true};
7
            receive.Setup();
8
            while (receive.RunLoop) receive.Loop();
9
            receive.Exit();
10
11
        }
12
    }
13
}

Konnte sogar ein Admin Manifest hinzufügen wirklich einfach. Muss 
eigentlich um die C# Programme auszuführen auf allen Rechnern Net 
Installiert sein damit die Exe ausführbar ist.

von Bastler (Gast)


Lesenswert?

Martin M. schrieb:
> Die fertige Loop function sieht so aus

Oh man... Man, man, man...

So was tut doch weh...

von Dirk K. (merciless)


Lesenswert?

Martin M. schrieb:
> Dirk K. schrieb:
>> Und ja, es wird Speicher alloziert.
>
> Danke wie kann man den freigeben in Pascal wirt mit  object.free
> der Speicher wieder freigegeben.
Das macht der Garbage-Collector automatisch.

In deinem Fall würde ich die Commands in
einen Container packen und nicht alle 2,5
Sekunden neu erzeugen.

merciless

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.