DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Structs im Speicher | [ - Search - New posts - Register - Login - ] |
1 -2- | [ - Post reply - ] |
2004-04-01, 19:02 h thomas Posts: 7718 User |
Worauf beziehst du dich ? Mein Einwand bezog sich auf den Abschnitt Zitat: Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Answer - Quote - Direct link - ] |
2004-04-02, 01:09 h Holger Posts: 8116 User |
Zitat:Ich beziehe mich auf: Zitat:Denn wenn eine struct einen pointer enthält, ... Und wenn nicht? Dann ist eine entsprechende Erklärung (wo ist da ein "Einwand"?) überhaupt nicht überflüssig. Die gilt nunmal für jede Struktur, und zwar auch dann, wenn ein Programm einen pointer auf selbige zurückgibt. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2004-04-02, 01:14 h Holger Posts: 8116 User |
Zitat:Ach komm. Wenn man erstmal weiß, wieviel Arbeit einem dieser Hang zum Perfektionismus am Ende ersparen kann, ist doch Pedanterie beim Programmieren am Ende reiner Eigennutz, um nicht zu sagen ein Hang zur Faulheit.:P mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2004-04-02, 02:10 h whose Posts: 2156 User |
Zitat: Ach? Du kennst ihn auch nicht? Sry, Hang zur Perfektion...;) Ich kenn ihn noch. Grüße [ - Answer - Quote - Direct link - ] |
2004-04-02, 02:25 h bubblebobble Posts: 707 User |
@Ralf27: Das mit den Strukturen ist ganz einfach, lass dich nicht von den Kommentaren hier verwirren. Es gibt die primitiven "structs", die da wären LONG, ULONG, STRPTR, FLOAT ... die benötigen 4 bytes WORD, INT ... benötigt 2 bytes CHAR, BYTE, BOOL, die benötigen 1 byte. Jetzt musst du zum "peeken" nur den sog. Offset ausrechen. Also z.B. struct { LONG a 0 LONG b 4 WORD c 8 BYTE d 10 BOOL e 11 } Wenn du d auslesen möchtest, dann benutzt du in dem Basic PeekB. Die Adresse berechnet sich aus der Basisadresse der Structur, die du z.B. von der Library übergeben bekommst. Dann "zählst" du die längen der einzlenen elemente in der Struct zusammen, bis du dort bist was dich interessiert. z.B. "d" hätte dann PeekB (test+10) Wenn Structuren verschachtelt sind, dann musst du die Länge der jweiligen Structur dazu zählen. ES SEI DENN, es handlet sich um einen POINTER auf eine structur, die hat dann ein "*" vorangestellt. Da muss du 4 bytes veranschlagen. Wenn du diese Structur tiefer verfolgen willst, dann musst du zuerst den POINTER auslesen, also mit PeekL() den Wert an der Stelle mit "*" auslesen. Das ist der BasisPointer auf den Speicher, wo diese Structur liegt. Dann musst du nochmal Peeken, und zwar mit der vorher erhaltenen Wert als Basis. Das mit den Unterschiedlichen Structuren in C hat auf dem Amiga keine grosse bedeutung, nur einzelne Bytes gibt es eigentlich nicht, die würden danach wieder "gerade" gemacht, damit WORD oder LONG immer auf geraden Byte Adressen landen. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, Asteroids, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2004-04-02, 02:52 h whose Posts: 2156 User |
Zitat: Na... Nu! Soooo war das nu auch wieder nicht gemeint. Im Grunde ists okay, wenn Du Dein Wissen über solche Dinge verbreitest. Aber Du solltest Dir dafür auch das richtige Publikum suchen. Ralf hat klipp und klar seine Frage gestellt. Was er vor hat, hat er auch gesagt. Hättst ihm ganz einfach (und vor allem _nicht_ hypothetisch) geantwortet, hätte ich kein Wort verloren. Ich fühlte mich da an meine Anfangszeit auf AOS als C-Anfänger erinnert. Da hieß es immer "Programmiere portabel". Den Rest des Sermons, den ich dann lesen oder hören durfte, kennst Du selbst glaub ich auch ganz gut. Ende von diesem Lied: Ich hatte keinen Bock mehr, irgendwelche Fragen zu stellen. Kein Schwein hat mir vernünftig, klar und einfach auf meine Fragen geantwortet. Hast Du ne Ahnung, wie frustrierend das werden kann? Nachdem ich jetzt einiges an Wissen über AmigaOS zusammenklauben konnte und sehr gut damit klarkomme, habe ich mir fest vorgenommen, nem offensichtlichen Anfänger nicht das Gleiche anzutun, was ich mitmachen mußte. Und die Leutz, die diesen Fehler an dem "Anfänger" begehen wollen, zu bremsen, wenns irgend geht. Bei Dir hat das dummerweise mit der gewählten Methode nicht geklappt Hast ja Recht, daß es Welten außerhalb des AOS3.x gibt, aber alle "Neuentdeckungen" zu ihrer Zeit. Laß ihn doch erstmal bißchen Erfahrung sammeln, bevor Du ihm das Eingemachte servierst. Kannst doch von nem Lehrling nicht erwarten, daß der zum Antritt der Ausbildung erstmal die Meisterprüfung ablegt. Da zäumst Du den Gaul von hinten auf. Auf die Klappe fallen muß er auch, damit er überhaupt begreifen kann, was Du ihm erklären wolltest. Alles zu seiner Zeit... Eins noch zum Linker-Problem mit "struct by value": Sagt Dir das Stichwort "Intermediate Code" irgendetwas? Grüße [ - Answer - Quote - Direct link - ] |
2004-04-02, 09:12 h gni Posts: 1106 User |
Zitat:e hat den Offset 12! Zitat:Ausrichtung ist _immer_ ein Thema! Ausserdem wird ein Struktur nicht immer begradigt, zb eine Strukur mit 3 char hat die Größe 3 (alte AmigaOS GCC Versionen haben das mal begradigt und waren damit inkompatibel zu SAS/C) [ - Answer - Quote - Direct link - ] |
2004-04-02, 09:15 h Solar Posts: 3680 User |
Zitat: Hätte thomas sich nicht aufgebaut und behauptet, mit dem Aufrunden ungerader Adressen sei's getan, hätte ich auch kein Wort verloren. (Und bei bubblebobble muß ich mir auch derbe auf die Zunge beißen, aber hier wurde schon genug geflamet...) Ralf sagte, "Jetzt gibt es einen Befehl in einer Library die ein Struct zurückliefert denn ich gerne auslesen möchte mit Basic." Kein Wort ober AOS - hätte auch die ixemul.library oder sonstwas sein können. Und da bleibt nun einmal die Tatsache, das auf dem 68k sowohl 16-bit als auch 32-bit Alignment möglich und sinnvoll sein können. Somit war "runde ungerade Adressen auf" nicht hinreichend, und Ralf hätte sich ggf. den Wolf suchen können. Was z.B. wäre, wenn besagte Struktur einen double enthält? *evilgrin* Zitat: Oh ja, sehr gut. In meiner Anfängerzeit habe ich auf meine Fragen meistens einen Klump Unix-C-Code ohne Kommentare geschickt bekommen... und wenn ich gefragt habe, wie's standardmäßig geht (im Sinne von, auf nicht-POSIX-Maschinen wie dem Amiga), dann hieß es meistens, "weiß ich nicht, interessiert mich nicht, bei mir funktioniert's". Und zumindest Holger kann mich verstehen: Das Wissen um die Hintergründe, wenn auch in 90% der Fälle überflüssig, kann Dir in den verbliebenen 10% der Fälle eine Heidenarbeit ersparen. Zitat: Ist ja gut. Ist ja nicht so, daß ich Ralf angepupt hätte, das sein Programmierstil Mist wäre! Nur thomas' Kommentar konnte ich nicht so stehen lassen - weder technisch noch vom Tonfall her, denn es ist nun einmal implementationsabhängig. Nimm z.B. bubblebobble. Offensichtlich fehlt ihm schon bei einfachen Sachen wie einem typedef die Präzision und das Hintergrundwissen um das, was er da eigentlich tut. Solche Leute sind in einem Programmierprojekt die Pest, und solche Aussagen sind für einen Anfänger mit Sicherheit verwirrender als Ausschnitte aus Standard und GCC-Manual. Zitat: Immerhin reden wir nu' drüber. ;-) Zitat: Ich habe eigentlich immer vom Allgemeinen (dem Standard) auf das Spezielle (die aktuelle Platform) geschlossen. Das hat mir eine Menge Neu- und Umlernen erspart, und ich wünschte, mir wäre am Anfang eine so genaue Hilfe zuteil geworden. Ist ein bißchen komisch: Bei C ist die genauere Hilfe die mit den ungenaueren Angaben... ich halt's halt einfach für wichtig, dazuzusagen, das beim AmigaOS, und das auch nur üblicherweise, structs 16-bit-Aligned sind... eben mit der Warnung, das dem nicht so sein muß und je nach Plattform (mit Blick auf AOS4 / MOS) auch anders sein wird. Zitat: Sehe ich ja ein. Aber ist es nicht viel angenehmer für alle Beteiligten, wenn er sich, auf der Klappe liegend, daran erinnert, was ihm schon einmal gesagt worden ist - statt stundenlang herumzuprobieren und dann mit einer diffusen Fehlerbeschreibung erneut in irgendeinem Forum aufzuschlagen? Zitat: Ja. Genug, um mich in keinster Weise auf diese Art von implementationsabhängigen Eigenheiten zu verlassen. Überrascht Dich das jetzt? [ - Answer - Quote - Direct link - ] |
2004-04-02, 10:08 h whose Posts: 2156 User |
Zitat: Vor allem wärs unberechtigt gewesen, denn für AOS stimmts Zitat: Was veranlaßt Dich dazu, zu denken, ein Basic-Progger, der eins seiner alten Programme weiter aufbohrt, könnte was mit der ixemul.library vorhaben? Hast Du da nicht ein wenig _zu_ weit gedacht? Zitat: Erklärs uns Was wäre denn dann? Größe und Lage wären bekannt. Ralf hätte höchstens gefragt, wie er den Wert des double ordentlich gelesen bekommt... [/quote] Zitat: Oh ja, sehr gut. In meiner Anfängerzeit habe ich auf meine Fragen meistens einen Klump Unix-C-Code ohne Kommentare geschickt bekommen... und wenn ich gefragt habe, wie's standardmäßig geht (im Sinne von, auf nicht-POSIX-Maschinen wie dem Amiga), dann hieß es meistens, "weiß ich nicht, interessiert mich nicht, bei mir funktioniert's". [/quote] Dann hast Du wahnsinnig Glück gehabt. Ich hab keinen Klump Unix-Code bekommen, den ich hätte auseinanderpfriemlen können. Ich wurde nur zugesülzt mit Unix-Interna. _Damit_ kann man erst richtig was anfangen... Zitat: Im Gegenteil. Den Anfänger interessierts anfänglich nur, wie er das hinbekommt, was er vorhat. Was dabei auf anderen Systemen passieren kann, interessiert ihn wohl eher weniger. Was bubblebobble da getippert hat, mag enorm "ungenau" gewesen sein, aber es funktioniert auf AOS. Darum gings doch. Zitat:Zitat: Jup Zitat:Zitat: Hmm, ich hab bisher die Erfahrung gemacht, daß die Anfänger schlicht und ergreifend die "allgemeine" Vorgehensweise nicht verstanden haben, eben weil ein gewisser "spezieller" Hintergrund fehlte. Zum Beispiel der Umgang mit externen Strukturen auf dem jeweils gewohnten System. Wenn das erstmal für ein System begriffen wurde, fällts deutlich leichter, das auch "im Allgemeinen" umzusetzen. Zitat: Ist alles völlig richtig, aber es war am Thema vorbei. Und besonders nützlich wars für Ralf auch nicht. Jede Wette: Wenn er mal aus AOS4 oder MOS umsteigt, kommt die gleiche Frage irgendwann nochmal Zitat: Und dann zu lesen: Wir habens Dir ja gesagt! Nu sieh zu, wie Du klarkommst... Neeee, das ist sicher nicht der richtige Weg. Es ist unwahrscheinlich, daß er mit diffusen Fehlerbeschreibungen kommt, wenn jetzt noch was schief laufen sollte. Immerhin hat man ihm grundsätzliches zu Strukturen erklärt, er hatte schon einen Erfolg und es dämmert ihm so langsam, wie Strukturen funktionieren. Wirst sehen, die Fragen werden deutlich genauer formuliert, nur nicht in den Termini, die Du gewohnt bist. Das ist der Unterschied Zitat:Zitat: In keinster Weise Was mich nur ein bißchen verblüfft ist die Tatsache, daß Du Dich mit hoher Wahrscheinlichkeit laufend drauf verläßt, ohne das zu merken Grüße [ - Answer - Quote - Direct link - ] |
2004-04-02, 10:42 h Solar Posts: 3680 User |
Zitat: Jedesmal, wenn ich's merke, hau' ich mir dafür auf die Finger. ;-) Mein aktuelles Projekt ist eine generische C-Standard-Bibliothek... man glaubt gar nicht, von was man alles nicht ausgehen darf. [ - Answer - Quote - Direct link - ] |
2004-04-02, 12:19 h gni Posts: 1106 User |
Zitat:AOS war impliziert. Tatsache ist und bleibt das AOS Wort-Ausrichtung benutzt. Das ist so und wird bei AOS/68k auch immer so bleiben. Das es sinnvoll unter AOS/68k ist 32bit Werte Langwort auszurichten, wird leider oft vergessen oder übersehen. Zitat:Nix. Auch das wird nur Wort ausgerichtet bei AOS/68k. [ - Answer - Quote - Direct link - ] |
2004-04-02, 12:25 h Holger Posts: 8116 User |
Zitat:Wenn man von den überall auftauchenden TagList's absieht ... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2004-04-02, 12:43 h bubblebobble Posts: 707 User |
Also hier herrscht ja ein scharfer Ton. Ralf hat eine einfache Frage gestellt, und ihr - statt sie ihm vernünftig zu beantworten - grabt alle möglichen Spitzfindigkeiten raus, die richtig sein mögen, aber mir der Lösung von Ralfs Problem nix zu tun haben. Sowas ist Gift für ein grosses Projekt, weil ihr euch an irrelavanten Dingen aufhängt. Ich habs nur einfach erklärt, ohne weitere Fachausdrücke zu verwenden, das mag eben unpräzise klingen, bringt dem Ralf aber mehr als eure Streitereien. Eure ganzen Ausführungen zusammengefasst: Ralf: Pass auf bei einzlenen Bytes auf die ein längerer Wert folgt, da wird ein "dummy" Byte eingeschoben, damit der nächste Werte wieder auf einer geraden Adresse liegt. Das kommt daher, dass der 68000er auf Word oder Long nur an geraden Adressen zugreifen konnte. Neuere Prozessoren können zwar auch auf ungerade Adressen zgureifen, sind aber möglicherweise dann langsamer. Und ein Double hat einfach 8 bytes, kommt aber so gut wie nie vor, ich glaube in keiner einzigen AmigaOS Struktur gibts das nicht überhaupt. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2004-04-02, 13:30 h Solar Posts: 3680 User |
Das ist doch der Kern der ganzen Diskussion... Ist es besser, einem Fragesteller nur genau die Information zu geben, die er zur Lösung seines aktuellen Problems braucht? Oder erklärt man ihm, woher sein Problem überhaupt kommt, auf das er ein ähnliches Problem nie wieder bekommt? Und wenn jemand sich für letzteres entscheidet, ist es angebracht, die zusätzlichen Information als "Blödsinn" darzustellen? [ - Answer - Quote - Direct link - ] |
2004-04-03, 01:56 h obw Posts: 94 User |
Zitat: Genau. Gib einem Mann einen Fisch, und er hat einen Tag zu essen. Zeige ihm, wie man angelt, und er wird nie wieder hungern. Zeige ihm das Marketing, und er wird seine neongrüne Karbonfaserangel zu schätzen wissen. Äh... Ich geh schon... OBW [ - Answer - Quote - Direct link - ] |
2004-04-03, 10:18 h Murmel Posts: 1459 User |
Zitat: Ohne Dir zu nahetreten zu wollen. Es reicht manchmal einfach auf "Fragen" zu antworten. Wenn jemand detalliert fragt, ihm die Antwort zu geben die er wissen will, oder lieber nix sagen. Warum sich um Sachen Gedanken machen die man vieleicht nie brauchen wird ? Der richtige Schubs in die (äh) richtige Richtung reicht meistens schon. [ - Answer - Quote - Direct link - ] |
2004-04-03, 10:50 h Mad_Dog Posts: 1944 User |
Zitat: Ralf27 wird das erwähnte Zeug nur dann brauchen, wenn er bei seinem geliebten Maxon Basic bleiben und damit auf AmigaOS-Strukturen zugreifen will. In C braucht man sowas nicht. Dort kann man das viel einfacher haben. Der "Schubs" wäre dann folglich "für die AmigaOS API-Programmierung nimmt man besser C". -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2004-04-03, 13:14 h whose Posts: 2156 User |
Zitat: *hüstel* das soll jetzt aber keine Eigenwerbung sein, oder? Spaß beiseite: Ralf, wenn Du eines Tages dazu übergehen solltest, alle Deine Progs in C umzusetzen, schau Dir den Kurs von Mad_Dog an. Ist alles drin, was man für den Anfang braucht, und wenn Fragen auftauchen, hast den Macher wenigstens zur Hand @Holger: Was ist an den Taglisten anders? Auch nur Strukturen, die im Speicher liegen. Da ist die Lage der einzelnen Member sogar noch einfacher zu ermitteln. Ein Array aus Strukturen, die jeweils aus zwei ULONG-Werten bestehen. Simpler gehts kaum noch. Kein Ärger mit Alignment, ein Zeiger, bekannte Größen... machs nicht immer komplizierter, als es wirklich ist. @gni: Was sollte uns das "3 char"-Beispiel sagen? Ohne folgenden WORD macht Alignment da einfach keinen Sinn auf AOS 68K, schon gar nicht auf Longword-Grenze... @bubblebobble: Laß Dich von dem Ton hier nicht beeindrucken. Das sind die ganz normalen Diskussionen zum Thema "Portabilität: Der heilige Gral der UNIX-Entwickler-Innung". Nach meiner Meinung hast Du das Problem von Ralf sachlich, schnell und hilfreich angegangen. Das ich von Deinen AmiBlitz-Progs recht beeindruckt bin, weißt Du ja schon Man kann halt auch in BASIC sehr ordentliche Programme schreiben. Die C-Gurus müßten das halt nur endlich mal respektieren... Grüße [ - Answer - Quote - Direct link - ] |
2004-04-03, 20:38 h Mad_Dog Posts: 1944 User |
Zitat: Nichts gegen Basic. Ich hab damals auch mit AMOS Pro angefangen. Aber ich weiß eben auch aus Erfahrung, daß AmigaOS API-Programmierung damit ein ziemlicher Hick-Hack werden kann, wie man an Ralf27's Problem sieht. In C kann man sich bekanntlich Low-Level Zugriffe bei Structs komplett sparen. Mag sein, daß es in manchen Basic-Dialekten einfacher geht (weil sie extrem aufgebohrt sind). Wer hier mitliest, wird wissen, daß Ralf27 immer wieder nach diversen API-Sachen (z.B. OpenGL) fragt. Da wird's mit den auf dem Amiga gängigen Basic-Dialekten vermutlich eng, schon alleine, weil es dazu keine passenden Includes (oder wie immer man das in Basic nennen mag) gibt. Ralf27 hat da ja selbst schon erfolglos versucht, diese "Includes" für MaxonBasic aus fd-Dateien zu erzeugen. Ich hab auch schon Intuition-Beispiele in Ada95 gesehen. Aber leider konnte ich gnat nicht dazu überreden, ein lauffähiges Executable zu machen, obwohl ich dieses Amiga-Ada Packages aus dem Aminet hatte. Hat zwar compilert, das Beispielprogramm aus dem Archiv ist dann aber leider abgeschmiert. Soll heißen: Nette Programmiersprachen gibt's viele. Aber für AmigaOS API Programmierung fährt man mit C/C++ am einfachsten. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2004-04-03, 21:40 h Ralf27 Posts: 2779 User |
Zitat: Ich möchte hier erst mal einige "Gerüchte" beseitigen: Zum einen der Peekl und Pokel was als Unart bei Basic gesehn wird. Aber wenn wir mal ehrlich sind ist das doch bei C genau so, nur sieht das dort anderst aus: dort steht statt "peekl" einfach -> Und die offsets sind auch bei Basic in den Include eingetragen. Insofern kann man dort auch so Programmieren wie unter C. Also sind dort nirgends Zahlen zu finden sondern nur Variablen aus den Includes. Ehrlichgetippt ist das möglich, aber ich mach das einigentlich nicht. Und zum anderen: Mir ist klar das MBasic nicht weiterentwickelt wird und das es von 1994 ist. Aber das ist auch so mit dem Classic-Amiga. Er wird auch nicht mehr seit 10 Jahren weiterentwickelt und genau für dieses System programmiere ich und mir ist klar das das nicht gerade Zukunftsorientiert ist. Für mich ist das zur Zeit egal. Das ist auch ein Grund wieso es nicht mit OpenGL ging. Leider braucht die Libs da die FPU-Register, die ich mit MBasic nicht benutzen kann. Vielleicht geht es ja doch, aber ich hab es nicht geschaft. Achja, ich bin auch dabei langsam C richtig zu lernen, allerdings wenn sich hier schon die erfahrenen Leute "streiten" wegen Structs... Ok, ein C-Progger muß nicht wissen wie sie im Speicher liegen, aber da gibt es schon verschiedene Ansichten: Ultraportable und Portable, wenn ich das mal zu tippen darf. [ Dieser Beitrag wurde von Ralf27 am 03.04.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-04-04, 03:35 h bubblebobble Posts: 707 User |
@Mad Dog: Siehst du, schon wieder Amiblitz mit AMOS verglichen. Ist aber nicht so, Amitlbitz ist näher an C würde ich sagen, nur eben etwas einfacher. Es gibt Strukturen, es gibt In-Line Assembler, es gibt Funktionen mit optionalen parametern, man kann re-entranten (heisst doch so!?) Code schreiben, die komplette AmigaOS API ist eigebettet, wenn es eine Lib gibt kann man sie mittels .fd File einfach einbinden, fremde Strukturen kann man mit Suchen&Ersetzen von C in Amiblitz konvertieren, und würde ich das Bernd vorschlagen, würde er sogar die Syntax anpassen damit man C include automatisch benutzen kann, denn die Sprache lebt! Nenne mal den GCC Jungs einen Änderungswunsch, mal sehen wie schnell die drauf reagieren ... Bernd macht sowas innerhalb von 1-2 Tagen. Amiblitz nimmt einem lediglich einige Dinge ab, die man unter C von Hand machen muss, trotzdem ist es sehr mächtig. Einziger Wermutstopfen ist, dass man nur 68K Code erstellen kann, zumindest wenn man den Basic komfort haben will. Dass man damit aber Apps schreiben kann, die überall laufen siehst du an meinen Programmen. Ok, HD-Rec braucht noch ein paar bugfixes, ist aber extrem komplex und die Bug kommen häufig durch inkompatibelität zu OS3.x nicht von Programmierfehlern, das wäre also unter C genauso passiert. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Answer - Quote - Direct link - ] |
2004-04-04, 10:10 h Mad_Dog Posts: 1944 User |
Zitat: Eben nicht! Mit den Befehlen der PEEK-Reihe liest man Bytes oder Words von einer bestimmten Adresse. Der -> Operator in C macht etwas ganz anderes. Er wählt die Komponente einer Struktur aus, auf die ein Zeiger gerade zeigt. Und das OHNE daß man die Adressen wissen muß. Wahrscheinlich verwechselst Du da was: VARPTR ist äquivalent mit & in C. Den & Operator benutzt man in C, um die Adresse einer Variablen zu ermitteln, genau wie VARPTR in Basic. -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 04.04.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-04-04, 10:13 h Mad_Dog Posts: 1944 User |
Zitat: Ralf27 programmiert in Maxon Basic. Übrigens: Zum kleine Games schreiben war AMOS Pro wirklich nett. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2004-04-04, 10:47 h Ralf27 Posts: 2779 User |
Zitat:Und ich muß die Adresse in Basic auch nicht wissen und genau das ist der Punkt. MaxonBasic ist in diesem Punkt genau so wie C! Die Adressen sind im Include gespeichert, ich muß also die Adressen nicht wissen. Wenn ich den Namen weiß (denn man in C ja auch wissen muß. ) dann kann ich statt einer Zahl den Namen schreiben und hab damit auch den Offset. Und -> ist doch nichts weiter als Peekl in Basic. Beweis mir was anderes. Anderst formuliert: Statt scr=peekl(win+46) halt scr=peekl(win+scrwindow) (hab jetzt die genauen namen nicht im Kopf weil ich halt damit nicht arbeite. Aber es ist in MaxonBasic möglich, genauso wie in C) Achja, ich will MBasic nicht verteidigen weil es eine *tote* Sprache ist, aber ganz so steinzeitlich ist sie nun wieder auch nicht. ) Zitat: Daran hab ich nicht gedacht, aber danke für die Info, jetzt hab ich wieder was in C gelernt. Ich muß ja zur Zeit paralleln ziehn zwichen MBasic und C damit ich das versteh. -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-04-04, 19:28 h Mad_Dog Posts: 1944 User |
Zitat: Also das kann ich Dir jetzt nicht glauben. Wie soll man von vorne herein wissen, wo die Struktur zur Laufzeit im Speicher liegen wird? In den Includes kann höchstens eine Art Makro stehen, die die Adresse ermittelt. Übrigens: Ich glaube, Du hast das Konzept der Zeiger auf Strukturen noch nicht richtig verstanden... In C funktioniert das so: Du deklarierst eine Zeigervariable, z.B. auf eine Window-Struktur: code:struct Window *Fenster; Dann rufst Du irgendwo OpenWindowTags auf. Diese Funktion gibt dann den Zeiger auf die Struktur zurück. Den Rückgabewert mußt Du dann Deiner Zeigervariable zuweisen: code:Fenster = OpenWindowTags( ... und so weiter Dann kannst Du auf diesen Zeiger Bezug nehmen, wenn Du an die Komponenten Deiner Window-Struktur herankommen willst, z.B.: code:rp = Fenster->RPort; // rp zeigt auf RastPort des Fensters Dabei ist rp wieder ein Zeiger, der vorher mit code:struct RastPort *rp; // Zeiger auf RastPort-Struktur Deklariert wurde. Alles weitere kannst Du in meinem C-Kurs unter "Zeiger auf Strukturen" lesen. -- http://www.norman-interactive.com [ - Answer - Quote - Direct link - ] |
2004-04-04, 19:44 h Ralf27 Posts: 2779 User |
Ich hab mir mal eben die Zitat-Antworten-Funktion gespart. :) Also, MadDog, bei MaxonBasic ist das *genau* so wie bei C, nur das da halt statt -> ein pokel steht. Wir beide meinen das selbe(ich hab Dich schon sehr wohl verstanden), nur scheine ich mich leider nicht sehr genau auszurücken. Aber ich versuch es nocheinmal :) : Natürlich weiß ich nicht die absoluten Adressen im OS und in den Includes stehen nur die Offsets, wie vermutlich auch im C. Und dort sind diese auch wie im Basic im includes declariert. Um Deinem Beispiel zu folgen: Wenn ich ein Fenster aufmache dann bekomme ich die Fensteradresse mit diesem Zeiger zurück. Um dann in den Rastport zu springen muß ich auchh bei Basic keine Feste Offsetadresse angeben sondern kann direkt über die im Includes declarierten Offsets ins Rastport springen. Ersetze doch einfach in einem C-Code die ->rastport durch pokel(rastport) und du hast die BasicZeile. .:) Insofern ist das doch das gleiche. Ich behaupte das einfach mal, denn ich kenne mich mit C eigentlich nicht aus. Aber genau so wie sich C durch die Strukturen hangelt mach ich es auch mit Basic. :) Also nochmal anderstherum für C-Progger: Wenn ihr mal ein Basic-Code sehr mit Pokel dann stellt sie euch einfach als -> im Kopf vor und ok. Aber es stimmt schon, wenn man Zahlen bei den Offsets benutzt statt die Variablen von den Includes dann ist das nicht gerade zukunftssicher. Mal eine Frage: Mann kann doch bestimmt auch die z.b. ->rastport ersetzen durch z.b. ->46. Oder? -- http://www.alternativercomputerclub.de.vu [ - Answer - Quote - Direct link - ] |
2004-04-04, 22:03 h Mad_Dog Posts: 1944 User |
Zitat: Nun, daß wir aneinander vorbeireden, liegt wahrscheinlich daran daß ich früher AMOS Pro benutzt habe, das die Offsets der OS-Stukturen nicht kennt. Auf Low-Level Niveau gedacht, ist eine Variable, die eine Adresse enthält, natürlich auch ein Zeiger. Klassisches Beispiel: Du programmierst einen Stack in Assembler. Dann hast Du eine Variable, die den Stackpointer darstellt. Jedenfalls ist das Abstraktionsniveau in C wesentlich höher. Da interessiert es Dich in der Regel nicht mehr, an welcher Adresse was liegt. Trotzdem kann man mit C auch Low-Level Programmierung machen. So gibt's z.B. in C auch den SHIFT-Operator >> bzw. << - sowas kennst Du sicherlich auch von Basic. Zitat: Das mit den absoluten Adressen kann auch garnicht funktionieren, da die Strukturen zur Laufzeit an immer verschiedenen Adressen im Speicher liegen. -- http://www.norman-interactive.com [ Dieser Beitrag wurde von Mad_Dog am 04.04.2004 editiert. ] [ - Answer - Quote - Direct link - ] |
2004-04-04, 22:51 h thomas Posts: 7718 User |
C hat ganz einfach den Vorteil, daß es ziemlich viel prüfen kann. Man muß sich schon ziemlich dämlich anstellen, um einen Pointer ins leere zeigen zu lassen. In Basic ist das einfacher. Nimm das Beispiel scr=peekl(win+WScreen), wie schnell schreibt man z.B. ausversehen scr=peekl(scr+WScreen). Solche Fehler kann man wochenlang suchen, da liest man immer drüber weg. Bei C würdest du damit einen Compiler-Fehler bekommen (WScreen ist kein Element von struct Screen). Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Answer - Quote - Direct link - ] |
1 -2- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Structs im Speicher | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |