Fragen zur Machbarkeit in C/C++

Hi Cromon, ComFreek und Comunity!

Guten Morgen zusammen, nachdem ich das, was ich zuletzt von mir gegeben habe, nun überschlafen habe,
da ist mir aufgefallen: "Ich habe mich in eine Idee verrannt und mir mein Gehirn verbrannt".
Naja, Selbsterkenntnis kann auch zur Besserung beitragen. Also ich möchte nachbessern.

Mit dem "P16" soll natürlich keine Variable gebildet werden, sondern eine Variable mit dem Namen
"P16" gesucht werden, damit sie mir den Buchstabe "G" als ihren Wert zurück gibt.

Das heißt es soll nach der Variable im Speicher gesucht werden. Dazu fällt mir ein,
vielleicht hat das Mitglied mit dem Namen jkallup ja schon so eine ähnliche Funktion zum Suchen aufgezeigt.
In seinem Code-Ausschnitt ist zwar von scannen die Rede, aber es könnte auch Suchen sein.

Doch nun höre ich mal auf meinen Gedanken freien Lauf zu lassen, sonst kommt nur noch mehr durcheinander.

Viele Grüsse

Duda
 
Hallo Duda!

Du möchtest also eine Zahl in einen Buchstaben umwandeln, wobei die Menge der möglichen Zahlen begrenzt ist, oder?

Vielleicht kannst du uns dein eigentliches Anliegen bzw. das, was du machen willst, schildern.
Ansonsten würde ich das so lösen:
C++:
const std::string alphabet = "abcdefghijklmnopqrstuvwxyz";

// Zugriff
alphabet[0]

Statt der Null kannst du nun eine (auch nichtkonstante) Variable verwenden, z. B.:
C++:
// std::string[] (Zugriff über eckige Klammern) erfordert den Index als size_t (=ein Datentyp).´
// int würde zwar auch gehen, doch der Compiler würde wahrscheinlich bei alphabet[meineVariable]
// wegen der int-->size_t Konvertierung meckern
size_t meineVariable;

std::cout << alphabet[meineVariable];
 
Hallo ComFreek,

danke für Deine Antwort. Ich muß mir Deine Vorschläge erstmal einverlaiben, daß heißt mich damit vertraut machen. Doch vorher möchte noch Deine Frage beantworten. Also ich habe aus dem Code von Cromon in der letzten Zeile ein Ergebnis, welches ich weiter verarbeiten möchte.

Hier die Zeile, welche ich meine: unsigned int sum4 = sum3 % 34

Das Ergebnis der vorgenannten Zeile liefert mir die Zahlen 0 bis 35.
Diese Zahlen sollen 0 bis 9 sowie A bis Z als Endergebnis zeigen.

Zu diesem Zweck schreibe ich ins Programm oder in eine Headerdatei, eine eigene kleine Tabelle, welche wie folgt aussehen soll:
0 = '0'
1 = '1'
usw.
9 = '9'
10 = 'A'
usw.
35 = 'Z'

Ich möchte noch darauf hinweisen, daß ich nicht die ASCII-Tabelle benutzen möchte. Nur wenn es wirklich nicht anderst machbar ist,
dann würde ich es tun. Dafür hätte ich auch eine Lösung, welche dann
mal zur Diskusion stellen würde.

Doch nun habe ich erstmal Deine Frage beantwortet.
Machs gut und bis bald.

Viele Grüsse

Duda
 
Hallo Duda,

dann mach es doch so, wie ich es oben beschrieben habe:
C++:
const std::string alphabet = "0123456789abcdefghijklmnopqrstuvwxyz";
(Du musst noch die ganzen Buchstaben in Großbuchstaben umwandeln ;) )
Der String ist - wenn du so willst - auch eine Tabelle. Mittels eines Indexes (Position) kannst du das jeweilige Zeichen zurückgeliefert bekommen.
 
Hallo ComFreek,

