Schwerer, unspezifischer Fehler

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2, 3, 4

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

 

Omenaton_2

Betreff: TYPE Methode von Holzchopf

BeitragDi, Nov 24, 2009 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur noch ganz kurz was zu Holzchops Type Verwendungstipp.

Wie ich schon geschrieben habe, Types verwende ich in meinen Progammen sehr, sehr oft und gerne. Allerdings ich nehme niemals Types in Types, weil das nur in einem kurzen Beispielcode gut aussehen kann. In der Praxis, wenn sowas in Mitten von mehreren Schleifen und If Thens vorkommt und dann noch Teil einer komplexen Berechnungsformels ist, wird es schwer leserlich und das versuche ich immer zu vermeiden.
(Ich weiß, es geht jetzt nicht um Types in Types, das wollte ich nur erwähnen.)

Ich muß zugeben, ich habe nicht an die Möglichkeit gedacht, die "linke Seite" eines Types auszutauschen und dann so zu kopieren. Das ist eine interessante Möglichkeit.
Allerdings sollten wir nicht so tun, als ob das nicht damit gleich käme, neue Variablen wenn auch nur temporär einzuführen. Die Felder der neuen, kopierten Types sind doch auch sowas wie neuen Variablen (Locals), die es normaler weise nicht geben würde UND es müssen dann doch alle ca 400 Felder angegeben (Werte zugewiesen) werden.

Dann finde ich die Lösung die ich genommen habe besser oder zumindest nicht schlechter. Ich habe nur 3 temporäre Variablen benutzt die nicht mal neu eingeführt werden müssen, weil ich diese Variablen oft in Code ausschließlich für extrem kurze Codeabschnitte (für die Dauer von 2-3 Zeilen) benutze. Es wird also keine einzige neue Variable eingeführt, weder temporär noch bleibend.

Es gab vor der beschriebenen Objekt-Kopier-Aufgabe noch keinen einzigen Fall, in dem ich hätte alle oder einen Großteil der Felder eines Types kopieren müssen. (weil ich 2 Instanzen des selben Types zur gleichen Zeit brauche, sagen wir zum Vergleichen.)

Es passiert aber einiges Mal, daß ich gleichzeitig 1-3 Variablen von 2 Instanzen des selben Types brauche (meist als Vergleich). Dann gehe ich immer so vor, daß ich das relevante Feld der einen Instanz in eine temporäre (aber namentlich verständliche) Variable ablege, danach springe ich zu der anderen Instanz des selben Types und vergleiche die Werte der besagten Felder miteinander.
Würde ich die Methode mit dem Kopieren des Types nehmen, dann würden doch gleichzeitig und sofort alle einzelnen Felder eines großen Types zumindest initialisiert, erschaffen, nicht nur die 1-3 Variablen die ich tatsächlich brauche. Oder sehe ich das falsch ?

So mache ich das in diesen Fällen :

Code: [AUSKLAPPEN]
CornNW_1 = WpSys\CornNW_Exists

SavedWPS_ID = WpSys\System_ID ; ID der ursprünglichen Type Instanz ablegen
   
; Type Instanz dessen 1 Variable mit einem anderen verglichen werden soll anspringen :   
For   WpSys.WAYPOINTSYS = Each WAYPOINTSYS
   If WpSys\System_ID = Gesucht_ID Then Exit
Next
   
If WpSys\CornNW_Exists > CornNW_1 Then MachIrgendwas ; Beispiel Aktion

For   WpSys.WAYPOINTSYS = Each WAYPOINTSYS ; Zurück zum ursprünglichen Type Instanz
   If WpSys\System_ID = SavedWPS_ID Then Exit
Next

; Programmablauf kann fortgesetzt werden


Da werden 2 Variablen eingeführt (oder auch mal 3-4), aber die werden dann immer wieder benutzt wenn ich diese Rutine anspringe, das ist also keine oder keine nennenswerte Verschwendung.
Sollte es so sein wie ich vermute, daß wenn ich die linke Seite einer Type-Struktur ändere (um so eine "Kopie" des Types zu erhalten), dann augenblick und automatisch alle zum Type gehörenden Felder neu angelegt werden, dann wäre das eine viel größere Verschwendung.

Noobody

BeitragDi, Nov 24, 2009 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Omenaton_2 hat Folgendes geschrieben:
Dann finde ich die Lösung die ich genommen habe besser oder zumindest nicht schlechter.

Okay, angenommen, wir wollen eine Variable namens TypeVariable kopieren und in der neuen Variable TypeCopy ablegen.

Du sagst dann also, dass diese Lösung Code: [AUSKLAPPEN]
Local TypeVariable.TollerType = WasAuchImmer

Goto CopyType

