Psycho~zicke Geschrieben 16. September 2008 Geschrieben 16. September 2008 Hallo, ich hab da ma nen kleines Problem. Ich hoffe zumindest das es ein kleines ist. Ich soll ein Programm schreiben und aussenliegende Funktionen dafür benutzen. Das hat auch sehr gut geklappt. Leider funktioniert der letzte teil mit den Zeigern nicht so wie es soll... Kann mir vllt jemand weiter helfen?? Es kommt keine Fehlermeldung aber ich bekomme den Hexadezimalen wert nicht umgekehrt. Ich schreib ich mal meinen Quellcode und die aufgaben beschreibung dazu. Vllt weiß ja jemand woran es liegt... Das Fettmakierte ist mein Problemkind... Danke schon ma für die hilfe... *Schreiben Sie ein Programm das nach eingabe des Wertes und der gewünschten Basis die Zahl umrechnet und ausgibt. * *Programm in einzelnen Funktionen schreiben und Zeiger verwenden. **********************************************************/ #include <string.h> #include <ctype.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #define MAXCHAR 30 /* Meldungen an den Kunden und einlesen seiner antworten */ int iMeldung (int iEingabe, int iPos) { if (iPos == 0) { printf ("Bitte geben sie Ihre ganze Zahl ein\n\n"); scanf ("%d",&iEingabe); return iEingabe; } else { printf ("Bitte geben sie die gewünschte Basis an\n\n"); scanf ("%d", &iEingabe); return iEingabe; } } /* Berechnung der GanzenZahl in das gewünschte Zahlensystem mit ergebniss die ganze zahl die bliebt */ int iBerechnungGanzeZahl (int iEingabeZahl, int iBasisZahl) { int iGanzeZahl; iGanzeZahl = 0; iGanzeZahl = iEingabeZahl / iBasisZahl; return iGanzeZahl; } /* Berechnung der Ganzen Zahl in das gewünschte Zahlensystem mit ergebniss der rest der bleibt */ int iBerechnungRest (int iEingabeZahl, int iBasisZahl) { int iRest; iRest = 0; iRest = iEingabeZahl % iBasisZahl; return iRest; } /* Umrechnung von iRest in den Zahlenwert */ int iUmrechnungiRest (int iRest) { int iRestNeu; iRestNeu = 0; if (iRest >= 0 && iRest <= 9 ) { /* iRest % 10 +'0' = iRest wird umgewandelt auf Basis 10 also einem Zahlenwert + 0 Positionen in der Asci Tabelle. Ohne diese umwandlung bekommt man das Zeichen ausgegeben das an der Stelle der Asci Tabelle steht den wir als rest haben und nicht den Zahlenwert den iRest hat. */ iRestNeu = iRest % 10 +'0'; } return iRestNeu; } /* Umwandlung der Hexadezimalzahlen in Buchstaben falls iRest größer wie 9 sein sollte */ void sRestGroesserZehn (char *cBuchstabe, int iBasisZahl, int iRest) { if (iBasisZahl > 10) { switch (iRest) { case (10): { *cBuchstabe = 'A'; } break; case (11): { *cBuchstabe = 'B'; } break; case (12): { *cBuchstabe = 'C'; } break; case (13): { *cBuchstabe = 'D'; } break; case (14): { *cBuchstabe = 'E'; } break; case (15): { *cBuchstabe = 'F'; } break; } } } [B] void Umkehr (char *sZeile, int iEingabeZaehler) { char *sKehrZeile[MAXCHAR]; int iKehrEingabe; iKehrEingabe = 0; /* Übergabe der Zeichenkette sZeile an sKehrZeile. die Zeichenkette sZEile wird von hinten nach vorne an sKehrZeile übergeben so das das letzte Zeichen bei sKehrZeile als erstes Zeichen steht... */ while (iEingabeZaehler > 0) { --iEingabeZaehler; *sKehrZeile[iKehrEingabe] = sZeile[iEingabeZaehler]; ++iKehrEingabe; }[/B] } /* Beginn des Hauptprogramms */ void main () { char sZeile[MAXCHAR]; int iEingabeZaehler; int iEingabe; int iBasis; int iGanzeZahl; int iRest; int iUmrechnungRest; char cBuchstabe; int iPos; cBuchstabe = 'y'; iEingabeZaehler = 0; iUmrechnungRest = 0; iEingabe = 0; iBasis = 0; iGanzeZahl = -1; iRest = 0; iPos = 0; while (iBasis == 0) { /* Meldung an den Kunden welche Zahl er umgerechnet haben möchte und zu welcher Basis. */ iEingabe = iMeldung(iEingabe, iPos); ++iPos; iBasis = iMeldung(iBasis, iPos); if (iBasis > 16 || iBasis == 0) { printf ("Zahlen mit einer Basis höher 16 oder Basis 0 können nicht berechnet werden!!!\n\n"); iBasis = 0; } iPos = 0; } /* Berechnung der Ganzen Zahl in das gewünschte Zahlensystem */ while ( iGanzeZahl != 0) { /* Übergabe der errechneten Ganzenzahl an iGanzeZahl. &iZahl übergibt ihre Adresse an iZahl in der Funktion. Somit haben beide den selben inhalt und adresse. Es ist aber nur eine Kopie der adresse. */ iGanzeZahl = iBerechnungGanzeZahl (iEingabe, iBasis); /* Übergabe des errechneten restes an iRest. */ iRest = iBerechnungRest (iEingabe, iBasis); /* Falls Die Basis 1 ist */ if (iBasis == 1) { iRest = 0; iGanzeZahl = 0; } if (iRest <= 9) { /* Übergabe des errechnetenwertes an iUmrechnungRest */ iUmrechnungRest = iUmrechnungiRest(iRest); sZeile[iEingabeZaehler] = iUmrechnungRest; ++iEingabeZaehler; } /* Übergabe des errechnetenwertes (Heximalzahl größer 10) an iRestGroesserZehn. */ sRestGroesserZehn(&cBuchstabe, iBasis, iRest); if (cBuchstabe != 'y') { sZeile[iEingabeZaehler] = cBuchstabe; ++iEingabeZaehler; } /* Übergabe der Werte und Zähler zurücksetzen */ iEingabe = iGanzeZahl; cBuchstabe = 'y'; iRest = 0; } /* Zusammenführung der Einzelnen werte zu einer Zeichenkette */ sZeile[iEingabeZaehler] = '\0'; [B]Umkehr(&sZeile, iEingabeZaehler);[/B] /* Ausgabe der Umgewandelten Zahl */ printf ("Umgewandelte Zahl: %s\n\n", sZeile); } Zitieren
pit030771 Geschrieben 16. September 2008 Geschrieben 16. September 2008 char *sKehrZeile[MAXCHAR]; dir ist klar das du damit ein pointer array anlegst? damit legst du ein array von MAXCHAR chars an. die sind aber noch nicht allociert. deshalb wirst du hier den fehler haben *sKehrZeile[iKehrEingabe] = sZeile[iEingabeZaehler]; versuch es mal so sKehrZeile[iKehrEingabe] = &sZeile[iEingabeZaehler]; Zitieren
Psycho~zicke Geschrieben 16. September 2008 Autor Geschrieben 16. September 2008 war eigentlich der Meinung das ich das & nur bei der übergabe an die Parameter benutzen kann. Arbeite das erste ma mit Zeigern und habe das Prinziep wohl noch nicht wirklich verstanden. Aber ich werde es mal versuchen. Zitieren
pit030771 Geschrieben 16. September 2008 Geschrieben 16. September 2008 nein das kan man auch so int* p = NULL; int zahl = 10; p = &zahl; ist quasi das selbe wie bei der übergabe void fnk(int* p) { if(p != NULL) cout<<*p; } aufruf: fnk(&irgenwas); Zitieren
Psycho~zicke Geschrieben 16. September 2008 Autor Geschrieben 16. September 2008 ok dann versuch ich das mal so wie du vorgeschlagen hattest... Bei der Übergabe bleibt es aber gleich oder? Zitieren
pit030771 Geschrieben 16. September 2008 Geschrieben 16. September 2008 ja sicher. zeigerist auch so ne sache. das lernt man wirklich erst in der praxis. aber die grundzüge sollte man verstehen. Zitieren
Psycho~zicke Geschrieben 16. September 2008 Autor Geschrieben 16. September 2008 Bin ja grad dabei es zu lernen und zu verstehen. Ich werd das morgen gleich mal versuchen... Ich danke dir schon mal für deine hilfe... Zitieren
pit030771 Geschrieben 16. September 2008 Geschrieben 16. September 2008 Online-C++-Kurs Kapitel 17 - Pointer vieleicht hilft das etwas weiter. gerne Zitieren
Bubble Geschrieben 16. September 2008 Geschrieben 16. September 2008 Es kommt keine Fehlermeldung aber ich bekomme den Hexadezimalen wert nicht umgekehrt. Ich habe nicht das ganze Programm gelesen, sondern nur die Funktion "Umkehr". Ich gehe davon aus, dass "iEingabeZaehler" die Länge der Zeichenkette in Zeichen sein soll, "sZeile" ein Zeiger auf die umzukehrende Zeichenfolge ist und im gleichen Array/Speicherbereich auch die umgekehrte Zeichenfolge abgelegt werden soll. So wie die Funktion jetzt geschrieben ist, dreht sie die Zeichenkette zwar um, aber das Resultat (soll vermutlich in eimem Array mit dem Namen "sKehrZeile" abgelegt werden) wird nicht weiter verwendet, sondern beim Verlassen der Funktion "Umkehr" verworfen. Nebenbei: Das angelegte Array ist ein Array von Zeigern und damit sicherlich auch nicht das, was Du beabsichtigt hast. Das Dereferenzieren dieser Zeiger in der Zeile mit der Zuweisung kann daher durchaus zu Zugriffsverletzungen führen, da die Zeiger noch auf nichts zeigen. Der die Funktion aufrufende Programmteil erwartet jedoch scheinbar, dass das an die Funktion "Umkehr" übergebene Array nach dem Funktionsaufruf die umgekehrte Zeichenkette enthält. Es ist zwar möglich, ein Array mit der umgedrehten Zeichenfolge in das Eingabearray zu kopieren, besser wäre es aber, die Funktion so umzuschreiben, dass sie den Inhalt von "sZeile" ohne Hilfsarray umdreht. Bitte nicht falsch verstehen, aber Du solltest neben dem Programm auch die Kommentare verbessern. Zitieren
Psycho~zicke Geschrieben 16. September 2008 Autor Geschrieben 16. September 2008 @ Bubble Danke für die anwort. Ich weiß die Kommentare sind auch nicht grad die besten. Vervollständige sie normalerweise wenn ich das Programm fertig habe und es richtig läuft. Das jetzt sind mehr oder weniger nur anhaltspunkte für mich. Man kann den Inhalt von "sZeile" ohne hilfsarry umdrehen. Oh ok das wusste ich nicht. Bin davon ausgegangen das es nur so geht. Ja genau so hatte ich es eigentlich gedacht, das nach dem Funktionsaufruf in dem aufgerufenen Array die umgekehrte Zeichenkette steht. Zitieren
Bubble Geschrieben 16. September 2008 Geschrieben 16. September 2008 Man kann den Inhalt von "sZeile" ohne hilfsarry umdrehen. Oh ok das wusste ich nicht. Bin davon ausgegangen das es nur so geht. Ja, es geht ohne Hilfsarray. Du brauchst lediglich eine einzelne Hilfsvariable vom Typ char. Zitieren
Psycho~zicke Geschrieben 16. September 2008 Autor Geschrieben 16. September 2008 Ohh ok... Kann mir da jetzt grade im moment nicht vorstellen wie das gehen soll... Werde es mir aber mal durch den Kopf gehen lassen. Zitieren
Guybrush Threepwood Geschrieben 17. September 2008 Geschrieben 17. September 2008 Ansonsten kannst du dir auch mal das hier durchlesen: http://forum.fachinformatiker.de/c-c/62132-faq-vorschlag-dynamische-speicherverwaltung-c.html Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.