C# , ein grosses C mit kleine Zaun, darauf will ich jetzt vertraun

Duda

Erfahrenes Mitglied
Hallo Community,

nach einigem Hin und Her, habe ich mich für C# entschieden um ein Hobby-Programm-Projekt auf die Beine stellen, wie man so schön sagt. Als basis dient mir dabei Visual C# 2010, denn ich möchte schon den
hierin enthaltenen und mir auch schon teilweise bekannten Designer nutzen, welcher mir das Fenster Programmgerüst mit dem Namen Forms liefert, worin ich dann selbst "nur noch" die C#-Codezeilen einsetzen brauche. Wie Ihr seht, steht das "nur noch" in Anfühtungszeichen. Denn sowas glaube selbst ich nicht, obwohl ich von Haus aus gutgläubig bin. Also wie gesagt, es geht hauptsächlich nur noch um das "nur noch". Mein Programm war so gut wie fertig, wohl gemerkt auf dem Papier und in C++ und im PC unter Visual C++2010 Express wardas Forms mit tabpage1 bis 5 erstellt. Jede dieser Seite reich gefüllt mit Labels, TextBoxen, RadioButtons und CheckBoxen. Ja die letzte Seite war noch nicht so weit, den da sollte das Formular zum Ausdrucken der Ergebnisse noch gestalltet werden. Da mir einige Mitglieder, beim Umsetzen meiner Ideen, geholfen haben, waren keine besonderen Probleme mehr zu erwarten.
Dachte ich, aber dem war nicht so, denn ich konnte mit C++ in Visual C++ nichts anfangen, denn hier wird CLI erwartet. Ok dachte ich, dann mal ebend von C++ in CLI übersetz und ab geht die Post. Aber auch hier
mußte ich das Handtuch werfen, denn es sind schon zwei verschiedene Sprachen, welche Ähnliches machen, aber welche sich in den meisten Dingen nicht auf einen Nenner bringen lassen. Also ein Umsetzen 1 zu 1 war nicht möglich. Jedenfalls nicht von C++ zu CLI, wobei anderstrum sicher alle mehr als möglich gewesen wäre. Ich habe mich danach noch dies und das an Programmiersprachen angeschaut.
Und bin, weil ich das Visual-Express im Grunde beibehalten wollte, auf die C# version umgestiegen.
Ich fange nochmal ganz neu an. Aber auch hierzu habe nicht die passende Code gefunden um C++ 1 zu 1
übersetzen zu können, aber unter C# gibt es ausreichend ähnliche Code um so gut wie alles umsetzen zu können. Ich mache hier erstmal Schluß und komme mit den ersten Fragen im Laufer der kommenden Tage.

Viele Grüsse

Duda
 
Hallo Community,

Nach vielem Lesen und Suchen im I-Net bin ich nun langsam soweit, daß ich sagen kann: " Vorm großem C mit dem kleinen Gartentor #, da stehe ich immernoch davor". Es liest sich gut und hört sich auch ganz gut an,
mal sehen was ich daraus machen kann.
Die Functionen fehlen, das ist schon mal klar, aber die Methoden funktionieren trotzdem wunderbar. Vector als Container vermisse ich,
stringstream gibt es nicht, es fehlen size und size_t,
das tut ja auch schon richtig weh.
Doch alles Andere, was ich für mein Programm so brauche, das konnte ich schon entdecken, doch ein paar kleine Fragen will ich nicht verstecken.
1.) Da ich bis jetzt noch keine Möglichkeit für das Zerlegen eines Strings
gefunden habe, ich meine ich brauche die einzelnen Positionen/Zeichen.
Deshalb denke ich daran mehrere kleine/kurze Strings zu definieren, welchen ich nur ein Zeichen zuweise. Mit diesen Mini-Strings lassen sich dann einige Dinge machen, welche ich für den Programmablauf brauche. Auch danach lassen sich diese Mini-Strings auch bei Bedarf zu einem großen String zusammen bauen. Da helfen StringBuilder und Append, also kein Problem. Nur lassen sich auch Strings mit nur einem Zeichen als Text verwirklichen?
2.) es sind 2 Fragen, aber ich erstelle ebend die Code-Zeilen.
C++:
// nur mal so, ganz ohne Konventionen
// Hier mal einer meiner Mini-Strings
 
string v1 = "F";
 
// nachfolgen zu meine 2 Fragen
// hex zu integer, ergibt 15
 
int dec = Convert.ToInt32("F", 16);
 
// dec zu hex. ergibt "F" 
 
string hex = Convert.ToString(15, 16);
Da ja ein String ja auch nur eine Variable darstellt, deshalb frage ich,
ob es möglich ist für das F zwischen den Anführungszeichen gleich die Bezeichnung eines Strings einzusetzen, welcher als Text/Wert das Zeichen F hat. Weiterhin würde ich in der zweiten Zeile, an Stelle der 15, den Namen einer Variable einsetzen, welche Ganzzahl 15 als Wert hat.
Allgemein kann man lesen, wenn eine Variable einen Wert hat und im Progammablauf präsent ist, dann kann mit dem Wert gearbeitet werden.
Habe ich das so richtig verstanden oder wäre es für meinen Beispiele anderst? So das wars fürs Erste. Aber weitere Fragen sind nicht ausgeschlossen. :)
Für Antworten bedanke ich mich im Voraus.

Viele Grüsse

Duda
 
Zuletzt bearbeitet:
Die Container sind etwas andere, teilweise gibt es keine direkte Entsprechung (std::set z.Bsp.). Der std::vector-Ersatz ist der List-Container. Bei den Containern immer die Generic-Variante vorziehen!
stringstream kannst du wunderbar durch den StringBuilder ersetzen.
size_t als Typ würde ich durch uint ersetzen. Die meisten Standard-Container benutzen aber int als Längentyp.

Das Zerlegen eines Strings geht ziemlich ähnlich dem std::string. Mit dem Index-Operator [] kanns du auf einzelne Zeichen zugreifen (nur lesend!), SubString ersetzt substr.

Sonst ist mir nicht ganz klar, weshalb du da Einzel-Zeichen-Strings benötigst.


Um einzelne Werte einem String zuzuweisen kannst du so vorgehen:

string gnu = "\x0f";
 
Hallo Endurion,