.CopyType
   Insert ( New TollerType ) After TypeVariable
   
   TempInt = TypeVariable\IntField : TypeVariable = After TypeVariable : TypeVariable\IntField = TempInt : TypeVariable = Before TypeVariable
   TempFloat# = TypeVariable\FloatField# : TypeVariable = After TypeVariable : TypeVariable\FloatField# = TempFloat : TypeVariable = Before TypeVariable   
   
   TypeCopy.TollerType = After TypeVariable
Return


gleich übersichtlich und schön ist wie diese Lösung Code: [AUSKLAPPEN]
Local TypeVariable.TollerType = WasAuchImmer

Local TypeCopy.TollerType = CopyType( TypeVariable )


Function CopyType.TollerType( Original.TollerType )
   Local Copy.TollerType = New TollerType
   
   Copy\IntField    = Original\IntField
   Copy\FloatField# = Original\FloatField#
   
   Return Copy
End Function


Falls dir jetzt der Vorteil von mehreren Typevariablen und Funktionen gegenüber Gosub-Routinen nicht klar wird, weiss ich auch nicht Razz Ansonsten poste mal einen Code, wie du das gelöst hättest, vielleicht übersehe ich ja, wie sich das mit nur einer Typevariable und Gosub besser lösen würde.

Omenaton_2 hat Folgendes geschrieben:
Die Felder der neuen, kopierten Types sind doch auch sowas wie neuen Variablen (Locals), die es normaler weise nicht geben würde

Sind sie nicht. Wenn ich eine neue Typevariable als lokal definiere, gibt es nur eine neue Variable, egal, wieviele Fields der Type enthält. Die Typevariable enthält nämlich nur die Adresse zum Type, und nicht etwa vierhundert neue lokale Variablen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
  • Zuletzt bearbeitet von Noobody am Di, Nov 24, 2009 15:14, insgesamt 2-mal bearbeitet

D2006

Administrator

BeitragDi, Nov 24, 2009 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@Omenaton Und so ist es selbst verständlich nicht. Die "linke" Seite ist sozusagen eine Referenz. Die Felder der Type-Instanzen existieren für jede Instanz doch sowieso schon und es werden intern keine neuen angelegt, auch nicht temporär.

Und das was du unleserlich findest - Types in Types - ist in der objektorientierten Normalzustand und alles andere als unleserlich. In meinem Rennspiel gibt's zum Beispiel einen Type TPlayer. Jeder Spieler hat ein Auto, repräsentiert von einem Physik-Objekt vom Type TCar. Jedes Auto hat vier Räder vom Type TWheel. Jedes Rad hat eine Position innerhalb des Autos, die durch einen Vektor repräsentiert wird, was dann TVector wäre.

Wenn ich nun also auf die X-Position des ersten Rades des Autos eines Spielers zugreifen möchte, würde das ungefähr so aussehen (in BB übersetzt; eigentlich in BMax):
BlitzBasic: [AUSKLAPPEN]
Print myPlayer\car\wheel[0]\offset\x
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Casiopaya

BeitragDi, Nov 24, 2009 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Omenaton_2 hat Folgendes geschrieben:
Zu erst zu dem Beispiel Code.

Hallo.

Code: [AUSKLAPPEN]


Gosub BerechneEntfernung
WritePixel Sin(r) * Entfernung, Cos(r) * Entfernung, $FFFFFFFF

.BerechneEntfernung

Entfernung = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)

Return





ok, so langsam verstehe ich die ganze Diskussion. Tut mir leid das sagen zu müssen, aber du hast nicht verstanden wozu Functions da sind. Sie dienen nicht einfach dazu Code aus einer Hauptschleife "auszulagern", sondern sie dienen vorrangig dazu wiederkehrende "Funktionalität" zu kapseln. (Die Funktionalität ist in diesem Fall übrigens die Entfernungsmessung...). Was meinst du wohl wie viel Dinge ums Programmieren du noch nicht weist?

Wenn hier keine mehrfache Funktionalität von dir erwartet wurde: Was macht in diesem Fall das GoSub überhaupt für einen Sinn? Fall du den Code nur an genau einer Stelle verwendest kannst du die Variable doch einfach ausrechnen und im Code-Fluss einbauen (dann braucht man also weder GoSubs noch eine Funktion).

Dass im Beispiel die Funktion zwei mal mit gleichen Parametern aufgerufen wird ist wohl zufall, wie programmierst du :

Code: [AUSKLAPPEN]


