dynamische arrays und pointer



  • 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