dynamische arrays und pointer



  • Xeno1987 schrieb:

    ..., **destination); /* LOL */
    
    }
    

  • Mod

    Nun, entweder machst du es, wie es richtig ist, d.h.

    unsigned int filter(unsigned int pos, const int *values, unsigned int size, int *result);
    

    oder du machst es so wie dein Lehrer (falsch) vorgibt, also

    unsigned int filter(unsigned int pos, int *values, unsigned int size, int **result)
    

    .
    Beides gleichzeitig geht nicht.

    Außerdem scheinst du noch folgende Dinge nicht verstanden zu haben und solltest sie dir nochmal angucken:
    - Dereferenzierung und Adressoperator (sehr wichtig! Falsch benutzt in Zeilen 11, 20)
    - Felder (wichtig! Falsch benutzt in Zeilen 11, 18, 20, 31, 33)
    - Implizite Konvertierungen zwischen Pointertypen. Wann greifen sie, wann nicht? (nicht ganz so dringend. Falsch benutzt in 33)
    - Bitmanipulation (für diese Aufgabe sehr wichtig! Falsch benutzt in 9-14)
    - erstaunlicherweise Schleifen und andere Kontrollstrukturen (absolute Grundlagen für alles! Falsch benutzt in 7-22)



  • hi,

    das mit den bits überprüfen stimmt aber so, Weiss ich nicht was du meinst. das mit dem dereferenzieren war so gewollt, da ich die neuen werte in das neue array schreiben soll.


  • Mod

    Xeno1987 schrieb:

    das mit den bits überprüfen stimmt aber so, Weiss ich nicht was du meinst. das mit dem dereferenzieren war so gewollt, da ich die neuen werte in das neue array schreiben soll.

    Komisch, wieso es nicht funktioniert, obwohl doch alles richtig ist. Findest du nicht?



  • hi,

    ja da hast du recht, aber ich würd mich um unterstützung freuen.


  • Mod

    Xeno1987 schrieb:

    hi,

    ja da hast du recht, aber ich würd mich um unterstützung freuen.

    Eigentlich hatte ich gedacht, eine Auflistung der Fehler wäre Unterstützung. Mach dich über die angesprochenen Themen schlau, sonst verstehst du unsere Antworten nicht. Teile die Funktionalität auf, die du zur Problemlösung benötigst, so dass du die einzelnen Teile der Lösung unabhängig testen kannst. Derzeit merkst du gar nicht, dass dein Bitgefummel falsch ist, da du das falsche Ergebnis nicht aus der Funktion heraus bekommst.

    Daher konkrete Vorschläge:
    -Schreibe eine Funktion int get_bit(unsigned int value, unsigned int pos) , die dir zurück gibt, ob das pos'te Bit in value gesetzt ist oder nicht (Ruckgabewert 0 (ungesetzt) oder nicht 0 (gesetzt)).
    -Teste diese Funktion ausgiebig!
    -Schreibe eine Funktion void filter(unsigned int* values, unsigned int size, unsigned int pos) , die dir alle Werte aus values auf dem Bildschirm ausgibt, bei denen das pos'te Bit gesetzt ist.
    -Teste diese Funktion ausgiebig!

    Das ist dann schon einmal die halbe Miete. Danach musst du die oben von mir erwähnte Entscheidung treffen, ob du es machst wie vom Lehrer verlangt oder so wie man es richtig machen würde. Bis dahin ist es aber noch eine Weile hin, denn ich denke für die beiden beschriebenen Funktionen wirst du einiges an Zeit brauchen.



  • 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