WritePixel Sin(r)*Entfernung(x1,y1,x2,y2),Cos(r)*Entfernung(a1,b1,a2,b2),$FFFFFFFF
WritePixel Sin(r)*Entfernung(d1,e1,d2,e2),Cos(r)*Entfernung(f1,g1,f2,g2),$FFFFFFFF
WritePixel Sin(r)*Entfernung(h1,i1,h2,i2),Cos(r)*Entfernung(j1,k1,j2,k2),$FFFFFFFF
WritePixel Sin(r)*Entfernung(l1,m1,l2,m2),Cos(r)*Entfernung(n1,o1,n2,o2),$FFFFFFFF




Wie geht das bei 10 Zeilen??? Wie bei mehreren Aufrufen, die aus verschiedenen Modulen gestartet werden?

BTW: Aufgrund deines "Uncooler Typ" Arguments klink ich mich nun aus der Diskussion aus, da du wirklich ein hoffnungsloser Fall bist. 10.000de Universitäten, Unternehmen und Software-Entwickler verwenden weltweit seit Jahrzehnte Functions anstatt GoSubs um "Cool" zu sein? Evil or Very Mad Evil or Very Mad Evil or Very Mad Man, ich hoffe du hast was anderes gelernt und kannst wenigstens das....

Ich beobachte den Beitrag und warte auf deine Code-Lösung.

EDIT: Ich möchte dich nicht persönlich angreifen und möchte dir als letztes einen (ehrlich) gut gemeinten Rat geben: Es ist keine Schande, wenn man von Anfang an nicht gut programmieren kann. Das kann keiner, woher sollte das umfangreiche Wissen um das Entwickeln von Software auch kommen? Kein Meister ist je vom Himmel gefallen. Falls du einen Führerschein hast: Den hast du sicher auch mit Hilfe eines Fahrlehrers gemacht, hättest du das alleine geschafft?

Ich habe auch nur rumgehackt, bevor ich Software-Entwicklung wirklich gelernt habe. Lernen heist wie überall: Ich habe aus den Erfahrungen und Entwicklungen anderer profitiert uns sie mir zu eigen gemacht. Das geht durch Bücher (ein Anfänger-Buch über die Objekt-Orientierung könnte ich dir z.B. empfehlen), durch viel Übung und durch den Rat von Menschen, die bereits gelernt haben gute Software zu entwickeln.

Alfadur

BeitragMi, Nov 25, 2009 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hui. Hab jetzt alles durchgelesen. Interessant... und wenn du jetzt erst bei der Hälfte der Programmierarbeiten bist, wielange wird es wohl dauern bis du variablentechnisch wieder an diese Compilergrenze stößt? Früher oder später wirst du Funktionen nutzen müssen, besser du tust es früher als später...
A Cray is the only computer that runs an endless loop in less than four hours.

FireballFlame

BeitragMi, Nov 25, 2009 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Omenaton_2 hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
;--- Die Lösung mit Function --------------------------------------------------------

WritePixel Sin(r) * Entfernung(x1,y1,x2,y2), Cos(r) * Entfernung(x1,y1,x2,y2), $FFFFFFFF

;... wird hier die Function 2 mal in der selben Zeile aufgerufen und berechnet ? Bei Gosub reicht es nur ein Mal.

Function Entfernung(x1,y1,x2,y2)

   Return Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)

End Function

Aaaah ja. Doppelt berechnen.
Und wäre dann das Problem bei
Code: [AUSKLAPPEN]

Local E=Entfernung(x1,y1,x2,y2)
WritePixel Sin(r) * E, Cos(r) * E, $FFFFFFFF

Function Entfernung(x1,y1,x2,y2)
   Return Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
End Function

?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

Gast

BeitragMi, Nov 25, 2009 22:56
Antworten mit Zitat
Zitat:
[..] Das ist wie der Zwang bei Jugendlichen die aktuelle Modetrends streng zu befolgen. Wer das nicht tut wird von der Gemeinschaft als "uncooler Typ" ausgestoßen. [...]


Und mal ehrlich, die meisten jugendlichen Programmierer sind nicht "cool". Ich gehe nicht nach der Mode, ich stelle mich vor den Schrank und klicke auf "Random". Mir ist es egal, wenn andere denken, was ist denn das für ein Typ, der kann ja gar net Skaten/ist nicht gut in Sport / was hat denn der an?/ usw. Aber ich programmiere seit ca. einem Jahr in C#. Und das hat mit einer beigebracht, der von der Mode soviel versteht, wie ich von Fußbällen (Ich verstehe bis heute nicht, warum die für 100€ 5x besser sind). Und verstehe nichts von Skaten, bin nicht gut in Sport und Mode ist mir egal. Ich habe trotzdem Freunde (ich bin gerade von einem nach Hause gakommen). Und DU willst MIR erzählen ich sei als "uncooler Typ" ausgestoßen...

