Byte Pointer Problem

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Macintosh

Betreff: Byte Pointer Problem

BeitragSa, Jul 10, 2010 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.
Ich habe eine C - Funktion, die einen " char * " zurück gibt, einen string. in BlitzMax erstelle ich den Pointer " local buf:byte ptr = memalloc( 1024 ) ", nur wenn ich den dann mit " String.fromCString( buf ) " ausgebe, kommt sehr wirres zeug heraus. Ein " printf " in C, gibt aber das richtige aus... woran kann das liegen?

Danke

/\ Stimmt nicht. Siehe unten
  • Zuletzt bearbeitet von Macintosh am So, Jul 11, 2010 15:47, insgesamt einmal bearbeitet

Farbfinsternis

BeitragSo, Jul 11, 2010 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kann bspw. daran liegen dass der Zeiger auf C-Seite nur temporär ist, das Problem hatte ich bei Ogre3D auch. Die Lösung war ein globales char Array das gefüllt wurde und dessen Zeiger ich dann zurück gab.
Bevor Du das tust solltest Du aber etwas anderes probieren: Anstatt die C-Funktion in BMax mit dem Rückgabetyp "Byte Ptr" zu versehen, nimm mal $z
BlitzMax: [AUSKLAPPEN]

Extern
Function myCFunc$z()
End Extern
Farbfinsternis.tv
 

Macintosh

BeitragSo, Jul 11, 2010 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja... so richtig zurückgeben tut meine funktion den pointer nicht... die schaut so aus
Code: [AUSKLAPPEN]

int machWasMitDemPointer( char *buf )
{

//hier wird was gemacht, mit dem pointer

}

Farbfinsternis

BeitragSo, Jul 11, 2010 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah ja, in dem Fall sieht die BlitzMax Seite so aus:
BlitzMax: [AUSKLAPPEN]

Extern
Function machWasMitDemPointer:Int(char:Byte Ptr)
End Extern

Function BMXFunc:Int(zeile:String)
Return machWasMitDemPointer(zeile.toCString())
End Function


Oops: Deine C-Funktion muss den Parameter als "const char* buf" übernehmen.
Farbfinsternis.tv
 

Macintosh

BeitragSo, Jul 11, 2010 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Fast... nur anders herum.
BlitzMax: [AUSKLAPPEN]

Function WasMachsteMitDemString:String()

Local buf:Byte Ptr = MemAlloc(1024)

machwasMitDemPointerCFunc( buf )

Return String.fromCString( buf )

EndFunction

Farbfinsternis

BeitragSo, Jul 11, 2010 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso? Deine C Funktion erwartet einen Zeiger auf ein Bytearray und gibt ein Integer zurück. Wenn die Funktion den geänderten Buffer zurück geben soll muss der Rückgabewert "const char*" heißen. Du kannst es Dir auch in BMax sparen extra einen Buffer für den CString zu allozieren, die externe Funktion muss einfach nur den Rückgabewert $z besitzen und Du bekommst direkt einen String geliefert ... ohne irgendwas kopieren zu müssen.
Farbfinsternis.tv
 

Macintosh

BeitragSo, Jul 11, 2010 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
nein.

meine C funktion soll ein INT zurück geben, und mit dem byte Pointer was machen. das muss gehen.

Farbfinsternis

Betreff: Re: Byte Pointer Problem

BeitragSo, Jul 11, 2010 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann lies nochmal Dein erstes Posting. Weißt Du auch ganz sicher was Du da machen willst?

Macintosh hat Folgendes geschrieben:
Hi.
Ich habe eine C - Funktion, die einen " char * " zurück gibt, einen string. in BlitzMax erstelle ich den Pointer " local buf:byte ptr = memalloc( 1024 ) ", nur wenn ich den dann mit " String.fromCString( buf ) " ausgebe, kommt sehr wirres zeug heraus. Ein " printf " in C, gibt aber das richtige aus... woran kann das liegen?

Danke
Farbfinsternis.tv
 

Macintosh

BeitragSo, Jul 11, 2010 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
ja. es stimmt ich habe in meinem ersten posting misst geschrieben.. mom ich poste mal den "original" code von mir:

