Zum Inhalt springen

Zeiger in C Programmen


Psycho~zicke

Empfohlene Beiträge

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);    

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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];

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ 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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...