 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muecke Gast
|
Verfasst am: 14.01.2014, 18:14 Titel: Rechnen in FB immer Rechts neben dem = Zeichen? |
|
|
Hallo miteinander,
ich habe da mal eine echt Doofe Frage.
Rechnen Tut FB doch immer Rechts neben dem "=" zeichne und nicht Links daneben. !!
also so z.B.
Code: | i = 100 + 5
Print i ' Ausgabe 105 |
warum schreibt man wenn man i um eins erhöhen möchte das "+" Zeichen dann auf die Linksseite?
also so?
Code: | i = 100
i + = 1
Print i ' Ausgabe 101 |
und warum nicht so
Code: | i = 100
i = + 1
Print i ' Ausgabe 1 |
wie man hier sieht kommt bei dem was ich Logisch finden würde 1 und nicht 101 heraus
Kann mir da jemand eine Erklärung geben? ist das irgend wie Logisch aufgebaut? oder ist das halt so? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.01.2014, 18:19 Titel: |
|
|
Ein + oder - auf der "rechten Seite" ist eben ein Operator, der auf die Zahlen dort angewendet wird, sprich in deinem Beispiel kannst du dir das als Vorzeichen für die 1 vorstellen. "+=", "-=", "*=" usw. sind einfach nur Abkürzungen, die das lästige Eintippen von "i = i +"... erleichtern sollen. Der Operator "+" ist dabei einfach auf der linken Seite, damit er syntaktisch nicht mit Operatoren auf der rechten Seite in Konflikt gerät. In anderen Programmiersprachen gibt es auch noch "i++", was (vereinfacht gesagt) dasselbe wie "i+=1" ist. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Muecke Gast
|
Verfasst am: 14.01.2014, 18:24 Titel: |
|
|
ah OK, das klingt Logisch,
damit ich aufgrund von Vorzeichen (z.B. Negativzahlen) nicht in Konflikt komme wird es hier Links geschrieben.
wobei ich natürlich auch
Schreiben könnte was aber mal wider mehr Schreibarbeit ist.
Cool danke für die Kurze Erklärung. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 14.01.2014, 23:12 Titel: |
|
|
naja.... also, so pauschal würde ich das mti dem rechnen jetzt nicht sagen.
es gibt da z.B. auch so fälle wie
Code: |
dim a as integer
dim aptr as integer ptr
aptr = @a
cast(short, aptr + 2) = 2
|
sogesehen rechnet er durchaus auch auf der anderen seite.
das = ist hier eher der ausschlaggebene "verknüpunfsfaktor" ... er besagt das der wert rechts nach links geschrieben werden soll ... bzw. bei vergleiche eine prüfung volziehen soll und das ergebniss nach links zurückliefert.
z.B.
Code: |
dim a as integer
a = (1 = 2)
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.01.2014, 23:17 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | sogesehen rechnet er durchaus auch auf der anderen seite. |
Der Unterschied ist, dass das eine ein L-Wert und das andere ein R-Wert ist (wiki). R-Werte wie "x + 1" können, wie der Name vermuten lässt, nur auf der rechten Seite einer Zuweisung auftauchen. Die Dereferenzierung oder das Casten eines Pointers mit Offset (zusammengerechnet ist das wieder ein R-Wert) gibt natürlich einen L-Wert zurück.
Muecke: Ich glaube beim Upload deines Avatars ist da was schief gelaufen, da ist irgendwie das falsche Tier drauf  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 14.01.2014, 23:18 Titel: |
|
|
Die Kurzformen wie +=, -=, *= usw. hat FreeBasic aus den C-ähnlichen Sprachen (C, C++, Java, PHP usw.) übernommen. Hat für den Compiler natürlich den Vorteil, dass er optimieren kann. Hierbei an Array-Variable mit kompliziert berechnetem Index denken:
Code: | ' Herkömmlich
a(7 * x - 2 * j(2 + 3 * k) + 55) = a(7 * x - 2 * j(2 + 3 * k) + 55) + 2
' Kurzform
a(7 * x - 2 * j(2 + 3 * k) + 55) += 2 |
In der herkömmlichen Form kann es ohne Weiteres passieren, dass zur Laufzeit der Indexausdruck 7*x-2*j(2 + 3 * k)+55 aus diesem Beispiel 2x berechnet wird, während die Kurzform wirklich auf die auf Maschinensprache üblichen ADD/SUB/INC/DEC-Befehle optimiert werden kann. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Muecke Gast
|
Verfasst am: 14.01.2014, 23:33 Titel: |
|
|
OK jetzt muss ich echt passen, ich haeb überhaupt keinen Plan mehr was Ihr da versucht mir zu zeigen oder klar zu machen, ...
angefangen beim
ThePuppetMaster hat Folgendes geschrieben: | Code: |
dim a as integer
dim aptr as integer ptr
aptr = @a
cast(short, aptr + 2) = 2 | ... |
??? HÄÄÄ ???
oder das hier
Jojo hat Folgendes geschrieben: | Der Unterschied ist, dass das eine ein L-Wert und das andere ein R-Wert ist | ?? ömm ja genau
hmm? *nicht nur der Kaffee Raucht jetzt, ...
dreael hat Folgendes geschrieben: | Code: | ' Herkömmlich
a(7 * x - 2 * j(2 + 3 * k) + 55) = a(7 * x - 2 * j(2 + 3 * k) + 55) + 2
' Kurzform
a(7 * x - 2 * j(2 + 3 * k) + 55) += 2 |
|
ich möchte wirklich nicht unhöflich sein oder irgend wem beleidigen doch ich verstehe gerade echt nur Bahnhof, ich habe leider keine Höhere Mathematik gehabt
@Jojo: an was für ein Tier hast du denn bei mir gedacht??
Jojo hat Folgendes geschrieben: | Muecke: Ich glaube beim Upload deines Avatars ist da was schief gelaufen, da ist irgendwie das falsche Tier drauf lachen |
an eine Süße unschuldige Katze? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.01.2014, 23:46 Titel: |
|
|
Muecke hat Folgendes geschrieben: | Jojo hat Folgendes geschrieben: | Der Unterschied ist, dass das eine ein L-Wert und das andere ein R-Wert ist | ?? ömm ja genau |
Hast du verpasst, dass da ein blauer Link dahinter stand? Den anklicken.
Ein R-Wert ist praktisch ein Ausdruck, dem man nichts zuweisen kann. Ein Funktionsaufruf liefert z.B. (im Allgemeinen) ein R-Wert zurück, d.h. du kannst nicht sagen "MalZwei(3) = x", sondern nur "x = MalZwei(3)", um einen Zahl mal zwei zu nehmen.
Zitat: |
an eine Süße unschuldige Katze? | Wie wär's mit einem Elefanten?  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 14.01.2014, 23:51 Titel: |
|
|
Jojo hat Folgendes geschrieben: | ... Ein Funktionsaufruf liefert z.B. (im Allgemeinen) ein R-Wert zurück, d.h. du kannst nicht sagen "MalZwei(3) = x", sondern nur "x = MalZwei(3)", um einen Zahl mal zwei zu nehmen. ... |
naaaajaaaaa ......
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Muecke Gast
|
Verfasst am: 14.01.2014, 23:54 Titel: |
|
|
deinen Link habe ich gesehen und auch angeschaut (Überfolgen) werde mir das aber noch genauer anschauen, denn wenigstens etwas möchte ich verstehen wenn ich schon mit den Thema anfange auch wenn mehr dabei raus kommt wie ich mir manchmal vorstellen kann.
Jojo hat Folgendes geschrieben: | Wie wär's mit einem Elefanten? durchgeknallt |
he he, ich weis nicht ob ein Elefanten so wirklich zu mir passt, den Elefanten vergessen nichts ich ich kann meinen Kopf zum Nudeln abschütten benutzen
wenn dann würde ich eine Schildkröte nehmen die ist so schnell wie ich die Sachen verstehe
finde es aber sehr Nett das man mich mit einen Elefanten vergleicht  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.01.2014, 01:23 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | Jojo hat Folgendes geschrieben: | ... Ein Funktionsaufruf liefert z.B. (im Allgemeinen) ein R-Wert zurück, d.h. du kannst nicht sagen "MalZwei(3) = x", sondern nur "x = MalZwei(3)", um einen Zahl mal zwei zu nehmen. ... |
naaaajaaaaa ......
MfG
TPM |
Ich glaube, wenn ich jetzt mir Referenzen komme, steigt er gar nicht mehr durch.  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Muecke Gast
|
Verfasst am: 15.01.2014, 01:33 Titel: |
|
|
darfst du gerne, ich kapiere jetzt schon nichts mehr
ist jedoch kein grund zum für mich ich kann einstecken
werde mir das Thema die Tage noch mal durchlesen und schauen ob ich da was von verstehe.
Jedoch eine Frage vorab mal so am Rande wie wichtig ist das denn das ich das Prinzip was Ihr da gerade besprecht und ich nicht verstehe für mich und die Programmierung? |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1278 Wohnort: Ruhrpott
|
Verfasst am: 15.01.2014, 03:15 Titel: |
|
|
Muecke hat Folgendes geschrieben: | wie wichtig ist das denn das ich das Prinzip was Ihr da gerade besprecht und ich nicht verstehe für mich und die Programmierung? | Lass es mich mal so ausdrücken: Code: | If verstanden_was_da_erklaert_wurde Then
funktionierendes_Programm
Else
kein_funktionierendes_Programm
EndIf | Aber keine Sorge: Wenn du dich damit beschäftigst, kriegst du mit der Zeit schon raus, wie es geht (es sei denn, du wärst in Bezug auf logisches Denken völlig talentfrei), denn auch Fehler sind eine wertvolle Informationsquelle. Also immer dranbleiben! Übung kriegt man nur durch Üben.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.01.2014, 11:25 Titel: |
|
|
Nunja ... um dem ganzen nochmal etwas mehr "informationsgehalt" zu liefern ...
Wenn du schreibst
Code: | dim a as integer
a = + 1
|
Dann ist das vergleichbar mit der angabe:
Code: | dim a as integer
a = -1
|
Du spezifizierst hier folglich einen Wert.
Das + und - gibt in diesem falle einfach an, ob der darauffolgende Wert positiv oder negativ ist.
Sobald du einen weiteren Wert hinzufügst, "rechnest" du folglich.
Code: | dim a as integer
a = 1-2
a = 1+2
a = -1-2
a = -1+2
|
Im ersten falle ziehst du von 1 den wert 2 ab.
In nächsten fall fügst du zum wert 1 den wert 2 hinzu.
Danach ziehst du wieder vom wert -1 den wert 2 ab.
usw.
Angenommen du möchtest von einer Variable einen wert hinzufügen. Dann gehst du typischer weise wie folgt vor:
Code: | dim a as integer = 5
a = a + 2
|
Hierbei schreibst du in das ziel "a" (linke seite) einen wert hinein. Dieser Wert ergibt sich aus dem wert, welcher in "a" enthalten ist, pus dem wert "2".
Es gibt natürlich auch die möglichkeit das selbe mit einem Array zu machen.
Code: | dim a(1 to 10) as integer
a(3) = A(3) + 2
|
Hierbei greifst du mit "A(3)" auf den dritten eintrag des array zu.
Angenommen du berechnest diesen eintrag aus irgend einem schwindeligem algorythmus:
(nicht funktionsfähiges beispiel)
Code: | dim a(1 to 10) as integer
a(x * y + z * f * g) = a(x * y + z * f * g) + 2
|
dann benötigst du recht viel schreibarbeit und speicherplatz für diesen quellcode.
In diesem fall gibt es in freebasic die möglichkeit eine einfache rechenoperation zu verkürzen, indem man wie folgt vorgeht.
Code: | dim a(1 to 10) as integer
a(x * y + z * f * g) += 2
|
Dies ist genau das selbe ergebniss wie zuvor. Nur etwas gekürzt, und spart damit einiges an schreibarbeit.
dieses vorgehen funktioniert mit so gut wie allen operatoren.
Code: | dim a += 2
a -= 2
a /= 2
a *= 2
a xor= 2
a and= 2
'...
|
Zu deiner "links / rechts rechnet fb" frage:
nun ... Hierfür muss man wissen, das es prinzipiel 2 dinge gibt, die beim "rechnen" wichtig sind.
Einmal ist dies das "ZIEL" und einmal die "QUELLE".
In unseren obrigen fällen ist das ZIEL links vom = und die QUELLE rechts davon.
Das Ziel ist etwas, das den wert aus der QUELLE aufnimmt.
Code: | dim a as integer = 5
a = a + 2
|
a ist in unserem Fall das ziel und die quelle. Wir spezifizieren folglich das erste a um dem compiler zu sagen, das der als nächstes berechnete wert dort hinein geschrieben werden soll.
Diesen zu berechnenden wert holen wir uns auf der rechten seite, bzw. setzen ihn aus rechenoperationen zusammen.
Sofern dir Pointer noch nichts sagen, eine kurze info hierzu:
Ein Pointer ist eine Adresse zu einem Speicherbereich.
Hier erzeugst du eine variable namens a. Diese variable ist ein speicherbereich auf dem RAM.
Mit einem Aufruf wie:
Code: | dim a as integer
a = 1 |
teilst du dem compiler mit, das er den wert 1 in die variable a schreiben soll.
Bei Arrays ist dies ebenfalls möglich
Code: | dim a(0 to 9) as integer
a(4) = 1 |
Hier führt der Compiler im hintergrund jedoch eine kleine rechenoperation aus, um die variable a(4) zu finden.
Um das zu verstehen muss man wissen, das eine variable im RAM durch eine adresse definiert wird. Das ist vergleichbar mit der befölkerung in einem Hochhaus.
Das Hochhaus ist das RAM und die Zimmer sind die speicherstellen.
Wenn du eine variable erzeugst, dann hat sie für uns als programierer nur einen namen. z.B. A.
Der Computer sucht beim erzeugen der Variable ein freies zimmer. Dieses zimmer hat eine Adresse (stock5 raum 4) .. im Computer ist dies ein Integer bei 32bit betriebssysteme und ein longint bei 64bit betriebssysteme.
Mit der Adresse kann der computer anschliessend daten in das zimmer / auf das ram packen.
"A" ist dann quasi nur das Namensschild an der Tür.
Bei dem Zugriff auf ein Array wid dem computer mitgeteilt, das er einen Speicherbereich erzeugen soll, der 0-9 gross sein soll. Folglich muss es aus 10 Variablen bestehen. Eine Besonderheit bei Arrays ist, das diese Variablen (bzw. Zimmer) alle aufeinanderfolgend sein müssen. a(1) ist daher genau neben a(2) und dieses genau neben a(3). Sie dürfen folglich nicht irgend wo im haus sein, wie es der computer aus geschwindigkeitsgründen sonst machen würde.
Mit dieser "vorgabe" ist es jetzt jedoch genau den obrigen code auszuführen.
Code: | dim a(0 to 9) as integer
a(4) = 1 |
Der Computer erzeugt hierfür einen speicher der 10x so gross ist wie ein integer. also 10*4 Byte bzw. 40Byte
Die "startadresse" "a(0)" wird hierbei in A gespeichert.
Greift der programmierer nun auf A(4) zu, dann führt der compiler eine kleine rechnung aus:
Code: | StartadresseVonA + 4 |
damit weis der computer, welches zimmer gewählt wurde. UND, man kann das Zimmer durch eine Rechnung spezifizieren, was sonst nicht möglich wäre.
Das ganze kann man auch von Hand tun, indem man sogenannte Pointer (Zeiger / zeigt auf einen speicherbereich) einsetzt.
Code: | dim a as integer
dim aptr as integer ptr
aptr = @a
|
hierbei wird die adresse von a in die variable aptr geschrieben. Damit der Compiler (freebasic) weis, das es sich hierbei um einen pointer handelt, mit dem gearbeitet wird, muss die variable als "ptr" oder "pointer" definiert werden.
Gibt man jetzt den wert von aptr aus, so erhält man eine zahl, welche die adresse im RAM wiederspiegelt.
Freebasic erlaubt uns auch eigene speicherbereiche zu erzeugen, die wir beliebig groß gestalten können.
Code: | dim aptr as integer ptr
aptr = callocate(40)
|
dies erzegt uns einen speicherbereich der 40 byte gross ist. Er ist quasi genauso gross wie unser vorheriges array. (so macht das auch freebasic)
Der zugriff auf die daten erfolgt über die adresse
das ist genau das gleiche wie
Code: | dim a(0 to 9) as integer
a(4) = 1 |
mit dem unterschied, das wir es von "hand" gemacht haben, und uns freebasic die arbeit der speichererzeugens und der verwaltung nicht abgenommen hat.
Um zum rechnen bzw. zum thema zurück zu kommen.
freebasic rechnet folglich auch auf der linken seite. Z.B. wenn wir die adresse des ZIEL's berechnen.
4 + 1 ist das ziel und 2 der wert der in das ziel geschrieben werden soll.
Jetzt greifen wir man das "HÄÄÄ" von dir zu meinem beispiel auf:
Code: | dim a as integer
dim aptr as integer ptr
aptr = @a
cast(short, aptr + 2) = 2 |
bis zum "cast sollte jetzt alles verständlich sein.
Zuerst eine variable erzeugen
dann eine weitere welche die adresse bzw. einen pointer speichern wird.
anschliessend schreiben wir in die aptr variable die adresse von a hinein.
zum schluss "casten" wir die adresse zu einem anderen datentyp und schreiben den wert 2 hinein.
hier muss ich noch anführen, das mein beispiel nicht funktionsfehig ist, da ich 2 kleinen fehler gebaut habe.
es muss nämlich heisen:
Code: | cast(short ptr, aptr)[1] = 2 |
was hier passiert ist folgendes.
die variable aptr ist als integer definiert. sie ist folglich 4 byte gross. Das "cast" ändert diesen datentyp in einen anderen datentyp. Ich habe hier "short" (2 byte) angegeben. Dadurch wird quasi das eine integer zu 2 short variablen.
auf dieses können wir jetzt zugreifen, indem wir angeben, welches dieser short's wir haben möchten. Ich tue dies hier mit [1]. Dies ist der 2. element.
Das ist zwar jetzt recht kompliziert, und für einen anfänger vieleicht ganz schön viel information, aber ich wollte es nicht auslassen.
Was @Jojo mit "referenz" meinte ist prinzipiel genau das, was "Pointer" tuen .. sie "referenzieren" einen speicherbereich. Bzw. anders ausgedrückt, Sie zeigen auf einen Speicherbereich.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Muecke Gast
|
Verfasst am: 15.01.2014, 13:46 Titel: |
|
|
Wow, das ist mal echt gut, .... DANKE DANKE.
OK für mich bedeutet das FB Rechnet Rechts mein Ergebnis
und Rechnet Links den Speicherplatz
jeweils vom = gesehen
Jetzt machen für mich auch die Formeln die ich da gesehen habe "Sinn" ist vielleicht noch zufiel doch ich kann mir nun vorstellen was das alles ist was Ihr da gespottet habt.
Für mich stellt sich nun jedoch die Frage warum soll ich die Speicheradresse von Hand berechnen wenn FB das für mich machen kann?
OK das ich einen Neuen Speicher Definieren kann den ich in meiner Gewünschten Größe anlegen kann, könnte ich mir noch vorstellen das dies Sinn machte, (Wird dieser eigentlich vom RAM abgezogen dann? oder wird dieser Speicher aus Festplatten Speicher Temporär generiert?) |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.01.2014, 15:57 Titel: |
|
|
sowohl als auch ... generell rechnet der computer nur im ram / cache ... aber, durch modernisierte betriebssysteme gibt es das sogenante "swap" .. hierbei schaufelt das betriebssystem gelegentlich daten aus dem ram auf die festplatte, wenn darauf länger nicht zugegriffen wurde ... andersherum, wen es benötigt wird, wird es von der disk zurück ins ram geschaufelt.
aber das is betriebssystemabhängig, und auch nicht relevant für ein programm. Das wird alles im hintergrund gemacht, und der programmierer bzw. das programm bekommt davon nichts mit. für das app ist alles im ram.
Pointer bzw. adressen braucht man z.B. wenn man eine sogenannte LinkedList aufbauen möchte. Das ist sowas ähnliches wie ein Array, allerdings viel schneller bei häufigen änderungen der listengrösse und des aufbaus.
stell dir z.B. einmal vor, du möchtest in der mitte einer liste einen eintrag löschen. dann musst du alle darauffolgende einträge um 1 nach vorn verschieben, und dann die liste entsprechend um 1 verkleinern.
bei einer LinkedList wird das anders gemacht. Dafür jedoch kann man nicht direkt auf einen eintrag zugreifen, sondern muss sich von einem eintrag zum nächsten hangeln.
Beides hat vor und nachteile, und ist entsprechend für den anwendungsfall auszuwählen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|