Zum Inhalt springen

Valerio

Mitglieder
  • Gesamte Inhalte

    17
  • Benutzer seit

  • Letzter Besuch

Beiträge von Valerio

  1. Es ist mir allerdings nicht ganz klar, was Du mit "statisch" und "dynamisch" in dem Zusammenhang genau meinst.

    Momentan wird halt nur nach 2 aufeinanderfolgenden Buchstaben gesucht. Wenn ich jetzt z.B. das oben gepostete C-Programm so abänder, dass ich anstatt nach "ll", nach "Hallo" suchen möchte, so würde nur nach "Ha" gesucht werden.

  2. Sollen für ein Hochschulpraktikum ein Programm in ARM Assembler entwickeln, welches in einem vorgegebenem String einen String sucht und am Ende ausgibt wie viele "Matches" stattgefunden haben.

    int searchStringInString(char*, char*);

    int main (void)
    {
    int Anzahl;
    char* Text="hallo Alles klar?";
    char* Suchstring="ll";
    char* Leerstring="";

    Anzahl = searchStringInString(Text, Suchstring);
    Anzahl = searchStringInString(Text, Leerstring);
    Anzahl = searchStringInString(Leerstring, Suchstring);
    Anzahl = searchStringInString(Leerstring, Leerstring);
    // Aufrufe funktionieren auch so..
    Anzahl = searchStringInString("aabaabaab", "ab");

    return 0;
    }[/PHP]

    An der "searchStringInString" würde er anschließend in mein Assembler Programm springen, das momentan so aussieht:

    [PHP]
    .file "searchStringInString.S"
    .text
    .align 2
    .global searchStringInString
    .type searchStringInString, %function

    searchStringInString:

    stmfd sp!, {lr}

    MOV r4, r0 @lade anfangsadresse von StringD in r4
    MOV r5, r1 @lade anfangsadresse von StringS in r5
    BL search @springe zu "search"

    ldmfd sp!, {pc}

    search:

    stmfd sp!, {lr} @sichere Rücksprungadresse

    .L1:
    LDRB r6, [r4], #1 @Lade zu vergleichende Byte in r6 und erhöhe dann Adresse
    LDRB r7, [r5] @Lade zu vergleichende Byte in r7 (zu suchender Teil)
    CMP r6, r7 @Vergleiche r6 und r7
    BEQ match @Wenn gleich, springe zu match
    B .L1 @Wenn != beginne suche von vorne

    ldmfd sp!, {pc}


    match:
    LDRB r6, [r4],#1 @lade nächste bye in r6
    LDRB r7, [r5,#1] @ "
    CMP r6, r7 @vergleiche
    ADDEQ r2, r2, #1 @wenn = dann addiere 1 zu r2 (r2=match-register)
    B .L1







    .size searchStringInString, .-searchStringInString

    Momentan gehe ich so vor:

    Ich vergleiche immer 1 Byte (1 Buchstaben - momentan das "L") so lange, bis er einmal fündig geworden ist und springe anschließend zu "Match", wo das nächste Byte auf Gleichheit vergleichen wird. Wenn es ebenfalls gleich ist, wurde 1 mal gematched ("LL" gefunden). Mein Problem momentan? Es ist einfach verdammt statisch.

    Hätte jemand evtl eine Idee, wie ich das ganze Dynamisch halten könnte?

    Danke im voraus!

    MfG

    Valerio

  3. Bekomm's einfach nicht hin.. hab jetzt mehrere Varianten ausgetestet, bei den meisten kam es zu Heap-Fehlern und bei meiner aktuellen liegt das selbe Problem vor, wie eben. Kopiert werden die Objekte auch nicht.

    void Manager::fractions_push_back(Fraction 
    {
    //cArray[c_size] = b;
    //++c_size; // umdrehen?

    if (mng.fractions_size() >= mng.fractionsCapacity)
    {
    allocateMemory();
    pfractions = new Fraction[fractionsCapacity];
    }

    pfractions[c_size++] = b;
    }


    void Manager::allocateMemory()
    {
    if (pfractions == 0)
    fractionsCapacity = 1;
    else
    {

    Fraction* pfractionsCopy = pfractions;
    fractionsCapacity = fractionsCapacity*2;
    pfractionsCopy = new Fraction[fractionsCapacity];
    for (int n=0; n<c_size;n++)
    {
    pfractions[n] = pfractionsCopy[n];
    }

    delete[] pfractionsCopy;
    }
    }

    [/PHP]

    • Was tut fractions_push_back?
    • Die Regel der großen 3: Wenn du einen dieser drei brauchst: Copy-Konstruktor, Copy-Zuweisungsoperator, Destruktor, dann brauchst du alle. Deine Fraction-Klasse braucht keinen dieser drei, somit auch keinen Copy-Konstruktor. Der vom Compiler automatisch generierte tut "das Richtige".
    • Anstatt im Konstruktor-Rumpf die Member zuzuweisen, benutz Initialisierungslisten.

    Das kommt auf die Objekte an. Wenn es POD-Typen sind, kannst du memcpy benutzen. Im allgemeinen Fall nimmst du einfach eine Schleife oder std::copy.

    Fractions_push_back soll jeden zufällig erzeugten Bruch an die letzte Stelle des Arrays schieben.

    Den Copy-Konstruktor sollten wir im Rahmen eines anderen Praktikums erstellen.

    Das mit den Initialisierungslisten kann ich so nicht machen, da wir nur das verwenden dürfen, was in den Vorlesungen durchgenommen wurde. Da achtet der Prof in den Praktika auch ziemlich streng drauf..

  4. Entschuldige wegen dem Doppelpost, hab aber mal ein paar Bilder von meinem momentan Fehler gemacht, damit wird es vielleicht etwas klarer.

    Das 1. Bild zeigt den zufällig erzeugten Bruch

    Numberofobjects einfach ignorieren =)

    Bild1

    Das 2. Bild zeigt das, was in pfractions steht, nachdem "geschrieben" wurde.

    Bild2

    Und das 3. zeigt eine Ausgabe

    Bild3

  5. Hier mal der Teil, in dem das zufällige Fraction Objekt erzeugt wird.

    void Manager::createRndFraction()
    {

    /* mng.clear();*/

    int MAX_N=0;
    int anzahlBrueche;

    while(true){
    try {
    MAX_N = get_int("Eingabe MAX_N: ");
    anzahlBrueche = get_int("Anzahl: ");
    }
    catch(std::runtime_error &msg){
    std::cerr << msg.what() << std::endl;
    std::cin.clear(); std::cin.sync();
    continue;
    }
    break;

    }

    std::cout << std::endl;

    mng.rnd_.MIN_ = -(MAX_N-1);
    mng.rnd_.MAX_ = MAX_N-1;


    int n=0;
    while (n++<anzahlBrueche)
    {
    Fraction r(mng.rnd_.get(), mng.rnd_.get());
    mng.fractions_push_back(r);
    }

    }
    [/PHP]

    Die zugehörige Get-Funktion:

    [PHP]int RandomFraction::get()
    {
    int tmp=0;

    for (;tmp==0;)
    {
    tmp = rand()%(MAX_-MIN_)+MIN_;
    }

    return tmp;
    }

    Und ein Teil der Fraction-Klasse + Konstruktor/Copy-Konstruktor:

    class Fraction
    {
    private:
    int zaehler_;
    int nenner_;
    public:
    Fraction(int zaehler_=0, int nenner_=1); //constructor
    Fraction(const Fraction &original); //copy-constructor


    Fraction::Fraction(int zaehler, int nenner)
    {
    zaehler_ = zaehler;
    nenner_ = nenner;
    //numberOfObjects_++;


    cancelDown();
    adjustSign();
    }


    Fraction::Fraction(const Fraction &original)
    {
    zaehler_ = original.zaehler_;
    nenner_ = original.nenner_;
    //numberOfObjects_++;
    }
    [/PHP]

    Das mit dem Kopieren der Werte habe ich noch nicht ganz verstanden.

    Also erstmal eine Kopie meines aktuellen Zeigers anlegen

    [PHP]Fraction* pfractionsCopy = pfraction //so richtig?

    //Dann neuen Speicher nehmen -> mit pfractionsCopy?

    pfractionsCopy = new Fraction[fractionsCapacity] //?

    //Wenn es soweit richtig ist, wie kann ich die Objekte am effizientesten kopieren?
    //Stehe etwas auf dem Schlauch.

    Ich nehme an, dass hier einfach nur der Umgang mit Arrays geübt werden soll. Für so etwas nimmt man in C++ normalerweise std::vector.

    So ist es :)

  6. Hab's jetzt mal selbst etwas versucht, funktioniert jetzt zwar einigermaßen, aber kleine Fehler sind noch drin.

    Und zwar wird der Vektor ziemlich oft mit den Standartwerten des Konstruktors der Klasse Fraction gefüllt, sprich mit Zähler=0 und Nenner=1, obwohl der zufällig generierte Bruch anders aussieht. Hab das auch mit Einzelschritten im Debugger durchlaufen lassen, bin aber nicht fündig geworden.

    Hier mal der aktuelle Quelltext

    Header

    class Manager
    {
    private:

    RandomFraction rnd_;
    Statistic stat_;
    std::vector<Fraction> vec_;

    //enum {MAX=1000};
    //Fraction cArray[MAX];
    Fraction *pfractions;
    int fractionsCapacity;
    int c_size;
    public:
    friend class Fraction;

    Manager(int c_size=0, int fractionsCapacity=0, Fraction *pfractions=NULL);
    ~Manager(void);


    void fractions_push_back(Fraction);
    int fractions_size() const;
    int &operator[](int);
    void erase(int);
    void clear();
    void allocateMemory();[/PHP]

    [b]CPP[/b]

    [PHP]Manager mng;

    Manager::Manager(int c_size, int fractionsCapacity, Fraction *pfractions)
    {
    /* for ( int index=0 ; index<MAX ; index++ )
    cArray[index] = 0;*/


    this->fractionsCapacity=fractionsCapacity;

    this->c_size = c_size;
    }


    void Manager::fractions_push_back(Fraction B)
    {
    //cArray[c_size] = b;
    //++c_size;

    if (mng.fractions_size() >= mng.fractionsCapacity)
    {
    allocateMemory();
    pfractions = new Fraction[mng.fractionsCapacity];
    pfractions[c_size++] = b;
    }
    else
    pfractions[c_size++] = b;
    }


    int Manager::fractions_size() const
    {
    return c_size;
    }


    void Manager::allocateMemory()
    {
    if (pfractions == 0)
    fractionsCapacity = 1;
    else
    fractionsCapacity = fractionsCapacity*2;
    }

    Was jetzt noch fehlt ist das Kopieren der Werte und das löschen des alten Speichers. Habe momentan noch keine Idee wie ich da am besten rangehen kann.

  7. Hallo an alle!

    Studiere im 1. Semester Informatik an einer FH und wir haben jetzt die 5. Praktikumsaufgabe in Programmieren gestellt bekommen, so ganz blick ich da aber nicht durch.

    Es geht um folgendes:

    Wir haben uns im Laufe der Praktika ein Programm gebastelt, welches Brüche einliest, ausgibt, berechnet und was auch immer mit diesen anstellt.

    Das 5. Praktikum sieht jetzt voraus, dass wir unser aus dem 4. Praktikum erarbeiteten Vektor, das mit zufälligen Brüchen gefüllt wird durch ein C-Array ersetzen.

    Das ganze soll natürlich dynamisch gehalten werden. Dazu folgender Auszug aus der Aufgabenstellung:

    Teil B: Dynamische Speicherverwaltung

    Stellen Sie nun Ihr Programm aus Teil A um auf dynamische Speicherverwaltung. Die Größe des verwendeten CArrays

    soll sich nun dem Bedarf anpassen:

    1. Unmittelbar nach dem Start der Anwendung gibt es noch gar kein C-Array sondern lediglich einen Zeiger

    (Name: pfractions) der mit null initialisiert ist.

    2. Jedes Mal, wenn mittels fractions_push_back ein Bruch hinzugefügt wird, soll fractions_push_back

    prüfen, ob noch mindestens ein Speicherplatz für ein Bruchobjekt zur Verfügung steht. Falls nicht, soll

    fractions_push_back, oder besser eine andere Memberfunktion, den verfügbaren Speicherplatz verdoppeln

    und die bisher gespeicherten Elemente in den neuen Speicherplatz kopieren. Der alte Speicherplatz wird danach

    nicht mehr benötigt. Für diese Funktionalität braucht man eine weitere Membervariable, die die Größe des

    aktuell reservierten Speicherplatzes kennt (Name: fractionsCapacity).

    Im Teil A sollte das Array statisch gehalten werden, nur als kleine Anmerkung.

    Ich hab mir jetzt folgendes gedacht:

    Erste Teilaufgabe von TeilB sagt ja, dass es noch gar kein Array geben soll, stattdessen halt einen Zeiger. Ich hab das jetzt so gemacht, korrigiert mich, falls es falsch ist.

    Header-Datei

    class Manager
    
    {
    
    private:
    
    
    	 RandomFraction rnd_;
    
    	 Statistic stat_;
    
    
    	 //enum {MAX=1000};
    
    	 //Fraction cArray[MAX];
    
    	 Fraction *pfractions;
    
    	 int fractionsCapacity;
    
    	 int c_size;
    
    public:
    
        friend class Fraction;
    
    
    	Manager(int c_size=0, int fractionsCapacity=0);
    
    	~Manager(void);
    
    
            ....   //einige weitere Memberfunktionen, hier aber überflüssig
    
    
    	void fractions_push_back(Fraction);
    
    	int fractions_size() const;
    
    	int &operator[](int);
    
    	void erase(int);
    
    	void clear();
    
    	void allocateMemory();
    
    
    };
    fractionsCapacity -> maximale Größe des Arrays Fraction* pfractions -> Zeiger für's Array c_size -> aktuelle größe des arrays CPP-Datei
    Manager mng;
    
    
    Manager::Manager(int c_size, int fractionsCapacity)
    
    {
    
    	/*  for ( int index=0 ; index<MAX ; index++ )
    
               cArray[index] = 0;*/
    
    
    	  pfractions = new Fraction(0);    [COLOR="red"]//kann das so stimmen?[/COLOR]
    
    	  this->fractionsCapacity=fractionsCapacity;
    
    
    	  this->c_size = c_size;
    
    }
    
    
    
    void Manager::fractions_push_back(Fraction 
    
    {
    
    	 //cArray[c_size] = b;
    
    	 //++c_size;                                  
    
    
    	if (mng.fractions_size() >= mng.fractionsCapacity)
    
    	{
    
    		allocateMemory();
    
    		pfractions[c_size++] = b;       [COLOR="red"]//  c_size an dieser stelle richtig?[/COLOR]
    
    	}
    
    }
    
    
    
    int Manager::fractions_size() const
    
    {
    
    	return c_size;
    
    }
    
    
    
    void Manager::allocateMemory()
    
    {
    
    	 if (pfractions == 0)
    
    		 fractionsCapacity = 1;
    
    	 else
    
    		 fractionsCapacity = fractionsCapacity*2;
    
    }[/code]

    Gedacht hab ich mir das ganze so:

    Jedes mal wenn ein Objekt mittels fractions_push_back ins Array geschoben werden soll, soll erstmal geprüft werden, ob schon Speicherplatz vorhanden ist. Wenn nicht, dann soll Speicherplatz der Größe 1 angelegt werden. Wenn schon Speicherplatz vorhanden ist, die Kapazität des Arrays aber überschritten wurde, soll der vorhandene Speicherplatz verdoppelt, die vorhandenen Werte des alten Speicherplatzes in den neuen kopiert und der alte Speicherplatz anschließend gelöscht werden.

    So müsste das doch dynamisch funktionieren?

    Das Problem ist jetzt die Realisierung.. hab bisher nie mit Zeigern gearbeitet und bräuchte deshalb etwas Unterstützung.

    Danke im voraus!

    MfG

    Valerio

  8. Erwischt ;)

    Meine Stärken liegen ehrlich woanders... mich verwirrt diese Fülle von Gesetzen, die es zu beachten gilt und wann genau welches Gesetz zum Einsatz kommt. Andere Umformungen kann ich dir so spontan keine nennen.

    Zur Aufgabe:

    -(-(-A^B) ^ -(A^-B)) -> Was ist jetzt mit den ANDS in den Klammern zwischen A und B? Da ich sie ja doppelt negiert habe, bleiben sie ja eigentlich gleich, damit hätte ich aber kein NAND. Wie eben nur die Negation über dem AND auflösen?

  9. OK, verstehe was du meinst. Na, dann weiß ich ja schon mal, dass mein Ansatz völliger Schwachsinn war.

    Wie dem auch sei.. also so wie ich das jetzt verstanden hab, muss ich einfach nur schauen, dass ich aus dem ^ und v ein -^ mache, richtig?

    Das heißt, wenn ich (-A^B) v (A^-B) doppelt negiere und 1 Negation über dem v aufhebe, hätte ich doch 1 NAND, oder?

    (-A^B) v (A^-B) = -(-(-AB) v -(A-B))

    Kann das stimmen?

  10. Hallo an alle!

    Ich hoffe mir kann jemand von euch bei meinem kleinen Problemchen mit Rat und Tat zur Seite stehen.. und zwar geht es um folgendes:

    Ich soll mir eine Wahrheitstabelle jeweils für die XOR- und XNOR-Funktion erstellen und daraus die DNF und KNF bilden. Das habe ich soweit gemacht und kam zum diesem Ergebnis:

    XOR

    Ein - vorm Buchstaben = NICHT

    DNF: (-A^B) v (A^-B)

    KNF: (AvB) ^ (-Av-B)

    XNOR

    DNF: (-A^-B) v (A^B)

    KNF: (Av-B) ^ (-Av-B)

    Soweit so gut, aber jetzt geht die Aufgabenstellung leider weiter.

    Ich soll mir von der XOR-Funktion eine der beiden Darstellungen rauspicken und sie algebraisch so umformen, dass ich die Schaltung ausschließlich mit NAND-Gattern effizient realisieren kann. Das gleiche bei der XNOR-Funktion, nur dass es hierbei ein NOR-Gatter werden soll.

    Ich steh total auf dem Schlauch...

    Danke im voraus!

    MfG

    ----Nachtrag---

    Habe gerade etwas herumprobiert und jetzt stellt sich eine weitere Frage auf.

    Darf man bei dieser Art der Rechnung die Klammern ausmultiplizieren, wie als hätte man eine "Binomische Formel"?

    Dann würde meine Rechnung bei der DNF der XOR-Funktion nämlich so aussehen:

    (-A^B) v (A^-B) = (-A^A) v (-A^-B) v (B^A) v (B^-B)

    Die erste und letzte Klammer würden sich wegkürzen und übrig bleibt somit

    (-A^-B) v (A^B)

    Und das wär ja eigentlich ein NAND oder verbunden mit einem NAND NICHT.

  11. Hallo liebe Fachinformatiker! ;-D

    Aufgrund eines geplanten Informatikstudiums bin ich gerade dabei mir C in Eigenregie, mithilfe C-HowTo - Programmieren in C, beizubringen. Bisher hat das auch ganz gut geklappt, nur das jetzige Kapitel verwirrt mich doch leicht und deshalb hoffe ich, dass mir jemand von euch helfen könnte.

    Worum es geht steht ja bereits im Titel - Zeigerarithmetik.

    Und zwar steht im Tutorial der besagten Seite folgender Code:

    // Array und Spaltengrenze setzen
    
    int brett[8][8]={ 0 }, Y_Max=8;
    
    
    // Startposition
    
    int *posStart = &brett[0][0];
    
    
    // Testwert setzen
    
    brett[2][4] = 2;
    
    
    // Beschaffung Testwert mit Zeigerarithmetik
    
    int *pos;
    
    pos = posStart + (2 * Y_Max) + 4;
    
    
    printf("%d\n", *pos );
    
    
    2

    Und dazu diese Erklärung:

    Die entscheidende Programmzeile ist die, in der der Positionszeiger pos gesetzt wird. Seine Basis ist die Startadresse des Arrays. Benötigt wird der Wert 4 in Spalte 2, Index [2][4]. Um dorthin zu kommen, müssen wir uns spaltenweise vorarbeiten. Also setzen wir den Zeiger auf das erste Element in Spalte 2. Eine Spalte hat 8 Elemente, also müssen wir den Zeiger 2 * 8 Elemente weiterrutschen. Zum Schluss addieren wir noch die 4, um in die vierte Zeile zu springen.

    Anfangs eigentlich ziemlich plausibel, zumindest bis zum Punkt, in dem der Testwert beschaffen wird. Ab da versteh ich irgendwie garnichts mehr.

    In der Erklärung steht ja, dass der Wert 4 benötigt wird. Warum?

    Und das ganze auch in der 2. Spalte des Arrays... das verwirrt mich gerade leicht. Ich dachte die erste Zahl der Deklaration eines zweidimensionalen Arrays bezieht sich auf die Zeilen -> index[2][4].

    Kurzum... ich steh ziemlich auf dem Schlauch und wär wirklich froh, wenns mir jemand anfängerfreundlich erklären könnte.

    Danke im voraus!

    Mfg

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...