Zum Inhalt springen

Valerio

Mitglieder
  • Gesamte Inhalte

    17
  • Benutzer seit

  • Letzter Besuch

  1. 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. Das war jetzt glaub ich etwas viel aufeinmal.. hab's nich so ganz verstanden, tut mir leid
  3. 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
  4. Hat sich erledigt.. hab es jetzt hinbekommen =) Danke dir @Klotzkopp
  5. 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]
  6. 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..
  7. 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
  8. 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. So ist es
  9. 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 { //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.
  10. 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: 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
  11. Genau so stell ich mir eine gute Erklärung vor. Danke an dich unbenannt, hab's jetzt verstanden.
  12. 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: 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...