amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Structs im Speicher [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 -2- [ - Beitrag schreiben - ]

01.04.2004, 19:02 Uhr

thomas
Posts: 7716
Nutzer

Worauf beziehst du dich ? Mein Einwand bezog sich auf den Abschnitt
Zitat:
Deswegen folgende Frage:
Wenn ein Programm ein Strukt zurückliefert[...]


Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 01:09 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Worauf beziehst du dich ? Mein Einwand bezog sich auf den Abschnitt
Zitat:
Deswegen folgende Frage:
Wenn ein Programm ein Strukt zurückliefert[...]


Ich beziehe mich auf:
Zitat:
Original von thomas:
Deshalb ist auch der Einwand von Holger überflüssig: wenn eine Struct einen Pointer enthält, dann steht da selbstverständlich nur der Pointer (also die Adresse mit 4Bytes) und nicht die Struct selber.

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.

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 01:14 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
Allerdings habe ich einen Hang zum Perfektionismus, was Code angeht. Mein Chef findet's bedeutend weniger schlimm als ihr hier. 8)

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 :lach:

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 02:10 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von gni:
Zitat:
Ja, und vor AOS 2.x hat Leo Schwab auch RastPorts auf dem Stack erzeugt...
Den kennt doch keiner von denen die hier posten ;-)

Ach? Du kennst ihn auch nicht? Sry, Hang zur Perfektion...;)

Ich kenn ihn noch.

Grüße


[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 02:25 Uhr

bubblebobble
Posts: 707
Nutzer
@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



[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 02:52 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Solar:
Gaaaaa-ha-haaa! X( Wer hat denn davon gesprochen? X(

Ich wollte klar machen, was "C" ist, was "GCC" und was "AmigaOS", und das die drei Teile mitnichten aus einem Guß sind. Ich wollte klar machen, wie structs funktionieren, und wie Compiler Alignment handhaben, statt nur zu sagen, "ungerade Adressen aufrunden".

Vielleicht schreibt Ralf sein nächstes Programm für AOS 4 / MOS?

Gut, ich halte die Backen. Man verzeihe mir, das ich eine Welt außerhalb AOS 3.x angenommen habe... :(


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

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 09:12 Uhr

gni
Posts: 1106
Nutzer
Zitat:
bubblebobble:
@Ralf27:
struct {
LONG a 0
LONG b 4
WORD c 8
BYTE d 10
BOOL e 11
}

e hat den Offset 12!
Zitat:
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.
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)

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 09:15 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von whose:

Hättst ihm ganz einfach (und vor allem _nicht_ hypothetisch) geantwortet, hätte ich kein Wort verloren.


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:
Hast Du ne Ahnung, wie frustrierend das werden kann?

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:
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.

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:
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 ;)

Immerhin reden wir nu' drüber. ;-)

Zitat:
Laß ihn doch erstmal bißchen Erfahrung sammeln, bevor Du ihm das Eingemachte servierst.

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:
Auf die Klappe fallen muß er auch, damit er überhaupt begreifen kann, was Du ihm erklären wolltest.

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:
Eins noch zum Linker-Problem mit "struct by value": Sagt Dir das Stichwort "Intermediate Code" irgendetwas? ;)

Ja. Genug, um mich in keinster Weise auf diese Art von implementationsabhängigen Eigenheiten zu verlassen. Überrascht Dich das jetzt? I-)

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 10:08 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Solar:
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...)


Vor allem wärs unberechtigt gewesen, denn für AOS stimmts ;)

Zitat:
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 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:
Was z.B. wäre, wenn besagte Struktur einen double enthält? *evilgrin*

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:
Hast Du ne Ahnung, wie frustrierend das werden kann?

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:
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.


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:
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 ;)

Immerhin reden wir nu' drüber. ;-)


Jup :)

Zitat:
Zitat:
Laß ihn doch erstmal bißchen Erfahrung sammeln, bevor Du ihm das Eingemachte servierst.

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.


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 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.

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:
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?

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:
Eins noch zum Linker-Problem mit "struct by value": Sagt Dir das Stichwort "Intermediate Code" irgendetwas? ;)

Ja. Genug, um mich in keinster Weise auf diese Art von implementationsabhängigen Eigenheiten zu verlassen. Überrascht Dich das jetzt? I-)


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


[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 10:42 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von whose:
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 ;)


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. :rotate:

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 12:19 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Solar:
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.

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:
Was z.B. wäre, wenn besagte Struktur einen double enthält? *evilgrin*
Nix. Auch das wird nur Wort ausgerichtet bei AOS/68k.

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 12:25 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von whose:
Zitat:
Original von Solar:
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...)


Vor allem wärs unberechtigt gewesen, denn für AOS stimmts ;)

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.

[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 12:43 Uhr

bubblebobble
Posts: 707
Nutzer
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



[ - Antworten - Zitieren - Direktlink - ]

02.04.2004, 13:30 Uhr

Solar
Posts: 3680
Nutzer
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?

[ - Antworten - Zitieren - Direktlink - ]

03.04.2004, 01:56 Uhr

obw
Posts: 94
Nutzer
Zitat:
Original von Solar:
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?


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


[ - Antworten - Zitieren - Direktlink - ]

03.04.2004, 10:18 Uhr

Murmel
Posts: 1457
Nutzer
Zitat:
Original von Solar:
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?


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.



[ - Antworten - Zitieren - Direktlink - ]

03.04.2004, 10:50 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Murmel:

Warum sich um Sachen Gedanken machen die man vieleicht nie brauchen wird ? Der richtige Schubs in die (äh) richtige Richtung reicht meistens schon.


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". :D


--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

03.04.2004, 13:14 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von Mad_Dog:
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". :D


*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

[ - Antworten - Zitieren - Direktlink - ]

03.04.2004, 20:38 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von whose:

Man kann halt auch in BASIC sehr ordentliche Programme schreiben. Die C-Gurus müßten das halt nur endlich mal respektieren...


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

[ - Antworten - Zitieren - Direktlink - ]

03.04.2004, 21:40 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Mad_Dog:

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 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. ]

[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 03:35 Uhr

bubblebobble
Posts: 707
Nutzer
@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



[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 10:10 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Ralf27:

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 ->


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. ]

[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 10:13 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von bubblebobble:
@Mad Dog:
Siehst du, schon wieder Amiblitz mit AMOS verglichen.


Ralf27 programmiert in Maxon Basic. Übrigens: Zum kleine Games schreiben war AMOS Pro wirklich nett. :)


--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 10:47 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Mad_Dog:
Zitat:
Original von Ralf27:

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 ->

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ß.
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:
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. ]


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

[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 19:28 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Ralf27:

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)


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

[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 19:44 Uhr

Ralf27
Posts: 2779
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 22:03 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Ralf27:

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 :) :


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:
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.

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. ]

[ - Antworten - Zitieren - Direktlink - ]

04.04.2004, 22:51 Uhr

thomas
Posts: 7716
Nutzer

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/

[ - Antworten - Zitieren - Direktlink - ]


1 -2- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Structs im Speicher [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.