Problem mit Zeigern



  • Hallo 🙂 ich wollte eine Funktion schreiben die eine Dezimalzahl binär umwandelt (vorgabe ist das es durch ein Algorithmus erfolgen soll).
    Daher wollte ich den int Wert an die Funktion geben und ein Array zugeben nur das klappt leider nicht, vielleicht kann mir einer helfen(,ich hab mit Zeigern noch nicht gearbeitet).

    #include <stdio.h>
    #include <string.h>
    
    int bin(int dez){
    	char bit[32];
    	int iergeb, rest = 1, i=0;
    
    	while(rest != 0 || i == 32){	// dez = 123
    		i++;
    		iergeb = (dez / 2); // = 61 
    		rest = bit[i] = dez - (2 * iergeb); // 1 = 123 - (2 * 61) 
    	}
    	return (&bit[0]);
    }
    
    int main(void){
    	// Deklaration
    	char *ausgabe;
    	int dezi = 0;
    
    	do{
    		printf("bitte geben Sie eine Dezimalzahl ein zwischen 0 und 255\nEingabe: ");
    		scanf("%i", &dezi);
    	}while(dezi>255 || dezi < 0);
    
    	//Umrechnung in Binär
    	//ausgabe[]  
        *ausgabe = bin (dezi);
    	printf("die binaere Ausgabe von %i ist %s", dezi, *ausgabe);
    
    }
    


  • Du willst eine Zeichenkette ausgeben, da mußt du auch den richtigen Rückgabetyp verwenden - char* bin(int dez){...} . Und auf der Empfängerseite mußt du deinen Zeiger nicht dereferenzieren.

    Aber du hast in dem Programm noch ein anderes Problem: du übergibst einen Zeiger auf ein lokales Array - und kein Mensch kann dir garantieren, daß dort beim printf()-Aufruf noch sinnvolle Werte drinstehen.

    PS: Wozu hast du eigentlich die Beschränkung auf 0..255 (8 Bit) eingebaut, wenn du in der Umwandlungsfunktion mit maximal 32 Bit umgehen kannst?



  • hmm, dein problem ist derzeit auch noch, dass du lokal in der funktion ein char-array an legst, welches du zurückgeben willst, allerdings willst du es zurück geben und hast als rückgabe-typ nicht char *, wie es nötig wäre, sondern int.
    das nächste problem ist, dass das array lokal ist, von daher knallt es wahrscheinlich, wenn du auf den inhalt zugreifen musst. ein sinnvoller ansatz wäre es, den speicher in der aufrufenden funktion reservieren zu lassen:

    void bin (int dez, char * rueckgabe)
    {
    //dein code, also eigentlich das, was du mit dem bit - array machst
    }
    
    int main (int argc, char ** argv)
    {
    char ausgabe[32];
    //...
    bin(dezi, ausgabe);
    printf("die binaere ausgabe von %i ist %s\n", dezi, ausgabe);
    }
    

    }



  • Jetzt weiß ich was ihr meint 😞

    int bin(int dez, char *rueckgabe){
    	char bit[32];
    	int iergeb, rest = 1, i=0;
    
    	while(rest != 0 || i == 32){	// dez = 123
    		i++;
    		iergeb = (dez / 2); // = 61 
    		rest = bit[i] = dez - (2 * iergeb); // 1 = 123 - (2 * 61) 
    	}
    	rueckgabe = &bit[0];
    	return (*rueckgabe);
    }
    
    int main(int argc, char ** argv){
    	// Deklaration
    	char ausgabe[32];
    	int dezi = 0;
    
    	do{
    		printf("bitte geben Sie eine Dezimalzahl ein zwischen 0 und 255\nEingabe: ");
    		scanf("%i", &dezi);
    	}while(dezi >255 || dezi < 0);
    
    	//Umrechnung in Binär
    	//ausgabe[]  
        bin (dezi, ausgabe);
    	printf("die binaere Ausgabe von %i ist %s", dezi, *ausgabe);
    
    }
    

    die vorgabe das die Dezimalzahl nicht größer als 255 sein soll war auch gegeben, gibt es denn eine funktion um den speicher einer funktion reservieren zu lassen?



  • fluffy17 schrieb:

    die vorgabe das die Dezimalzahl nicht größer als 255 sein soll war auch gegeben,

    Na dann reichen auch 8 Zeichen (eigentlich 9 - du brauchst noch Platz für die Stringende-Kennung) aus, um die Binärdarstellung unterzubringen.

    gibt es denn eine funktion um den speicher einer funktion reservieren zu lassen?

    Du könntest mit malloc()/calloc() Speicher anfordern (den das Hauptprogramm nach der Ausgabe mit free() freigeben muß), oder du verwendest ein static-Array in der Funktion (da muß der Aufrufer aber die Rückgabedaten verarbeitet haben, bevor er den nächsten Wert umwandeln kann).

    (in C++ würde ich einen std::string verwenden (oder noch besser - ein bitset<>))



  • hier im C board gibt's massenweise threads, die sich mit umwandlung ins binäre zahlensystem beschäftigen. such doch einfach mal.
    🙂



  • du kannst in der funktion auch direkt auf dem array namens rueckgabe arbeiten und return-wert brauchste nimmer, wenn du mit dem rueckgabe-array arbeitest, kannste in der aufrufenden funktion danach damit auch weiter arbeiten. return-wert ist eigentlich überflüssig so.
    mit malloc, realloc und free würde ich an deiner stelle noch nicht anfangen, ich denke, da braucht man dafür schon ein wenig fundierte kenntnisse in c, aber wenn du der funktion den speicher bereitstellst, indem du einfach n hinreichend großes array in der aufrufenden funktion (hier: main) an legst, dann passt des so.


Anmelden zum Antworten