guten Abend und danke für Deine umgehende Antwort. Ich bin in der Zwischenzeit Deine Code-Zeilen durchgegangen. Ich dachte mir, wenn ich die Zahlen davor hätte und die Buchstaben in groß wären, dann würde es
eigentlich gehen. Wobei ich nicht wußte, wie man auf die Alphanumerics in diesem String zugreifen kann. Ich meine dieses "size_t meineVariable;",
da wußte ich noch nichts mit anzufangen. Doch nun, nachdem Du noch eine Bestätigung mit dem Hinweis auf die "Positionen" im String gibst,
da kann ich mir vorstellen wie es funktioniert. Doch nun gleich eine weitere
Frage von mir. Wie sieht es aus, ist die erste Position im String 0 oder 1.
Hast noch einen weiteren Tipp, wie ich die Zahlen aus "sum4" nach "size_t" an die Stelle von "meineVariable" bekomme, damit auch automatisch der
entsprechen Buchstabe oder Zahl zurückgegeben wird. Im Prinzip wäre es
dann eine brauchbare Problemlösung für diesen Teil des Programmes.
Ich habe natürlich noch mehr hinterhältige Fragen. Denn nun scheint ein
wichtiger Teil des Programmes durch Cromon gelöst und durch Dich wird der Abschluß realisiert. Doch dies sind nach meiner Schätzung erst 25% vom Programm was mir vorschwebt. Es ist ein Hobby-Projekt, über das ich erst berichten möchte, wenn es von Erfolg gekrönt ist.
Bin natürlich bereit über Email bei den mir Helfende zuberichten um was es geht. Es ist nicht Kriminelles und auch keine geheime Kommandosache, aber ich weiss, daß auch Andere sich dafür interessieren. Deshalb möchte ich es noch nicht publik machen, ich hoffe dafür auf Euerer Verständnis.
Ich habe viele Wochen damit zugebracht, um heraus zu bekommen, wie diverse unterschiedliche Berechnungen aufgebaut sind, um als Ergebnis mehrere Prüfziffern zu erhalten, welche dann in Form von
Buchstaben oder Zahlen sichtbar werden.
Ich höre mal auf, sonst wird es noch ein Roman.

Also danke und viele Grüsse

Duda

______________________________________

Hi ComFreek,

meine Frage inmeinem vorangegangenem Schreiben hat sich ja wie von allein erledigt,
denn Du hast ja schon geschrieben, daß ich an Stelle von "0" auch eine Variable einsetzen kann.
Ich denke Du meinst, die eckigen Klammern hinter "alphabet [0]" in der ersten Codezeile von Dir.
Ja nun scheine ich langsam dahinter zu steigen. Ich denke es macht nicht,
wenn ich alphabet im ganzen Code in alphanumerics umtausche und das Ganze dann so aussieht:

const std::string alphanumerics = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Zugriff

Alphanumerics[sum4];

ich gehe mal davon aus, daß es geht, aber ich habe noch eine Anmerkung,
denn Deinen nachfolgenden Kommentaren entnehme ich, daß es aber auch dazu führen kann,
daß der Compiler keckert, wegen dem Datentyp int.
Sollten da vorher noch die Zahlen in Strings umgewandelt werden
Ich lese in einen meiner Bücher und setze da mal mein sum4 ein:
sprintfstr, "%d", sum4);
hierdurch würde der Inhalt von sum4 in einen String umformatiert, und gespeichert wird in str.
Es wird dann darauf hingewiesen, daß str nicht vom Typ string sein kann und str als ein Feld von einzelnen Zeichen(char) definiert werden müßte.
Zum Beispiel: char str[hier drin die Anzahl meiner alpanumerics];
was für mich bedeutet das ich hier 36 reinschreiben müßte.

Aber ich mache hierzu erstmal Schluß mit meinen Hinterfragungen,
denn es ist für mich im Moment alles noch zu Viel um es behalten zu können.

Viele Grüsse

Duda

______________________________________

Hallo ComFree,
Ja, ich bin es schon wieder, der Dir auf den Geist geht, aber es läßt mich einfach nicht in Ruhe und ich denke an Dies und Das, was Du mir geschrieben hast. Ich will nun auch nicht Deine Kommentare hier noch einmal ausbreiten, aber ich habe darin gelesen, daß hier nun auch eine nicht konstante Variable verwendet werden kann. Und die "sum4" ist ja keine Konstante, denn der Wert ändert sich ja, je nach dem was ich zur Berechnung kommt. Hier nochmal Deine Beispielzeilen:

size_t meineVariable;
std::cout<<alphbet[meineVariable];

wäre das Dein Lösungsangebot, damit der Compiler nicht meckert und gleichzeitig für eine nicht konstante Variable. Dann werde ich wohl diesen
Weg beschreiten müssen. oder siehst Du es anderst?

Also dann sähe es bei mir so aus:

