![]() |
ENGLISH VERSION |
|
![]() |
Links | | | Forum | | | Kommentare | | | News melden |
![]() |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
![]() |
amiga-news.de Forum > Programmierung > word wrap | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
1 -2- 3 | [ - Beitrag schreiben - ] |
12.11.2009, 13:24 Uhr AGSzabo Posts: 1663 Nutzer |
@akl: ich versteh nicht. soll ich bei der ausgabe die zeichen duchzählen? gerade das wollte ich doch vermeiden. aber ich weis nicht wirklich was eine hashtable ist... veileicht sollte man jeder zeile ein längenbyte vorrausmachen aber das kommt mir doof vor... -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 13:37 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 13:40 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ist in diesem Fall eigentlich nicht nötig, weil der Word-Wrap Algorithmus ja linear über die Zeichen iteriert. Das heißt, es gibt immer einen aktuellen Eintrag in der Tabelle, der mit der aktuellen Zeichenposition korrespondiert, und für das nächste Zeichen ist entweder derselbe Eintrag oder der direkt folgende zuständig. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 13:43 Uhr Holger Posts: 8116 Nutzer |
Zitat:Jetzt machst Du ja ein ganz anderes Fass auf. Bislang musste Deine Ausgaberoutine doch auch das Ende der Zeile suchen, und es hat Dich nicht gestört. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 14:01 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: > aktuellen Eintrag in der Tabelle, der mit der aktuellen Zeichenposition korrespondier versteh ich nicht. > Jetzt machst Du ja ein ganz anderes Fass auf. ich dachte das geht vielleicht doch. -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 14:35 Uhr Holger Posts: 8116 Nutzer |
Zitat:Text wird üblicherweise mit dem ersten Zeichen beginnend, ein Zeichen nach dem anderen gespeichert. Wenn Du jetzt den Text in dieser Reihenfolge abwanderst und Einträge in einer Tabelle ablegst, sind diese in der gleichen Reihenfolge gespeichert. Wenn Du jetzt erneut die Zeichen abwanderst, natürlich wieder in dieser Reihenfolge, und die Einträge aus der Tabelle brauchst, gehört der erste Eintrag aus der Tabelle zum ersten Zeichen. Für jedes weitere Zeichen ist entweder der gleiche Tabelleneintrag wie für das vorherige oder der nächste Eintrag zuständig. Du iterierst also gleichzeitig über die Zeichen und Tabelleneinträge und muss somit nie in der Tabelle suchen. Zitat:Dann kannst Du gleich eine Tabelle anlegen, in der die Zeilen gespeichert sind. Wo ist das Problem? -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 14:50 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: eh, aha. jetzt habe ich deine warp-routien in assembler implementiert, allerdings mit fehler: es wird anscheinend immer erst ein wort über die bande hinaus umgebrochen oder so. wer siehst den fehler? code:--while( ( word:=next() ) ) SpaceLeft := LineWidth - Width(word) while( ( word:=next() ) AND char<>$a AND Width(word)+SpaceWidth<SpaceLeft) SpaceLeft := SpaceLeft - (Width(word)+SpaceWidth) end while insert line break end while ASM ; calc and store width of space lea .space(pc),a0 moveq #1,d0 move.l a2,a1 jsr _LVOTextLength(a6) move.w d0,d7 ; width of 1 space char ; get field width move.w xuiFd_width(a3),d6 move.l xuiFd_wrappedtext(a3),a5 tst.b (a5) beq.b .rts .while_words bsr .get_word beq.b .end ; SpaceLeft := LineWidth - Width(word) move.w d6,d5 sub.w d0,d5 .while_misc ; while( ( word:=next() ) AND char<>$a AND Width(word)+SpaceWidth<SpaceLeft) bsr .get_word beq.b .line_break cmp.b #$a,-1(a5) beq.b .while_words move.w d0,d1 add.w d7,d1 cmp.w d1,d5 ble.b .line_break ; SpaceLeft := SpaceLeft - (Width(word)+SpaceWidth) sub.w d0,d5 sub.w d7,d5 bra.b .while_misc .line_break move.b #$a,-1(a5) bra.b .while_words .end clr.b -1(a5) .rts rts .get_word ; a5 *word, >a5 *after word move.l a5,a0 ; word pointer moveq #0,d0 ; word lenght in chars .gw_loop tst.b (a5) beq.b .nomore cmp.b #" ",(a5) beq.b .textlength cmp.b #$a,(a5) beq.b .textlength addq #1,d0 addq #1,a5 bra.b .gw_loop .textlength addq #1,a5 move.l a2,a1 jsr _LVOTextLength(a6) moveq #1,d1 rts .nomore addq #1,a5 moveq #0,d1 rts Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 15:24 Uhr geändert. ] [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 16:01 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 14:51 Uhr akl Posts: 265 Nutzer |
@AGSzabo: Entweder trennst Du die Formatierungs- von den Textinformationen, oder nicht. Entweder gibst Du (immer) zeichenweise aus, oder nicht. Entweder gibst Du (immer) zeilenweise aus, oder nicht. Entweder funktioniert die Ermittlung der Formatierung unabhängig vom Zeilenumbruch, oder nicht. Entweder kannst Du zu jedem Zeitpunkt die Formatierung jedes Textschnipsels ermitteln, ohne den ganzen Text(fluss) durchgehen zu müssen, oder nicht. Entweder steckt auch Intelligenz in der Textausgabe-Routine, oder nicht. Entweder hast Du Speicher genug, oder Du musst sparen :-) Die beste Lösung hängt von Deinen genauen Anforderungen ab. Das mit dem Hashtable war nur eine Anregung für den Fall, dass Du die Formatierung komplett von der reinen Textinformation trennen möchtest. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 14:52 Uhr akl Posts: 265 Nutzer |
@Holger: >Ist in diesem Fall eigentlich nicht nötig, weil der Word-Wrap >Algorithmus ja linear über die Zeichen iteriert. Bist Du sicher, dass Anforderungen und Algorithmus schon final sind? :-) [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 16:01 Uhr Holger Posts: 8116 Nutzer |
Zitat:Nein, aber ich würde erst dann eine Hash-Tabelle implementieren, wenn ich eine brauche. ![]() -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 16:09 Uhr Holger Posts: 8116 Nutzer |
Zitat:Na das ist ja einfach. Wenn ein Wort nicht mehr in die Zeile passt, musst Du den Umbruch vor dem Wort setzen und nicht dahinter. Im übrigen code:... move.w d0,d1 add.w d7,d1 cmp.w d1,d5 ble.b .line_break ; SpaceLeft := SpaceLeft - (Width(word)+SpaceWidth) sub.w d0,d5 sub.w d7,d5 bra.b .while_misc .line_break Das geht deutlich einfacher. Kommst Du drauf? ![]() Hint: nach .line_break wird der Inhalt von d5 nicht mehr benutzt... -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 16:28 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ich würde den Text und die Formatierung trennen. Den Text würde ich gar nicht kopieren, sondern eine Tabelle, bzw. einen (relativ flachen) Baum aufbauen, der die Zeilen und Style-Spans im Ursprungstext adressiert. Hash-Lookup halt ich für nicht so nützlich, weil ja jede mögliche Textposition ein potentieller Key wäre. Mit Binärer Suche oder Interpolationssuche ist man da besser dran. Sofern man nicht sowieso iterieren muss. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 16:45 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: > Wenn ein Wort nicht mehr in die Zeile passt, musst Du den Umbruch vor dem Wort setzen und nicht dahinter. das allein scheint es nicht zu sein. außerdem wenn ich das so mache, würde wenn schon das erste wort nicht passt, ein returncode oder null vor der ersten byte des textes geschrieben. > Das geht deutlich einfacher. Kommst Du drauf? hm, nö. habs versucht. aber irgendwie fühlt sich das so an als ginge es wirklich einfacher. -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 16:46 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:08 Uhr AGSzabo Posts: 1663 Nutzer |
Zitat: also das ist echt zu hoch für mich. [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 17:09 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:11 Uhr Holger Posts: 8116 Nutzer |
Zitat:Kann überhaupt nicht sein. Ob das erste Wort in die Zeile passt, wird überhaupt nicht überprüft. Nur noch mal zum Verständnis code:schreibt hinter das aktuelle Wort, denn a5 zeigt bereits auf das nächste Wort. Was natürlich falsch ist, wenn das aktuelle Wort nicht in die Zeile passt. Wobei das aktuelle Wort an dieser Codestelle niemals das erste Wort einer Zeile ist, das ist schon von vornherein sichergestellt..line_break move.b #$a,-1(a5) Zitat:Versuch's noch mal. Was macht cmp genau, und wo liegt der Unterschied zu sub? -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:19 Uhr Holger Posts: 8116 Nutzer |
Zitat:Iteration (Das ist nicht wirklich schwer ![]() Binäre Suche (Schon anspruchsvoller, aber auch nicht schwer) Jetzt hast Du Dich warm gemacht, also: Hashtabelle -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:21 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger:code:sub.w d7,d5 sub.w d0,d5 bgt.b .while_misc .line_break > schreibt hinter das aktuelle Wort, denn a5 zeigt bereits auf das nächste Wort. Was natürlich falsch ist, wenn das aktuelle Wort nicht in die Zeile passt. das ist schon irgendwie klar aber nachdem ich mir den anfang des wortes merke und davor ein $a einfüge, kommt alles erst recht durcheinander. [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 17:22 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:33 Uhr Holger Posts: 8116 Nutzer |
Zitat:Dann hast Du beim Merken des Wortanfangs etwas falsch gemacht. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:34 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: iteration: jedes byte der reihe nach mit $a zB vergleichen? binäre suche: byte in der mitte vegleichen, dann wieder die mitte der mitte nehmen entweder links oder rechts? hm, kann nicht sein weil da müssten alle linken werte zb kleiner und alle rechten werte dann gößer sein? hashtable: ich habe in der liste der klassen von OX sagen wir mal 10 interne klassen eingetragen, jede interne klasse hat eine unique ID. ich könnte nun durch die liste "iterieren" und jedes element seine ID vergleichen. weil das langsam ist, habe ich aber eine tabelle in der man, wenn man die ID-nummer mal 4 nimmt, damit als offset den zeiger auf die zugehörige klasse bekommt. soweit so schön aber ich peil noch nicht wie das im kontext der textformatierung aussieht. ps: stimmt meine optimierung in deinem sinne? [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 17:36 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:39 Uhr Holger Posts: 8116 Nutzer |
@AGSzabo: Für die Suche innerhalb des Textes sind diese Verfahren nicht geeignet. Darum ging es ja auch nicht. Ausgangspunkt war, dass akl einen Vorschlag gemacht hat, wie man für eine bestimmte Textposition die in einer Tabelle stehende Formatierung finden kann. Das ist aber erst dann wichtig, wenn Du Dich entschieden hast, ob Du eine solche Tabelle verwenden willst, und wie diese aussehen soll. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:43 Uhr Holger Posts: 8116 Nutzer |
Zitat:Sofern gt die Umkehrung von le ist, ja. Ich kann mir das immer nicht merken. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:46 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: >Sofern gt die Umkehrung von le ist, ja. Ich kann mir das immer nicht merken. le ist "Less or Equal" und gt ist "GreaTer". -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:48 Uhr Holger Posts: 8116 Nutzer |
@AGSzabo: Die .getword Subroutine solltest Du auch noch mal vereinfachen. Einfach am Anfang move.b (a5)+,d1 statt tst.b (a5) schreiben und nachfolgend (a5) durch d1 ersetzen. Dann kannst Du Dir die drei addq #1,a5 Anweisungen sparen und hast weniger Speicherzugriffe. -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:52 Uhr Holger Posts: 8116 Nutzer |
Zitat:Das weiß ich. Nur die Logik, nach der der Unterschied zwischen HIgher und GreaTer die Verwendung eines Vorzeichens bestimmt, prägt sich mir halt nicht ein. Ist das jetzt vorzeichenbehaftet oder nicht? -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 17:57 Uhr AGSzabo Posts: 1663 Nutzer |
tut mir leid, ich finde den fehler nicht. im folgenden habe ich versucht die linebraks auf 1 vor anfang des wortes umzuleiten...code:--.while_words bsr .get_word beq.b .end ; SpaceLeft := LineWidth - Width(word) move.w d6,d5 sub.w d0,d5 .while_misc ; while( ( word:=next() ) AND char<>$a AND Width(word)+SpaceWidth<SpaceLeft) bsr .get_word beq.b .line_break cmp.b #$a,-1(a5) beq.b .while_words sub.w d7,d5 sub.w d0,d5 bgt.b .while_misc .line_break move.b #$a,(a4) bra.b .while_words .end clr.b -1(a5) .rts rts .get_word ; a5 *word, >a5 *after word lea -1(a5),a4 move.l a5,a0 ; word pointer moveq #0,d0 ; word lenght in chars tst.b (a5) beq.b .nomore .gw_loop tst.b (a5) beq.b .textlength cmp.b #" ",(a5) beq.b .textlength cmp.b #$a,(a5) beq.b .textlength addq #1,d0 addq #1,a5 bra.b .gw_loop .textlength addq #1,a5 move.l a2,a1 jsr _LVOTextLength(a6) moveq #1,d1 rts .nomore addq #1,a5 moveq #0,d1 rts Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 18:04 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 18:08 Uhr AGSzabo Posts: 1663 Nutzer |
Zitat:Ich habe keine Ahnung. -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 18:14 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: > nach der der Unterschied zwischen HIgher und GreaTer die Verwendung eines Vorzeichens bestimmt das vorzeichen (N-flag) kommt in der Higher formel NICHT vor. -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1600mhz Ubuntu Linux / WinXP -- BenQ FP93G TFT - 1048 like CRT - HP psc1110 [ - Antworten - Zitieren - Direktlink - ] |
12.11.2009, 21:28 Uhr AGSzabo Posts: 1663 Nutzer |
so, die funktion ist nun optimiert und besser, aber den haken wegen dem überhang der worte am rechten rand den sehe ich eifach nicht. mir is nur aufgefallen dass nur die erste zeile korrekt umgebrochen wird.code:--start move.w xuiFd_width(a3),d6 move.l xuiFd_wrappedtext(a3),a5 tst.b (a5) bne.b .get_first .rts rts .while_words tst.b -1(a5) beq.b .rts .get_first bsr .get_word ; first of a line ; SpaceLeft := LineWidth - Width(word) move.w d6,d5 sub.w d0,d5 .while_misc ; while( ( word:=next() ) AND char<>$a AND Width(word)+SpaceWidth<SpaceLeft) tst.b -1(a5) beq.b .rts move.l a5,a4 bsr .get_word cmp.b #$a,(a5) beq.b .while_words sub.w d7,d5 sub.w d0,d5 bgt.b .while_misc .line_break move.b #$a,-1(a4) bra.b .while_words .get_word ; a5 *word, >a5 *after word move.l a5,a0 ; word pointer moveq #0,d0 ; word lenght in chars .gw_loop move.b (a5)+,d1 beq.b .textlength cmp.b #$a,d1 beq.b .textlength cmp.b #" ",d1 beq.b .textlength addq #1,d0 bra.b .gw_loop .textlength move.l a2,a1 jmp _LVOTextLength(a6) Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 12.11.2009 um 22:05 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
13.11.2009, 09:57 Uhr DrNOP Posts: 4118 Nutzer |
Ich geb' dann auch mal meinen Senf dazu:Zitat:Du meinst du erkennst erst was du willst, wenn du dabei bist es zu bekommen? Wenn das gesamte Problem zu unüberschaubar ist, ist es eine gute Idee den Teil des Problems aufzuschreiben, den man meint erfaßt zu haben. Allerdings ist es nicht die einzige (und auch nicht die beste) Möglichkeit, diesen Teil sofort als Code niederzuschreiben. Es könnten sich noch Änderungen ergeben... -- Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker [ - Antworten - Zitieren - Direktlink - ] |
13.11.2009, 10:21 Uhr AGSzabo Posts: 1663 Nutzer |
@DrNOP: > Du meinst du erkennst erst was du willst, wenn du dabei bist es zu bekommen? eh, ja genau. in diesem fall schon. auch wenns keiner glaubt, asmcode ist für mich übersichtlicher als c und pseudocode müsste ich mir erst ausdenken. > Wenn das gesamte Problem zu unüberschaubar ist, ist es eine gute Idee den Teil des Problems aufzuschreiben ist schon vorgekommen dass ich es so gemacht habe. -- Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
13.11.2009, 13:18 Uhr DrNOP Posts: 4118 Nutzer |
Zitat:Ich habe nirgends von ASM, C oder Pseudocode gesprochen. Wie wäre es, wenn du ein Stück Prosa verfaßt: "Ich will ein Stück Software, das folgendes tut:
Dagegen soll sie folgendes nicht tun:
Und die folgenden Situationen können aus den jeweils angegebenen Gründen nicht auftauchen:
-- Signaturen mit mehr als zwei Zeilen gehen mir auf den Wecker [ - Antworten - Zitieren - Direktlink - ] |
1 -2- 3 | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > word wrap | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
![]() |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |