C kleines Pointerproblem, wo ist der Fehler ?

ThE_sMoKeY_jOe

Lt. Junior Grade
Registriert
Mai 2004
Beiträge
472
Hey,

versuche gerade etwas mehr mit Pointern zu arbeiten, bzw. einige Programme zur Übung umzurüsten und das return zu entfernen.
Ist mir schon fast peinlich bei diesem Programm nicht zu sehen wo der Fehler ist aber hab bis jetzt noch nicht mit Pointern programmiert.

Das Programm soll die Anzahl der Stellen einer eingegebenen Zahl ermitteln also z.B. bei 554 zeigt es 3 an, sollte es zumindest und tut es auch mit Return, im jetzigen Zustand gibt er mir 0 zurück.

Danke

Code:
#include<stdio.h>
#include<stdlib.h>
#define MAXEL 100


void stellen(int n, int *zaehler)
{

    if(n>0)
    {
      n=n/10;
      stellen(n, zaehler++);
    }
    else
    {
      //return zaehler;
    }

}


int main(void)
{
    int zahl, ergebnis=0, i=0;

    printf("\nBitte geben Sie eine ganzzahlige Dezimalzahl >0 ein:");
    scanf("%d", &zahl);

    //ergebnis=ergebnis+stellen(n);
    stellen(zahl, &i);
    printf("\nDie Zahl hat %d Stellen", i);




}
 
In der Methode Funktion weißt du zaehler ja nie etwas zu, er kann sich also garnet verändern bzw du müsstest auch im rekursiven Aufruf die Referenz übergeben!

Das obere ist unsinn!
 
Zuletzt bearbeitet:
Dein "zaehler++" schiebt die Pointer-Adresse eine Stelle weiter. Du willst aber den Inhalt der Pointer-Adresse erhöhen. Du musst ihn also erst dereferenzieren
 
Zuletzt bearbeitet:
Ist zwar schon ein bisschen später, aber du vergisst hier den Dereferenzierungsoperator. Im jetzigen Zustand zeigt deine Zeigervariable nach ++ auf eine andere Stelle (um die Größe eines ints), aber du willst ja den Inhalt ändern. Ansonsten hab ich auf die schnelle keinen weiteren Fehler gefunden, übrigens ne gute Idee mit der Rekursion, ich hab das mal umständlich mit ner for-Schleife gemacht... :)

/edit: Mist, sogar um die Uhrzeit sind andere schneller ;)
 
Es wurde schon alles wichtige gesagt.
Mit zaehler++ läufts du ein Element weiter im Array.
Mit (*zaehler)++ erhöhst du den Wert um 1, der Zeiger bleibt aber an der gleichen Stelle. Wichtig ist hier die Dereferenzierung mit Stern (*), die Klammern verdeutlichen die Reihenfolge der Operationen.
 
Danke,

war mir gerade echt nicht sicher und hab mir auf 20 verschiedenen Seiten die Erklärung zur Dereferenzierung angeschaut, hab es jetzt auch verstanden.

Gibt man das Verweisoperator mit an, z.B. pa*, so greift man nicht auf die Adresse zu, sondern auf den Bereich im Arbeitsspeicher, auf den der Zeiger zeigt. Sie können dann den Wert auslesen oder verändern. Man spricht hier von einer Dereferenzierung. Anhand des Zeigertyps weiß der Compiler, was zusammen gehört, auf wieviele Bytes also zugegriffen werden darf.

Hab aber so oft gesucht weil ich dachte ich hätte wieder was falsch verstanden, denn es funktioniert nicht wenn ich zaehler*++ *zaehler++ (*zaehler)++ oder sonstwas mache.

Zeigt mir dann diese Warnung :

"warning: passing argument 2 of 'stellen' makes pointer from integer without a cast|"

und das Ausführen des Programms führt zu einem Absturz.
 
Schreibst du *zaehler in den Funktionsaufruf, funktioniert das Programm nicht mehr, weil das übergebene Argument ja kein Zeiger mehr ist, sondern eine Integer-Variable. Das besagt auch die Fehlermeldung, es soll (ohne Aufruf) aus einem integer ein Zeiger gemacht werden.
Der einfachste Weg ist, die Inkrementierung einfach eine Zeile vor dem Funktionsaufruf zu machen. Ich bin mir auch gar nicht sicher, ob diese Schreibweise als Parameter überhaupt zulässig wäre: &((*zaehler)++)
 
Danke Tapion, jetzt hab ichs verstanden :).
Habe eine Zeile drüber ++*zaehler; und im Funktionsaufruf nurnoch zaehler als Zeiger stehen.
Spitze, dankeschön.
Kann ich ja endlich Schlafen gehen :D
 
Zurück
Oben