daveGetBlockInfo

Red-Sh4nks

Level-1
Beiträge
42
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Wollte mal wissen, wie man die Länge eines DBs rausfinden kann und
bin dabei auf daveGetBlockInfo gestoßen. In C# wird ja eine Funktion wie

nicht wie:
daveGetBlockInfo

sondern als:
dc.GetBlockInfo

Kann die Funktion aber nicht finden.

Gibt es die Funktion daveGetBlockInfo bzw. dc.GetBlockInfo in dotNet bzw. C# nicht?

lg Marco*
 
Hallo Marco,

ich habe das mal mit VB versucht. Ich bekomme zwar keine Fehlermeldung, aber auch kein Ergebnis:

Code:
[COLOR=#008000][FONT=Courier New][COLOR=#008000]'Libnodave-Deklarationen:[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Public Const daveBlockType_OB = "8"[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Public Const daveBlockType_DB = "A"[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Public Const daveBlockType_SDB = "B"[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Public Const daveBlockType_FC = "C"[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Public Const daveBlockType_SFC = "D"[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Public Const daveBlockType_FB = "E"[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Public Const daveBlockType_SFB = "F"[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Aus dem Forum:[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Private Const daveBlockType_OB = 56 'asc("8")[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Private Const daveBlockType_DB = 65 'asc("A")[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Private Const daveBlockType_SDB = 66 'asc("B")[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Private Const daveBlockType_FC = 67 'asc("C")[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Private Const daveBlockType_SFC = 68 'asc("D")[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Private Const daveBlockType_FB = 69 'asc("E")[/COLOR][/FONT]
[/COLOR][COLOR=#008000][FONT=Courier New][COLOR=#008000]'Private Const daveBlockType_SFB = 70 'asc("F")[/COLOR][/FONT][/COLOR]
[COLOR=#008000][FONT=Courier New][/FONT] 
[/COLOR][FONT=Courier New][COLOR=#0000ff][COLOR=#0000ff]Private[/COLOR][/COLOR][COLOR=#0000ff][COLOR=#0000ff]Sub[/COLOR][/COLOR] btnDB3Lesen_Click([COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] sender [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] System.Object, _[/FONT]
[FONT=Courier New][COLOR=#0000ff][COLOR=#0000ff]ByVal[/COLOR][/COLOR] e [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] System.EventArgs) [COLOR=#0000ff][COLOR=#0000ff]Handles[/COLOR][/COLOR] btnDB3Lesen.Click[/FONT]
[FONT=Courier New][COLOR=#0000ff][COLOR=#0000ff]Dim[/COLOR][/COLOR] buf(4000) [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR][COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR][/COLOR], res1 [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR][/FONT][COLOR=#0000ff][FONT=Courier New][COLOR=#0000ff]Integer[/COLOR][/FONT]
[/COLOR][FONT=Courier New]res1 = internalDaveGetBlockInfo(dc, buf(0), 65, 3)[/FONT]
[FONT=Courier New]txtDC_1.Text = dc[/FONT]
[FONT=Courier New]txtRes1.Text = res1[/FONT]
[COLOR=#0000ff][FONT=Courier New][COLOR=#0000ff]End[/COLOR][/FONT][/COLOR][SIZE=3][COLOR=#0000ff][FONT=Courier New][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][/FONT]
[/COLOR][/SIZE]

Wenn ich das hier im Forum richtig gelesen habe(?), dann sollte im Rückgabewert res1 der Wert stehen. Da steht aber immer eine 0 drin?!
Oder muss der Buffer ausgewertet werden? Dazu würde passen, dass der zweite Parameter mit ByRef (Zeigerparameter mit Rückgabe) übergeben wird.
Den dritten Parameter habe ich auf 65 gesetzt (Typ: DB). Den vierten Parameter auf 3 (DB3 soll ausgewertet werden).
Oder verstehen sich die Parameter ganz anders?

Gruß
Earny
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für deine Antwort! :)

Bei res1 steht 0 drin, weil das heißt, dass internaldavegetblockinfo erfolgreich ausgeführt wurde. Die Länge steht dann wl im Puffer! Was für eine Programmiersprache verwendest du?
 
ich verwende VB.Net, allerdings ohne den .Net-Wrapper (libnodave.net.dll). Das sieht deshalb aus wie bei VB6.0 oder Excel.

Ich habe im Moment keine Idee, wie ich den Buffer auswerten soll, da ich weder eine aussagekräftige Beschreibung noch ein passendes Beispiel gefunden habe. Ich bin auch nicht sicher, ob ich die Bedeutung der beiden letzten Argumente richtig eingeschätzt habe. Was meinst Du?

Gruß
Earny
 
es könnte sein, dass die Funktion zur Bestimmung der DB-Länge DaveGetProgramBlock ist. Darin hat das letzte Argument den Namen "length". Nachdem ich mir das, was die daveGetBlockInfo-Funktion in den Buffer schreibt mal angesehen habe (siehe Anlage), habe ich mich im Modul12 nochmal umgesehen und könnte mir vorstellen, dass daveGetProgrammBlock die richtige Funktion ist.

Gruß
Earny
 

Anhänge

  • Mappe2.pdf
    20,5 KB · Aufrufe: 37
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Earny!

Ich hatte in den letzten Tagen wenig Zeit. Tut mir Leid, ich bin
noch nicht dazu gekommen, diese Funktionen auszuprobieren.
Werde aber spätestens am Donnerstag dazu kommen. Falls die
Funktion daveGetProgramBlock aber tatsächlich in C#
(über die Libnodave.net.dll) vorhanden sein, bin ich mir sicher, dass
dies die gesuchte Funktion ist.

Ich melde mich am Donnerstag :)

Edit:
Die Werte aus deinem Anhang sehen brauchbar aus, aber da ich nicht
weiß wie viele und welche Blöcke du angelegt hast, kann ich noch nichts
genaues dazu sagen. Wie gesagt, ich muss die Funktion selbst testen ;-)
 
Auflösung

Die Antwort kommt etwas spät, aber doch:

Bei C# .net gibt es die Funktion .davegetBlockinfo nicht.
Daher weiß man auch nicht die Länge eines Blocks, was
für das Lesen des Blocks ja sehr wichtig ist.

Den mit einer Länge, die größer ist als die des Blocks, sind
alle Werte 0.
Und mit einer Länge, die kleiner ist als die des Blocks, erhält
man nicht alle Werte.

Daher habe ich die binäre Suche angewandt um die exakte
Länge des DBs ausfindig zu machen. Wl gibt es auch bessere
Wege, aber wens interessiert:

Code:
bool gefunden = false;
                    byte[] DBIPuffer;
                    int DBLmin = 0;
                    int DBLmax = 1024;
                    int mitte;
                    int gesuchtezahl = 0;
                    int DBlaenge;

                    while (!gefunden)
                    {
                        mitte = DBLmin + ((DBLmax - DBLmin) / 2);


                        if (dc.readBytes(libnodave.daveDB, DBPuffer[rr], 0, mitte, null) == 0)
                        {
                            DBLmin = mitte + 1;
                        }
                        else
                        {
                            DBLmax = mitte - 1;
                        }
                        if (DBLmax <= DBLmin)
                        {
                            gesuchtezahl = DBLmin;
                            gefunden = true;
                        }
                    }

                    //Da das Minimum angegeben wird, kann es sein, dass eine Zahl gewählt etwas kleiner als
                    //die Blocklänge ist. Daher wird hier nochmals versucht die Zahl um 1 zu erhöhen
                    DBIPuffer = new byte[gesuchtezahl + 1];
                    while (dc.readBytes(libnodave.daveDB, DBPuffer[rr], 0, gesuchtezahl, DBIPuffer) == 0)
                    {
                        gesuchtezahl++;
                        DBIPuffer = new byte[gesuchtezahl + 1];
                    }
                    DBlaenge = gesuchtezahl - 1;
                    dbnr[DBcounter] = DBPuffer[rr];
                    dbgr[DBcounter] = DBlaenge;
                    DBcounter ++;
                    //Jede gerade Zahl (inklusive 0) 0,2,4,6,... speichert die Nr des DBs
                    //und jede ungerade darauffolgende Zahl speichert dessen Länge
 
Zurück
Oben