Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: So 25. Mär 2007, 18:26
Wenns was mit Javaprogrammierung zu tun hat, dann sind static-methoden Klassenmethoden, die für die gesamte Klasse gelten und nicht nur für ein instanziiertes Objekt.
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: So 25. Mär 2007, 23:08
No, bis dato weiss ich nur, dass man static dazu nutzt, Methoden ( die natürlich static sind ) aufzurufen, ohne ein Objekt der Klasse erstellt zu haben. Nützlich z.B bei ner Methode getShicehaufen - die gibt mir dann die Anzahl der Shicehaufen in irgendwas....Aber hat static auch noch ne höherliegende Bedeutung, nutz ich das nur in solchen fällen - wofür brauch ich static variablen -.- `?
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: Mo 26. Mär 2007, 10:37
In der std Hilfe ist geschrieben, das die static Variable durch das komplette Programm existiert..
C++ Syntax:
Bsp.:
Ich erstelle eine Klasse "cPrinter". Hier lese ich im Konstruktor alle Drucker ein, die ich initialisiert im System liegen habe. Die Klasse besitzt folgende Methoden: PrintStd(char* x), // druck auf den zuletzt gewaehlten Drucker.....
Wenn ich also, irgendwo im Code die Stelle habe, indem ich etwas drucken möchte, so soll es so aussehen:
cPrinter prt; prt.PrintStd("Blahfasel");
Ohne Static deklaration müsste ich jedesmal alle installierten Drucker neu initialisieren und den Standarddrucker neu auswählen.
Die Klasse könnte so aussehen:
class cPrinter { public static int m_StandardDrucker; static CDruckerliste m_Druckerliste;
cPrinter(); void PrintStd(char* text); };
// Da die Variablen Static sind und die Klasse noch keinen Speicherraum zugewiesen // bekommt, muessen die Static Variablen "Ausserhalb" deklariert werden!
int cPrinter::m_StandardDrucker = -1; CDruckerliste cPrinter::m_Druckerliste;
Sobald der Konstruktor alle Drucker einmal eingelesen hat, kann man implementieren, das solange die Druckerliste nicht leer ist, er keine neuen Drucker einlesen soll. Nach dem das erste mal PrintStd aufgerufen wird, speichert sich der PrintStd den aktuellen Drucker, den der Benutzer ausgewählt hatte. Somit kommt die Abfrage ebenfalls nicht mehr....
gruss Ralf
Zuletzt geändert von Legius am Mo 26. Mär 2007, 10:40, insgesamt 1-mal geändert.
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: Mo 26. Mär 2007, 13:46
D.h static variablen sind global und behalten ihren Wert während der runtime - also im gegensatz zu dynamischen vars ändert sich der wert nicht - vergleichbar mit nem define?
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: Mo 26. Mär 2007, 14:44
Nein, kein define
define ...
ist in etwa wie:
const .... = ....;
Beim define aendert sich der Wert nicht mehr, bzw. "define" ist eine Kompileranweisung, die dem Kompiler sagt, was er dort einsetzen soll. "const ..." wird wirklich wie eine Variable behandet, allerdings aendert sich der Wert nicht!!.
static bedeuted, das immer, wenn du auf die variable zugreifen wirst, auf die selbe Speicheradresse zugreifst. Static ist zu vergleichen mit der von dir erwaehnten globalen variable...
D.h. in einer Klasse eine static Variable zu definieren bedeutet, das alle Instanzen dieser Klasse auf die "selbe" Variable zugreifen (der selbe Speicherplatz).
gruss Ralf
Zuletzt geändert von Legius am Mo 26. Mär 2007, 14:49, insgesamt 1-mal geändert.
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: Mo 26. Mär 2007, 15:20
Zu Bitoperationen - wir sollen evtl. n kleinen Code schreiben, der überprüft, welche Bits einer festgelegten Zahl gesetzt sind. Sollte so gehen oder? Also es soll immer nur 1 Bit überprüft werden:
using System; using System.Collections.Generic; using System.Text;
namespace Bitverschiebung { class Program { static void Main(string[] args) { byte generatetNumber=165; // Bitfolge = 10100101 => 2^0+2^2+2^5+2^7=165 int vergleichswert =0;
Console.WriteLine("Generierter Wert: " + generatetNumber); Console.WriteLine("Bitfolge: 10100101"); Console.WriteLine("Bit eingeben, das auf Status überprüft werden soll: ");
//vergleichswert = vergleichswert >> 7; //allgemeiner vergleichswert, mit dem ich je nach aufgabenstellung schiebe Console.WriteLine("Vergleich: " + vergleichswert); if ((generatetNumber & vergleichswert) == 0) Console.WriteLine("Bit nicht gesetzt"); else Console.WriteLine("Bit gesetzt"); } } }
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: Mo 26. Mär 2007, 16:35
Kannst du so programmieren.
Vielleicht folgendes noch:
Deine Eingabe:
string eingabe = Console.ReadLine();
kannst du dann aendern in eine Zahl.
int x = atol(eingabe) // Konvertierung in ein Zahl if(x > 0) { vergleichswert = pow(2,(x-1)) // Direkt 2^(x-1) umrechnen } else { // Gescheiten Bitvergleichswert eingeben!!!! }
if(vergleichswert&generatetNumber) // Die If Abfrage einfacher gestaltet.... // Muss ja nur true sein! { //Bit gesetzt. } else { // Bit nicht gesetzt. }
Deine Abfrage ist optisch nicht so schoen, da alles Abfrage auf 0 mit ! (not) beantwortet werden koennen. Die If Abfrage ist immer erfolgreich, wenn der Term true ist, allso alles ungleich 0.
if ((generatetNumber & vergleichswert) == 0) -> if(!(generatetNumber & vergleichswert)) Da du eine "Else"-klausel dabei hast, ist es besser, die Abfrage umzudrehen.. Die Else klausel zuerst, also nicht auf 0 abfragen, sondern umgekehrt: if(vergleichswert&generatetNumber) .....
Damit kannst du das hier sparen und bist flexibler, da du auch auf bit20 ueberpruefen kannst!: <span style="font-size:7pt"> switch (eingabe) { case "1": vergleichswert = 1; Console.WriteLine("00000001"); break; // Bitfolge = 00100000 => 2^5= 32 case "2": vergleichswert = 2; Console.WriteLine("00000010"); break; // Bitfolge = 00100000 => 2^5= 32 case "3": vergleichswert = 4; Console.WriteLine("00000100");break; // Bitfolge = 00100000 => 2^5= 32 case "4": vergleichswert = 8; Console.WriteLine("00001000"); break; // Bitfolge = 00100000 => 2^5= 32 case "5": vergleichswert = 16; Console.WriteLine("00010000");break; // Bitfolge = 00100000 => 2^5= 32 case "6": vergleichswert = 32; Console.WriteLine("00100000");break; // Bitfolge = 00100000 => 2^5= 32 case "7": vergleichswert = 64; Console.WriteLine("01000000");break; // Bitfolge = 00100000 => 2^5= 32 case "8": vergleichswert = 128; Console.WriteLine("10000000");break; // Bitfolge = 00100000 => 2^5= 32 default: Console.WriteLine("Wie wärs mit ner gescheiten Zahl du Affe?"); break; } </span>
Zuletzt geändert von Legius am Mo 26. Mär 2007, 16:47, insgesamt 1-mal geändert.
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: Mo 26. Mär 2007, 16:46
Jo, ich habs halt so gemacht, wie ichs von C++ kenn, wir sollen nur die ersten 8 Bits überprüfen, deswegen die switch....hast zufällig n Algorithmus da, mit dem ich auch mehrere Prüfen kann? also z.B 1 und 4 und 7 etc...
Betreff des Beitrags: Re: Static // EInsatzbereich...
Verfasst: Mo 26. Mär 2007, 16:55
Ich hab mir überlegt, man könnte die Eingabe so gestalten, dass man einfach maximal 8 zahlen hintereinander eingibt, wenn man calculate eingibt, wird die eingabe abgebrochen, ansonsten kann man eben die vollen 8 Bits mit 256, bzw. 255 am Ende abfragen.
dann müsste man natürlich 8-(Anzahl der Eingaben) und das Ergebnis davon von de Vergleichszahl abziehen um die ^0 Werte, die ja 1 ergeben, zu eliminieren...dann hätte ich das doch.,...is halt absolut umständlich und geht mit sicherheut einfacher -.- nur komm ich nich drauf
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.