|
Verfasser |
Nachricht |
pspbricker
Mod a.D.
Beiträge: 3.428
Gruppe: User
Registriert seit: May 2008
Status:
Offline
Danke erhalten: 1641
|
RE: PSP C Anfang - Helft mir auf meinem weg
Wenn deine PSP freezt kannst du davon ausgehen, dass du einen Buffer Overflow hast sprich einen Segfault (http://de.wikipedia.org/wiki/Segmentation_Fault). Dass heißt das, du auf eine Speicher Adresse die nicht zu deinem Programm gehört geschrieben hast. Bsp:
char *buffer = (char*)malloc(sizeof(char)7);
buffer[100] = 'b'; //Segfault
Auf dem PC bricht dein Programm, ab leider freezt die PSP, dies wirst du aber noch oft erleben .
Ich denk mal, dass der Fehler ganz simpel daran liegt, dass du deine Variable "buffer", als Zeiger initialisieren muss (Zeiger haben keinen Wert,sonder Zeigen Standardmäßig auf eine Speicheradresse).
Also:
Dann würde ich die Speicherzuweisung auch so gestalten:
buffer=(char*) malloc (sizeof(char)* lSize);
Deine Zuweisung funktioniert, trotzdem würde ich auf längerer Sicht auf dein sizeof Operator setzen. Da dies nur bei chars funktioniert.
Frag wenn du was nicht verstehst.
Meine PS3 Games : Warhawk , NFS: Pro Street, Motorstorm ,Midnight Club LA, LittleBigPlanet, GTA4, Uncharted 2, Overlord, Killzone2, PES10, Battlefield ´43, Socom: Confrontation,
Forum Regeln Beachten! KEIN ISO Talk! KEINE Beleidigungen! KEINE illegalen Links!
Dieser Beitrag wurde zuletzt bearbeitet: 18.09.2010 23:38 von pspbricker.
|
|
18.09.2010 23:36 |
|
Folgende User bedanken sich: |
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
danke! hatte bis grade völlig übersehen, dass du geantwortet hattest. also, sobald ich kann werd ichs testen. Danke nochmal.
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
|
|
28.09.2010 18:23 |
|
|
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: PSP C Anfang - Helft mir auf meinem weg
Mal ne Frage: Wieso nutzt du die standart stdio Funktionen, wenn der PSP Kernel wesentlich bessere bereitstellt?
Im "PSP-Style" würde man den Einlese Teil folgendermaßen lösen:
int fd = 0, fsize = 0;
fd = sceIoOpen("datenbank.lua", PSP_O_RDONLY, 0777);
/* Der File-Discriptor ist KEIN Zeiger sondern ein UID (Unique identifier), deshalb ist 0 gültig! */
if(fd < 0)
sceKernelExitGame();
fsize = sceIoLseek(fd, 0, PSP_SEEK_END);
if(fsize < 0)
sceKernelExitGame();
char *buffer = (char *)malloc(fsize);
if(!buffer)
sceKernelExitGame();
sceIoLseek(fd, 0, PSP_SEEK_SET);
int read = 0;
read = sceIoRead(fd, buffer, fsize);
if(read != fsize)
sceKernelExitGame();
sceIoClose(fd);
Das Größe-Ermitteln kannst du natürlich auch mit sceIoGetstat lösen.
Dieser Beitrag wurde zuletzt bearbeitet: 28.09.2010 18:47 von HacKmaN.
|
|
28.09.2010 18:46 |
|
Folgende User bedanken sich: |
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
thx hackman. ich verstehe zwar nicht gaanz jede code zeile von dir, aber es sollte reichen, um den code zu nutzen. natürlich gibts auch für dich ein danke, aber ich bin grade mit unserer geliebten psp on ^^.
echt super wie mir hier geholfenwird
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
|
|
28.09.2010 19:03 |
|
|
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: PSP C Anfang - Helft mir auf meinem weg
thx hackman. ich verstehe zwar nicht gaanz jede code zeile von dir, aber es sollte reichen, um den code zu nutzen. natürlich gibts auch für dich ein danke, aber ich bin grade mit unserer geliebten psp on ^^.
echt super wie mir hier geholfenwird
Tipp: http://psp.jim.sh/pspsdk-doc/group__FileIO.html
Da werden die bekannten Funktionen sehr gut erklärt
Ach, und wenn du absolut alles mit PSP Funktionen coden willst (so wills ich^^), kannst du das malloc auch durch Funktionen vom Sysmem ersetzten:
char *buffer = NULL;
SceUID PartitionID = 0;
PartitionID = sceKernelAllocPartitionMemory(1, "datenbank_Buffer", PSP_SMEM_Low, fsize, NULL);
if(PartitionID < 0)
sceKernelExitGame();
buffer = (char *)sceKernelGetBlockHeadAddr(PartitionID);
Und die Situation kenn ich, ich hatte als ich mit dem Coden angefangen hab noch ein halbes Jahr lang keinen PC mit Internet
Dieser Beitrag wurde zuletzt bearbeitet: 28.09.2010 20:03 von HacKmaN.
|
|
28.09.2010 19:12 |
|
Folgende User bedanken sich: |
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
so, ich habs auf anhieb mit der variante von pspbricker hinbekommen. doch nun kommt das nächste problem, nämlich dass absätze keine absätze sind, sondern als seltsames zeichen angezeigt werden. gut, ich weiss dass absätze der char '\n' sind, das is klar, aber wie bringe ich dem programm bei, dass diese seltsamen zeichen absätze sind??
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
|
|
17.10.2010 18:08 |
|
|
|
-blue7
/dev/null/
Beiträge: 1.926
Gruppe: Mod a.D.
Registriert seit: May 2009
Status:
Abwesend
Danke erhalten: 1768
|
RE: PSP C Anfang - Helft mir auf meinem weg
@Neutrosider
Steuerzeichen werden mit einem Backslash eingeleitet außerhalb einer Funktion, deshalb anstatt '\n' → '\\n' verwenden.
[Ex-Moderator] ; [Ubuntu-User] ; [Designer] ; [Coder] ;
running out of bugs`.
___________________________________________
#define TRUE FALSE // Happy debugging suckers
// sometimes I believe gcc ignores all my comments
|
|
17.10.2010 18:28 |
|
Folgende User bedanken sich: |
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
achso. ich hatte eine funktion geschrieben, die zumindest ein paar absätze reinbringen sollte, indem sie alle n's mit absätzen ersetzt, dabei hat er 'n' mit '\n' ersetzt. jetzt ergibts auch sinn, dass ich keinen unterschied gesehen habe, weils einfach keinen gab weil er n mit n ersetzt hat. wenn ich also stattdessen '\\n' schreibe müsste er alle n's mit absätzen ersetzen oder? kanns leider grade nicht testen, da ich nicht zu hause bin und an diesem PC keine entwicklerugebung eingerichtet ist.
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
|
|
17.10.2010 18:49 |
|
|
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
habe jetzt diverse absatz methoden probiert, aber entweder wurde dann garkein Text angezeigt, oder wie vorher auch ohne absätze. Das ist mein Aktueller Quelltext:
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <stdio.h>
#include <stdlib.h>
#include "graphics.h"
PSP_MODULE_INFO("Text auslesen", 0, 1, 1);
#define RGB(r, g, b) ((r)|((g)<<8)|((b)<<16))
/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}
/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}
return thid;
}
int main(void) {
SetupCallbacks();
initGraphics();
SceCtrlData pad;
double ypos=0;
Color textfarbe=RGB(0,0,0);
Color hintergrund=RGB(255,255,255);
int i;
FILE * pFile;
long lSize;
char *buffer;
char check;
pFile=fopen ("datenbank.lua","rb");
if (pFile==NULL) sceKernelExitGame();
fseek (pFile,0,SEEK_END);
lSize=ftell(pFile);
rewind(pFile);
buffer=(char*) malloc (sizeof(char)* lSize);
if (buffer==NULL) sceKernelExitGame();
while (feof(pFile)==0){
check=getc(pFile);
if (check=='n'){
putc('\n',pFile);
}
}
rewind(pFile);
fread(buffer,1,lSize,pFile);
fclose(pFile);
while(1){
sceCtrlReadBufferPositive(&pad,1);
if(pad.Buttons & PSP_CTRL_UP){
ypos=ypos-1;
}
if (pad.Buttons & PSP_CTRL_DOWN){
ypos=ypos+1;
}
fillScreenRect(hintergrund,0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
printTextScreen(5,ypos,buffer,textfarbe);
flipScreen();
for(i=0;i<1;i++){
sceDisplayWaitVblankStart();
}
}
return 0;
}
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
Dieser Beitrag wurde zuletzt bearbeitet: 08.11.2010 20:37 von Neutrosider.
|
|
08.11.2010 20:20 |
|
|
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: PSP C Anfang - Helft mir auf meinem weg
Mach den Code mal bitte in ein [ CODE ] [ / CODE] ding rein, so erkennt man überhaupt nichts^^
//EDIT: Ah, Danke
//EDIT2: Bist du dir sicher, dass diese printTextScreen Funktion den Text formatiert ausgibt? Gib lieber den Code selber zeilenweiße aus (also bei \n y++)
Dieser Beitrag wurde zuletzt bearbeitet: 08.11.2010 20:39 von HacKmaN.
|
|
08.11.2010 20:36 |
|
|
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
habs grade auch gemerkt, hab ich gemacht.
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
|
|
08.11.2010 20:37 |
|
|
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: PSP C Anfang - Helft mir auf meinem weg
Bist du dir sicher, dass diese printTextScreen Funktion den Text formatiert ausgibt? Gib lieber den Code selber zeilenweiße aus (also bei '\n' y++).
|
|
08.11.2010 20:40 |
|
|
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
also mache ich
while (feof(pFile)==0){
check=getc(pFile);
if (check=='n'){
putc('\n',pFile);
}
}
weg und schreibe statt
printTextScreen(5,ypos,buffer,textfarbe);
schreibe ich dann
int x=-3;
int ynew=0;
while (feof(buffer)==0){
x=x+8;
check=getc(buffer);
if (check=='n'){
ynew=ynew+10;
}
printTextScreen(x,ypos+ynew,check,textfarbe);
}
würde das so überhaupt funktionieren??
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
Dieser Beitrag wurde zuletzt bearbeitet: 08.11.2010 21:01 von Neutrosider.
|
|
08.11.2010 21:00 |
|
|
|
HacKmaN
Ex-Developer
Beiträge: 2.423
Gruppe: User
Registriert seit: Oct 2009
Status:
Offline
Danke erhalten: 3319
|
RE: PSP C Anfang - Helft mir auf meinem weg
KA...
Hier mal wie ichs mir vorstelle, ich habs allerdings weder getestet noch kompiliert...
Als erstmal diese funktion in die graphics.c (kA ob die funzt, wie gesagt nicht getestet)
/* modifikation von printText */
void putCharScreen(int x, int y, char ch, u32 color)
{
int c, i, j, l;
u8 *font;
Color *vram_ptr;
Color *vram;
if(!initialized) return;
if(x < 0 || x + 8 > SCREEN_WIDTH || y < 0 || y + 8 > SCREEN_HEIGHT)
break;
vram = getVramDrawBuffer() + x + y * PSP_LINE_SIZE;
font = &msx[(int)ch * 8];
for(i = l = 0; i < 8; i++, l += 8, font++)
{
vram_ptr = vram;
for(j = 0; j < 8; j++)
{
if((*font & (128 >> j)))
*vram_ptr = color;
vram_ptr++;
};
vram += PSP_LINE_SIZE;
};
};
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>
#include <stdio.h>
#include <stdlib.h>
#include "graphics.h"
PSP_MODULE_INFO("Text auslesen", 0, 1, 1);
#define RGB(r, g, b) ((r)|((g)<<8)|((b)<<16))
/* Exit callback */
int exit_callback(int arg1, int arg2, void *common)
{
sceKernelExitGame();
return 0;
};
/* Callback thread */
int CallbackThread(SceSize args, void *argp)
{
int cbid;
cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
};
/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
int thid = 0;
thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0)
sceKernelStartThread(thid, 0, 0);
return thid;
};
/* modifikation von printText */
void printTextScreen(int x, int y, char ch, u32 color)
{
int c, i, j, l;
u8 *font;
Color *vram_ptr;
Color *vram;
if(!initialized) return;
if(x < 0 || x + 8 > SCREEN_WIDTH || y < 0 || y + 8 > SCREEN_HEIGHT)
break;
vram = getVramDrawBuffer() + x + y * PSP_LINE_SIZE;
font = &msx[(int)ch * 8];
for(i = l = 0; i < 8; i++, l += 8, font++)
{
vram_ptr = vram;
for(j = 0; j < 8; j++)
{
if((*font & (128 >> j)))
*vram_ptr = color;
vram_ptr++;
};
vram += PSP_LINE_SIZE;
};
x += 8;
};
int main(void)
{
SetupCallbacks();
initGraphics();
SceCtrlData pad;
Color textfarbe = RGB(0, 0, 0);
Color hintergrund = RGB(255, 255, 255);
double ypos=0;
int i = 0;
FILE *pFile = NULL;
long lSize = 0;
char *buffer = NULL;
char check = 0;
pFile = fopen ("datenbank.lua","rb");
if(!pFile)
sceKernelExitGame();
fseek(pFile, 0, SEEK_END);
lSize = ftell(pFile);
rewind(pFile);
buffer = (char *)malloc(lSize * sizeof(char));
if(!buffer)
sceKernelExitGame();
while(feof(pFile) == 0)
{
check = getc(pFile);
if(check == 'n')
putc('\n', pFile);
};
rewind(pFile);
fread(buffer, 1, lSize, pFile);
fclose(pFile);
while(1)
{
sceCtrlReadBufferPositive(&pad,1);
if(pad.Buttons & PSP_CTRL_UP)
ypos--;
if(pad.Buttons & PSP_CTRL_DOWN)
ypos++;
fillScreenRect(hintergrund, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
int x = 0, y = 0;
char *bufptr = (char *)buffer;
for(y = ypos; bufptr < (buffer + lSize); y++)
{
for(x = 5; *bufptr != '\n'; x += 8, ptr++)
putCharScreen(x, y, *bufptr, textfarbe);
};
flipScreen();
sceDisplayWaitVblankStart();
};
return 0;
};
Ich hab wie schon ein paar mal gesagt keine Ahnung ob dass funktionieren würde, habs nciht getestet.
Ach btw... bin nicht drum rumgekommen den Code etwas zu formatieren, ich finde dass er so *etwas* besser lesbar ist^^
Dieser Beitrag wurde zuletzt bearbeitet: 08.11.2010 21:08 von HacKmaN.
|
|
08.11.2010 21:06 |
|
Folgende User bedanken sich: |
|
Neutrosider
Developer
Beiträge: 2.442
Gruppe: Developer
Registriert seit: Feb 2010
Status:
Offline
Danke erhalten: 2325
|
RE: PSP C Anfang - Helft mir auf meinem weg
ok, ich werde es mal versuchen, kompilieren, falls nötig verscuhen fehler zu beheben, und falls es läuft denke ich mal etwas genauer in den Code rein. Danke schonmal Hackman
EDIT: habs versucht zu kompilieren, aber einige variablen wurden wohl entweder garnicht oder nicht korrekt deklariert, das spuckt der Compiler aus:
make
psp-gcc -I. -I/usr/local/pspdev/psp/sdk/include -O2 -G0 -Wall -D_PSP_FW_VERSION=150 -c -o main.o main.c
main.c:44: Fehler: In Konflikt stehende Typen für »printTextScreen«
graphics.h:215: Fehler: Vorherige Deklaration von »printTextScreen« war hier
main.c: In Funktion »printTextScreen«:
main.c:51: Fehler: »initialized« nicht deklariert (erste Benutzung in dieser Funktion)
main.c:51: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
main.c:51: Fehler: für jede Funktion in der er auftritt.)
main.c:54: Fehler: break-Anweisung nicht innerhalb einer Schleife oder »switch«
main.c:58: Fehler: »msx« nicht deklariert (erste Benutzung in dieser Funktion)
main.c:46: Warnung: Variable »c« wird nicht verwendet
main.c: In Funktion »main«:
main.c:135: Fehler: »ptr« nicht deklariert (erste Benutzung in dieser Funktion)
main.c:136: Warnung: Implizite Deklaration der Funktion »putCharScreen«
main.c:88: Warnung: Variable »i« wird nicht verwendet
make: *** [main.o] Fehler 1
GEGEN ACTA, SOPA UND PIPA!
was sind ACTA, SOPA und PIPA?
Infos dazu hier (video), hier (video) und hier (website)
Dieser Beitrag wurde zuletzt bearbeitet: 08.11.2010 21:14 von Neutrosider.
|
|
08.11.2010 21:08 |
|
|
|
|