dynamische arrays und pointer



  • Schreib auch noch eine Funktion
    void print(const int * base, size_t nmemb);
    Diese gibt ein Array von nmemb ints aus. base zeigt auf den ersten dieser ints.

    Nach Diktat in den Biergarten gegangen.



  • so hab die erste function fertig und auch erfolgreich getestet.
    die zweite mach ich gleich auch noch.

    #include <stdio.h>
    #include <stdlib.h>
    
    int get_bit(unsigned int value, unsigned int pos){
    
       if(value & (1<<pos)) return 1;
    
    return 0;
    
    }
    
    int main(int argc, char **argv){
    
    printf("test: %d\n", get_bit(15,7));
    
    }
    

  • Mod

    Sieht ok aus. Nächste!



  • so die zweite habe ich auch hinbekommen. Wenn ich die Aufgabe richtig verstanden habe, soll das program gucken, ob bei pos z.b. pos = 7 sind binary gesehen von rechts MSB angefangen 0, 1 ,2 position gesetzt also hol dir vom array die werte an genau diesen positionen und gib sie aus.

    #include <stdio.h>
    #include <stdlib.h>
    
    void filter(unsigned int *values, unsigned int size, unsigned int pos){
    
       for(unsigned int i = size-1;i > 0;i--){
    
          if(pos&1){
    
             printf("Werte: %d\nPosition: %d\n", values[i], i);
          }
          pos = pos >> 1;
    
       }
    
    }
    
    int main(int argc, char **argv){
    
    unsigned int val[] = {5, 20, 18, 45, 50};
    filter(val, 5, 8);
    
    }
    


  • warum veränderst du pos?
    was hat if(pos&1) mit dem array inhalt zu tun?


  • Mod

    Xeno1987 schrieb:

    [...etwas, das überhaupt nicht zur Aufgabe passt...]

    Völlig daneben. Siehst du nicht irgendwie einen Zusammenhang zur ersten Aufgabe?



  • doch hast recht aber in meiner jetyigen version become ich keine ausgabe.

    #include <stdio.h> 
    #include <stdlib.h> 
    
    void filter(unsigned int *values, unsigned int size, unsigned int pos){ 
    
        for(unsigned int i = size-1;i > 0;i--){ 
    
           if(values[i] & (1<<pos)){ 
    
              printf("Werte: %d\nPosition: %d\n", values[i], i); 
           } 
    
        } 
    
    } 
    
    int main(int argc, char **argv){ 
    
    unsigned int val[] = {5, 20, 18, 45, 50}; 
     filter(val, 5, 8); 
    
    }
    

  • Mod

    Xeno1987 schrieb:

    doch hast recht aber in meiner jetyigen version become ich keine ausgabe.

    Was daran liegt, dass keine der Zahlen das 8. Bit gesetzt hat.

    So, damit wären die beiden Aufgaben gelöst. Nun musst doch noch entscheiden, wie du die Rückgabe machen möchtest.

    Wieso zählst du eigentlich rückwärts?



  • also danke erstmal für die Hilfe. Ich war mir nicht sicher ob ich die aufgabe verstanden hatte. Ich poste noch mal die ganze aufgabe. Rückgabe mach ich mit ner dritten function.

    Aufgabe 1.3C

    In dieser Aufgabe soll folgende Funktion in C implementiert werden um aus einem Integer-Array bestimmte Werte auszuwählen und diese in einem neuen Array zurück zu geben:

    unsigned int filter(unsigned int pos, int *values, unsigned int size, int **result), natürlich *result

    Der Funktion werden ein Zeiger auf ein Array von Integer-Werten als Parameter values sowie die Größe des Arrays als Integer-Parameter size übergeben.
    Aus diesem Array sollen alle Werte ausgewählt werden, bei denen das Bit an der durch pos angegebenen Bitposition gesetzt ist. Hierbei soll die Zählung mit der höchstwertigsten Bitposition der Zahl beginnen. Die ausgewählten Werte sollen über den Rückgabeparameter result als neu angelegtes Array an die aufrufende Funktion übergeben werden. Die Größe des neuen Arrays soll zudem als Rückgabewert der Funktion zurückgegeben werden. Um die Implementierung übersichtlicher zu gestalten dürfen natürlich weitere Hilfsfunktionen und Makros definiert werden. Die Anzahl der Bits des Datentyps Integer lässt sich bei Bedarf unabhängig von der verwendeten Plattform durch sizeof(int)*8 bestimmen.



  • Xeno1987 schrieb:

    doch hast recht aber in meiner jetyigen version become ich keine ausgabe.

    Du bekommst keine Ausgabe, weil keine Zahl in Deinem Array die Bedingung "Bit an Position 8 gesetzt" erfüllt.

    Teste Deinen Code mal mit folgender main():

    int main(void){
      unsigned int val[] = { 256, 128, 257, 128, 258 };  // erwartet: 256, 257, 258   
      unsigned int N = sizeof(val) / sizeof(val[0]);
      filter(val, N, 8); 
    }
    


  • so leute,

    habe endlich die ganze aufgabe gelöst, hier der endgültige code:

    #include <stdio.h>
    #include <stdlib.h>
    
    unsigned int filter(unsigned int pos, int *values, unsigned int size, int *result){
       unsigned int j = 0;
    
       for(unsigned int i = 0;i < size;i++){
    
          if(values[i] & (1<<pos)){
    
             result[i] = values[i];
             printf("Wert: [%d]\t", result[i]);
             j++;
          }
       }
    
    return j;
    
    }
    
    int main(int argc, char **argv){
    
       int source[] = {256, 128, 257, 128, 258};
       int *destination;
       destination = (int*)malloc(sizeof(source));
       unsigned int N = sizeof(source)/sizeof(source[0]);
    
       printf("Anzahl: %d\n",filter(0, source, N, destination));
    }
    

  • Mod

    Speicherloch, potenziell undefiniertes Verhalten.

    int *destination;
    destination = (int*)malloc(sizeof(source));
    

    ➡

    int destination[sizeof(source)/sizeof(source[0])];
    

Anmelden zum Antworten