Feld in Funktion übergeben



  • Hier mein Programm zur Umwandlung einer Binären Zahl in eine Dezimale.
    Ich möchte jetzt aber das die eingabe der Zahl im Main-Programm gemacht wird und der inhalt des feldes dann in die Funktion zur berechnung übergeben wird.
    Ich weiß aber leider nicht wie die aufrufe dafür heißen.

    int binaertodezimal(){
    	char binaer[len]
    	unsigned int y;
        int erg = 0;
        int mult = 1;
    		printf("Zahl:  ");
    		scanf("%s", binaer)
    
    		for (y = 0; y < len; y++){
    			if (binaer[y] == '\0'){
    				break;
    			}
    		}
    		for (y = y-1; y < len; y--){
    			if (binaer[y] == '1'){
    				erg += mult;
    			}
    			mult *= 2;
    		}
    
    	return (erg);
    }
    


  • int binaertodezimal(char* binaer)
    {
      ...
    }
    
    int main(void)
    {
      char bin[len];
      //Binärzahl eingeben lassen
      printf("%s(2) = %d(10)\n",bin,binaertodezimal(bin));
    }
    


  • #include <stdio.h>
    #include <string.h>
    
    int bin_to_dec ( char* binaer, unsigned int len )
    {
       unsigned int y;
       int erg = 0;
       int mult = 1;
    
       for (y = 0; y < len; y++)
       {
          if (binaer[y] == '\0')
    	  {
    		break;
    	  }
       }
    
       for (y = y-1; y < len; y--)
       {
           if (binaer[y] == '1')
    	   {
             erg += mult;
           }
                mult *= 2;
       }
        return erg;
    }
    
    int main()
    {
    	char bin[256];
    
    	printf("Zahl:  ");
        scanf("%255s", bin );
    	printf( "%d\n", bin_to_dec( bin, strlen(bin) ));
    
    	return 0;
    }
    

    Gruuhuuuß,
    p. 🙂



  • proggingmania schrieb:

    ...
    char bin[256];
    ...
    scanf("%255s", bin );

    Boom! Und schon einen Buffer Overflow gebaut. 👎



  • viel schlimmer finde ich, dass diese bin-to-dec oder eigentlich egal welche umwandlungsfunktionen von zahlenformaten immer so saumässig umständlich ausfallen. 😞
    ich bin für ein faq mit code für alle umwandlungen... 🙂



  • pale dog schrieb:

    viel schlimmer finde ich, dass diese bin-to-dec oder eigentlich egal welche umwandlungsfunktionen von zahlenformaten immer so saumässig umständlich ausfallen. 😞

    Sehr seltsame Risikobewertung.



  • Cool danke jetzt funzt es!
    Kann mir vllt auch noch jemand sagen wie ich das feld(rest)zurückgeben kann???
    Also das ich es nicht in der Funktion ausgeben muss.

    int dezimaltobinaer(int zahl){
    	int rest[10];
    	int i;
    	int y=0;
    
    	for (i=0;i<10;i++){
    		rest[i]= zahl%2;
    		zahl= zahl/2;
    	}
    	printf("Ausgabe\n\n");
    	while (i>0){
    		i--;	
    		printf ("%d", rest[i]);	
    	}
    
    	return (0);
    }
    


  • Im einfachsten Fall lässt du dir ein Array übergeben, das du dann befüllst. Oder du übergibst es als int* Rückgabewert (aber dann mußt du dafür sorgen, daß dein Array das Ende der Funktion übersteht).



  • Man muss sagen ich bin noch am Anfang der C-Programmierung.
    Deshalb versteh ich nicht wirklich was du mir sagen willst



  • Am einfachsten machst du das Feld einfach global, deklarierst es also außerhalb deiner dezimaltobinaer Funktion.

    char rest[10] = {"\0"};



  • Global Player schrieb:

    Am einfachsten machst du das Feld einfach global, deklarierst es also außerhalb deiner dezimaltobinaer Funktion.

    @mtx: Wenn du lernen willst, sauber zu coden, solltest du diesen Hinweis gleich wieder vergessen. Globale Variablen sind böse.

    An sauberen Lösungen kann ich dir drei anbieten:

    • der Aufrufer legt das Array an:
    void dez2bin(int zahl, char res[]/*optional: */,int ressize)
    {
      //erzeuge den Binärstring in res - notfalls mit Bereichsüberwachung
    }
    
    int main()
    {
      char binaer[9];
      dez2bin(255,binaer/*,9/)
      printf("255 ist %s",binaer);
    }
    

    Du mußt nur sicherstellen, daß du genug Speicher bereitstellst

    • Datenanforderung auf dem Heap:
      }[/cpp]Der Aufrufer muß zwar nicht mehr wissen, wieviel Platz er braucht, aber er muß den reservierten Speicher wieder freigeben
    • statische Variable:
    char* dez2bin(int zahl)
    {
      static char res[8*sizeof(int)+1];
      //erzeuge den Binärsting in res
      return res;
    }
    
    int main()
    {
      char* binaer = dez2bin(255);
      printf("255 ist %s",binaer);
    
      //geht sogar kürzer:
      printf(" und 1025 ist %s",dez2bin(1025));
    }
    

    Wichtigster Nachteil hier: Du mußt die Rückgaben sichern, bevor du das nächste Mal deine Funktion aufrufst, weil sie sie sonst überschreibt


Anmelden zum Antworten