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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.
command
 ist nach dieser Zeile ein Object vom Typ
SendCommand
Das
var
überlässt dem Compiler die Wahl, welchen Typ er hier
verwendet. Und ja, es wird Speicher alloziert.

merciless

von STK500-Besitzer (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Steht doch da, es wird eine neues Objekt erzeugt:
  var command = new SendCommand(...)

Und der Konstruktor hat eben zwei Parameter:
  var erster = (int)Command.kCore4Speed;
  var zweiter = f.ToString();

  var command = new SendCommand(erster, zweiter);

von Martin M. (ats3788)


Bewertung
0 lesenswert
nicht 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


            public void Loop()
            {
                //CPUMainboard.GetSystemInfo();

                CPUMainboard_t Temperature;
                Temperature = GetSystemInfo();
                
                var command1 = new SendCommand((int)Command.kCore1Temp, Temperature.TempCore1);
                 _cmdMessenger.SendCommand(command1);

                var command2 = new SendCommand((int)Command.kCore2Temp, Temperature.TempCore2);
                _cmdMessenger.SendCommand(command2);

                var command3 = new SendCommand((int)Command.kCore3Temp, Temperature.TempCore3);
                _cmdMessenger.SendCommand(command3);

                var command4 = new SendCommand((int)Command.kCore4Temp, Temperature.TempCore4);
                _cmdMessenger.SendCommand(command4);

                var command5 = new SendCommand((int)Command.kCore1Clock, Temperature.ClockCore1);
                _cmdMessenger.SendCommand(command5);

                var command6 = new SendCommand((int)Command.kCore2Clock, Temperature.ClockCore2);
                _cmdMessenger.SendCommand(command6);

                var command7 = new SendCommand((int)Command.kCore3Clock, Temperature.ClockCore3);
                _cmdMessenger.SendCommand(command7);

                var command8 = new SendCommand((int)Command.kCore4Clock, Temperature.ClockCore4);
                _cmdMessenger.SendCommand(command8);

                var command9 = new SendCommand((int)Command.kGPUClock, Temperature.ClockGPU);
                _cmdMessenger.SendCommand(command9);

                var command10 = new SendCommand((int)Command.kGPUTemp, Temperature.TempGPU);
                _cmdMessenger.SendCommand(command10);


                DateTime LocalDate = DateTime.Now;
                DateTime utcDate = DateTime.UtcNow;


                int Month = LocalDate.Month;
                int Year = LocalDate.Year;
                int Day = LocalDate.Day;

                int Hour = LocalDate.Hour;
                int Min = LocalDate.Minute;
                int Sec = LocalDate.Second;

                string date = String.Format("--> {0}:{1}:{2} {3}.{4}.{5} <--\r", Hour, Min, Sec, Day, Month, Year);

                Console.Write("Counter : ");
                Console.WriteLine(Counter++);

                var command11 = new SendCommand((int)Command.kGetTime, date);
                _cmdMessenger.SendCommand(command11);
                               
                Thread.Sleep(2500);
            }

Und ja Loop wurde in Main definiert


 
       static void Main(string[] args)
        {
     Console.WriteLine("Start the application...");
           
             var receive = new CPUMessenger_t { RunLoop = true};
            receive.Setup();
            while (receive.RunLoop) receive.Loop();
            receive.Exit();

        }
    }
}

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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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