sum4 = sum3 % 34;
const std::string alphanumerics = "0123 ...9ABC.....Z";
// zugriff nicht über alphanumerics[0], sondern wie folgt
size_t sum4;
std::cout<<alphanumerics[sum4]

entschuldige bitte, wenn ich noch so unkonventionell schreibe und keinen Editor benutze um dann die Codezeilen als Datai hochzuladen, was sicher
für einen Programmierer was alltägliches ist, aber ich bin ein Grünschnabel, welcher eigentlich nichts mit der Farbe Green zu tun hat, aber diese angedeutete Green bezieht sich auf den unreifen Fruchtzustand,
denn unreif sind die Früchte meistens green. Ja, der Schnabel von Federvieh
ist aus Horn, welches nichts mit dem Horn als Blasinstrument zu tun hat, aber es sind irgendwelchen Urrinder/Auer gewesen, welche ihre Hörner
gespendet haben, damit sie ausgehöhlt als Signalhorn oder zum trinken von Met benutzt werden konnten. Ich weiß wirklich nicht wie es in der englischen Sprache Greenhorn heißt. Im deutschem Sprachgebrauch ist es leichter zu auszumachen, warum ein unreifes Früchtchen( welches noch keine Erfahrungen gemacht hat, also noch nicht viel rumgekommen ist und deshalb noch nicht viel weiß), dann mit Grünschnabel betitelt wird.
Es ist zwar schon lange her, aber ich erinnere mich noch genau, als ich so ein vorlauter und "mitredenwollender" Bengel war, da habe ich es oft zu hören bekommen: "Du Grünschnabel bist jetzt erstmal still"!
Aber hier im Forum bin ich gern ein Grünschnabel, nach der Devise:
Wer nicht fragt ist dumm, weil er unwissend bleibt. Okay, viele Allwissende wissen auch nicht Alles, aber sie wissen wo es nachzulesen ist.
Nun mal wieder Schluß mit meiner Kurzgeschichte.

Weiterhin, viele Grüsse an Alle

Duda
 
Zuletzt bearbeitet von einem Moderator:
1. Konstant ist der String. Es geht nicht um den Index (die Zeichenposition), der konstant sein muss.
entschuldige bitte, wenn ich noch so unkonventionell schreibe und keinen Editor benutze um dann die Codezeilen als Datai hochzuladen, was sicher für einen Programmierer was alltägliches ist
Du kannst ruhig den Code in den Beitrag aufnehmen, allerdings umschließe ihn bitte mit Code-Tags: [code=cpp]Jetzt dein Code.[/code]. Du kannst im Editor auch den Button links vom Entwurfsbutton (Diskette) drücken und Code auswählen. Im Dialog wählst du bei Sprache C++ in deinem Fall aus.
Bei größeren Dateien (>150 - 200 Zeilen ungefähr) würde ich allerdings einen Dateiupload empfehlen.

2. Du kannst von int zu size_t solltest du so konvertieren:
C++:
if (sum4 > 0 && sum4 < alphanumerics.size()) {
  size_t position = static_cast<size_t>(sum4);
}
else {
  // sum4 ist sowieso außerhalb des (logisch) möglichen Bereiches.
}

3. Ich habe deine Beiträge zusammengeführt.
 
Zuletzt bearbeitet:
Hallo ComFreek,

zuerst Danke. Wenn ich Dich nun richtig verstanden habe, dann muß ich nach dem "sum4" wie folgt fortfahren:

C++:
unsigned int sum4 = sum3 % 34;
//nun folgt als Erstes der String als Tabellenersatz
const std::string alphanumerics = "0....9A....Z";
//nun kommt die Konvertierung von int zu size_t
if (sum4 > 0 && sum4 <alphanumerics.size ()) {
     size_t position = static_cast<size_t> (sum4);
}
     else
            {
// Dein Komentar, und eine Frage von mir.
// wird eventuell bei >0, die 0 irgendwie beeinträchtigt?
// Wenn ja, dann wäre <36 auch eine Möglichkeit oder?
}
size_t sum4;
// oder wird der letzte Aufruf nicht mehr gebraucht?
std::cout<<alphanumerics[sum4]
// Hiermit sollte sich eine Position zu erkennen geben.

Mal sehen ob ich alles richtig gemacht habe.

Viele Grüsse

Duda
 
Zuletzt bearbeitet von einem Moderator:
Ich habe leider selbst einen (logischen) Fehler im Code gehabt. sum4 kann freilich gleich 0 sein. Deswegen muss es ">= 0" heißen.
"< 36" brauchst du nicht, da "alphanumerics.size()" schon die Größe des Strings gibt (=36).

Was willst du machen, wenn sum4 außerhalb des gültigen Bereiches liegt? sum4 könnte theoretisch auch negativ werden (siehe hier - ist allerdings noch der alte Standard, sollte beim neuen aber genauso sein.)

Mein Vorschlag:
C++:
const std::string alphanumerics = "0....9A....Z";
unsigned int sum4 = sum3 % 34;
if (sum4 > 0 && sum4 <alphanumerics.size ()) {
 size_t position = static_cast<size_t> (sum4);
 std::cout << alphanumerics[sum4];
}
else {
 // Hier nur eine beispielhafte Fehlermeldung!
 std::cout << "Ein Fehler trat auf.";
}
 
Hallo ComFreek,

das mit der 0 ist mir nur so in den Sinn gekommen. Und mit einem <= ist es aus der Welt. Nur muß hier ich hier aufpassen, den das = muß recht von > oder < stehen, denn es ist gleich und dann wieder größer oder kleiner, da wundert sich der Compiler aber. Zu einer Null-Berechnung wird es wohl nicht kommen und zu Minuswerten führen die davor durchgeführten
Berechnungen in keinen Fall, also in dieser Hinsicht brauchen wir uns keine Gedanken machen. Danke für die Berichtigung und für Dein Beispielcode.
Nun muß ich mir überlegen, wie ich erklären kann, was noch ansteht im
geplanten Programm. Doch dazu dann zu einem späterem Zeitpunkt.

Bis dahin VG

Duda
 
Hallo Cromon, ComFreek and Comunity,
ich begrüsse Euch erstmal mit meinem Avatar, war nicht so leicht den Schnabel etwas grün zu machen. :) :) :) Aber das ist es nicht allein
was ich Euch noch mitzuteilen habe. Möchte nun so gut ich kann auch zum Anfang im Programm kommen und beim nächsten Mal dann wie es weitergeht. Den Lesern, die hier bisher mitgelesen haben, denen sind ja nun die Code-Beispiele von Cromon und ComFreek bekannt.
Ich möchte nochmal auf den Code von Cromon zurück kommen. Derartige Berechnungen kommen noch mehrmals vor im Programm. Nur mit unterschiedlicher Stringlänge(Zeichenanzahl). Mal wird die eine addierte Hälfte multipliziert und mal die andere addierte Hälfte, auch mal ohne Multiplikation oder mit anderen Zahlen bei Modulo. Für all diese Berechnungen kann ich den Code von Cromon bestens gebrauchen, denn es es muß nur Weniges abgeändert werden, weil es immer einstellige Hexzeichen sind, welche Verarbeitet werden.
Allerdings ist die erste Eingabe ins Programm eine Zeichenkette, ein String mit 16 einstelligen Zeichen(10 Buchstaben und am Ende 6 Zahlen aus der improvisierte Aphanumeric-Tabelle von ComFreek ). Die Zahlen sollen berechnet werden, also wieder in zwei Hälften wie bekannt addieren.
Als Ergebnis suma und sumb, die jeweiligen Werte kommen an anderer Stelle zur weiteren Berechnung. Die Buchstaben sind für das Programm unrelevant, denn sie sind nur die Kennzeichnung woher die 6 Zahlen sind und wofür alle nachfolgenden Berechnungs-Ergebnisse verwendet werden.
Naja, für eine Ergebnis-Ausdruck auf Papier sind sie doch gut angebracht,
sonst muß man sie handschriftlich aufs Papier bringen. Nun meine Frage hierzu, kann man nur auf die letzten 6 Positionen des Strings zugreifen und berechnen wie beschrieben. Oder die Buchstaben bei der Berechnung irgendwie ausklammern, sonst müßte ich als Notlösung in diesem String nur die 6 Zahlen eingeben, wobei mir für eine Druckerausgabe dann die
Kennzeichnung fehlen würde, also doch mit Handschrift nachbessern,
was eventuell nicht notwendig sein muß.
Ich weiss, daß ich sicherlich zu viel schreibe, aber ich habe Probleme mich kurz zu fassen und dann möchte ich auch ausführlich schreiben, daß es jeder Leser verstehen kann.

Viele Grüsse

Duda
 
Zurück