Okay, ich sag dir eines. In WoW verwenden die Objektorientirung. Da sind in einer Klasse (so ca. 5 - 50? Funktionen) so ca. 50 variablen. Höchstens. Der Rest lagert in anderen klassen. Man braucht kein PosX, PosY, Width, Height. Nein, man schreibt eine Rectangle Klasse, die dann nur eine einzige ist. Die dann noch eine Collide-Funktion hat. Und stell dir vor, ich wette, sogar Windows 7 hat Funktionen. [Ironie]Und Microsoft ist ja auch dafür bekannt sich an Standarts zu halten, um cool zu sein, schaut euch nur mal an wie der IE7 CSS interpretiert. Der macht das als einziger richtig![/Ironie]

Nunja, ich verwende auf jeden fall keine Funtionen um cool zu sein, sondern weil ich sie für mich als
Cool (== praktisch) enteckt habe.

So, ich bin dann mal weg, wir schreiben morgen Chemie. Gute nacht. Viel Spaß mit deinem Gosub...

TimBo

BeitragDo, Nov 26, 2009 1:14
Antworten mit Zitat
Benutzer-Profile anzeigen
so habe gerade alles Durchgelesen.

Sehr interressant muss ich zugeben.
Ich lege zwar Wert auf Mode , Sport etc. Aber was hat proggen mit Gruppenzwang oder Mode zu tun ? Ich finde das einfach nur "lustig" Laughing

Mal eine Gegenfrage: was ist an GoTo (außer der Name) so toll , dass man den Kreuzeffekt und die sich-nicht-löschenden Variablen in kauf nimmt?

Vielleicht gibt es darauf eine Antwort , wenn ja -top.

Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

Omenaton_2

Betreff: Mein Abschluß zu diesem Thema

BeitragDo, Nov 26, 2009 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !
Ich müßte jetzt wieder sehr viel Zeit investieren, um auf all die aufgeworfenen Fragen und noch ungeklärten Sachverhalte einzugehen. Ich könnte dazu noch viel schreiben, aber bei mir ist die Grenze erreicht, wo ich einfach nicht mehr Zeit für diese Diskussion opfern bereit bin.

Es gab einige gute Denkanstöße und es war eine interessante Diskussion.
Ich bin weiterhin der Meinung, daß der Wert von Functions von Vielen überschätzt wird. Ich bleibe bei meiner Einstellung dazu und ich werde auch in der Zukunft keine Functions verwenden (außer es wird irgendwann doch notwendig, was ich nicht glaube).
Ich werde mein Weltraum-Spiel ohne Functions zu Ende machen (außer es kommt sowas wie eine Krankheit oder Unfall dazwischen) und werde auch damit zeigen, was man alles ohne Functions machen kann, wie entbehrlich sie sind.
Ich wünsche euch viel Spaß beim Programmieren. Ich habe ihn auch selber. (Allerdings ich kann das nur dann als Spaß empfinden, wenn ich das so machen kann wie es mir paßt.)

ozzi789

BeitragDo, Nov 26, 2009 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
So wie inner Politik, es wird viel gequatsch ausgehandelt diskutiert usw aber jeder macht was er will Wink
Egal ich enthalte mich meiner Meinung, aber ich fände es interessant den Code zu deinem Projekt mal zu sehen, wenn es dann so weit ist

mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

PSY

BeitragDo, Nov 26, 2009 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
hm,

ich persönlich verwende schon lange nur noch functions, die ganzen vorteile brauch ich ja nicht mehr aufzuzählen, haben meine vorredner ja bereits getan.
wenn Omenaton halt keine benutzen will, ok. ist ja sein bier.

aber ich würd folgendes mal gern sehen:
-ein grösseres projekt, wo mehrere leute dran programmieren und das ohne functions auskommen soll
-ne halbwegs komplexe rekursion ohne functions, die effizient UND übersichtlich ist

l8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

TimBo

BeitragDo, Nov 26, 2009 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Jeder so wie er es mag.
Er wird niemand seinen Code zeigen. Wird wohl seine Gründe haben.

Greez
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Tankbuster

BeitragDo, Nov 26, 2009 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Du bist doch mit deiner Methode schon an die Grenzen des Compilers gestoßen. Das wirst du vermutlich nochmal tun, wenn du so weitermachst. Allein deshalb ist es schon schlau, deinen Programmierstiel zu ändern.

Mein Kommentar dazu.
Twitter
Download Jewel Snake!
Windows|Android

Triton

BeitragFr, Nov 27, 2009 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, das Ursprungsproblem ist ja schon längst gelöst und zum Thema Programmierstil wurde auch hinreichend viel geschrieben.

Ich denke, wenn ihr weiterhin Bedarf dazu habt, öffnet am besten einen neuen Thread mit eben diesem Thema.


Geschlossen
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Gehe zu Seite Zurück  1, 2, 3, 4

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group