Was gibts SizeOf bei einem Array-String wieder?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

morszeck

Betreff: Was gibts SizeOf bei einem Array-String wieder?

BeitragSo, Feb 20, 2005 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe da nicht so den Zusammenhang?

SizeOf(files): 752
zeichen: 2267
zeilen: 188

Code: [AUSKLAPPEN]
Local files:String[] = LoadDir( "c:\windows\" )

For t:String=EachIn files
   Print t
   zeichen :+ t.length
   zeilen  :+ 1
Next

Print SizeOf(files) +"  "+ zeichen +"  "+ zeilen

regaa

BeitragSo, Feb 20, 2005 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute mal:

zeilen=anzahl der dateien
zeichen=anzahl zeichen aus summe der dateinamen
seizeoffiles=ka
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

stfighter01

BeitragSo, Feb 20, 2005 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
sizeof(files) gibt die summer der bytes für alle stringobjekt-referenzen zurück

1 stringobj= 4bytes
ein string mit länge 188 hat natürlich auch 188 refs.
Denken hilft!
 

Edlothiol

BeitragSo, Feb 20, 2005 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
752 = 4 * 188.
Das Array besteht aus (4 Byte großen) Pointern auf Strings, deshalb dieser Wert.
 

morszeck

BeitragDi, Feb 22, 2005 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, nach dem Posting habe ich dies schon fast vermuttet..,

Danke noch.
 

sinjin

BeitragMo, Dez 31, 2018 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß ist uralt, aber sizeof ist das nen Compilerbefehl? Also der Wert wird generiert während der Compiler arbeitet und gibt damit einen konstanten Wert wieder? So war es damals in Assembler, bzw Pascal. Da war es halt so, das der Compiler damit den grössten Wert an Bytes wiedergegeben hat, den verschachtelte Typen generiert haben (damals war es leichter auch Strings zu kopieren, BMAX macht das ja mit nem Pointer):
Code: [AUSKLAPPEN]
type ober
 field a%
endtype

type a1 extends ober
endtype
type b1 extends ober
 field b%
endtype
type c1 extends ober
 field b$
entype

Also müsste b1 und c1 8 wiedergeben...richtig? (Klar, ich kann es testen, ich will nur sichergehen) und a1 4 Bytes?
Wie lang kann ein String werden, unendlich? Also pro Zeichen 4 Bytes? Das hängt mit Unicode zusammen?
Ich weiß das Windows keinen Pfad grösser als 256 Bytes Zeichen enthalten kann, gilt das auch für Unicodes? Also ein Pfad kann damit sehr wohl mehr als 256 Bytes enthalten? Das war bei DOS halt so und ich weiß im Hintergrund macht Windows halt das alte DOS-System also ASCii. Sry meine blöden Fragen lol ich bin gerade total verunsichert.
(Ich will halt gerade ne Funktion schreiben die Typen kopiert, bei sizeof bin ich mir gerade nicht so sicher wie das läuft, ist es nun ein Compilerbefehl oder wird es zu Laufzeiten generiert?)

Thunder

BeitragMi, Jan 02, 2019 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst es nicht nur testen, du kannst den Assemblercode anschauen oder wenn du noch sicherer gehen willst den Compiler, aber der Assemblercode gibt immer gute Anhaltspunkte. Ich habe das Beispiel aus dem 1. Post kompiliert, um zu sehen, was SizeOf macht (ich habe files global gemacht, damit man es im assemblercode gut sieht). Ich war mir ziemlich sicher, dass es ein Compilezeit-Befehl ist - das ist aber leider nicht so Rolling Eyes

Ganzer Assembly Code hier: https://pastebin.com/BY6A69iL

Relevanter Teil:

Code: [AUSKLAPPEN]
   mov   eax,dword [bb_files] # eax = pointer zum array
   push   dword [eax+16] # ein int an eax+16 wird geladen
   call   bbStringFromInt
   add   esp,4


Jetzt schaust du ins mod/brl.mod/blitz.mod/blitz_array.h weil dort die struct für Blitz-Arrays definiert ist:

Code: [AUSKLAPPEN]
struct BBArray{
   //extends BBObject
   BBClass*   clas;
   int         refs;

   const char* type;         //8
   int         dims;         //12
   int         size;         //16 : total size minus this header
   int         scales[1];      //20 : [dims]
                        //sizeof=20+dims*sizeof(int)
};


[eax+16] lädt also size. Das ist die komplette größe des Array-Inhalts (wird von der Funktion allocateArray in blitz_array.c berechnet). Also ein array:Long[16][9] hätte eine size von 16*9*SizeOf(Long).

Bezgl. Objekte kopieren. Ich habe da Mal etwas geschrieben, siehe thunder.objectex: https://www.blitzforum.de/foru...hp?t=39923
Da gibt es Funktionen zum Kopieren von objekten, ich kann mich aber überhaupt nicht mehr erinnern (5 Jahre her), ob das gut funktioniert hat. Es hat nicht wirklich genug Feedback gegeben, auch um einzuschätzen, ob das Ganze Sinn macht.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group