Frage zur C-Code



  • Hallo,
    ich habe bezüglich zur einen C-Code eine frage: Was macht dieser Programm? Kann das mir einer erklären bitte.

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    
    void set_flag_v2(unsigned int flag_number, void *adr)
    {
    	char *pc = (char *)adr;
    	int ioff = (flag_number - 1) / 8;
    	int ibit = (flag_number - 1) % 8;
    	pc[ioff] = pc[ioff] | (1 << ibit);
    }
    
    void clear_flag_v2(unsigned int flag_number, void *adr)
    {
    	char *pc = (char *)adr;
    	int ioff = (flag_number - 1) / 8;
    	int ibit = (flag_number - 1) % 8;
    	pc[ioff] = pc[ioff] & (~(1 << ibit));
    }
    int test_flag_v2(unsigned int flag_number, void *adr)
    {
    	char *pc = (char *)adr;
    	int ioff = (flag_number - 1) / 8;
    	int ibit = (flag_number - 1) % 8;
    
    	if (pc[ioff] & (1 << ibit))
    	{
    		return 1;
    	}
    	else {
    		return 0;
    	}
    }
    
    void main()
    {
    	char q;
    	void *Feld;
    	int n;
    	int i, j, flag;
    	for (;;)
    	{
    
    		printf("Bitte geben Sie eine positive Zahl ein: ");
    		scanf_s("%d", &n);
    		printf("Es werden %d Bytes angefordert\n", n);
    		Feld = ((void*)malloc(sizeof(int)*n));
    		if (n == 0)
    		{
    			break;
    		}
    		if (Feld == NULL)
    		{
    			printf("Allokation war nicht erfolgreich\n");
    
    		}
    		else
    			printf("Die Allokation war erfolgreich\n");
    		i = 1;
    		while (i <= n)
    		{
    			set_flag_v2(1, Feld);
    			i++;
    		}
    		i = 2;
    		while (i <= n)
    		{
    			j = 2;
    			while (j <= (n / i))
    			{
    				clear_flag_v2((i*j), Feld);
    				j++;
    			}
    			i++;
    		}
    		i = 2;
    
    		printf("Bitte # eingeben um die Ausgabe zu starten:\n ");
    		scanf_s("%c", &q);
    
    		if (q == '#')
    		{
    			while (i <= n)
    			{
    				flag = test_flag_v2(i, Feld);
    				if (flag) printf("%d\t ist eine Primzahl\n ", i);
    				i++;
    			}
    		}
    
    	}
    	fflush(stdin);
    	getchar();
    	free(Feld);
    }
    

    Ich bin für jede hilfe dankbar.
    Gruß



  • Das Programm hat 96 Zeilen. Welche davon verstehst du nicht? Ansonsten sehe ich es nicht ein, für alle einzelnen Zeilen eine längliche Erklärung zu schreiben.

    Wenn man jetzt streng wäre, wäre die Antwort "das Programm ist nicht korrekt" richtig. Was soll "void main" sein? Mehr sehe ich jetzt nicht, ohne einen Compiler zu bemühen.



  • Hallo,
    Tut mir leid, natürlich nicht das ganze Programm. Sondern nur dieser Teil:

    void set_flag_v2(unsigned int flag_number, void *adr) 
    { 
        char *pc = (char *)adr; 
        int ioff = (flag_number - 1) / 8; 
        int ibit = (flag_number - 1) % 8; 
        pc[ioff] = pc[ioff] | (1 << ibit); 
    } 
    
    void clear_flag_v2(unsigned int flag_number, void *adr) 
    { 
        char *pc = (char *)adr; 
        int ioff = (flag_number - 1) / 8; 
        int ibit = (flag_number - 1) % 8; 
        pc[ioff] = pc[ioff] & (~(1 << ibit)); 
    } 
    int test_flag_v2(unsigned int flag_number, void *adr) 
    { 
        char *pc = (char *)adr; 
        int ioff = (flag_number - 1) / 8; 
        int ibit = (flag_number - 1) % 8; 
    
        if (pc[ioff] & (1 << ibit)) 
        { 
            return 1; 
        } 
        else { 
            return 0; 
        } 
    }
    

  • Mod

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.



  • Das Programm hat Fehler (z.B. der weiterer Programmablauf bei Feld = NULL) und der Autor weiß nicht, was er tut (z.B. Zeile 80).


  • Mod

    Ich finde Zeile 48 sehr interessant. Das passt nicht so recht dazu, dass die diskutierten Funktionen mit einzelnen Bits arbeiten.



  • Oh, und malloc wird in der Schleife aufgerufen, free aber außerhalb.



  • Dann passt das fflush(stdin) ja perfekt ins Bild.



  • Hallo,
    hat sich erledigt kann zu. Danke für jeden Antwort.
    gruß



  • SeppJ schrieb:

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.

    Nope, adr ist der Beginn eines char-Arrays.

    Der Code behandelt einen fortlaufenden Speicherbereich aus chars als wäre es ein Array aus Bits.


  • Mod

    BitFiddler schrieb:

    SeppJ schrieb:

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.

    Nope, adr ist der Beginn eines char-Arrays.

    Der Code behandelt einen fortlaufenden Speicherbereich aus chars als wäre es ein Array aus Bits.

    Nein.



  • SeppJ schrieb:

    BitFiddler schrieb:

    SeppJ schrieb:

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.

    Nope, adr ist der Beginn eines char-Arrays.

    Der Code behandelt einen fortlaufenden Speicherbereich aus chars als wäre es ein Array aus Bits.

    Nein.

    Doch. Habe sowas mal selbst programmiert. Sieht fast genau so aus.


  • Mod

    BitFiddler schrieb:

    Doch. Habe sowas mal selbst programmiert. Sieht fast genau so aus.

    So, so. Ein Programm, das du geschrieben hast, macht etwas anderes, als das Programm des TE. Daher ist das was ich darüber geschreiben habe, was das Programm des TE macht, falsch, weil dein Programm etwas anderes macht. Super Argument.



  • SeppJ schrieb:

    BitFiddler schrieb:

    Doch. Habe sowas mal selbst programmiert. Sieht fast genau so aus.

    So, so. Ein Programm, das du geschrieben hast, macht etwas anderes, als das Programm des TE.

    Nee, fast das selbe

    // flag_number ist bit-offset, adr ist Startadresse des Bit-Arrays
    void set_flag_v2(unsigned int flag_number, void *adr) 
    { 
        char *pc = (char *)adr;             // Wir brauchen einen char*
        int ioff = (flag_number - 1) / 8;   // ioff ist index auf den einzelnen char
        int ibit = (flag_number - 1) % 8;   // ibit ist ein bit in diesem char  
        pc[ioff] = pc[ioff] | (1 << ibit);  // char laden, das bit auf 1 setzen und char zurückschreiben
    }
    

    Habe ich nun ...
    char mem[100];

    und mache ....
    set_flag_v2 (300, mem);

    Dann wird das 3. Bit im 37. Element von mem auf 1 gesetzt
    Logisch ist es das 300. Bit eines Bit-Arrays.
    Kann sein, dass ich mich irgendwo verzählt habe, aber so etwa funktioniert der Code.


  • Mod

    Ja, und? Was hat irgendetwas davon mit

    BitFiddler schrieb:

    SeppJ schrieb:

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.

    Nope, adr ist der Beginn eines char-Arrays.

    zu tun?



  • SeppJ schrieb:

    Ja, und? Was hat irgendetwas davon mit

    BitFiddler schrieb:

    SeppJ schrieb:

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.

    Nope, adr ist der Beginn eines char-Arrays.

    zu tun?

    Das Bit wird nicht immer in dem Datenwort verändert, auf das adr zeigt, sondern es liegt in den meisten Fällen weiter vorn. Die "effektive Bitadresse" wird in der Funktion berechnet.


  • Mod

    BitFiddler schrieb:

    SeppJ schrieb:

    Ja, und? Was hat irgendetwas davon mit

    BitFiddler schrieb:

    SeppJ schrieb:

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.

    Nope, adr ist der Beginn eines char-Arrays.

    zu tun?

    Das Bit wird nicht immer in dem Datenwort verändert, auf das adr zeigt, sondern es liegt in den meisten Fällen weiter vorn. Die "effektive Bitadresse" wird in der Funktion berechnet.

    😕 Das widerspricht in keinster Weise dem, was ich sagte.



  • SeppJ schrieb:

    BitFiddler schrieb:

    SeppJ schrieb:

    Ja, und? Was hat irgendetwas davon mit

    BitFiddler schrieb:

    SeppJ schrieb:

    Es setzt/löscht/erfragt das flag_number'te Bit in dem, auf was adr zeigt.

    Nope, adr ist der Beginn eines char-Arrays.

    zu tun?

    Das Bit wird nicht immer in dem Datenwort verändert, auf das adr zeigt, sondern es liegt in den meisten Fällen weiter vorn. Die "effektive Bitadresse" wird in der Funktion berechnet.

    😕 Das widerspricht in keinster Weise dem, was ich sagte.

    Es widerspricht mindestens dem: https://www.c-plusplus.net/forum/p2549692#2549692


  • Mod

    BitFiddler schrieb:

    Es widerspricht mindestens dem: https://www.c-plusplus.net/forum/p2549692#2549692

    Es ist dem Code vollkommen egal, ob das chars oder wer weiß was sind. Im Orgiginalcode ist wird ein void* via void* übergeben! Wo sind da deine chars? Der Datentyp ist vollkommen irrelevant und der Code geht auch genau so damit um.

    Was ist los mit dir? Dies ist Computercode. Dies ist kein Gedicht, dass man irgendwie interpretieren kann, oder zu dem man eine persönliche Meinung haben kann. Es ist objektiv, was der Code macht und was nicht, da gibt es nichts zu diskutieren.



  • SeppJ schrieb:

    BitFiddler schrieb:

    Es widerspricht mindestens dem: https://www.c-plusplus.net/forum/p2549692#2549692

    Es ist dem Code vollkommen egal, ob das chars oder wer weiß was sind. Im Orgiginalcode ist wird ein void* via void* übergeben! Wo sind da deine chars? Der Datentyp ist vollkommen irrelevant und der Code geht auch genau so damit um.

    Schau mal unauffällig auf die Variable "pc" in der Funktion, was das ist und was damit gemacht wird. 😉


Log in to reply