ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Gleiches Programm wird von GCC kompiliert aber nicht von G++ ? | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
1 -2- 3 | [ - Beitrag schreiben - ] |
12.08.2005, 11:02 Uhr Solar Posts: 3680 Nutzer |
Zitat: Wenn Du ausdrücken möchtest, das der Speicherbereich, auf den foo zeigt, auch beschreibbar ist, natürlich nicht. Aber wenn der Code später mal in ein ROM gebrannt werden soll (und foo somit in nicht beschreibbaren Speicher liegt), hättest Du dann nicht gerne eine Warnung vor einem Schreibzugriff, bevor Du das erste ROM verbrannt hast? Von wegfallenden Optimierungsmöglichkeiten für den Compiler (der z.B. einen const-Parameter nicht unbedingt kopieren muß) gar nicht zu reden. Zitat:Zitat:Ach? Willst Du mich jetzt auf den Arm nehmen oder was? [ - Antworten - Zitieren - Direktlink - ] |
12.08.2005, 11:35 Uhr whose Posts: 2156 Nutzer |
Zitat: Wer glaubt, daß der Hauptzweck von C++ sei, "sichere" Anwendungen zu schreiben? Wenn Du nur Unterstellungen parat hast, diskutier doch besser nicht mit uns darüber, ok? Zitat: Wenn Du den ganzen Sermon mal richtig gelesen hättest, wäre Dir aufgefallen, daß ich Holger die Gründe dafür dargelegt habe, warum man es damals nicht als const deklariert hat. Daß DU das heute anders machen würdest, steht auf einem ganz anderen Blatt. Und bei "const" läßt auch ein C-Compiler nur ungern mit sich reden Zitat: Soweit waren wir ja noch gar nicht. Und alles auf den Zeitdruck zu schieben spricht, ehrlich gesagt, von Nichtwissen um die Praktiken der Vergangenheit. Zitat: Ist Dir das Wort "Heute" in Deinem Satz aufgefallen? Aber auch früher wußten die Leute, was sie tun. Vielleicht sogar mehr als heute... Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 12.08.2005 um 12:25 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.08.2005, 11:38 Uhr whose Posts: 2156 Nutzer |
Zitat: Laß diesen Satz zusammen mit meinen Ausführung einmal richtig auf Dich wirken. Vielleicht kapierst Du dann endlich, was ich seit nem dutzend Posts erläutere... Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
12.08.2005, 13:11 Uhr Solar Posts: 3680 Nutzer |
Zitat: Du offenbar. Ich zitiere: Zitat: Von Sicherheit habe ich nicht gesprochen. Zitat: Offensichtlich mehr als das. Zitat: Ja, in völliger Verkennung dessen, was "const" eigentlich an welcher Stelle so genau bewirkt. Paragraphenweise und über mehrere Posts hinweg läßt Du Dich darüber aus, das die Struktur ja wiederverwendbar sein soll und es deshalb kein "const char *" sein darf... was schlicht Unsinn ist. Dann fängst Du sogar an, von Assembler und der Unmöglichkeit "narrensicherer" Programmierung zu fabulieren... hallo? Auf welcher Tangente bist Du denn? Es ging um Amaris' Problem, das sich aus der nachlässig programmierten API ergibt. Nicht um "wasserdichte" Programmiersprachen. (Java gibbet's auf dem Amiga bis auf weiteres nicht, und selbst damit programmiert man sich in < 100 Zeilen ein Speicherleck.) Zitat: Welche großartigen Praktiken waren das denn? Bring's mal bitte auf den Punkt, ich bin gespannt. Zitat:Zitat: Offenbar nicht, denn sonst wäre man z.B. an dieser Stelle gründlicher vorgegangen. [ Dieser Beitrag wurde von Solar am 12.08.2005 um 15:01 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
12.08.2005, 13:13 Uhr Solar Posts: 3680 Nutzer |
Zitat: Da gibt's nichts zu kapieren, weil Du seit 'nem dutzend Posts etwas zu erläutern versuchst, von dem außer Dir niemand redet. [ - Antworten - Zitieren - Direktlink - ] |
12.08.2005, 22:30 Uhr Holger Posts: 8116 Nutzer |
Zitat:Was meinst Du damit? Hast Du mal die Postings richtig gelesen? Um mich selbst zu zitieren: Zitat: Also Solar's Posting war nicht das erste mit einer solchen Aussage. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.08.2005, 22:49 Uhr Holger Posts: 8116 Nutzer |
Zitat:Du willst es einfach nicht begreifen. Intern kann die locale.library mit dem Puffer machen was es will. Er wird aber als konstanter String herausgegeben. Und verdammt noch mal alle hier wissen, daß die commodore-Entwickler nachlassig programmiert haben, deshalb wissen wir auch, daß die const-Deklaration fehlt. Was Du immer noch nicht begriffen hast, ist daß wenn die const-Deklaration vorhanden wäre, wie es korrekt wäre, selbstverständlich die locale.library weiterhin mit veränderbaren Puffern hantieren könnte. Sie würden bei herausgeben zu Konstanten werden, ohne daß ein cast benötigt wird. Denn es ist die natürliche Vorgehensweise, wie sie vom Compiler unterstützt wird. Im Nachhinein innerhalb der Anwendung aus diesem const-String wieder einen veränderlichen zu machen, ist ein Programmierfehler, den der Compiler zu recht moniert. Ohne weitere Diskussion. Zitat:Begreif es doch endlich. Wie die locale.library ihre strings intern speichert, hat nicht damit zu tun, mit welchem typen sie sie herausgibt. Aus internen mutable Objekten beim herausreichen const zu machen, ist ein natürlicher Vorgang. Und außerhalb der locale.library gibt es keine "Erweiterung zur locale.library". Hat es auch keine zu geben. Zitat:Die locale.library benutzt nirgendwo intern eine IText-Struktur, da kannst Du sicher sein. Zitat:Blödsinn, Du hast einfach immer noch nicht begriffen, was const bedeutet und versuchst die Begründung für die falschen Header-Definitionen im Amiga-API anhand einer völlig falschen Deutung von const herzuleiten. Natürlich lieferst Du damit einen durchaus möglichen Grund. Sollten alle Commodore-Entwickler genauso falsche Vorstellung von den C-Datentypen gehabt haben, könnte das die Ursache sein. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.08.2005, 23:12 Uhr Holger Posts: 8116 Nutzer |
Zitat:Schon mal falsch. Wir reden vom AmigaOS, das Mitte der 80er entwickelt wurde. Und wir reden von const und signed, das damals beides schon ein alter Hut war. Zitat:Dieser *überhaupt nicht normale Fall* kann durchaus mit einem einzigen cast pro Puffer erledigt werden. Und vor allem: was hat das mit den Deklarationen des API zu tun? Zitat:Erstens besteht das AmigaOS zu 90% aus Code, der von mehreren Tasks gleichzeitig ausgeführt werden kann, womit string-Konstanten, die in einem statischen Block liegen, auf keinen Fall als Puffer benutzt werden können. Sollte tatsächlich dort eine solcher String als Puffer benutzt worde nein, haben sich die Commodore-Entwickler bereits in's Knie geschossen, und es wäre durchaus von Vorteil gewesen, wenn der Compiler vor einem solchen Gau gewarnt hätte. Aber irgendwie bezweifle ich, daß so ein übler Bug nach Kickstart 1.1 noch irgendwo wiederholt wurde. Zitat:Nein. Zitat:Die Definition von "Pfusch am Bau" hat sich nie geändert. Und wie oben schon ausgeführt, kann eine solche Vorgehensweise im AmigaOS nie funktioniert haben. AmigaOS ist ein Multitasking-System, String-Konstanten als Puffer zu mißbrauchen, kann nur in einer einzelnen Anwendung funktioniert haben. Und auch damals gab es schon optimierende Compiler, die gleiche String-Konstanten auf einen Speicherbereich gelegt haben. Wäre dann ziemlich blöd, wenn ein Programmteil ein String-Konstante als schreibbaren Puffer mißbraucht, während ein anderer Teil eine andere Konstante, mit gleichem Inhalt wie der ursprüngliche Inhalt der ersten Konstantefür andere Zwecke nutzen will. Ziemlich blöd. Zitat:Ne, habe ich nicht, denn ich habe nie einen Zusammenhang zwischen Typisierung und Sicherheit gesehen. Es geht darum, die Codequalität zu verbessern und Fehlerquellen zu reduzieren, mehr nicht. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
15.08.2005, 10:17 Uhr gni Posts: 1106 Nutzer |
Zitat:Mich stört seine undifferenzierte Sichtweise, die in dem Zitat nur allzu deutlich wird. [ - Antworten - Zitieren - Direktlink - ] |
15.08.2005, 10:50 Uhr Solar Posts: 3680 Nutzer |
Zitat: Mir ist erst im Nachhinein aufgefallen, das es eigentlich nur whose ist, der hier das Kapitel "const" anscheinend übersprungen hat. Das hätte ich deutlicher machen können, ja. Ansonsten differenziere ich bei semantischen Fehlern nicht nach solchen, die der Compiler anmeckert (wie die Warnung, über die Amaris stolperte), und solchen, die der Compiler nicht mitbekommt (wie der const char * = "xyz" aus Deinem Beispiel). Welcher Teil davon Dich jetzt dermaßen stört, weiß ich nicht. [ - Antworten - Zitieren - Direktlink - ] |
15.08.2005, 13:02 Uhr whose Posts: 2156 Nutzer |
@Solar: Ich kanns mir zwar vorstellen, aber das soll gni selbst schreiben. Wie wär's, wenn wir dieses Kapitel hier schließen? Holger und Du beharrt auf Eurer Meinung, ich hätte nicht verstanden, was da passiert ist und wie sich das heute bemerkbar macht. Gut, akzeptiere ich so. Ich werd auch nie wieder versuchen, die lustigen (und funktionierenden, lieber Holger. Ich sage dazu nur Init...()) Tricks von damals zu erläutern. Tut mir nur bitte den Gefallen und laßt die Panikmache in Sachen AmigaOS-API weg. Statt dessen könntet ihr Euch an die von mir angeregte Lib setzen, das wäre sinnvoller. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 15.08.2005 um 13:05 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
15.08.2005, 20:12 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ich glaube aber, jetzt wird mir klarer, was Du eigentlich meinst. Nicht daß C= Entwickler diese Programmiertechnik benutzt hätten, sondern die zur Verfügung gestellten Routinen, die den Anwendungsprogrammierer zu einer solchen Programmierweise ermutigt haben, ala char* bla=" "; InitBitMap(bla); meintest Du diese Art von tollen Ideen? (Die auf dem A500 wahrscheinlich 0.5 ms auf einer Laufzeit zwei Stunden Gewinn gebracht haben, wenn sie richtig angewendet wurden und zwei Tage zusätzliches Debugging wenn nicht). mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ Dieser Beitrag wurde von Holger am 15.08.2005 um 20:44 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
15.08.2005, 20:53 Uhr whose Posts: 2156 Nutzer |
Zitat: Jep, u.A. das meinte ich. Bis Kickstart 3.0 kamen solche "Tricks" aber durchaus auch im Kickstart vor, Reste davon findest Du heute noch u.A. in der locale.libary (der Stringpuffer. Wird zwar für jede Inkarnation der locale.library neu angelegt, sieht mir aber verdächtig nach einer "ehemaligen" Konstanten aus, wenn ich mir den Code drumherum so anschaue. Auf jeden Fall hats nen triftigen Grund, warum diese Stringzeiger nicht als CONST_STRPTR deklariert sind, sondern statt dessen als READ ONLY kommentiert wurden). Frag mich aber bitte nicht, warum diese "Tricks" sich so lange gehalten haben. Vermutlich spielt Bequemlichkeit da eine große Rolle. Und die Tatsache, daß da einige Leute wohl lieber Assemblertricks benutzten, statt sich mit "Förmlichkeiten" zu arrangieren Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 15.08.2005 um 21:11 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
16.08.2005, 10:02 Uhr gni Posts: 1106 Nutzer |
Zitat:Bahnhof. [ Dieser Beitrag wurde von gni am 16.08.2005 um 10:03 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
16.08.2005, 13:49 Uhr whose Posts: 2156 Nutzer |
Zitat: Stell Dir vor, jemand wäre so brilliant, das char *bla=" " exakt so groß zu definieren, daß ne BitMap-Struktur reinpaßt. Also sizeof(bla) == sizeof(struct BitMap). Kein AllocMem(), kein FreeMem()... Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
16.08.2005, 14:07 Uhr Solar Posts: 3680 Nutzer |
Also wird der Speicherbedarf durch den Linker gedeckt, bläst das Executable auf, verlangsamt den Ladevorgang, benötigt den Speicher während der gesamten Programmausführung statt nur bei Bedarf... riesig effizient. [ - Antworten - Zitieren - Direktlink - ] |
16.08.2005, 14:16 Uhr whose Posts: 2156 Nutzer |
Zitat: Das hängt a) vom Compiler/Linker ab, b)von der Faulheit des Programmierers. Ist halt bedeutend weniger Tipparbeit und die Freigabe nimmt einem der Compiler auch noch ab Ganz nebenbei spart man sich dadurch einiges an Speicher, der sonst erst extern angefordert werden müßte (inkl. Overhead). Das der Speicher während der gesamten Programmausführung "verbraten" wird, war vielen Leuten gar nicht so bewußt und beim (teilweise handoptimierten) ROM-Code war das nicht wirklich ein Problem. Ein großes Thema vor nicht allzu langer Zeit... Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 16.08.2005 um 14:23 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
16.08.2005, 14:20 Uhr gni Posts: 1106 Nutzer |
Zitat:Woher hast Du dieses Konstrukt? Warum sollte man es *so* machen? Da kann ich auch gleich ein BitMap Objekt definieren. Ich kann immer noch nicht folgen. [ - Antworten - Zitieren - Direktlink - ] |
16.08.2005, 14:32 Uhr whose Posts: 2156 Nutzer |
Zitat: InitBitMap() als Beispiel kam von Holger. Das Spielchen kannst Du bei vielen Funktionen des AmigaOS treiben, nicht nur bei denen, die mit "Init" beginnen. Das Konstrukt habe ich aus uraltem Code, teilweise ist der auf FishDisks zu finden, teilweise habe ich den vom CATS. Warum man das *so* machen kann, habe ich oben erläutert. Weniger Tipparbeit, und bei gewissem Code (Module, die aus nem ROM ins RAM kopiert werden) sind die Nachteile kaum spürbar. Es ist halt simpler, Code mitsamt (kleinen) Datenbereichen einfach in den Speicher zu kopieren. Dank Relocation ist es noch nicht einmal ein Problem, an den Datenbereich heranzukommen. Anders herum hast Du sonst den "Verwaltungskram" (Speicher anfordern/freigeben) und den eigentlich benötigten Speicher, was den Gesamtspeicherplatz doch mehr reduziert als die "Holzhammermethode". Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 16.08.2005 um 14:33 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
16.08.2005, 14:34 Uhr Solar Posts: 3680 Nutzer |
Zitat: Was hängt vom Compiler / Linker ab? Das für ein initialisiertes char-Array Speicher im Datensegment des Executables angelegt werden muß? Mit viel Glück kann ein mit |