danke für Dein Schreiben. Möchte so gut es geht dazu Stellung nehmen, fange von hinten an. Ich habe 16 einstellige Hex-Zeichen, welche sich ohne Probleme in einen String als Text eingeben lassen würden. Aber warum soll ich die einzelnen Zeichen in einen String zusammensetzen, wenn ich ihn anschliessend wieder zerlegen und convertiere, weil ich mit jeden Wert der einzelnen Zeichen rechnen muß.
Bei Zahlen 0 bis 9 ist es nicht so das Problem, aber bei den Buchstaben A bis F schon, den diese muß ich erst in einen Zahlenwert convertieren.
Ich verstehe wie Du es meinst mit "string gnu = "\x0f";
Aber ich habe nun mal die 0 bis 15 als einstellige Hexzeichen und das kann ich nicht ändern. Wobei ich diese im Ablauf des Programmes in beide Richtungen umwandeln muß, was ja mit Hilfe von Convert gut geht.
Nun weißt Du, warum ich die Einzelzeichen mit ihren Werten benötige.
Ja, das mit dem nur lesendem Zugriff ist mir bekannt. Wobei auch einzelne Positionen und somit auf ihre Zeichen möglich sind.
Hierzu habe ich gleich noch eine ähnliche Frage, wie in meinem vorangegangenem Schreiben. Könnte ich in den eckigen Klammern direkt eine Variable einsetzen, welche als Wert die entsprechnde Zahl hat.
C#:
string str = "Test";
Console.WriteLine(str[0].ToString();
// ergibt "T"
// oder
Console.WriteLine(str[2].ToString();
// ergibt "s"
// oder
for(int i = 0; i < str.Length; i++)
Console.Write(str[i].ToString());
// ergibt "Test"

Über SubString habe ich auch schon so Einiges lesen können. Nur über die
Möglichkeiten mit einem Ersatz für den Vector-Container noch so gut wie nichts. Wenn ich wüßte, wie ich die C++-Code-Zeilen, welche mir von den Mitgliedern Cromon und Comfreek zur Verfügung gestellt wurde, so umbauen kann, daß Vector gegen List ausgetauscht werden kann und size, auch size_t gegen uint, dann bliebe nur noch der Austausch von stringstream gegen StringBuilder über. Wobei nicht vergessen bleiben darf, daß in while noch ein hex-modifier eingebaut ist, worüber ich in C# auch noch nichts lesen konnte. Hierzu noch diese wichtige Zeile in C++.
C++:
while(stream >> std::hex >> curValue)
Aber ich warte noch auf ein Buch mit über 500 Kochrezepten für C#. Vielleicht findet sich da ja was Passendes.
Ja wenn das Wörtchen "wenn" nicht wär, dann wäre Alles halb so schwer.
So das ist es mal wieder für heute. Halt, da fällt mir noch was ein.
Ach ich laß es lieber sein und frage beim nächsten Mal mit.

Viele Grüsse

Duda
 
Zuletzt bearbeitet:
Hallo Community,

ein Großstring mit 18 Zeichen,
dem sollen 18 kleine Strings entweichen.
Mit Substring ist sowas schnell bewegt,
die neuen Kleinstrings werden nicht zerlegt,
weil es ihnen mit Convert an den Kragen geht.
Hier werden sie in Ganzzahlen umgewandelt,
deswegen wird überhaupt nicht lang verhandelt,
Die Zahlen, die durch HexToDec dabei entstehn,
die wird man in vielen Berechnungen wieder sehen,
Die Variable "int Endsumme" wird ein Zahl ergeben,
welche auf die Position eines Tabellen-stringes zeigt.
Das Zeichen von dieser Position,
das ist nun schon der halbe Lohn.

Irgendwann gehts weiter, aber wahrscheinlich nicht in dieser Schreibweise.
Doch nun noch zu meinen aufgeschobenen Fragen in Bezug auf Substring.
C#:
string Großstr = "422748C08700843A";
 
// in kommender Zeile, geht das mit (0, 0) ?
// wie soll ich an das 1.Zeichen kommen?
// mathematisch über -1, ist keine Position
 string Klein1 = Großstr.Substring(0, 0);
 
// für weitere Zeichen ist alles klar
 
string Klein2 = Großstr.Substring(0, 1);
string Klein3 = Großstr.Substring(1, 1);
string Klein4 = Großstr.Substring(2, 1);
string Klein5 = Großstr.Substring(3, 1);
// und so weiter bis
string Klein17 = Großstr.Substring(16, 1);
string Klein18 = Großstr.Substring(17);
// ohne  2. Param. geht es durch bis Ende,
// ich meine bis zum letzten Zeichen.

Ich maches es auch nur ungern, daß ich den Großstring so zerlege, aber ich brauch die Ganzzahlen, wie oben beschreiben, wirklich oft im Programmablauf und es ist für mich machbar, weil ich nur die Variablen
händeln muß. Ich hoffe das es mit (0, 0) geht, sonst muß ich mir überlegen, ob ich noch ein weiteres unnützes Zeichen an 1. Stelle eingebe, welches die Position 0 einimmt, ich bin nämlich wirklich verunsichert, ob auf das Zeichen der Position 0 zugegriffen werden kann. Obwohl ich irgendwo gelesen habe, daß es hierfür in Form einer Abfrage auch eine Lösung machbar ist, aber es war wohl für C++ und
nachdem ich soviel gelesen habe, da weiss ich auch nicht ob ich was durcheinanderbringe.
Ich denke es war so: "ist es -1, dann wird 0 genommen", oder sowas in der Form. Naja ist erstmal auch egal, denn wenn es so geht, wie ich geschrieben habe, dann wird es eh nicht mehr benötigt.
So nun bin ich wieder ein Frage losgeworden. Für Antwort bedanke ich mich im Voraus.

Viele Grüsse

Duda
 
Zuletzt bearbeitet:
Die Parameter von Substring lauten StartIndex und Anzahl-Zeichen. Für das erste Zeichen musst du 0, 1 angeben (Index beginnt bei 0, und ab 0 ein Zeichen)

Ja, natürlich kannst du auch Variablen in die []-Klammern setzen

Du kannst das alles wunderbar in eine Schleife packen:

Code:
int   meineWerte = new int[Großstr.Length];

for ( int i = 0; i < Großstr.Length; ++i )
{
  meineWerte[i] = Convert.ToInt32( Großstr.substr( i, 1 ), 16 );
}
 
Hallo,

die vector - Entsprechung in C# ist die Klasse "List", oder du nimmst ein normales Array, wenn die Liste nicht dynamisch sein muss. Wenn du mit den numerischen Werten arbeiten willst, macht es tatsächlich wenig Sinn alles in einen string zu packen.
Code:
List<byte> HexValues = new List<byte>() { 0x04,
  0x02,
  0x02,
  0x07,
  0x04,
  0x08,
  0x0C,
  0,
  0x08,
  0x07,
  0,
  0,
  0x08,
  0x04,
  0x03,
  0x0A };

Gruß
MCoder
 
Zuletzt bearbeitet:
Hallo Endurion,

erstmal danke für Deine Hinweise. Was Du schreibst, erscheint mir einleuchtend. Es heißt eindeutig, ab dieser Position, in dem Fall 0, die Zahl nach dem Komma besagt, wieviel Stellen ab der 0, also nicht einschließlich der 0, somit komme ich nicht an das 1. Zeichen im String, welches ja Position 0 entspricht.
Meine Frage war/ist, wie kann ich das Zeichen der Position 0 erhalten? Denn so wie ich es sehe, erhalte ich mit (0, 1) das 2. Zeichen, mit (1, 1) das 3. Zeichen u.s.w.. Ich denke, daß ich auf diesem Weg nicht an das 1. Zeichen
herankomme. Deshalb war meine Idee, bei der Eingabe des Strings gleich ein Leerzeichen an erster Stelle eingeben, welches mich bei meinem Vorhaben nicht behindern würde und was man wenn nötig, auch schnell wieder mit TrimStart() entfernt werden könnte. Wobei mir dabei eventuell noch ein anderer Weg vorschwebt. Denn ich kann ja auch einen weiteren g string Großstr2 = " "; anlegen mit einem enthaltenem Leerzeichen und diesem Großstr2 dann den Großstr mit Concat anhängen, wobei ich dann Großstr2 zerlegen würde und ich brauchte dabei nicht auf Position 0 zuzugreifen.
Dies zu Deinen beiden ersten Zeilen, doch nun zu Deiner 3. Zeile.
Das gefällt mir, daß ich da die Variablen einsetzen kann.
Deine 4. Zeile betrifft die folgenden Code-Zeilen. Dem ist wohl nichts entgegen zu setzen, außer das Versehen Deinerseits, denn Du hast (.substr) geschrieben, was in C# ja Substring wäre. Ich bin natürlich den Code durchgegangen, denn ich wollte natürlich wissen, was letztendlich dann in "meineWerte" enthalten ist. Davon ausgehend, daß "Großstr" die Zeichenkette aus 1-stelligen Hex enthält, welche mit "new[Großstr.Length];"
dann "meineWerte" zugewiesen werden, wobei "for" so oft durchlaufen wird, wie die Länge von "Großstr" ist. Dabei erhöht sich dann "i" um jeweils einen Inkrement-Zähler (++i). So oft wird dann auch dem neuen String "meineWerte" durch "ConvertToInt32" ein Zeichen nach dem Anderem durch "Substring" zugewiesen, denn (i, 1) kann ich es entnehmen.
Es kann natürlich anderst sein, doch was Anderes fällt mir nicht ein.
Ich weiß, ich Texte dich zu, aber wie soll ich mit kurzen Worten was erklären, was mir gerade so einfällt.
Danke für Dein Lesen,
Und bis bald,

Duda
 
Hallo MCoder,

danke für Dein Feedback. Ich freue mich darüber sehr, aber ich bin wirklich noch ein schwerfälliger Anfänger in Sachen Programmieren. Und im Moment bin ich nur auf den Umgang mit Strings und andere Variablen fixiert. Es ist so, daß ich als Anwender nur die einstelligen HexZeichen habe,
Es ist wäre für mich natürlich einfach direkt die Zahlenwert auch für A bis F mit einzugeben, aber dann bliebe es nicht mehr 1-stellig und außerdem sollen nach diverse Berechnungen ja wieder 1-stellige HexZeichen das Resultat sein. Also bleibe ich bei den Hexzeichen für Input und Output.
Innerhalb des Programmes wird nur mit Integer in den Grundrechenarten und mit Modulo gerechnet. Dies nur mal als groben Überblick. Also im Grunde bleibt mir da nicht viel, denn es muß nur alles folgerichtig und nach den Konventionen von Visual C# aufgesetzt werden. Da ich aber nicht alles was ich wissen möchte, in Büchern oder I-Net finden kann, deshalb habe ich immer irgendwelche Fragen, welche ich oft nich eindeutig formulieren kann. Dies nur mal so am Rande, warum ich sicher oft zu viel schreibe, ohne auf den Punkt zu kommen.
Also nochmals danke für Deinen Versuch mir List näher zu bringen, aber ich bleibe wohl doch lieber erstmal bei dem, wo ich schon einen kleinen Enblick habe. Also machs gut und bis bald mal wieder.

Viele Grüsse

Duda
 
Erstmal danke für Deine Hinweise. Was Du schreibst, erscheint mir einleuchtend. Es heißt eindeutig, ab dieser Position, in dem Fall 0, die Zahl nach dem Komma besagt, wieviel Stellen ab der 0, also nicht einschließlich der 0, somit komme ich nicht an das 1. Zeichen im String, welches ja Position 0 entspricht.
Meine Frage war/ist, wie kann ich das Zeichen der Position 0 erhalten? Denn so wie ich es sehe, erhalte ich mit (0, 1) das 2. Zeichen, mit (1, 1) das 3. Zeichen u.s.w.. Ich denke, daß ich auf diesem Weg nicht an das 1. Zeichen
herankomme.
Mit (0,1) erhältst du schon das erste Zeichen. Der erste Parameter von Substring besagt, ab welcher Position im String begonnen wird (0 ist das erste Zeichen) und der zweite Parameter wieviele Zeichen verwendet werden.

Gruß
MCoder
 
Zurück