Byte Pointer Problem
Übersicht

MacintoshBetreff: Byte Pointer Problem |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
|
||
Farbfinsternis.tv |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah ja, in dem Fall sieht die BlitzMax Seite so aus:
BlitzMax: [AUSKLAPPEN]
Oops: Deine C-Funktion muss den Parameter als "const char* buf" übernehmen. |
||
Farbfinsternis.tv |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Fast... nur anders herum.
BlitzMax: [AUSKLAPPEN]
|
||
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nein.
meine C funktion soll ein INT zurück geben, und mit dem byte Pointer was machen. das muss gehen. |
||
![]() |
FarbfinsternisBetreff: Re: Byte Pointer Problem |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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]
|
||
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
|
||
Farbfinsternis.tv |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Alles schon gemacht... in dem byte pointer steht dann total wirres zeug drinnen | ||
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Frage: Wieso nimmst du nicht recv aus der pub.stdc? | ||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
Macintosh |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 :/ |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group