C-Func
Code: [AUSKLAPPEN]

int _mRecv( int s, char *buf, int size, int flags )
{   
   return recv(s, buf, size, flags);
}


Bmx
BlitzMax: [AUSKLAPPEN]

Method Recv:Int( _buf:Byte Ptr, _size:Int, _flags:Int = 0 )

Return _mRecv( Self._socket, _buf, _size, _flags )

EndMethod

Farbfinsternis

BeitragSo, Jul 11, 2010 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß immer noch nicht genau was Du machen willst, aber ich habe mal ein Beispiel gebastelt:

C Source:
Code: [AUSKLAPPEN]

#include <string>

extern "C"
{
   extern const char* BMXString(const char* buf);
}

const char* BMXString(const char* buf)
{
    std::string* s = new std::string(buf);
    return s->c_str();
}


BlitzMax:
BlitzMax: [AUSKLAPPEN]

SuperStrict

Framework brl.blitz
Import "bmxstring.cxx"

Extern
Function BMXString$z(buf:Byte Ptr)
End Extern


DebugLog BMXString("Hallo Welt")'Test("Hello World")

End
Farbfinsternis.tv
 

Macintosh

BeitragSo, Jul 11, 2010 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
nein. Die funktion soll den bytepointer nur bearbeiten, gibt was anderes zurück, nen integer.
Der pointer wird in der Funktion nu befüllt

mpmxyz

BeitragSo, Jul 11, 2010 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Lasse dir mal die einzelnen Byte-Werte ausgeben.
Es könnte sein, dass du das 0-Byte am Ende des C-Strings nicht beachtest.
Ansonsten könnte die Debugausgabe an sich auch hilfreich sein.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Macintosh

BeitragSo, Jul 11, 2010 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles schon gemacht... in dem byte pointer steht dann total wirres zeug drinnen

Thunder

BeitragSo, Jul 11, 2010 18:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Frage: Wieso nimmst du nicht recv aus der pub.stdc?
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

Macintosh

BeitragSo, Jul 11, 2010 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
1. recv aus pub.stdc ist har genau di selbe funktion wie meine und 2. weil ich mein eigenes modul für sockets brauche, da die blitz-sockets nur sehr eingeschrenkt sind

Noobody

BeitragSo, Jul 11, 2010 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
In dem Code, den du bisher postetest, sehe ich nun keinen Fehler. Du sagst aber, dass ein printf in C funktioniert? Folgender Code gibt also den richtigen String aus? Code: [AUSKLAPPEN]

int _mRecv( int s, char *buf, int size, int flags )
{   
   int result = recv(s, buf, size, flags);
   
   printf( "%s", buf );
   
   return result
}

Das macht das ganze noch schleierhafter. Du solltest mal den ganzen Code (sprich, den Code, in dem Recv aufgerufen wird) posten und auch noch den richtig ausgegebenen String in C sowie den "falschen" String in BMax.
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
 

Macintosh

BeitragMo, Jul 12, 2010 11:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. das gibt den richtign string aus, in C.
(du hast ein semikolon nach return result vergessen :D )
Nur in Bmax kommt halt total wirres zeug an, dabei mache ich meiner meinung NULL falsch :/

BladeRunner

Moderator

BeitragMo, Jul 12, 2010 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Du solltest mal den ganzen Code (sprich, den Code, in dem Recv aufgerufen wird) posten und auch noch den richtig ausgegebenen String in C sowie den "falschen" String in BMax.


Es sei denn Du willst keine Hilfe Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

BtbN

BeitragMo, Jul 12, 2010 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe den Sinn des ganzen nicht, send und recv sind bereits in pub.stdc gewrappt, du musst sie nicht erneut wrappen. Ausserdem erzeugst du mit deinem MemAlloc ohne memFree gewaltige speicher-lecks.
 

Macintosh

BeitragMi, Jul 14, 2010 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne recv wird in meiner methode, siehe oben, augerufen.
Sende ich per Telnet an meinen server etwas z.B. "Hallo", wird in C "Hallo" ausgegeben, in Bmax aber " l".

Um die seicherleks kann ich mich noch kümmern.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group